Skip to content

Commit 0b0f384

Browse files
committed
feat(secret): factorize code for secrets version
1 parent 91b79c3 commit 0b0f384

File tree

6 files changed

+284
-215
lines changed

6 files changed

+284
-215
lines changed

.github/workflows/test.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,15 @@ jobs:
9999
run: make -C tests
100100
- uses: actions/upload-artifact@v4
101101
with:
102-
name: test_results
102+
name: test_results_preprod
103103
path: |
104104
./tests/out/test_results.html
105105
./tests/out/venom.log
106106
retention-days: 5
107107
if: always()
108108
- uses: actions/upload-artifact@v4
109109
with:
110-
name: coverage
110+
name: coverage-preprod
111111
path: |
112112
./tests/out/coverage.txt
113113
./tests/out/coverage.html

cmd/okms/secretsV2/render.go

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package secretsv2
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"slices"
7+
8+
"github.com/olekukonko/tablewriter"
9+
"github.com/ovh/okms-cli/common/utils"
10+
"github.com/ovh/okms-sdk-go/types"
11+
)
12+
13+
func renderList(secrets *types.ListSecretV2Response) {
14+
tableMetadata := tablewriter.NewWriter(os.Stdout)
15+
tableMetadata.SetHeader([]string{"Path", "Cas Required", "Created at", "Current Version", "Deactivate Version After", "Max Versions", "Oldest Version", "Updated at", "Custom metadata"})
16+
tableData := tablewriter.NewWriter(os.Stdout)
17+
header := []string{}
18+
for _, secret := range *secrets.Results {
19+
tableMetadata.Append(
20+
[]string{
21+
utils.DerefOrDefault(secret.Path),
22+
fmt.Sprintf("%t", utils.DerefOrDefault(secret.Metadata.CasRequired)),
23+
utils.DerefOrDefault(secret.Metadata.CreatedAt),
24+
fmt.Sprintf("%d", utils.DerefOrDefault(secret.Metadata.CurrentVersion)),
25+
utils.DerefOrDefault(secret.Metadata.DeactivateVersionAfter),
26+
fmt.Sprintf("%d", utils.DerefOrDefault(secret.Metadata.MaxVersions)),
27+
fmt.Sprintf("%d", utils.DerefOrDefault(secret.Metadata.OldestVersion)),
28+
utils.DerefOrDefault(secret.Metadata.UpdatedAt),
29+
fmt.Sprintf("%v", utils.DerefOrDefault(secret.Metadata.CustomMetadata))})
30+
31+
if secret.Version.Data != nil {
32+
for field := range *secret.Version.Data {
33+
if !slices.Contains(header, field) {
34+
header = append(header, field)
35+
}
36+
}
37+
}
38+
}
39+
40+
tableData.SetHeader(header)
41+
// Fill the table
42+
for _, secret := range *secrets.Results {
43+
row := []string{}
44+
if secret.Version.Data != nil {
45+
for _, field := range header {
46+
row = append(row, fmt.Sprintf("%v", (*secret.Version.Data)[field]))
47+
}
48+
tableData.Append(row)
49+
}
50+
}
51+
52+
fmt.Println("Metadata")
53+
tableMetadata.Render()
54+
55+
fmt.Println("Data")
56+
tableData.Render()
57+
}
58+
59+
func renderMetadata(path string, meta types.SecretV2Metadata) {
60+
fmt.Printf("Metadata: %v\n", path)
61+
table := tablewriter.NewWriter(os.Stdout)
62+
63+
table.SetHeader([]string{"Cas Required", "Created at", "Current Version", "Deactivate Version After", "Max Versions", "Oldest Version", "Updated at", "Custom metadata"})
64+
table.Append(
65+
[]string{
66+
fmt.Sprintf("%t", utils.DerefOrDefault(meta.CasRequired)),
67+
utils.DerefOrDefault(meta.CreatedAt),
68+
fmt.Sprintf("%d", utils.DerefOrDefault(meta.CurrentVersion)),
69+
utils.DerefOrDefault(meta.DeactivateVersionAfter),
70+
fmt.Sprintf("%d", utils.DerefOrDefault(meta.MaxVersions)),
71+
fmt.Sprintf("%d", utils.DerefOrDefault(meta.OldestVersion)),
72+
utils.DerefOrDefault(meta.UpdatedAt),
73+
fmt.Sprintf("%v", *meta.CustomMetadata)})
74+
75+
table.Render()
76+
}
77+
78+
func renderListMetadataVersion(secrets []types.SecretV2Version) {
79+
fmt.Println("Metadata")
80+
table := tablewriter.NewWriter(os.Stdout)
81+
table.SetHeader([]string{"Id", "Created at", "Deactivated at", "State"})
82+
for _, secret := range secrets {
83+
table.Append([]string{fmt.Sprintf("%b", secret.Id), secret.CreatedAt, utils.DerefOrDefault(secret.DeactivatedAt), string(secret.State)})
84+
}
85+
table.Render()
86+
}
87+
func renderMetadataVersion(secret types.SecretV2Version) {
88+
// After all it's a list of size 1
89+
renderListMetadataVersion([]types.SecretV2Version{secret})
90+
}
91+
92+
// TODO optimize code.
93+
func renderListDataVersion(secrets []types.SecretV2Version) {
94+
fmt.Println("Data")
95+
table := tablewriter.NewWriter(os.Stdout)
96+
97+
// Find Header
98+
header := []string{}
99+
for _, secret := range secrets {
100+
if secret.Data != nil {
101+
for field := range *secret.Data {
102+
if !slices.Contains(header, field) {
103+
header = append(header, field)
104+
}
105+
}
106+
}
107+
}
108+
table.SetHeader(header)
109+
// Fill the table
110+
for _, secret := range secrets {
111+
row := []string{}
112+
if secret.Data != nil {
113+
for _, field := range header {
114+
row = append(row, fmt.Sprintf("%v", (*secret.Data)[field]))
115+
}
116+
table.Append(row)
117+
}
118+
}
119+
table.Render()
120+
}
121+
122+
func renderDataVersion(data map[string]interface{}) {
123+
fmt.Println("Data")
124+
tableData := tablewriter.NewWriter(os.Stdout)
125+
tableData.SetHeader([]string{"Key", "Value"})
126+
for k, v := range data {
127+
tableData.Append([]string{k, fmt.Sprintf("%v", v)})
128+
}
129+
tableData.Render()
130+
}

