Skip to content

Commit ad08f46

Browse files
committed
STAC-24194: Add cli options to distinguish subjects and permissions by source
1 parent 6d5398f commit ad08f46

9 files changed

Lines changed: 107 additions & 32 deletions

File tree

cmd/rbac/rbac_describe_permissions.go

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package rbac
22

33
import (
4+
"fmt"
45
"sort"
56
"strings"
67

@@ -51,13 +52,30 @@ func RunDescribePermissionsCommand(args *DescribePermissionsArgs) di.CmdWithApiF
5152
return common.NewResponseError(err, resp)
5253
}
5354

55+
sourceStrings := make([]string, 0)
56+
if description.FromSources != nil {
57+
for _, s := range description.FromSources {
58+
sourceStrings = append(sourceStrings, string(s))
59+
}
60+
} else {
61+
sourceStrings = nil
62+
}
63+
5464
if cli.IsJson() {
55-
cli.Printer.PrintJson(map[string]interface{}{
56-
"subject": description.SubjectHandle,
57-
"permissions": description.Permissions,
58-
})
65+
if sourceStrings != nil {
66+
cli.Printer.PrintJson(map[string]interface{}{
67+
"subject": description.SubjectHandle,
68+
"permissions": description.Permissions,
69+
"sources": sourceStrings,
70+
})
71+
} else {
72+
cli.Printer.PrintJson(map[string]interface{}{
73+
"subject": description.SubjectHandle,
74+
"permissions": description.Permissions,
75+
})
76+
}
5977
} else {
60-
printPermissionsTable(cli, description.Permissions)
78+
printPermissionsTable(cli, sourceStrings, description.Permissions)
6179
}
6280

6381
return nil
@@ -85,7 +103,7 @@ func capitalizeFirst(s string) string {
85103
return strings.ToUpper(s[:1]) + strings.ToLower(s[1:])
86104
}
87105

