Skip to content

Commit 73d7542

Browse files
authored
Onboard Secrets Manager user delete, describe and update commands (#125)
* Onboard Secrets Manager (user) : add delete command * delete command: testing and docs * Onboard Secrets Manager (user): add describe command * Onboard Secrets Manager (user): add update command * update command: update logic * fix printing formatting * Addressed comments * Improve update logic and formating * update command: add testing for buildRequest logic, improve formatting
1 parent 897804b commit 73d7542

File tree

13 files changed

+1406
-0
lines changed

13 files changed

+1406
-0
lines changed

docs/stackit_secrets-manager_user.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,8 @@ stackit secrets-manager user [flags]
2929

3030
* [stackit secrets-manager](./stackit_secrets-manager.md) - Provides functionality for Secrets Manager
3131
* [stackit secrets-manager user create](./stackit_secrets-manager_user_create.md) - Creates a Secrets Manager user
32+
* [stackit secrets-manager user delete](./stackit_secrets-manager_user_delete.md) - Deletes a Secrets Manager user
33+
* [stackit secrets-manager user describe](./stackit_secrets-manager_user_describe.md) - Shows details of a Secrets Manager user
3234
* [stackit secrets-manager user list](./stackit_secrets-manager_user_list.md) - Lists all Secrets Manager users
35+
* [stackit secrets-manager user update](./stackit_secrets-manager_user_update.md) - Updates the write privileges Secrets Manager user
3336

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
## stackit secrets-manager user delete
2+
3+
Deletes a Secrets Manager user
4+
5+
### Synopsis
6+
7+
Deletes a Secrets Manager user by ID. You can get the IDs of users for an instance by running:
8+
$ stackit secrets-manager user list --instance-id <INSTANCE_ID>
9+
10+
```
11+
stackit secrets-manager user delete USER_ID [flags]
12+
```
13+
14+
### Examples
15+
16+
```
17+
Delete a Secrets Manager user with ID "xxx" for instance with ID "yyy"
18+
$ stackit secrets-manager user delete xxx --instance-id yyy
19+
```
20+
21+
### Options
22+
23+
```
24+
-h, --help Help for "stackit secrets-manager user delete"
25+
--instance-id string Instance ID
26+
```
27+
28+
### Options inherited from parent commands
29+
30+
```
31+
-y, --assume-yes If set, skips all confirmation prompts
32+
--async If set, runs the command asynchronously
33+
-o, --output-format string Output format, one of ["json" "pretty"]
34+
-p, --project-id string Project ID
35+
```
36+
37+
### SEE ALSO
38+
39+
* [stackit secrets-manager user](./stackit_secrets-manager_user.md) - Provides functionality for Secrets Manager users
40+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
## stackit secrets-manager user describe
2+
3+
Shows details of a Secrets Manager user
4+
5+
### Synopsis
6+
7+
Shows details of a Secrets Manager user.
8+
9+
```
10+
stackit secrets-manager user describe USER_ID [flags]
11+
```
12+
13+
### Examples
14+
15+
```
16+
Get details of a Secrets Manager user with ID "xxx" of instance with ID "yyy"
17+
$ stackit secrets-manager user list xxx --instance-id yyy
18+
19+
Get details of a Secrets Manager user with ID "xxx" of instance with ID "yyy" in table format
20+
$ stackit secrets-manager user list xxx --instance-id yyy --output-format pretty
21+
```
22+
23+
### Options
24+
25+
```
26+
-h, --help Help for "stackit secrets-manager user describe"
27+
--instance-id string ID of the instance
28+
```
29+
30+
### Options inherited from parent commands
31+
32+
```
33+
-y, --assume-yes If set, skips all confirmation prompts
34+
--async If set, runs the command asynchronously
35+
-o, --output-format string Output format, one of ["json" "pretty"]
36+
-p, --project-id string Project ID
37+
```
38+
39+
### SEE ALSO
40+
41+
* [stackit secrets-manager user](./stackit_secrets-manager_user.md) - Provides functionality for Secrets Manager users
42+
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
## stackit secrets-manager user update
2+
3+
Updates the write privileges Secrets Manager user
4+
5+
### Synopsis
6+
7+
Updates the write privileges Secrets Manager user.
8+
9+
```
10+
stackit secrets-manager user update USER_ID [flags]
11+
```
12+
13+
### Examples
14+
15+
```
16+
Enable write access of a Secrets Manager user with ID "xxx" of instance with ID "yyy"
17+
$ stackit secrets-manager user update xxx --instance-id yyy --enable-write
18+
19+
Disable write access of a Secrets Manager user with ID "xxx" of instance with ID "yyy"
20+
$ stackit secrets-manager user update xxx --instance-id yyy --disable-write
21+
```
22+
23+
### Options
24+
25+
```
26+
--disable-write Set the user to have read-only access.
27+
--enable-write Set the user to have write access.
28+
-h, --help Help for "stackit secrets-manager user update"
29+
--instance-id string ID of the instance
30+
```
31+
32+
### Options inherited from parent commands
33+
34+
```
35+
-y, --assume-yes If set, skips all confirmation prompts
36+
--async If set, runs the command asynchronously
37+
-o, --output-format string Output format, one of ["json" "pretty"]
38+
-p, --project-id string Project ID
39+
```
40+
41+
### SEE ALSO
42+
43+
* [stackit secrets-manager user](./stackit_secrets-manager_user.md) - Provides functionality for Secrets Manager users
44+
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package delete
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/stackitcloud/stackit-cli/internal/pkg/args"
8+
"github.com/stackitcloud/stackit-cli/internal/pkg/confirm"
9+
"github.com/stackitcloud/stackit-cli/internal/pkg/errors"
10+
"github.com/stackitcloud/stackit-cli/internal/pkg/examples"
11+
"github.com/stackitcloud/stackit-cli/internal/pkg/flags"
12+
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
13+
"github.com/stackitcloud/stackit-cli/internal/pkg/services/secrets-manager/client"
14+
secretsManagerUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/secrets-manager/utils"
15+
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
16+
17+
"github.com/spf13/cobra"
18+
"github.com/stackitcloud/stackit-sdk-go/services/secretsmanager"
19+
)
20+
21+
const (
22+
userIdArg = "USER_ID"
23+
24+
instanceIdFlag = "instance-id"
25+
)
26+
27+
type inputModel struct {
28+
*globalflags.GlobalFlagModel
29+
30+
InstanceId string
31+
UserId string
32+
}
33+
34+
func NewCmd() *cobra.Command {
35+
cmd := &cobra.Command{
36+
Use: fmt.Sprintf("delete %s", userIdArg),
37+
Short: "Deletes a Secrets Manager user",
38+
Long: fmt.Sprintf("%s\n%s",
39+
"Deletes a Secrets Manager user by ID. You can get the IDs of users for an instance by running:",
40+
" $ stackit secrets-manager user list --instance-id <INSTANCE_ID>",
41+
),
42+
Example: examples.Build(
43+
examples.NewExample(
44+
`Delete a Secrets Manager user with ID "xxx" for instance with ID "yyy"`,
45+
"$ stackit secrets-manager user delete xxx --instance-id yyy"),
46+
),
47+
Args: args.SingleArg(userIdArg, utils.ValidateUUID),
48+
RunE: func(cmd *cobra.Command, args []string) error {
49+
ctx := context.Background()
50+
model, err := parseInput(cmd, args)
51+
if err != nil {
52+
return err
53+
}
54+
55+
// Configure API client
56+
apiClient, err := client.ConfigureClient(cmd)
57+
if err != nil {
58+
return err
59+
}
60+
61+
instanceLabel, err := secretsManagerUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId)
62+
if err != nil {
63+
instanceLabel = model.InstanceId
64+
}
65+
66+
userLabel, userDescription, err := secretsManagerUtils.GetUserDetails(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId)
67+
if err != nil {
68+
userLabel = model.UserId
69+
}
70+
71+
if !model.AssumeYes {
72+
prompt := fmt.Sprintf("Are you sure you want to delete user %q (%q) of instance %q? (This cannot be undone)", userLabel, userDescription, instanceLabel)
73+
err = confirm.PromptForConfirmation(cmd, prompt)
74+
if err != nil {
75+
return err
76+
}
77+
}
78+
79+
// Call API
80+
req := buildRequest(ctx, model, apiClient)
81+
err = req.Execute()
82+
if err != nil {
83+
return fmt.Errorf("delete Secrets Manager user: %w", err)
84+
}
85+
86+
cmd.Printf("Deleted user %q of instance %q\n", userLabel, instanceLabel)
87+
return nil
88+
},
89+
}
90+
configureFlags(cmd)
91+
return cmd
92+
}
93+
94+
func configureFlags(cmd *cobra.Command) {
95+
cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "Instance ID")
96+
97+
err := flags.MarkFlagsRequired(cmd, instanceIdFlag)
98+
cobra.CheckErr(err)
99+
}
100+
101+
func parseInput(cmd *cobra.Command, inputArgs []string) (*inputModel, error) {
102+
userId := inputArgs[0]
103+
104+
globalFlags := globalflags.Parse(cmd)
105+
if globalFlags.ProjectId == "" {
106+
return nil, &errors.ProjectIdError{}
107+
}
108+
109+
return &inputModel{
110+
GlobalFlagModel: globalFlags,
111+
InstanceId: flags.FlagToStringValue(cmd, instanceIdFlag),
112+
UserId: userId,
113+
}, nil
114+
}
115+
116+
func buildRequest(ctx context.Context, model *inputModel, apiClient *secretsmanager.APIClient) secretsmanager.ApiDeleteUserRequest {
117+
req := apiClient.DeleteUser(ctx, model.ProjectId, model.InstanceId, model.UserId)
118+
return req
119+
}

0 commit comments

Comments
 (0)