Skip to content

Commit 891bffe

Browse files
committed
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 without specifying the new flag (default is agent-provisioned=false) - no change, same behavior as before ``` [~/stackit-cli] stackit -y --project-id c904f41c-2f8c-4edb-b966-e87d65f10b64 server create --name server1 --machine-type t1.1 --network-id 97c5dde4-cb9d-49b8-be55-9cdf0c3795e1 --boot-volume-source-type image --boot-volume-source-id 21466190-b904-4267-8bf3-1be4323f4ffb --boot-volume-size 20 --boot-volume-delete-on-termination=true ... Server ID: 71785201-d749-4449-99b2-6dc23f406133 [~/stackit-cli] stackit -y server command create --server-id=71785201-d749-4449-99b2-6dc23f406133 --project-id=c904f41c-2f8c-4edb-b966-e87d65f10b64 --template-name=RunShellScript --params script='echo hello' Error: create Server Command: 404 Not Found, status code 404, Body: {"status":"Not Found","message":"agent not found"} [~/stackit-cli] stackit -y --project-id c904f41c-2f8c-4edb-b966-e87d65f10b64 server delete 71785201-d749-4449-99b2-6dc23f406133 Deleting server ✓ Deleted server "server1" ``` * ran with specifying flag agent-provisioned=true - the server was created with a provisioned agent, it was possible to set commands ``` [~/stackit-cli] stackit -y --project-id c904f41c-2f8c-4edb-b966-e87d65f10b64 server create --name server1 --machine-type t1.1 --network-id 97c5dde4-cb9d-49b8-be55-9cdf0c3795e1 --boot-volume-source-type image --boot-volume-source-id 21466190-b904-4267-8bf3-1be4323f4ffb --boot-volume-size 20 --boot-volume-delete-on-termination=true --agent-provisioned=true ... Server ID: ed3086ff-a1ef-44ec-b2f7-08775611dc4e [~/stackit-cli] stackit -y server command create --server-id=ed3086ff-a1ef-44ec-b2f7-08775611dc4e --project-id=c904f41c-2f8c-4edb-b966-e87d65f10b64 --template-name=RunShellScript --params script='echo hello' Created server command for server server1. Command ID: 263667 [~/stackit-cli] stackit -y --project-id c904f41c-2f8c-4edb-b966-e87d65f10b64 server delete ed3086ff-a1ef-44ec-b2f7-08775611dc4e Deleting server ✓ Deleted server "server1" ``` Signed-off-by: Adrian Nackov <adrian.nackov@mail.schwarz>
1 parent c7dada1 commit 891bffe

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

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-provisioned=true
4245
```
4346

4447
### Options
4548

4649
```
4750
--affinity-group string The affinity group the server is assigned to
51+
--agent-provisioned Whether to provision an agent on server creation
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: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const (
2727
machineTypeFlag = "machine-type"
2828
affinityGroupFlag = "affinity-group"
2929
availabilityZoneFlag = "availability-zone"
30+
agentProvisionedFlag = "agent-provisioned"
3031
bootVolumeSourceIdFlag = "boot-volume-source-id"
3132
bootVolumeSourceTypeFlag = "boot-volume-source-type"
3233
bootVolumeSizeFlag = "boot-volume-size"
@@ -49,6 +50,7 @@ type inputModel struct {
4950
MachineType *string
5051
AffinityGroup *string
5152
AvailabilityZone *string
53+
AgentProvisioned *bool
5254
BootVolumeSourceId *string
5355
BootVolumeSourceType *string
5456
BootVolumeSize *int64
@@ -108,6 +110,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command {
108110
`Create a server with user data (cloud-init)`,
109111
`$ 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`,
110112
),
113+
examples.NewExample(
114+
`Create a server with provisioned agent`,
115+
`$ 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-provisioned=true`,
116+
),
111117
),
112118
RunE: func(cmd *cobra.Command, args []string) error {
113119
ctx := context.Background()
@@ -167,6 +173,7 @@ func configureFlags(cmd *cobra.Command) {
167173
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/")
168174
cmd.Flags().String(affinityGroupFlag, "", "The affinity group the server is assigned to")
169175
cmd.Flags().String(availabilityZoneFlag, "", "The availability zone of the server")
176+
cmd.Flags().Bool(agentProvisionedFlag, false, "Whether to provision an agent on server creation")
170177
cmd.Flags().String(bootVolumeSourceIdFlag, "", "ID of the source object of boot volume. It can be either an image or volume ID")
171178
cmd.Flags().String(bootVolumeSourceTypeFlag, "", "Type of the source object of boot volume. It can be either 'image' or 'volume'")
172179
cmd.Flags().Int64(bootVolumeSizeFlag, 0, "The size of the boot volume in GB. Must be provided when 'boot-volume-source-type' is 'image'")
@@ -251,6 +258,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel,
251258
MachineType: flags.FlagToStringPointer(p, cmd, machineTypeFlag),
252259
AffinityGroup: flags.FlagToStringPointer(p, cmd, affinityGroupFlag),
253260
AvailabilityZone: flags.FlagToStringPointer(p, cmd, availabilityZoneFlag),
261+
AgentProvisioned: flags.FlagToBoolPointer(p, cmd, agentProvisionedFlag),
254262
BootVolumeSourceId: flags.FlagToStringPointer(p, cmd, bootVolumeSourceIdFlag),
255263
BootVolumeSourceType: flags.FlagToStringPointer(p, cmd, bootVolumeSourceTypeFlag),
256264
BootVolumeSize: flags.FlagToInt64Pointer(p, cmd, bootVolumeSizeFlag),
@@ -294,6 +302,12 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli
294302
Labels: utils.ConvertStringMapToInterfaceMap(model.Labels),
295303
}
296304

305+
if model.AgentProvisioned != nil {
306+
payload.Agent = &iaas.ServerAgent{
307+
Provisioned: model.AgentProvisioned,
308+
}
309+
}
310+
297311
if model.BootVolumePerformanceClass != nil || model.BootVolumeSize != nil || model.BootVolumeDeleteOnTermination != nil || model.BootVolumeSourceId != nil || model.BootVolumeSourceType != nil {
298312
payload.BootVolume = &iaas.ServerBootVolume{
299313
PerformanceClass: model.BootVolumePerformanceClass,

internal/cmd/server/create/create_test.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st
3737
globalflags.ProjectIdFlag: testProjectId,
3838
globalflags.RegionFlag: testRegion,
3939

40+
agentProvisionedFlag: "false",
4041
availabilityZoneFlag: "eu01-1",
4142
nameFlag: "test-server-name",
4243
machineTypeFlag: "t1.1",
@@ -67,6 +68,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
6768
Region: testRegion,
6869
Verbosity: globalflags.VerbosityDefault,
6970
},
71+
AgentProvisioned: utils.Ptr(false),
7072
AvailabilityZone: utils.Ptr("eu01-1"),
7173
Name: utils.Ptr("test-server-name"),
7274
MachineType: utils.Ptr("t1.1"),
@@ -118,8 +120,11 @@ func fixturePayload(mods ...func(payload *iaas.CreateServerPayload)) iaas.Create
118120
Labels: utils.Ptr(map[string]interface{}{
119121
"key": "value",
120122
}),
121-
MachineType: utils.Ptr("t1.1"),
122-
Name: utils.Ptr("test-server-name"),
123+
MachineType: utils.Ptr("t1.1"),
124+
Name: utils.Ptr("test-server-name"),
125+
Agent: &iaas.ServerAgent{
126+
Provisioned: utils.Ptr(false),
127+
},
123128
AvailabilityZone: utils.Ptr("eu01-1"),
124129
AffinityGroup: utils.Ptr("test-affinity-group"),
125130
KeypairName: utils.Ptr("test-keypair-name"),
@@ -166,6 +171,7 @@ func TestParseInput(t *testing.T) {
166171
description: "required only",
167172
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
168173
delete(flagValues, affinityGroupFlag)
174+
delete(flagValues, agentProvisionedFlag)
169175
delete(flagValues, availabilityZoneFlag)
170176
delete(flagValues, labelFlag)
171177
delete(flagValues, bootVolumeSourceIdFlag)
@@ -184,6 +190,7 @@ func TestParseInput(t *testing.T) {
184190
isValid: true,
185191
expectedModel: fixtureInputModel(func(model *inputModel) {
186192
model.AffinityGroup = nil
193+
model.AgentProvisioned = nil
187194
model.AvailabilityZone = nil
188195
model.Labels = nil
189196
model.BootVolumeSourceId = nil
@@ -329,6 +336,16 @@ func TestParseInput(t *testing.T) {
329336
model.ImageId = nil
330337
}),
331338
},
339+
{
340+
description: "valid with agent-provisioned flag missing",
341+
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
342+
delete(flagValues, agentProvisionedFlag)
343+
}),
344+
isValid: true,
345+
expectedModel: fixtureInputModel(func(model *inputModel) {
346+
model.AgentProvisioned = nil
347+
}),
348+
},
332349
}
333350

334351
for _, tt := range tests {

0 commit comments

Comments
 (0)