88-
func printPermissionsTable(cli *di.Deps, permissionsList map[string][]string) {
106+
func printPermissionsTable(cli *di.Deps, sources []string, permissionsList map[string][]string) {
89107
keys := make([]string, len(permissionsList))
90108
for key := range permissionsList {
91109
keys = append(keys, key)
@@ -106,6 +124,11 @@ func printPermissionsTable(cli *di.Deps, permissionsList map[string][]string) {
106124
}
107125
}
108126

127+
if sources != nil {
128+
cli.Printer.PrintLn(fmt.Sprintf("Got subject from the following subject sources: %s", strings.Join(sources, ", ")))
129+
cli.Printer.PrintLn("")
130+
}
131+
109132
cli.Printer.Table(printer.TableData{
110133
Header: []string{"permission", "resource"},
111134
Data: data,

cmd/rbac/rbac_describe_permissions_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ var (
4444
"subject": SubjectHandle,
4545
"permissions": AllPermissions,
4646
}
47+
ExpectedSourcesJson = map[string]interface{}{
48+
"subject": SubjectHandle,
49+
"permissions": AllPermissions,
50+
"sources": []string{"Static"},
51+
}
4752
)
4853

4954
func TestPermissionsDescribeJson(t *testing.T) {
@@ -112,6 +117,22 @@ func TestPermissionsDescribeFilterPermission(t *testing.T) {
112117
assert.Nil(t, calls[0].Presource)
113118
}
114119

120+
func TestPermissionsDescribeFilterSource(t *testing.T) {
121+
cli := di.NewMockDeps(t)
122+
cmd := DescribePermissionsCommand(&cli.Deps)
123+
124+
cli.MockClient.ApiMocks.PermissionsApi.DescribePermissionsResponse.Result = *Description
125+
126+
di.ExecuteCommandWithContextUnsafe(&cli.Deps, cmd, "--subject", SubjectHandle, "--source", "static")
127+
128+
s := stackstate_api.SUBJECTSOURCE_STATIC
129+
calls := *cli.MockClient.ApiMocks.PermissionsApi.DescribePermissionsCalls
130+
assert.Len(t, calls, 1)
131+
assert.Equal(t, SubjectHandle, calls[0].Psubject)
132+
assert.Equal(t, &s, calls[0].Psource)
133+
assert.Nil(t, calls[0].Presource)
134+
}
135+
115136
func TestPermissionsDescribeFilterResourceAndPermission(t *testing.T) {
116137
cli := di.NewMockDeps(t)
117138
cmd := DescribePermissionsCommand(&cli.Deps)
@@ -126,3 +147,40 @@ func TestPermissionsDescribeFilterResourceAndPermission(t *testing.T) {
126147
assert.Equal(t, "foo", *calls[0].Ppermission)
127148
assert.Equal(t, Resource1, *calls[0].Presource)
128149
}
150+
151+
func TestPermissionsDescribeWithSourcesJson(t *testing.T) {
152+
cli := di.NewMockDeps(t)
153+
cmd := DescribePermissionsCommand(&cli.Deps)
154+
155+
cli.MockClient.ApiMocks.PermissionsApi.DescribePermissionsResponse.Result = *Description
156+
cli.MockClient.ApiMocks.PermissionsApi.DescribePermissionsResponse.Result.FromSources = []stackstate_api.SubjectSource{stackstate_api.SUBJECTSOURCE_STATIC}
157+
158+
di.ExecuteCommandWithContextUnsafe(&cli.Deps, cmd, "--subject", SubjectHandle, "-o", "json")
159+
160+
calls := *cli.MockClient.ApiMocks.PermissionsApi.DescribePermissionsCalls
161+
assert.Len(t, calls, 1)
162+
163+
expected := []map[string]interface{}{
164+
ExpectedSourcesJson,
165+
}
166+
assert.Equal(t, expected, *cli.MockPrinter.PrintJsonCalls)
167+
}
168+
169+
func TestPermissionsDescribeWithSourcesTable(t *testing.T) {
170+
cli := di.NewMockDeps(t)
171+
cmd := DescribePermissionsCommand(&cli.Deps)
172+
173+
cli.MockClient.ApiMocks.PermissionsApi.DescribePermissionsResponse.Result = *Description
174+
cli.MockClient.ApiMocks.PermissionsApi.DescribePermissionsResponse.Result.FromSources = []stackstate_api.SubjectSource{stackstate_api.SUBJECTSOURCE_STATIC}
175+
176+
di.ExecuteCommandWithContextUnsafe(&cli.Deps, cmd, "--subject", SubjectHandle)
177+
178+
assert.Len(t, *cli.MockClient.ApiMocks.PermissionsApi.DescribePermissionsCalls, 1)
179+
180+
expected := []printer.TableData{
181+
ExpectedTable,
182+
}
183+
184+
assert.Equal(t, expected, *cli.MockPrinter.TableCalls)
185+
assert.Equal(t, []string([]string{"Got subject from the following subject sources: Static", ""}), *cli.MockPrinter.PrintLnCalls)
186+
}

cmd/rbac/rbac_grant.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func RunGrantPermissionsCommand(args *GrantPermissionsArgs) di.CmdWithApiFn {
4949
return common.NewResponseError(grantErr, grantResp)
5050
}
5151

52-
description, descrResp, descrErr := describePermissions(cli, api, args.Subject, args.Permission, args.Resource).Execute()
52+
description, descrResp, descrErr := describePermissions(cli, api, args.Subject, args.Permission, args.Resource, "").Execute()
5353

5454
if descrErr != nil {
5555
return common.NewResponseError(descrErr, descrResp)
@@ -62,7 +62,7 @@ func RunGrantPermissionsCommand(args *GrantPermissionsArgs) di.CmdWithApiFn {
6262
})
6363
} else {
6464
cli.Printer.Successf("Granted permission '%s' on '%s' to subject '%s'", args.Permission, args.Resource, args.Subject)
65-
printPermissionsTable(cli, description.Permissions)
65+
printPermissionsTable(cli, nil, description.Permissions)
6666
}
6767

6868
return nil

cmd/rbac/rbac_revoke.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func RunRevokePermissionsCommand(args *RevokePermissionsArgs) di.CmdWithApiFn {
4949
return common.NewResponseError(revokeErr, revokeResp)
5050
}
5151

52-
description, descrResp, descrErr := describePermissions(cli, api, args.Subject, args.Permission, "").Execute()
52+
description, descrResp, descrErr := describePermissions(cli, api, args.Subject, args.Permission, "", "").Execute()
5353

5454
if descrErr != nil {
5555
return common.NewResponseError(descrErr, descrResp)
@@ -62,7 +62,7 @@ func RunRevokePermissionsCommand(args *RevokePermissionsArgs) di.CmdWithApiFn {
6262
})
6363
} else {
6464
cli.Printer.Successf("Revoked permission '%s' on '%s' from subject '%s'", args.Permission, args.Resource, args.Subject)
65-
printPermissionsTable(cli, description.Permissions)
65+
printPermissionsTable(cli, nil, description.Permissions)
6666
}
6767

6868
return nil

generated/stackstate_api/api/openapi.yaml

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11241,20 +11241,14 @@ components:
1124111241
type: array
1124211242
permissions:
1124311243
additionalProperties:
11244-
$ref: '#/components/schemas/PermissionMap'
11244+
$ref: '#/components/schemas/PermissionList'
1124511245
type: object
1124611246
required:
1124711247
- permissions
1124811248
- subjectHandle
1124911249
type: object
1125011250
Subject:
1125111251
type: string
11252-
PermissionMap:
11253-
additionalProperties:
11254-
items:
11255-
$ref: '#/components/schemas/Permission'
11256-
type: array
11257-
type: object
1125811252
GrantPermission:
1125911253
example:
1126011254
permission: permission

generated/stackstate_api/docs/PermissionDescription.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ Name | Type | Description | Notes
66
------------ | ------------- | ------------- | -------------
77
**SubjectHandle** | **string** | |
88
**FromSources** | Pointer to [**[]SubjectSource**](SubjectSource.md) | | [optional]
9-
**Permissions** | [**map[string]map[string][]string**](map.md) | |
9+
**Permissions** | **map[string][]string** | |
1010

1111
## Methods
1212

1313
### NewPermissionDescription
1414

15-
`func NewPermissionDescription(subjectHandle string, permissions map[string]map[string][]string, ) *PermissionDescription`
15+
`func NewPermissionDescription(subjectHandle string, permissions map[string][]string, ) *PermissionDescription`
1616

1717
NewPermissionDescription instantiates a new PermissionDescription object
1818
This constructor will assign default values to properties that have it defined,
@@ -74,20 +74,20 @@ HasFromSources returns a boolean if a field has been set.
7474

7575
### GetPermissions
7676

77-
`func (o *PermissionDescription) GetPermissions() map[string]map[string][]string`
77+
`func (o *PermissionDescription) GetPermissions() map[string][]string`
7878

7979
GetPermissions returns the Permissions field if non-nil, zero value otherwise.
8080

8181
### GetPermissionsOk
8282

83-
`func (o *PermissionDescription) GetPermissionsOk() (*map[string]map[string][]string, bool)`
83+
`func (o *PermissionDescription) GetPermissionsOk() (*map[string][]string, bool)`
8484

8585
GetPermissionsOk returns a tuple with the Permissions field if it's non-nil, zero value otherwise
8686
and a boolean to check if the value has been set.
8787

8888
### SetPermissions
8989

90-
`func (o *PermissionDescription) SetPermissions(v map[string]map[string][]string)`
90+
`func (o *PermissionDescription) SetPermissions(v map[string][]string)`
9191

9292
SetPermissions sets Permissions field to given value.
9393

generated/stackstate_api/model_permission_description.go

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/common/common_cli_errors.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ func NewNotFoundError(err error) CLIError {
9898
return StdCLIError{
9999
Err: err,
100100
ServerResponse: nil,
101-
showUsage: true,
101+
showUsage: false,
102102
exitCode: NotFoundExitCode,
103103
}
104104
}

stackstate_openapi/openapi_version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0a969d1edec1b1473f8ca433a1b4b3cf64b86170
1+
79390474f35f8f3d0599149a2c4c28a168fb39c4

0 commit comments

Comments
 (0)