Skip to content
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
1 change: 1 addition & 0 deletions docs/stackit_beta_sqlserverflex.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ stackit beta sqlserverflex [flags]
### SEE ALSO

* [stackit beta](./stackit_beta.md) - Contains beta STACKIT CLI commands
* [stackit beta sqlserverflex database](./stackit_beta_sqlserverflex_database.md) - Provides functionality for SQLServer Flex databases
* [stackit beta sqlserverflex instance](./stackit_beta_sqlserverflex_instance.md) - Provides functionality for SQLServer Flex instances
* [stackit beta sqlserverflex options](./stackit_beta_sqlserverflex_options.md) - Lists SQL Server Flex options
* [stackit beta sqlserverflex user](./stackit_beta_sqlserverflex_user.md) - Provides functionality for SQLServer Flex users
Expand Down
34 changes: 34 additions & 0 deletions docs/stackit_beta_sqlserverflex_database.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
## stackit beta sqlserverflex database

Provides functionality for SQLServer Flex databases

### Synopsis

Provides functionality for SQLServer Flex databases.

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

### Options

```
-h, --help Help for "stackit beta sqlserverflex database"
```

### 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](./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

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

Creates a SQLServer Flex database

### Synopsis

Creates a SQLServer Flex database.
This operation cannot be triggered asynchronously (the "--async" flag will have no effect).

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

### Examples

```
Create a SQLServer Flex database with name "my-database" on instance with ID "xxx"
$ stackit beta sqlserverflex database create my-database --instance-id xxx --owner some-username
```

### Options

```
-h, --help Help for "stackit beta sqlserverflex database create"
--instance-id string SQLServer Flex instance ID
--owner string Username of the owner user
```

### 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

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

Deletes a SQLServer Flex database

### Synopsis

Deletes a SQLServer Flex database.
This operation cannot be triggered asynchronously (the "--async" flag will have no effect).

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

### Examples

```
Delete a SQLServer Flex database with name "my-database" of instance with ID "xxx"
$ stackit beta sqlserverflex database delete my-database --instance-id xxx
```

### Options

```
-h, --help Help for "stackit beta sqlserverflex database delete"
--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

158 changes: 158 additions & 0 deletions internal/cmd/beta/sqlserverflex/database/create/create.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
package create

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/spinner"
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex"

"github.com/spf13/cobra"
)

const (
databaseNameArg = "DATABASE_NAME"

instanceIdFlag = "instance-id"
ownerFlag = "owner"
)

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

func NewCmd(p *print.Printer) *cobra.Command {
cmd := &cobra.Command{
Use: fmt.Sprintf("create %s", databaseNameArg),
Short: "Creates a SQLServer Flex database",
Long: fmt.Sprintf("%s\n%s",
"Creates a SQLServer Flex database.",
`This operation cannot be triggered asynchronously (the "--async" flag will have no effect).`,
),
Args: args.SingleArg(databaseNameArg, nil),
Example: examples.Build(
examples.NewExample(
`Create a SQLServer Flex database with name "my-database" on instance with ID "xxx"`,
"$ stackit beta sqlserverflex database create my-database --instance-id xxx --owner some-username"),
),
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
}

if !model.AssumeYes {
prompt := fmt.Sprintf("Are you sure you want to create database %q? (This cannot be undone)", model.DatabaseName)
err = p.PromptForConfirmation(prompt)
if err != nil {
return err
}
}

// Call API
req := buildRequest(ctx, model, apiClient)
s := spinner.New(p)
s.Start("Creating database")
resp, err := req.Execute()
if err != nil {
s.StopWithError()
return fmt.Errorf("create SQLServer Flex database: %w", err)
}
s.Stop()
Comment thread
joaopalet marked this conversation as resolved.

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

func configureFlags(cmd *cobra.Command) {
cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "SQLServer Flex instance ID")
cmd.Flags().String(ownerFlag, "", "Username of the owner user")
err := flags.MarkFlagsRequired(cmd, instanceIdFlag, ownerFlag)
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),
Owner: flags.FlagToStringValue(p, cmd, ownerFlag),
}

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.ApiCreateDatabaseRequest {
req := apiClient.CreateDatabase(ctx, model.ProjectId, model.InstanceId)
payload := sqlserverflex.CreateDatabasePayload{
Name: &model.DatabaseName,
Options: utils.Ptr(map[string]string{
"owner": model.Owner,
}),
}
req = req.CreateDatabasePayload(payload)
return req
}

func outputResult(p *print.Printer, model *inputModel, resp *sqlserverflex.CreateDatabaseResponse) error {
switch model.OutputFormat {
case print.JSONOutputFormat:
details, err := json.MarshalIndent(resp, "", " ")
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(resp, yaml.IndentSequence(true))
if err != nil {
return fmt.Errorf("marshal SQLServer Flex database: %w", err)
}
p.Outputln(string(details))

return nil
default:
p.Outputf("Created database %q\n", model.DatabaseName)
return nil
}
}
Loading