Skip to content

Commit 00f5f0e

Browse files
Adrian Nackovaeter
authored andcommitted
STACKITRCO-186 - Add flag: iaas API param agent
Adds a cli flag for the iaas ( _create server_ ) API param: `"agent": {"provisioned": true}` ref STACKITRCO-186 --- Tests: * ran `make fmt`, `make generate-docs` * unit tests ``` [~/stackit-cli] go test internal/cmd/server/create/* ok command-line-arguments 0.006s [~/stackit-cli] [~/stackit-cli] make test >> Running tests for the CLI application ... ok github.com/stackitcloud/stackit-cli/internal/cmd/server/create 0.006s coverage: 69.7% of statements ... ``` * ran stackit-cli with and without specifying the new flag, all seemed OK. Signed-off-by: Adrian Nackov <adrian.nackov@digits.schwarz>
1 parent 397c805 commit 00f5f0e

7 files changed

Lines changed: 83 additions & 1 deletion

File tree

docs/stackit_server_create.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,16 @@ stackit server create [flags]
3939
4040
Create a server with user data (cloud-init)
4141
$ stackit server create --machine-type t1.1 --name server1 --boot-volume-source-id xxx --boot-volume-source-type image --boot-volume-size 64 --user-data @path/to/file.yaml
42+
43+
Create a server with provisioned agent
44+
$ stackit server create --machine-type t1.1 --name server1 --boot-volume-source-id xxx --boot-volume-source-type image --boot-volume-size 64 --network-id yyy --agent-provisioning-policy=ALWAYS
4245
```
4346

4447
### Options
4548

4649
```
4750
--affinity-group string The affinity group the server is assigned to
51+
--agent-provisioning-policy string Whether to provision an agent on server creation, one of ["ALWAYS" "NEVER" "INHERIT"] (default "INHERIT")
4852
--availability-zone string The availability zone of the server
4953
--boot-volume-delete-on-termination Delete the volume during the termination of the server. Defaults to false
5054
--boot-volume-performance-class string Boot volume performance class

