Skip to content

Commit 57d004d

Browse files
committed
feat(server): refactor detach command to use flags instead of positional arguments
1 parent 8a32a6c commit 57d004d

File tree

2 files changed

+28
-39
lines changed

2 files changed

+28
-39
lines changed

internal/cmd/server/security-group/detach/detach.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,11 @@ import (
1515
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
1616
"github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client"
1717
iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils"
18-
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
1918
"github.com/stackitcloud/stackit-sdk-go/services/iaas"
2019
)
2120

2221
const (
23-
serverIdArg = "SERVER_ID"
24-
22+
serverIdFlag = "server-id"
2523
securityGroupIdFlag = "security-group-id"
2624
)
2725

@@ -33,14 +31,14 @@ type inputModel struct {
3331

3432
func NewCmd(params *types.CmdParams) *cobra.Command {
3533
cmd := &cobra.Command{
36-
Use: fmt.Sprintf("detach %s", serverIdArg),
34+
Use: "detach",
3735
Short: "Detaches a security group from a server",
3836
Long: "Detaches a security group from a server.",
39-
Args: args.SingleArg(serverIdArg, utils.ValidateUUID),
37+
Args: args.NoArgs,
4038
Example: examples.Build(
4139
examples.NewExample(
4240
`Detach a security group with ID "xxx" from a server with ID "yyy"`,
43-
`$ stackit server security-group detach yyy --security-group-id xxx`,
41+
`$ stackit server security-group detach --server-id yyy --security-group-id xxx`,
4442
),
4543
),
4644
RunE: func(cmd *cobra.Command, args []string) error {
@@ -92,22 +90,22 @@ func NewCmd(params *types.CmdParams) *cobra.Command {
9290
}
9391

9492
func configureFlags(cmd *cobra.Command) {
93+
cmd.Flags().Var(flags.UUIDFlag(), serverIdFlag, "Server ID")
9594
cmd.Flags().Var(flags.UUIDFlag(), securityGroupIdFlag, "Security Group ID")
9695

97-
err := flags.MarkFlagsRequired(cmd, securityGroupIdFlag)
96+
err := flags.MarkFlagsRequired(cmd, serverIdFlag, securityGroupIdFlag)
9897
cobra.CheckErr(err)
9998
}
10099

101100
func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) {
102-
serverId := inputArgs[0]
103101
globalFlags := globalflags.Parse(p, cmd)
104102
if globalFlags.ProjectId == "" {
105103
return nil, &cliErr.ProjectIdError{}
106104
}
107105

108106
model := inputModel{
109107
GlobalFlagModel: globalFlags,
110-
ServerId: serverId,
108+
ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag),
111109
SecurityGroupId: flags.FlagToStringValue(p, cmd, securityGroupIdFlag),
112110
}
113111

internal/cmd/server/security-group/detach/detach_test.go

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,12 @@ var testProjectId = uuid.NewString()
2626
var testServerId = uuid.NewString()
2727
var testSecurityGroupId = uuid.NewString()
2828

29-
func fixtureArgValues(mods ...func(argValues []string)) []string {
30-
argValues := []string{
31-
testServerId,
32-
}
33-
for _, mod := range mods {
34-
mod(argValues)
35-
}
36-
return argValues
37-
}
38-
3929
func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string {
4030
flagValues := map[string]string{
4131
globalflags.ProjectIdFlag: testProjectId,
4232
globalflags.RegionFlag: testRegion,
4333

34+
serverIdFlag: testServerId,
4435
securityGroupIdFlag: testSecurityGroupId,
4536
}
4637
for _, mod := range mods {
@@ -76,14 +67,12 @@ func fixtureRequest(mods ...func(request *iaas.ApiRemoveSecurityGroupFromServerR
7667
func TestParseInput(t *testing.T) {
7768
tests := []struct {
7869
description string
79-
argValues []string
8070
flagValues map[string]string
8171
isValid bool
8272
expectedModel *inputModel
8373
}{
8474
{
8575
description: "base",
86-
argValues: fixtureArgValues(),
8776
flagValues: fixtureFlagValues(),
8877
isValid: true,
8978
expectedModel: fixtureInputModel(),
@@ -95,56 +84,66 @@ func TestParseInput(t *testing.T) {
9584
},
9685
{
9786
description: "project id missing",
98-
argValues: fixtureArgValues(),
9987
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
10088
delete(flagValues, globalflags.ProjectIdFlag)
10189
}),
10290
isValid: false,
10391
},
10492
{
10593
description: "project id invalid 1",
106-
argValues: fixtureArgValues(),
10794
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
10895
flagValues[globalflags.ProjectIdFlag] = ""
10996
}),
11097
isValid: false,
11198
},
11299
{
113100
description: "project id invalid 2",
114-
argValues: fixtureArgValues(),
115101
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
116102
flagValues[globalflags.ProjectIdFlag] = "invalid-uuid"
117103
}),
118104
isValid: false,
119105
},
120106
{
121107
description: "security group id missing",
122-
argValues: fixtureArgValues(),
123108
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
124109
delete(flagValues, securityGroupIdFlag)
125110
}),
126111
isValid: false,
127112
},
128113
{
129114
description: "security group id invalid 1",
130-
argValues: fixtureArgValues(),
131115
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
132116
flagValues[securityGroupIdFlag] = ""
133117
}),
134118
isValid: false,
135119
},
136120
{
137121
description: "security group id invalid 2",
138-
argValues: fixtureArgValues(),
139122
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
140123
flagValues[securityGroupIdFlag] = "invalid-uuid"
141124
}),
142125
isValid: false,
143126
},
144127
{
145-
description: "server id argument missing",
146-
argValues: []string{},
147-
isValid: false,
128+
description: "server id flag missing",
129+
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
130+
delete(flagValues, serverIdFlag)
131+
}),
132+
isValid: false,
133+
},
134+
{
135+
description: "server id invalid 1",
136+
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
137+
flagValues[serverIdFlag] = ""
138+
}),
139+
isValid: false,
140+
},
141+
{
142+
description: "server id invalid 2",
143+
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
144+
flagValues[serverIdFlag] = "invalid-uuid"
145+
}),
146+
isValid: false,
148147
},
149148
}
150149

@@ -167,14 +166,6 @@ func TestParseInput(t *testing.T) {
167166
}
168167
}
169168

170-
err = cmd.ValidateArgs(tt.argValues)
171-
if err != nil {
172-
if !tt.isValid {
173-
return
174-
}
175-
t.Fatalf("error parsing args: %v", err)
176-
}
177-
178169
err = cmd.ValidateRequiredFlags()
179170
if err != nil {
180171
if !tt.isValid {
@@ -183,7 +174,7 @@ func TestParseInput(t *testing.T) {
183174
t.Fatalf("error validating flags: %v", err)
184175
}
185176

186-
model, err := parseInput(p, cmd, tt.argValues)
177+
model, err := parseInput(p, cmd, []string{})
187178
if err != nil {
188179
if !tt.isValid {
189180
return

0 commit comments

Comments
 (0)