Skip to content

Commit bd18640

Browse files
Codelaxremyleone
andauthored
feat(secret): add examples and tests to v1beta1 (#3740)
Co-authored-by: Rémy Léone <[email protected]>
1 parent de67e68 commit bd18640

9 files changed

+338
-82
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ Access sensitive data in a secret's version specified by the `region`, `secret_i
55
USAGE:
66
scw secret version access <secret-id ...> [arg=value ...]
77

8+
EXAMPLES:
9+
Get a raw json value from a secret version
10+
scw secret version access 11111111-1111-1111-111111111111 revision=1 field=key raw=true
11+
812
ARGS:
913
secret-id ID of the secret
1014
revision Version number

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@ Create a version of a given secret specified by the `region` and `secret_id` par
55
USAGE:
66
scw secret version create <secret-id ...> [arg=value ...]
77

8+
EXAMPLES:
9+
Create a json secret version
10+
scw secret version create 11111111-1111-1111-111111111111 data={"key":"value"}
11+
812
ARGS:
913
secret-id ID of the secret
10-
data Content of the secret version. Base64 is handled by the SDK (Support file loading with @/path/to/file)
14+
data Content of the secret version. (Support file loading with @/path/to/file)
1115
[description] Description of the version
1216
[disable-previous] Disable the previous secret version
1317
[data-crc32] (Optional.) The CRC32 checksum of the data as a base-10 integer

docs/commands/secret.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,16 @@ scw secret version access <secret-id ...> [arg=value ...]
278278
| region | Default: `fr-par`<br />One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config |
279279

280280

281+
**Examples:**
282+
283+
284+
Get a raw json value from a secret version
285+
```
286+
scw secret version access 11111111-1111-1111-111111111111 revision=1 field=key raw=true
287+
```
288+
289+
290+
281291

282292
### Create a version
283293

@@ -295,13 +305,23 @@ scw secret version create <secret-id ...> [arg=value ...]
295305
| Name | | Description |
296306
|------|---|-------------|
297307
| secret-id | Required | ID of the secret |
298-
| data | Required | Content of the secret version. Base64 is handled by the SDK |
308+
| data | Required | Content of the secret version. |
299309
| description | | Description of the version |
300310
| disable-previous | | Disable the previous secret version |
301311
| data-crc32 | | (Optional.) The CRC32 checksum of the data as a base-10 integer |
302312
| region | Default: `fr-par`<br />One of: `fr-par`, `nl-ams`, `pl-waw` | Region to target. If none is passed will use default region from the config |
303313

304314

315+
**Examples:**
316+
317+
318+
Create a json secret version
319+
```
320+
scw secret version create 11111111-1111-1111-111111111111 data={"key":"value"}
321+
```
322+
323+
324+
305325

306326
### Delete a version
307327

Lines changed: 3 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
package secret
22

33
import (
4-
"context"
5-
"encoding/json"
6-
"fmt"
7-
"reflect"
8-
94
"github.com/scaleway/scaleway-cli/v2/internal/core"
105
secret "github.com/scaleway/scaleway-sdk-go/api/secret/v1beta1"
116
)
@@ -18,81 +13,9 @@ type customAccessSecretVersionRequest struct {
1813

1914
func GetCommands() *core.Commands {
2015
cmds := GetGeneratedCommands()
21-
cmds.MustFind("secret", "version", "create").Override(secretVersionCreateData)
22-
cmds.MustFind("secret", "version", "access").Override(secretVersionAccessCommand)
23-
return cmds
24-
}
25-
26-
func secretVersionCreateData(c *core.Command) *core.Command {
27-
*c.ArgSpecs.GetByName("data") = core.ArgSpec{
28-
Name: "data",
29-
Short: "Content of the secret version. Base64 is handled by the SDK",
30-
Required: true,
31-
CanLoadFile: true,
32-
}
33-
return c
34-
}
35-
36-
func secretVersionAccessCommand(c *core.Command) *core.Command {
37-
c.ArgsType = reflect.TypeOf(customAccessSecretVersionRequest{})
38-
39-
c.ArgSpecs.AddBefore("region", &core.ArgSpec{
40-
Name: "field",
41-
Short: "Return only the JSON field of the given name",
42-
})
43-
44-
c.ArgSpecs.AddBefore("region", &core.ArgSpec{
45-
Name: "raw",
46-
Short: "Return only the raw payload",
47-
})
48-
49-
c.Run = func(ctx context.Context, args interface{}) (i interface{}, e error) {
50-
client := core.ExtractClient(ctx)
51-
api := secret.NewAPI(client)
5216

53-
request := args.(*customAccessSecretVersionRequest)
17+
cmds.MustFind("secret", "version", "create").Override(secretVersionCreateBuilder)
18+
cmds.MustFind("secret", "version", "access").Override(secretVersionAccessBuilder)
5419

55-
response, err := api.AccessSecretVersion(&secret.AccessSecretVersionRequest{
56-
Region: request.Region,
57-
SecretID: request.SecretID,
58-
Revision: request.Revision,
59-
})
60-
if err != nil {
61-
return nil, err
62-
}
63-
64-
if request.Field != nil {
65-
response.Data, err = getSecretVersionField(response.Data, *request.Field)
66-
if err != nil {
67-
return nil, err
68-
}
69-
}
70-
71-
if request.Raw {
72-
return core.RawResult(response.Data), nil
73-
}
74-
75-
return response, nil
76-
}
77-
78-
return c
79-
}
80-
81-
func getSecretVersionField(data []byte, field string) ([]byte, error) {
82-
var rawFields interface{}
83-
if err := json.Unmarshal(data, &rawFields); err != nil {
84-
return nil, fmt.Errorf("cannot unmarshal JSON data")
85-
}
86-
87-
rawField, ok := rawFields.(map[string]interface{})[field]
88-
if !ok {
89-
return nil, fmt.Errorf("JSON field is not present")
90-
}
91-
92-
switch field := rawField.(type) {
93-
case string:
94-
return []byte(field), nil
95-
default:
96-
return nil, fmt.Errorf("JSON field type is not valid")
97-
}
20+
return cmds
9821
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package secret
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
"reflect"
8+
9+
"github.com/scaleway/scaleway-cli/v2/internal/core"
10+
secret "github.com/scaleway/scaleway-sdk-go/api/secret/v1beta1"
11+
)
12+
13+
func secretVersionCreateBuilder(c *core.Command) *core.Command {
14+
*c.ArgSpecs.GetByName("data") = core.ArgSpec{
15+
Name: "data",
16+
Short: "Content of the secret version.",
17+
Required: true,
18+
CanLoadFile: true,
19+
}
20+
21+
c.Examples = append(c.Examples, &core.Example{
22+
Short: "Create a json secret version",
23+
Raw: "scw secret version create 11111111-1111-1111-111111111111 data={\"key\":\"value\"}",
24+
})
25+
26+
return c
27+
}
28+
29+
func secretVersionAccessBuilder(c *core.Command) *core.Command {
30+
c.ArgsType = reflect.TypeOf(customAccessSecretVersionRequest{})
31+
32+
c.ArgSpecs.AddBefore("region", &core.ArgSpec{
33+
Name: "field",
34+
Short: "Return only the JSON field of the given name",
35+
})
36+
37+
c.ArgSpecs.AddBefore("region", &core.ArgSpec{
38+
Name: "raw",
39+
Short: "Return only the raw payload",
40+
})
41+
42+
c.Examples = append(c.Examples, &core.Example{
43+
Short: "Get a raw json value from a secret version",
44+
Raw: "scw secret version access 11111111-1111-1111-111111111111 revision=1 field=key raw=true",
45+
})
46+
47+
c.Run = func(ctx context.Context, args interface{}) (i interface{}, e error) {
48+
client := core.ExtractClient(ctx)
49+
api := secret.NewAPI(client)
50+
51+
request := args.(*customAccessSecretVersionRequest)
52+
53+
response, err := api.AccessSecretVersion(&secret.AccessSecretVersionRequest{
54+
Region: request.Region,
55+
SecretID: request.SecretID,
56+
Revision: request.Revision,
57+
})
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
if request.Field != nil {
63+
response.Data, err = getSecretVersionField(response.Data, *request.Field)
64+
if err != nil {
65+
return nil, err
66+
}
67+
}
68+
69+
if request.Raw {
70+
return core.RawResult(response.Data), nil
71+
}
72+
73+
return response, nil
74+
}
75+
76+
return c
77+
}
78+
79+
func getSecretVersionField(data []byte, field string) ([]byte, error) {
80+
var rawFields interface{}
81+
if err := json.Unmarshal(data, &rawFields); err != nil {
82+
return nil, fmt.Errorf("cannot unmarshal JSON data")
83+
}
84+
85+
rawField, ok := rawFields.(map[string]interface{})[field]
86+
if !ok {
87+
return nil, fmt.Errorf("JSON field is not present")
88+
}
89+
90+
switch field := rawField.(type) {
91+
case string:
92+
return []byte(field), nil
93+
default:
94+
return nil, fmt.Errorf("JSON field type is not valid")
95+
}
96+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package secret_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/alecthomas/assert"
7+
"github.com/scaleway/scaleway-cli/v2/internal/core"
8+
secret "github.com/scaleway/scaleway-cli/v2/internal/namespaces/secret/v1beta1"
9+
)
10+
11+
func Test_AccessSecret(t *testing.T) {
12+
cmds := secret.GetCommands()
13+
14+
t.Run("Simple", core.Test(&core.TestConfig{
15+
Commands: cmds,
16+
BeforeFunc: core.BeforeFuncCombine(
17+
createSecret("cli-test-access-secret"),
18+
createSecretVersion("{\"key\":\"value\"}"),
19+
),
20+
Cmd: "scw secret version access {{ .Secret.ID }} revision={{ .SecretVersion.Revision }} field=key raw=true",
21+
Check: core.TestCheckCombine(
22+
core.TestCheckGolden(),
23+
func(t *testing.T, ctx *core.CheckFuncCtx) {
24+
rawResult, isBytes := ctx.Result.(core.RawResult)
25+
if !isBytes {
26+
t.Fatalf("Expecting result to be bytes")
27+
}
28+
assert.Equal(t, core.RawResult("value"), rawResult)
29+
},
30+
),
31+
AfterFunc: core.AfterFuncCombine(
32+
deleteSecret(),
33+
),
34+
}))
35+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package secret_test
2+
3+
import (
4+
"github.com/scaleway/scaleway-cli/v2/internal/core"
5+
)
6+
7+
func createSecret(name string) core.BeforeFunc {
8+
return core.ExecStoreBeforeCmd(
9+
"Secret",
10+
"scw secret secret create name="+name,
11+
)
12+
}
13+
14+
func createSecretVersion(content string) core.BeforeFunc {
15+
return core.ExecStoreBeforeCmd(
16+
"SecretVersion",
17+
"scw secret version create {{ .Secret.ID }} data="+content,
18+
)
19+
}
20+
21+
func deleteSecret() core.AfterFunc {
22+
return core.ExecAfterCmd("scw secret secret delete {{ .Secret.ID }}")
23+
}

0 commit comments

Comments
 (0)