Skip to content

Commit f663e9d

Browse files
authored
Onboard server machine-types command (#579)
Signed-off-by: Alexander Dahmen <[email protected]>
1 parent 0a0e07d commit f663e9d

File tree

11 files changed

+877
-3
lines changed

11 files changed

+877
-3
lines changed

docs/stackit_beta_server.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ stackit beta server [flags]
3939
* [stackit beta server describe](./stackit_beta_server_describe.md) - Shows details of a server
4040
* [stackit beta server list](./stackit_beta_server_list.md) - Lists all servers of a project
4141
* [stackit beta server log](./stackit_beta_server_log.md) - Gets server console log
42+
* [stackit beta server machine-type](./stackit_beta_server_machine-type.md) - Provides functionality for server machine types available inside a project
4243
* [stackit beta server network-interface](./stackit_beta_server_network-interface.md) - Allows attaching/detaching network interfaces to servers
4344
* [stackit beta server os-update](./stackit_beta_server_os-update.md) - Provides functionality for managed server updates
4445
* [stackit beta server public-ip](./stackit_beta_server_public-ip.md) - Allows attaching/detaching public IPs to servers
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
## stackit beta server machine-type
2+
3+
Provides functionality for server machine types available inside a project
4+
5+
### Synopsis
6+
7+
Provides functionality for server machine types available inside a project.
8+
9+
```
10+
stackit beta server machine-type [flags]
11+
```
12+
13+
### Options
14+
15+
```
16+
-h, --help Help for "stackit beta server machine-type"
17+
```
18+
19+
### Options inherited from parent commands
20+
21+
```
22+
-y, --assume-yes If set, skips all confirmation prompts
23+
--async If set, runs the command asynchronously
24+
-o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"]
25+
-p, --project-id string Project ID
26+
--region string Target region for region-specific requests
27+
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
28+
```
29+
30+
### SEE ALSO
31+
32+
* [stackit beta server](./stackit_beta_server.md) - Provides functionality for servers
33+
* [stackit beta server machine-type describe](./stackit_beta_server_machine-type_describe.md) - Shows details of a server machine type
34+
* [stackit beta server machine-type list](./stackit_beta_server_machine-type_list.md) - Get list of all machine types available in a project
35+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
## stackit beta server machine-type describe
2+
3+
Shows details of a server machine type
4+
5+
### Synopsis
6+
7+
Shows details of a server machine type.
8+
9+
```
10+
stackit beta server machine-type describe MACHINE_TYPE [flags]
11+
```
12+
13+
### Examples
14+
15+
```
16+
Show details of a server machine type with name "xxx"
17+
$ stackit beta server machine-type describe xxx
18+
19+
Show details of a server machine type with name "xxx" in JSON format
20+
$ stackit beta server machine-type describe xxx --output-format json
21+
```
22+
23+
### Options
24+
25+
```
26+
-h, --help Help for "stackit beta server machine-type describe"
27+
```
28+
29+
### Options inherited from parent commands
30+
31+
```
32+
-y, --assume-yes If set, skips all confirmation prompts
33+
--async If set, runs the command asynchronously
34+
-o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"]
35+
-p, --project-id string Project ID
36+
--region string Target region for region-specific requests
37+
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
38+
```
39+
40+
### SEE ALSO
41+
42+
* [stackit beta server machine-type](./stackit_beta_server_machine-type.md) - Provides functionality for server machine types available inside a project
43+
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
## stackit beta server machine-type list
2+
3+
Get list of all machine types available in a project
4+
5+
### Synopsis
6+
7+
Get list of all machine types available in a project.
8+
9+
```
10+
stackit beta server machine-type list [flags]
11+
```
12+
13+
### Examples
14+
15+
```
16+
Get list of all machine types
17+
$ stackit beta server machine-type list
18+
19+
Get list of all machine types in JSON format
20+
$ stackit beta server machine-type list --output-format json
21+
22+
List the first 10 machine types
23+
$ stackit beta server machine-type list --limit=10
24+
```
25+
26+
### Options
27+
28+
```
29+
-h, --help Help for "stackit beta server machine-type list"
30+
--limit int Limit the output to the first n elements
31+
```
32+
33+
### Options inherited from parent commands
34+
35+
```
36+
-y, --assume-yes If set, skips all confirmation prompts
37+
--async If set, runs the command asynchronously
38+
-o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"]
39+
-p, --project-id string Project ID
40+
--region string Target region for region-specific requests
41+
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
42+
```
43+
44+
### SEE ALSO
45+
46+
* [stackit beta server machine-type](./stackit_beta_server_machine-type.md) - Provides functionality for server machine types available inside a project
47+
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package describe
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
8+
"github.com/goccy/go-yaml"
9+
10+
"github.com/stackitcloud/stackit-cli/internal/pkg/args"
11+
"github.com/stackitcloud/stackit-cli/internal/pkg/errors"
12+
"github.com/stackitcloud/stackit-cli/internal/pkg/examples"
13+
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
14+
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
15+
"github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client"
16+
"github.com/stackitcloud/stackit-cli/internal/pkg/tables"
17+
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
18+
"github.com/stackitcloud/stackit-sdk-go/services/iaas"
19+
20+
"github.com/spf13/cobra"
21+
)
22+
23+
const (
24+
machineTypeArg = "MACHINE_TYPE"
25+
)
26+
27+
type inputModel struct {
28+
*globalflags.GlobalFlagModel
29+
MachineType string
30+
}
31+
32+
func NewCmd(p *print.Printer) *cobra.Command {
33+
cmd := &cobra.Command{
34+
Use: fmt.Sprintf("describe %s", machineTypeArg),
35+
Short: "Shows details of a server machine type",
36+
Long: "Shows details of a server machine type.",
37+
Args: args.SingleArg(machineTypeArg, nil),
38+
Example: examples.Build(
39+
examples.NewExample(
40+
`Show details of a server machine type with name "xxx"`,
41+
"$ stackit beta server machine-type describe xxx",
42+
),
43+
examples.NewExample(
44+
`Show details of a server machine type with name "xxx" in JSON format`,
45+
"$ stackit beta server machine-type describe xxx --output-format json",
46+
),
47+
),
48+
RunE: func(cmd *cobra.Command, args []string) error {
49+
ctx := context.Background()
50+
model, err := parseInput(p, cmd, args)
51+
if err != nil {
52+
return err
53+
}
54+
55+
// Configure API client
56+
apiClient, err := client.ConfigureClient(p)
57+
if err != nil {
58+
return err
59+
}
60+
61+
// Call API
62+
req := buildRequest(ctx, model, apiClient)
63+
resp, err := req.Execute()
64+
if err != nil {
65+
return fmt.Errorf("read server machine type: %w", err)
66+
}
67+
68+
return outputResult(p, model.OutputFormat, resp)
69+
},
70+
}
71+
return cmd
72+
}
73+
74+
func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) {
75+
machineType := inputArgs[0]
76+
77+
globalFlags := globalflags.Parse(p, cmd)
78+
if globalFlags.ProjectId == "" {
79+
return nil, &errors.ProjectIdError{}
80+
}
81+
82+
model := inputModel{
83+
GlobalFlagModel: globalFlags,
84+
MachineType: machineType,
85+
}
86+
87+
if p.IsVerbosityDebug() {
88+
modelStr, err := print.BuildDebugStrFromInputModel(model)
89+
if err != nil {
90+
p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err)
91+
} else {
92+
p.Debug(print.DebugLevel, "parsed input values: %s", modelStr)
93+
}
94+
}
95+
96+
return &model, nil
97+
}
98+
99+
func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetMachineTypeRequest {
100+
return apiClient.GetMachineType(ctx, model.ProjectId, model.MachineType)
101+
}
102+
103+
func outputResult(p *print.Printer, outputFormat string, machineType *iaas.MachineType) error {
104+
switch outputFormat {
105+
case print.JSONOutputFormat:
106+
details, err := json.MarshalIndent(machineType, "", " ")
107+
if err != nil {
108+
return fmt.Errorf("marshal server machine type: %w", err)
109+
}
110+
p.Outputln(string(details))
111+
112+
return nil
113+
case print.YAMLOutputFormat:
114+
details, err := yaml.MarshalWithOptions(machineType, yaml.IndentSequence(true))
115+
if err != nil {
116+
return fmt.Errorf("marshal server machine type: %w", err)
117+
}
118+
p.Outputln(string(details))
119+
120+
return nil
121+
default:
122+
table := tables.NewTable()
123+
table.AddRow("NAME", utils.PtrString(machineType.Name))
124+
table.AddSeparator()
125+
table.AddRow("VCPUS", utils.PtrString(machineType.Vcpus))
126+
table.AddSeparator()
127+
table.AddRow("RAM (in MB)", utils.PtrString(machineType.Ram))
128+
table.AddSeparator()
129+
table.AddRow("DISK SIZE (in GB)", utils.PtrString(machineType.Disk))
130+
table.AddSeparator()
131+
table.AddRow("DESCRIPTION", utils.PtrString(machineType.Description))
132+
table.AddSeparator()
133+
134+
err := table.Display(p)
135+
if err != nil {
136+
return fmt.Errorf("render table: %w", err)
137+
}
138+
return nil
139+
}
140+
}

0 commit comments

Comments
 (0)