Skip to content

Commit a88a794

Browse files
committed
Make some policy commands behave "better"
Instead of deprecating add/remove-role commands, change them to behave better. On add: do not add to a random rolebinding, always create a new rolebinding if none was specified explicitly. On Remove: if a rolebinding name is specified remove only from it. Signed-off-by: Simo Sorce <[email protected]>
1 parent 88a3123 commit a88a794

File tree

2 files changed

+207
-37
lines changed

2 files changed

+207
-37
lines changed

pkg/oc/admin/policy/modify_roles.go

+25-28
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,9 @@ func NewCmdAddRoleToGroup(name, fullName string, f *clientcmd.Factory, out io.Wr
8080
printSuccessForCommand(options.RoleName, true, "group", options.Targets, true, options.DryRun, out)
8181
}
8282
},
83-
Deprecated: fmt.Sprintf("Use oc edit rolebinding"),
8483
}
8584

86-
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")
85+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify or create. If left empty creates a new rolebinding with a default name")
8786
cmd.Flags().StringVar(&options.RoleNamespace, "role-namespace", "", "namespace where the role is located: empty means a role defined in cluster policy")
8887

8988
kcmdutil.AddDryRunFlag(cmd)
@@ -114,10 +113,9 @@ func NewCmdAddRoleToUser(name, fullName string, f *clientcmd.Factory, out io.Wri
114113
printSuccessForCommand(options.RoleName, true, "user", options.Targets, true, options.DryRun, out)
115114
}
116115
},
117-
Deprecated: fmt.Sprintf("Use oc edit rolebinding"),
118116
}
119117

120-
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")
118+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify or create. If left empty creates a new rolebinding with a default name")
121119
cmd.Flags().StringVar(&options.RoleNamespace, "role-namespace", "", "namespace where the role is located: empty means a role defined in cluster policy")
122120
cmd.Flags().StringSliceVarP(&saNames, "serviceaccount", "z", saNames, "service account in the current namespace to use as a user")
123121

@@ -147,9 +145,9 @@ func NewCmdRemoveRoleFromGroup(name, fullName string, f *clientcmd.Factory, out
147145
printSuccessForCommand(options.RoleName, false, "group", options.Targets, true, options.DryRun, out)
148146
}
149147
},
150-
Deprecated: fmt.Sprintf("Use oc edit rolebinding"),
151148
}
152149

150+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify. If left empty it will operate on all rolebindings")
153151
cmd.Flags().StringVar(&options.RoleNamespace, "role-namespace", "", "namespace where the role is located: empty means a role defined in cluster policy")
154152

155153
kcmdutil.AddDryRunFlag(cmd)
@@ -179,9 +177,9 @@ func NewCmdRemoveRoleFromUser(name, fullName string, f *clientcmd.Factory, out i
179177
printSuccessForCommand(options.RoleName, false, "user", options.Targets, true, options.DryRun, out)
180178
}
181179
},
182-
Deprecated: fmt.Sprintf("Use oc edit rolebinding"),
183180
}
184181

182+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify. If left empty it will operate on all rolebindings")
185183
cmd.Flags().StringVar(&options.RoleNamespace, "role-namespace", "", "namespace where the role is located: empty means a role defined in cluster policy")
186184
cmd.Flags().StringSliceVarP(&saNames, "serviceaccount", "z", saNames, "service account in the current namespace to use as a user")
187185

@@ -211,10 +209,9 @@ func NewCmdAddClusterRoleToGroup(name, fullName string, f *clientcmd.Factory, ou
211209
printSuccessForCommand(options.RoleName, true, "group", options.Targets, false, options.DryRun, out)
212210
}
213211
},
214-
Deprecated: fmt.Sprintf("Use oc edit clusterrolebinding"),
215212
}
216213

217-
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")
214+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify or create. If left empty creates a new rolebinding with a default name")
218215
kcmdutil.AddDryRunFlag(cmd)
219216
kcmdutil.AddPrinterFlags(cmd)
220217
return cmd
@@ -242,10 +239,9 @@ func NewCmdAddClusterRoleToUser(name, fullName string, f *clientcmd.Factory, out
242239
printSuccessForCommand(options.RoleName, true, "user", options.Targets, false, options.DryRun, out)
243240
}
244241
},
245-
Deprecated: fmt.Sprintf("Use oc edit clusterrolebinding"),
246242
}
247243

