Skip to content

Commit 1c598ba

Browse files
authored
resolve names in cli (#2375)
1 parent a56c5a9 commit 1c598ba

File tree

1 file changed

+85
-26
lines changed

1 file changed

+85
-26
lines changed

taco/cmd/taco/commands/rbac.go

Lines changed: 85 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -176,15 +176,15 @@ func init() {
176176

177177
// rbac user assign command
178178
var rbacUserAssignCmd = &cobra.Command{
179-
Use: "assign <email> <role-id>",
179+
Use: "assign <email> <role-name>",
180180
Short: "Assign a role to a user",
181181
Long: `Assign a role to a user by email address. The user must have logged in at least once to be found in the system.`,
182182
Args: cobra.ExactArgs(2),
183183
RunE: func(cmd *cobra.Command, args []string) error {
184184
client := newAuthedClient()
185185

186186
email := args[0]
187-
roleID := args[1]
187+
roleID := mustResolveRoleID(context.Background(), client, args[1])
188188

189189
printVerbose("Assigning role %s to user %s", roleID, email)
190190

@@ -209,15 +209,15 @@ var rbacUserAssignCmd = &cobra.Command{
209209

210210
// rbac user revoke command
211211
var rbacUserRevokeCmd = &cobra.Command{
212-
Use: "revoke <email> <role-id>",
212+
Use: "revoke <email> <role-name>",
213213
Short: "Revoke a role from a user",
214214
Long: `Revoke a role from a user by email address.`,
215215
Args: cobra.ExactArgs(2),
216216
RunE: func(cmd *cobra.Command, args []string) error {
217217
client := newAuthedClient()
218218

219219
email := args[0]
220-
roleID := args[1]
220+
roleID := mustResolveRoleID(context.Background(), client, args[1])
221221

222222
printVerbose("Revoking role %s from user %s", roleID, email)
223223

@@ -382,13 +382,14 @@ var rbacRoleListCmd = &cobra.Command{
382382

383383
// Create tabwriter
384384
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
385-
fmt.Fprintln(w, "ID\tNAME\tDESCRIPTION\tPERMISSIONS\tCREATED")
385+
fmt.Fprintln(w, "NAME\tDESCRIPTION\tPERMISSIONS\tCREATED")
386386

387387
for _, role := range roles {
388388
permissions := strings.Join(role.Permissions, ", ")
389-
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\n",
390-
role.ID,
391-
role.Name,
389+
name := role.Name
390+
if name == "" { name = role.ID }
391+
fmt.Fprintf(w, "%s\t%s\t%s\t%s\n",
392+
name,
392393
role.Description,
393394
permissions,
394395
role.CreatedAt,
@@ -404,14 +405,14 @@ var rbacRoleListCmd = &cobra.Command{
404405

405406
// rbac role delete command
406407
var rbacRoleDeleteCmd = &cobra.Command{
407-
Use: "delete <role-id>",
408+
Use: "delete <role-name>",
408409
Short: "Delete a role",
409-
Long: `Delete a role by ID.`,
410+
Long: `Delete a role by name.`,
410411
Args: cobra.ExactArgs(1),
411412
RunE: func(cmd *cobra.Command, args []string) error {
412413
client := newAuthedClient()
413414

414-
roleID := args[0]
415+
roleID := mustResolveRoleID(context.Background(), client, args[0])
415416

416417
printVerbose("Deleting role %s", roleID)
417418

@@ -597,7 +598,7 @@ var rbacPermissionListCmd = &cobra.Command{
597598
}
598599

599600
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
600-
fmt.Fprintln(w, "ID\tName\tDescription\tRules\tCreated")
601+
fmt.Fprintln(w, "NAME\tDESCRIPTION\tRULES\tCREATED")
601602

602603
for _, permission := range permissions {
603604
rules := ""
@@ -608,9 +609,10 @@ var rbacPermissionListCmd = &cobra.Command{
608609
rules += fmt.Sprintf("%s:%s:%s", rule.Effect, strings.Join(rule.Actions, ","), strings.Join(rule.Resources, ","))
609610
}
610611

611-
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\n",
612-
permission.ID,
613-
permission.Name,
612+
name := permission.Name
613+
if name == "" { name = permission.ID }
614+
fmt.Fprintf(w, "%s\t%s\t%s\t%s\n",
615+
name,
614616
permission.Description,
615617
rules,
616618
permission.CreatedAt,
@@ -625,13 +627,12 @@ var rbacPermissionListCmd = &cobra.Command{
625627

626628
// rbac permission delete command
627629
var rbacPermissionDeleteCmd = &cobra.Command{
628-
Use: "delete <id>",
630+
Use: "delete <name>",
629631
Short: "Delete a permission",
630632
Args: cobra.ExactArgs(1),
631633
RunE: func(cmd *cobra.Command, args []string) error {
632-
id := args[0]
633-
634634
client := newAuthedClient()
635+
id := mustResolvePermissionID(context.Background(), client, args[0])
635636

636637
resp, err := client.Delete(context.Background(), "/v1/rbac/permissions/"+id)
637638
if err != nil {
@@ -895,15 +896,14 @@ func testUserListOutput(client *sdk.Client, email string, args []string) (*TestR
895896

896897
// rbac role assign-policy command
897898
var rbacRoleAssignPolicyCmd = &cobra.Command{
898-
Use: "assign-policy <role-id> <policy-id>",
899+
Use: "assign-policy <role-name> <permission-name>",
899900
Short: "Assign a policy to a role",
900901
Long: `Assign a policy to a role, giving the role the permissions defined in the policy.`,
901902
Args: cobra.ExactArgs(2),
902903
RunE: func(cmd *cobra.Command, args []string) error {
903-
roleID := args[0]
904-
permissionID := args[1]
905-
906904
client := newAuthedClient()
905+
roleID := mustResolveRoleID(context.Background(), client, args[0])
906+
permissionID := mustResolvePermissionID(context.Background(), client, args[1])
907907

908908
req := map[string]string{
909909
"role_id": roleID,
@@ -926,15 +926,14 @@ var rbacRoleAssignPolicyCmd = &cobra.Command{
926926

927927
// rbac role revoke-permission command
928928
var rbacRoleRevokePermissionCmd = &cobra.Command{
929-
Use: "revoke-permission <role-id> <permission-id>",
929+
Use: "revoke-permission <role-name> <permission-name>",
930930
Short: "Revoke a permission from a role",
931931
Long: `Revoke a permission from a role, removing the access rights defined in the permission.`,
932932
Args: cobra.ExactArgs(2),
933933
RunE: func(cmd *cobra.Command, args []string) error {
934-
roleID := args[0]
935-
permissionID := args[1]
936-
937934
client := newAuthedClient()
935+
roleID := mustResolveRoleID(context.Background(), client, args[0])
936+
permissionID := mustResolvePermissionID(context.Background(), client, args[1])
938937

939938
resp, err := client.Delete(context.Background(), "/v1/rbac/roles/"+roleID+"/permissions/"+permissionID)
940939
if err != nil {
@@ -949,3 +948,63 @@ var rbacRoleRevokePermissionCmd = &cobra.Command{
949948
return nil
950949
},
951950
}
951+
952+
// mustResolveRoleID resolves a role name to its ID
953+
// If the argument is already a valid identifier, it's returned as-is
954+
func mustResolveRoleID(ctx context.Context, client *sdk.Client, arg string) string {
955+
resp, err := client.Get(ctx, "/v1/rbac/roles")
956+
if err != nil || resp.StatusCode != 200 {
957+
return arg // fallback
958+
}
959+
defer resp.Body.Close()
960+
961+
body, err := io.ReadAll(resp.Body)
962+
if err != nil {
963+
return arg
964+
}
965+
966+
var roles []Role
967+
if err := json.Unmarshal(body, &roles); err != nil {
968+
return arg
969+
}
970+
971+
for _, r := range roles {
972+
if r.Name == arg || r.ID == arg {
973+
if r.ID != "" {
974+
return r.ID
975+
}
976+
return arg
977+
}
978+
}
979+
return arg
980+
}
981+
982+
// mustResolvePermissionID resolves a permission name to its ID
983+
// If the argument is already a valid identifier, it's returned as-is
984+
func mustResolvePermissionID(ctx context.Context, client *sdk.Client, arg string) string {
985+
resp, err := client.Get(ctx, "/v1/rbac/permissions")
986+
if err != nil || resp.StatusCode != 200 {
987+
return arg // fallback
988+
}
989+
defer resp.Body.Close()
990+
991+
body, err := io.ReadAll(resp.Body)
992+
if err != nil {
993+
return arg
994+
}
995+
996+
var permissions []Permission
997+
if err := json.Unmarshal(body, &permissions); err != nil {
998+
return arg
999+
}
1000+
1001+
for _, p := range permissions {
1002+
if p.Name == arg || p.ID == arg {
1003+
if p.ID != "" {
1004+
return p.ID
1005+
}
1006+
return arg
1007+
}
1008+
}
1009+
return arg
1010+
}

0 commit comments

Comments
 (0)