cmd/okms/secretsV2/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func CreateCommand(cust common.CustomizeFunc) *cobra.Command {
2222
secretPutCmd(),
2323
secretDeleteCmd(),
2424
secretVersionCommand(),
25+
secretPutCustomMetadataCmd(),
2526
)
2627

2728
return kvCmd

cmd/okms/secretsV2/secrets.go

Lines changed: 59 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import (
55
"io"
66
"os"
77

8-
"github.com/olekukonko/tablewriter"
9-
108
"github.com/ovh/okms-cli/cmd/okms/common"
119
"github.com/ovh/okms-cli/common/flagsmgmt"
1210
"github.com/ovh/okms-cli/common/flagsmgmt/restflags"
@@ -37,7 +35,7 @@ func secretListCmd() *cobra.Command {
3735
if cmd.Flag("output").Value.String() == string(flagsmgmt.JSON_OUTPUT_FORMAT) {
3836
output.JsonPrint(resp)
3937
} else if resp.Results != nil {
40-
renderSecretListTable(resp.Results)
38+
renderList(resp)
4139
}
4240
},
4341
}
@@ -52,7 +50,6 @@ func secretPostCmd() *cobra.Command {
5250
casRequired bool
5351
maxVersions uint32
5452
deactivateVersionAfter string
55-
// TODO Add customMetadata ? How ?
5653
)
5754
cmd := &cobra.Command{
5855
Use: "create [FLAGS] PATH [DATA]",
@@ -88,29 +85,7 @@ func secretPostCmd() *cobra.Command {
8885
if cmd.Flag("output").Value.String() == string(flagsmgmt.JSON_OUTPUT_FORMAT) {
8986
output.JsonPrint(resp)
9087
} else {
91-
casRequired = utils.DerefOrDefault(resp.Metadata.CasRequired)
92-
createdAt := utils.DerefOrDefault(resp.Metadata.CreatedAt)
93-
deactivateVersionAfter := utils.DerefOrDefault(resp.Metadata.DeactivateVersionAfter)
94-
maxVersions := utils.DerefOrDefault(resp.Metadata.MaxVersions)
95-
96-
var customMetadata string
97-
if resp.Metadata.CustomMetadata != nil {
98-
customMetadata = fmt.Sprintf("%v", *resp.Metadata.CustomMetadata)
99-
}
100-
101-
fmt.Println("Metadata")
102-
table := tablewriter.NewWriter(os.Stdout)
103-
table.SetHeader([]string{"Key", "Value"})
104-
table.AppendBulk([][]string{
105-
{"Cas Required", fmt.Sprintf("%t", casRequired)},
106-
{"Created at", createdAt},
107-
{"Deactivate Version After", deactivateVersionAfter},
108-
{"Max Versions", fmt.Sprintf("%d", maxVersions)},
109-
{"Custom metadata", customMetadata},
110-
{"Path", *resp.Path}, // Path is displayed in the metadata Table, which can be confusing since it's not a metadata
111-
// TODO : improve path display, maybe on top of the table `Path: ...`
112-
})
113-
table.Render()
88+
renderMetadata(utils.DerefOrDefault(resp.Path), utils.DerefOrDefault(resp.Metadata))
11489
}
11590
},
11691
}
@@ -135,37 +110,9 @@ func secretGetCmd() *cobra.Command {
135110
if cmd.Flag("output").Value.String() == string(flagsmgmt.JSON_OUTPUT_FORMAT) {
136111
output.JsonPrint(resp)
137112
} else {
138-
casRequired := utils.DerefOrDefault(resp.Metadata.CasRequired)
139-
createdAt := utils.DerefOrDefault(resp.Metadata.CreatedAt)
140-
deactivateVersionAfter := utils.DerefOrDefault(resp.Metadata.DeactivateVersionAfter)
141-
maxVersions := utils.DerefOrDefault(resp.Metadata.MaxVersions)
142-
143-
var customMetadata string
144-
if resp.Metadata.CustomMetadata != nil {
145-
customMetadata = fmt.Sprintf("%v", *resp.Metadata.CustomMetadata)
146-
}
147-
148-
fmt.Println("Metadata")
149-
table := tablewriter.NewWriter(os.Stdout)
150-
table.SetHeader([]string{"Key", "Value"})
151-
table.AppendBulk([][]string{
152-
{"Cas Required", fmt.Sprintf("%t", casRequired)},
153-
{"Created at", createdAt},
154-
{"Deactivate Version After", deactivateVersionAfter},
155-
{"Max Versions", fmt.Sprintf("%d", maxVersions)},
156-
{"Custom metadata", customMetadata},
157-
{"Path", *resp.Path},
158-
})
159-
table.Render()
160-
113+
renderMetadata(utils.DerefOrDefault(resp.Path), utils.DerefOrDefault(resp.Metadata))
161114
if includeData && resp.Version.Data != nil {
162-
fmt.Println("Data")
163-
tableData := tablewriter.NewWriter(os.Stdout)
164-
tableData.SetHeader([]string{"Key", "Value"})
165-
for k, v := range *resp.Version.Data {
166-
tableData.Append([]string{k, fmt.Sprintf("%v", v)})
167-
}
168-
tableData.Render()
115+
renderDataVersion(*resp.Version.Data)
169116
}
170117
}
171118
},
@@ -182,7 +129,6 @@ func secretPutCmd() *cobra.Command {
182129
maxVersions uint32
183130
deactivateVersionAfter string
184131
cas uint32
185-
// TODO Add customMetadata ? How ?
186132
)
187133
cmd := &cobra.Command{
188134
Use: "update [FLAGS] PATH [DATA]",
@@ -220,28 +166,63 @@ func secretPutCmd() *cobra.Command {
220166
if cmd.Flag("output").Value.String() == string(flagsmgmt.JSON_OUTPUT_FORMAT) {
221167
output.JsonPrint(resp)
222168
} else {
223-
casRequired = utils.DerefOrDefault(resp.Metadata.CasRequired)
224-
createdAt := utils.DerefOrDefault(resp.Metadata.CreatedAt)
225-
deactivateVersionAfter := utils.DerefOrDefault(resp.Metadata.DeactivateVersionAfter)
226-
maxVersions := utils.DerefOrDefault(resp.Metadata.MaxVersions)
169+
renderMetadata(utils.DerefOrDefault(resp.Path), utils.DerefOrDefault(resp.Metadata))
170+
}
171+
},
172+
}
227173

