diff --git a/docs/stackit_rabbitmq_instance_create.md b/docs/stackit_rabbitmq_instance_create.md index cff51b9e0..96f1b7e9a 100644 --- a/docs/stackit_rabbitmq_instance_create.md +++ b/docs/stackit_rabbitmq_instance_create.md @@ -30,13 +30,13 @@ stackit rabbitmq instance create [flags] --enable-monitoring Enable monitoring --graphite string Graphite host -h, --help Help for "stackit rabbitmq instance create" - --metrics-frequency int Metrics frequency + --metrics-frequency int32 Metrics frequency --metrics-prefix string Metrics prefix --monitoring-instance-id string Monitoring instance ID -n, --name string Instance name --plan-id string Plan ID --plan-name string Plan name - --plugin strings Plugin + --plugin strings plugins (multiple of: [rabbitmq_consistent_hash_exchange, rabbitmq_federation, rabbitmq_federation_management, rabbitmq_mqtt, rabbitmq_sharding, rabbitmq_shovel, rabbitmq_shovel_management, rabbitmq_stomp, rabbitmq_tracing, rabbitmq_event_exchange]) (default []) --syslog strings Syslog --version string Instance RabbitMQ version ``` diff --git a/docs/stackit_rabbitmq_instance_update.md b/docs/stackit_rabbitmq_instance_update.md index 1635bbc4a..24afdd992 100644 --- a/docs/stackit_rabbitmq_instance_update.md +++ b/docs/stackit_rabbitmq_instance_update.md @@ -27,12 +27,12 @@ stackit rabbitmq instance update INSTANCE_ID [flags] --enable-monitoring Enable monitoring --graphite string Graphite host -h, --help Help for "stackit rabbitmq instance update" - --metrics-frequency int Metrics frequency + --metrics-frequency int32 Metrics frequency --metrics-prefix string Metrics prefix --monitoring-instance-id string Monitoring instance ID --plan-id string Plan ID --plan-name string Plan name - --plugin strings Plugin + --plugin strings plugins (multiple of: [rabbitmq_consistent_hash_exchange, rabbitmq_federation, rabbitmq_federation_management, rabbitmq_mqtt, rabbitmq_sharding, rabbitmq_shovel, rabbitmq_shovel_management, rabbitmq_stomp, rabbitmq_tracing, rabbitmq_event_exchange]) (default []) --syslog strings Syslog --version string Instance RabbitMQ version ``` diff --git a/go.mod b/go.mod index 0c13822ad..a025aa1e1 100644 --- a/go.mod +++ b/go.mod @@ -271,7 +271,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.7.0 github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0 - github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.26.0 + github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/sfs v0.9.0 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index 4e08a22b7..f1ae86144 100644 --- a/go.sum +++ b/go.sum @@ -632,8 +632,8 @@ github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 h1:oTVx1+O177 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6/go.mod h1:6ZBeCCY6qG8w1oK7osf61Egyv3mp7Ahv6GDGxiarDGo= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5 h1:H67e3KnHQx954yI8fuQmxXwRf/myqAdLg2KvxImp00g= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5/go.mod h1:xmAWk9eom8wznvLuLfm0F4xyeiBX8LaggXsKFmos+dw= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.26.0 h1:/8lmviszgrB+0Cz7HdhFELyTiTeqIs7LfnI6sNX4rW8= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.26.0/go.mod h1:hnhvlLX1Y71R8KIQqLBeoSZqkU5ZJOG0J4wz0LeUdaw= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v1.1.0 h1:HRJwodJX4aOn/487zaqJIKw13yIj4T6dn7/kEHLxeTg= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v1.1.0/go.mod h1:TwfVVynB/+AKbccSOLk2qZpPL1tdK43BBAiACP6EtSg= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6 h1:CXM9cZ9WeTyJd+Aw/hnJnDsKRVAQi4qgtd0RJ3zoPwo= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6/go.mod h1:KJNceOHRefjku1oVBoHG7idCS/SeW42WJ+55bN3AxrQ= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.24.0 h1:JPP6a0ME1tZXr4iB69d/LtJsCAr58ENBadFaK9f48/c= diff --git a/internal/cmd/rabbitmq/credentials/create/create.go b/internal/cmd/rabbitmq/credentials/create/create.go index 8fcf54748..aceb05727 100644 --- a/internal/cmd/rabbitmq/credentials/create/create.go +++ b/internal/cmd/rabbitmq/credentials/create/create.go @@ -4,10 +4,11 @@ import ( "context" "fmt" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -58,7 +59,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.InstanceId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -109,7 +110,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.APIClient) rabbitmq.ApiCreateCredentialsRequest { - req := apiClient.CreateCredentials(ctx, model.ProjectId, model.InstanceId) + req := apiClient.DefaultAPI.CreateCredentials(ctx, model.ProjectId, model.Region, model.InstanceId) return req } @@ -123,29 +124,27 @@ func outputResult(p *print.Printer, model inputModel, instanceLabel string, resp if !model.ShowPassword { if resp.Raw == nil { - resp.Raw = &rabbitmq.RawCredentials{Credentials: &rabbitmq.Credentials{}} - } else if resp.Raw.Credentials == nil { - resp.Raw.Credentials = &rabbitmq.Credentials{} + resp.Raw = &rabbitmq.RawCredentials{Credentials: rabbitmq.Credentials{}} } - resp.Raw.Credentials.Password = utils.Ptr("hidden") + resp.Raw.Credentials.Password = "hidden" } return p.OutputResult(model.OutputFormat, resp, func() error { - p.Outputf("Created credentials for instance %q. Credentials ID: %s\n\n", instanceLabel, utils.PtrString(resp.Id)) + p.Outputf("Created credentials for instance %q. Credentials ID: %s\n\n", instanceLabel, resp.Id) // The username field cannot be set by the user so we only display it if it's not returned empty - if resp.HasRaw() && resp.Raw.Credentials != nil { - if username := resp.Raw.Credentials.Username; username != nil && *username != "" { - p.Outputf("Username: %s\n", *username) + if resp.HasRaw() { + if username := resp.Raw.Credentials.Username; username != "" { + p.Outputf("Username: %s\n", username) } if !model.ShowPassword { p.Outputf("Password: \n") } else { - p.Outputf("Password: %s\n", utils.PtrString(resp.Raw.Credentials.Password)) + p.Outputf("Password: %s\n", resp.Raw.Credentials.Password) } - p.Outputf("Host: %s\n", utils.PtrString(resp.Raw.Credentials.Host)) + p.Outputf("Host: %s\n", resp.Raw.Credentials.Host) p.Outputf("Port: %s\n", utils.PtrString(resp.Raw.Credentials.Port)) } - p.Outputf("URI: %s\n", utils.PtrString(resp.Uri)) + p.Outputf("URI: %s\n", resp.Uri) return nil }) } diff --git a/internal/cmd/rabbitmq/credentials/create/create_test.go b/internal/cmd/rabbitmq/credentials/create/create_test.go index ab96d5013..90703282e 100644 --- a/internal/cmd/rabbitmq/credentials/create/create_test.go +++ b/internal/cmd/rabbitmq/credentials/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" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -17,13 +17,15 @@ import ( type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &rabbitmq.APIClient{} +var testClient = &rabbitmq.APIClient{DefaultAPI: &rabbitmq.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() +var testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, instanceIdFlag: testInstanceId, } for _, mod := range mods { @@ -36,6 +38,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -47,7 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *rabbitmq.ApiCreateCredentialsRequest)) rabbitmq.ApiCreateCredentialsRequest { - request := testClient.CreateCredentials(testCtx, testProjectId, testInstanceId) + request := testClient.DefaultAPI.CreateCredentials(testCtx, testProjectId, testRegion, testInstanceId) for _, mod := range mods { mod(&request) } @@ -153,7 +156,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), - cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testCtx, rabbitmq.DefaultAPIService{}), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/rabbitmq/credentials/delete/delete.go b/internal/cmd/rabbitmq/credentials/delete/delete.go index a30d2e9d0..8defa0092 100644 --- a/internal/cmd/rabbitmq/credentials/delete/delete.go +++ b/internal/cmd/rabbitmq/credentials/delete/delete.go @@ -17,7 +17,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" ) const ( @@ -56,13 +56,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.InstanceId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } - credentialsLabel, err := rabbitmqUtils.GetCredentialsUsername(ctx, apiClient, model.ProjectId, model.InstanceId, model.CredentialsId) + credentialsLabel, err := rabbitmqUtils.GetCredentialsUsername(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.InstanceId, model.CredentialsId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get credentials user name: %v", err) credentialsLabel = model.CredentialsId @@ -115,6 +115,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.APIClient) rabbitmq.ApiDeleteCredentialsRequest { - req := apiClient.DeleteCredentials(ctx, model.ProjectId, model.InstanceId, model.CredentialsId) + req := apiClient.DefaultAPI.DeleteCredentials(ctx, model.ProjectId, model.Region, model.InstanceId, model.CredentialsId) return req } diff --git a/internal/cmd/rabbitmq/credentials/delete/delete_test.go b/internal/cmd/rabbitmq/credentials/delete/delete_test.go index 176138ad9..4e31acc35 100644 --- a/internal/cmd/rabbitmq/credentials/delete/delete_test.go +++ b/internal/cmd/rabbitmq/credentials/delete/delete_test.go @@ -10,14 +10,15 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &rabbitmq.APIClient{} +var testClient = &rabbitmq.APIClient{DefaultAPI: &rabbitmq.DefaultAPIService{}} var testProjectId = uuid.NewString() +var testRegion = "eu01" var testInstanceId = uuid.NewString() var testCredentialsId = uuid.NewString() @@ -34,6 +35,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, instanceIdFlag: testInstanceId, } for _, mod := range mods { @@ -46,6 +48,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -58,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *rabbitmq.ApiDeleteCredentialsRequest)) rabbitmq.ApiDeleteCredentialsRequest { - request := testClient.DeleteCredentials(testCtx, testProjectId, testInstanceId, testCredentialsId) + request := testClient.DefaultAPI.DeleteCredentials(testCtx, testProjectId, testRegion, testInstanceId, testCredentialsId) for _, mod := range mods { mod(&request) } @@ -186,7 +189,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), - cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testCtx, rabbitmq.DefaultAPIService{}), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/rabbitmq/credentials/describe/describe.go b/internal/cmd/rabbitmq/credentials/describe/describe.go index e17a39f73..820560667 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe.go +++ b/internal/cmd/rabbitmq/credentials/describe/describe.go @@ -17,7 +17,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" ) const ( @@ -99,7 +99,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.APIClient) rabbitmq.ApiGetCredentialsRequest { - req := apiClient.GetCredentials(ctx, model.ProjectId, model.InstanceId, model.CredentialsId) + req := apiClient.DefaultAPI.GetCredentials(ctx, model.ProjectId, model.Region, model.InstanceId, model.CredentialsId) return req } @@ -110,15 +110,15 @@ func outputResult(p *print.Printer, outputFormat string, credentials *rabbitmq.C return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() - table.AddRow("ID", utils.PtrString(credentials.Id)) + table.AddRow("ID", credentials.Id) table.AddSeparator() // The username field cannot be set by the user so we only display it if it's not returned empty - if credentials.HasRaw() && credentials.Raw.Credentials != nil { - if username := credentials.Raw.Credentials.Username; username != nil && *username != "" { - table.AddRow("USERNAME", *username) + if credentials.HasRaw() { + if username := credentials.Raw.Credentials.Username; username != "" { + table.AddRow("USERNAME", username) table.AddSeparator() } - table.AddRow("PASSWORD", utils.PtrString(credentials.Raw.Credentials.Password)) + table.AddRow("PASSWORD", credentials.Raw.Credentials.Password) table.AddSeparator() table.AddRow("URI", utils.PtrString(credentials.Raw.Credentials.Uri)) } diff --git a/internal/cmd/rabbitmq/credentials/describe/describe_test.go b/internal/cmd/rabbitmq/credentials/describe/describe_test.go index 3f6fb1f1a..580ec41ff 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe_test.go +++ b/internal/cmd/rabbitmq/credentials/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" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -17,8 +17,9 @@ import ( type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &rabbitmq.APIClient{} +var testClient = &rabbitmq.APIClient{DefaultAPI: &rabbitmq.DefaultAPIService{}} var testProjectId = uuid.NewString() +var testRegion = "eu01" var testInstanceId = uuid.NewString() var testCredentialsId = uuid.NewString() @@ -35,6 +36,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, instanceIdFlag: testInstanceId, } for _, mod := range mods { @@ -47,6 +49,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -59,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *rabbitmq.ApiGetCredentialsRequest)) rabbitmq.ApiGetCredentialsRequest { - request := testClient.GetCredentials(testCtx, testProjectId, testInstanceId, testCredentialsId) + request := testClient.DefaultAPI.GetCredentials(testCtx, testProjectId, testRegion, testInstanceId, testCredentialsId) for _, mod := range mods { mod(&request) } @@ -187,7 +190,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), - cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testCtx, rabbitmq.DefaultAPIService{}), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/rabbitmq/credentials/list/list.go b/internal/cmd/rabbitmq/credentials/list/list.go index 3c8b44a3c..1a3591147 100644 --- a/internal/cmd/rabbitmq/credentials/list/list.go +++ b/internal/cmd/rabbitmq/credentials/list/list.go @@ -7,7 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" "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/rabbitmq/client" rabbitmqUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/rabbitmq/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) const ( @@ -70,7 +69,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } credentials := resp.GetCredentialsList() - instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.InstanceId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -121,7 +120,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.APIClient) rabbitmq.ApiListCredentialsRequest { - req := apiClient.ListCredentials(ctx, model.ProjectId, model.InstanceId) + req := apiClient.DefaultAPI.ListCredentials(ctx, model.ProjectId, model.Region, model.InstanceId) return req } @@ -136,7 +135,7 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, credenti table.SetHeader("ID") for i := range credentials { c := credentials[i] - table.AddRow(utils.PtrString(c.Id)) + table.AddRow(c.Id) } err := table.Display(p) if err != nil { diff --git a/internal/cmd/rabbitmq/credentials/list/list_test.go b/internal/cmd/rabbitmq/credentials/list/list_test.go index 6f35a9b29..65fc5d867 100644 --- a/internal/cmd/rabbitmq/credentials/list/list_test.go +++ b/internal/cmd/rabbitmq/credentials/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" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -18,13 +18,15 @@ import ( type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &rabbitmq.APIClient{} +var testClient = &rabbitmq.APIClient{DefaultAPI: &rabbitmq.DefaultAPIService{}} var testProjectId = uuid.NewString() +var testRegion = "eu01" var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, instanceIdFlag: testInstanceId, limitFlag: "10", } @@ -38,6 +40,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -50,7 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *rabbitmq.ApiListCredentialsRequest)) rabbitmq.ApiListCredentialsRequest { - request := testClient.ListCredentials(testCtx, testProjectId, testInstanceId) + request := testClient.DefaultAPI.ListCredentials(testCtx, testProjectId, testRegion, testInstanceId) for _, mod := range mods { mod(&request) } @@ -160,7 +163,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), - cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testCtx, rabbitmq.DefaultAPIService{}), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/rabbitmq/instance/create/create.go b/internal/cmd/rabbitmq/instance/create/create.go index cb2bf470a..d73c4ea3c 100644 --- a/internal/cmd/rabbitmq/instance/create/create.go +++ b/internal/cmd/rabbitmq/instance/create/create.go @@ -21,8 +21,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/wait" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api/wait" ) const ( @@ -32,7 +32,6 @@ const ( metricsFrequencyFlag = "metrics-frequency" metricsPrefixFlag = "metrics-prefix" monitoringInstanceIdFlag = "monitoring-instance-id" - pluginFlag = "plugin" sgwAclFlag = "acl" syslogFlag = "syslog" planIdFlag = "plan-id" @@ -40,20 +39,26 @@ const ( versionFlag = "version" ) +var flagPlugins = flags.StringEnumSliceFlag( + "plugin", + rabbitmq.AllowedInstanceParametersPluginsInnerEnumValues, + "plugins", +) + type inputModel struct { *globalflags.GlobalFlagModel PlanName string Version string - InstanceName *string + InstanceName string EnableMonitoring *bool Graphite *string - MetricsFrequency *int64 + MetricsFrequency *int32 MetricsPrefix *string MonitoringInstanceId *string - Plugin *[]string + Plugin []rabbitmq.InstanceParametersPluginsInner SgwAcl *[]string - Syslog *[]string + Syslog []string PlanId *string } @@ -100,7 +105,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req, err := buildRequest(ctx, model, apiClient) + req, err := buildRequest(ctx, model, apiClient.DefaultAPI) if err != nil { var dsaInvalidPlanError *cliErr.DSAInvalidPlanError if !errors.As(err, &dsaInvalidPlanError) { @@ -112,12 +117,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("create RabbitMQ instance: %w", err) } - instanceId := *resp.InstanceId + instanceId := resp.InstanceId // 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, model.ProjectId, instanceId).WaitWithContext(ctx) + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) return err }) if err != nil { @@ -136,10 +141,10 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(instanceNameFlag, "n", "", "Instance name") cmd.Flags().Bool(enableMonitoringFlag, false, "Enable monitoring") cmd.Flags().String(graphiteFlag, "", "Graphite host") - cmd.Flags().Int64(metricsFrequencyFlag, 0, "Metrics frequency") + cmd.Flags().Int32(metricsFrequencyFlag, 0, "Metrics frequency") cmd.Flags().String(metricsPrefixFlag, "", "Metrics prefix") cmd.Flags().Var(flags.UUIDFlag(), monitoringInstanceIdFlag, "Monitoring instance ID") - cmd.Flags().StringSlice(pluginFlag, []string{}, "Plugin") + flagPlugins.Register(cmd) cmd.Flags().Var(flags.CIDRSliceFlag(), sgwAclFlag, "List of IP networks in CIDR notation which are allowed to access this instance") cmd.Flags().StringSlice(syslogFlag, []string{}, "Syslog") cmd.Flags().Var(flags.UUIDFlag(), planIdFlag, "Plan ID") @@ -173,15 +178,15 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, model := inputModel{ GlobalFlagModel: globalFlags, - InstanceName: flags.FlagToStringPointer(p, cmd, instanceNameFlag), + InstanceName: flags.FlagToStringValue(p, cmd, instanceNameFlag), EnableMonitoring: flags.FlagToBoolPointer(p, cmd, enableMonitoringFlag), MonitoringInstanceId: flags.FlagToStringPointer(p, cmd, monitoringInstanceIdFlag), Graphite: flags.FlagToStringPointer(p, cmd, graphiteFlag), - MetricsFrequency: flags.FlagToInt64Pointer(p, cmd, metricsFrequencyFlag), + MetricsFrequency: flags.FlagToInt32Pointer(p, cmd, metricsFrequencyFlag), MetricsPrefix: flags.FlagToStringPointer(p, cmd, metricsPrefixFlag), - Plugin: flags.FlagToStringSlicePointer(p, cmd, pluginFlag), + Plugin: flagPlugins.Get(), SgwAcl: flags.FlagToStringSlicePointer(p, cmd, sgwAclFlag), - Syslog: flags.FlagToStringSlicePointer(p, cmd, syslogFlag), + Syslog: flags.FlagToStringSliceValue(p, cmd, syslogFlag), PlanId: planId, PlanName: planName, Version: version, @@ -192,23 +197,23 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } type rabbitMQClient interface { - CreateInstance(ctx context.Context, projectId string) rabbitmq.ApiCreateInstanceRequest - ListOfferingsExecute(ctx context.Context, projectId string) (*rabbitmq.ListOfferingsResponse, error) + CreateInstance(ctx context.Context, projectId, region string) rabbitmq.ApiCreateInstanceRequest + ListOfferings(ctx context.Context, projectId, region string) rabbitmq.ApiListOfferingsRequest } func buildRequest(ctx context.Context, model *inputModel, apiClient rabbitMQClient) (rabbitmq.ApiCreateInstanceRequest, error) { - req := apiClient.CreateInstance(ctx, model.ProjectId) + req := apiClient.CreateInstance(ctx, model.ProjectId, model.Region) - var planId *string + var planId string var err error - offerings, err := apiClient.ListOfferingsExecute(ctx, model.ProjectId) + offerings, err := apiClient.ListOfferings(ctx, model.ProjectId, model.Region).Execute() if err != nil { return req, fmt.Errorf("get RabbitMQ offerings: %w", err) } if model.PlanId == nil { - planId, err = rabbitmqUtils.LoadPlanId(model.PlanName, model.Version, offerings) + foundPlanId, err := rabbitmqUtils.LoadPlanId(model.PlanName, model.Version, offerings) if err != nil { var dsaInvalidPlanError *cliErr.DSAInvalidPlanError if !errors.As(err, &dsaInvalidPlanError) { @@ -216,12 +221,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient rabbitMQClie } return req, err } + planId = *foundPlanId } else { err := rabbitmqUtils.ValidatePlanId(*model.PlanId, offerings) if err != nil { return req, err } - planId = model.PlanId + planId = *model.PlanId } var sgwAcl *string diff --git a/internal/cmd/rabbitmq/instance/create/create_test.go b/internal/cmd/rabbitmq/instance/create/create_test.go index 3f722392a..e14e3a0b6 100644 --- a/internal/cmd/rabbitmq/instance/create/create_test.go +++ b/internal/cmd/rabbitmq/instance/create/create_test.go @@ -11,7 +11,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -20,38 +20,42 @@ import ( type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &rabbitmq.APIClient{} +var testClient = &rabbitmq.APIClient{DefaultAPI: &rabbitmq.DefaultAPIService{}} -type rabbitMQClientMocked struct { +type mockSettings struct { returnError bool listOfferingsResp *rabbitmq.ListOfferingsResponse } -func (c *rabbitMQClientMocked) CreateInstance(ctx context.Context, projectId string) rabbitmq.ApiCreateInstanceRequest { - return testClient.CreateInstance(ctx, projectId) -} - -func (c *rabbitMQClientMocked) ListOfferingsExecute(_ context.Context, _ string) (*rabbitmq.ListOfferingsResponse, error) { - if c.returnError { - return nil, fmt.Errorf("list flavors failed") +func newAPIMock(settings mockSettings) rabbitmq.DefaultAPI { + return rabbitmq.DefaultAPIServiceMock{ + ListOfferingsExecuteMock: utils.Ptr(func(_ rabbitmq.ApiListOfferingsRequest) (*rabbitmq.ListOfferingsResponse, error) { + if settings.returnError { + return nil, fmt.Errorf("list flavors failed") + } + return settings.listOfferingsResp, nil + }), } - return c.listOfferingsResp, nil } var testProjectId = uuid.NewString() var testPlanId = uuid.NewString() var testMonitoringInstanceId = uuid.NewString() +var testInstanceName = "instance" + +const testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, instanceNameFlag: "example-name", enableMonitoringFlag: "true", graphiteFlag: "example-graphite", metricsFrequencyFlag: "100", metricsPrefixFlag: "example-prefix", monitoringInstanceIdFlag: testMonitoringInstanceId, - pluginFlag: "example-plugin", + flagPlugins.Name(): string(rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_MQTT), sgwAclFlag: "198.51.100.14/24", syslogFlag: "example-syslog", planIdFlag: testPlanId, @@ -66,17 +70,18 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, - InstanceName: utils.Ptr("example-name"), + InstanceName: "example-name", EnableMonitoring: utils.Ptr(true), Graphite: utils.Ptr("example-graphite"), - MetricsFrequency: utils.Ptr(int64(100)), + MetricsFrequency: utils.Ptr(int32(100)), MetricsPrefix: utils.Ptr("example-prefix"), MonitoringInstanceId: utils.Ptr(testMonitoringInstanceId), - Plugin: utils.Ptr([]string{"example-plugin"}), + Plugin: []rabbitmq.InstanceParametersPluginsInner{rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_MQTT}, SgwAcl: utils.Ptr([]string{"198.51.100.14/24"}), - Syslog: utils.Ptr([]string{"example-syslog"}), + Syslog: []string{"example-syslog"}, PlanId: utils.Ptr(testPlanId), } for _, mod := range mods { @@ -86,20 +91,20 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *rabbitmq.ApiCreateInstanceRequest)) rabbitmq.ApiCreateInstanceRequest { - request := testClient.CreateInstance(testCtx, testProjectId) + request := testClient.DefaultAPI.CreateInstance(testCtx, testProjectId, testRegion) request = request.CreateInstancePayload(rabbitmq.CreateInstancePayload{ - InstanceName: utils.Ptr("example-name"), + InstanceName: "example-name", Parameters: &rabbitmq.InstanceParameters{ EnableMonitoring: utils.Ptr(true), Graphite: utils.Ptr("example-graphite"), - MetricsFrequency: utils.Ptr(int64(100)), + MetricsFrequency: utils.Ptr(int32(100)), MetricsPrefix: utils.Ptr("example-prefix"), MonitoringInstanceId: utils.Ptr(testMonitoringInstanceId), - Plugins: utils.Ptr([]string{"example-plugin"}), + Plugins: []rabbitmq.InstanceParametersPluginsInner{rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_MQTT}, SgwAcl: utils.Ptr("198.51.100.14/24"), - Syslog: utils.Ptr([]string{"example-syslog"}), + Syslog: []string{"example-syslog"}, }, - PlanId: utils.Ptr(testPlanId), + PlanId: testPlanId, }) for _, mod := range mods { mod(&request) @@ -156,7 +161,7 @@ func TestParseInput(t *testing.T) { ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, }, - InstanceName: utils.Ptr("example-name"), + InstanceName: "example-name", PlanId: utils.Ptr(testPlanId), }, }, @@ -178,10 +183,10 @@ func TestParseInput(t *testing.T) { Verbosity: globalflags.VerbosityDefault, }, PlanId: utils.Ptr(testPlanId), - InstanceName: utils.Ptr(""), + InstanceName: "", EnableMonitoring: utils.Ptr(false), Graphite: utils.Ptr(""), - MetricsFrequency: utils.Ptr(int64(0)), + MetricsFrequency: utils.Ptr(int32(0)), MetricsPrefix: utils.Ptr(""), }, }, @@ -254,12 +259,11 @@ func TestParseInput(t *testing.T) { { description: "repeated plugin flags", flagValues: fixtureFlagValues(), - pluginValues: []string{"example-plugin-1", "example-plugin-2"}, + pluginValues: []string{string(rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_MQTT), string(rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_CONSISTENT_HASH_EXCHANGE)}, isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { - model.Plugin = utils.Ptr( - append(*model.Plugin, "example-plugin-1", "example-plugin-2"), - ) + model.Plugin = + append(model.Plugin, rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_MQTT, rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_CONSISTENT_HASH_EXCHANGE) }), }, { @@ -268,9 +272,8 @@ func TestParseInput(t *testing.T) { syslogValues: []string{"example-syslog-1", "example-syslog-2"}, isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { - model.Syslog = utils.Ptr( - append(*model.Syslog, "example-syslog-1", "example-syslog-2"), - ) + model.Syslog = + append(model.Syslog, "example-syslog-1", "example-syslog-2") }), }, } @@ -278,9 +281,9 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ - sgwAclFlag: tt.sgwAclValues, - syslogFlag: tt.syslogValues, - pluginFlag: tt.pluginValues, + sgwAclFlag: tt.sgwAclValues, + syslogFlag: tt.syslogValues, + flagPlugins.Name(): tt.pluginValues, }, tt.isValid) }) } @@ -300,13 +303,13 @@ func TestBuildRequest(t *testing.T) { model: fixtureInputModel(), expectedRequest: fixtureRequest(), getOfferingsResp: &rabbitmq.ListOfferingsResponse{ - Offerings: &[]rabbitmq.Offering{ + Offerings: []rabbitmq.Offering{ { - Version: utils.Ptr("example-version"), - Plans: &[]rabbitmq.Plan{ + Version: "example-version", + Plans: []rabbitmq.Plan{ { - Name: utils.Ptr("example-plan-name"), - Id: utils.Ptr(testPlanId), + Name: "example-plan-name", + Id: testPlanId, }, }, }, @@ -324,13 +327,13 @@ func TestBuildRequest(t *testing.T) { ), expectedRequest: fixtureRequest(), getOfferingsResp: &rabbitmq.ListOfferingsResponse{ - Offerings: &[]rabbitmq.Offering{ + Offerings: []rabbitmq.Offering{ { - Version: utils.Ptr("example-version"), - Plans: &[]rabbitmq.Plan{ + Version: "example-version", + Plans: []rabbitmq.Plan{ { - Name: utils.Ptr("example-plan-name"), - Id: utils.Ptr(testPlanId), + Name: "example-plan-name", + Id: testPlanId, }, }, }, @@ -359,13 +362,13 @@ func TestBuildRequest(t *testing.T) { }, ), getOfferingsResp: &rabbitmq.ListOfferingsResponse{ - Offerings: &[]rabbitmq.Offering{ + Offerings: []rabbitmq.Offering{ { - Version: utils.Ptr("example-version"), - Plans: &[]rabbitmq.Plan{ + Version: "example-version", + Plans: []rabbitmq.Plan{ { - Name: utils.Ptr("other-plan-name"), - Id: utils.Ptr(testPlanId), + Name: "other-plan-name", + Id: testPlanId, }, }, }, @@ -376,37 +379,39 @@ func TestBuildRequest(t *testing.T) { { description: "required fields only", model: &inputModel{ + InstanceName: testInstanceName, GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, PlanId: utils.Ptr(testPlanId), }, getOfferingsResp: &rabbitmq.ListOfferingsResponse{ - Offerings: &[]rabbitmq.Offering{ + Offerings: []rabbitmq.Offering{ { - Version: utils.Ptr("example-version"), - Plans: &[]rabbitmq.Plan{ + Version: "example-version", + Plans: []rabbitmq.Plan{ { - Name: utils.Ptr("example-plan-name"), - Id: utils.Ptr(testPlanId), + Name: "example-plan-name", + Id: testPlanId, }, }, }, }, }, - expectedRequest: testClient.CreateInstance(testCtx, testProjectId). - CreateInstancePayload(rabbitmq.CreateInstancePayload{PlanId: utils.Ptr(testPlanId), Parameters: &rabbitmq.InstanceParameters{}}), + expectedRequest: testClient.DefaultAPI.CreateInstance(testCtx, testProjectId, testRegion). + CreateInstancePayload(rabbitmq.CreateInstancePayload{InstanceName: testInstanceName, PlanId: testPlanId, Parameters: &rabbitmq.InstanceParameters{}}), }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - client := &rabbitMQClientMocked{ + settings := mockSettings{ returnError: tt.getOfferingsFails, listOfferingsResp: tt.getOfferingsResp, } - request, err := buildRequest(testCtx, tt.model, client) + request, err := buildRequest(testCtx, tt.model, newAPIMock(settings)) if err != nil { if !tt.isValid { return @@ -416,7 +421,10 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), - cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testCtx, rabbitmq.DefaultAPIService{}), + cmp.FilterPath(func(p cmp.Path) bool { + return p.String() == "ApiService" + }, cmp.Ignore()), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/rabbitmq/instance/delete/delete.go b/internal/cmd/rabbitmq/instance/delete/delete.go index ec5c35104..06d705609 100644 --- a/internal/cmd/rabbitmq/instance/delete/delete.go +++ b/internal/cmd/rabbitmq/instance/delete/delete.go @@ -17,8 +17,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/wait" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api/wait" ) const ( @@ -54,7 +54,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.InstanceId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -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, model.ProjectId, model.InstanceId).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 *rabbitmq.APIClient) rabbitmq.ApiDeleteInstanceRequest { - req := apiClient.DeleteInstance(ctx, model.ProjectId, model.InstanceId) + req := apiClient.DefaultAPI.DeleteInstance(ctx, model.ProjectId, model.Region, model.InstanceId) return req } diff --git a/internal/cmd/rabbitmq/instance/delete/delete_test.go b/internal/cmd/rabbitmq/instance/delete/delete_test.go index 4ffdd36a8..0670ebd87 100644 --- a/internal/cmd/rabbitmq/instance/delete/delete_test.go +++ b/internal/cmd/rabbitmq/instance/delete/delete_test.go @@ -10,16 +10,18 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &rabbitmq.APIClient{} +var testClient = &rabbitmq.APIClient{DefaultAPI: &rabbitmq.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() +const testRegion = "eu01" + func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ testInstanceId, @@ -33,6 +35,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -44,6 +47,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -55,7 +59,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *rabbitmq.ApiDeleteInstanceRequest)) rabbitmq.ApiDeleteInstanceRequest { - request := testClient.DeleteInstance(testCtx, testProjectId, testInstanceId) + request := testClient.DefaultAPI.DeleteInstance(testCtx, testProjectId, testRegion, testInstanceId) for _, mod := range mods { mod(&request) } @@ -159,7 +163,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), - cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testCtx, rabbitmq.DefaultAPIService{}), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/rabbitmq/instance/describe/describe.go b/internal/cmd/rabbitmq/instance/describe/describe.go index 8385bfe7e..19dd2b928 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe.go +++ b/internal/cmd/rabbitmq/instance/describe/describe.go @@ -16,7 +16,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" ) const ( @@ -87,7 +87,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.APIClient) rabbitmq.ApiGetInstanceRequest { - req := apiClient.GetInstance(ctx, model.ProjectId, model.InstanceId) + req := apiClient.DefaultAPI.GetInstance(ctx, model.ProjectId, model.Region, model.InstanceId) return req } @@ -100,18 +100,16 @@ func outputResult(p *print.Printer, outputFormat string, instance *rabbitmq.Inst table := tables.NewTable() table.AddRow("ID", utils.PtrString(instance.InstanceId)) table.AddSeparator() - table.AddRow("NAME", utils.PtrString(instance.Name)) + table.AddRow("NAME", instance.Name) table.AddSeparator() - if lastOperation := instance.LastOperation; lastOperation != nil { - table.AddRow("LAST OPERATION TYPE", utils.PtrString(lastOperation.Type)) - table.AddSeparator() - table.AddRow("LAST OPERATION STATE", utils.PtrString(lastOperation.State)) - table.AddSeparator() - } - table.AddRow("PLAN ID", utils.PtrString(instance.PlanId)) + table.AddRow("LAST OPERATION TYPE", instance.LastOperation.Type) + table.AddSeparator() + table.AddRow("LAST OPERATION STATE", instance.LastOperation.State) + table.AddSeparator() + table.AddRow("PLAN ID", instance.PlanId) // Only show ACL if it's present and not empty if parameters := instance.Parameters; parameters != nil { - acl := (*instance.Parameters)[aclParameterKey] + acl := instance.Parameters[aclParameterKey] aclStr, ok := acl.(string) if ok { if aclStr != "" { diff --git a/internal/cmd/rabbitmq/instance/describe/describe_test.go b/internal/cmd/rabbitmq/instance/describe/describe_test.go index 30043e006..76f4f5023 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe_test.go +++ b/internal/cmd/rabbitmq/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" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -17,8 +17,9 @@ import ( type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &rabbitmq.APIClient{} +var testClient = &rabbitmq.APIClient{DefaultAPI: &rabbitmq.DefaultAPIService{}} var testProjectId = uuid.NewString() +var testRegion = "eu01" var testInstanceId = uuid.NewString() func fixtureArgValues(mods ...func(argValues []string)) []string { @@ -34,6 +35,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -45,6 +47,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -56,7 +59,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *rabbitmq.ApiGetInstanceRequest)) rabbitmq.ApiGetInstanceRequest { - request := testClient.GetInstance(testCtx, testProjectId, testInstanceId) + request := testClient.DefaultAPI.GetInstance(testCtx, testProjectId, testRegion, testInstanceId) for _, mod := range mods { mod(&request) } @@ -160,7 +163,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), - cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testCtx, rabbitmq.DefaultAPIService{}), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) @@ -194,7 +197,7 @@ func Test_outputResult(t *testing.T) { args: args{ outputFormat: "", instance: &rabbitmq.Instance{ - Parameters: &map[string]interface{}{ + Parameters: map[string]any{ "foo": nil, }, }, diff --git a/internal/cmd/rabbitmq/instance/list/list.go b/internal/cmd/rabbitmq/instance/list/list.go index 70e47500e..c2b75ecca 100644 --- a/internal/cmd/rabbitmq/instance/list/list.go +++ b/internal/cmd/rabbitmq/instance/list/list.go @@ -7,7 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -115,7 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.APIClient) rabbitmq.ApiListInstancesRequest { - req := apiClient.ListInstances(ctx, model.ProjectId) + req := apiClient.DefaultAPI.ListInstances(ctx, model.ProjectId, model.Region) return req } @@ -133,15 +133,11 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, instances var ( opType, opState string ) - if lastOperation := instance.LastOperation; lastOperation != nil { - opType = utils.PtrString(lastOperation.Type) - opState = utils.PtrString(lastOperation.State) - } else { - opType, opState = "n/a", "n/a" - } + opType = string(instance.LastOperation.Type) + opState = string(instance.LastOperation.State) table.AddRow( utils.PtrString(instance.InstanceId), - utils.PtrString(instance.Name), + instance.Name, opType, opState, ) diff --git a/internal/cmd/rabbitmq/instance/list/list_test.go b/internal/cmd/rabbitmq/instance/list/list_test.go index 347758b2d..d123d6c88 100644 --- a/internal/cmd/rabbitmq/instance/list/list_test.go +++ b/internal/cmd/rabbitmq/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" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -18,12 +18,14 @@ import ( type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &rabbitmq.APIClient{} +var testClient = &rabbitmq.APIClient{DefaultAPI: &rabbitmq.DefaultAPIService{}} var testProjectId = uuid.NewString() +var testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, limitFlag: "10", } for _, mod := range mods { @@ -36,6 +38,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Limit: utils.Ptr(int64(10)), @@ -47,7 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *rabbitmq.ApiListInstancesRequest)) rabbitmq.ApiListInstancesRequest { - request := testClient.ListInstances(testCtx, testProjectId) + request := testClient.DefaultAPI.ListInstances(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -136,7 +139,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), - cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testCtx, rabbitmq.DefaultAPIService{}), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/rabbitmq/instance/update/update.go b/internal/cmd/rabbitmq/instance/update/update.go index b58590a6e..80804f0bb 100644 --- a/internal/cmd/rabbitmq/instance/update/update.go +++ b/internal/cmd/rabbitmq/instance/update/update.go @@ -20,8 +20,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/wait" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api/wait" ) const ( @@ -33,7 +33,6 @@ const ( metricsFrequencyFlag = "metrics-frequency" metricsPrefixFlag = "metrics-prefix" monitoringInstanceIdFlag = "monitoring-instance-id" - pluginFlag = "plugin" sgwAclFlag = "acl" syslogFlag = "syslog" planIdFlag = "plan-id" @@ -41,6 +40,12 @@ const ( versionFlag = "version" ) +var flagPlugins = flags.StringEnumSliceFlag( + "plugin", + rabbitmq.AllowedInstanceParametersPluginsInnerEnumValues, + "plugins", +) + type inputModel struct { *globalflags.GlobalFlagModel InstanceId string @@ -49,12 +54,12 @@ type inputModel struct { EnableMonitoring *bool Graphite *string - MetricsFrequency *int64 + MetricsFrequency *int32 MetricsPrefix *string MonitoringInstanceId *string - Plugin *[]string + Plugin []rabbitmq.InstanceParametersPluginsInner SgwAcl *[]string - Syslog *[]string + Syslog []string PlanId *string } @@ -85,7 +90,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.InstanceId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -98,7 +103,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req, err := buildRequest(ctx, model, apiClient) + req, err := buildRequest(ctx, model, apiClient.DefaultAPI) if err != nil { var dsaInvalidPlanError *cliErr.DSAInvalidPlanError if !errors.As(err, &dsaInvalidPlanError) { @@ -115,7 +120,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, "Updating instance", func() error { - _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) return err }) if err != nil { @@ -138,10 +143,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(enableMonitoringFlag, false, "Enable monitoring") cmd.Flags().String(graphiteFlag, "", "Graphite host") - cmd.Flags().Int64(metricsFrequencyFlag, 0, "Metrics frequency") + cmd.Flags().Int32(metricsFrequencyFlag, 0, "Metrics frequency") cmd.Flags().String(metricsPrefixFlag, "", "Metrics prefix") cmd.Flags().Var(flags.UUIDFlag(), monitoringInstanceIdFlag, "Monitoring instance ID") - cmd.Flags().StringSlice(pluginFlag, []string{}, "Plugin") + flagPlugins.Register(cmd) cmd.Flags().Var(flags.CIDRSliceFlag(), sgwAclFlag, "List of IP networks in CIDR notation which are allowed to access this instance") cmd.Flags().StringSlice(syslogFlag, []string{}, "Syslog") cmd.Flags().Var(flags.UUIDFlag(), planIdFlag, "Plan ID") @@ -160,11 +165,11 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu enableMonitoring := flags.FlagToBoolPointer(p, cmd, enableMonitoringFlag) monitoringInstanceId := flags.FlagToStringPointer(p, cmd, monitoringInstanceIdFlag) graphite := flags.FlagToStringPointer(p, cmd, graphiteFlag) - metricsFrequency := flags.FlagToInt64Pointer(p, cmd, metricsFrequencyFlag) + metricsFrequency := flags.FlagToInt32Pointer(p, cmd, metricsFrequencyFlag) metricsPrefix := flags.FlagToStringPointer(p, cmd, metricsPrefixFlag) - plugin := flags.FlagToStringSlicePointer(p, cmd, pluginFlag) + plugin := flagPlugins.Get() sgwAcl := flags.FlagToStringSlicePointer(p, cmd, sgwAclFlag) - syslog := flags.FlagToStringSlicePointer(p, cmd, syslogFlag) + syslog := flags.FlagToStringSliceValue(p, cmd, syslogFlag) planId := flags.FlagToStringPointer(p, cmd, planIdFlag) planName := flags.FlagToStringValue(p, cmd, planNameFlag) version := flags.FlagToStringValue(p, cmd, versionFlag) @@ -204,17 +209,17 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } type rabbitMQClient interface { - PartialUpdateInstance(ctx context.Context, projectId, instanceId string) rabbitmq.ApiPartialUpdateInstanceRequest - ListOfferingsExecute(ctx context.Context, projectId string) (*rabbitmq.ListOfferingsResponse, error) + PartialUpdateInstance(ctx context.Context, projectId, regionId, instanceId string) rabbitmq.ApiPartialUpdateInstanceRequest + ListOfferings(ctx context.Context, projectId, regionId string) rabbitmq.ApiListOfferingsRequest } func buildRequest(ctx context.Context, model *inputModel, apiClient rabbitMQClient) (rabbitmq.ApiPartialUpdateInstanceRequest, error) { - req := apiClient.PartialUpdateInstance(ctx, model.ProjectId, model.InstanceId) + req := apiClient.PartialUpdateInstance(ctx, model.ProjectId, model.Region, model.InstanceId) var planId *string var err error - offerings, err := apiClient.ListOfferingsExecute(ctx, model.ProjectId) + offerings, err := apiClient.ListOfferings(ctx, model.ProjectId, model.Region).Execute() if err != nil { return req, fmt.Errorf("get RabbitMQ offerings: %w", err) } diff --git a/internal/cmd/rabbitmq/instance/update/update_test.go b/internal/cmd/rabbitmq/instance/update/update_test.go index bc50cea83..b636409c9 100644 --- a/internal/cmd/rabbitmq/instance/update/update_test.go +++ b/internal/cmd/rabbitmq/instance/update/update_test.go @@ -6,39 +6,40 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &rabbitmq.APIClient{} +var testClient = &rabbitmq.APIClient{DefaultAPI: &rabbitmq.DefaultAPIService{}} -type rabbitMQClientMocked struct { +type mockSettings struct { returnError bool listOfferingsResp *rabbitmq.ListOfferingsResponse } -func (c *rabbitMQClientMocked) PartialUpdateInstance(ctx context.Context, projectId, instanceId string) rabbitmq.ApiPartialUpdateInstanceRequest { - return testClient.PartialUpdateInstance(ctx, projectId, instanceId) -} - -func (c *rabbitMQClientMocked) ListOfferingsExecute(_ context.Context, _ string) (*rabbitmq.ListOfferingsResponse, error) { - if c.returnError { - return nil, fmt.Errorf("list flavors failed") +func newAPIMock(settings mockSettings) rabbitmq.DefaultAPI { + return rabbitmq.DefaultAPIServiceMock{ + ListOfferingsExecuteMock: utils.Ptr(func(_ rabbitmq.ApiListOfferingsRequest) (*rabbitmq.ListOfferingsResponse, error) { + if settings.returnError { + return nil, fmt.Errorf("list flavors failed") + } + return settings.listOfferingsResp, nil + }), } - return c.listOfferingsResp, nil } var ( testProjectId = uuid.NewString() testInstanceId = uuid.NewString() + testRegion = "eu01" testPlanId = uuid.NewString() testMonitoringInstanceId = uuid.NewString() ) @@ -56,12 +57,13 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, enableMonitoringFlag: "true", graphiteFlag: "example-graphite", metricsFrequencyFlag: "100", metricsPrefixFlag: "example-prefix", monitoringInstanceIdFlag: testMonitoringInstanceId, - pluginFlag: "example-plugin", + flagPlugins.Name(): string(rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_MQTT), sgwAclFlag: "198.51.100.14/24", syslogFlag: "example-syslog", planIdFlag: testPlanId, @@ -76,17 +78,18 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, EnableMonitoring: utils.Ptr(true), Graphite: utils.Ptr("example-graphite"), - MetricsFrequency: utils.Ptr(int64(100)), + MetricsFrequency: utils.Ptr(int32(100)), MetricsPrefix: utils.Ptr("example-prefix"), MonitoringInstanceId: utils.Ptr(testMonitoringInstanceId), - Plugin: utils.Ptr([]string{"example-plugin"}), + Plugin: []rabbitmq.InstanceParametersPluginsInner{rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_MQTT}, SgwAcl: utils.Ptr([]string{"198.51.100.14/24"}), - Syslog: utils.Ptr([]string{"example-syslog"}), + Syslog: []string{"example-syslog"}, PlanId: utils.Ptr(testPlanId), } for _, mod := range mods { @@ -96,17 +99,17 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *rabbitmq.ApiPartialUpdateInstanceRequest)) rabbitmq.ApiPartialUpdateInstanceRequest { - request := testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId) + request := testClient.DefaultAPI.PartialUpdateInstance(testCtx, testProjectId, testRegion, testInstanceId) request = request.PartialUpdateInstancePayload(rabbitmq.PartialUpdateInstancePayload{ Parameters: &rabbitmq.InstanceParameters{ EnableMonitoring: utils.Ptr(true), Graphite: utils.Ptr("example-graphite"), - MetricsFrequency: utils.Ptr(int64(100)), + MetricsFrequency: utils.Ptr(int32(100)), MetricsPrefix: utils.Ptr("example-prefix"), MonitoringInstanceId: utils.Ptr(testMonitoringInstanceId), - Plugins: utils.Ptr([]string{"example-plugin"}), + Plugins: []rabbitmq.InstanceParametersPluginsInner{rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_MQTT}, SgwAcl: utils.Ptr("198.51.100.14/24"), - Syslog: utils.Ptr([]string{"example-syslog"}), + Syslog: []string{"example-syslog"}, }, PlanId: utils.Ptr(testPlanId), }) @@ -188,7 +191,7 @@ func TestParseInput(t *testing.T) { PlanId: utils.Ptr(testPlanId), EnableMonitoring: utils.Ptr(false), Graphite: utils.Ptr(""), - MetricsFrequency: utils.Ptr(int64(0)), + MetricsFrequency: utils.Ptr(int32(0)), MetricsPrefix: utils.Ptr(""), }, }, @@ -267,12 +270,11 @@ func TestParseInput(t *testing.T) { description: "repeated plugin flags", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(), - pluginValues: []string{"example-plugin-1", "example-plugin-2"}, + pluginValues: []string{string(rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_MQTT), string(rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_CONSISTENT_HASH_EXCHANGE)}, isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { - model.Plugin = utils.Ptr( - append(*model.Plugin, "example-plugin-1", "example-plugin-2"), - ) + model.Plugin = + append(model.Plugin, rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_MQTT, rabbitmq.INSTANCEPARAMETERSPLUGINSINNER_RABBITMQ_CONSISTENT_HASH_EXCHANGE) }), }, { @@ -282,93 +284,19 @@ func TestParseInput(t *testing.T) { syslogValues: []string{"example-syslog-1", "example-syslog-2"}, isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { - model.Syslog = utils.Ptr( - append(*model.Syslog, "example-syslog-1", "example-syslog-2"), - ) + model.Syslog = + append(model.Syslog, "example-syslog-1", "example-syslog-2") }), }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - params := testparams.NewTestParams() - cmd := NewCmd(params.CmdParams) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.sgwAclValues { - err := cmd.Flags().Set(sgwAclFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", sgwAclFlag, value, err) - } - } - - for _, value := range tt.pluginValues { - err := cmd.Flags().Set(pluginFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", pluginFlag, value, err) - } - } - - for _, value := range tt.syslogValues { - err := cmd.Flags().Set(syslogFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", syslogFlag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(params.Printer, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + sgwAclFlag: tt.sgwAclValues, + syslogFlag: tt.syslogValues, + flagPlugins.Name(): tt.pluginValues, + }, tt.isValid) }) } } @@ -387,13 +315,13 @@ func TestBuildRequest(t *testing.T) { model: fixtureInputModel(), expectedRequest: fixtureRequest(), listOfferingsResp: &rabbitmq.ListOfferingsResponse{ - Offerings: &[]rabbitmq.Offering{ + Offerings: []rabbitmq.Offering{ { - Version: utils.Ptr("example-version"), - Plans: &[]rabbitmq.Plan{ + Version: "example-version", + Plans: []rabbitmq.Plan{ { - Name: utils.Ptr("example-plan-name"), - Id: utils.Ptr(testPlanId), + Name: "example-plan-name", + Id: testPlanId, }, }, }, @@ -411,13 +339,13 @@ func TestBuildRequest(t *testing.T) { ), expectedRequest: fixtureRequest(), listOfferingsResp: &rabbitmq.ListOfferingsResponse{ - Offerings: &[]rabbitmq.Offering{ + Offerings: []rabbitmq.Offering{ { - Version: utils.Ptr("example-version"), - Plans: &[]rabbitmq.Plan{ + Version: "example-version", + Plans: []rabbitmq.Plan{ { - Name: utils.Ptr("example-plan-name"), - Id: utils.Ptr(testPlanId), + Name: "example-plan-name", + Id: testPlanId, }, }, }, @@ -446,13 +374,13 @@ func TestBuildRequest(t *testing.T) { }, ), listOfferingsResp: &rabbitmq.ListOfferingsResponse{ - Offerings: &[]rabbitmq.Offering{ + Offerings: []rabbitmq.Offering{ { - Version: utils.Ptr("example-version"), - Plans: &[]rabbitmq.Plan{ + Version: "example-version", + Plans: []rabbitmq.Plan{ { - Name: utils.Ptr("other-plan-name"), - Id: utils.Ptr(testPlanId), + Name: "other-plan-name", + Id: testPlanId, }, }, }, @@ -465,22 +393,23 @@ func TestBuildRequest(t *testing.T) { model: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, }, - expectedRequest: testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId). + expectedRequest: testClient.DefaultAPI.PartialUpdateInstance(testCtx, testProjectId, testRegion, testInstanceId). PartialUpdateInstancePayload(rabbitmq.PartialUpdateInstancePayload{Parameters: &rabbitmq.InstanceParameters{}}), }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - client := &rabbitMQClientMocked{ + settings := mockSettings{ returnError: tt.getOfferingsFails, listOfferingsResp: tt.listOfferingsResp, } - request, err := buildRequest(testCtx, tt.model, client) + request, err := buildRequest(testCtx, tt.model, newAPIMock(settings)) if err != nil { if !tt.isValid { return @@ -490,7 +419,10 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), - cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testCtx, rabbitmq.DefaultAPIService{}), + cmp.FilterPath(func(p cmp.Path) bool { + return p.String() == "ApiService" + }, cmp.Ignore()), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/rabbitmq/plans/plans.go b/internal/cmd/rabbitmq/plans/plans.go index cc9cc3e1b..13f18dabf 100644 --- a/internal/cmd/rabbitmq/plans/plans.go +++ b/internal/cmd/rabbitmq/plans/plans.go @@ -15,10 +15,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/rabbitmq/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" ) const ( @@ -115,7 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.APIClient) rabbitmq.ApiListOfferingsRequest { - req := apiClient.ListOfferings(ctx, model.ProjectId) + req := apiClient.DefaultAPI.ListOfferings(ctx, model.ProjectId, model.Region) return req } @@ -131,14 +130,14 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, plans []r for i := range plans { o := plans[i] if o.Plans != nil { - for j := range *o.Plans { - plan := (*o.Plans)[j] + for j := range o.Plans { + plan := o.Plans[j] table.AddRow( - utils.PtrString(o.Name), - utils.PtrString(o.Version), - utils.PtrString(plan.Id), - utils.PtrString(plan.Name), - utils.PtrString(plan.Description), + o.Name, + o.Version, + plan.Id, + plan.Name, + plan.Description, ) } table.AddSeparator() diff --git a/internal/cmd/rabbitmq/plans/plans_test.go b/internal/cmd/rabbitmq/plans/plans_test.go index 2a41f6ae9..0eaa9f024 100644 --- a/internal/cmd/rabbitmq/plans/plans_test.go +++ b/internal/cmd/rabbitmq/plans/plans_test.go @@ -7,7 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -18,12 +18,14 @@ import ( type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &rabbitmq.APIClient{} +var testClient = &rabbitmq.APIClient{DefaultAPI: &rabbitmq.DefaultAPIService{}} var testProjectId = uuid.NewString() +var testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, limitFlag: "10", } for _, mod := range mods { @@ -36,6 +38,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Limit: utils.Ptr(int64(10)), @@ -47,7 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *rabbitmq.ApiListOfferingsRequest)) rabbitmq.ApiListOfferingsRequest { - request := testClient.ListOfferings(testCtx, testProjectId) + request := testClient.DefaultAPI.ListOfferings(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -136,7 +139,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), - cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testCtx, rabbitmq.DefaultAPIService{}), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/pkg/services/rabbitmq/client/client.go b/internal/pkg/services/rabbitmq/client/client.go index df717b305..999a2446a 100644 --- a/internal/pkg/services/rabbitmq/client/client.go +++ b/internal/pkg/services/rabbitmq/client/client.go @@ -6,9 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/spf13/viper" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" ) func ConfigureClient(p *print.Printer, cliVersion string) (*rabbitmq.APIClient, error) { - return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.RabbitMQCustomEndpointKey), true, genericclient.CreateApiClient[*rabbitmq.APIClient](rabbitmq.NewAPIClient)) + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.RabbitMQCustomEndpointKey), false, genericclient.CreateApiClient[*rabbitmq.APIClient](rabbitmq.NewAPIClient)) } diff --git a/internal/pkg/services/rabbitmq/utils/utils.go b/internal/pkg/services/rabbitmq/utils/utils.go index 6eced8759..4d33c2cfb 100644 --- a/internal/pkg/services/rabbitmq/utils/utils.go +++ b/internal/pkg/services/rabbitmq/utils/utils.go @@ -7,7 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/errors" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" ) const ( @@ -15,9 +15,9 @@ const ( ) func ValidatePlanId(planId string, offerings *rabbitmq.ListOfferingsResponse) error { - for _, offer := range *offerings.Offerings { - for _, plan := range *offer.Plans { - if plan.Id != nil && strings.EqualFold(*plan.Id, planId) { + for _, offer := range offerings.GetOfferings() { + for _, plan := range offer.Plans { + if strings.EqualFold(plan.Id, planId) { return nil } } @@ -33,21 +33,18 @@ func LoadPlanId(planName, version string, offerings *rabbitmq.ListOfferingsRespo availableVersions := "" availablePlanNames := "" isValidVersion := false - for _, offer := range *offerings.Offerings { - if !strings.EqualFold(*offer.Version, version) { - availableVersions = fmt.Sprintf("%s\n- %s", availableVersions, *offer.Version) + for _, offer := range offerings.GetOfferings() { + if !strings.EqualFold(offer.Version, version) { + availableVersions = fmt.Sprintf("%s\n- %s", availableVersions, offer.Version) continue } isValidVersion = true - for _, plan := range *offer.Plans { - if plan.Name == nil { - continue + for _, plan := range offer.Plans { + if strings.EqualFold(plan.Name, planName) { + return &plan.Id, nil } - if strings.EqualFold(*plan.Name, planName) && plan.Id != nil { - return plan.Id, nil - } - availablePlanNames = fmt.Sprintf("%s\n- %s", availablePlanNames, *plan.Name) + availablePlanNames = fmt.Sprintf("%s\n- %s", availablePlanNames, plan.Name) } } @@ -65,23 +62,18 @@ func LoadPlanId(planName, version string, offerings *rabbitmq.ListOfferingsRespo } } -type RabbitMQClient interface { - GetInstanceExecute(ctx context.Context, projectId, instanceId string) (*rabbitmq.Instance, error) - GetCredentialsExecute(ctx context.Context, projectId, instanceId, credentialsId string) (*rabbitmq.CredentialsResponse, error) -} - -func GetInstanceName(ctx context.Context, apiClient RabbitMQClient, projectId, instanceId string) (string, error) { - resp, err := apiClient.GetInstanceExecute(ctx, projectId, instanceId) +func GetInstanceName(ctx context.Context, apiClient rabbitmq.DefaultAPI, projectId, region, instanceId string) (string, error) { + resp, err := apiClient.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { return "", fmt.Errorf("get RabbitMQ instance: %w", err) } - return *resp.Name, nil + return resp.Name, nil } -func GetCredentialsUsername(ctx context.Context, apiClient RabbitMQClient, projectId, instanceId, credentialsId string) (string, error) { - resp, err := apiClient.GetCredentialsExecute(ctx, projectId, instanceId, credentialsId) +func GetCredentialsUsername(ctx context.Context, apiClient rabbitmq.DefaultAPI, projectId, region, instanceId, credentialsId string) (string, error) { + resp, err := apiClient.GetCredentials(ctx, projectId, region, instanceId, credentialsId).Execute() if err != nil { return "", fmt.Errorf("get RabbitMQ credentials: %w", err) } - return *resp.Raw.Credentials.Username, nil + return resp.Raw.Credentials.Username, nil } diff --git a/internal/pkg/services/rabbitmq/utils/utils_test.go b/internal/pkg/services/rabbitmq/utils/utils_test.go index 7c468c02c..7939cb86b 100644 --- a/internal/pkg/services/rabbitmq/utils/utils_test.go +++ b/internal/pkg/services/rabbitmq/utils/utils_test.go @@ -8,7 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" ) var ( @@ -19,28 +19,32 @@ var ( const ( testInstanceName = "instance" + testRegion = "eu01" testCredentialsUsername = "username" ) -type rabbitMQClientMocked struct { +type rabbitMQClientMockSettings struct { getInstanceFails bool getInstanceResp *rabbitmq.Instance getCredentialsFails bool getCredentialsResp *rabbitmq.CredentialsResponse } -func (m *rabbitMQClientMocked) GetInstanceExecute(_ context.Context, _, _ string) (*rabbitmq.Instance, error) { - if m.getInstanceFails { - return nil, fmt.Errorf("could not get instance") - } - return m.getInstanceResp, nil -} - -func (m *rabbitMQClientMocked) GetCredentialsExecute(_ context.Context, _, _, _ string) (*rabbitmq.CredentialsResponse, error) { - if m.getCredentialsFails { - return nil, fmt.Errorf("could not get user") +func newApiMock(s *rabbitMQClientMockSettings) rabbitmq.DefaultAPI { + return &rabbitmq.DefaultAPIServiceMock{ + GetInstanceExecuteMock: utils.Ptr(func(_ rabbitmq.ApiGetInstanceRequest) (*rabbitmq.Instance, error) { + if s.getInstanceFails { + return nil, fmt.Errorf("could not get instance") + } + return s.getInstanceResp, nil + }), + GetCredentialsExecuteMock: utils.Ptr(func(_ rabbitmq.ApiGetCredentialsRequest) (*rabbitmq.CredentialsResponse, error) { + if s.getCredentialsFails { + return nil, fmt.Errorf("could not get user") + } + return s.getCredentialsResp, nil + }), } - return m.getCredentialsResp, nil } func TestGetInstanceName(t *testing.T) { @@ -54,7 +58,7 @@ func TestGetInstanceName(t *testing.T) { { description: "base", getInstanceResp: &rabbitmq.Instance{ - Name: utils.Ptr(testInstanceName), + Name: testInstanceName, }, isValid: true, expectedOutput: testInstanceName, @@ -68,12 +72,12 @@ func TestGetInstanceName(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - client := &rabbitMQClientMocked{ + settings := &rabbitMQClientMockSettings{ getInstanceFails: tt.getInstanceFails, getInstanceResp: tt.getInstanceResp, } - output, err := GetInstanceName(context.Background(), client, testProjectId, testInstanceId) + output, err := GetInstanceName(context.Background(), newApiMock(settings), testProjectId, testRegion, testInstanceId) if tt.isValid && err != nil { t.Errorf("failed on valid input") @@ -103,8 +107,8 @@ func TestGetCredentialsUsername(t *testing.T) { description: "base", getCredentialsResp: &rabbitmq.CredentialsResponse{ Raw: &rabbitmq.RawCredentials{ - Credentials: &rabbitmq.Credentials{ - Username: utils.Ptr(testCredentialsUsername), + Credentials: rabbitmq.Credentials{ + Username: testCredentialsUsername, }, }, }, @@ -120,12 +124,12 @@ func TestGetCredentialsUsername(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - client := &rabbitMQClientMocked{ + settings := &rabbitMQClientMockSettings{ getCredentialsFails: tt.getCredentialsFails, getCredentialsResp: tt.getCredentialsResp, } - output, err := GetCredentialsUsername(context.Background(), client, testProjectId, testInstanceId, testCredentialsId) + output, err := GetCredentialsUsername(context.Background(), newApiMock(settings), testProjectId, testRegion, testInstanceId, testCredentialsId) if tt.isValid && err != nil { t.Errorf("failed on valid input")