Skip to content

Commit a3718bb

Browse files
authored
Add sqlserverflex database create/delete commands (#387)
* Implement database create command * Implement database delete command * Fix typo
1 parent 17cc524 commit a3718bb

File tree

12 files changed

+932
-2
lines changed

12 files changed

+932
-2
lines changed

docs/stackit_beta_sqlserverflex.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ stackit beta sqlserverflex [flags]
2929
### SEE ALSO
3030

3131
* [stackit beta](./stackit_beta.md) - Contains beta STACKIT CLI commands
32+
* [stackit beta sqlserverflex database](./stackit_beta_sqlserverflex_database.md) - Provides functionality for SQLServer Flex databases
3233
* [stackit beta sqlserverflex instance](./stackit_beta_sqlserverflex_instance.md) - Provides functionality for SQLServer Flex instances
3334
* [stackit beta sqlserverflex options](./stackit_beta_sqlserverflex_options.md) - Lists SQL Server Flex options
3435
* [stackit beta sqlserverflex user](./stackit_beta_sqlserverflex_user.md) - Provides functionality for SQLServer Flex users
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
## stackit beta sqlserverflex database
2+
3+
Provides functionality for SQLServer Flex databases
4+
5+
### Synopsis
6+
7+
Provides functionality for SQLServer Flex databases.
8+
9+
```
10+
stackit beta sqlserverflex database [flags]
11+
```
12+
13+
### Options
14+
15+
```
16+
-h, --help Help for "stackit beta sqlserverflex database"
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+
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
27+
```
28+
29+
### SEE ALSO
30+
31+
* [stackit beta sqlserverflex](./stackit_beta_sqlserverflex.md) - Provides functionality for SQLServer Flex
32+
* [stackit beta sqlserverflex database create](./stackit_beta_sqlserverflex_database_create.md) - Creates a SQLServer Flex database
33+
* [stackit beta sqlserverflex database delete](./stackit_beta_sqlserverflex_database_delete.md) - Deletes a SQLServer Flex database
34+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
## stackit beta sqlserverflex database create
2+
3+
Creates a SQLServer Flex database
4+
5+
### Synopsis
6+
7+
Creates a SQLServer Flex database.
8+
This operation cannot be triggered asynchronously (the "--async" flag will have no effect).
9+
10+
```
11+
stackit beta sqlserverflex database create DATABASE_NAME [flags]
12+
```
13+
14+
### Examples
15+
16+
```
17+
Create a SQLServer Flex database with name "my-database" on instance with ID "xxx"
18+
$ stackit beta sqlserverflex database create my-database --instance-id xxx --owner some-username
19+
```
20+
21+
### Options
22+
23+
```
24+
-h, --help Help for "stackit beta sqlserverflex database create"
25+
--instance-id string SQLServer Flex instance ID
26+
--owner string Username of the owner user
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+
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
37+
```
38+
39+
### SEE ALSO
40+
41+
* [stackit beta sqlserverflex database](./stackit_beta_sqlserverflex_database.md) - Provides functionality for SQLServer Flex databases
42+
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
## stackit beta sqlserverflex database delete
2+
3+
Deletes a SQLServer Flex database
4+
5+
### Synopsis
6+
7+
Deletes a SQLServer Flex database.
8+
This operation cannot be triggered asynchronously (the "--async" flag will have no effect).
9+
10+
```
11+
stackit beta sqlserverflex database delete DATABASE_NAME [flags]
12+
```
13+
14+
### Examples
15+
16+
```
17+
Delete a SQLServer Flex database with name "my-database" of instance with ID "xxx"
18+
$ stackit beta sqlserverflex database delete my-database --instance-id xxx
19+
```
20+
21+
### Options
22+
23+
```
24+
-h, --help Help for "stackit beta sqlserverflex database delete"
25+
--instance-id string SQLServer Flex instance ID
26+
```
27+
28+
### Options inherited from parent commands
29+
30+
```
31+
-y, --assume-yes If set, skips all confirmation prompts
32+
--async If set, runs the command asynchronously
33+
-o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"]
34+
-p, --project-id string Project ID
35+
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
36+
```
37+
38+
### SEE ALSO
39+
40+
* [stackit beta sqlserverflex database](./stackit_beta_sqlserverflex_database.md) - Provides functionality for SQLServer Flex databases
41+
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
package create
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
8+
"github.com/goccy/go-yaml"
9+
"github.com/stackitcloud/stackit-cli/internal/pkg/args"
10+
"github.com/stackitcloud/stackit-cli/internal/pkg/errors"
11+
"github.com/stackitcloud/stackit-cli/internal/pkg/examples"
12+
"github.com/stackitcloud/stackit-cli/internal/pkg/flags"
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/sqlserverflex/client"
16+
"github.com/stackitcloud/stackit-cli/internal/pkg/spinner"
17+
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
18+
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex"
19+
20+
"github.com/spf13/cobra"
21+
)
22+
23+
const (
24+
databaseNameArg = "DATABASE_NAME"
25+
26+
instanceIdFlag = "instance-id"
27+
ownerFlag = "owner"
28+
)
29+
30+
type inputModel struct {
31+
*globalflags.GlobalFlagModel
32+
DatabaseName string
33+
InstanceId string
34+
Owner string
35+
}
36+
37+
func NewCmd(p *print.Printer) *cobra.Command {
38+
cmd := &cobra.Command{
39+
Use: fmt.Sprintf("create %s", databaseNameArg),
40+
Short: "Creates a SQLServer Flex database",
41+
Long: fmt.Sprintf("%s\n%s",
42+
"Creates a SQLServer Flex database.",
43+
`This operation cannot be triggered asynchronously (the "--async" flag will have no effect).`,
44+
),
45+
Args: args.SingleArg(databaseNameArg, nil),
46+
Example: examples.Build(
47+
examples.NewExample(
48+
`Create a SQLServer Flex database with name "my-database" on instance with ID "xxx"`,
49+
"$ stackit beta sqlserverflex database create my-database --instance-id xxx --owner some-username"),
50+
),
51+
RunE: func(cmd *cobra.Command, args []string) error {
52+
ctx := context.Background()
53+
model, err := parseInput(p, cmd, args)
54+
if err != nil {
55+
return err
56+
}
57+
58+
// Configure API client
59+
apiClient, err := client.ConfigureClient(p)
60+
if err != nil {
61+
return err
62+
}
63+
64+
if !model.AssumeYes {
65+
prompt := fmt.Sprintf("Are you sure you want to create database %q? (This cannot be undone)", model.DatabaseName)
66+
err = p.PromptForConfirmation(prompt)
67+
if err != nil {
68+
return err
69+
}
70+
}
71+
72+
// Call API
73+
req := buildRequest(ctx, model, apiClient)
74+
s := spinner.New(p)
75+
s.Start("Creating database")
76+
resp, err := req.Execute()
77+
if err != nil {
78+
s.StopWithError()
79+
return fmt.Errorf("create SQLServer Flex database: %w", err)
80+
}
81+
s.Stop()
82+
83+
return outputResult(p, model, resp)
84+
},
85+
}
86+
configureFlags(cmd)
87+
return cmd
88+
}
89+
90+
func configureFlags(cmd *cobra.Command) {
91+
cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "SQLServer Flex instance ID")
92+
cmd.Flags().String(ownerFlag, "", "Username of the owner user")
93+
err := flags.MarkFlagsRequired(cmd, instanceIdFlag, ownerFlag)
94+
cobra.CheckErr(err)
95+
}
96+
97+
func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) {
98+
databaseName := inputArgs[0]
99+
100+
globalFlags := globalflags.Parse(p, cmd)
101+
if globalFlags.ProjectId == "" {
102+
return nil, &errors.ProjectIdError{}
103+
}
104+
105+
model := inputModel{
106+
GlobalFlagModel: globalFlags,
107+
DatabaseName: databaseName,
108+
InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag),
109+
Owner: flags.FlagToStringValue(p, cmd, ownerFlag),
110+
}
111+
112+
if p.IsVerbosityDebug() {
113+
modelStr, err := print.BuildDebugStrFromInputModel(model)
114+
if err != nil {
115+
p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err)
116+
} else {
117+
p.Debug(print.DebugLevel, "parsed input values: %s", modelStr)
118+
}
119+
}
120+
121+
return &model, nil
122+
}
123+
124+
func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiCreateDatabaseRequest {
125+
req := apiClient.CreateDatabase(ctx, model.ProjectId, model.InstanceId)
126+
payload := sqlserverflex.CreateDatabasePayload{
127+
Name: &model.DatabaseName,
128+
Options: utils.Ptr(map[string]string{
129+
"owner": model.Owner,
130+
}),
131+
}
132+
req = req.CreateDatabasePayload(payload)
133+
return req
134+
}
135+
136+
func outputResult(p *print.Printer, model *inputModel, resp *sqlserverflex.CreateDatabaseResponse) error {
137+
switch model.OutputFormat {
138+
case print.JSONOutputFormat:
139+
details, err := json.MarshalIndent(resp, "", " ")
140+
if err != nil {
141+
return fmt.Errorf("marshal SQLServer Flex database: %w", err)
142+
}
143+
p.Outputln(string(details))
144+
145+
return nil
146+
case print.YAMLOutputFormat:
147+
details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true))
148+
if err != nil {
149+
return fmt.Errorf("marshal SQLServer Flex database: %w", err)
150+
}
151+
p.Outputln(string(details))
152+
153+
return nil
154+
default:
155+
p.Outputf("Created database %q\n", model.DatabaseName)
156+
return nil
157+
}
158+
}

0 commit comments

Comments
 (0)