Skip to content

Commit 26e6b05

Browse files
authored
Implement sqlserverflex database list/describe commands (#409)
* Update to latest sqlserverflex version and fix breaking changes * Implement database list/describe commands * Improve user create description * Improve error message in database list command
1 parent dc0da3a commit 26e6b05

17 files changed

+917
-32
lines changed

docs/stackit_beta_sqlserverflex_database.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,6 @@ stackit beta sqlserverflex database [flags]
3131
* [stackit beta sqlserverflex](./stackit_beta_sqlserverflex.md) - Provides functionality for SQLServer Flex
3232
* [stackit beta sqlserverflex database create](./stackit_beta_sqlserverflex_database_create.md) - Creates a SQLServer Flex database
3333
* [stackit beta sqlserverflex database delete](./stackit_beta_sqlserverflex_database_delete.md) - Deletes a SQLServer Flex database
34+
* [stackit beta sqlserverflex database describe](./stackit_beta_sqlserverflex_database_describe.md) - Shows details of an SQLServer Flex database
35+
* [stackit beta sqlserverflex database list](./stackit_beta_sqlserverflex_database_list.md) - Lists all SQLServer Flex databases
3436

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
## stackit beta sqlserverflex database describe
2+
3+
Shows details of an SQLServer Flex database
4+
5+
### Synopsis
6+
7+
Shows details of an SQLServer Flex database.
8+
9+
```
10+
stackit beta sqlserverflex database describe DATABASE_NAME [flags]
11+
```
12+
13+
### Examples
14+
15+
```
16+
Get details of an SQLServer Flex database with name "my-database" of instance with ID "xxx"
17+
$ stackit beta sqlserverflex database describe my-database --instance-id xxx
18+
19+
Get details of an SQLServer Flex database with name "my-database" of instance with ID "xxx" in JSON format
20+
$ stackit beta sqlserverflex database describe my-database --instance-id xxx --output-format json
21+
```
22+
23+
### Options
24+
25+
```
26+
-h, --help Help for "stackit beta sqlserverflex database describe"
27+
--instance-id string SQLServer Flex instance ID
28+
```
29+
30+
### Options inherited from parent commands
31+
32+
```
33+
-y, --assume-yes If set, skips all confirmation prompts
34+
--async If set, runs the command asynchronously
35+
-o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"]
36+
-p, --project-id string Project ID
37+
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
38+
```
39+
40+
### SEE ALSO
41+
42+
* [stackit beta sqlserverflex database](./stackit_beta_sqlserverflex_database.md) - Provides functionality for SQLServer Flex databases
43+
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
## stackit beta sqlserverflex database list
2+
3+
Lists all SQLServer Flex databases
4+
5+
### Synopsis
6+
7+
Lists all SQLServer Flex databases.
8+
9+
```
10+
stackit beta sqlserverflex database list [flags]
11+
```
12+
13+
### Examples
14+
15+
```
16+
List all SQLServer Flex databases of instance with ID "xxx"
17+
$ stackit beta sqlserverflex database list --instance-id xxx
18+
19+
List all SQLServer Flex databases of instance with ID "xxx" in JSON format
20+
$ stackit beta sqlserverflex database list --instance-id xxx --output-format json
21+
22+
List up to 10 SQLServer Flex databases of instance with ID "xxx"
23+
$ stackit beta sqlserverflex database list --instance-id xxx --limit 10
24+
```
25+
26+
### Options
27+
28+
```
29+
-h, --help Help for "stackit beta sqlserverflex database list"
30+
--instance-id string SQLServer Flex instance ID
31+
--limit int Maximum number of entries to list
32+
```
33+
34+
### Options inherited from parent commands
35+
36+
```
37+
-y, --assume-yes If set, skips all confirmation prompts
38+
--async If set, runs the command asynchronously
39+
-o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"]
40+
-p, --project-id string Project ID
41+
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
42+
```
43+
44+
### SEE ALSO
45+
46+
* [stackit beta sqlserverflex database](./stackit_beta_sqlserverflex_database.md) - Provides functionality for SQLServer Flex databases
47+

docs/stackit_beta_sqlserverflex_user_create.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@ Creates a SQLServer Flex user
55
### Synopsis
66

77
Creates a SQLServer Flex user for an instance.
8+
89
The password is only visible upon creation and cannot be retrieved later.
910
Alternatively, you can reset the password and access the new one by running:
1011
$ stackit beta sqlserverflex user reset-password USER_ID --instance-id INSTANCE_ID
1112
Please refer to https://docs.stackit.cloud/stackit/en/creating-logins-and-users-in-sqlserver-flex-instances-210862358.html for additional information.
1213

14+
The allowed user roles for your instance can be obtained by running:
15+
$ stackit beta sqlserverflex options --user-roles --instance-id INSTANCE_ID
16+
1317
```
1418
stackit beta sqlserverflex user create [flags]
1519
```
@@ -18,10 +22,10 @@ stackit beta sqlserverflex user create [flags]
1822

1923
```
2024
Create a SQLServer Flex user for instance with ID "xxx" and specify the username, role and database
21-
$ stackit beta sqlserverflex user create --instance-id xxx --username johndoe --roles my-role --database my-database
25+
$ stackit beta sqlserverflex user create --instance-id xxx --username johndoe --roles "##STACKIT_DatabaseManager##" --database my-database
2226
2327
Create a SQLServer Flex user for instance with ID "xxx", specifying multiple roles
24-
$ stackit beta sqlserverflex user create --instance-id xxx --username johndoe --roles "my-role-1,my-role-2"
28+
$ stackit beta sqlserverflex user create --instance-id xxx --username johndoe --roles "##STACKIT_LoginManager##,##STACKIT_DatabaseManager##"
2529
```
2630

2731
### Options

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ require (
2626
github.com/stackitcloud/stackit-sdk-go/services/serverbackup v0.1.0
2727
github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.4.0
2828
github.com/stackitcloud/stackit-sdk-go/services/ske v0.17.0
29-
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.2.0
29+
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.3.0
3030
github.com/zalando/go-keyring v0.2.5
3131
golang.org/x/mod v0.19.0
3232
golang.org/x/oauth2 v0.21.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.4.0 h1:JB1O0E9
159159
github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.4.0/go.mod h1:Ni9RBJvcaXRIrDIuQBpJcuQvCQSj27crQSyc+WM4p0c=
160160
github.com/stackitcloud/stackit-sdk-go/services/ske v0.17.0 h1:4S3MwNmpMfjzBz9JtKbXvkos7j+7hGeFMf7XsjMLL/g=
161161
github.com/stackitcloud/stackit-sdk-go/services/ske v0.17.0/go.mod h1:0fFs4R7kg+gU7FNAIzzFvlCZJz6gyZ8CFhbK3eSrAwQ=
162-
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.2.0 h1:aIXxXx6u4+6C02MPb+hdItigeKeen7m+hEEG+Ej9sNs=
163-
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.2.0/go.mod h1:fQJOQMfasStZ8J9iGX0vTjyJoQtLqMXJ5Npb03QJk84=
162+
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.3.0 h1:M6tcXUMNM6XMfHVQeQzB6IjfPdAxnZar3YD+YstRStc=
163+
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.3.0/go.mod h1:Qnn+06i21XtagtMQ4cTwOCR3OLnXX+t1n+Vf/HH49Yw=
164164
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
165165
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
166166
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=

internal/cmd/beta/sqlserverflex/database/create/create.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
1515
"github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client"
1616
"github.com/stackitcloud/stackit-cli/internal/pkg/spinner"
17-
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
1817
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex"
1918

2019
"github.com/spf13/cobra"
@@ -125,9 +124,9 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverfl
125124
req := apiClient.CreateDatabase(ctx, model.ProjectId, model.InstanceId)
126125
payload := sqlserverflex.CreateDatabasePayload{
127126
Name: &model.DatabaseName,
128-
Options: utils.Ptr(map[string]string{
129-
"owner": model.Owner,
130-
}),
127+
Options: &sqlserverflex.DatabaseDocumentationCreateDatabaseRequestOptions{
128+
Owner: &model.Owner,
129+
},
131130
}
132131
req = req.CreateDatabasePayload(payload)
133132
return req

internal/cmd/beta/sqlserverflex/database/create/create_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66

77
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
88
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
9-
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
109
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex"
1110

1211
"github.com/google/go-cmp/cmp"
@@ -67,9 +66,9 @@ func fixtureRequest(mods ...func(request *sqlserverflex.ApiCreateDatabaseRequest
6766
request := testClient.CreateDatabase(testCtx, testProjectId, testInstanceId)
6867
payload := sqlserverflex.CreateDatabasePayload{
6968
Name: &testDatabaseName,
70-
Options: utils.Ptr(map[string]string{
71-
"owner": testOwner,
72-
}),
69+
Options: &sqlserverflex.DatabaseDocumentationCreateDatabaseRequestOptions{
70+
Owner: &testOwner,
71+
},
7372
}
7473
request = request.CreateDatabasePayload(payload)
7574
for _, mod := range mods {

internal/cmd/beta/sqlserverflex/database/database.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package database
33
import (
44
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/create"
55
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/delete"
6+
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/describe"
7+
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/list"
68
"github.com/stackitcloud/stackit-cli/internal/pkg/args"
79
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
810
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
@@ -25,4 +27,6 @@ func NewCmd(p *print.Printer) *cobra.Command {
2527
func addSubcommands(cmd *cobra.Command, p *print.Printer) {
2628
cmd.AddCommand(create.NewCmd(p))
2729
cmd.AddCommand(delete.NewCmd(p))
30+
cmd.AddCommand(describe.NewCmd(p))
31+
cmd.AddCommand(list.NewCmd(p))
2832
}
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
package describe
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/tables"
17+
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex"
18+
19+
"github.com/spf13/cobra"
20+
)
21+
22+
const (
23+
databaseNameArg = "DATABASE_NAME"
24+
25+
instanceIdFlag = "instance-id"
26+
)
27+
28+
type inputModel struct {
29+
*globalflags.GlobalFlagModel
30+
DatabaseName string
31+
InstanceId string
32+
}
33+
34+
func NewCmd(p *print.Printer) *cobra.Command {
35+
cmd := &cobra.Command{
36+
Use: fmt.Sprintf("describe %s", databaseNameArg),
37+
Short: "Shows details of an SQLServer Flex database",
38+
Long: "Shows details of an SQLServer Flex database.",
39+
Args: args.SingleArg(databaseNameArg, nil),
40+
Example: examples.Build(
41+
examples.NewExample(
42+
`Get details of an SQLServer Flex database with name "my-database" of instance with ID "xxx"`,
43+
"$ stackit beta sqlserverflex database describe my-database --instance-id xxx"),
44+
examples.NewExample(
45+
`Get details of an SQLServer Flex database with name "my-database" of instance with ID "xxx" in JSON format`,
46+
"$ stackit beta sqlserverflex database describe my-database --instance-id xxx --output-format json"),
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+
// Configure API client
55+
apiClient, err := client.ConfigureClient(p)
56+
if err != nil {
57+
return err
58+
}
59+
60+
// Call API
61+
req := buildRequest(ctx, model, apiClient)
62+
resp, err := req.Execute()
63+
if err != nil {
64+
return fmt.Errorf("read SQLServer Flex database: %w", err)
65+
}
66+
67+
return outputResult(p, model.OutputFormat, resp)
68+
},
69+
}
70+
configureFlags(cmd)
71+
return cmd
72+
}
73+
74+
func configureFlags(cmd *cobra.Command) {
75+
cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "SQLServer Flex instance ID")
76+
77+
err := flags.MarkFlagsRequired(cmd, instanceIdFlag)
78+
cobra.CheckErr(err)
79+
}
80+
81+
func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) {
82+
databaseName := inputArgs[0]
83+
84+
globalFlags := globalflags.Parse(p, cmd)
85+
if globalFlags.ProjectId == "" {
86+
return nil, &errors.ProjectIdError{}
87+
}
88+
89+
model := inputModel{
90+
GlobalFlagModel: globalFlags,
91+
DatabaseName: databaseName,
92+
InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag),
93+
}
94+
95+
if p.IsVerbosityDebug() {
96+
modelStr, err := print.BuildDebugStrFromInputModel(model)
97+
if err != nil {
98+
p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err)
99+
} else {
100+
p.Debug(print.DebugLevel, "parsed input values: %s", modelStr)
101+
}
102+
}
103+
104+
return &model, nil
105+
}
106+
107+
func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiGetDatabaseRequest {
108+
req := apiClient.GetDatabase(ctx, model.ProjectId, model.InstanceId, model.DatabaseName)
109+
return req
110+
}
111+
112+
func outputResult(p *print.Printer, outputFormat string, database *sqlserverflex.GetDatabaseResponse) error {
113+
switch outputFormat {
114+
case print.JSONOutputFormat:
115+
details, err := json.MarshalIndent(database, "", " ")
116+
if err != nil {
117+
return fmt.Errorf("marshal SQLServer Flex database: %w", err)
118+
}
119+
p.Outputln(string(details))
120+
121+
return nil
122+
case print.YAMLOutputFormat:
123+
details, err := yaml.MarshalWithOptions(database, yaml.IndentSequence(true))
124+
if err != nil {
125+
return fmt.Errorf("marshal SQLServer Flex database: %w", err)
126+
}
127+
p.Outputln(string(details))
128+
129+
return nil
130+
default:
131+
database := database.Database
132+
table := tables.NewTable()
133+
table.AddRow("ID", *database.Id)
134+
table.AddSeparator()
135+
table.AddRow("NAME", *database.Name)
136+
table.AddSeparator()
137+
if database.CreateDate != nil {
138+
table.AddRow("CREATE DATE", *database.CreateDate)
139+
table.AddSeparator()
140+
}
141+
if database.Collation != nil {
142+
table.AddRow("COLLATION", *database.Collation)
143+
table.AddSeparator()
144+
}
145+
if database.Options != nil {
146+
if database.Options.CompatibilityLevel != nil {
147+
table.AddRow("COMPATIBILITY LEVEL", *database.Options.CompatibilityLevel)
148+
table.AddSeparator()
149+
}
150+
if database.Options.IsEncrypted != nil {
151+
table.AddRow("IS ENCRYPTED", *database.Options.IsEncrypted)
152+
table.AddSeparator()
153+
}
154+
if database.Options.Owner != nil {
155+
table.AddRow("OWNER", *database.Options.Owner)
156+
table.AddSeparator()
157+
}
158+
if database.Options.UserAccess != nil {
159+
table.AddRow("USER ACCESS", *database.Options.UserAccess)
160+
}
161+
}
162+
err := table.Display(p)
163+
if err != nil {
164+
return fmt.Errorf("render table: %w", err)
165+
}
166+
167+
return nil
168+
}
169+
}

0 commit comments

Comments
 (0)