internal/cmd/server/create/create.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const (
2828
machineTypeFlag = "machine-type"
2929
affinityGroupFlag = "affinity-group"
3030
availabilityZoneFlag = "availability-zone"
31+
agentProvisioningPolicyFlag = "agent-provisioning-policy"
3132
bootVolumeSourceIdFlag = "boot-volume-source-id"
3233
bootVolumeSourceTypeFlag = "boot-volume-source-type"
3334
bootVolumeSizeFlag = "boot-volume-size"
@@ -50,6 +51,7 @@ type inputModel struct {
5051
MachineType *string
5152
AffinityGroup *string
5253
AvailabilityZone *string
54+
AgentProvisioningPolicy *string
5355
BootVolumeSourceId *string
5456
BootVolumeSourceType *string
5557
BootVolumeSize *int64
@@ -109,6 +111,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command {
109111
`Create a server with user data (cloud-init)`,
110112
`$ stackit server create --machine-type t1.1 --name server1 --boot-volume-source-id xxx --boot-volume-source-type image --boot-volume-size 64 --user-data @path/to/file.yaml`,
111113
),
114+
examples.NewExample(
115+
`Create a server with provisioned agent`,
116+
`$ stackit server create --machine-type t1.1 --name server1 --boot-volume-source-id xxx --boot-volume-source-type image --boot-volume-size 64 --network-id yyy --agent-provisioning-policy=ALWAYS`,
117+
),
112118
),
113119
RunE: func(cmd *cobra.Command, args []string) error {
114120
ctx := context.Background()
@@ -162,6 +168,8 @@ func NewCmd(params *types.CmdParams) *cobra.Command {
162168
}
163169

164170
func configureFlags(cmd *cobra.Command) {
171+
agentProvisioningPolicyOptions := []string{"ALWAYS", "NEVER", "INHERIT"}
172+
cmd.Flags().Var(flags.EnumFlag(false, "INHERIT", agentProvisioningPolicyOptions...), agentProvisioningPolicyFlag, fmt.Sprintf("Whether to provision an agent on server creation, one of %q", agentProvisioningPolicyOptions))
165173
cmd.Flags().StringP(nameFlag, "n", "", "Server name")
166174
cmd.Flags().String(machineTypeFlag, "", "Name of the type of the machine for the server. Possible values are documented in https://docs.stackit.cloud/products/compute-engine/server/basics/machine-types/")
167175
cmd.Flags().String(affinityGroupFlag, "", "The affinity group the server is assigned to")
@@ -250,6 +258,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel,
250258
MachineType: flags.FlagToStringPointer(p, cmd, machineTypeFlag),
251259
AffinityGroup: flags.FlagToStringPointer(p, cmd, affinityGroupFlag),
252260
AvailabilityZone: flags.FlagToStringPointer(p, cmd, availabilityZoneFlag),
261+
AgentProvisioningPolicy: flags.FlagToStringPointer(p, cmd, agentProvisioningPolicyFlag),
253262
BootVolumeSourceId: flags.FlagToStringPointer(p, cmd, bootVolumeSourceIdFlag),
254263
BootVolumeSourceType: flags.FlagToStringPointer(p, cmd, bootVolumeSourceTypeFlag),
255264
BootVolumeSize: flags.FlagToInt64Pointer(p, cmd, bootVolumeSizeFlag),
@@ -293,6 +302,17 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli
293302
Labels: utils.ConvertStringMapToInterfaceMap(model.Labels),
294303
}
295304

305+
if model.AgentProvisioningPolicy != nil {
306+
var provision bool
307+
if *model.AgentProvisioningPolicy == "ALWAYS" {
308+
provision = true
309+
payload.Agent = &iaas.ServerAgent{Provisioned: &provision}
310+
} else if *model.AgentProvisioningPolicy == "NEVER" {
311+
provision = false
312+
payload.Agent = &iaas.ServerAgent{Provisioned: &provision}
313+
}
314+
}
315+
296316
if model.BootVolumePerformanceClass != nil || model.BootVolumeSize != nil || model.BootVolumeDeleteOnTermination != nil || model.BootVolumeSourceId != nil || model.BootVolumeSourceType != nil {
297317
payload.BootVolume = &iaas.ServerBootVolume{
298318
PerformanceClass: model.BootVolumePerformanceClass,

internal/cmd/server/create/create_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st
3535
globalflags.ProjectIdFlag: testProjectId,
3636
globalflags.RegionFlag: testRegion,
3737

38+
agentProvisioningPolicyFlag: "INHERIT",
3839
availabilityZoneFlag: "eu01-1",
3940
nameFlag: "test-server-name",
4041
machineTypeFlag: "t1.1",
@@ -65,6 +66,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
6566
Region: testRegion,
6667
Verbosity: globalflags.VerbosityDefault,
6768
},
69+
AgentProvisioningPolicy: utils.Ptr("INHERIT"),
6870
AvailabilityZone: utils.Ptr("eu01-1"),
6971
Name: utils.Ptr("test-server-name"),
7072
MachineType: utils.Ptr("t1.1"),
@@ -164,6 +166,7 @@ func TestParseInput(t *testing.T) {
164166
description: "required only",
165167
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
166168
delete(flagValues, affinityGroupFlag)
169+
delete(flagValues, agentProvisioningPolicyFlag)
167170
delete(flagValues, availabilityZoneFlag)
168171
delete(flagValues, labelFlag)
169172
delete(flagValues, bootVolumeSourceIdFlag)
@@ -182,6 +185,7 @@ func TestParseInput(t *testing.T) {
182185
isValid: true,
183186
expectedModel: fixtureInputModel(func(model *inputModel) {
184187
model.AffinityGroup = nil
188+
model.AgentProvisioningPolicy = nil
185189
model.AvailabilityZone = nil
186190
model.Labels = nil
187191
model.BootVolumeSourceId = nil
@@ -327,6 +331,26 @@ func TestParseInput(t *testing.T) {
327331
model.ImageId = nil
328332
}),
329333
},
334+
{
335+
description: "valid with agent-provisioned flag missing",
336+
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
337+
delete(flagValues, agentProvisioningPolicyFlag)
338+
}),
339+
isValid: true,
340+
expectedModel: fixtureInputModel(func(model *inputModel) {
341+
model.AgentProvisioningPolicy = nil
342+
}),
343+
},
344+
{
345+
description: "agent-provisioned flag properly handled",
346+
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
347+
flagValues[agentProvisioningPolicyFlag] = "ALWAYS"
348+
}),
349+
isValid: true,
350+
expectedModel: fixtureInputModel(func(model *inputModel) {
351+
model.AgentProvisioningPolicy = utils.Ptr("ALWAYS")
352+
}),
353+
},
330354
}
331355