228-
var customMetadata string
229-
if resp.Metadata.CustomMetadata != nil {
230-
customMetadata = fmt.Sprintf("%v", *resp.Metadata.CustomMetadata)
231-
}
174+
cmd.Flags().BoolVar(&casRequired, "cas-required", false, "The cas parameter will be required for all write requests if set to true")
175+
cmd.Flags().Uint32Var(&maxVersions, "max-versions", 10, "The number of versions to keep (10 default)")
176+
cmd.Flags().StringVar(&deactivateVersionAfter, "deactivate-version-after", "", "Time duration before a version is deactivated")
177+
cmd.Flags().Uint32Var(&cas, "cas", 0, "Secret version number. Required if cas-required is set to true.")
232178

233-
fmt.Println("Metadata")
234-
table := tablewriter.NewWriter(os.Stdout)
235-
table.SetHeader([]string{"Key", "Value"})
236-
table.AppendBulk([][]string{
237-
{"Cas Required", fmt.Sprintf("%t", casRequired)},
238-
{"Created at", createdAt},
239-
{"Deactivate Version After", deactivateVersionAfter},
240-
{"Max Versions", fmt.Sprintf("%d", maxVersions)},
241-
{"Custom metadata", customMetadata},
242-
{"Path", *resp.Path},
243-
})
244-
table.Render()
179+
return cmd
180+
}
181+
182+
func secretPutCustomMetadataCmd() *cobra.Command {
183+
var (
184+
casRequired bool
185+
maxVersions uint32
186+
deactivateVersionAfter string
187+
cas uint32
188+
)
189+
cmd := &cobra.Command{
190+
Use: "update-metadata [FLAGS] PATH [CUSTOM-DATA]",
191+
Short: "Update a secret",
192+
Args: cobra.MinimumNArgs(2),
193+
Run: func(cmd *cobra.Command, args []string) {
194+
in := io.Reader(os.Stdin)
195+
body := types.PutSecretV2Request{
196+
Metadata: &types.SecretV2MetadataShort{},
197+
Version: &types.SecretV2VersionShort{},
198+
}
199+
var c *uint32
200+
if cmd.Flag("cas").Changed {
201+
c = &cas
202+
}
203+
204+
if cmd.Flag("cas-required").Changed {
205+
body.Metadata.CasRequired = &casRequired
206+
}
207+
if cmd.Flag("max-versions").Changed {
208+
body.Metadata.MaxVersions = &maxVersions
209+
}
210+
if cmd.Flag("deactivate-version-after").Changed {
211+
body.Metadata.DeactivateVersionAfter = &deactivateVersionAfter
212+
}
213+
214+
customMetadata, err := restflags.ParseArgsCustomMetadata(in, args[1:])
215+
if err != nil {
216+
fmt.Fprintln(os.Stderr, "Failed to parse K=V data:", err)
217+
os.Exit(1)
218+
}
219+
body.Metadata.CustomMetadata = utils.PtrTo(types.SecretV2CustomMetadata(customMetadata))
220+
221+
resp := exit.OnErr2(common.Client().PutSecretV2(cmd.Context(), args[0], c, body))
222+
if cmd.Flag("output").Value.String() == string(flagsmgmt.JSON_OUTPUT_FORMAT) {
223+
output.JsonPrint(resp)
224+
} else {
225+
renderMetadata(utils.DerefOrDefault(resp.Path), utils.DerefOrDefault(resp.Metadata))
245226
}
246227
},
247228
}
@@ -266,52 +247,3 @@ func secretDeleteCmd() *cobra.Command {
266247
}
267248
return cmd
268249
}
269-
270-
func renderSecretListTable(data *[]types.GetSecretV2Response) {
271-
if data == nil {
272-
return
273-
}
274-
for _, v := range *data {
275-
renderSecretTable(v)
276-
}
277-
}
278-
279-
func renderSecretTable(data types.GetSecretV2Response) {
280-
casRequired := utils.DerefOrDefault(data.Metadata.CasRequired)
281-
createdAt := utils.DerefOrDefault(data.Metadata.CreatedAt)
282-
currentVersion := utils.DerefOrDefault(data.Metadata.CurrentVersion)
283-
deactivateVersionAfter := utils.DerefOrDefault(data.Metadata.DeactivateVersionAfter)
284-
maxVersions := utils.DerefOrDefault(data.Metadata.MaxVersions)
285-
oldestVersion := utils.DerefOrDefault(data.Metadata.OldestVersion)
286-
updatedAt := utils.DerefOrDefault(data.Metadata.UpdatedAt)
287-
288-
var customMetadata string
289-
if data.Metadata.CustomMetadata != nil {
290-
customMetadata = fmt.Sprintf("%v", *data.Metadata.CustomMetadata)
291-
}
292-
293-
fmt.Println("Metadata")
294-
table := tablewriter.NewWriter(os.Stdout)
295-
table.SetHeader([]string{"Key", "Value"})
296-
table.AppendBulk([][]string{
297-
{"Cas Required", fmt.Sprintf("%t", casRequired)},
298-
{"Created at", createdAt},
299-
{"Current Version", fmt.Sprintf("%d", currentVersion)},
300-
{"Deactivate Version After", deactivateVersionAfter},
301-
{"Max Versions", fmt.Sprintf("%d", maxVersions)},
302-
{"Oldest Version", fmt.Sprintf("%d", oldestVersion)},
303-
{"Updated at", updatedAt},
304-
{"Custom metadata", customMetadata},
305-
})
306-
table.Render()
307-
308-
if data.Version.Data != nil {
309-
fmt.Println("Data")
310-
tableData := tablewriter.NewWriter(os.Stdout)
311-
tableData.SetHeader([]string{"Key", "Value"})
312-
for k, v := range *data.Version.Data {
313-
tableData.Append([]string{k, fmt.Sprintf("%v", v)})
314-
}
315-
tableData.Render()
316-
}
317-
}

0 commit comments

Comments
 (0)