diff --git a/docs/stackit_beta_sqlserverflex_instance_create.md b/docs/stackit_beta_sqlserverflex_instance_create.md index 002538b2f..a214d4e96 100644 --- a/docs/stackit_beta_sqlserverflex_instance_create.md +++ b/docs/stackit_beta_sqlserverflex_instance_create.md @@ -13,15 +13,12 @@ stackit beta sqlserverflex instance create [flags] ### Examples ``` - Create a SQLServer Flex instance with name "my-instance" and specify flavor by CPU and RAM. Other parameters are set to default values - $ stackit beta sqlserverflex instance create --name my-instance --cpu 1 --ram 4 - Create a SQLServer Flex instance with name "my-instance" and specify flavor by ID. Other parameters are set to default values. The flavor ID can be retrieved by running "$ stackit beta sqlserverflex options --flavors" - $ stackit beta sqlserverflex instance create --name my-instance --flavor-id xxx + $ stackit beta sqlserverflex instance create --name my-instance --flavor-id xxx --backup-schedule "0 1-3 * * *" --retention-days 30 --storage-class premium-perf2-stackit --storage-size 10 --version 2022 Create a SQLServer Flex instance with name "my-instance", specify flavor by CPU and RAM, set storage size to 20 GB, and restrict access to a specific range of IP addresses. Other parameters are set to default values - $ stackit beta sqlserverflex instance create --name my-instance --cpu 1 --ram 4 --storage-size 20 --acl 1.2.3.0/24 + $ stackit beta sqlserverflex instance create --name my-instance --cpu 1 --ram 4 --storage-size 20 --backup-schedule "0 1-3 * * *" --retention-days 30 --storage-class premium-perf2-stackit --storage-size 10 --version 2022 --acl 1.2.3.0/24 ``` ### Options @@ -29,13 +26,13 @@ stackit beta sqlserverflex instance create [flags] ``` --acl strings The access control list (ACL). Must contain at least one valid subnet, for instance '0.0.0.0/0' for open access (discouraged), '1.2.3.0/24 for a public IP range of an organization, '1.2.3.4/32' for a single IP range, etc. (default []) --backup-schedule string Backup schedule - --cpu int32 Number of CPUs + --cpu int Number of CPUs --edition string Edition of the SQLServer instance --flavor-id string ID of the flavor -h, --help Help for "stackit beta sqlserverflex instance create" -n, --name string Instance name - --ram int32 Amount of RAM (in GB) - --retention-days int The days for how long the backup files should be stored before being cleaned up + --ram int Amount of RAM (in GB) + --retention-days int32 The days for how long the backup files should be stored before being cleaned up --storage-class string Storage class --storage-size int Storage size (in GB) --version string SQLServer version diff --git a/docs/stackit_beta_sqlserverflex_instance_update.md b/docs/stackit_beta_sqlserverflex_instance_update.md index b4d901af3..9ff3c5b25 100644 --- a/docs/stackit_beta_sqlserverflex_instance_update.md +++ b/docs/stackit_beta_sqlserverflex_instance_update.md @@ -25,11 +25,11 @@ stackit beta sqlserverflex instance update INSTANCE_ID [flags] ``` --acl strings Lists of IP networks in CIDR notation which are allowed to access this instance (default []) --backup-schedule string Backup schedule - --cpu int32 Number of CPUs + --cpu int Number of CPUs --flavor-id string ID of the flavor -h, --help Help for "stackit beta sqlserverflex instance update" -n, --name string Instance name - --ram int32 Amount of RAM (in GB) + --ram int Amount of RAM (in GB) --version string Version ``` diff --git a/go.mod b/go.mod index 2353b9927..cfd5be58a 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 github.com/stackitcloud/stackit-sdk-go/services/ske v1.11.0 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.11.0 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.16.0 github.com/stackitcloud/stackit-sdk-go/services/vpn v0.14.0 github.com/zalando/go-keyring v0.2.8 golang.org/x/mod v0.34.0 diff --git a/go.sum b/go.sum index 5ec24b922..cd529051a 100644 --- a/go.sum +++ b/go.sum @@ -650,8 +650,8 @@ github.com/stackitcloud/stackit-sdk-go/services/sfs v0.9.0 h1:JWAFnskRbNKT8x62pZ github.com/stackitcloud/stackit-sdk-go/services/sfs v0.9.0/go.mod h1:jMlBoXqrPNX5nXbo6oT7exalqilw1jiLPoIp4Cn0CdI= github.com/stackitcloud/stackit-sdk-go/services/ske v1.11.0 h1:QoKyQPe8FqDqJLNgE5uRlZ/y1c1GUxjV1DDLu5QEBD8= github.com/stackitcloud/stackit-sdk-go/services/ske v1.11.0/go.mod h1:KhVYCR58wETqdI7Quwhe3OR3BhB2T/b7DzaMsfDnr8g= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.11.0 h1:PwjQeupEnXxhu+uWCUzO/hUfL4yqNblOcZbP2jvaQtU= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.11.0/go.mod h1:AiUoMAqQcOlMgDtkVJlqI7P/VGD5xjN3dYjERGnwN/M= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.16.0 h1:A6zN5JUz5DOTigTxAyAC+4p5VpJzaYDftx2yIH0mgn8= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.16.0/go.mod h1:AiUoMAqQcOlMgDtkVJlqI7P/VGD5xjN3dYjERGnwN/M= github.com/stackitcloud/stackit-sdk-go/services/vpn v0.14.0 h1:LMgbzhPunuelsIsfyEj/5O/aYfNcg/eGHsnZ7AZOhYg= github.com/stackitcloud/stackit-sdk-go/services/vpn v0.14.0/go.mod h1:toIjQk1dhxdUFVyCWJJja0w/0nFpDid8MWX0ukQfvfo= github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= diff --git a/internal/cmd/beta/sqlserverflex/database/create/create.go b/internal/cmd/beta/sqlserverflex/database/create/create.go index d15e4f06c..0251bd609 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create.go @@ -6,7 +6,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -108,12 +108,10 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiCreateDatabaseRequest { - req := apiClient.DefaultAPI.CreateDatabase(ctx, model.ProjectId, model.InstanceId, model.Region) + req := apiClient.DefaultAPI.CreateDatabase(ctx, model.ProjectId, model.Region, model.InstanceId) payload := sqlserverflex.CreateDatabasePayload{ - Name: model.DatabaseName, - Options: sqlserverflex.DatabaseDocumentationCreateDatabaseRequestOptions{ - Owner: model.Owner, - }, + Name: model.DatabaseName, + Owner: model.Owner, } req = req.CreateDatabasePayload(payload) return req diff --git a/internal/cmd/beta/sqlserverflex/database/create/create_test.go b/internal/cmd/beta/sqlserverflex/database/create/create_test.go index 6d43c2eac..1c0eb3ce2 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create_test.go @@ -7,7 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -67,12 +67,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiCreateDatabaseRequest)) sqlserverflex.ApiCreateDatabaseRequest { - request := testClient.DefaultAPI.CreateDatabase(testCtx, testProjectId, testInstanceId, testRegion) + request := testClient.DefaultAPI.CreateDatabase(testCtx, testProjectId, testRegion, testInstanceId) payload := sqlserverflex.CreateDatabasePayload{ - Name: testDatabaseName, - Options: sqlserverflex.DatabaseDocumentationCreateDatabaseRequestOptions{ - Owner: testOwner, - }, + Name: testDatabaseName, + Owner: testOwner, } request = request.CreateDatabasePayload(payload) for _, mod := range mods { diff --git a/internal/cmd/beta/sqlserverflex/database/delete/delete.go b/internal/cmd/beta/sqlserverflex/database/delete/delete.go index 289d6ef47..3fc6fd933 100644 --- a/internal/cmd/beta/sqlserverflex/database/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/database/delete/delete.go @@ -16,7 +16,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" ) const ( @@ -107,6 +107,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiDeleteDatabaseRequest { - req := apiClient.DefaultAPI.DeleteDatabase(ctx, model.ProjectId, model.InstanceId, model.DatabaseName, model.Region) + req := apiClient.DefaultAPI.DeleteDatabase(ctx, model.ProjectId, model.Region, model.InstanceId, model.DatabaseName) return req } diff --git a/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go b/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go index aea7de825..d557a62c1 100644 --- a/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go +++ b/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -63,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiDeleteDatabaseRequest)) sqlserverflex.ApiDeleteDatabaseRequest { - request := testClient.DefaultAPI.DeleteDatabase(testCtx, testProjectId, testInstanceId, testDatabaseName, testRegion) + request := testClient.DefaultAPI.DeleteDatabase(testCtx, testProjectId, testRegion, testInstanceId, testDatabaseName) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe.go b/internal/cmd/beta/sqlserverflex/database/describe/describe.go index 80c224173..23bdcf2f8 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe.go @@ -7,7 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -17,7 +17,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/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) const ( @@ -98,35 +97,26 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiGetDatabaseRequest { - req := apiClient.DefaultAPI.GetDatabase(ctx, model.ProjectId, model.InstanceId, model.DatabaseName, model.Region) + req := apiClient.DefaultAPI.GetDatabase(ctx, model.ProjectId, model.Region, model.InstanceId, model.DatabaseName) return req } func outputResult(p *print.Printer, outputFormat string, resp *sqlserverflex.GetDatabaseResponse) error { - if resp == nil || resp.Database == nil { + if resp == nil { return fmt.Errorf("database response is empty") } return p.OutputResult(outputFormat, resp, func() error { - database := resp.Database table := tables.NewTable() - table.AddRow("ID", utils.PtrString(database.Id)) + table.AddRow("ID", resp.Id) table.AddSeparator() - table.AddRow("NAME", utils.PtrString(database.Name)) + table.AddRow("NAME", resp.Name) table.AddSeparator() - if database.Options != nil { - if database.Options.CompatibilityLevel != nil { - table.AddRow("COMPATIBILITY LEVEL", *database.Options.CompatibilityLevel) - table.AddSeparator() - } - if database.Options.Owner != nil { - table.AddRow("OWNER", *database.Options.Owner) - table.AddSeparator() - } - if database.Options.CollationName != nil { - table.AddRow("COLLATION", *database.Options.CollationName) - } - } + table.AddRow("COMPATIBILITY LEVEL", resp.CompatibilityLevel) + table.AddSeparator() + table.AddRow("OWNER", resp.Owner) + table.AddSeparator() + table.AddRow("COLLATION", resp.CollationName) err := table.Display(p) if err != nil { return fmt.Errorf("render table: %w", err) diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go index 585d42d90..7f6192c20 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go @@ -7,7 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -64,7 +64,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiGetDatabaseRequest)) sqlserverflex.ApiGetDatabaseRequest { - request := testClient.DefaultAPI.GetDatabase(testCtx, testProjectId, testInstanceId, testDatabaseName, testRegion) + request := testClient.DefaultAPI.GetDatabase(testCtx, testProjectId, testRegion, testInstanceId, testDatabaseName) for _, mod := range mods { mod(&request) } @@ -210,20 +210,6 @@ func TestOutputResult(t *testing.T) { args: args{}, wantErr: true, }, - { - name: "empty response", - args: args{ - resp: &sqlserverflex.GetDatabaseResponse{}, - }, - wantErr: true, - }, - { - name: "only database as argument", - args: args{ - resp: &sqlserverflex.GetDatabaseResponse{Database: &sqlserverflex.SingleDatabase{}}, - }, - wantErr: false, - }, } params := testparams.NewTestParams() diff --git a/internal/cmd/beta/sqlserverflex/database/list/list.go b/internal/cmd/beta/sqlserverflex/database/list/list.go index a9ad35d87..5d90aa0e7 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list.go @@ -7,7 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -18,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) const ( @@ -122,11 +121,11 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiListDatabasesRequest { - req := apiClient.DefaultAPI.ListDatabases(ctx, model.ProjectId, model.InstanceId, model.Region) + req := apiClient.DefaultAPI.ListDatabases(ctx, model.ProjectId, model.Region, model.InstanceId) return req } -func outputResult(p *print.Printer, outputFormat, instanceId, projectLabel string, databases []sqlserverflex.Database) error { +func outputResult(p *print.Printer, outputFormat, instanceId, projectLabel string, databases []sqlserverflex.ListDatabase) error { return p.OutputResult(outputFormat, databases, func() error { if len(databases) == 0 { p.Outputf("No databases found for instance %s on project %s\n", instanceId, projectLabel) @@ -137,7 +136,7 @@ func outputResult(p *print.Printer, outputFormat, instanceId, projectLabel strin table.SetHeader("ID", "NAME") for i := range databases { database := databases[i] - table.AddRow(utils.PtrString(database.Id), utils.PtrString(database.Name)) + table.AddRow(database.Id, database.Name) } err := table.Display(p) if err != nil { diff --git a/internal/cmd/beta/sqlserverflex/database/list/list_test.go b/internal/cmd/beta/sqlserverflex/database/list/list_test.go index 852236309..5ec988130 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list_test.go @@ -7,7 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -56,7 +56,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiListDatabasesRequest)) sqlserverflex.ApiListDatabasesRequest { - request := testClient.DefaultAPI.ListDatabases(testCtx, testProjectId, testInstanceId, testRegion) + request := testClient.DefaultAPI.ListDatabases(testCtx, testProjectId, testRegion, testInstanceId) for _, mod := range mods { mod(&request) } @@ -180,7 +180,7 @@ func TestOutputResult(t *testing.T) { outputFormat string instanceId string projectLabel string - databases []sqlserverflex.Database + databases []sqlserverflex.ListDatabase } tests := []struct { name string @@ -195,7 +195,7 @@ func TestOutputResult(t *testing.T) { { name: "empty database in databases slice", args: args{ - databases: []sqlserverflex.Database{{}}, + databases: []sqlserverflex.ListDatabase{{}}, }, wantErr: false, }, diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create.go b/internal/cmd/beta/sqlserverflex/instance/create/create.go index e3a0fe312..92f4677bc 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create.go @@ -20,21 +20,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api/wait" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api/wait" ) -// enforce implementation of interfaces -var ( - _ sqlServerFlexClient = sqlserverflex.APIClient{}.DefaultAPI -) - -type sqlServerFlexClient interface { - CreateInstance(ctx context.Context, projectId string, region string) sqlserverflex.ApiCreateInstanceRequest - ListFlavors(ctx context.Context, projectId string, region string) sqlserverflex.ApiListFlavorsRequest - ListStorages(ctx context.Context, projectId, flavorId string, region string) sqlserverflex.ApiListStoragesRequest -} - const ( instanceNameFlag = "name" aclFlag = "acl" @@ -54,15 +43,14 @@ type inputModel struct { InstanceName string ACL []string - BackupSchedule *string + BackupSchedule string FlavorId *string - CPU *int32 - RAM *int32 - StorageClass *string + CPU *int64 + RAM *int64 + StorageClass string StorageSize *int64 - Version *string - Edition *string - RetentionDays *int64 + Version string + RetentionDays *int32 } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -72,20 +60,16 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Long: "Creates a SQLServer Flex instance.", Args: args.NoArgs, Example: examples.Build( - examples.NewExample( - `Create a SQLServer Flex instance with name "my-instance" and specify flavor by CPU and RAM. Other parameters are set to default values`, - `$ stackit beta sqlserverflex instance create --name my-instance --cpu 1 --ram 4`), examples.NewExample( `Create a SQLServer Flex instance with name "my-instance" and specify flavor by ID. Other parameters are set to default values. The flavor ID can be retrieved by running "$ stackit beta sqlserverflex options --flavors"`, - `$ stackit beta sqlserverflex instance create --name my-instance --flavor-id xxx`), + `$ stackit beta sqlserverflex instance create --name my-instance --flavor-id xxx --backup-schedule "0 1-3 * * *" --retention-days 30 --storage-class premium-perf2-stackit --storage-size 10 --version 2022`), examples.NewExample( `Create a SQLServer Flex instance with name "my-instance", specify flavor by CPU and RAM, set storage size to 20 GB, and restrict access to a specific range of IP addresses. Other parameters are set to default values`, - `$ stackit beta sqlserverflex instance create --name my-instance --cpu 1 --ram 4 --storage-size 20 --acl 1.2.3.0/24`), + `$ stackit beta sqlserverflex instance create --name my-instance --cpu 1 --ram 4 --storage-size 20 --backup-schedule "0 1-3 * * *" --retention-days 30 --storage-class premium-perf2-stackit --storage-size 10 --version 2022 --acl 1.2.3.0/24`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd, args) if err != nil { return err @@ -118,12 +102,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("create SQLServer Flex instance: %w", err) } - instanceId := *resp.Id + instanceId := resp.Id // Wait for async operation, if async mode not enabled if !model.Async { err := spinner.Run(params.Printer, "Creating instance", func() error { - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) return err }) if err != nil { @@ -143,15 +127,15 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Var(flags.CIDRSliceFlag(), aclFlag, "The access control list (ACL). Must contain at least one valid subnet, for instance '0.0.0.0/0' for open access (discouraged), '1.2.3.0/24 for a public IP range of an organization, '1.2.3.4/32' for a single IP range, etc.") cmd.Flags().String(backupScheduleFlag, "", "Backup schedule") cmd.Flags().String(flavorIdFlag, "", "ID of the flavor") - cmd.Flags().Int32(cpuFlag, 0, "Number of CPUs") - cmd.Flags().Int32(ramFlag, 0, "Amount of RAM (in GB)") + cmd.Flags().Int64(cpuFlag, 0, "Number of CPUs") + cmd.Flags().Int64(ramFlag, 0, "Amount of RAM (in GB)") cmd.Flags().Int64(storageSizeFlag, 0, "Storage size (in GB)") cmd.Flags().String(storageClassFlag, "", "Storage class") cmd.Flags().String(versionFlag, "", "SQLServer version") cmd.Flags().String(editionFlag, "", "Edition of the SQLServer instance") - cmd.Flags().Int64(retentionDaysFlag, 0, "The days for how long the backup files should be stored before being cleaned up") + cmd.Flags().Int32(retentionDaysFlag, 0, "The days for how long the backup files should be stored before being cleaned up") - err := flags.MarkFlagsRequired(cmd, instanceNameFlag) + err := flags.MarkFlagsRequired(cmd, instanceNameFlag, backupScheduleFlag, retentionDaysFlag, storageClassFlag, storageSizeFlag, versionFlag) cobra.CheckErr(err) } @@ -162,8 +146,8 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } flavorId := flags.FlagToStringPointer(p, cmd, flavorIdFlag) - cpu := flags.FlagToInt32Pointer(p, cmd, cpuFlag) - ram := flags.FlagToInt32Pointer(p, cmd, ramFlag) + cpu := flags.FlagToInt64Pointer(p, cmd, cpuFlag) + ram := flags.FlagToInt64Pointer(p, cmd, ramFlag) if flavorId == nil && (cpu == nil || ram == nil) { return nil, &cliErr.DatabaseInputFlavorError{ @@ -182,25 +166,24 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, GlobalFlagModel: globalFlags, InstanceName: flags.FlagToStringValue(p, cmd, instanceNameFlag), ACL: flags.FlagToStringSliceValue(p, cmd, aclFlag), - BackupSchedule: flags.FlagToStringPointer(p, cmd, backupScheduleFlag), + BackupSchedule: flags.FlagToStringValue(p, cmd, backupScheduleFlag), FlavorId: flavorId, CPU: cpu, RAM: ram, - StorageClass: flags.FlagToStringPointer(p, cmd, storageClassFlag), + StorageClass: flags.FlagToStringValue(p, cmd, storageClassFlag), StorageSize: flags.FlagToInt64Pointer(p, cmd, storageSizeFlag), - Version: flags.FlagToStringPointer(p, cmd, versionFlag), - Edition: flags.FlagToStringPointer(p, cmd, editionFlag), - RetentionDays: flags.FlagToInt64Pointer(p, cmd, retentionDaysFlag), + Version: flags.FlagToStringValue(p, cmd, versionFlag), + RetentionDays: flags.FlagToInt32Pointer(p, cmd, retentionDaysFlag), } p.DebugInputModel(model) return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient sqlServerFlexClient) (sqlserverflex.ApiCreateInstanceRequest, error) { +func buildRequest(ctx context.Context, model *inputModel, apiClient sqlserverflex.DefaultAPI) (sqlserverflex.ApiCreateInstanceRequest, error) { req := apiClient.CreateInstance(ctx, model.ProjectId, model.Region) - var flavorId *string + var flavorId string var err error flavors, err := apiClient.ListFlavors(ctx, model.ProjectId, model.Region).Execute() @@ -222,37 +205,31 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient sqlServerFle if err != nil { return req, err } - flavorId = model.FlavorId + flavorId = *model.FlavorId } - storages, err := apiClient.ListStorages(ctx, model.ProjectId, *flavorId, model.Region).Execute() + storages, err := apiClient.ListStorages(ctx, model.ProjectId, model.Region, flavorId).Execute() if err != nil { return req, fmt.Errorf("get SQLServer Flex storages: %w", err) } - err = sqlserverflexUtils.ValidateStorage(model.StorageClass, model.StorageSize, storages, *flavorId) + err = sqlserverflexUtils.ValidateStorage(model.StorageClass, model.StorageSize, storages, flavorId) if err != nil { return req, err } - var retentionDays *string - if model.RetentionDays != nil { - retentionDays = utils.Ptr(fmt.Sprintf("%d", *model.RetentionDays)) - } - req = req.CreateInstancePayload(sqlserverflex.CreateInstancePayload{ - Name: model.InstanceName, - Acl: &sqlserverflex.InstanceDocumentationACL{Items: model.ACL}, + Name: model.InstanceName, + Network: sqlserverflex.CreateInstancePayloadNetwork{ + Acl: model.ACL, + }, BackupSchedule: model.BackupSchedule, - FlavorId: *flavorId, - Storage: &sqlserverflex.InstanceDocumentationStorage{ + FlavorId: flavorId, + Storage: sqlserverflex.StorageCreate{ Class: model.StorageClass, - Size: model.StorageSize, - }, - Version: model.Version, - Options: &sqlserverflex.InstanceDocumentationOptions{ - Edition: model.Edition, - RetentionDays: retentionDays, + Size: utils.PtrValue(model.StorageSize), }, + Version: sqlserverflex.InstanceVersion(model.Version), + RetentionDays: utils.PtrValue(model.RetentionDays), }) return req, nil } @@ -266,7 +243,7 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp if model.Async { operationState = "Triggered creation of" } - p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, utils.PtrString(resp.Id)) + p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, resp.Id) return nil }) } diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create_test.go b/internal/cmd/beta/sqlserverflex/instance/create/create_test.go index 2ba8a7b68..21f991e64 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create_test.go @@ -8,7 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -79,13 +79,12 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { }, InstanceName: "example-name", ACL: []string{"0.0.0.0/0"}, - BackupSchedule: utils.Ptr("0 0/6 * * *"), + BackupSchedule: "0 0/6 * * *", FlavorId: utils.Ptr(testFlavorId), - StorageClass: utils.Ptr("storage-class"), + StorageClass: "storage-class", StorageSize: utils.Ptr(int64(10)), - Version: utils.Ptr("6.0"), - Edition: utils.Ptr("developer"), - RetentionDays: utils.Ptr(int64(32)), + Version: "6.0", + RetentionDays: utils.Ptr(int32(32)), } for _, mod := range mods { mod(model) @@ -104,19 +103,18 @@ func fixtureRequest(mods ...func(request *sqlserverflex.ApiCreateInstanceRequest func fixturePayload(mods ...func(payload *sqlserverflex.CreateInstancePayload)) sqlserverflex.CreateInstancePayload { payload := sqlserverflex.CreateInstancePayload{ - Name: "example-name", - Acl: &sqlserverflex.InstanceDocumentationACL{Items: []string{"0.0.0.0/0"}}, - BackupSchedule: utils.Ptr("0 0/6 * * *"), - FlavorId: testFlavorId, - Storage: &sqlserverflex.InstanceDocumentationStorage{ - Class: utils.Ptr("storage-class"), - Size: utils.Ptr(int64(10)), + Name: "example-name", + Network: sqlserverflex.CreateInstancePayloadNetwork{ + Acl: []string{"0.0.0.0/0"}, }, - Version: utils.Ptr("6.0"), - Options: &sqlserverflex.InstanceDocumentationOptions{ - Edition: utils.Ptr("developer"), - RetentionDays: utils.Ptr("32"), + BackupSchedule: "0 0/6 * * *", + FlavorId: testFlavorId, + Storage: sqlserverflex.StorageCreate{ + Class: "storage-class", + Size: int64(10), }, + Version: "6.0", + RetentionDays: 32, } for _, mod := range mods { mod(&payload) @@ -149,8 +147,8 @@ func TestParseInput(t *testing.T) { isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { model.FlavorId = nil - model.CPU = utils.Ptr(int32(2)) - model.RAM = utils.Ptr(int32(4)) + model.CPU = utils.Ptr(int64(2)) + model.RAM = utils.Ptr(int64(4)) }), }, { @@ -206,10 +204,7 @@ func TestParseInput(t *testing.T) { flagValues: fixtureFlagValues(func(flagValues map[string]string) { delete(flagValues, versionFlag) }), - isValid: true, - expectedModel: fixtureInputModel(func(model *inputModel) { - model.Version = nil - }), + isValid: false, }, { description: "repeated acl flags", @@ -268,19 +263,21 @@ func TestBuildRequest(t *testing.T) { isValid: true, expectedRequest: fixtureRequest(), listFlavorsResp: &sqlserverflex.ListFlavorsResponse{ - Flavors: []sqlserverflex.InstanceFlavorEntry{ + Flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr(testFlavorId), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(4)), + Id: testFlavorId, + Cpu: int64(2), + Memory: int64(4), }, }, }, listStoragesResp: &sqlserverflex.ListStoragesResponse{ - StorageClasses: []string{"storage-class"}, - StorageRange: &sqlserverflex.StorageRange{ - Min: utils.Ptr(int64(10)), - Max: utils.Ptr(int64(100)), + StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{{ + Class: "storage-class", + }}, + StorageRange: sqlserverflex.FlavorStorageRange{ + Min: 10, + Max: 100, }, }, }, @@ -289,31 +286,33 @@ func TestBuildRequest(t *testing.T) { model: fixtureInputModel( func(model *inputModel) { model.FlavorId = nil - model.CPU = utils.Ptr(int32(2)) - model.RAM = utils.Ptr(int32(4)) + model.CPU = utils.Ptr(int64(2)) + model.RAM = utils.Ptr(int64(4)) }, ), isValid: true, expectedRequest: fixtureRequest(), listFlavorsResp: &sqlserverflex.ListFlavorsResponse{ - Flavors: []sqlserverflex.InstanceFlavorEntry{ + Flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr(testFlavorId), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(4)), + Id: testFlavorId, + Cpu: int64(2), + Memory: int64(4), }, { - Id: utils.Ptr("other-flavor"), - Cpu: utils.Ptr(int32(1)), - Memory: utils.Ptr(int32(8)), + Id: "other-flavor", + Cpu: int64(1), + Memory: int64(8), }, }, }, listStoragesResp: &sqlserverflex.ListStoragesResponse{ - StorageClasses: []string{"storage-class"}, - StorageRange: &sqlserverflex.StorageRange{ - Min: utils.Ptr(int64(10)), - Max: utils.Ptr(int64(100)), + StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{{ + Class: "storage-class", + }}, + StorageRange: sqlserverflex.FlavorStorageRange{ + Min: int32(10), + Max: int32(100), }, }, }, @@ -322,8 +321,8 @@ func TestBuildRequest(t *testing.T) { model: fixtureInputModel( func(model *inputModel) { model.FlavorId = nil - model.CPU = utils.Ptr(int32(2)) - model.RAM = utils.Ptr(int32(4)) + model.CPU = utils.Ptr(int64(2)) + model.RAM = utils.Ptr(int64(4)) }, ), listFlavorsFails: true, @@ -334,21 +333,21 @@ func TestBuildRequest(t *testing.T) { model: fixtureInputModel( func(model *inputModel) { model.FlavorId = nil - model.CPU = utils.Ptr(int32(5)) - model.RAM = utils.Ptr(int32(9)) + model.CPU = utils.Ptr(int64(5)) + model.RAM = utils.Ptr(int64(9)) }, ), listFlavorsResp: &sqlserverflex.ListFlavorsResponse{ - Flavors: []sqlserverflex.InstanceFlavorEntry{ + Flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr(testFlavorId), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(4)), + Id: testFlavorId, + Cpu: int64(2), + Memory: int64(4), }, { - Id: utils.Ptr("other-flavor"), - Cpu: utils.Ptr(int32(1)), - Memory: utils.Ptr(int32(8)), + Id: "other-flavor", + Cpu: int64(1), + Memory: int64(8), }, }, }, @@ -359,8 +358,8 @@ func TestBuildRequest(t *testing.T) { model: fixtureInputModel( func(model *inputModel) { model.FlavorId = nil - model.CPU = utils.Ptr(int32(2)) - model.RAM = utils.Ptr(int32(4)) + model.CPU = utils.Ptr(int64(2)) + model.RAM = utils.Ptr(int64(4)) }, ), listFlavorsFails: true, @@ -370,23 +369,25 @@ func TestBuildRequest(t *testing.T) { description: "invalid storage class", model: fixtureInputModel( func(model *inputModel) { - model.StorageClass = utils.Ptr("non-existing-class") + model.StorageClass = "non-existing-class" }, ), listFlavorsResp: &sqlserverflex.ListFlavorsResponse{ - Flavors: []sqlserverflex.InstanceFlavorEntry{ + Flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr(testFlavorId), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(4)), + Id: testFlavorId, + Cpu: int64(2), + Memory: int64(4), }, }, }, listStoragesResp: &sqlserverflex.ListStoragesResponse{ - StorageClasses: []string{"storage-class"}, - StorageRange: &sqlserverflex.StorageRange{ - Min: utils.Ptr(int64(10)), - Max: utils.Ptr(int64(100)), + StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{{ + Class: "storage-class", + }}, + StorageRange: sqlserverflex.FlavorStorageRange{ + Min: int32(10), + Max: int32(100), }, }, isValid: false, @@ -399,19 +400,21 @@ func TestBuildRequest(t *testing.T) { }, ), listFlavorsResp: &sqlserverflex.ListFlavorsResponse{ - Flavors: []sqlserverflex.InstanceFlavorEntry{ + Flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr(testFlavorId), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(4)), + Id: testFlavorId, + Cpu: int64(2), + Memory: int64(4), }, }, }, listStoragesResp: &sqlserverflex.ListStoragesResponse{ - StorageClasses: []string{"storage-class"}, - StorageRange: &sqlserverflex.StorageRange{ - Min: utils.Ptr(int64(10)), - Max: utils.Ptr(int64(100)), + StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{{ + Class: "storage-class", + }}, + StorageRange: sqlserverflex.FlavorStorageRange{ + Min: int32(10), + Max: int32(100), }, }, isValid: false, diff --git a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go index 77a268d97..f662ffcb0 100644 --- a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go @@ -17,8 +17,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api/wait" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api/wait" ) const ( @@ -76,7 +76,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { err := spinner.Run(params.Printer, "Deleting instance", func() error { - _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.InstanceId, model.Region).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.InstanceId).WaitWithContext(ctx) return err }) if err != nil { @@ -113,6 +113,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiDeleteInstanceRequest { - req := apiClient.DefaultAPI.DeleteInstance(ctx, model.ProjectId, model.InstanceId, model.Region) + req := apiClient.DefaultAPI.DeleteInstance(ctx, model.ProjectId, model.Region, model.InstanceId) return req } diff --git a/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go b/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go index e2bd2ce46..93892d4c4 100644 --- a/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go @@ -10,7 +10,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" ) type testCtxKey struct{} @@ -59,7 +59,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiDeleteInstanceRequest)) sqlserverflex.ApiDeleteInstanceRequest { - request := testClient.DefaultAPI.DeleteInstance(testCtx, testProjectId, testInstanceId, testRegion) + request := testClient.DefaultAPI.DeleteInstance(testCtx, testProjectId, testRegion, testInstanceId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go index bb156eea9..7395dfb2a 100644 --- a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go @@ -5,6 +5,7 @@ import ( "fmt" "strings" + sqlserverflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -17,7 +18,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" ) const ( @@ -61,8 +62,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("read SQLServer Flex instance: %w", err) } + flavor, err := sqlserverflexUtils.GetFlavor(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, resp.FlavorId) + if err != nil { + return fmt.Errorf("get flavor: %w", err) + } - return outputResult(params.Printer, model.OutputFormat, resp.Item) + return outputResult(params.Printer, model.OutputFormat, resp, flavor) }, } return cmd @@ -86,47 +91,39 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiGetInstanceRequest { - req := apiClient.DefaultAPI.GetInstance(ctx, model.ProjectId, model.InstanceId, model.Region) + req := apiClient.DefaultAPI.GetInstance(ctx, model.ProjectId, model.Region, model.InstanceId) return req } -func outputResult(p *print.Printer, outputFormat string, instance *sqlserverflex.Instance) error { +func outputResult(p *print.Printer, outputFormat string, instance *sqlserverflex.GetInstanceResponse, flavor *sqlserverflex.ListFlavors) error { if instance == nil { return fmt.Errorf("instance response is empty") } return p.OutputResult(outputFormat, instance, func() error { - var acls string - if instance.Acl != nil && instance.Acl.HasItems() { - aclsArray := instance.Acl.Items - acls = strings.Join(aclsArray, ",") - } + acls := strings.Join(instance.Network.Acl, ", ") table := tables.NewTable() - table.AddRow("ID", utils.PtrString(instance.Id)) + table.AddRow("ID", instance.Id) table.AddSeparator() - table.AddRow("NAME", utils.PtrString(instance.Name)) + table.AddRow("NAME", instance.Name) table.AddSeparator() - table.AddRow("STATUS", utils.PtrString(instance.Status)) + table.AddRow("STATUS", instance.State) table.AddSeparator() - if instance.Storage != nil { - table.AddRow("STORAGE SIZE (GB)", utils.PtrString(instance.Storage.Size)) - table.AddSeparator() - } - table.AddRow("VERSION", utils.PtrString(instance.Version)) + table.AddRow("STORAGE SIZE (GB)", utils.PtrString(instance.Storage.Size)) + table.AddSeparator() + table.AddRow("VERSION", instance.Version) table.AddSeparator() - table.AddRow("BACKUP SCHEDULE (UTC)", utils.PtrString(instance.BackupSchedule)) + table.AddRow("BACKUP SCHEDULE (UTC)", instance.BackupSchedule) table.AddSeparator() table.AddRow("ACL", acls) table.AddSeparator() - if instance.Flavor != nil { - table.AddRow("FLAVOR DESCRIPTION", utils.PtrString(instance.Flavor.Description)) - table.AddSeparator() - table.AddRow("CPU", utils.PtrString(instance.Flavor.Cpu)) - table.AddSeparator() - table.AddRow("RAM (GB)", utils.PtrString(instance.Flavor.Memory)) - table.AddSeparator() - } + table.AddRow("FLAVOR DESCRIPTION", flavor.Description) + table.AddSeparator() + table.AddRow("CPU", flavor.Cpu) + table.AddSeparator() + table.AddRow("RAM (GB)", flavor.Memory) + table.AddSeparator() err := table.Display(p) if err != nil { return fmt.Errorf("render table: %w", err) diff --git a/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go index 842fe10d0..1f2c66311 100644 --- a/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go @@ -7,7 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -61,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiGetInstanceRequest)) sqlserverflex.ApiGetInstanceRequest { - request := testClient.DefaultAPI.GetInstance(testCtx, testProjectId, testInstanceId, testRegion) + request := testClient.DefaultAPI.GetInstance(testCtx, testProjectId, testRegion, testInstanceId) for _, mod := range mods { mod(&request) } @@ -177,7 +177,8 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string - instance *sqlserverflex.Instance + instance *sqlserverflex.GetInstanceResponse + flavor *sqlserverflex.ListFlavors } tests := []struct { name string @@ -192,7 +193,8 @@ func TestOutputResult(t *testing.T) { { name: "instance as argument", args: args{ - instance: &sqlserverflex.Instance{}, + instance: &sqlserverflex.GetInstanceResponse{}, + flavor: &sqlserverflex.ListFlavors{}, }, wantErr: false, }, @@ -201,7 +203,7 @@ func TestOutputResult(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(params.Printer, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { + if err := outputResult(params.Printer, tt.args.outputFormat, tt.args.instance, tt.args.flavor); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list.go b/internal/cmd/beta/sqlserverflex/instance/list/list.go index 60de6af3a..78a4b8d78 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list.go @@ -7,7 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -18,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) const ( @@ -66,7 +65,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get SQLServer Flex instances: %w", err) } - instances := resp.GetItems() + instances := resp.Instances projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { @@ -119,7 +118,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverfl return req } -func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []sqlserverflex.InstanceListInstance) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []sqlserverflex.ListInstance) error { return p.OutputResult(outputFormat, instances, func() error { if len(instances) == 0 { p.Outputf("No instances found for project %q\n", projectLabel) @@ -131,9 +130,9 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, instances for i := range instances { instance := instances[i] table.AddRow( - utils.PtrString(instance.Id), - utils.PtrString(instance.Name), - utils.PtrString(instance.Status), + instance.Id, + instance.Name, + instance.State, ) } err := table.Display(p) diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go index 2059cb2e6..7ed2c0aca 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go @@ -7,7 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -154,7 +154,7 @@ func TestOutputResult(t *testing.T) { type args struct { outputFormat string projectLabel string - instances []sqlserverflex.InstanceListInstance + instances []sqlserverflex.ListInstance } tests := []struct { name string @@ -169,7 +169,7 @@ func TestOutputResult(t *testing.T) { { name: "empty instance in instances slice", args: args{ - instances: []sqlserverflex.InstanceListInstance{{}}, + instances: []sqlserverflex.ListInstance{{}}, }, wantErr: false, }, diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update.go b/internal/cmd/beta/sqlserverflex/instance/update/update.go index 95649cc54..ecadebaad 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update.go @@ -19,22 +19,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api/wait" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api/wait" ) -// enforce implementation of interfaces -var ( - _ sqlServerFlexClient = sqlserverflex.APIClient{}.DefaultAPI -) - -type sqlServerFlexClient interface { - PartialUpdateInstance(ctx context.Context, projectId, instanceId string, region string) sqlserverflex.ApiPartialUpdateInstanceRequest - GetInstance(ctx context.Context, projectId, instanceId string, region string) sqlserverflex.ApiGetInstanceRequest - ListFlavors(ctx context.Context, projectId string, region string) sqlserverflex.ApiListFlavorsRequest - ListStorages(ctx context.Context, projectId, flavorId string, region string) sqlserverflex.ApiListStoragesRequest -} - const ( instanceIdArg = "INSTANCE_ID" @@ -55,8 +43,8 @@ type inputModel struct { ACL []string BackupSchedule *string FlavorId *string - CPU *int32 - RAM *int32 + CPU *int64 + RAM *int64 Version *string } @@ -105,24 +93,30 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if err != nil { return err } - resp, err := req.Execute() + err = req.Execute() if err != nil { return fmt.Errorf("update SQLServer Flex instance: %w", err) } - instanceId := *resp.Item.Id + var instance *sqlserverflex.GetInstanceResponse // Wait for async operation, if async mode not enabled if !model.Async { err := spinner.Run(params.Printer, "Updating instance", func() error { - _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) + instance, err = wait.UpdateInstanceWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.InstanceId).WaitWithContext(ctx) return err }) if err != nil { return fmt.Errorf("wait for SQLServer Flex instance update: %w", err) } } + if instance == nil { + instance, err = apiClient.DefaultAPI.GetInstance(ctx, model.ProjectId, model.Region, model.InstanceId).Execute() + if err != nil { + return fmt.Errorf("get SQLServer Flex instance: %w", err) + } + } - return outputResult(params.Printer, model, instanceLabel, resp) + return outputResult(params.Printer, model, instanceLabel, instance) }, } configureFlags(cmd) @@ -134,8 +128,8 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Var(flags.CIDRSliceFlag(), aclFlag, "Lists of IP networks in CIDR notation which are allowed to access this instance") cmd.Flags().String(backupScheduleFlag, "", "Backup schedule") cmd.Flags().String(flavorIdFlag, "", "ID of the flavor") - cmd.Flags().Int32(cpuFlag, 0, "Number of CPUs") - cmd.Flags().Int32(ramFlag, 0, "Amount of RAM (in GB)") + cmd.Flags().Int64(cpuFlag, 0, "Number of CPUs") + cmd.Flags().Int64(ramFlag, 0, "Amount of RAM (in GB)") cmd.Flags().String(versionFlag, "", "Version") } @@ -149,8 +143,8 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu instanceName := flags.FlagToStringPointer(p, cmd, instanceNameFlag) flavorId := flags.FlagToStringPointer(p, cmd, flavorIdFlag) - cpu := flags.FlagToInt32Pointer(p, cmd, cpuFlag) - ram := flags.FlagToInt32Pointer(p, cmd, ramFlag) + cpu := flags.FlagToInt64Pointer(p, cmd, cpuFlag) + ram := flags.FlagToInt64Pointer(p, cmd, ramFlag) acl := flags.FlagToStringSliceValue(p, cmd, aclFlag) backupSchedule := flags.FlagToStringPointer(p, cmd, backupScheduleFlag) version := flags.FlagToStringPointer(p, cmd, versionFlag) @@ -184,8 +178,8 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient sqlServerFlexClient) (sqlserverflex.ApiPartialUpdateInstanceRequest, error) { - req := apiClient.PartialUpdateInstance(ctx, model.ProjectId, model.InstanceId, model.Region) +func buildRequest(ctx context.Context, model *inputModel, apiClient sqlserverflex.DefaultAPI) (sqlserverflex.ApiPartialUpdateInstanceRequest, error) { + req := apiClient.PartialUpdateInstance(ctx, model.ProjectId, model.Region, model.InstanceId) var flavorId *string var err error @@ -199,18 +193,27 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient sqlServerFle ram := model.RAM cpu := model.CPU if model.RAM == nil || model.CPU == nil { - currentInstance, err := apiClient.GetInstance(ctx, model.ProjectId, model.InstanceId, model.Region).Execute() + currentInstance, err := apiClient.GetInstance(ctx, model.ProjectId, model.Region, model.InstanceId).Execute() if err != nil { return req, fmt.Errorf("get SQLServer Flex instance: %w", err) } + var currentFlavor *sqlserverflex.ListFlavors + for _, flavor := range flavors.Flavors { + if flavor.Id == currentInstance.FlavorId { + currentFlavor = &flavor + } + } + if currentFlavor == nil { + return req, fmt.Errorf("can't find flavor %s in flavors list", currentInstance.FlavorId) + } if model.RAM == nil { - ram = currentInstance.Item.Flavor.Memory + ram = ¤tFlavor.Memory } if model.CPU == nil { - cpu = currentInstance.Item.Flavor.Cpu + cpu = ¤tFlavor.Cpu } } - flavorId, err = sqlserverflexUtils.LoadFlavorId(*cpu, *ram, flavors.Flavors) + loadedId, err := sqlserverflexUtils.LoadFlavorId(*cpu, *ram, flavors.Flavors) if err != nil { var dsaInvalidPlanError *cliErr.DSAInvalidPlanError if !errors.As(err, &dsaInvalidPlanError) { @@ -218,6 +221,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient sqlServerFle } return req, err } + flavorId = &loadedId } else if model.FlavorId != nil { err := sqlserverflexUtils.ValidateFlavorId(*model.FlavorId, flavors.Flavors) if err != nil { @@ -226,22 +230,24 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient sqlServerFle flavorId = model.FlavorId } - var payloadAcl *sqlserverflex.InstanceDocumentationACL + var network *sqlserverflex.PartialUpdateInstancePayloadNetwork if model.ACL != nil { - payloadAcl = &sqlserverflex.InstanceDocumentationACL{Items: model.ACL} + network = &sqlserverflex.PartialUpdateInstancePayloadNetwork{ + Acl: model.ACL, + } } req = req.PartialUpdateInstancePayload(sqlserverflex.PartialUpdateInstancePayload{ Name: model.InstanceName, - Acl: payloadAcl, + Network: network, BackupSchedule: model.BackupSchedule, FlavorId: flavorId, - Version: model.Version, + Version: (*sqlserverflex.InstanceVersionOpt)(model.Version), }) return req, nil } -func outputResult(p *print.Printer, model *inputModel, instanceLabel string, resp *sqlserverflex.UpdateInstanceResponse) error { +func outputResult(p *print.Printer, model *inputModel, instanceLabel string, resp *sqlserverflex.GetInstanceResponse) error { if resp == nil { return fmt.Errorf("instance response is empty") } diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update_test.go b/internal/cmd/beta/sqlserverflex/instance/update/update_test.go index 22578bdec..4b4c4a86a 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update_test.go @@ -8,7 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -132,7 +132,7 @@ func fixtureStandardInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiPartialUpdateInstanceRequest)) sqlserverflex.ApiPartialUpdateInstanceRequest { - request := testClient.DefaultAPI.PartialUpdateInstance(testCtx, testProjectId, testInstanceId, testRegion) + request := testClient.DefaultAPI.PartialUpdateInstance(testCtx, testProjectId, testRegion, testInstanceId) request = request.PartialUpdateInstancePayload(sqlserverflex.PartialUpdateInstancePayload{}) for _, mod := range mods { mod(&request) @@ -192,8 +192,8 @@ func TestParseInput(t *testing.T) { isValid: true, expectedModel: fixtureStandardInputModel(func(model *inputModel) { model.FlavorId = nil - model.CPU = utils.Ptr(int32(2)) - model.RAM = utils.Ptr(int32(4)) + model.CPU = utils.Ptr(int64(2)) + model.RAM = utils.Ptr(int64(4)) }), }, { @@ -364,15 +364,15 @@ func TestBuildRequest(t *testing.T) { }), isValid: true, listFlavorsResp: &sqlserverflex.ListFlavorsResponse{ - Flavors: []sqlserverflex.InstanceFlavorEntry{ + Flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr(testFlavorId), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(4)), + Id: testFlavorId, + Cpu: int64(2), + Memory: int64(4), }, }, }, - expectedRequest: testClient.DefaultAPI.PartialUpdateInstance(testCtx, testProjectId, testInstanceId, testRegion). + expectedRequest: testClient.DefaultAPI.PartialUpdateInstance(testCtx, testProjectId, testRegion, testInstanceId). PartialUpdateInstancePayload(sqlserverflex.PartialUpdateInstancePayload{ FlavorId: utils.Ptr(testFlavorId), }), @@ -380,20 +380,20 @@ func TestBuildRequest(t *testing.T) { { description: "update flavor from cpu and ram", model: fixtureRequiredInputModel(func(model *inputModel) { - model.CPU = utils.Ptr(int32(2)) - model.RAM = utils.Ptr(int32(4)) + model.CPU = utils.Ptr(int64(2)) + model.RAM = utils.Ptr(int64(4)) }), isValid: true, listFlavorsResp: &sqlserverflex.ListFlavorsResponse{ - Flavors: []sqlserverflex.InstanceFlavorEntry{ + Flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr(testFlavorId), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(4)), + Id: testFlavorId, + Cpu: int64(2), + Memory: int64(4), }, }, }, - expectedRequest: testClient.DefaultAPI.PartialUpdateInstance(testCtx, testProjectId, testInstanceId, testRegion). + expectedRequest: testClient.DefaultAPI.PartialUpdateInstance(testCtx, testProjectId, testRegion, testInstanceId). PartialUpdateInstancePayload(sqlserverflex.PartialUpdateInstancePayload{ FlavorId: utils.Ptr(testFlavorId), }), @@ -402,8 +402,8 @@ func TestBuildRequest(t *testing.T) { description: "get flavors fails", model: fixtureRequiredInputModel( func(model *inputModel) { - model.CPU = utils.Ptr(int32(2)) - model.RAM = utils.Ptr(int32(4)) + model.CPU = utils.Ptr(int64(2)) + model.RAM = utils.Ptr(int64(4)) }, ), listFlavorsFails: true, @@ -413,21 +413,21 @@ func TestBuildRequest(t *testing.T) { description: "flavor id not found", model: fixtureRequiredInputModel( func(model *inputModel) { - model.CPU = utils.Ptr(int32(5)) - model.RAM = utils.Ptr(int32(9)) + model.CPU = utils.Ptr(int64(5)) + model.RAM = utils.Ptr(int64(9)) }, ), listFlavorsResp: &sqlserverflex.ListFlavorsResponse{ - Flavors: []sqlserverflex.InstanceFlavorEntry{ + Flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr(testFlavorId), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(4)), + Id: testFlavorId, + Cpu: int64(2), + Memory: int64(4), }, { - Id: utils.Ptr("other-flavor"), - Cpu: utils.Ptr(int32(1)), - Memory: utils.Ptr(int32(8)), + Id: "other-flavor", + Cpu: int64(1), + Memory: int64(8), }, }, }, @@ -438,7 +438,7 @@ func TestBuildRequest(t *testing.T) { model: fixtureRequiredInputModel( func(model *inputModel) { model.FlavorId = nil - model.RAM = utils.Ptr(int32(4)) + model.RAM = utils.Ptr(int64(4)) }, ), getInstanceFails: true, @@ -449,8 +449,8 @@ func TestBuildRequest(t *testing.T) { model: fixtureRequiredInputModel( func(model *inputModel) { model.FlavorId = nil - model.CPU = utils.Ptr(int32(2)) - model.RAM = utils.Ptr(int32(4)) + model.CPU = utils.Ptr(int64(2)) + model.RAM = utils.Ptr(int64(4)) }, ), listFlavorsFails: true, @@ -498,7 +498,7 @@ func TestOutputResult(t *testing.T) { type args struct { model *inputModel instanceLabel string - resp *sqlserverflex.UpdateInstanceResponse + resp *sqlserverflex.GetInstanceResponse } tests := []struct { name string @@ -514,7 +514,7 @@ func TestOutputResult(t *testing.T) { name: "instance as argument", args: args{ model: fixtureRequiredInputModel(), - resp: &sqlserverflex.UpdateInstanceResponse{}, + resp: &sqlserverflex.GetInstanceResponse{}, }, wantErr: false, }, diff --git a/internal/cmd/beta/sqlserverflex/options/options.go b/internal/cmd/beta/sqlserverflex/options/options.go index 144be47f3..abbfdf5fd 100644 --- a/internal/cmd/beta/sqlserverflex/options/options.go +++ b/internal/cmd/beta/sqlserverflex/options/options.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,23 +16,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" ) -// enforce implementation of interfaces -var ( - _ sqlServerFlexOptionsClient = sqlserverflex.APIClient{}.DefaultAPI -) - -type sqlServerFlexOptionsClient interface { - ListFlavors(ctx context.Context, projectId string, region string) sqlserverflex.ApiListFlavorsRequest - ListVersions(ctx context.Context, projectId string, region string) sqlserverflex.ApiListVersionsRequest - ListStorages(ctx context.Context, projectId, flavorId string, region string) sqlserverflex.ApiListStoragesRequest - ListRoles(ctx context.Context, projectId string, instanceId string, region string) sqlserverflex.ApiListRolesRequest - ListCollations(ctx context.Context, projectId string, instanceId string, region string) sqlserverflex.ApiListCollationsRequest - ListCompatibility(ctx context.Context, projectId string, instanceId string, region string) sqlserverflex.ApiListCompatibilityRequest -} - const ( flavorsFlag = "flavors" versionsFlag = "versions" @@ -59,12 +46,12 @@ type inputModel struct { } type options struct { - Flavors []sqlserverflex.InstanceFlavorEntry `json:"flavors,omitempty"` - Versions []string `json:"versions,omitempty"` - Storages *flavorStorages `json:"flavorStorages,omitempty"` - UserRoles *instanceUserRoles `json:"userRoles,omitempty"` - DBCollations *instanceDBCollations `json:"dbCollations,omitempty"` - DBCompatibilities *instanceDBCompatibilities `json:"dbCompatibilities,omitempty"` + Flavors []sqlserverflex.ListFlavors `json:"flavors,omitempty"` + Versions []sqlserverflex.Version `json:"versions,omitempty"` + Storages *flavorStorages `json:"flavorStorages,omitempty"` + UserRoles *instanceUserRoles `json:"userRoles,omitempty"` + DBCollations *instanceDBCollations `json:"dbCollations,omitempty"` + DBCompatibilities *instanceDBCompatibilities `json:"dbCompatibilities,omitempty"` } type flavorStorages struct { @@ -78,13 +65,13 @@ type instanceUserRoles struct { } type instanceDBCollations struct { - InstanceId string `json:"instanceId"` - DBCollations []sqlserverflex.MssqlDatabaseCollation `json:"dbCollations"` + InstanceId string `json:"instanceId"` + DBCollations []sqlserverflex.DatabaseGetcollation `json:"dbCollations"` } type instanceDBCompatibilities struct { - InstanceId string `json:"instanceId"` - DBCompatibilities []sqlserverflex.MssqlDatabaseCompatibility `json:"dbCompatibilities"` + InstanceId string `json:"instanceId"` + DBCompatibilities []sqlserverflex.DatabaseGetcompatibility `json:"dbCompatibilities"` } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -193,7 +180,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, return &model, nil } -func buildAndExecuteRequest(ctx context.Context, p *print.Printer, model *inputModel, apiClient sqlServerFlexOptionsClient) error { +func buildAndExecuteRequest(ctx context.Context, p *print.Printer, model *inputModel, apiClient sqlserverflex.DefaultAPI) error { var flavors *sqlserverflex.ListFlavorsResponse var versions *sqlserverflex.ListVersionsResponse var storages *sqlserverflex.ListStoragesResponse @@ -215,25 +202,25 @@ func buildAndExecuteRequest(ctx context.Context, p *print.Printer, model *inputM } } if model.Storages { - storages, err = apiClient.ListStorages(ctx, model.ProjectId, *model.FlavorId, model.Region).Execute() + storages, err = apiClient.ListStorages(ctx, model.ProjectId, model.Region, *model.FlavorId).Execute() if err != nil { return fmt.Errorf("get SQL Server Flex storages: %w", err) } } if model.UserRoles { - userRoles, err = apiClient.ListRoles(ctx, model.ProjectId, *model.InstanceId, model.Region).Execute() + userRoles, err = apiClient.ListRoles(ctx, model.ProjectId, model.Region, *model.InstanceId).Execute() if err != nil { return fmt.Errorf("get SQL Server Flex user roles: %w", err) } } if model.DBCollations { - dbCollations, err = apiClient.ListCollations(ctx, model.ProjectId, *model.InstanceId, model.Region).Execute() + dbCollations, err = apiClient.ListCollations(ctx, model.ProjectId, model.Region, *model.InstanceId).Execute() if err != nil { return fmt.Errorf("get SQL Server Flex DB collations: %w", err) } } if model.DBCompatibilities { - dbCompatibilities, err = apiClient.ListCompatibility(ctx, model.ProjectId, *model.InstanceId, model.Region).Execute() + dbCompatibilities, err = apiClient.ListCompatibilities(ctx, model.ProjectId, model.Region, *model.InstanceId).Execute() if err != nil { return fmt.Errorf("get SQL Server Flex DB compatibilities: %w", err) } @@ -306,24 +293,24 @@ func outputResult(p *print.Printer, model *inputModel, flavors *sqlserverflex.Li }) } -func buildFlavorsTable(flavors []sqlserverflex.InstanceFlavorEntry) tables.Table { +func buildFlavorsTable(flavors []sqlserverflex.ListFlavors) tables.Table { table := tables.NewTable() table.SetTitle("Flavors") - table.SetHeader("ID", "CPU", "MEMORY", "DESCRIPTION", "VALID INSTANCE TYPES") + table.SetHeader("ID", "CPU", "MEMORY", "DESCRIPTION") for i := range flavors { f := flavors[i] - table.AddRow(*f.Id, *f.Cpu, *f.Memory, *f.Description, *f.Categories) + table.AddRow(f.Id, f.Cpu, f.Memory, f.Description) } return table } -func buildVersionsTable(versions []string) tables.Table { +func buildVersionsTable(versions []sqlserverflex.Version) tables.Table { table := tables.NewTable() table.SetTitle("Versions") - table.SetHeader("VERSION") + table.SetHeader("VERSION", "RECOMMENDED", "BETA", "DEPRECATED") for i := range versions { v := versions[i] - table.AddRow(v) + table.AddRow(v.Version, v.Recommend, v.Beta, v.Deprecated) } return table } @@ -335,7 +322,7 @@ func buildStoragesTable(storagesResp sqlserverflex.ListStoragesResponse) tables. table.SetHeader("MINIMUM", "MAXIMUM", "STORAGE CLASS") for i := range storages { sc := storages[i] - table.AddRow(*storagesResp.StorageRange.Min, *storagesResp.StorageRange.Max, sc) + table.AddRow(storagesResp.StorageRange.Min, storagesResp.StorageRange.Max, sc.Class) } table.EnableAutoMergeOnColumns(1, 2, 3) return table @@ -351,22 +338,28 @@ func buildUserRoles(roles *instanceUserRoles) tables.Table { return table } -func buildDBCollationsTable(dbCollations []sqlserverflex.MssqlDatabaseCollation) tables.Table { +func buildDBCollationsTable(dbCollations []sqlserverflex.DatabaseGetcollation) tables.Table { table := tables.NewTable() table.SetTitle("DB Collations") table.SetHeader("NAME", "DESCRIPTION") for i := range dbCollations { - table.AddRow(dbCollations[i].CollationName, dbCollations[i].Description) + table.AddRow( + utils.PtrString(dbCollations[i].CollationName), + utils.PtrString(dbCollations[i].Description), + ) } return table } -func buildDBCompatibilitiesTable(dbCompatibilities []sqlserverflex.MssqlDatabaseCompatibility) tables.Table { +func buildDBCompatibilitiesTable(dbCompatibilities []sqlserverflex.DatabaseGetcompatibility) tables.Table { table := tables.NewTable() table.SetTitle("DB Compatibilities") table.SetHeader("COMPATIBILITY LEVEL", "DESCRIPTION") for i := range dbCompatibilities { - table.AddRow(dbCompatibilities[i].CompatibilityLevel, dbCompatibilities[i].Description) + table.AddRow( + utils.PtrString(dbCompatibilities[i].CompatibilityLevel), + utils.PtrString(dbCompatibilities[i].Description), + ) } return table } diff --git a/internal/cmd/beta/sqlserverflex/options/options_test.go b/internal/cmd/beta/sqlserverflex/options/options_test.go index 3ac471dd2..52b9ce0c4 100644 --- a/internal/cmd/beta/sqlserverflex/options/options_test.go +++ b/internal/cmd/beta/sqlserverflex/options/options_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -44,7 +44,7 @@ func newAPIMock(s *mockSettings) sqlserverflex.DefaultAPI { return nil, fmt.Errorf("list flavors failed") } return utils.Ptr(sqlserverflex.ListFlavorsResponse{ - Flavors: []sqlserverflex.InstanceFlavorEntry{}, + Flavors: []sqlserverflex.ListFlavors{}, }), nil }), ListVersionsExecuteMock: utils.Ptr(func(_ sqlserverflex.ApiListVersionsRequest) (*sqlserverflex.ListVersionsResponse, error) { @@ -53,7 +53,7 @@ func newAPIMock(s *mockSettings) sqlserverflex.DefaultAPI { return nil, fmt.Errorf("list versions failed") } return utils.Ptr(sqlserverflex.ListVersionsResponse{ - Versions: []string{}, + Versions: []sqlserverflex.Version{}, }), nil }), ListStoragesExecuteMock: utils.Ptr(func(_ sqlserverflex.ApiListStoragesRequest) (*sqlserverflex.ListStoragesResponse, error) { @@ -62,10 +62,10 @@ func newAPIMock(s *mockSettings) sqlserverflex.DefaultAPI { return nil, fmt.Errorf("list storages failed") } return utils.Ptr(sqlserverflex.ListStoragesResponse{ - StorageClasses: []string{}, - StorageRange: &sqlserverflex.StorageRange{ - Min: utils.Ptr(int64(10)), - Max: utils.Ptr(int64(100)), + StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{}, + StorageRange: sqlserverflex.FlavorStorageRange{ + Min: int32(10), + Max: int32(100), }, }), nil }), @@ -84,16 +84,16 @@ func newAPIMock(s *mockSettings) sqlserverflex.DefaultAPI { return nil, fmt.Errorf("list collations failed") } return utils.Ptr(sqlserverflex.ListCollationsResponse{ - Collations: []sqlserverflex.MssqlDatabaseCollation{}, + Collations: []sqlserverflex.DatabaseGetcollation{}, }), nil }), - ListCompatibilityExecuteMock: utils.Ptr(func(_ sqlserverflex.ApiListCompatibilityRequest) (*sqlserverflex.ListCompatibilityResponse, error) { + ListCompatibilitiesExecuteMock: utils.Ptr(func(_ sqlserverflex.ApiListCompatibilitiesRequest) (*sqlserverflex.ListCompatibilityResponse, error) { s.listDBCompatibilitiesCalled = true if s.listDBCompatibilitiesFails { return nil, fmt.Errorf("list compatibilities failed") } return utils.Ptr(sqlserverflex.ListCompatibilityResponse{ - Compatibilities: []sqlserverflex.MssqlDatabaseCompatibility{}, + Compatibilities: []sqlserverflex.DatabaseGetcompatibility{}, }), nil }), } @@ -489,12 +489,12 @@ func TestOutputResult(t *testing.T) { name: "all input set", args: args{ model: fixtureInputModelAllTrue(), - flavors: &sqlserverflex.ListFlavorsResponse{Flavors: []sqlserverflex.InstanceFlavorEntry{}}, - versions: &sqlserverflex.ListVersionsResponse{Versions: []string{}}, - storages: &sqlserverflex.ListStoragesResponse{StorageClasses: []string{}}, + flavors: &sqlserverflex.ListFlavorsResponse{Flavors: []sqlserverflex.ListFlavors{}}, + versions: &sqlserverflex.ListVersionsResponse{Versions: []sqlserverflex.Version{}}, + storages: &sqlserverflex.ListStoragesResponse{StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{}}, userRoles: &sqlserverflex.ListRolesResponse{Roles: []string{}}, - dbCollations: &sqlserverflex.ListCollationsResponse{Collations: []sqlserverflex.MssqlDatabaseCollation{}}, - dbCompatibilities: &sqlserverflex.ListCompatibilityResponse{Compatibilities: []sqlserverflex.MssqlDatabaseCompatibility{}}, + dbCollations: &sqlserverflex.ListCollationsResponse{Collations: []sqlserverflex.DatabaseGetcollation{}}, + dbCompatibilities: &sqlserverflex.ListCompatibilityResponse{Compatibilities: []sqlserverflex.DatabaseGetcompatibility{}}, }, wantErr: false, }, diff --git a/internal/cmd/beta/sqlserverflex/user/create/create.go b/internal/cmd/beta/sqlserverflex/user/create/create.go index 22957b824..bc8d23702 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create.go @@ -8,7 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -18,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client" sqlserverflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/utils" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) const ( @@ -88,7 +87,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("create SQLServer Flex user: %w", err) } - user := resp.Item + user := resp return outputResult(params.Printer, model, instanceLabel, user) }, @@ -125,7 +124,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiCreateUserRequest { - req := apiClient.DefaultAPI.CreateUser(ctx, model.ProjectId, model.InstanceId, model.Region) + req := apiClient.DefaultAPI.CreateUser(ctx, model.ProjectId, model.Region, model.InstanceId) req = req.CreateUserPayload(sqlserverflex.CreateUserPayload{ Username: model.Username, @@ -134,25 +133,23 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverfl return req } -func outputResult(p *print.Printer, model *inputModel, instanceLabel string, user *sqlserverflex.SingleUser) error { +func outputResult(p *print.Printer, model *inputModel, instanceLabel string, user *sqlserverflex.CreateUserResponse) error { if user == nil { return fmt.Errorf("user response is empty") } return p.OutputResult(model.OutputFormat, user, func() error { - p.Outputf("Created user for instance %q. User ID: %s\n\n", instanceLabel, utils.PtrString(user.Id)) - p.Outputf("Username: %s\n", utils.PtrString(user.Username)) - p.Outputf("Password: %s\n", utils.PtrString(user.Password)) + p.Outputf("Created user for instance %q. User ID: %d\n\n", instanceLabel, user.Id) + p.Outputf("Username: %s\n", user.Username) + p.Outputf("Password: %s\n", user.Password) if len(user.Roles) != 0 { p.Outputf("Roles: [%v]\n", strings.Join(user.Roles, ", ")) } - if user.Host != nil && *user.Host != "" { - p.Outputf("Host: %s\n", *user.Host) + if user.Host != "" { + p.Outputf("Host: %s\n", user.Host) } - if user.Port != nil { - p.Outputf("Port: %d\n", *user.Port) - } - if user.Uri != nil && *user.Uri != "" { - p.Outputf("URI: %s\n", *user.Uri) + p.Outputf("Port: %d\n", user.Port) + if user.Uri != "" { + p.Outputf("URI: %s\n", user.Uri) } return nil diff --git a/internal/cmd/beta/sqlserverflex/user/create/create_test.go b/internal/cmd/beta/sqlserverflex/user/create/create_test.go index 0a62cd242..6036f956b 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create_test.go @@ -7,7 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -55,7 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiCreateUserRequest)) sqlserverflex.ApiCreateUserRequest { - request := testClient.DefaultAPI.CreateUser(testCtx, testProjectId, testInstanceId, testRegion) + request := testClient.DefaultAPI.CreateUser(testCtx, testProjectId, testRegion, testInstanceId) request = request.CreateUserPayload(sqlserverflex.CreateUserPayload{ Username: "johndoe", Roles: []string{"read"}, @@ -186,7 +186,7 @@ func TestOutputResult(t *testing.T) { type args struct { model *inputModel instanceLabel string - user *sqlserverflex.SingleUser + user *sqlserverflex.CreateUserResponse } tests := []struct { name string @@ -202,7 +202,7 @@ func TestOutputResult(t *testing.T) { name: "user as argument", args: args{ model: fixtureInputModel(), - user: &sqlserverflex.SingleUser{}, + user: &sqlserverflex.CreateUserResponse{}, }, wantErr: false, }, diff --git a/internal/cmd/beta/sqlserverflex/user/delete/delete.go b/internal/cmd/beta/sqlserverflex/user/delete/delete.go index 317656bec..36209b2be 100644 --- a/internal/cmd/beta/sqlserverflex/user/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/user/delete/delete.go @@ -3,6 +3,7 @@ package delete import ( "context" "fmt" + "strconv" "github.com/stackitcloud/stackit-cli/internal/pkg/types" @@ -16,7 +17,7 @@ import ( sqlserverflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/utils" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" ) const ( @@ -29,7 +30,7 @@ type inputModel struct { *globalflags.GlobalFlagModel InstanceId string - UserId string + UserId int64 } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -68,7 +69,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel, err := sqlserverflexUtils.GetUserName(ctx, apiClient.DefaultAPI, model.ProjectId, model.InstanceId, model.UserId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) - userLabel = model.UserId + userLabel = fmt.Sprintf("%d", model.UserId) } prompt := fmt.Sprintf("Are you sure you want to delete user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) @@ -100,7 +101,11 @@ func configureFlags(cmd *cobra.Command) { } func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { - userId := inputArgs[0] + userIdStr := inputArgs[0] + userId, err := strconv.ParseInt(userIdStr, 10, 64) + if err != nil { + return nil, fmt.Errorf("invalid user id %q: %w", userIdStr, err) + } globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { @@ -118,6 +123,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiDeleteUserRequest { - req := apiClient.DefaultAPI.DeleteUser(ctx, model.ProjectId, model.InstanceId, model.UserId, model.Region) + req := apiClient.DefaultAPI.DeleteUser(ctx, model.ProjectId, model.Region, model.InstanceId, model.UserId) return req } diff --git a/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go b/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go index 85c35144b..609a90026 100644 --- a/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go +++ b/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go @@ -2,6 +2,7 @@ package delete import ( "context" + "fmt" "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -10,7 +11,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" ) type testCtxKey struct{} @@ -20,12 +21,12 @@ var testClient = &sqlserverflex.APIClient{DefaultAPI: &sqlserverflex.DefaultAPIS var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() -var testUserId = "my-user-id" +var testUserId = int64(123123) var testRegion = "eu01" func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ - testUserId, + fmt.Sprintf("%d", testUserId), } for _, mod := range mods { mod(argValues) @@ -62,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiDeleteUserRequest)) sqlserverflex.ApiDeleteUserRequest { - request := testClient.DefaultAPI.DeleteUser(testCtx, testProjectId, testInstanceId, testUserId, testRegion) + request := testClient.DefaultAPI.DeleteUser(testCtx, testProjectId, testRegion, testInstanceId, testUserId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/beta/sqlserverflex/user/describe/describe.go b/internal/cmd/beta/sqlserverflex/user/describe/describe.go index e09ce9d80..4590393a0 100644 --- a/internal/cmd/beta/sqlserverflex/user/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/user/describe/describe.go @@ -3,10 +3,14 @@ package describe import ( "context" "fmt" + "strconv" "strings" "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,10 +19,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/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - - "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" ) const ( @@ -31,7 +31,7 @@ type inputModel struct { *globalflags.GlobalFlagModel InstanceId string - UserId string + UserId int64 } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -72,7 +72,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return fmt.Errorf("get SQLServer Flex user: %w", err) } - return outputResult(params.Printer, model.OutputFormat, resp.Item) + return outputResult(params.Printer, model.OutputFormat, resp) }, } @@ -88,7 +88,11 @@ func configureFlags(cmd *cobra.Command) { } func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { - userId := inputArgs[0] + userIdStr := inputArgs[0] + userId, err := strconv.ParseInt(userIdStr, 10, 64) + if err != nil { + return nil, fmt.Errorf("invalid user id %q: %w", userIdStr, err) + } globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { @@ -106,36 +110,34 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiGetUserRequest { - req := apiClient.DefaultAPI.GetUser(ctx, model.ProjectId, model.InstanceId, model.UserId, model.Region) + req := apiClient.DefaultAPI.GetUser(ctx, model.ProjectId, model.Region, model.InstanceId, model.UserId) return req } -func outputResult(p *print.Printer, outputFormat string, user *sqlserverflex.UserResponseUser) error { +func outputResult(p *print.Printer, outputFormat string, user *sqlserverflex.GetUserResponse) error { if user == nil { return fmt.Errorf("user response is empty") } return p.OutputResult(outputFormat, user, func() error { table := tables.NewTable() - table.AddRow("ID", utils.PtrString(user.Id)) + table.AddRow("ID", user.Id) table.AddSeparator() - table.AddRow("USERNAME", utils.PtrString(user.Username)) + table.AddRow("USERNAME", user.Username) if len(user.Roles) != 0 { table.AddSeparator() table.AddRow("ROLES", strings.Join(user.Roles, "\n")) } - if user.DefaultDatabase != nil && *user.DefaultDatabase != "" { - table.AddSeparator() - table.AddRow("DATABASE", *user.DefaultDatabase) - } - if user.Host != nil && *user.Host != "" { + if user.DefaultDatabase != "" { table.AddSeparator() - table.AddRow("HOST", *user.Host) + table.AddRow("DATABASE", user.DefaultDatabase) } - if user.Port != nil { + if user.Host != "" { table.AddSeparator() - table.AddRow("PORT", *user.Port) + table.AddRow("HOST", user.Host) } + table.AddSeparator() + table.AddRow("PORT", user.Port) err := table.Display(p) if err != nil { diff --git a/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go index e07a2d3c3..546ef8c3b 100644 --- a/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go @@ -2,12 +2,13 @@ package describe import ( "context" + "fmt" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -21,12 +22,12 @@ var testClient = &sqlserverflex.APIClient{DefaultAPI: &sqlserverflex.DefaultAPIS var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() -var testUserId = "my-user-id" +var testUserId = int64(123123) var testRegion = "eu01" func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ - testUserId, + fmt.Sprintf("%d", testUserId), } for _, mod := range mods { mod(argValues) @@ -63,7 +64,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiGetUserRequest)) sqlserverflex.ApiGetUserRequest { - request := testClient.DefaultAPI.GetUser(testCtx, testProjectId, testInstanceId, testUserId, testRegion) + request := testClient.DefaultAPI.GetUser(testCtx, testProjectId, testRegion, testInstanceId, testUserId) for _, mod := range mods { mod(&request) } @@ -191,7 +192,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string - user *sqlserverflex.UserResponseUser + user *sqlserverflex.GetUserResponse } tests := []struct { name string @@ -206,7 +207,7 @@ func TestOutputResult(t *testing.T) { { name: "only user as argument", args: args{ - user: &sqlserverflex.UserResponseUser{}, + user: &sqlserverflex.GetUserResponse{}, }, wantErr: false, }, diff --git a/internal/cmd/beta/sqlserverflex/user/list/list.go b/internal/cmd/beta/sqlserverflex/user/list/list.go index 9845eb3b0..18d0fb593 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list.go @@ -7,7 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -18,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client" sqlserverflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) const ( @@ -69,7 +68,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get SQLServer Flex users: %w", err) } - users := resp.GetItems() + users := resp.Users instanceLabel, err := sqlserverflexUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.ProjectId, *model.InstanceId, model.Region) if err != nil { @@ -123,11 +122,11 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiListUsersRequest { - req := apiClient.DefaultAPI.ListUsers(ctx, model.ProjectId, *model.InstanceId, model.Region) + req := apiClient.DefaultAPI.ListUsers(ctx, model.ProjectId, model.Region, *model.InstanceId) return req } -func outputResult(p *print.Printer, outputFormat, instanceLabel string, users []sqlserverflex.InstanceListUser) error { +func outputResult(p *print.Printer, outputFormat, instanceLabel string, users []sqlserverflex.ListUser) error { return p.OutputResult(outputFormat, users, func() error { if len(users) == 0 { p.Outputf("No users found for instance %q\n", instanceLabel) @@ -139,8 +138,8 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, users [] for i := range users { user := users[i] table.AddRow( - utils.PtrString(user.Id), - utils.PtrString(user.Username), + user.Id, + user.Username, ) } err := table.Display(p) diff --git a/internal/cmd/beta/sqlserverflex/user/list/list_test.go b/internal/cmd/beta/sqlserverflex/user/list/list_test.go index e4d6b8ce2..210d72afb 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list_test.go @@ -7,7 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -55,7 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiListUsersRequest)) sqlserverflex.ApiListUsersRequest { - request := testClient.DefaultAPI.ListUsers(testCtx, testProjectId, testInstanceId, testRegion) + request := testClient.DefaultAPI.ListUsers(testCtx, testProjectId, testRegion, testInstanceId) for _, mod := range mods { mod(&request) } @@ -171,7 +171,7 @@ func TestOutputResult(t *testing.T) { type args struct { outputFormat string instanceLabel string - users []sqlserverflex.InstanceListUser + users []sqlserverflex.ListUser } tests := []struct { name string @@ -186,7 +186,7 @@ func TestOutputResult(t *testing.T) { { name: "empty user in the users slice", args: args{ - users: []sqlserverflex.InstanceListUser{{}}, + users: []sqlserverflex.ListUser{{}}, }, wantErr: false, }, diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go index 55c5df301..a64f6dadc 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go @@ -3,9 +3,13 @@ package resetpassword import ( "context" "fmt" + "strconv" "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,10 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client" sqlserverflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/utils" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - - "github.com/spf13/cobra" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" ) const ( @@ -30,7 +30,7 @@ type inputModel struct { *globalflags.GlobalFlagModel InstanceId string - UserId string + UserId int64 } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -69,7 +69,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel, err := sqlserverflexUtils.GetUserName(ctx, apiClient.DefaultAPI, model.ProjectId, model.InstanceId, model.UserId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) - userLabel = model.UserId + userLabel = fmt.Sprintf("%d", model.UserId) } prompt := fmt.Sprintf("Are you sure you want to reset the password of user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) @@ -85,7 +85,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return fmt.Errorf("reset SQLServer Flex user password: %w", err) } - return outputResult(params.Printer, model.OutputFormat, userLabel, instanceLabel, user.Item) + return outputResult(params.Printer, model.OutputFormat, userLabel, instanceLabel, user) }, } @@ -101,7 +101,11 @@ func configureFlags(cmd *cobra.Command) { } func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { - userId := inputArgs[0] + userIdStr := inputArgs[0] + userId, err := strconv.ParseInt(userIdStr, 10, 64) + if err != nil { + return nil, fmt.Errorf("invalid user id %q: %w", userIdStr, err) + } globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { @@ -119,21 +123,21 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverflex.APIClient) sqlserverflex.ApiResetUserRequest { - req := apiClient.DefaultAPI.ResetUser(ctx, model.ProjectId, model.InstanceId, model.UserId, model.Region) + req := apiClient.DefaultAPI.ResetUser(ctx, model.ProjectId, model.Region, model.InstanceId, model.UserId) return req } -func outputResult(p *print.Printer, outputFormat, userLabel, instanceLabel string, user *sqlserverflex.SingleUser) error { +func outputResult(p *print.Printer, outputFormat, userLabel, instanceLabel string, user *sqlserverflex.ResetUserResponse) error { if user == nil { return fmt.Errorf("single user response is empty") } return p.OutputResult(outputFormat, user, func() error { p.Outputf("Reset password for user %q of instance %q\n\n", userLabel, instanceLabel) - p.Outputf("Username: %s\n", utils.PtrString(user.Username)) - p.Outputf("New password: %s\n", utils.PtrString(user.Password)) - if user.Uri != nil && *user.Uri != "" { - p.Outputf("New URI: %s\n", *user.Uri) + p.Outputf("Username: %s\n", user.Username) + p.Outputf("New password: %s\n", user.Password) + if user.Uri != "" { + p.Outputf("New URI: %s\n", user.Uri) } return nil }) diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go index eb6569710..08c6cab79 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go @@ -2,12 +2,13 @@ package resetpassword import ( "context" + "fmt" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -21,12 +22,12 @@ var testClient = &sqlserverflex.APIClient{DefaultAPI: &sqlserverflex.DefaultAPIS var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() -var testUserId = "my-user-id" +var testUserId = int64(123123) var testRegion = "eu01" func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ - testUserId, + fmt.Sprintf("%d", testUserId), } for _, mod := range mods { mod(argValues) @@ -63,7 +64,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *sqlserverflex.ApiResetUserRequest)) sqlserverflex.ApiResetUserRequest { - request := testClient.DefaultAPI.ResetUser(testCtx, testProjectId, testInstanceId, testUserId, testRegion) + request := testClient.DefaultAPI.ResetUser(testCtx, testProjectId, testRegion, testInstanceId, testUserId) for _, mod := range mods { mod(&request) } @@ -193,7 +194,7 @@ func TestOutputResult(t *testing.T) { outputFormat string userLabel string instanceLabel string - user *sqlserverflex.SingleUser + user *sqlserverflex.ResetUserResponse } tests := []struct { name string @@ -208,7 +209,7 @@ func TestOutputResult(t *testing.T) { { name: "only user as argument", args: args{ - user: &sqlserverflex.SingleUser{}, + user: &sqlserverflex.ResetUserResponse{}, }, wantErr: false, }, diff --git a/internal/pkg/services/sqlserverflex/client/client.go b/internal/pkg/services/sqlserverflex/client/client.go index 693108c57..913dcaa2f 100644 --- a/internal/pkg/services/sqlserverflex/client/client.go +++ b/internal/pkg/services/sqlserverflex/client/client.go @@ -6,7 +6,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/spf13/viper" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" ) func ConfigureClient(p *print.Printer, cliVersion string) (*sqlserverflex.APIClient, error) { diff --git a/internal/pkg/services/sqlserverflex/utils/utils.go b/internal/pkg/services/sqlserverflex/utils/utils.go index fe8e7915f..d35f69f21 100644 --- a/internal/pkg/services/sqlserverflex/utils/utils.go +++ b/internal/pkg/services/sqlserverflex/utils/utils.go @@ -7,31 +7,20 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/errors" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" ) const ( ServiceCmd = "beta sqlserverflex" ) -// enforce implementation of interfaces -var ( - _ SQLServerFlexClient = sqlserverflex.APIClient{}.DefaultAPI -) - -type SQLServerFlexClient interface { - ListVersions(ctx context.Context, projectId string, region string) sqlserverflex.ApiListVersionsRequest - GetInstance(ctx context.Context, projectId, instanceId string, region string) sqlserverflex.ApiGetInstanceRequest - GetUser(ctx context.Context, projectId, instanceId, userId string, region string) sqlserverflex.ApiGetUserRequest -} - -func ValidateFlavorId(flavorId string, flavors []sqlserverflex.InstanceFlavorEntry) error { +func ValidateFlavorId(flavorId string, flavors []sqlserverflex.ListFlavors) error { if flavors == nil { return fmt.Errorf("nil flavors") } for _, f := range flavors { - if f.Id != nil && strings.EqualFold(*f.Id, flavorId) { + if strings.EqualFold(f.Id, flavorId) { return nil } } @@ -42,66 +31,76 @@ func ValidateFlavorId(flavorId string, flavors []sqlserverflex.InstanceFlavorEnt } } -func ValidateStorage(storageClass *string, storageSize *int64, storages *sqlserverflex.ListStoragesResponse, flavorId string) error { +func ValidateStorage(storageClass string, storageSize *int64, storages *sqlserverflex.ListStoragesResponse, flavorId string) error { if storages == nil { return fmt.Errorf("nil storages") } if storageSize != nil { - if *storageSize < *storages.StorageRange.Min || *storageSize > *storages.StorageRange.Max { - return fmt.Errorf("%s", fmt.Sprintf("You provided storage size '%d', which is invalid. The valid range is %d-%d.", *storageSize, *storages.StorageRange.Min, *storages.StorageRange.Max)) + if *storageSize < int64(storages.StorageRange.Min) || *storageSize > int64(storages.StorageRange.Max) { + return fmt.Errorf("%s", fmt.Sprintf("You provided storage size '%d', which is invalid. The valid range is %d-%d.", *storageSize, storages.StorageRange.Min, storages.StorageRange.Max)) } } - if storageClass == nil { - return nil - } - for _, sc := range storages.StorageClasses { - if strings.EqualFold(*storageClass, sc) { + if strings.EqualFold(storageClass, sc.Class) { return nil } } return &errors.DatabaseInvalidStorageError{ Service: ServiceCmd, - Details: fmt.Sprintf("You provided storage class '%s', which is invalid.", *storageClass), + Details: fmt.Sprintf("You provided storage class '%s', which is invalid.", storageClass), FlavorId: flavorId, } } -func LoadFlavorId(cpu, ram int32, flavors []sqlserverflex.InstanceFlavorEntry) (*string, error) { +func LoadFlavorId(cpu, ram int64, flavors []sqlserverflex.ListFlavors) (string, error) { if flavors == nil { - return nil, fmt.Errorf("nil flavors") + return "", fmt.Errorf("nil flavors") } availableFlavors := "" for _, f := range flavors { - if f.Id == nil || f.Cpu == nil || f.Memory == nil { + if f.Id == "" { continue } - if *f.Cpu == cpu && *f.Memory == ram { + if f.Cpu == cpu && f.Memory == ram { return f.Id, nil } - availableFlavors = fmt.Sprintf("%s\n- %d CPU, %d GB RAM", availableFlavors, *f.Cpu, *f.Cpu) + availableFlavors = fmt.Sprintf("%s\n- %d CPU, %d GB RAM", availableFlavors, f.Cpu, f.Cpu) } - return nil, &errors.DatabaseInvalidFlavorError{ + return "", &errors.DatabaseInvalidFlavorError{ Service: ServiceCmd, Details: "You provided an invalid combination for CPU and RAM.", } } -func GetInstanceName(ctx context.Context, apiClient SQLServerFlexClient, projectId, instanceId, region string) (string, error) { - resp, err := apiClient.GetInstance(ctx, projectId, instanceId, region).Execute() +func GetInstanceName(ctx context.Context, apiClient sqlserverflex.DefaultAPI, projectId, instanceId, region string) (string, error) { + resp, err := apiClient.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { return "", fmt.Errorf("get SQLServer Flex instance: %w", err) } - return *resp.Item.Name, nil + return resp.Name, nil } -func GetUserName(ctx context.Context, apiClient SQLServerFlexClient, projectId, instanceId, userId, region string) (string, error) { - resp, err := apiClient.GetUser(ctx, projectId, instanceId, userId, region).Execute() +func GetUserName(ctx context.Context, apiClient sqlserverflex.DefaultAPI, projectId, instanceId string, userId int64, region string) (string, error) { + resp, err := apiClient.GetUser(ctx, projectId, region, instanceId, userId).Execute() if err != nil { return "", fmt.Errorf("get SQLServer Flex user: %w", err) } - return *resp.Item.Username, nil + return resp.Username, nil +} + +func GetFlavor(ctx context.Context, client sqlserverflex.DefaultAPI, projectId, region, flavorId string) (*sqlserverflex.ListFlavors, error) { + req := client.ListFlavors(ctx, projectId, region) + flavorsResp, err := client.ListFlavorsExecute(req) + if err != nil { + return nil, fmt.Errorf("failed to list flavors: %w", err) + } + for _, flavor := range flavorsResp.Flavors { + if flavor.Id == flavorId { + return &flavor, nil + } + } + return nil, fmt.Errorf("flavor with ID %q not found in project %q", flavorId, projectId) } diff --git a/internal/pkg/services/sqlserverflex/utils/utils_test.go b/internal/pkg/services/sqlserverflex/utils/utils_test.go index fc57748eb..bf9eb5abc 100644 --- a/internal/pkg/services/sqlserverflex/utils/utils_test.go +++ b/internal/pkg/services/sqlserverflex/utils/utils_test.go @@ -9,13 +9,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/uuid" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" ) var ( testProjectId = uuid.NewString() testInstanceId = uuid.NewString() - testUserId = uuid.NewString() + testUserId = int64(123123) ) const ( @@ -32,7 +32,7 @@ type mockSettings struct { getUserFails bool getUserResp *sqlserverflex.GetUserResponse listRestoreJobsFails bool - listRestoreJobsResp *sqlserverflex.ListRestoreJobsResponse + listRestoreJobsResp *sqlserverflex.ListCurrentRunningRestoreJobs } func newApiMock(s *mockSettings) sqlserverflex.DefaultAPI { @@ -55,7 +55,7 @@ func newApiMock(s *mockSettings) sqlserverflex.DefaultAPI { } return s.getUserResp, nil }), - ListRestoreJobsExecuteMock: utils.Ptr(func(_ sqlserverflex.ApiListRestoreJobsRequest) (*sqlserverflex.ListRestoreJobsResponse, error) { + ListCurrentRunningRestoreJobsExecuteMock: utils.Ptr(func(_ sqlserverflex.ApiListCurrentRunningRestoreJobsRequest) (*sqlserverflex.ListCurrentRunningRestoreJobs, error) { if s.listRestoreJobsFails { return nil, fmt.Errorf("could not list versions") } @@ -77,10 +77,14 @@ func TestValidateStorage(t *testing.T) { storageClass: utils.Ptr("foo"), storageSize: utils.Ptr(int64(10)), storages: &sqlserverflex.ListStoragesResponse{ - StorageClasses: []string{"bar-1", "bar-2", "foo"}, - StorageRange: &sqlserverflex.StorageRange{ - Min: utils.Ptr(int64(5)), - Max: utils.Ptr(int64(20)), + StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{ + {Class: "bar-1"}, + {Class: "bar-2"}, + {Class: "foo"}, + }, + StorageRange: sqlserverflex.FlavorStorageRange{ + Min: int32(5), + Max: int32(20), }, }, isValid: true, @@ -97,10 +101,14 @@ func TestValidateStorage(t *testing.T) { storageClass: utils.Ptr("foo"), storageSize: utils.Ptr(int64(1)), storages: &sqlserverflex.ListStoragesResponse{ - StorageClasses: []string{"bar-1", "bar-2", "foo"}, - StorageRange: &sqlserverflex.StorageRange{ - Min: utils.Ptr(int64(5)), - Max: utils.Ptr(int64(20)), + StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{ + {Class: "bar-1"}, + {Class: "bar-2"}, + {Class: "foo"}, + }, + StorageRange: sqlserverflex.FlavorStorageRange{ + Min: int32(5), + Max: int32(20), }, }, isValid: false, @@ -110,10 +118,14 @@ func TestValidateStorage(t *testing.T) { storageClass: utils.Ptr("foo"), storageSize: utils.Ptr(int64(200)), storages: &sqlserverflex.ListStoragesResponse{ - StorageClasses: []string{"bar-1", "bar-2", "foo"}, - StorageRange: &sqlserverflex.StorageRange{ - Min: utils.Ptr(int64(5)), - Max: utils.Ptr(int64(20)), + StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{ + {Class: "bar-1"}, + {Class: "bar-2"}, + {Class: "foo"}, + }, + StorageRange: sqlserverflex.FlavorStorageRange{ + Min: int32(5), + Max: int32(20), }, }, isValid: false, @@ -123,10 +135,14 @@ func TestValidateStorage(t *testing.T) { storageClass: utils.Ptr("foo"), storageSize: utils.Ptr(int64(5)), storages: &sqlserverflex.ListStoragesResponse{ - StorageClasses: []string{"bar-1", "bar-2", "foo"}, - StorageRange: &sqlserverflex.StorageRange{ - Min: utils.Ptr(int64(5)), - Max: utils.Ptr(int64(20)), + StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{ + {Class: "bar-1"}, + {Class: "bar-2"}, + {Class: "foo"}, + }, + StorageRange: sqlserverflex.FlavorStorageRange{ + Min: int32(5), + Max: int32(20), }, }, isValid: true, @@ -136,10 +152,14 @@ func TestValidateStorage(t *testing.T) { storageClass: utils.Ptr("foo"), storageSize: utils.Ptr(int64(20)), storages: &sqlserverflex.ListStoragesResponse{ - StorageClasses: []string{"bar-1", "bar-2", "foo"}, - StorageRange: &sqlserverflex.StorageRange{ - Min: utils.Ptr(int64(5)), - Max: utils.Ptr(int64(20)), + StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{ + {Class: "bar-1"}, + {Class: "bar-2"}, + {Class: "foo"}, + }, + StorageRange: sqlserverflex.FlavorStorageRange{ + Min: int32(5), + Max: int32(20), }, }, isValid: true, @@ -149,10 +169,14 @@ func TestValidateStorage(t *testing.T) { storageClass: utils.Ptr("foo"), storageSize: utils.Ptr(int64(10)), storages: &sqlserverflex.ListStoragesResponse{ - StorageClasses: []string{"bar-1", "bar-2", "bar-3"}, - StorageRange: &sqlserverflex.StorageRange{ - Min: utils.Ptr(int64(5)), - Max: utils.Ptr(int64(20)), + StorageClasses: []sqlserverflex.FlavorStorageClassesStorageClass{ + {Class: "bar-1"}, + {Class: "bar-2"}, + {Class: "bar-3"}, + }, + StorageRange: sqlserverflex.FlavorStorageRange{ + Min: int32(5), + Max: int32(20), }, }, isValid: false, @@ -161,7 +185,7 @@ func TestValidateStorage(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - err := ValidateStorage(tt.storageClass, tt.storageSize, tt.storages, "flavor-id") + err := ValidateStorage(*tt.storageClass, tt.storageSize, tt.storages, "flavor-id") if tt.isValid && err != nil { t.Fatalf("should not have failed: %v", err) } @@ -176,16 +200,16 @@ func TestValidateFlavorId(t *testing.T) { tests := []struct { description string flavorId string - flavors []sqlserverflex.InstanceFlavorEntry + flavors []sqlserverflex.ListFlavors isValid bool }{ { description: "base", flavorId: "foo", - flavors: []sqlserverflex.InstanceFlavorEntry{ - {Id: utils.Ptr("bar-1")}, - {Id: utils.Ptr("bar-2")}, - {Id: utils.Ptr("foo")}, + flavors: []sqlserverflex.ListFlavors{ + {Id: "bar-1"}, + {Id: "bar-2"}, + {Id: "foo"}, }, isValid: true, }, @@ -198,26 +222,26 @@ func TestValidateFlavorId(t *testing.T) { { description: "no flavors", flavorId: "foo", - flavors: []sqlserverflex.InstanceFlavorEntry{}, + flavors: []sqlserverflex.ListFlavors{}, isValid: false, }, { - description: "nil flavor id", + description: "empty flavor id", flavorId: "foo", - flavors: []sqlserverflex.InstanceFlavorEntry{ - {Id: utils.Ptr("bar-1")}, - {Id: nil}, - {Id: utils.Ptr("foo")}, + flavors: []sqlserverflex.ListFlavors{ + {Id: "bar-1"}, + {Id: ""}, + {Id: "foo"}, }, isValid: true, }, { description: "invalid flavor", flavorId: "foo", - flavors: []sqlserverflex.InstanceFlavorEntry{ - {Id: utils.Ptr("bar-1")}, - {Id: utils.Ptr("bar-2")}, - {Id: utils.Ptr("bar-3")}, + flavors: []sqlserverflex.ListFlavors{ + {Id: "bar-1"}, + {Id: "bar-2"}, + {Id: "bar-3"}, }, isValid: false, }, @@ -239,35 +263,35 @@ func TestValidateFlavorId(t *testing.T) { func TestLoadFlavorId(t *testing.T) { tests := []struct { description string - cpu int32 - ram int32 - flavors []sqlserverflex.InstanceFlavorEntry + cpu int64 + ram int64 + flavors []sqlserverflex.ListFlavors isValid bool - expectedOutput *string + expectedOutput string }{ { description: "base", cpu: 2, ram: 4, - flavors: []sqlserverflex.InstanceFlavorEntry{ + flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr("bar-1"), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(2)), + Id: "bar-1", + Cpu: int64(2), + Memory: int64(2), }, { - Id: utils.Ptr("bar-2"), - Cpu: utils.Ptr(int32(4)), - Memory: utils.Ptr(int32(4)), + Id: "bar-2", + Cpu: int64(4), + Memory: int64(4), }, { - Id: utils.Ptr("foo"), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(4)), + Id: "foo", + Cpu: int64(2), + Memory: int64(4), }, }, isValid: true, - expectedOutput: utils.Ptr("foo"), + expectedOutput: "foo", }, { description: "nil flavors", @@ -280,52 +304,52 @@ func TestLoadFlavorId(t *testing.T) { description: "no flavors", cpu: 2, ram: 4, - flavors: []sqlserverflex.InstanceFlavorEntry{}, + flavors: []sqlserverflex.ListFlavors{}, isValid: false, }, { description: "flavors with details missing", cpu: 2, ram: 4, - flavors: []sqlserverflex.InstanceFlavorEntry{ + flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr("bar-1"), - Cpu: nil, - Memory: nil, + Id: "bar-1", + Cpu: 0, + Memory: 0, }, { - Id: utils.Ptr("bar-2"), - Cpu: utils.Ptr(int32(4)), - Memory: utils.Ptr(int32(4)), + Id: "bar-2", + Cpu: int64(4), + Memory: int64(4), }, { - Id: utils.Ptr("foo"), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(4)), + Id: "foo", + Cpu: int64(2), + Memory: int64(4), }, }, isValid: true, - expectedOutput: utils.Ptr("foo"), + expectedOutput: "foo", }, { description: "match with nil id", cpu: 2, ram: 4, - flavors: []sqlserverflex.InstanceFlavorEntry{ + flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr("bar-1"), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(2)), + Id: "bar-1", + Cpu: int64(2), + Memory: int64(2), }, { - Id: utils.Ptr("bar-2"), - Cpu: utils.Ptr(int32(4)), - Memory: utils.Ptr(int32(4)), + Id: "bar-2", + Cpu: int64(4), + Memory: int64(4), }, { - Id: nil, - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(4)), + Id: "", + Cpu: int64(2), + Memory: int64(4), }, }, isValid: false, @@ -334,16 +358,16 @@ func TestLoadFlavorId(t *testing.T) { description: "invalid settings", cpu: 2, ram: 4, - flavors: []sqlserverflex.InstanceFlavorEntry{ + flavors: []sqlserverflex.ListFlavors{ { - Id: utils.Ptr("bar-1"), - Cpu: utils.Ptr(int32(2)), - Memory: utils.Ptr(int32(2)), + Id: "bar-1", + Cpu: int64(2), + Memory: int64(2), }, { - Id: utils.Ptr("bar-2"), - Cpu: utils.Ptr(int32(4)), - Memory: utils.Ptr(int32(4)), + Id: "bar-2", + Cpu: int64(4), + Memory: int64(4), }, }, isValid: false, @@ -364,7 +388,7 @@ func TestLoadFlavorId(t *testing.T) { if err != nil { t.Fatalf("should not have failed: %v", err) } - if output == nil { + if output == "" { t.Fatalf("returned nil output") } diff := cmp.Diff(output, tt.expectedOutput) @@ -386,9 +410,7 @@ func TestGetInstanceName(t *testing.T) { { description: "base", getInstanceResp: &sqlserverflex.GetInstanceResponse{ - Item: &sqlserverflex.Instance{ - Name: utils.Ptr(testInstanceName), - }, + Name: testInstanceName, }, isValid: true, expectedOutput: testInstanceName, @@ -436,9 +458,7 @@ func TestGetUserName(t *testing.T) { { description: "base", getUserResp: &sqlserverflex.GetUserResponse{ - Item: &sqlserverflex.UserResponseUser{ - Username: utils.Ptr(testUserName), - }, + Username: testUserName, }, isValid: true, expectedOutput: testUserName, diff --git a/internal/pkg/testutils/testutils.go b/internal/pkg/testutils/testutils.go index 74a07befc..279847658 100644 --- a/internal/pkg/testutils/testutils.go +++ b/internal/pkg/testutils/testutils.go @@ -131,8 +131,8 @@ func TestParseInputWithOptions[T any](t *testing.T, cmdFactory func(*types.CmdPa if !isValid { t.Fatalf("did not fail on invalid input") } - diff := cmp.Diff(model, expectedModel, opts.cmpOptions...) + diff := cmp.Diff(expectedModel, model, opts.cmpOptions...) if diff != "" { - t.Fatalf("Data does not match: %s", diff) + t.Fatalf("Data does not match (-expected, +actual): %s", diff) } }