332356
for _, tt := range tests {

internal/cmd/server/describe/describe.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ func outputResult(p *print.Printer, outputFormat string, server *iaas.Server) er
161161
table.AddSeparator()
162162
}
163163

164+
if server.Agent != nil && server.Agent.Provisioned != nil {
165+
table.AddRow("AGENT", *server.Agent.Provisioned)
166+
table.AddSeparator()
167+
}
168+
164169
if server.MachineType != nil {
165170
table.AddRow("MACHINE TYPE", *server.MachineType)
166171
table.AddSeparator()

internal/cmd/server/list/list.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func outputResult(p *print.Printer, outputFormat string, servers []iaas.Server)
165165
return nil
166166
default:
167167
table := tables.NewTable()
168-
table.SetHeader("ID", "Name", "Status", "Machine Type", "Availability Zones", "Nic IPv4", "Public IPs")
168+
table.SetHeader("ID", "Name", "Status", "Machine Type", "Availability Zones", "Nic IPv4", "Public IPs", "Agent")
169169

170170
for i := range servers {
171171
server := servers[i]
@@ -186,6 +186,11 @@ func outputResult(p *print.Printer, outputFormat string, servers []iaas.Server)
186186
}
187187
}
188188

189+
agent := ""
190+
if server.Agent != nil {
191+
agent = utils.PtrString(server.Agent.Provisioned)
192+
}
193+
189194
table.AddRow(
190195
utils.PtrString(server.Id),
191196
utils.PtrString(server.Name),
@@ -194,6 +199,7 @@ func outputResult(p *print.Printer, outputFormat string, servers []iaas.Server)
194199
utils.PtrString(server.AvailabilityZone),
195200
nicIPv4,
196201
publicIPs,
202+
agent,
197203
)
198204
}
199205

internal/pkg/utils/utils.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ type Base64PatchedServer struct {
192192
UpdatedAt *time.Time `json:"updatedAt,omitempty"`
193193
UserData *Base64Bytes `json:"userData,omitempty"`
194194
Volumes *[]string `json:"volumes,omitempty"`
195+
Agent *iaas.ServerAgent `json:"agent,omitempty"`
195196
}
196197

197198
// ConvertToBase64PatchedServer converts an iaas.Server to Base64PatchedServer
@@ -232,6 +233,7 @@ func ConvertToBase64PatchedServer(server *iaas.Server) *Base64PatchedServer {
232233
UpdatedAt: server.UpdatedAt,
233234
UserData: userData,
234235
Volumes: server.Volumes,
236+
Agent: server.Agent,
235237
}
236238
}
237239

internal/pkg/utils/utils_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,27 @@ func TestConvertToBase64PatchedServer(t *testing.T) {
334334
UserData: nil,
335335
},
336336
},
337+
{
338+
name: "server with agent",
339+
input: &iaas.Server{
340+
Id: Ptr("server-456"),
341+
Name: Ptr("test-server-2"),
342+
Status: Ptr("STOPPED"),
343+
AvailabilityZone: Ptr("eu01-2"),
344+
MachineType: Ptr("t1.2"),
345+
UserData: &emptyUserData,
346+
Agent: &iaas.ServerAgent{Provisioned: Ptr(true)},
347+
},
348+
expected: &Base64PatchedServer{
349+
Id: Ptr("server-456"),
350+
Name: Ptr("test-server-2"),
351+
Status: Ptr("STOPPED"),
352+
AvailabilityZone: Ptr("eu01-2"),
353+
MachineType: Ptr("t1.2"),
354+
UserData: Ptr(Base64Bytes(emptyUserData)),
355+
Agent: Ptr(iaas.ServerAgent{Provisioned: Ptr(true)}),
356+
},
357+
},
337358
}
338359

339360
for _, tt := range tests {

0 commit comments

Comments
 (0)