Skip to content

Commit c059d78

Browse files
author
Matt Rogers
committed
Add --rolebinding-name to policy commands
Add the --rolebinding-name option to the rolebinding and clusterrolebinding add commands for specifying the name of the rolebinding to modify. Fixes #13035
1 parent 9fae408 commit c059d78

File tree

3 files changed

+374
-16
lines changed

3 files changed

+374
-16
lines changed

Diff for: pkg/cmd/admin/policy/modify_roles.go

+41-16
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ var (
4141
type RoleModificationOptions struct {
4242
RoleNamespace string
4343
RoleName string
44+
RoleBindingName string
4445
RoleBindingAccessor RoleBindingAccessor
4546

4647
Targets []string
@@ -71,6 +72,7 @@ func NewCmdAddRoleToGroup(name, fullName string, f *clientcmd.Factory, out io.Wr
7172
},
7273
}
7374

75+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify or create. If left empty, appends to the first rolebinding found for the given role")
7476
cmd.Flags().StringVar(&options.RoleNamespace, "role-namespace", "", "namespace where the role is located: empty means a role defined in cluster policy")
7577

7678
return cmd
@@ -99,6 +101,7 @@ func NewCmdAddRoleToUser(name, fullName string, f *clientcmd.Factory, out io.Wri
99101
},
100102
}
101103

104+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify or create. If left empty, appends to the first rolebinding found for the given role")
102105
cmd.Flags().StringVar(&options.RoleNamespace, "role-namespace", "", "namespace where the role is located: empty means a role defined in cluster policy")
103106
cmd.Flags().StringSliceVarP(&saNames, "serviceaccount", "z", saNames, "service account in the current namespace to use as a user")
104107

@@ -180,6 +183,7 @@ func NewCmdAddClusterRoleToGroup(name, fullName string, f *clientcmd.Factory, ou
180183
},
181184
}
182185

186+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify or create. If left empty, appends to the first rolebinding found for the given role")
183187
return cmd
184188
}
185189

@@ -205,6 +209,7 @@ func NewCmdAddClusterRoleToUser(name, fullName string, f *clientcmd.Factory, out
205209
},
206210
}
207211

212+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify or create. If left empty, appends to the first rolebinding found for the given role")
208213
cmd.Flags().StringSliceVarP(&saNames, "serviceaccount", "z", saNames, "service account in the current namespace to use as a user")
209214

210215
return cmd
@@ -267,6 +272,7 @@ func (o *RoleModificationOptions) CompleteUserWithSA(f *clientcmd.Factory, args
267272
}
268273

269274
o.RoleName = args[0]
275+
270276
if len(args) > 1 {
271277
o.Users = append(o.Users, args[1:]...)
272278
}
@@ -332,23 +338,43 @@ func (o *RoleModificationOptions) Complete(f *clientcmd.Factory, args []string,
332338
}
333339

334340
func (o *RoleModificationOptions) AddRole() error {
335-
roleBindings, err := o.RoleBindingAccessor.GetExistingRoleBindingsForRole(o.RoleNamespace, o.RoleName)
336-
if err != nil {
337-
return err
338-
}
339-
roleBindingNames, err := o.RoleBindingAccessor.GetExistingRoleBindingNames()
340-
if err != nil {
341-
return err
342-
}
343-
344341
var roleBinding *authorizationapi.RoleBinding
345-
isUpdate := true
346-
if len(roleBindings) == 0 {
347-
roleBinding = &authorizationapi.RoleBinding{}
348-
isUpdate = false
342+
var err error
343+
isUpdate := false
344+
if len(o.RoleBindingName) > 0 {
345+
// Look for an existing rolebinding by name.
346+
roleBinding, err = o.RoleBindingAccessor.GetRoleBinding(o.RoleBindingName)
347+
if err != nil && !kapierrors.IsNotFound(err) {
348+
return err
349+
}
350+
if !kapierrors.IsNotFound(err) && roleBinding != nil {
351+
if roleBinding.RoleRef.Name != o.RoleName || roleBinding.RoleRef.Namespace != o.RoleNamespace {
352+
return fmt.Errorf("rolebinding %s found for role %s, not %s", roleBinding.Name, roleBinding.RoleRef.Name, o.RoleName)
353+
}
354+
isUpdate = true
355+
} else {
356+
roleBinding = &authorizationapi.RoleBinding{}
357+
roleBinding.Name = o.RoleBindingName
358+
}
349359
} else {
350-
// only need to add the user or group to a single roleBinding on the role. Just choose the first one
351-
roleBinding = roleBindings[0]
360+
// Look for existing bindings by role.
361+
roleBindings, err := o.RoleBindingAccessor.GetExistingRoleBindingsForRole(o.RoleNamespace, o.RoleName)
362+
if err != nil {
363+
return err
364+
}
365+
366+
if len(roleBindings) > 0 {
367+
// only need to add the user or group to a single roleBinding on the role. Just choose the first one
368+
roleBinding = roleBindings[0]
369+
isUpdate = true
370+
} else {
371+
roleBinding = &authorizationapi.RoleBinding{}
372+
roleBindingNames, err := o.RoleBindingAccessor.GetExistingRoleBindingNames()
373+
if err != nil {
374+
return err
375+
}
376+
roleBinding.Name = getUniqueName(o.RoleName, roleBindingNames)
377+
}
352378
}
353379

354380
roleBinding.RoleRef.Namespace = o.RoleNamespace
@@ -373,7 +399,6 @@ subjectCheck:
373399
if isUpdate {
374400
err = o.RoleBindingAccessor.UpdateRoleBinding(roleBinding)
375401
} else {
376-
roleBinding.Name = getUniqueName(o.RoleName, roleBindingNames)
377402
err = o.RoleBindingAccessor.CreateRoleBinding(roleBinding)
378403
// If the rolebinding was created in the meantime, rerun
379404
if kapierrors.IsAlreadyExists(err) {

0 commit comments

Comments
 (0)