Skip to content

Implement sqlserverflex database list/describe commands #409

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/stackit_beta_sqlserverflex_database.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,6 @@ stackit beta sqlserverflex database [flags]
* [stackit beta sqlserverflex](./stackit_beta_sqlserverflex.md) - Provides functionality for SQLServer Flex
* [stackit beta sqlserverflex database create](./stackit_beta_sqlserverflex_database_create.md) - Creates a SQLServer Flex database
* [stackit beta sqlserverflex database delete](./stackit_beta_sqlserverflex_database_delete.md) - Deletes a SQLServer Flex database
* [stackit beta sqlserverflex database describe](./stackit_beta_sqlserverflex_database_describe.md) - Shows details of an SQLServer Flex database
* [stackit beta sqlserverflex database list](./stackit_beta_sqlserverflex_database_list.md) - Lists all SQLServer Flex databases

43 changes: 43 additions & 0 deletions docs/stackit_beta_sqlserverflex_database_describe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
## stackit beta sqlserverflex database describe

Shows details of an SQLServer Flex database

### Synopsis

Shows details of an SQLServer Flex database.

```
stackit beta sqlserverflex database describe DATABASE_NAME [flags]
```

### Examples

```
Get details of an SQLServer Flex database with name "my-database" of instance with ID "xxx"
$ stackit beta sqlserverflex database describe my-database --instance-id xxx

Get details of an SQLServer Flex database with name "my-database" of instance with ID "xxx" in JSON format
$ stackit beta sqlserverflex database describe my-database --instance-id xxx --output-format json
```

### Options

```
-h, --help Help for "stackit beta sqlserverflex database describe"
--instance-id string SQLServer Flex instance ID
```

### Options inherited from parent commands

```
-y, --assume-yes If set, skips all confirmation prompts
--async If set, runs the command asynchronously
-o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"]
-p, --project-id string Project ID
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
```

### SEE ALSO

* [stackit beta sqlserverflex database](./stackit_beta_sqlserverflex_database.md) - Provides functionality for SQLServer Flex databases

47 changes: 47 additions & 0 deletions docs/stackit_beta_sqlserverflex_database_list.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
## stackit beta sqlserverflex database list

Lists all SQLServer Flex databases

### Synopsis

Lists all SQLServer Flex databases.

```
stackit beta sqlserverflex database list [flags]
```

### Examples

```
List all SQLServer Flex databases of instance with ID "xxx"
$ stackit beta sqlserverflex database list --instance-id xxx

List all SQLServer Flex databases of instance with ID "xxx" in JSON format
$ stackit beta sqlserverflex database list --instance-id xxx --output-format json

List up to 10 SQLServer Flex databases of instance with ID "xxx"
$ stackit beta sqlserverflex database list --instance-id xxx --limit 10
```

### Options

```
-h, --help Help for "stackit beta sqlserverflex database list"
--instance-id string SQLServer Flex instance ID
--limit int Maximum number of entries to list
```

### Options inherited from parent commands

```
-y, --assume-yes If set, skips all confirmation prompts
--async If set, runs the command asynchronously
-o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"]
-p, --project-id string Project ID
--verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info")
```

### SEE ALSO

* [stackit beta sqlserverflex database](./stackit_beta_sqlserverflex_database.md) - Provides functionality for SQLServer Flex databases

8 changes: 6 additions & 2 deletions docs/stackit_beta_sqlserverflex_user_create.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@ Creates a SQLServer Flex user
### Synopsis

Creates a SQLServer Flex user for an instance.

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

The allowed user roles for your instance can be obtained by running:
$ stackit beta sqlserverflex options --user-roles --instance-id INSTANCE_ID

```
stackit beta sqlserverflex user create [flags]
```
Expand All @@ -18,10 +22,10 @@ stackit beta sqlserverflex user create [flags]

```
Create a SQLServer Flex user for instance with ID "xxx" and specify the username, role and database
$ stackit beta sqlserverflex user create --instance-id xxx --username johndoe --roles my-role --database my-database
$ stackit beta sqlserverflex user create --instance-id xxx --username johndoe --roles "##STACKIT_DatabaseManager##" --database my-database

Create a SQLServer Flex user for instance with ID "xxx", specifying multiple roles
$ stackit beta sqlserverflex user create --instance-id xxx --username johndoe --roles "my-role-1,my-role-2"
$ stackit beta sqlserverflex user create --instance-id xxx --username johndoe --roles "##STACKIT_LoginManager##,##STACKIT_DatabaseManager##"
```

