Skip to content

Commit 29f059d

Browse files
authored
feat(secret-manager): add option 'field' and 'raw' to secret version accesss (#3723)
Co-authored-by: Olivier Roques <[email protected]>
1 parent 9bac9fd commit 29f059d

File tree

1 file changed

+61
-7
lines changed

1 file changed

+61
-7
lines changed

internal/namespaces/secret/v1beta1/custom.go

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,28 @@ package secret
22

33
import (
44
"context"
5+
"encoding/json"
6+
"fmt"
7+
"reflect"
58

69
"github.com/scaleway/scaleway-cli/v2/internal/core"
710
secret "github.com/scaleway/scaleway-sdk-go/api/secret/v1beta1"
811
)
912

13+
type customAccessSecretVersionRequest struct {
14+
secret.AccessSecretVersionRequest
15+
Field *string
16+
Raw bool
17+
}
18+
1019
func GetCommands() *core.Commands {
1120
cmds := GetGeneratedCommands()
12-
13-
cmds.MustFind("secret", "version", "create").Override(dataCreateVersion)
21+
cmds.MustFind("secret", "version", "create").Override(secretVersionCreateData)
1422
cmds.MustFind("secret", "version", "access").Override(secretVersionAccessCommand)
1523
return cmds
1624
}
1725

18-
func dataCreateVersion(c *core.Command) *core.Command {
26+
func secretVersionCreateData(c *core.Command) *core.Command {
1927
*c.ArgSpecs.GetByName("data") = core.ArgSpec{
2028
Name: "data",
2129
Short: "Content of the secret version. Base64 is handled by the SDK",
@@ -26,19 +34,65 @@ func dataCreateVersion(c *core.Command) *core.Command {
2634
}
2735

2836
func secretVersionAccessCommand(c *core.Command) *core.Command {
29-
c.Run = func(ctx context.Context, args interface{}) (i interface{}, e error) {
30-
request := args.(*secret.AccessSecretVersionRequest)
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+
})
3143

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) {
3250
client := core.ExtractClient(ctx)
3351
api := secret.NewAPI(client)
34-
res, err := api.AccessSecretVersion(request)
3552

53+
request := args.(*customAccessSecretVersionRequest)
54+
55+
response, err := api.AccessSecretVersion(&secret.AccessSecretVersionRequest{
56+
Region: request.Region,
57+
SecretID: request.SecretID,
58+
Revision: request.Revision,
59+
})
3660
if err != nil {
3761
return nil, err
3862
}
3963

40-
return core.RawResult(res.Data), nil
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
4176
}
4277

4378
return c
4479
}
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+
}
98+
}

0 commit comments

Comments
 (0)