248-
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")
244+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify or create. If left empty creates a new rolebinding with a default name")
249245
cmd.Flags().StringSliceVarP(&saNames, "serviceaccount", "z", saNames, "service account in the current namespace to use as a user")
250246

251247
kcmdutil.AddDryRunFlag(cmd)
@@ -274,9 +270,10 @@ func NewCmdRemoveClusterRoleFromGroup(name, fullName string, f *clientcmd.Factor
274270
printSuccessForCommand(options.RoleName, false, "group", options.Targets, false, options.DryRun, out)
275271
}
276272
},
277-
Deprecated: fmt.Sprintf("Use oc edit clusterrolebinding"),
278273
}
279274

275+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify. If left empty it will operate on all rolebindings")
276+
280277
kcmdutil.AddDryRunFlag(cmd)
281278
kcmdutil.AddPrinterFlags(cmd)
282279
return cmd
@@ -304,9 +301,9 @@ func NewCmdRemoveClusterRoleFromUser(name, fullName string, f *clientcmd.Factory
304301
printSuccessForCommand(options.RoleName, false, "user", options.Targets, false, options.DryRun, out)
305302
}
306303
},
307-
Deprecated: fmt.Sprintf("Use oc edit clusterrolebinding"),
308304
}
309305

306+
cmd.Flags().StringVar(&options.RoleBindingName, "rolebinding-name", "", "Name of the rolebinding to modify. If left empty it will operate on all rolebindings")
310307
cmd.Flags().StringSliceVarP(&saNames, "serviceaccount", "z", saNames, "service account in the current namespace to use as a user")
311308

312309
kcmdutil.AddDryRunFlag(cmd)
@@ -436,18 +433,7 @@ func (o *RoleModificationOptions) getUserSpecifiedBinding() (*authorizationapi.R
436433
}
437434

438435
func (o *RoleModificationOptions) getUnspecifiedBinding() (*authorizationapi.RoleBinding, bool /* isUpdate */, error) {
439-
// Look for existing bindings by role.
440-
roleBindings, err := o.RoleBindingAccessor.GetExistingRoleBindingsForRole(o.RoleNamespace, o.RoleName)
441-
if err != nil {
442-
return nil, false, err
443-
}
444-
445-
if len(roleBindings) > 0 {
446-
// only need to add the user or group to a single roleBinding on the role. Just choose the first one
447-
return roleBindings[0], true, nil
448-
}
449-
450-
// Create a new rolebinding with the default naming.
436+
// Always create a new role binding with the default naming
451437
roleBinding := &authorizationapi.RoleBinding{}
452438
roleBindingNames, err := o.RoleBindingAccessor.GetExistingRoleBindingNames()
453439
if err != nil {
@@ -520,9 +506,20 @@ subjectCheck:
520506
}
521507

522508
func (o *RoleModificationOptions) RemoveRole() error {
523-
roleBindings, err := o.RoleBindingAccessor.GetExistingRoleBindingsForRole(o.RoleNamespace, o.RoleName)
524-
if err != nil {
525-
return err
509+
var roleBindings []*authorizationapi.RoleBinding
510+
var err error
511+
if len(o.RoleBindingName) > 0 {
512+
existingRoleBinding, err := o.RoleBindingAccessor.GetRoleBinding(o.RoleBindingName)
513+
if err != nil {
514+
return err
515+
}
516+
roleBindings = make([]*authorizationapi.RoleBinding, 1)
517+
roleBindings[0] = existingRoleBinding
518+
} else {
519+
roleBindings, err = o.RoleBindingAccessor.GetExistingRoleBindingsForRole(o.RoleNamespace, o.RoleName)
520+
if err != nil {
521+
return err
522+
}
526523
}
527524
if len(roleBindings) == 0 {
528525
return fmt.Errorf("unable to locate RoleBinding for %v/%v", o.RoleNamespace, o.RoleName)
@@ -554,7 +551,7 @@ func (o *RoleModificationOptions) RemoveRole() error {
554551
for _, roleBinding := range roleBindings {
555552
roleBinding.Subjects = removeSubjects(roleBinding.Subjects, subjectsToRemove)
556553

557-
err = o.RoleBindingAccessor.UpdateRoleBinding(roleBinding)
554+
err := o.RoleBindingAccessor.UpdateRoleBinding(roleBinding)
558555
if err != nil {
559556
return err
560557
}

0 commit comments

Comments
 (0)