### Options
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ require (
github.com/stackitcloud/stackit-sdk-go/services/serverbackup v0.1.0
github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.4.0
github.com/stackitcloud/stackit-sdk-go/services/ske v0.17.0
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.2.0
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.3.0
github.com/zalando/go-keyring v0.2.5
golang.org/x/mod v0.19.0
golang.org/x/oauth2 v0.21.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.4.0 h1:JB1O0E9
github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.4.0/go.mod h1:Ni9RBJvcaXRIrDIuQBpJcuQvCQSj27crQSyc+WM4p0c=
github.com/stackitcloud/stackit-sdk-go/services/ske v0.17.0 h1:4S3MwNmpMfjzBz9JtKbXvkos7j+7hGeFMf7XsjMLL/g=
github.com/stackitcloud/stackit-sdk-go/services/ske v0.17.0/go.mod h1:0fFs4R7kg+gU7FNAIzzFvlCZJz6gyZ8CFhbK3eSrAwQ=
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.2.0 h1:aIXxXx6u4+6C02MPb+hdItigeKeen7m+hEEG+Ej9sNs=
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.2.0/go.mod h1:fQJOQMfasStZ8J9iGX0vTjyJoQtLqMXJ5Npb03QJk84=
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.3.0 h1:M6tcXUMNM6XMfHVQeQzB6IjfPdAxnZar3YD+YstRStc=
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.3.0/go.mod h1:Qnn+06i21XtagtMQ4cTwOCR3OLnXX+t1n+Vf/HH49Yw=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
Expand Down
7 changes: 3 additions & 4 deletions internal/cmd/beta/sqlserverflex/database/create/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
"github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client"
"github.com/stackitcloud/stackit-cli/internal/pkg/spinner"
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex"

"github.com/spf13/cobra"
Expand Down Expand Up @@ -125,9 +124,9 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverfl
req := apiClient.CreateDatabase(ctx, model.ProjectId, model.InstanceId)
payload := sqlserverflex.CreateDatabasePayload{
Name: &model.DatabaseName,
Options: utils.Ptr(map[string]string{
"owner": model.Owner,
}),
Options: &sqlserverflex.DatabaseDocumentationCreateDatabaseRequestOptions{
Owner: &model.Owner,
},
}
req = req.CreateDatabasePayload(payload)
return req
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (

"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex"

"github.com/google/go-cmp/cmp"
Expand Down Expand Up @@ -67,9 +66,9 @@ func fixtureRequest(mods ...func(request *sqlserverflex.ApiCreateDatabaseRequest
request := testClient.CreateDatabase(testCtx, testProjectId, testInstanceId)
payload := sqlserverflex.CreateDatabasePayload{
Name: &testDatabaseName,
Options: utils.Ptr(map[string]string{
"owner": testOwner,
}),
Options: &sqlserverflex.DatabaseDocumentationCreateDatabaseRequestOptions{
Owner: &testOwner,
},
}
request = request.CreateDatabasePayload(payload)
for _, mod := range mods {
Expand Down
4 changes: 4 additions & 0 deletions internal/cmd/beta/sqlserverflex/database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package database
import (
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/create"
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/delete"
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/describe"
"github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/list"
"github.com/stackitcloud/stackit-cli/internal/pkg/args"
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
Expand All @@ -25,4 +27,6 @@ func NewCmd(p *print.Printer) *cobra.Command {
func addSubcommands(cmd *cobra.Command, p *print.Printer) {
cmd.AddCommand(create.NewCmd(p))
cmd.AddCommand(delete.NewCmd(p))
cmd.AddCommand(describe.NewCmd(p))
cmd.AddCommand(list.NewCmd(p))
}
169 changes: 169 additions & 0 deletions internal/cmd/beta/sqlserverflex/database/describe/describe.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
package describe

import (
"context"
"encoding/json"
"fmt"

"github.com/goccy/go-yaml"
"github.com/stackitcloud/stackit-cli/internal/pkg/args"
"github.com/stackitcloud/stackit-cli/internal/pkg/errors"
"github.com/stackitcloud/stackit-cli/internal/pkg/examples"
"github.com/stackitcloud/stackit-cli/internal/pkg/flags"
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
"github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client"
"github.com/stackitcloud/stackit-cli/internal/pkg/tables"
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex"

"github.com/spf13/cobra"
)

const (
databaseNameArg = "DATABASE_NAME"

instanceIdFlag = "instance-id"
)

type inputModel struct {
*globalflags.GlobalFlagModel
DatabaseName string
InstanceId string
}

func NewCmd(p *print.Printer) *cobra.Command {
cmd := &cobra.Command{
Use: fmt.Sprintf("describe %s", databaseNameArg),
Short: "Shows details of an SQLServer Flex database",
Long: "Shows details of an SQLServer Flex database.",
Args: args.SingleArg(databaseNameArg, nil),
Example: examples.Build(
examples.NewExample(
`Get details of an SQLServer Flex database with name "my-database" of instance with ID "xxx"`,
"$ stackit beta sqlserverflex database describe my-database --instance-id xxx"),
examples.NewExample(
`Get details of an SQLServer Flex database with name "my-database" of instance with ID "xxx" in JSON format`,
"$ stackit beta sqlserverflex database describe my-database --instance-id xxx --output-format json"),
),
RunE: func(cmd *cobra.Command, args []string) error {
ctx := context.Background()
model, err := parseInput(p, cmd, args)
if err != nil {
return err
}
// Configure API client
apiClient, err := client.ConfigureClient(p)
if err != nil {
return err
}

// Call API
req := buildRequest(ctx, model, apiClient)
resp, err := req.Execute()
if err != nil {
return fmt.Errorf("read SQLServer Flex database: %w", err)
}

return outputResult(p, model.OutputFormat, resp)
},
}
configureFlags(cmd)
return cmd
}

func configureFlags(cmd *cobra.Command) {
cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "SQLServer Flex instance ID")

err := flags.MarkFlagsRequired(cmd, instanceIdFlag)
cobra.CheckErr(err)
}

func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) {
databaseName := inputArgs[0]

globalFlags := globalflags.Parse(p, cmd)
if globalFlags.ProjectId == "" {
return nil, &errors.ProjectIdError{}
}

model := inputModel{
GlobalFlagModel: globalFlags,
DatabaseName: databaseName,
InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag),
}

if p.IsVerbosityDebug() {
modelStr, err := print.BuildDebugStrFromInputModel(model)
if err != nil {
p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err)
} else {
p.Debug(print.DebugLevel, "parsed input values: %s", modelStr)
}
}

return &model, nil
}

func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiGetDatabaseRequest {
req := apiClient.GetDatabase(ctx, model.ProjectId, model.InstanceId, model.DatabaseName)
return req
}

func outputResult(p *print.Printer, outputFormat string, database *sqlserverflex.GetDatabaseResponse) error {
switch outputFormat {
case print.JSONOutputFormat:
details, err := json.MarshalIndent(database, "", " ")
if err != nil {
return fmt.Errorf("marshal SQLServer Flex database: %w", err)
}
p.Outputln(string(details))

return nil
case print.YAMLOutputFormat:
details, err := yaml.MarshalWithOptions(database, yaml.IndentSequence(true))
if err != nil {
return fmt.Errorf("marshal SQLServer Flex database: %w", err)
}
p.Outputln(string(details))

return nil
default:
database := database.Database
table := tables.NewTable()
table.AddRow("ID", *database.Id)
table.AddSeparator()
table.AddRow("NAME", *database.Name)
table.AddSeparator()
if database.CreateDate != nil {
table.AddRow("CREATE DATE", *database.CreateDate)
table.AddSeparator()
}
if database.Collation != nil {
table.AddRow("COLLATION", *database.Collation)
table.AddSeparator()
}
if database.Options != nil {
if database.Options.CompatibilityLevel != nil {
table.AddRow("COMPATIBILITY LEVEL", *database.Options.CompatibilityLevel)
table.AddSeparator()
}
if database.Options.IsEncrypted != nil {
table.AddRow("IS ENCRYPTED", *database.Options.IsEncrypted)
table.AddSeparator()
}
if database.Options.Owner != nil {
table.AddRow("OWNER", *database.Options.Owner)
table.AddSeparator()
}
if database.Options.UserAccess != nil {
table.AddRow("USER ACCESS", *database.Options.UserAccess)
}
}
err := table.Display(p)
if err != nil {
return fmt.Errorf("render table: %w", err)
}

return nil
}
}
Loading