Skip to content

Commit 5eb7ae5

Browse files
Merge pull request #687 from ecordell/fix-perms
fix(permissions): Generate unique Names for permissions
2 parents 1e29578 + 760c62b commit 5eb7ae5

File tree

4 files changed

+36
-25
lines changed

4 files changed

+36
-25
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ container:
110110
clean-e2e:
111111
kubectl delete crds --all
112112
kubectl delete apiservices.apiregistration.k8s.io v1alpha1.packages.apps.redhat.com
113-
kubectl delete -f test/e2e/resources/0000_30_00-namespace.yaml
113+
kubectl delete -f test/e2e/resources/0000_50_00-namespace.yaml
114114

115115
clean:
116116
@rm -rf cover.out

pkg/controller/registry/resolver/rbac.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,17 @@ import (
66
corev1 "k8s.io/api/core/v1"
77
rbacv1 "k8s.io/api/rbac/v1"
88
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
"k8s.io/apiserver/pkg/storage/names"
910

1011
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
1112
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
1213
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
1314
)
1415

16+
var generateName = func(base string) string {
17+
return names.SimpleNameGenerator.GenerateName(base + "-")
18+
}
19+
1520
type OperatorPermissions struct {
1621
ServiceAccount *corev1.ServiceAccount
1722
Roles []*rbacv1.Role
@@ -63,7 +68,7 @@ func RBACForClusterServiceVersion(csv *v1alpha1.ClusterServiceVersion) (map[stri
6368
}
6469

6570
// Resolve Permissions
66-
for i, permission := range strategyDetailsDeployment.Permissions {
71+
for _, permission := range strategyDetailsDeployment.Permissions {
6772
// Create ServiceAccount if necessary
6873
if _, ok := permissions[permission.ServiceAccountName]; !ok {
6974
serviceAccount := &corev1.ServiceAccount{}
@@ -76,7 +81,7 @@ func RBACForClusterServiceVersion(csv *v1alpha1.ClusterServiceVersion) (map[stri
7681
// Create Role
7782
role := &rbacv1.Role{
7883
ObjectMeta: metav1.ObjectMeta{
79-
Name: fmt.Sprintf("%s-%d", csv.GetName(), i),
84+
Name: generateName(csv.GetName()),
8085
Namespace: csv.GetNamespace(),
8186
OwnerReferences: []metav1.OwnerReference{ownerutil.NonBlockingOwner(csv)},
8287
Labels: ownerutil.OwnerLabel(csv),
@@ -88,7 +93,7 @@ func RBACForClusterServiceVersion(csv *v1alpha1.ClusterServiceVersion) (map[stri
8893
// Create RoleBinding
8994
roleBinding := &rbacv1.RoleBinding{
9095
ObjectMeta: metav1.ObjectMeta{
91-
Name: fmt.Sprintf("%s-%s", role.GetName(), permission.ServiceAccountName),
96+
Name: generateName(fmt.Sprintf("%s-%s", role.GetName(), permission.ServiceAccountName)),
9297
Namespace: csv.GetNamespace(),
9398
OwnerReferences: []metav1.OwnerReference{ownerutil.NonBlockingOwner(csv)},
9499
Labels: ownerutil.OwnerLabel(csv),
@@ -107,7 +112,7 @@ func RBACForClusterServiceVersion(csv *v1alpha1.ClusterServiceVersion) (map[stri
107112
}
108113

109114
// Resolve ClusterPermissions as StepResources
110-
for i, permission := range strategyDetailsDeployment.ClusterPermissions {
115+
for _, permission := range strategyDetailsDeployment.ClusterPermissions {
111116
// Create ServiceAccount if necessary
112117
if _, ok := permissions[permission.ServiceAccountName]; !ok {
113118
serviceAccount := &corev1.ServiceAccount{}
@@ -120,7 +125,7 @@ func RBACForClusterServiceVersion(csv *v1alpha1.ClusterServiceVersion) (map[stri
120125
// Create ClusterRole
121126
role := &rbacv1.ClusterRole{
122127
ObjectMeta: metav1.ObjectMeta{
123-
Name: fmt.Sprintf("%s-%d", csv.GetName(), i),
128+
Name: generateName(csv.GetName()),
124129
OwnerReferences: []metav1.OwnerReference{ownerutil.NonBlockingOwner(csv)},
125130
Labels: ownerutil.OwnerLabel(csv),
126131
},
@@ -131,7 +136,7 @@ func RBACForClusterServiceVersion(csv *v1alpha1.ClusterServiceVersion) (map[stri
131136
// Create ClusterRoleBinding
132137
roleBinding := &rbacv1.ClusterRoleBinding{
133138
ObjectMeta: metav1.ObjectMeta{
134-
Name: fmt.Sprintf("%s-%s", role.GetName(), permission.ServiceAccountName),
139+
Name: generateName(fmt.Sprintf("%s-%s", role.GetName(), permission.ServiceAccountName)),
135140
Namespace: csv.GetNamespace(),
136141
OwnerReferences: []metav1.OwnerReference{ownerutil.NonBlockingOwner(csv)},
137142
Labels: ownerutil.OwnerLabel(csv),

pkg/controller/registry/resolver/resolver_test.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,10 @@ func TestNamespaceResolver(t *testing.T) {
348348
}
349349

350350
func TestNamespaceResolverRBAC(t *testing.T) {
351+
generateName = func(base string) string {
352+
return "a"
353+
}
354+
351355
namespace := "catsrc-namespace"
352356
catalog := CatalogKey{"catsrc", namespace}
353357

@@ -363,7 +367,7 @@ func TestNamespaceResolverRBAC(t *testing.T) {
363367
},
364368
},
365369
}
366-
370+
bundle := bundleWithPermissions("a.v1", "a", "alpha", "", nil, nil, nil, nil, simplePermissions, simplePermissions)
367371
type out struct {
368372
steps [][]*v1alpha1.Step
369373
subs []*v1alpha1.Subscription
@@ -380,12 +384,10 @@ func TestNamespaceResolverRBAC(t *testing.T) {
380384
clusterState: []runtime.Object{
381385
newSub(namespace, "a", "alpha", catalog),
382386
},
383-
bundlesInCatalog: []*opregistry.Bundle{
384-
bundleWithPermissions("a.v1", "a", "alpha", "", nil, nil, nil, nil, simplePermissions, simplePermissions),
385-
},
387+
bundlesInCatalog: []*opregistry.Bundle{bundle},
386388
out: out{
387389
steps: [][]*v1alpha1.Step{
388-
bundleSteps(bundleWithPermissions("a.v1", "a", "alpha", "", nil, nil, nil, nil, simplePermissions, simplePermissions), namespace, catalog),
390+
bundleSteps(bundle, namespace, catalog),
389391
},
390392
subs: []*v1alpha1.Subscription{
391393
updatedSub(namespace, "a.v1", "a", "alpha", catalog),

test/e2e/installplan_e2e_test.go

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -687,13 +687,13 @@ func TestCreateInstallPlanWithPermissions(t *testing.T) {
687687

688688
// Expect correct RBAC resources to be resolved and created
689689
expectedSteps := map[registry.ResourceKey]struct{}{
690-
registry.ResourceKey{Name: crd.Name, Kind: "CustomResourceDefinition"}: {},
691-
registry.ResourceKey{Name: stableCSVName, Kind: "ClusterServiceVersion"}: {},
692-
registry.ResourceKey{Name: serviceAccountName, Kind: "ServiceAccount"}: {},
693-
registry.ResourceKey{Name: fmt.Sprintf("%s-0", stableCSVName), Kind: "Role"}: {},
694-
registry.ResourceKey{Name: fmt.Sprintf("%s-0-%s", stableCSVName, serviceAccountName), Kind: "RoleBinding"}: {},
695-
registry.ResourceKey{Name: fmt.Sprintf("%s-0", stableCSVName), Kind: "ClusterRole"}: {},
696-
registry.ResourceKey{Name: fmt.Sprintf("%s-0-%s", stableCSVName, serviceAccountName), Kind: "ClusterRoleBinding"}: {},
690+
registry.ResourceKey{Name: crd.Name, Kind: "CustomResourceDefinition"}: {},
691+
registry.ResourceKey{Name: stableCSVName, Kind: "ClusterServiceVersion"}: {},
692+
registry.ResourceKey{Name: serviceAccountName, Kind: "ServiceAccount"}: {},
693+
registry.ResourceKey{Name: stableCSVName, Kind: "Role"}: {},
694+
registry.ResourceKey{Name: stableCSVName, Kind: "RoleBinding"}: {},
695+
registry.ResourceKey{Name: stableCSVName, Kind: "ClusterRole"}: {},
696+
registry.ResourceKey{Name: stableCSVName, Kind: "ClusterRoleBinding"}: {},
697697
}
698698

699699
require.Equal(t, len(expectedSteps), len(fetchedInstallPlan.Status.Plan), "number of expected steps does not match installed")
@@ -703,15 +703,19 @@ func TestCreateInstallPlanWithPermissions(t *testing.T) {
703703
Name: step.Resource.Name,
704704
Kind: step.Resource.Kind,
705705
}
706-
_, ok := expectedSteps[key]
707-
require.True(t, ok)
708-
709-
// Remove the entry from the expected steps set (to ensure no duplicates in resolved plan)
710-
delete(expectedSteps, key)
706+
for expected := range expectedSteps {
707+
if expected == key {
708+
delete(expectedSteps, expected)
709+
} else if strings.HasPrefix(key.Name, expected.Name) && key.Kind == expected.Kind {
710+
delete(expectedSteps, expected)
711+
} else {
712+
t.Logf("%v, %v: %v && %v", key, expected, strings.HasPrefix(key.Name, expected.Name), key.Kind == expected.Kind)
713+
}
714+
}
711715
}
712716

713717
// Should have removed every matching step
714-
require.Equal(t, 0, len(expectedSteps), "Actual resource steps do not match expected")
718+
require.Equal(t, 0, len(expectedSteps), "Actual resource steps do not match expected: %#v", expectedSteps)
715719

716720
}
717721

0 commit comments

Comments
 (0)