Skip to content

Commit f895c8b

Browse files
authored
feat(secret): enable folder (#3375)
1 parent 8a19894 commit f895c8b

9 files changed

+300
-3
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
2+
🟥🟥🟥 STDERR️️ 🟥🟥🟥️
3+
Create folder.
4+
5+
USAGE:
6+
scw secret folder create [arg=value ...]
7+
8+
ARGS:
9+
[project-id] Project ID to use. If none is passed the default project ID will be used
10+
[name] Name of the folder
11+
[path] Path of the folder
12+
[region=fr-par] Region to target. If none is passed will use default region from the config (fr-par)
13+
14+
FLAGS:
15+
-h, --help help for create
16+
17+
GLOBAL FLAGS:
18+
-c, --config string The path to the config file
19+
-D, --debug Enable debug mode
20+
-o, --output string Output format: json or human, see 'scw help output' for more info (default "human")
21+
-p, --profile string The config profile to use
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
2+
🟥🟥🟥 STDERR️️ 🟥🟥🟥️
3+
Delete a given folder specified by the `region` and `folder_id` parameters.
4+
5+
USAGE:
6+
scw secret folder delete [arg=value ...]
7+
8+
ARGS:
9+
folder-id ID of the folder
10+
[region=fr-par] Region to target. If none is passed will use default region from the config (fr-par)
11+
12+
FLAGS:
13+
-h, --help help for delete
14+
15+
GLOBAL FLAGS:
16+
-c, --config string The path to the config file
17+
-D, --debug Enable debug mode
18+
-o, --output string Output format: json or human, see 'scw help output' for more info (default "human")
19+
-p, --profile string The config profile to use
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
2+
🟥🟥🟥 STDERR️️ 🟥🟥🟥️
3+
Retrieve the list of folders created within a Project.
4+
5+
USAGE:
6+
scw secret folder list [arg=value ...]
7+
8+
ARGS:
9+
[project-id] Filter by Project ID (optional)
10+
[path] Filter by path (optional)
11+
[order-by] (created_at_asc | created_at_desc | name_asc | name_desc)
12+
[region=fr-par] Region to target. If none is passed will use default region from the config (fr-par | all)
13+
14+
FLAGS:
15+
-h, --help help for list
16+
17+
GLOBAL FLAGS:
18+
-c, --config string The path to the config file
19+
-D, --debug Enable debug mode
20+
-o, --output string Output format: json or human, see 'scw help output' for more info (default "human")
21+
-p, --profile string The config profile to use
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
2+
🟥🟥🟥 STDERR️️ 🟥🟥🟥️
3+
Location of the secret in the directory structure.
4+
5+
USAGE:
6+
scw secret folder <command>
7+
8+
AVAILABLE COMMANDS:
9+
create Create folder
10+
delete Delete a given folder specified by the `region` and `folder_id` parameters
11+
list List folders
12+
13+
FLAGS:
14+
-h, --help help for folder
15+
16+
GLOBAL FLAGS:
17+
-c, --config string The path to the config file
18+
-D, --debug Enable debug mode
19+
-o, --output string Output format: json or human, see 'scw help output' for more info (default "human")
20+
-p, --profile string The config profile to use
21+
22+
Use "scw secret folder [command] --help" for more information about a command.

cmd/scw/testdata/test-all-usage-secret-usage.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ USAGE:
66
scw secret <command>
77

88
AVAILABLE COMMANDS:
9+
folder Folder management commands
910
secret Secret management commands
1011
version Secret Version management commands
1112

docs/commands/secret.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
# Documentation for `scw secret`
33
This API allows you to conveniently store, access and share sensitive data.
44

5+
- [Folder management commands](#folder-management-commands)
6+
- [Create folder](#create-folder)
7+
- [Delete a given folder specified by the `region` and `folder_id` parameters](#delete-a-given-folder-specified-by-the-`region`-and-`folder_id`-parameters)
8+
- [List folders](#list-folders)
59
- [Secret management commands](#secret-management-commands)
610
- [Create a secret](#create-a-secret)
711
- [Delete a secret](#delete-a-secret)
@@ -20,6 +24,75 @@ This API allows you to conveniently store, access and share sensitive data.
2024
- [Update metadata of a version](#update-metadata-of-a-version)
2125

2226

27+
## Folder management commands
28+
29+
Location of the secret in the directory structure.
30+
31+
32+
### Create folder
33+
34+
Create folder.
35+
36+
**Usage:**
37+
38+
```
39+
scw secret folder create [arg=value ...]
40+
```
41+
42+
43+
**Args:**
44+
45+
| Name | | Description |
46+
|------|---|-------------|
47+
| project-id | | Project ID to use. If none is passed the default project ID will be used |
48+
| name | | Name of the folder |
49+
| path | | Path of the folder |
50+
| region | Default: `fr-par`<br />One of: `fr-par` | Region to target. If none is passed will use default region from the config |
51+
52+
53+
54+
### Delete a given folder specified by the `region` and `folder_id` parameters
55+
56+
Delete a given folder specified by the `region` and `folder_id` parameters.
57+
58+
**Usage:**
59+
60+
```
61+
scw secret folder delete [arg=value ...]
62+
```
63+
64+
65+
**Args:**
66+
67+
| Name | | Description |
68+
|------|---|-------------|
69+
| folder-id | Required | ID of the folder |
70+
| region | Default: `fr-par`<br />One of: `fr-par` | Region to target. If none is passed will use default region from the config |
71+
72+
73+
74+
### List folders
75+
76+
Retrieve the list of folders created within a Project.
77+
78+
**Usage:**
79+
80+
```
81+
scw secret folder list [arg=value ...]
82+
```
83+
84+
85+
**Args:**
86+
87+
| Name | | Description |
88+
|------|---|-------------|
89+
| project-id | | Filter by Project ID (optional) |
90+
| path | | Filter by path (optional) |
91+
| order-by | One of: `created_at_asc`, `created_at_desc`, `name_asc`, `name_desc` | |
92+
| region | Default: `fr-par`<br />One of: `fr-par`, `all` | Region to target. If none is passed will use default region from the config |
93+
94+
95+
2396
## Secret management commands
2497

2598
Secrets are logical containers made up of zero or more immutable versions, that contain sensitive data.

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ require (
2424
github.com/moby/buildkit v0.11.6
2525
github.com/opencontainers/go-digest v1.0.0
2626
github.com/pkg/errors v0.9.1
27-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21.0.20230918151823-4f048611ed7c
27+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21.0.20230919140146-a731a0058f98
2828
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966
2929
github.com/spf13/cobra v1.7.0
3030
github.com/spf13/pflag v1.0.5

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,8 +491,8 @@ github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncj
491491
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
492492
github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI=
493493
github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs=
494-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21.0.20230918151823-4f048611ed7c h1:HM3dPr4NWDAAJDt3mmJGLZ+1SqvQNbRM0zBvBB4UHmU=
495-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21.0.20230918151823-4f048611ed7c/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
494+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21.0.20230919140146-a731a0058f98 h1:iqhgEyhgtkgQzptcemy9csJIzdg7RS64a9Przn2ZDGk=
495+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21.0.20230919140146-a731a0058f98/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
496496
github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8=
497497
github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE=
498498
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=

internal/namespaces/secret/v1alpha1/secret_cli.go

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@ var (
2020
func GetGeneratedCommands() *core.Commands {
2121
return core.NewCommands(
2222
secretRoot(),
23+
secretFolder(),
2324
secretSecret(),
2425
secretVersion(),
2526
secretSecretCreate(),
27+
secretFolderCreate(),
2628
secretSecretGet(),
2729
secretSecretUpdate(),
2830
secretSecretList(),
31+
secretFolderList(),
2932
secretSecretDelete(),
33+
secretFolderDelete(),
3034
secretVersionCreate(),
3135
secretVersionGeneratePassword(),
3236
secretVersionGet(),
@@ -46,6 +50,15 @@ func secretRoot() *core.Command {
4650
}
4751
}
4852

53+
func secretFolder() *core.Command {
54+
return &core.Command{
55+
Short: `Folder management commands`,
56+
Long: `Location of the secret in the directory structure.`,
57+
Namespace: "secret",
58+
Resource: "folder",
59+
}
60+
}
61+
4962
func secretSecret() *core.Command {
5063
return &core.Command{
5164
Short: `Secret management commands`,
@@ -130,6 +143,44 @@ func secretSecretCreate() *core.Command {
130143
}
131144
}
132145

146+
func secretFolderCreate() *core.Command {
147+
return &core.Command{
148+
Short: `Create folder`,
149+
Long: `Create folder.`,
150+
Namespace: "secret",
151+
Resource: "folder",
152+
Verb: "create",
153+
// Deprecated: false,
154+
ArgsType: reflect.TypeOf(secret.CreateFolderRequest{}),
155+
ArgSpecs: core.ArgSpecs{
156+
core.ProjectIDArgSpec(),
157+
{
158+
Name: "name",
159+
Short: `Name of the folder`,
160+
Required: false,
161+
Deprecated: false,
162+
Positional: false,
163+
},
164+
{
165+
Name: "path",
166+
Short: `Path of the folder`,
167+
Required: false,
168+
Deprecated: false,
169+
Positional: false,
170+
},
171+
core.RegionArgSpec(scw.RegionFrPar),
172+
},
173+
Run: func(ctx context.Context, args interface{}) (i interface{}, e error) {
174+
request := args.(*secret.CreateFolderRequest)
175+
176+
client := core.ExtractClient(ctx)
177+
api := secret.NewAPI(client)
178+
return api.CreateFolder(request)
179+
180+
},
181+
}
182+
}
183+
133184
func secretSecretGet() *core.Command {
134185
return &core.Command{
135186
Short: `Get metadata using the secret's ID`,
@@ -299,6 +350,59 @@ func secretSecretList() *core.Command {
299350
}
300351
}
301352

353+
func secretFolderList() *core.Command {
354+
return &core.Command{
355+
Short: `List folders`,
356+
Long: `Retrieve the list of folders created within a Project.`,
357+
Namespace: "secret",
358+
Resource: "folder",
359+
Verb: "list",
360+
// Deprecated: false,
361+
ArgsType: reflect.TypeOf(secret.ListFoldersRequest{}),
362+
ArgSpecs: core.ArgSpecs{
363+
{
364+
Name: "project-id",
365+
Short: `Filter by Project ID (optional)`,
366+
Required: false,
367+
Deprecated: false,
368+
Positional: false,
369+
},
370+
{
371+
Name: "path",
372+
Short: `Filter by path (optional)`,
373+
Required: false,
374+
Deprecated: false,
375+
Positional: false,
376+
},
377+
{
378+
Name: "order-by",
379+
Required: false,
380+
Deprecated: false,
381+
Positional: false,
382+
EnumValues: []string{"created_at_asc", "created_at_desc", "name_asc", "name_desc"},
383+
},
384+
core.RegionArgSpec(scw.RegionFrPar, scw.Region(core.AllLocalities)),
385+
},
386+
Run: func(ctx context.Context, args interface{}) (i interface{}, e error) {
387+
request := args.(*secret.ListFoldersRequest)
388+
389+
client := core.ExtractClient(ctx)
390+
api := secret.NewAPI(client)
391+
opts := []scw.RequestOption{scw.WithAllPages()}
392+
if request.Region == scw.Region(core.AllLocalities) {
393+
opts = append(opts, scw.WithRegions(api.Regions()...))
394+
request.Region = ""
395+
}
396+
resp, err := api.ListFolders(request, opts...)
397+
if err != nil {
398+
return nil, err
399+
}
400+
return resp.Folders, nil
401+
402+
},
403+
}
404+
}
405+
302406
func secretSecretDelete() *core.Command {
303407
return &core.Command{
304408
Short: `Delete a secret`,
@@ -341,6 +445,42 @@ func secretSecretDelete() *core.Command {
341445
}
342446
}
343447

448+
func secretFolderDelete() *core.Command {
449+
return &core.Command{
450+
Short: `Delete a given folder specified by the ` + "`" + `region` + "`" + ` and ` + "`" + `folder_id` + "`" + ` parameters`,
451+
Long: `Delete a given folder specified by the ` + "`" + `region` + "`" + ` and ` + "`" + `folder_id` + "`" + ` parameters.`,
452+
Namespace: "secret",
453+
Resource: "folder",
454+
Verb: "delete",
455+
// Deprecated: false,
456+
ArgsType: reflect.TypeOf(secret.DeleteFolderRequest{}),
457+
ArgSpecs: core.ArgSpecs{
458+
{
459+
Name: "folder-id",
460+
Short: `ID of the folder`,
461+
Required: true,
462+
Deprecated: false,
463+
Positional: false,
464+
},
465+
core.RegionArgSpec(scw.RegionFrPar),
466+
},
467+
Run: func(ctx context.Context, args interface{}) (i interface{}, e error) {
468+
request := args.(*secret.DeleteFolderRequest)
469+
470+
client := core.ExtractClient(ctx)
471+
api := secret.NewAPI(client)
472+
e = api.DeleteFolder(request)
473+
if e != nil {
474+
return nil, e
475+
}
476+
return &core.SuccessResult{
477+
Resource: "folder",
478+
Verb: "delete",
479+
}, nil
480+
},
481+
}
482+
}
483+
344484
func secretVersionCreate() *core.Command {
345485
return &core.Command{
346486
Short: `Create a version`,

0 commit comments

Comments
 (0)