Skip to content

Commit 6c3acd2

Browse files
author
OpenShift Bot
authored
Merge pull request #15223 from liggitt/rbac-controller-cleanup
Merged by openshift-bot
2 parents 271fb1c + 1a09bcf commit 6c3acd2

5 files changed

+276
-8
lines changed

pkg/authorization/controller/authorizationsync/origin_to_rbac_clusterrole_controller.go

+15-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
apierrors "k8s.io/apimachinery/pkg/api/errors"
99
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
10+
"k8s.io/apimachinery/pkg/util/sets"
1011
"k8s.io/client-go/tools/cache"
1112
"k8s.io/client-go/util/workqueue"
1213
rbacclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion"
@@ -120,15 +121,27 @@ func (c *OriginClusterRoleToRBACClusterRoleController) clusterPolicyEventHandler
120121
}
121122
},
122123
UpdateFunc: func(old, cur interface{}) {
123-
originContainerObj := cur.(*authorizationapi.ClusterPolicy)
124-
for _, originObj := range originContainerObj.Roles {
124+
curKeys := sets.NewString()
125+
for _, originObj := range cur.(*authorizationapi.ClusterPolicy).Roles {
125126
c.originIndexer.Add(originObj)
126127
key, err := controller.KeyFunc(originObj)
127128
if err != nil {
128129
utilruntime.HandleError(err)
129130
continue
130131
}
131132
c.queue.Add(key)
133+
curKeys.Insert(key)
134+
}
135+
for _, originObj := range old.(*authorizationapi.ClusterPolicy).Roles {
136+
key, err := controller.KeyFunc(originObj)
137+
if err != nil {
138+
utilruntime.HandleError(err)
139+
continue
140+
}
141+
if !curKeys.Has(key) {
142+
c.originIndexer.Delete(originObj)
143+
c.queue.Add(key)
144+
}
132145
}
133146
},
134147
DeleteFunc: func(obj interface{}) {

pkg/authorization/controller/authorizationsync/origin_to_rbac_clusterrolebinding_controller.go

+15-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
apierrors "k8s.io/apimachinery/pkg/api/errors"
99
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
10+
"k8s.io/apimachinery/pkg/util/sets"
1011
"k8s.io/client-go/tools/cache"
1112
"k8s.io/client-go/util/workqueue"
1213
rbacclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion"
@@ -120,15 +121,27 @@ func (c *OriginClusterRoleBindingToRBACClusterRoleBindingController) clusterPoli
120121
}
121122
},
122123
UpdateFunc: func(old, cur interface{}) {
123-
originContainerObj := cur.(*authorizationapi.ClusterPolicyBinding)
124-
for _, originObj := range originContainerObj.RoleBindings {
124+
curKeys := sets.NewString()
125+
for _, originObj := range cur.(*authorizationapi.ClusterPolicyBinding).RoleBindings {
125126
c.originIndexer.Add(originObj)
126127
key, err := controller.KeyFunc(originObj)
127128
if err != nil {
128129
utilruntime.HandleError(err)
129130
continue
130131
}
131132
c.queue.Add(key)
133+
curKeys.Insert(key)
134+
}
135+
for _, originObj := range old.(*authorizationapi.ClusterPolicyBinding).RoleBindings {
136+
key, err := controller.KeyFunc(originObj)
137+
if err != nil {
138+
utilruntime.HandleError(err)
139+
continue
140+
}
141+
if !curKeys.Has(key) {
142+
c.originIndexer.Delete(originObj)
143+
c.queue.Add(key)
144+
}
132145
}
133146
},
134147
DeleteFunc: func(obj interface{}) {

pkg/authorization/controller/authorizationsync/origin_to_rbac_role_controller.go

+15-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
apierrors "k8s.io/apimachinery/pkg/api/errors"
99
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
10+
"k8s.io/apimachinery/pkg/util/sets"
1011
"k8s.io/client-go/tools/cache"
1112
"k8s.io/client-go/util/workqueue"
1213
rbacclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion"
@@ -125,15 +126,27 @@ func (c *OriginRoleToRBACRoleController) policyEventHandler() cache.ResourceEven
125126
}
126127
},
127128
UpdateFunc: func(old, cur interface{}) {
128-
originContainerObj := cur.(*authorizationapi.Policy)
129-
for _, originObj := range originContainerObj.Roles {
129+
curKeys := sets.NewString()
130+
for _, originObj := range cur.(*authorizationapi.Policy).Roles {
130131
c.originIndexer.Add(originObj)
131132
key, err := controller.KeyFunc(originObj)
132133
if err != nil {
133134
utilruntime.HandleError(err)
134135
continue
135136
}
136137
c.queue.Add(key)
138+
curKeys.Insert(key)
139+
}
140+
for _, originObj := range old.(*authorizationapi.Policy).Roles {
141+
key, err := controller.KeyFunc(originObj)
142+
if err != nil {
143+
utilruntime.HandleError(err)
144+
continue
145+
}
146+
if !curKeys.Has(key) {
147+
c.originIndexer.Delete(originObj)
148+
c.queue.Add(key)
149+
}
137150
}
138151
},
139152
DeleteFunc: func(obj interface{}) {

pkg/authorization/controller/authorizationsync/origin_to_rbac_rolebinding_controller.go

+15-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
apierrors "k8s.io/apimachinery/pkg/api/errors"
99
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
10+
"k8s.io/apimachinery/pkg/util/sets"
1011
"k8s.io/client-go/tools/cache"
1112
"k8s.io/client-go/util/workqueue"
1213
rbacclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion"
@@ -125,15 +126,27 @@ func (c *OriginRoleBindingToRBACRoleBindingController) policyBindingEventHandler
125126
}
126127
},
127128
UpdateFunc: func(old, cur interface{}) {
128-
originContainerObj := cur.(*authorizationapi.PolicyBinding)
129-
for _, originObj := range originContainerObj.RoleBindings {
129+
curKeys := sets.NewString()
130+
for _, originObj := range cur.(*authorizationapi.PolicyBinding).RoleBindings {
130131
c.originIndexer.Add(originObj)
131132
key, err := controller.KeyFunc(originObj)
132133
if err != nil {
133134
utilruntime.HandleError(err)
134135
continue
135136
}
136137
c.queue.Add(key)
138+
curKeys.Insert(key)
139+
}
140+
for _, originObj := range old.(*authorizationapi.PolicyBinding).RoleBindings {
141+
key, err := controller.KeyFunc(originObj)
142+
if err != nil {
143+
utilruntime.HandleError(err)
144+
continue
145+
}
146+
if !curKeys.Has(key) {
147+
c.originIndexer.Delete(originObj)
148+
c.queue.Add(key)
149+
}
137150
}
138151
},
139152
DeleteFunc: func(obj interface{}) {
+216
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
package integration
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
kapierrors "k8s.io/apimachinery/pkg/api/errors"
8+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
"k8s.io/apimachinery/pkg/util/wait"
10+
kapi "k8s.io/kubernetes/pkg/api"
11+
12+
authorizationapi "github.com/openshift/origin/pkg/authorization/apis/authorization"
13+
testutil "github.com/openshift/origin/test/util"
14+
testserver "github.com/openshift/origin/test/util/server"
15+
)
16+
17+
func TestRBACController(t *testing.T) {
18+
testutil.RequireEtcd(t)
19+
defer testutil.DumpEtcdOnFailure(t)
20+
_, clusterAdminKubeConfig, err := testserver.StartTestMaster()
21+
if err != nil {
22+
t.Fatal(err)
23+
}
24+
25+
originClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
26+
if err != nil {
27+
t.Fatal(err)
28+
}
29+
kubeClient, err := testutil.GetClusterAdminKubeClient(clusterAdminKubeConfig)
30+
if err != nil {
31+
t.Fatal(err)
32+
}
33+
34+
ns := "rbac-controller-namespace"
35+
36+
if _, err := kubeClient.Core().Namespaces().Create(&kapi.Namespace{ObjectMeta: metav1.ObjectMeta{Name: ns}}); err != nil {
37+
t.Fatalf("Error creating namespace: %v", err)
38+
}
39+
40+
// Initial creation
41+
clusterrole, err := originClient.ClusterRoles().Create(&authorizationapi.ClusterRole{
42+
ObjectMeta: metav1.ObjectMeta{Name: "rbac-controller-clusterrole"},
43+
})
44+
if err != nil {
45+
t.Fatal(err)
46+
}
47+
clusterrolebinding, err := originClient.ClusterRoleBindings().Create(&authorizationapi.ClusterRoleBinding{
48+
ObjectMeta: metav1.ObjectMeta{Name: "rbac-controller-clusterrolebinding"},
49+
RoleRef: kapi.ObjectReference{Name: "rbac-controller-clusterrole"},
50+
})
51+
if err != nil {
52+
t.Fatal(err)
53+
}
54+
role, err := originClient.Roles(ns).Create(&authorizationapi.Role{
55+
ObjectMeta: metav1.ObjectMeta{Name: "rbac-controller-role"},
56+
})
57+
if err != nil {
58+
t.Fatal(err)
59+
}
60+
rolebinding, err := originClient.RoleBindings(ns).Create(&authorizationapi.RoleBinding{
61+
ObjectMeta: metav1.ObjectMeta{Name: "rbac-controller-rolebinding"},
62+
RoleRef: kapi.ObjectReference{Name: "rbac-controller-role", Namespace: ns},
63+
})
64+
if err != nil {
65+
t.Fatal(err)
66+
}
67+
68+
// Ensure propagation
69+
err = wait.PollImmediate(time.Second, time.Minute, func() (bool, error) {
70+
if _, err := kubeClient.Rbac().ClusterRoles().Get(clusterrole.Name, metav1.GetOptions{}); kapierrors.IsNotFound(err) {
71+
t.Logf("Retrying: %v", err)
72+
return false, nil
73+
} else if err != nil {
74+
t.Fatal(err)
75+
}
76+
77+
if _, err := kubeClient.Rbac().Roles(ns).Get(role.Name, metav1.GetOptions{}); kapierrors.IsNotFound(err) {
78+
t.Logf("Retrying: %v", err)
79+
return false, nil
80+
} else if err != nil {
81+
t.Fatal(err)
82+
}
83+
84+
if _, err := kubeClient.Rbac().ClusterRoleBindings().Get(clusterrolebinding.Name, metav1.GetOptions{}); kapierrors.IsNotFound(err) {
85+
t.Logf("Retrying: %v", err)
86+
return false, nil
87+
} else if err != nil {
88+
t.Fatal(err)
89+
}
90+
91+
if _, err := kubeClient.Rbac().RoleBindings(ns).Get(rolebinding.Name, metav1.GetOptions{}); kapierrors.IsNotFound(err) {
92+
t.Logf("Retrying: %v", err)
93+
return false, nil
94+
} else if err != nil {
95+
t.Fatal(err)
96+
}
97+
98+
return true, nil
99+
})
100+
if err != nil {
101+
t.Fatalf("created objects did not propagate: %v", err)
102+
}
103+
104+
// Update
105+
clusterrole.Labels = map[string]string{"updated": "true"}
106+
clusterrolebinding.Labels = map[string]string{"updated": "true"}
107+
role.Labels = map[string]string{"updated": "true"}
108+
rolebinding.Labels = map[string]string{"updated": "true"}
109+
110+
clusterrole, err = originClient.ClusterRoles().Update(clusterrole)
111+
if err != nil {
112+
t.Fatal(err)
113+
}
114+
clusterrolebinding, err = originClient.ClusterRoleBindings().Update(clusterrolebinding)
115+
if err != nil {
116+
t.Fatal(err)
117+
}
118+
role, err = originClient.Roles(ns).Update(role)
119+
if err != nil {
120+
t.Fatal(err)
121+
}
122+
rolebinding, err = originClient.RoleBindings(ns).Update(rolebinding)
123+
if err != nil {
124+
t.Fatal(err)
125+
}
126+
127+
// Ensure propagation
128+
err = wait.PollImmediate(time.Second, time.Minute, func() (bool, error) {
129+
if rbacObject, err := kubeClient.Rbac().ClusterRoles().Get(clusterrole.Name, metav1.GetOptions{}); err != nil {
130+
t.Fatal(err)
131+
} else if rbacObject.Labels["updated"] != "true" {
132+
t.Logf("not updated yet: %#v", rbacObject)
133+
return false, nil
134+
}
135+
136+
if rbacObject, err := kubeClient.Rbac().Roles(ns).Get(role.Name, metav1.GetOptions{}); err != nil {
137+
t.Fatal(err)
138+
} else if rbacObject.Labels["updated"] != "true" {
139+
t.Logf("not updated yet: %#v", rbacObject)
140+
return false, nil
141+
}
142+
143+
if rbacObject, err := kubeClient.Rbac().ClusterRoleBindings().Get(clusterrolebinding.Name, metav1.GetOptions{}); err != nil {
144+
t.Fatal(err)
145+
} else if rbacObject.Labels["updated"] != "true" {
146+
t.Logf("not updated yet: %#v", rbacObject)
147+
return false, nil
148+
}
149+
150+
if rbacObject, err := kubeClient.Rbac().RoleBindings(ns).Get(rolebinding.Name, metav1.GetOptions{}); err != nil {
151+
t.Fatal(err)
152+
} else if rbacObject.Labels["updated"] != "true" {
153+
t.Logf("not updated yet: %#v", rbacObject)
154+
return false, nil
155+
}
156+
157+
return true, nil
158+
})
159+
if err != nil {
160+
t.Fatalf("updated objects did not propagate: %v", err)
161+
}
162+
163+
// Delete
164+
err = originClient.ClusterRoles().Delete(clusterrole.Name)
165+
if err != nil {
166+
t.Fatal(err)
167+
}
168+
err = originClient.ClusterRoleBindings().Delete(clusterrolebinding.Name)
169+
if err != nil {
170+
t.Fatal(err)
171+
}
172+
err = originClient.Roles(ns).Delete(role.Name)
173+
if err != nil {
174+
t.Fatal(err)
175+
}
176+
err = originClient.RoleBindings(ns).Delete(rolebinding.Name)
177+
if err != nil {
178+
t.Fatal(err)
179+
}
180+
181+
// Ensure propagation
182+
err = wait.PollImmediate(time.Second, time.Minute, func() (bool, error) {
183+
if rbacObject, err := kubeClient.Rbac().ClusterRoles().Get(clusterrole.Name, metav1.GetOptions{}); err != nil && !kapierrors.IsNotFound(err) {
184+
t.Fatal(err)
185+
} else if err == nil {
186+
t.Logf("not deleted yet: %#v", rbacObject)
187+
return false, nil
188+
}
189+
190+
if rbacObject, err := kubeClient.Rbac().Roles(ns).Get(role.Name, metav1.GetOptions{}); err != nil && !kapierrors.IsNotFound(err) {
191+
t.Fatal(err)
192+
} else if err == nil {
193+
t.Logf("not deleted yet: %#v", rbacObject)
194+
return false, nil
195+
}
196+
197+
if rbacObject, err := kubeClient.Rbac().ClusterRoleBindings().Get(clusterrolebinding.Name, metav1.GetOptions{}); err != nil && !kapierrors.IsNotFound(err) {
198+
t.Fatal(err)
199+
} else if err == nil {
200+
t.Logf("not deleted yet: %#v", rbacObject)
201+
return false, nil
202+
}
203+
204+
if rbacObject, err := kubeClient.Rbac().RoleBindings(ns).Get(rolebinding.Name, metav1.GetOptions{}); err != nil && !kapierrors.IsNotFound(err) {
205+
t.Fatal(err)
206+
} else if err == nil {
207+
t.Logf("not deleted yet: %#v", rbacObject)
208+
return false, nil
209+
}
210+
211+
return true, nil
212+
})
213+
if err != nil {
214+
t.Fatalf("deleted objects did not propagate: %v", err)
215+
}
216+
}

0 commit comments

Comments
 (0)