Skip to content

Commit 2ec7797

Browse files
authored
Onboard Secrets Manager instance (create and list) and config commands (#105)
* Onboard Secrets Manager: list subcommand * Onboard Secrets Manager: create subcommand * Add Secrets Manager to set and unset in config * Address comments in PR * Onboard secrets manager: add delete subcommand * Revert "Onboard secrets manager: add delete subcommand" This reverts commit 9802b42.
1 parent 267fa11 commit 2ec7797

File tree

16 files changed

+766
-6
lines changed

16 files changed

+766
-6
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ require (
1717
github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.10.1
1818
github.com/stackitcloud/stackit-sdk-go/services/postgresflex v0.9.2
1919
github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.7.7
20+
github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.5.6
2021
github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.3.6
2122
github.com/stackitcloud/stackit-sdk-go/services/ske v0.10.1
2223
github.com/zalando/go-keyring v0.2.3

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ github.com/stackitcloud/stackit-sdk-go/services/redis v0.10.1 h1:/tRad17HUcGRm44
9797
github.com/stackitcloud/stackit-sdk-go/services/redis v0.10.1/go.mod h1:vR/0cYTcVrPTTAHJGH2VT0H2g1D+wlx1n2WiAo6r5LI=
9898
github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.7.7 h1:yFxTdMj5al2pR4ZIOKKxoN8CHo2kTylurArt+jJMzxI=
9999
github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.7.7/go.mod h1:GvNV2GR0x0VGHzixGNgAJibqjwiVFwbxakpyu+qdijc=
100+
github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.5.6 h1:SC9p/+HP6e90NorFD6bRg6G+0VxJ7kRoihhbfjw2Mbs=
101+
github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.5.6/go.mod h1:vwyWRIKMD7J6S4qlnNP8uefouHtIZba9WpnoihSZByU=
100102
github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.3.6 h1:3kkNh2kHi55w9dgh0MC1Zbn8fDpYxcXl3tvYjH8t9xo=
101103
github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.3.6/go.mod h1:OOciROyQxPOYLo8OM/DE5ESH11+DvAyRt6wg7R+HVkg=
102104
github.com/stackitcloud/stackit-sdk-go/services/ske v0.10.1 h1:MZABtJ8HFOKG3KCCv5duibxBSAU1zTFAO0V9bso3N9M=

internal/cmd/config/set/set.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const (
2929
rabbitMQCustomEndpointFlag = "rabbitmq-custom-endpoint"
3030
redisCustomEndpointFlag = "redis-custom-endpoint"
3131
resourceManagerCustomEndpointFlag = "resource-manager-custom-endpoint"
32+
secretsManagerCustomEndpointFlag = "secrets-manager-custom-endpoint"
3233
serviceAccountCustomEndpointFlag = "service-account-custom-endpoint"
3334
skeCustomEndpointFlag = "ske-custom-endpoint"
3435
)
@@ -102,6 +103,7 @@ func configureFlags(cmd *cobra.Command) {
102103
cmd.Flags().String(rabbitMQCustomEndpointFlag, "", "RabbitMQ API base URL, used in calls to this API")
103104
cmd.Flags().String(redisCustomEndpointFlag, "", "Redis API base URL, used in calls to this API")
104105
cmd.Flags().String(resourceManagerCustomEndpointFlag, "", "Resource Manager API base URL, used in calls to this API")
106+
cmd.Flags().String(secretsManagerCustomEndpointFlag, "", "Secrets Manager API base URL, used in calls to this API")
105107
cmd.Flags().String(serviceAccountCustomEndpointFlag, "", "Service Account API base URL, used in calls to this API")
106108
cmd.Flags().String(skeCustomEndpointFlag, "", "SKE API base URL, used in calls to this API")
107109

@@ -123,6 +125,8 @@ func configureFlags(cmd *cobra.Command) {
123125
cobra.CheckErr(err)
124126
err = viper.BindPFlag(config.ResourceManagerEndpointKey, cmd.Flags().Lookup(skeCustomEndpointFlag))
125127
cobra.CheckErr(err)
128+
err = viper.BindPFlag(config.SecretsManagerCustomEndpointKey, cmd.Flags().Lookup(secretsManagerCustomEndpointFlag))
129+
cobra.CheckErr(err)
126130
err = viper.BindPFlag(config.ServiceAccountCustomEndpointKey, cmd.Flags().Lookup(serviceAccountCustomEndpointFlag))
127131
cobra.CheckErr(err)
128132
err = viper.BindPFlag(config.SKECustomEndpointKey, cmd.Flags().Lookup(skeCustomEndpointFlag))

internal/cmd/config/unset/unset.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const (
3131
rabbitMQCustomEndpointFlag = "rabbitmq-custom-endpoint"
3232
redisCustomEndpointFlag = "redis-custom-endpoint"
3333
resourceManagerCustomEndpointFlag = "resource-manager-custom-endpoint"
34+
secretsManagerCustomEndpointFlag = "secrets-manager-custom-endpoint"
3435
serviceAccountCustomEndpointFlag = "service-account-custom-endpoint"
3536
skeCustomEndpointFlag = "ske-custom-endpoint"
3637
)
@@ -53,6 +54,7 @@ type inputModel struct {
5354
RabbitMQCustomEndpoint bool
5455
RedisCustomEndpoint bool
5556
ResourceManagerCustomEndpoint bool
57+
SecretsManagerCustomEndpoint bool
5658
ServiceAccountCustomEndpoint bool
5759
SKECustomEndpoint bool
5860
}
@@ -124,6 +126,9 @@ func NewCmd() *cobra.Command {
124126
if model.ResourceManagerCustomEndpoint {
125127
viper.Set(config.ResourceManagerEndpointKey, "")
126128
}
129+
if model.SecretsManagerCustomEndpoint {
130+
viper.Set(config.SecretsManagerCustomEndpointKey, "")
131+
}
127132
if model.ServiceAccountCustomEndpoint {
128133
viper.Set(config.ServiceAccountCustomEndpointKey, "")
129134
}
@@ -160,6 +165,7 @@ func configureFlags(cmd *cobra.Command) {
160165
cmd.Flags().Bool(rabbitMQCustomEndpointFlag, false, "RabbitMQ API base URL. If unset, uses the default base URL")
161166
cmd.Flags().Bool(redisCustomEndpointFlag, false, "Redis API base URL. If unset, uses the default base URL")
162167
cmd.Flags().Bool(resourceManagerCustomEndpointFlag, false, "Resource Manager API base URL. If unset, uses the default base URL")
168+
cmd.Flags().Bool(secretsManagerCustomEndpointFlag, false, "Secrets Manager API base URL. If unset, uses the default base URL")
163169
cmd.Flags().Bool(serviceAccountCustomEndpointFlag, false, "SKE API base URL. If unset, uses the default base URL")
164170
cmd.Flags().Bool(skeCustomEndpointFlag, false, "SKE API base URL. If unset, uses the default base URL")
165171
}
@@ -182,6 +188,7 @@ func parseInput(cmd *cobra.Command) *inputModel {
182188
RabbitMQCustomEndpoint: flags.FlagToBoolValue(cmd, rabbitMQCustomEndpointFlag),
183189
RedisCustomEndpoint: flags.FlagToBoolValue(cmd, redisCustomEndpointFlag),
184190
ResourceManagerCustomEndpoint: flags.FlagToBoolValue(cmd, resourceManagerCustomEndpointFlag),
191+
SecretsManagerCustomEndpoint: flags.FlagToBoolValue(cmd, secretsManagerCustomEndpointFlag),
185192
ServiceAccountCustomEndpoint: flags.FlagToBoolValue(cmd, serviceAccountCustomEndpointFlag),
186193
SKECustomEndpoint: flags.FlagToBoolValue(cmd, skeCustomEndpointFlag),
187194
}

internal/cmd/config/unset/unset_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]bool)) map[string]bool
2121
rabbitMQCustomEndpointFlag: true,
2222
redisCustomEndpointFlag: true,
2323
resourceManagerCustomEndpointFlag: true,
24+
secretsManagerCustomEndpointFlag: true,
2425
serviceAccountCustomEndpointFlag: true,
2526
skeCustomEndpointFlag: true,
2627
}
@@ -44,6 +45,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
4445
RabbitMQCustomEndpoint: true,
4546
RedisCustomEndpoint: true,
4647
ResourceManagerCustomEndpoint: true,
48+
SecretsManagerCustomEndpoint: true,
4749
ServiceAccountCustomEndpoint: true,
4850
SKECustomEndpoint: true,
4951
}
@@ -83,6 +85,7 @@ func TestParseInput(t *testing.T) {
8385
model.RabbitMQCustomEndpoint = false
8486
model.RedisCustomEndpoint = false
8587
model.ResourceManagerCustomEndpoint = false
88+
model.SecretsManagerCustomEndpoint = false
8689
model.ServiceAccountCustomEndpoint = false
8790
model.SKECustomEndpoint = false
8891
}),
@@ -117,6 +120,16 @@ func TestParseInput(t *testing.T) {
117120
model.DNSCustomEndpoint = false
118121
}),
119122
},
123+
{
124+
description: "secrets manager custom endpoint empty",
125+
flagValues: fixtureFlagValues(func(flagValues map[string]bool) {
126+
flagValues[secretsManagerCustomEndpointFlag] = false
127+
}),
128+
isValid: true,
129+
expectedModel: fixtureInputModel(func(model *inputModel) {
130+
model.SecretsManagerCustomEndpoint = false
131+
}),
132+
},
120133
{
121134
description: "service account custom endpoint empty",
122135
flagValues: fixtureFlagValues(func(flagValues map[string]bool) {

internal/cmd/mongodbflex/instance/list/list.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func parseInput(cmd *cobra.Command) (*inputModel, error) {
106106

107107
return &inputModel{
108108
GlobalFlagModel: globalFlags,
109-
Limit: flags.FlagToInt64Pointer(cmd, limitFlag),
109+
Limit: limit,
110110
}, nil
111111
}
112112

internal/cmd/root.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/stackitcloud/stackit-cli/internal/cmd/project"
2121
"github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq"
2222
"github.com/stackitcloud/stackit-cli/internal/cmd/redis"
23+
secretsmanager "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager"
2324
serviceaccount "github.com/stackitcloud/stackit-cli/internal/cmd/service-account"
2425
"github.com/stackitcloud/stackit-cli/internal/cmd/ske"
2526
"github.com/stackitcloud/stackit-cli/internal/pkg/args"
@@ -97,6 +98,7 @@ func addSubcommands(cmd *cobra.Command) {
9798
cmd.AddCommand(project.NewCmd())
9899
cmd.AddCommand(rabbitmq.NewCmd())
99100
cmd.AddCommand(redis.NewCmd())
101+
cmd.AddCommand(secretsmanager.NewCmd())
100102
cmd.AddCommand(serviceaccount.NewCmd())
101103
cmd.AddCommand(ske.NewCmd())
102104
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package create
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+
cliErr "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/projectname"
14+
"github.com/stackitcloud/stackit-cli/internal/pkg/services/secrets-manager/client"
15+
"github.com/stackitcloud/stackit-sdk-go/services/secretsmanager"
16+
17+
"github.com/spf13/cobra"
18+
)
19+
20+
const (
21+
instanceNameFlag = "name"
22+
)
23+
24+
type inputModel struct {
25+
*globalflags.GlobalFlagModel
26+
27+
InstanceName *string
28+
}
29+
30+
func NewCmd() *cobra.Command {
31+
cmd := &cobra.Command{
32+
Use: "create",
33+
Short: "Creates a Secrets Manager instance",
34+
Long: "Creates a Secrets Manager instance.",
35+
Args: args.NoArgs,
36+
Example: examples.Build(
37+
examples.NewExample(
38+
`Create a Secrets Manager instance with name "my-instance"`,
39+
`$ stackit secrets-manager instance create --name my-instance`),
40+
),
41+
RunE: func(cmd *cobra.Command, args []string) error {
42+
ctx := context.Background()
43+
44+
model, err := parseInput(cmd)
45+
if err != nil {
46+
return err
47+
}
48+
49+
// Configure API client
50+
apiClient, err := client.ConfigureClient(cmd)
51+
if err != nil {
52+
return err
53+
}
54+
55+
projectLabel, err := projectname.GetProjectName(ctx, cmd)
56+
if err != nil {
57+
projectLabel = model.ProjectId
58+
}
59+
60+
if !model.AssumeYes {
61+
prompt := fmt.Sprintf("Are you sure you want to create a Secrets Manager instance for project %q?", projectLabel)
62+
err = confirm.PromptForConfirmation(cmd, prompt)
63+
if err != nil {
64+
return err
65+
}
66+
}
67+
68+
// Call API
69+
req := buildRequest(ctx, model, apiClient)
70+
resp, err := req.Execute()
71+
if err != nil {
72+
return fmt.Errorf("create Secrets Manager instance: %w", err)
73+
}
74+
instanceId := *resp.Id
75+
76+
cmd.Printf("Created instance for project %q. Instance ID: %s\n", projectLabel, instanceId)
77+
return nil
78+
},
79+
}
80+
configureFlags(cmd)
81+
return cmd
82+
}
83+
84+
func configureFlags(cmd *cobra.Command) {
85+
cmd.Flags().StringP(instanceNameFlag, "n", "", "Instance name")
86+
87+
err := flags.MarkFlagsRequired(cmd, instanceNameFlag)
88+
cobra.CheckErr(err)
89+
}
90+
91+
func parseInput(cmd *cobra.Command) (*inputModel, error) {
92+
globalFlags := globalflags.Parse(cmd)
93+
if globalFlags.ProjectId == "" {
94+
return nil, &cliErr.ProjectIdError{}
95+
}
96+
97+
return &inputModel{
98+
GlobalFlagModel: globalFlags,
99+
InstanceName: flags.FlagToStringPointer(cmd, instanceNameFlag),
100+
}, nil
101+
}
102+
103+
func buildRequest(ctx context.Context, model *inputModel, apiClient *secretsmanager.APIClient) secretsmanager.ApiCreateInstanceRequest {
104+
req := apiClient.CreateInstance(ctx, model.ProjectId)
105+
106+
req = req.CreateInstancePayload(secretsmanager.CreateInstancePayload{
107+
Name: model.InstanceName,
108+
})
109+
110+
return req
111+
}

0 commit comments

Comments
 (0)