11package rbac
22
33import (
4+ "fmt"
45 "sort"
6+ "strings"
57
68 "github.com/spf13/cobra"
79 "github.com/stackvista/stackstate-cli/generated/stackstate_api"
810 "github.com/stackvista/stackstate-cli/internal/common"
911 "github.com/stackvista/stackstate-cli/internal/di"
1012 "github.com/stackvista/stackstate-cli/internal/printer"
13+ "github.com/stackvista/stackstate-cli/pkg/pflags"
1114)
1215
1316type DescribePermissionsArgs struct {
1417 Subject string
1518 Permission string
1619 Resource string
20+ Source string
1721}
1822
1923func DescribePermissionsCommand (deps * di.Deps ) * cobra.Command {
@@ -35,6 +39,7 @@ sts rbac describe-permissions --subject my-team --permission access-view`,
3539
3640 cmd .Flags ().StringVar (& args .Permission , Permission , "" , PermissionDescribeUsage )
3741 cmd .Flags ().StringVar (& args .Resource , Resource , "" , ResourceDescribeUsage )
42+ pflags .EnumVar (cmd .Flags (), & args .Source , Source , "" , SourceChoices , SourceUsage )
3843
3944 return cmd
4045}
@@ -46,37 +51,64 @@ func RunDescribePermissionsCommand(args *DescribePermissionsArgs) di.CmdWithApiF
4651 api * stackstate_api.APIClient ,
4752 serverInfo * stackstate_api.ServerInfo ,
4853 ) common.CLIError {
49- description , resp , err := describePermissions (cli , api , args .Subject , args .Permission , args .Resource ).Execute ()
54+ description , resp , err := describePermissions (cli , api , args .Subject , args .Permission , args .Resource , args . Source ).Execute ()
5055
5156 if err != nil {
5257 return common .NewResponseError (err , resp )
5358 }
5459
60+ sourceStrings := make ([]string , 0 )
61+ if description .FromSources != nil {
62+ for _ , s := range description .FromSources {
63+ sourceStrings = append (sourceStrings , string (s ))
64+ }
65+ } else {
66+ sourceStrings = nil
67+ }
68+
5569 if cli .IsJson () {
56- cli .Printer .PrintJson (map [string ]interface {}{
57- "subject" : description .SubjectHandle ,
58- "permissions" : description .Permissions ,
59- })
70+ if sourceStrings != nil {
71+ cli .Printer .PrintJson (map [string ]interface {}{
72+ "subject" : description .SubjectHandle ,
73+ "permissions" : description .Permissions ,
74+ "sources" : sourceStrings ,
75+ })
76+ } else {
77+ cli .Printer .PrintJson (map [string ]interface {}{
78+ "subject" : description .SubjectHandle ,
79+ "permissions" : description .Permissions ,
80+ })
81+ }
6082 } else {
61- printPermissionsTable (cli , description .Permissions )
83+ printPermissionsTable (cli , sourceStrings , description .Permissions )
6284 }
6385
6486 return nil
6587 }
6688}
6789
68- func describePermissions (cli * di.Deps , api * stackstate_api.APIClient , subject string , permission string , resource string ) stackstate_api.ApiDescribePermissionsRequest {
90+ func describePermissions (cli * di.Deps , api * stackstate_api.APIClient , subject string , permission string , resource string , source string ) stackstate_api.ApiDescribePermissionsRequest {
6991 request := api .PermissionsApi .DescribePermissions (cli .Context , subject )
7092 if permission != "" {
7193 request = request .Permission (permission )
7294 }
7395 if resource != "" {
7496 request = request .Resource (resource )
7597 }
98+ if source != "" {
99+ request = request .Source (stackstate_api .SubjectSource (capitalizeFirst (source )))
100+ }
76101 return request
77102}
78103
79- func printPermissionsTable (cli * di.Deps , permissionsList map [string ][]string ) {
104+ func capitalizeFirst (s string ) string {
105+ if s == "" {
106+ return s
107+ }
108+ return strings .ToUpper (s [:1 ]) + strings .ToLower (s [1 :])
109+ }
110+
111+ func printPermissionsTable (cli * di.Deps , sources []string , permissionsList map [string ][]string ) {
80112 keys := make ([]string , len (permissionsList ))
81113 for key := range permissionsList {
82114 keys = append (keys , key )
@@ -97,6 +129,11 @@ func printPermissionsTable(cli *di.Deps, permissionsList map[string][]string) {
97129 }
98130 }
99131
132+ if sources != nil {
133+ cli .Printer .PrintLn (fmt .Sprintf ("Got subject from the following subject sources: %s" , strings .Join (sources , ", " )))
134+ cli .Printer .PrintLn ("" )
135+ }
136+
100137 cli .Printer .Table (printer.TableData {
101138 Header : []string {"permission" , "resource" },
102139 Data : data ,
0 commit comments