Skip to content

Commit c8b0909

Browse files
committed
Fixes from review on 2016-12-13
1 parent 20e4069 commit c8b0909

File tree

8 files changed

+53
-73
lines changed

8 files changed

+53
-73
lines changed

pkg/authorization/admission/restrictusers/restrictusers.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,6 @@ func objectReferenceDelta(elementsToIgnore, elements []kapi.ObjectReference) []k
8585
// each subject in the binding must be matched by some rolebinding restriction
8686
// in the namespace.
8787
func (q *restrictUsersAdmission) Admit(a admission.Attributes) (err error) {
88-
if !q.groupCache.Running() {
89-
return admission.NewForbidden(a, errors.New("groupCache not running"))
90-
}
91-
9288
// Ignore all operations that correspond to subresource actions.
9389
if len(a.GetSubresource()) != 0 {
9490
return nil
@@ -157,6 +153,9 @@ func (q *restrictUsersAdmission) Admit(a admission.Attributes) (err error) {
157153

158154
glog.V(4).Infof("Handling policybinding %s/%s",
159155
policybinding.Namespace, policybinding.Name)
156+
157+
default:
158+
return nil
160159
}
161160

162161
newSubjects := objectReferenceDelta(oldSubjects, subjects)
@@ -176,6 +175,10 @@ func (q *restrictUsersAdmission) Admit(a admission.Attributes) (err error) {
176175
return nil
177176
}
178177

178+
if !q.groupCache.Running() {
179+
return admission.NewForbidden(a, errors.New("groupCache not running"))
180+
}
181+
179182
checkers := []SubjectChecker{}
180183
for _, rbr := range roleBindingRestrictionList.Items {
181184
checker, err := NewSubjectChecker(&rbr.Spec)
@@ -185,17 +188,14 @@ func (q *restrictUsersAdmission) Admit(a admission.Attributes) (err error) {
185188
checkers = append(checkers, checker)
186189
}
187190

188-
checker, err := NewUnionSubjectChecker(checkers)
189-
if err != nil {
190-
return admission.NewForbidden(a, err)
191-
}
192-
193191
roleBindingRestrictionContext, err := NewRoleBindingRestrictionContext(ns,
194192
q.kclient, q.oclient, q.groupCache)
195193
if err != nil {
196194
return admission.NewForbidden(a, err)
197195
}
198196

197+
checker := NewUnionSubjectChecker(checkers)
198+
199199
errs := []error{}
200200
for _, subject := range newSubjects {
201201
allowed, err := checker.Allowed(subject, roleBindingRestrictionContext)

pkg/authorization/admission/restrictusers/restrictusers_test.go

+10-15
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,17 @@ func TestAdmission(t *testing.T) {
3030
},
3131
}
3232
userAliceRef = kapi.ObjectReference{
33-
Kind: authorizationapi.UserKind,
34-
Namespace: "namespace",
35-
Name: "Alice",
33+
Kind: authorizationapi.UserKind,
34+
Name: "Alice",
3635
}
3736

3837
userBob = userapi.User{
3938
ObjectMeta: kapi.ObjectMeta{Name: "Bob"},
4039
Groups: []string{"group"},
4140
}
4241
userBobRef = kapi.ObjectReference{
43-
Kind: authorizationapi.UserKind,
44-
Namespace: "namespace",
45-
Name: "Bob",
42+
Kind: authorizationapi.UserKind,
43+
Name: "Bob",
4644
}
4745

4846
group = userapi.Group{
@@ -53,9 +51,8 @@ func TestAdmission(t *testing.T) {
5351
Users: []string{userBobRef.Name},
5452
}
5553
groupRef = kapi.ObjectReference{
56-
Kind: authorizationapi.GroupKind,
57-
Namespace: "namespace",
58-
Name: "group",
54+
Kind: authorizationapi.GroupKind,
55+
Name: "group",
5956
}
6057

6158
serviceaccount = kapi.ServiceAccount{
@@ -72,14 +69,12 @@ func TestAdmission(t *testing.T) {
7269
}
7370

7471
systemuserRef = kapi.ObjectReference{
75-
Kind: authorizationapi.SystemUserKind,
76-
Namespace: "namespace",
77-
Name: "system user",
72+
Kind: authorizationapi.SystemUserKind,
73+
Name: "system user",
7874
}
7975
systemgroupRef = kapi.ObjectReference{
80-
Kind: authorizationapi.SystemGroupKind,
81-
Namespace: "namespace",
82-
Name: "system group",
76+
Kind: authorizationapi.SystemGroupKind,
77+
Name: "system group",
8378
}
8479
)
8580

pkg/authorization/admission/restrictusers/subjectchecker.go

+19-21
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
kapi "k8s.io/kubernetes/pkg/api"
99
"k8s.io/kubernetes/pkg/api/unversioned"
1010
"k8s.io/kubernetes/pkg/labels"
11+
kerrors "k8s.io/kubernetes/pkg/util/errors"
1112

1213
authorizationapi "github.com/openshift/origin/pkg/authorization/api"
1314
oclient "github.com/openshift/origin/pkg/client"
@@ -25,25 +26,24 @@ type SubjectChecker interface {
2526
type UnionSubjectChecker []SubjectChecker
2627

2728
// NewUnionSubjectChecker returns a new UnionSubjectChecker.
28-
func NewUnionSubjectChecker(checkers []SubjectChecker) (UnionSubjectChecker, error) {
29-
return UnionSubjectChecker(checkers), nil
29+
func NewUnionSubjectChecker(checkers []SubjectChecker) UnionSubjectChecker {
30+
return UnionSubjectChecker(checkers)
3031
}
3132

3233
// Allowed determines whether the given subject is allowed in rolebindings in
3334
// the project.
34-
func (checkers UnionSubjectChecker) Allowed(subject kapi.ObjectReference,
35-
ctx *RoleBindingRestrictionContext) (bool, error) {
35+
func (checkers UnionSubjectChecker) Allowed(subject kapi.ObjectReference, ctx *RoleBindingRestrictionContext) (bool, error) {
36+
errs := []error{}
3637
for _, checker := range []SubjectChecker(checkers) {
3738
allowed, err := checker.Allowed(subject, ctx)
3839
if err != nil {
39-
return false, err
40-
}
41-
if allowed {
42-
return true, nil
40+
errs = append(errs, err)
41+
} else if allowed {
42+
return true, kerrors.NewAggregate(errs)
4343
}
4444
}
4545

46-
return false, nil
46+
return false, kerrors.NewAggregate(errs)
4747
}
4848

4949
// RoleBindingRestrictionContext holds context that is used when determining
@@ -68,9 +68,7 @@ type RoleBindingRestrictionContext struct {
6868

6969
// NewRoleBindingRestrictionContext returns a new RoleBindingRestrictionContext
7070
// object.
71-
func NewRoleBindingRestrictionContext(ns string, kc kclientset.Interface,
72-
oc oclient.Interface,
73-
groupCache *usercache.GroupCache) (*RoleBindingRestrictionContext, error) {
71+
func NewRoleBindingRestrictionContext(ns string, kc kclientset.Interface, oc oclient.Interface, groupCache *usercache.GroupCache) (*RoleBindingRestrictionContext, error) {
7472
return &RoleBindingRestrictionContext{
7573
namespace: ns,
7674
kclient: kc,
@@ -151,8 +149,8 @@ type UserSubjectChecker struct {
151149
}
152150

153151
// NewUserSubjectChecker returns a new UserSubjectChecker.
154-
func NewUserSubjectChecker(userRestriction *authorizationapi.UserRestriction) (UserSubjectChecker, error) {
155-
return UserSubjectChecker{userRestriction: userRestriction}, nil
152+
func NewUserSubjectChecker(userRestriction *authorizationapi.UserRestriction) UserSubjectChecker {
153+
return UserSubjectChecker{userRestriction: userRestriction}
156154
}
157155

158156
// Allowed determines whether the given user subject is allowed in rolebindings
@@ -217,8 +215,8 @@ type GroupSubjectChecker struct {
217215
}
218216

219217
// NewGroupSubjectChecker returns a new GroupSubjectChecker.
220-
func NewGroupSubjectChecker(groupRestriction *authorizationapi.GroupRestriction) (GroupSubjectChecker, error) {
221-
return GroupSubjectChecker{groupRestriction: groupRestriction}, nil
218+
func NewGroupSubjectChecker(groupRestriction *authorizationapi.GroupRestriction) GroupSubjectChecker {
219+
return GroupSubjectChecker{groupRestriction: groupRestriction}
222220
}
223221

224222
// Allowed determines whether the given group subject is allowed in rolebindings
@@ -268,10 +266,10 @@ type ServiceAccountSubjectChecker struct {
268266
}
269267

270268
// NewServiceAccountSubjectChecker returns a new ServiceAccountSubjectChecker.
271-
func NewServiceAccountSubjectChecker(serviceAccountRestriction *authorizationapi.ServiceAccountRestriction) (ServiceAccountSubjectChecker, error) {
269+
func NewServiceAccountSubjectChecker(serviceAccountRestriction *authorizationapi.ServiceAccountRestriction) ServiceAccountSubjectChecker {
272270
return ServiceAccountSubjectChecker{
273271
serviceAccountRestriction: serviceAccountRestriction,
274-
}, nil
272+
}
275273
}
276274

277275
// Allowed determines whether the given serviceaccount subject is allowed in
@@ -306,13 +304,13 @@ func (checker ServiceAccountSubjectChecker) Allowed(subject kapi.ObjectReference
306304
func NewSubjectChecker(spec *authorizationapi.RoleBindingRestrictionSpec) (SubjectChecker, error) {
307305
switch {
308306
case spec.UserRestriction != nil:
309-
return NewUserSubjectChecker(spec.UserRestriction)
307+
return NewUserSubjectChecker(spec.UserRestriction), nil
310308

311309
case spec.GroupRestriction != nil:
312-
return NewGroupSubjectChecker(spec.GroupRestriction)
310+
return NewGroupSubjectChecker(spec.GroupRestriction), nil
313311

314312
case spec.ServiceAccountRestriction != nil:
315-
return NewServiceAccountSubjectChecker(spec.ServiceAccountRestriction)
313+
return NewServiceAccountSubjectChecker(spec.ServiceAccountRestriction), nil
316314
}
317315

318316
return nil, fmt.Errorf("invalid RoleBindingRestrictionSpec: %v", spec)

pkg/authorization/admission/restrictusers/subjectchecker_test.go

+11-16
Original file line numberDiff line numberDiff line change
@@ -27,34 +27,29 @@ func mustNewSubjectChecker(t *testing.T, spec *authorizationapi.RoleBindingRestr
2727
func TestSubjectCheckers(t *testing.T) {
2828
var (
2929
userBobRef = kapi.ObjectReference{
30-
Kind: authorizationapi.UserKind,
31-
Namespace: "namespace",
32-
Name: "Bob",
30+
Kind: authorizationapi.UserKind,
31+
Name: "Bob",
3332
}
3433
userAliceRef = kapi.ObjectReference{
35-
Kind: authorizationapi.UserKind,
36-
Namespace: "namespace",
37-
Name: "Alice",
34+
Kind: authorizationapi.UserKind,
35+
Name: "Alice",
3836
}
3937
groupRef = kapi.ObjectReference{
40-
Kind: authorizationapi.GroupKind,
41-
Namespace: "namespace",
42-
Name: "group",
38+
Kind: authorizationapi.GroupKind,
39+
Name: "group",
4340
}
4441
serviceaccountRef = kapi.ObjectReference{
4542
Kind: authorizationapi.ServiceAccountKind,
4643
Namespace: "namespace",
4744
Name: "serviceaccount",
4845
}
4946
systemuserRef = kapi.ObjectReference{
50-
Kind: authorizationapi.SystemUserKind,
51-
Namespace: "namespace",
52-
Name: "system user",
47+
Kind: authorizationapi.SystemUserKind,
48+
Name: "system user",
5349
}
5450
systemgroupRef = kapi.ObjectReference{
55-
Kind: authorizationapi.SystemGroupKind,
56-
Namespace: "namespace",
57-
Name: "system group",
51+
Kind: authorizationapi.SystemGroupKind,
52+
Name: "system group",
5853
}
5954
group = userapi.Group{
6055
ObjectMeta: kapi.ObjectMeta{
@@ -249,7 +244,7 @@ func TestSubjectCheckers(t *testing.T) {
249244
if groups, _ := groupCache.GroupsFor(group.Users[0]); len(groups) == 1 {
250245
break
251246
}
252-
time.Sleep(time.Millisecond)
247+
time.Sleep(10 * time.Millisecond)
253248
}
254249

255250
ctx, err := NewRoleBindingRestrictionContext("namespace",

pkg/authorization/api/register.go

-3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,3 @@ func addKnownTypes(scheme *runtime.Scheme) error {
6262
)
6363
return nil
6464
}
65-
66-
func (obj *RoleBindingRestrictionList) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
67-
func (obj *RoleBindingRestriction) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }

pkg/authorization/api/v1/register.go

-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package v1
22

33
import (
4-
"k8s.io/kubernetes/pkg/api/meta"
54
"k8s.io/kubernetes/pkg/api/unversioned"
65
"k8s.io/kubernetes/pkg/runtime"
76
)
@@ -52,7 +51,3 @@ func addKnownTypes(scheme *runtime.Scheme) error {
5251
)
5352
return nil
5453
}
55-
56-
func (obj *RoleBindingRestrictionList) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
57-
func (obj *RoleBindingRestriction) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
58-
func (obj *RoleBindingRestriction) GetObjectMeta() meta.Object { return &obj.ObjectMeta }

pkg/cmd/server/bootstrappolicy/policy.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func GetBootstrapClusterRoles() []authorizationapi.ClusterRole {
137137
authorizationapi.NewRule(read...).Groups(certificatesGroup).Resources("certificatesigningrequests", "certificatesigningrequests/approval", "certificatesigningrequests/status").RuleOrDie(),
138138

139139
authorizationapi.NewRule(read...).Groups(authzGroup).Resources("clusterpolicies", "clusterpolicybindings", "clusterroles", "clusterrolebindings",
140-
"policies", "policybindings", "roles", "rolebindings", "rolebindingrestrictions").RuleOrDie(),
140+
"policies", "policybindings", "roles", "rolebindings").RuleOrDie(),
141141

142142
authorizationapi.NewRule(read...).Groups(buildGroup).Resources("builds", "builds/details", "buildconfigs", "buildconfigs/webhooks", "builds/log").RuleOrDie(),
143143

@@ -253,7 +253,7 @@ func GetBootstrapClusterRoles() []authorizationapi.ClusterRole {
253253
authorizationapi.NewRule("create").Groups(authzGroup).Resources("localresourceaccessreviews", "localsubjectaccessreviews", "subjectrulesreviews").RuleOrDie(),
254254
authorizationapi.NewRule("create").Groups(securityGroup).Resources("podsecuritypolicysubjectreviews", "podsecuritypolicyselfsubjectreviews", "podsecuritypolicyreviews").RuleOrDie(),
255255

256-
authorizationapi.NewRule(read...).Groups(authzGroup).Resources("policies", "policybindings").RuleOrDie(),
256+
authorizationapi.NewRule(read...).Groups(authzGroup).Resources("policies", "policybindings", "rolebindingrestrictions").RuleOrDie(),
257257

258258
authorizationapi.NewRule(readWrite...).Groups(buildGroup).Resources("builds", "buildconfigs", "buildconfigs/webhooks").RuleOrDie(),
259259
authorizationapi.NewRule(read...).Groups(buildGroup).Resources("builds/log").RuleOrDie(),

pkg/cmd/server/origin/master_config.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,8 @@ var (
331331
// openshiftAdmissionControlPlugins gives the in-order default admission chain for openshift resources.
332332
openshiftAdmissionControlPlugins = []string{
333333
"ProjectRequestLimit",
334-
"openshift.io/RestrictSubjectBindings",
335334
"OriginNamespaceLifecycle",
335+
"openshift.io/RestrictSubjectBindings",
336336
"PodNodeConstraints",
337337
"openshift.io/JenkinsBootstrapper",
338338
"BuildByStrategy",
@@ -373,8 +373,8 @@ var (
373373
CombinedAdmissionControlPlugins = []string{
374374
lifecycle.PluginName,
375375
"ProjectRequestLimit",
376-
"openshift.io/RestrictSubjectBindings",
377376
"OriginNamespaceLifecycle",
377+
"openshift.io/RestrictSubjectBindings",
378378
"PodNodeConstraints",
379379
"openshift.io/JenkinsBootstrapper",
380380
"BuildByStrategy",

0 commit comments

Comments
 (0)