From 1844f83ab9c6952979b243f5c917991066a060ef Mon Sep 17 00:00:00 2001 From: Carlo Goetz Date: Thu, 2 Jul 2026 10:33:38 +0200 Subject: [PATCH] feat(observability): migrate to multi version SDK STACKITCLI-371 --- go.mod | 2 +- go.sum | 2 + .../credentials/create/create.go | 23 +- .../credentials/create/create_test.go | 12 +- .../credentials/delete/delete.go | 8 +- .../credentials/delete/delete_test.go | 10 +- .../observability/credentials/list/list.go | 11 +- .../credentials/list/list_test.go | 10 +- .../grafana/describe/describe.go | 14 +- .../grafana/describe/describe_test.go | 20 +- .../public-read-access/disable/disable.go | 8 +- .../disable/disable_test.go | 49 ++-- .../public-read-access/enable/enable.go | 8 +- .../public-read-access/enable/enable_test.go | 49 ++-- .../grafana/single-sign-on/disable/disable.go | 8 +- .../single-sign-on/disable/disable_test.go | 49 ++-- .../grafana/single-sign-on/enable/enable.go | 8 +- .../single-sign-on/enable/enable_test.go | 49 ++-- .../observability/instance/create/create.go | 26 +- .../instance/create/create_test.go | 41 +-- .../observability/instance/delete/delete.go | 12 +- .../instance/delete/delete_test.go | 10 +- .../instance/describe/describe.go | 41 ++- .../instance/describe/describe_test.go | 10 +- .../cmd/observability/instance/list/list.go | 12 +- .../observability/instance/list/list_test.go | 10 +- .../observability/instance/update/update.go | 27 +- .../instance/update/update_test.go | 46 ++-- internal/cmd/observability/plans/plans.go | 8 +- .../cmd/observability/plans/plans_test.go | 10 +- .../scrape-config/create/create.go | 17 +- .../scrape-config/create/create_test.go | 47 ++-- .../scrape-config/delete/delete.go | 12 +- .../scrape-config/delete/delete_test.go | 10 +- .../scrape-config/describe/describe.go | 26 +- .../scrape-config/describe/describe_test.go | 21 +- .../generate-payload/generate_payload.go | 10 +- .../generate-payload/generate_payload_test.go | 10 +- .../observability/scrape-config/list/list.go | 17 +- .../scrape-config/list/list_test.go | 10 +- .../scrape-config/update/update.go | 6 +- .../scrape-config/update/update_test.go | 40 +-- .../services/observability/client/client.go | 2 +- .../pkg/services/observability/utils/utils.go | 114 ++++---- .../observability/utils/utils_test.go | 252 ++++++++++-------- internal/pkg/utils/utils.go | 11 + internal/pkg/utils/utils_test.go | 56 +++- 47 files changed, 671 insertions(+), 583 deletions(-) diff --git a/go.mod b/go.mod index 1ba8fc21a..1a1336cc8 100644 --- a/go.mod +++ b/go.mod @@ -270,7 +270,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 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/observability v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.26.0 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/sfs v0.9.0 diff --git a/go.sum b/go.sum index e08536c68..50aa306e6 100644 --- a/go.sum +++ b/go.sum @@ -628,6 +628,8 @@ github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.7.0 h1:UxnbsKm6 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.7.0/go.mod h1:RFL4h6JZvpsyFYbdJ3+eINEkletzJQTfrPdd+yPT/fU= github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0 h1:LGwCvvST0fwUgZ6bOxYIfu45qqTgv421ZS07UhKjZL8= github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0/go.mod h1:9KdrXC5JS30Ay3mR0adb3vNdhca+qxiy/cPF5P4wehQ= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.24.0 h1:KhuWPXr1hl8BFLGLSi6wjxh5o6OQXH9amfquMhYQROU= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.24.0/go.mod h1:0fEZQHm729mBdvg4sNrAhM6KmHROHJSeS2FwCMRk46k= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 h1:oTVx1+O177Ojn8OvXIOUbRSwtx7L59jhxDPrZEQFOfQ= 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= diff --git a/internal/cmd/observability/credentials/create/create.go b/internal/cmd/observability/credentials/create/create.go index 6c2f8289f..d3cd35864 100644 --- a/internal/cmd/observability/credentials/create/create.go +++ b/internal/cmd/observability/credentials/create/create.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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "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/observability/client" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) const ( @@ -56,7 +55,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -69,7 +68,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) if err != nil { return err } @@ -104,7 +103,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, }, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiCreateCredentialsRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiCreateCredentialsRequest { req := apiClient.CreateCredentials(ctx, model.InstanceId, model.ProjectId) return req } @@ -117,15 +116,13 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, resp *ob return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created credentials for instance %q.\n\n", instanceLabel) - if resp.Credentials != nil { - // The username field cannot be set by the user, so we only display it if it's not returned empty - username := *resp.Credentials.Username - if username != "" { - p.Outputf("Username: %s\n", username) - } - - p.Outputf("Password: %s\n", utils.PtrString(resp.Credentials.Password)) + // The username field cannot be set by the user, so we only display it if it's not returned empty + username := resp.Credentials.Username + if username != "" { + p.Outputf("Username: %s\n", username) } + + p.Outputf("Password: %s\n", resp.Credentials.Password) return nil }) } diff --git a/internal/cmd/observability/credentials/create/create_test.go b/internal/cmd/observability/credentials/create/create_test.go index d0d2bb324..7f132f9ef 100644 --- a/internal/cmd/observability/credentials/create/create_test.go +++ b/internal/cmd/observability/credentials/create/create_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -20,7 +20,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -50,7 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiCreateCredentialsRequest)) observability.ApiCreateCredentialsRequest { - request := testClient.CreateCredentials(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.CreateCredentials(testCtx, testInstanceId, testProjectId) for _, mod := range mods { mod(&request) } @@ -142,10 +142,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { @@ -182,7 +182,7 @@ func TestOutputResult(t *testing.T) { name: "set response with credentials", args: args{ resp: &observability.CreateCredentialsResponse{ - Credentials: observability.NewCredentials("dummy-pw", "dummy-user"), + Credentials: *observability.NewCredentials("dummy-pw", "dummy-user"), }, }, wantErr: false, diff --git a/internal/cmd/observability/credentials/delete/delete.go b/internal/cmd/observability/credentials/delete/delete.go index a28888dc9..c2e04ae3c 100644 --- a/internal/cmd/observability/credentials/delete/delete.go +++ b/internal/cmd/observability/credentials/delete/delete.go @@ -16,7 +16,7 @@ import ( observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) const ( @@ -55,7 +55,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -68,7 +68,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) _, err = req.Execute() if err != nil { return fmt.Errorf("delete Observability credentials: %w", err) @@ -104,7 +104,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu }, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiDeleteCredentialsRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiDeleteCredentialsRequest { req := apiClient.DeleteCredentials(ctx, model.InstanceId, model.ProjectId, model.Username) return req } diff --git a/internal/cmd/observability/credentials/delete/delete_test.go b/internal/cmd/observability/credentials/delete/delete_test.go index 21965e75c..d1a52f216 100644 --- a/internal/cmd/observability/credentials/delete/delete_test.go +++ b/internal/cmd/observability/credentials/delete/delete_test.go @@ -9,7 +9,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -17,7 +17,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -60,7 +60,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiDeleteCredentialsRequest)) observability.ApiDeleteCredentialsRequest { - request := testClient.DeleteCredentials(testCtx, testInstanceId, testProjectId, testUsername) + request := testClient.DefaultAPI.DeleteCredentials(testCtx, testInstanceId, testProjectId, testUsername) for _, mod := range mods { mod(&request) } @@ -224,10 +224,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/observability/credentials/list/list.go b/internal/cmd/observability/credentials/list/list.go index 94ec66a4d..96d6129cd 100644 --- a/internal/cmd/observability/credentials/list/list.go +++ b/internal/cmd/observability/credentials/list/list.go @@ -15,10 +15,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/client" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) const ( @@ -63,7 +62,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) resp, err := req.Execute() if err != nil { return fmt.Errorf("list Observability credentials: %w", err) @@ -71,7 +70,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { credentials := resp.GetCredentials() - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -117,7 +116,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, }, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiListCredentialsRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiListCredentialsRequest { req := apiClient.ListCredentials(ctx, model.InstanceId, model.ProjectId) return req } @@ -132,7 +131,7 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, credenti table.SetHeader("USERNAME") for i := range credentials { c := credentials[i] - table.AddRow(utils.PtrString(c.Name)) + table.AddRow(c.Name) } err := table.Display(p) if err != nil { diff --git a/internal/cmd/observability/credentials/list/list_test.go b/internal/cmd/observability/credentials/list/list_test.go index ee45d8980..01e93cc32 100644 --- a/internal/cmd/observability/credentials/list/list_test.go +++ b/internal/cmd/observability/credentials/list/list_test.go @@ -12,7 +12,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -20,7 +20,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -52,7 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiListCredentialsRequest)) observability.ApiListCredentialsRequest { - request := testClient.ListCredentials(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.ListCredentials(testCtx, testInstanceId, testProjectId) for _, mod := range mods { mod(&request) } @@ -158,10 +158,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/observability/grafana/describe/describe.go b/internal/cmd/observability/grafana/describe/describe.go index 88b7f70b6..e4e558b35 100644 --- a/internal/cmd/observability/grafana/describe/describe.go +++ b/internal/cmd/observability/grafana/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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) const ( @@ -63,12 +63,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - grafanaConfigsReq := buildGetGrafanaConfigRequest(ctx, model, apiClient) + grafanaConfigsReq := buildGetGrafanaConfigRequest(ctx, model, apiClient.DefaultAPI) grafanaConfigsResp, err := grafanaConfigsReq.Execute() if err != nil { return fmt.Errorf("get Grafana configs: %w", err) } - instanceReq := buildGetInstanceRequest(ctx, model, apiClient) + instanceReq := buildGetInstanceRequest(ctx, model, apiClient.DefaultAPI) instanceResp, err := instanceReq.Execute() if err != nil { return fmt.Errorf("get instance: %w", err) @@ -104,18 +104,18 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } -func buildGetGrafanaConfigRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiGetGrafanaConfigsRequest { +func buildGetGrafanaConfigRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiGetGrafanaConfigsRequest { req := apiClient.GetGrafanaConfigs(ctx, model.InstanceId, model.ProjectId) return req } -func buildGetInstanceRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiGetInstanceRequest { +func buildGetInstanceRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiGetInstanceRequest { req := apiClient.GetInstance(ctx, model.InstanceId, model.ProjectId) return req } func outputResult(p *print.Printer, outputFormat string, showPassword bool, grafanaConfigs *observability.GrafanaConfigs, instance *observability.GetInstanceResponse) error { - if instance == nil || instance.Instance == nil { + if instance == nil { return fmt.Errorf("instance or instance content is nil") } else if grafanaConfigs == nil { return fmt.Errorf("grafanaConfigs is nil") @@ -130,7 +130,7 @@ func outputResult(p *print.Printer, outputFormat string, showPassword bool, graf } table := tables.NewTable() - table.AddRow("GRAFANA DASHBOARD", utils.PtrString(instance.Instance.GrafanaUrl)) + table.AddRow("GRAFANA DASHBOARD", instance.Instance.GrafanaUrl) table.AddSeparator() table.AddRow("PUBLIC READ ACCESS", utils.PtrString(grafanaConfigs.PublicReadAccess)) table.AddSeparator() diff --git a/internal/cmd/observability/grafana/describe/describe_test.go b/internal/cmd/observability/grafana/describe/describe_test.go index c35d5267c..f9bfad81e 100644 --- a/internal/cmd/observability/grafana/describe/describe_test.go +++ b/internal/cmd/observability/grafana/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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" "github.com/stackitcloud/stackit-cli/internal/pkg/testparams" @@ -19,7 +19,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -58,7 +58,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureGetGrafanaConfigsRequest(mods ...func(request *observability.ApiGetGrafanaConfigsRequest)) observability.ApiGetGrafanaConfigsRequest { - request := testClient.GetGrafanaConfigs(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.GetGrafanaConfigs(testCtx, testInstanceId, testProjectId) for _, mod := range mods { mod(&request) } @@ -66,7 +66,7 @@ func fixtureGetGrafanaConfigsRequest(mods ...func(request *observability.ApiGetG } func fixtureGetInstanceRequest(mods ...func(request *observability.ApiGetInstanceRequest)) observability.ApiGetInstanceRequest { - request := testClient.GetInstance(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.GetInstance(testCtx, testInstanceId, testProjectId) for _, mod := range mods { mod(&request) } @@ -237,10 +237,10 @@ func TestBuildGetGrafanaConfigsRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildGetGrafanaConfigRequest(testCtx, tt.model, testClient) + request := buildGetGrafanaConfigRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { @@ -265,10 +265,10 @@ func TestBuildGetInstanceRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildGetInstanceRequest(testCtx, tt.model, testClient) + request := buildGetInstanceRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { @@ -306,7 +306,7 @@ func TestOutputResult(t *testing.T) { name: "set instance but no grafana config", args: args{ instance: &observability.GetInstanceResponse{ - Instance: &observability.InstanceSensitiveData{}, + Instance: observability.InstanceSensitiveData{}, }, }, wantErr: true, @@ -316,7 +316,7 @@ func TestOutputResult(t *testing.T) { args: args{ grafanaConfig: &observability.GrafanaConfigs{}, instance: &observability.GetInstanceResponse{ - Instance: &observability.InstanceSensitiveData{}, + Instance: observability.InstanceSensitiveData{}, }, }, wantErr: false, diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable.go b/internal/cmd/observability/grafana/public-read-access/disable/disable.go index 0b6b3fcc5..bbc584ef6 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable.go @@ -6,7 +6,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -56,7 +56,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil || instanceLabel == "" { instanceLabel = model.InstanceId } @@ -68,7 +68,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 { return fmt.Errorf("build request: %w", err) } @@ -101,7 +101,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient observabilityUtils.ObservabilityClient) (observability.ApiUpdateGrafanaConfigsRequest, error) { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) (observability.ApiUpdateGrafanaConfigsRequest, error) { req := apiClient.UpdateGrafanaConfigs(ctx, model.InstanceId, model.ProjectId) payload, err := observabilityUtils.GetPartialUpdateGrafanaConfigsPayload(ctx, apiClient, model.InstanceId, model.ProjectId, nil, utils.Ptr(false)) if err != nil { diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go b/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go index 89cbf05e9..2a8c3b53c 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go @@ -12,7 +12,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) @@ -22,7 +22,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -31,19 +31,15 @@ type observabilityClientMocked struct { getGrafanaConfigsResp *observability.GrafanaConfigs } -func (c *observabilityClientMocked) GetInstanceExecute(ctx context.Context, instanceId, projectId string) (*observability.GetInstanceResponse, error) { - return testClient.GetInstanceExecute(ctx, instanceId, projectId) -} - -func (c *observabilityClientMocked) UpdateGrafanaConfigs(ctx context.Context, instanceId, projectId string) observability.ApiUpdateGrafanaConfigsRequest { - return testClient.UpdateGrafanaConfigs(ctx, instanceId, projectId) -} - -func (c *observabilityClientMocked) GetGrafanaConfigsExecute(_ context.Context, _, _ string) (*observability.GrafanaConfigs, error) { - if c.getGrafanaConfigsFails { - return nil, fmt.Errorf("get payload failed") +func (c *observabilityClientMocked) newMock() observability.DefaultAPI { + return observability.DefaultAPIServiceMock{ + GetGrafanaConfigsExecuteMock: utils.Ptr(func(_ observability.ApiGetGrafanaConfigsRequest) (*observability.GrafanaConfigs, error) { + if c.getGrafanaConfigsFails { + return nil, fmt.Errorf("get payload failed") + } + return c.getGrafanaConfigsResp, nil + }), } - return c.getGrafanaConfigsResp, nil } func fixtureArgValues(mods ...func(argValues []string)) []string { @@ -82,17 +78,17 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { func fixtureGrafanaConfigs(mods ...func(gc *observability.GrafanaConfigs)) *observability.GrafanaConfigs { gc := observability.GrafanaConfigs{ - GenericOauth: &observability.GrafanaOauth{ - ApiUrl: utils.Ptr("apiUrl"), - AuthUrl: utils.Ptr("authUrl"), - Enabled: utils.Ptr(true), + GenericOauth: &observability.GrafanaOauth{ // nolint:gosec // false positive + ApiUrl: "apiUrl", + AuthUrl: "authUrl", + Enabled: true, Name: utils.Ptr("name"), - OauthClientId: utils.Ptr("oauthClientId"), - OauthClientSecret: utils.Ptr("oauthClientSecret"), - RoleAttributePath: utils.Ptr("roleAttributePath"), + OauthClientId: "oauthClientId", + OauthClientSecret: "oauthClientSecret", + RoleAttributePath: "roleAttributePath", RoleAttributeStrict: utils.Ptr(true), Scopes: utils.Ptr("scopes"), - TokenUrl: utils.Ptr("tokenUrl"), + TokenUrl: "tokenUrl", UsePkce: utils.Ptr(true), }, PublicReadAccess: utils.Ptr(false), @@ -117,7 +113,7 @@ func fixturePayload(mods ...func(payload *observability.UpdateGrafanaConfigsPayl } func fixtureRequest(mods ...func(request *observability.ApiUpdateGrafanaConfigsRequest)) observability.ApiUpdateGrafanaConfigsRequest { - request := testClient.UpdateGrafanaConfigs(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.UpdateGrafanaConfigs(testCtx, testInstanceId, testProjectId) request = request.UpdateGrafanaConfigsPayload(*fixturePayload()) for _, mod := range mods { mod(&request) @@ -215,7 +211,7 @@ func TestBuildRequest(t *testing.T) { }), isValid: true, expectedRequest: fixtureRequest(func(request *observability.ApiUpdateGrafanaConfigsRequest) { - *request = (*request).UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { + *request = request.UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { payload.GenericOauth = nil })) }), @@ -240,7 +236,7 @@ func TestBuildRequest(t *testing.T) { getGrafanaConfigsFails: tt.getGrafanaConfigsFails, getGrafanaConfigsResp: tt.getGrafanaConfigsResp, } - request, err := buildRequest(testCtx, tt.model, client) + request, err := buildRequest(testCtx, tt.model, client.newMock()) if err != nil { if !tt.isValid { return @@ -251,6 +247,9 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + 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/observability/grafana/public-read-access/enable/enable.go b/internal/cmd/observability/grafana/public-read-access/enable/enable.go index 88f58227d..934202d1f 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable.go @@ -15,7 +15,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) @@ -56,7 +56,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil || instanceLabel == "" { instanceLabel = model.InstanceId } @@ -68,7 +68,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 { return fmt.Errorf("build request: %w", err) } @@ -101,7 +101,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient observabilityUtils.ObservabilityClient) (observability.ApiUpdateGrafanaConfigsRequest, error) { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) (observability.ApiUpdateGrafanaConfigsRequest, error) { req := apiClient.UpdateGrafanaConfigs(ctx, model.InstanceId, model.ProjectId) payload, err := observabilityUtils.GetPartialUpdateGrafanaConfigsPayload(ctx, apiClient, model.InstanceId, model.ProjectId, nil, utils.Ptr(true)) if err != nil { diff --git a/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go b/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go index e81ed3bc4..5a7c9c4cb 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go @@ -12,7 +12,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) @@ -22,7 +22,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -31,19 +31,15 @@ type observabilityClientMocked struct { getGrafanaConfigsResp *observability.GrafanaConfigs } -func (c *observabilityClientMocked) GetInstanceExecute(ctx context.Context, instanceId, projectId string) (*observability.GetInstanceResponse, error) { - return testClient.GetInstanceExecute(ctx, instanceId, projectId) -} - -func (c *observabilityClientMocked) UpdateGrafanaConfigs(ctx context.Context, instanceId, projectId string) observability.ApiUpdateGrafanaConfigsRequest { - return testClient.UpdateGrafanaConfigs(ctx, instanceId, projectId) -} - -func (c *observabilityClientMocked) GetGrafanaConfigsExecute(_ context.Context, _, _ string) (*observability.GrafanaConfigs, error) { - if c.getGrafanaConfigsFails { - return nil, fmt.Errorf("get payload failed") +func (c *observabilityClientMocked) newMock() observability.DefaultAPI { + return observability.DefaultAPIServiceMock{ + GetGrafanaConfigsExecuteMock: utils.Ptr(func(_ observability.ApiGetGrafanaConfigsRequest) (*observability.GrafanaConfigs, error) { + if c.getGrafanaConfigsFails { + return nil, fmt.Errorf("get payload failed") + } + return c.getGrafanaConfigsResp, nil + }), } - return c.getGrafanaConfigsResp, nil } func fixtureArgValues(mods ...func(argValues []string)) []string { @@ -82,17 +78,17 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { func fixtureGrafanaConfigs(mods ...func(gc *observability.GrafanaConfigs)) *observability.GrafanaConfigs { gc := observability.GrafanaConfigs{ - GenericOauth: &observability.GrafanaOauth{ - ApiUrl: utils.Ptr("apiUrl"), - AuthUrl: utils.Ptr("authUrl"), - Enabled: utils.Ptr(true), + GenericOauth: &observability.GrafanaOauth{ // nolint:gosec // false positive + ApiUrl: "apiUrl", + AuthUrl: "authUrl", + Enabled: true, Name: utils.Ptr("name"), - OauthClientId: utils.Ptr("oauthClientId"), - OauthClientSecret: utils.Ptr("oauthClientSecret"), - RoleAttributePath: utils.Ptr("roleAttributePath"), + OauthClientId: "oauthClientId", + OauthClientSecret: "oauthClientSecret", + RoleAttributePath: "roleAttributePath", RoleAttributeStrict: utils.Ptr(true), Scopes: utils.Ptr("scopes"), - TokenUrl: utils.Ptr("tokenUrl"), + TokenUrl: "tokenUrl", UsePkce: utils.Ptr(true), }, PublicReadAccess: utils.Ptr(false), @@ -117,7 +113,7 @@ func fixturePayload(mods ...func(payload *observability.UpdateGrafanaConfigsPayl } func fixtureRequest(mods ...func(request *observability.ApiUpdateGrafanaConfigsRequest)) observability.ApiUpdateGrafanaConfigsRequest { - request := testClient.UpdateGrafanaConfigs(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.UpdateGrafanaConfigs(testCtx, testInstanceId, testProjectId) request = request.UpdateGrafanaConfigsPayload(*fixturePayload()) for _, mod := range mods { mod(&request) @@ -215,7 +211,7 @@ func TestBuildRequest(t *testing.T) { }), isValid: true, expectedRequest: fixtureRequest(func(request *observability.ApiUpdateGrafanaConfigsRequest) { - *request = (*request).UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { + *request = request.UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { payload.GenericOauth = nil })) }), @@ -240,7 +236,7 @@ func TestBuildRequest(t *testing.T) { getGrafanaConfigsFails: tt.getGrafanaConfigsFails, getGrafanaConfigsResp: tt.getGrafanaConfigsResp, } - request, err := buildRequest(testCtx, tt.model, client) + request, err := buildRequest(testCtx, tt.model, client.newMock()) if err != nil { if !tt.isValid { return @@ -251,6 +247,9 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + 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/observability/grafana/single-sign-on/disable/disable.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go index a2023c789..4dc229409 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go @@ -15,7 +15,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) @@ -56,7 +56,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil || instanceLabel == "" { instanceLabel = model.InstanceId } @@ -68,7 +68,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 { return fmt.Errorf("build request: %w", err) } @@ -101,7 +101,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient observabilityUtils.ObservabilityClient) (observability.ApiUpdateGrafanaConfigsRequest, error) { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) (observability.ApiUpdateGrafanaConfigsRequest, error) { req := apiClient.UpdateGrafanaConfigs(ctx, model.InstanceId, model.ProjectId) payload, err := observabilityUtils.GetPartialUpdateGrafanaConfigsPayload(ctx, apiClient, model.InstanceId, model.ProjectId, utils.Ptr(false), nil) if err != nil { diff --git a/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go index 704b7a199..3de0d5183 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go @@ -12,7 +12,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) @@ -22,7 +22,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -31,19 +31,15 @@ type observabilityClientMocked struct { getGrafanaConfigsResp *observability.GrafanaConfigs } -func (c *observabilityClientMocked) GetInstanceExecute(ctx context.Context, instanceId, projectId string) (*observability.GetInstanceResponse, error) { - return testClient.GetInstanceExecute(ctx, instanceId, projectId) -} - -func (c *observabilityClientMocked) UpdateGrafanaConfigs(ctx context.Context, instanceId, projectId string) observability.ApiUpdateGrafanaConfigsRequest { - return testClient.UpdateGrafanaConfigs(ctx, instanceId, projectId) -} - -func (c *observabilityClientMocked) GetGrafanaConfigsExecute(_ context.Context, _, _ string) (*observability.GrafanaConfigs, error) { - if c.getGrafanaConfigsFails { - return nil, fmt.Errorf("get payload failed") +func (c *observabilityClientMocked) newMock() observability.DefaultAPI { + return observability.DefaultAPIServiceMock{ + GetGrafanaConfigsExecuteMock: utils.Ptr(func(_ observability.ApiGetGrafanaConfigsRequest) (*observability.GrafanaConfigs, error) { + if c.getGrafanaConfigsFails { + return nil, fmt.Errorf("get payload failed") + } + return c.getGrafanaConfigsResp, nil + }), } - return c.getGrafanaConfigsResp, nil } func fixtureArgValues(mods ...func(argValues []string)) []string { @@ -82,17 +78,17 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { func fixtureGrafanaConfigs(mods ...func(gc *observability.GrafanaConfigs)) *observability.GrafanaConfigs { gc := observability.GrafanaConfigs{ - GenericOauth: &observability.GrafanaOauth{ - ApiUrl: utils.Ptr("apiUrl"), - AuthUrl: utils.Ptr("authUrl"), - Enabled: utils.Ptr(true), + GenericOauth: &observability.GrafanaOauth{ // nolint:gosec // false positive + ApiUrl: "apiUrl", + AuthUrl: "authUrl", + Enabled: true, Name: utils.Ptr("name"), - OauthClientId: utils.Ptr("oauthClientId"), - OauthClientSecret: utils.Ptr("oauthClientSecret"), - RoleAttributePath: utils.Ptr("roleAttributePath"), + OauthClientId: "oauthClientId", + OauthClientSecret: "oauthClientSecret", + RoleAttributePath: "roleAttributePath", RoleAttributeStrict: utils.Ptr(true), Scopes: utils.Ptr("scopes"), - TokenUrl: utils.Ptr("tokenUrl"), + TokenUrl: "tokenUrl", UsePkce: utils.Ptr(true), }, PublicReadAccess: utils.Ptr(false), @@ -117,7 +113,7 @@ func fixturePayload(mods ...func(payload *observability.UpdateGrafanaConfigsPayl } func fixtureRequest(mods ...func(request *observability.ApiUpdateGrafanaConfigsRequest)) observability.ApiUpdateGrafanaConfigsRequest { - request := testClient.UpdateGrafanaConfigs(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.UpdateGrafanaConfigs(testCtx, testInstanceId, testProjectId) request = request.UpdateGrafanaConfigsPayload(*fixturePayload()) for _, mod := range mods { mod(&request) @@ -215,7 +211,7 @@ func TestBuildRequest(t *testing.T) { }), isValid: true, expectedRequest: fixtureRequest(func(request *observability.ApiUpdateGrafanaConfigsRequest) { - *request = (*request).UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { + *request = request.UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { payload.GenericOauth = nil })) }), @@ -240,7 +236,7 @@ func TestBuildRequest(t *testing.T) { getGrafanaConfigsFails: tt.getGrafanaConfigsFails, getGrafanaConfigsResp: tt.getGrafanaConfigsResp, } - request, err := buildRequest(testCtx, tt.model, client) + request, err := buildRequest(testCtx, tt.model, client.newMock()) if err != nil { if !tt.isValid { return @@ -251,6 +247,9 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + 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/observability/grafana/single-sign-on/enable/enable.go b/internal/cmd/observability/grafana/single-sign-on/enable/enable.go index 3aca5bbe8..a7a8213b6 100644 --- a/internal/cmd/observability/grafana/single-sign-on/enable/enable.go +++ b/internal/cmd/observability/grafana/single-sign-on/enable/enable.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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) const ( @@ -55,7 +55,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil || instanceLabel == "" { instanceLabel = model.InstanceId } @@ -67,7 +67,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 { return fmt.Errorf("build request: %w", err) } @@ -100,7 +100,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient observabilityUtils.ObservabilityClient) (observability.ApiUpdateGrafanaConfigsRequest, error) { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) (observability.ApiUpdateGrafanaConfigsRequest, error) { req := apiClient.UpdateGrafanaConfigs(ctx, model.InstanceId, model.ProjectId) payload, err := observabilityUtils.GetPartialUpdateGrafanaConfigsPayload(ctx, apiClient, model.InstanceId, model.ProjectId, utils.Ptr(true), nil) if err != nil { diff --git a/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go b/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go index f13a2db25..915445ae4 100644 --- a/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go +++ b/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go @@ -13,7 +13,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -21,7 +21,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -30,19 +30,15 @@ type observabilityClientMocked struct { getGrafanaConfigsResp *observability.GrafanaConfigs } -func (c *observabilityClientMocked) GetInstanceExecute(ctx context.Context, instanceId, projectId string) (*observability.GetInstanceResponse, error) { - return testClient.GetInstanceExecute(ctx, instanceId, projectId) -} - -func (c *observabilityClientMocked) UpdateGrafanaConfigs(ctx context.Context, instanceId, projectId string) observability.ApiUpdateGrafanaConfigsRequest { - return testClient.UpdateGrafanaConfigs(ctx, instanceId, projectId) -} - -func (c *observabilityClientMocked) GetGrafanaConfigsExecute(_ context.Context, _, _ string) (*observability.GrafanaConfigs, error) { - if c.getGrafanaConfigsFails { - return nil, fmt.Errorf("get payload failed") +func (c *observabilityClientMocked) newMock() observability.DefaultAPI { + return observability.DefaultAPIServiceMock{ + GetGrafanaConfigsExecuteMock: utils.Ptr(func(_ observability.ApiGetGrafanaConfigsRequest) (*observability.GrafanaConfigs, error) { + if c.getGrafanaConfigsFails { + return nil, fmt.Errorf("get payload failed") + } + return c.getGrafanaConfigsResp, nil + }), } - return c.getGrafanaConfigsResp, nil } func fixtureArgValues(mods ...func(argValues []string)) []string { @@ -81,17 +77,17 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { func fixtureGrafanaConfigs(mods ...func(gc *observability.GrafanaConfigs)) *observability.GrafanaConfigs { gc := observability.GrafanaConfigs{ - GenericOauth: &observability.GrafanaOauth{ - ApiUrl: utils.Ptr("apiUrl"), - AuthUrl: utils.Ptr("authUrl"), - Enabled: utils.Ptr(true), + GenericOauth: &observability.GrafanaOauth{ // nolint:gosec // false positive + ApiUrl: "apiUrl", + AuthUrl: "authUrl", + Enabled: true, Name: utils.Ptr("name"), - OauthClientId: utils.Ptr("oauthClientId"), - OauthClientSecret: utils.Ptr("oauthClientSecret"), - RoleAttributePath: utils.Ptr("roleAttributePath"), + OauthClientId: "oauthClientId", + OauthClientSecret: "oauthClientSecret", + RoleAttributePath: "roleAttributePath", RoleAttributeStrict: utils.Ptr(true), Scopes: utils.Ptr("scopes"), - TokenUrl: utils.Ptr("tokenUrl"), + TokenUrl: "tokenUrl", UsePkce: utils.Ptr(true), }, PublicReadAccess: utils.Ptr(false), @@ -116,7 +112,7 @@ func fixturePayload(mods ...func(payload *observability.UpdateGrafanaConfigsPayl } func fixtureRequest(mods ...func(request *observability.ApiUpdateGrafanaConfigsRequest)) observability.ApiUpdateGrafanaConfigsRequest { - request := testClient.UpdateGrafanaConfigs(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.UpdateGrafanaConfigs(testCtx, testInstanceId, testProjectId) request = request.UpdateGrafanaConfigsPayload(*fixturePayload()) for _, mod := range mods { mod(&request) @@ -214,7 +210,7 @@ func TestBuildRequest(t *testing.T) { }), isValid: true, expectedRequest: fixtureRequest(func(request *observability.ApiUpdateGrafanaConfigsRequest) { - *request = (*request).UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { + *request = request.UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { payload.GenericOauth = nil })) }), @@ -239,7 +235,7 @@ func TestBuildRequest(t *testing.T) { getGrafanaConfigsFails: tt.getGrafanaConfigsFails, getGrafanaConfigsResp: tt.getGrafanaConfigsResp, } - request, err := buildRequest(testCtx, tt.model, client) + request, err := buildRequest(testCtx, tt.model, client.newMock()) if err != nil { if !tt.isValid { return @@ -250,6 +246,9 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + 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/observability/instance/create/create.go b/internal/cmd/observability/instance/create/create.go index 72d53ebfe..12229c1f6 100644 --- a/internal/cmd/observability/instance/create/create.go +++ b/internal/cmd/observability/instance/create/create.go @@ -16,11 +16,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" - "github.com/stackitcloud/stackit-sdk-go/services/observability/wait" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" + "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api/wait" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) @@ -79,7 +78,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 observabilityInvalidPlanError *cliErr.ObservabilityInvalidPlanError if !errors.As(err, &observabilityInvalidPlanError) { @@ -91,12 +90,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("create Observability 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, instanceId, model.ProjectId).WaitWithContext(ctx) + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient.DefaultAPI, instanceId, model.ProjectId).WaitWithContext(ctx) return err }) if err != nil { @@ -151,18 +150,13 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, return &model, nil } -type observabilityClient interface { - CreateInstance(ctx context.Context, projectId string) observability.ApiCreateInstanceRequest - ListPlansExecute(ctx context.Context, projectId string) (*observability.PlansResponse, error) -} - -func buildRequest(ctx context.Context, model *inputModel, apiClient observabilityClient) (observability.ApiCreateInstanceRequest, error) { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) (observability.ApiCreateInstanceRequest, error) { req := apiClient.CreateInstance(ctx, model.ProjectId) - var planId *string + var planId string var err error - plans, err := apiClient.ListPlansExecute(ctx, model.ProjectId) + plans, err := apiClient.ListPlans(ctx, model.ProjectId).Execute() if err != nil { return req, fmt.Errorf("get Observability plans: %w", err) } @@ -181,7 +175,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient observabilit if err != nil { return req, err } - planId = model.PlanId + planId = *model.PlanId } req = req.CreateInstancePayload(observability.CreateInstancePayload{ @@ -201,7 +195,7 @@ func outputResult(p *print.Printer, outputFormat string, async bool, projectLabe if async { operationState = "Triggered creation of" } - p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, utils.PtrString(resp.InstanceId)) + p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, resp.InstanceId) return nil }) } diff --git a/internal/cmd/observability/instance/create/create_test.go b/internal/cmd/observability/instance/create/create_test.go index 7ff43cbba..a64925569 100644 --- a/internal/cmd/observability/instance/create/create_test.go +++ b/internal/cmd/observability/instance/create/create_test.go @@ -13,7 +13,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -21,22 +21,22 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} type observabilityClientMocked struct { returnError bool listPlansResponse *observability.PlansResponse } -func (c *observabilityClientMocked) CreateInstance(ctx context.Context, projectId string) observability.ApiCreateInstanceRequest { - return testClient.CreateInstance(ctx, projectId) -} - -func (c *observabilityClientMocked) ListPlansExecute(_ context.Context, _ string) (*observability.PlansResponse, error) { - if c.returnError { - return nil, fmt.Errorf("list plans failed") +func (c *observabilityClientMocked) newMock() observability.DefaultAPI { + return observability.DefaultAPIServiceMock{ + ListPlansExecuteMock: utils.Ptr(func(_ observability.ApiListPlansRequest) (*observability.PlansResponse, error) { + if c.returnError { + return nil, fmt.Errorf("list plans failed") + } + return c.listPlansResponse, nil + }), } - return c.listPlansResponse, nil } var testProjectId = uuid.NewString() @@ -70,10 +70,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiCreateInstanceRequest)) observability.ApiCreateInstanceRequest { - request := testClient.CreateInstance(testCtx, testProjectId) + request := testClient.DefaultAPI.CreateInstance(testCtx, testProjectId) request = request.CreateInstancePayload(observability.CreateInstancePayload{ Name: utils.Ptr("example-name"), - PlanId: utils.Ptr(testPlanId), + PlanId: testPlanId, }) for _, mod := range mods { mod(&request) @@ -83,10 +83,10 @@ func fixtureRequest(mods ...func(request *observability.ApiCreateInstanceRequest func fixturePlansResponse(mods ...func(response *observability.PlansResponse)) *observability.PlansResponse { response := &observability.PlansResponse{ - Plans: &[]observability.Plan{ + Plans: []observability.Plan{ { Name: utils.Ptr("example-plan-name"), - Id: utils.Ptr(testPlanId), + Id: testPlanId, }, }, } @@ -249,8 +249,8 @@ func TestBuildRequest(t *testing.T) { }, ), getPlansResponse: fixturePlansResponse(), - expectedRequest: testClient.CreateInstance(testCtx, testProjectId). - CreateInstancePayload(observability.CreateInstancePayload{PlanId: utils.Ptr(testPlanId)}), + expectedRequest: testClient.DefaultAPI.CreateInstance(testCtx, testProjectId). + CreateInstancePayload(observability.CreateInstancePayload{PlanId: testPlanId}), isValid: true, }, { @@ -263,8 +263,8 @@ func TestBuildRequest(t *testing.T) { }, ), getPlansResponse: fixturePlansResponse(), - expectedRequest: testClient.CreateInstance(testCtx, testProjectId). - CreateInstancePayload(observability.CreateInstancePayload{PlanId: utils.Ptr(testPlanId)}), + expectedRequest: testClient.DefaultAPI.CreateInstance(testCtx, testProjectId). + CreateInstancePayload(observability.CreateInstancePayload{PlanId: testPlanId}), isValid: true, }, } @@ -275,7 +275,7 @@ func TestBuildRequest(t *testing.T) { returnError: tt.getPlansFails, listPlansResponse: tt.getPlansResponse, } - request, err := buildRequest(testCtx, tt.model, client) + request, err := buildRequest(testCtx, tt.model, client.newMock()) if err != nil { if !tt.isValid { return @@ -290,6 +290,9 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + 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/observability/instance/delete/delete.go b/internal/cmd/observability/instance/delete/delete.go index d9fc972ab..50e399417 100644 --- a/internal/cmd/observability/instance/delete/delete.go +++ b/internal/cmd/observability/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/observability" - "github.com/stackitcloud/stackit-sdk-go/services/observability/wait" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" + "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api/wait" ) const ( @@ -54,7 +54,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -67,7 +67,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) _, err = req.Execute() if err != nil { return fmt.Errorf("delete Observability instance: %w", err) @@ -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.InstanceId, model.ProjectId).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId).WaitWithContext(ctx) return err }) if err != nil { @@ -112,7 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiDeleteInstanceRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiDeleteInstanceRequest { req := apiClient.DeleteInstance(ctx, model.InstanceId, model.ProjectId) return req } diff --git a/internal/cmd/observability/instance/delete/delete_test.go b/internal/cmd/observability/instance/delete/delete_test.go index 5d6bce774..be1c0f7ff 100644 --- a/internal/cmd/observability/instance/delete/delete_test.go +++ b/internal/cmd/observability/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" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -18,7 +18,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -57,7 +57,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiDeleteInstanceRequest)) observability.ApiDeleteInstanceRequest { - request := testClient.DeleteInstance(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.DeleteInstance(testCtx, testInstanceId, testProjectId) for _, mod := range mods { mod(&request) } @@ -157,10 +157,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/observability/instance/describe/describe.go b/internal/cmd/observability/instance/describe/describe.go index e9e4a256a..22d6bc6b8 100644 --- a/internal/cmd/observability/instance/describe/describe.go +++ b/internal/cmd/observability/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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) const ( @@ -55,7 +55,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) resp, err := req.Execute() if err != nil { return fmt.Errorf("read Observability instance: %w", err) @@ -84,7 +84,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiGetInstanceRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiGetInstanceRequest { req := apiClient.GetInstance(ctx, model.InstanceId, model.ProjectId) return req } @@ -96,30 +96,27 @@ func outputResult(p *print.Printer, outputFormat string, instance *observability return p.OutputResult(outputFormat, instance, func() error { 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.AddSeparator() - table.AddRow("STATUS", utils.PtrString(instance.Status)) + table.AddRow("STATUS", instance.Status) table.AddSeparator() - table.AddRow("PLAN NAME", utils.PtrString(instance.PlanName)) + table.AddRow("PLAN NAME", instance.PlanName) + table.AddSeparator() + plan := instance.Instance.Plan + table.AddRow("METRIC SAMPLES (PER MIN)", plan.TotalMetricSamples) + table.AddSeparator() + table.AddRow("LOGS (GB)", plan.LogsStorage) + table.AddSeparator() + table.AddRow("TRACES (GB)", plan.TracesStorage) + table.AddSeparator() + table.AddRow("NOTIFICATION RULES", plan.AlertRules) + table.AddSeparator() + table.AddRow("GRAFANA USERS", plan.GrafanaGlobalUsers) + table.AddSeparator() + table.AddRow("GRAFANA URL", instance.Instance.GrafanaUrl) table.AddSeparator() - if inst := instance.Instance; inst != nil { - if plan := inst.Plan; plan != nil { - table.AddRow("METRIC SAMPLES (PER MIN)", utils.PtrString(plan.TotalMetricSamples)) - table.AddSeparator() - table.AddRow("LOGS (GB)", utils.PtrString(plan.LogsStorage)) - table.AddSeparator() - table.AddRow("TRACES (GB)", utils.PtrString(plan.TracesStorage)) - table.AddSeparator() - table.AddRow("NOTIFICATION RULES", utils.PtrString(plan.AlertRules)) - table.AddSeparator() - table.AddRow("GRAFANA USERS", utils.PtrString(plan.GrafanaGlobalUsers)) - table.AddSeparator() - } - table.AddRow("GRAFANA URL", utils.PtrString(inst.GrafanaUrl)) - table.AddSeparator() - } err := table.Display(p) if err != nil { return fmt.Errorf("render table: %w", err) diff --git a/internal/cmd/observability/instance/describe/describe_test.go b/internal/cmd/observability/instance/describe/describe_test.go index 0cf036a20..853f95d0d 100644 --- a/internal/cmd/observability/instance/describe/describe_test.go +++ b/internal/cmd/observability/instance/describe/describe_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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -19,7 +19,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -58,7 +58,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiGetInstanceRequest)) observability.ApiGetInstanceRequest { - request := testClient.GetInstance(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.GetInstance(testCtx, testInstanceId, testProjectId) for _, mod := range mods { mod(&request) } @@ -158,10 +158,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/observability/instance/list/list.go b/internal/cmd/observability/instance/list/list.go index ab0c25959..b77731725 100644 --- a/internal/cmd/observability/instance/list/list.go +++ b/internal/cmd/observability/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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -61,7 +61,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) resp, err := req.Execute() if err != nil { return fmt.Errorf("get Observability instances: %w", err) @@ -115,7 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiListInstancesRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiListInstancesRequest { req := apiClient.ListInstances(ctx, model.ProjectId) return req } @@ -131,10 +131,10 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, instances for i := range instances { instance := instances[i] table.AddRow( - utils.PtrString(instance.Id), + instance.Id, utils.PtrString(instance.Name), - utils.PtrString(instance.PlanName), - utils.PtrString(instance.Status), + instance.PlanName, + instance.Status, ) } err := table.Display(p) diff --git a/internal/cmd/observability/instance/list/list_test.go b/internal/cmd/observability/instance/list/list_test.go index a61783fa6..25a4c416d 100644 --- a/internal/cmd/observability/instance/list/list_test.go +++ b/internal/cmd/observability/instance/list/list_test.go @@ -12,7 +12,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -20,7 +20,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { @@ -49,7 +49,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiListInstancesRequest)) observability.ApiListInstancesRequest { - request := testClient.ListInstances(testCtx, testProjectId) + request := testClient.DefaultAPI.ListInstances(testCtx, testProjectId) for _, mod := range mods { mod(&request) } @@ -134,10 +134,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/observability/instance/update/update.go b/internal/cmd/observability/instance/update/update.go index 38b2fe693..be02114cc 100644 --- a/internal/cmd/observability/instance/update/update.go +++ b/internal/cmd/observability/instance/update/update.go @@ -19,8 +19,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" - "github.com/stackitcloud/stackit-sdk-go/services/observability/wait" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" + "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api/wait" ) const ( @@ -70,7 +70,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil || instanceLabel == "" { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -83,7 +83,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 observabilityInvalidPlanError *cliErr.ObservabilityInvalidPlanError if !errors.As(err, &observabilityInvalidPlanError) { @@ -101,7 +101,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.UpdateInstanceWaitHandler(ctx, apiClient, instanceId, model.ProjectId).WaitWithContext(ctx) + _, err = wait.UpdateInstanceWaitHandler(ctx, apiClient.DefaultAPI, instanceId, model.ProjectId).WaitWithContext(ctx) return err }) if err != nil { @@ -161,34 +161,28 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } -type observabilityClient interface { - UpdateInstance(ctx context.Context, instanceId, projectId string) observability.ApiUpdateInstanceRequest - ListPlansExecute(ctx context.Context, projectId string) (*observability.PlansResponse, error) - GetInstanceExecute(ctx context.Context, instanceId, projectId string) (*observability.GetInstanceResponse, error) -} - -func buildRequest(ctx context.Context, model *inputModel, apiClient observabilityClient) (observability.ApiUpdateInstanceRequest, error) { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) (observability.ApiUpdateInstanceRequest, error) { req := apiClient.UpdateInstance(ctx, model.InstanceId, model.ProjectId) var err error - plans, err := apiClient.ListPlansExecute(ctx, model.ProjectId) + plans, err := apiClient.ListPlans(ctx, model.ProjectId).Execute() if err != nil { return req, fmt.Errorf("get Observability plans: %w", err) } - currentInstance, err := apiClient.GetInstanceExecute(ctx, model.InstanceId, model.ProjectId) + currentInstance, err := apiClient.GetInstance(ctx, model.InstanceId, model.ProjectId).Execute() if err != nil { return req, fmt.Errorf("get Observability instance: %w", err) } payload := observability.UpdateInstancePayload{ - PlanId: currentInstance.PlanId, + PlanId: ¤tInstance.PlanId, Name: currentInstance.Name, } if model.PlanId == nil && model.PlanName != "" { - payload.PlanId, err = observabilityUtils.LoadPlanId(model.PlanName, plans) + planId, err := observabilityUtils.LoadPlanId(model.PlanName, plans) if err != nil { var observabilityInvalidPlanError *cliErr.ObservabilityInvalidPlanError if !errors.As(err, &observabilityInvalidPlanError) { @@ -196,6 +190,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient observabilit } return req, err } + payload.PlanId = &planId } else if model.PlanId != nil && model.PlanName == "" { err := observabilityUtils.ValidatePlanId(*model.PlanId, plans) if err != nil { diff --git a/internal/cmd/observability/instance/update/update_test.go b/internal/cmd/observability/instance/update/update_test.go index 6a576ce5d..74ffc17fe 100644 --- a/internal/cmd/observability/instance/update/update_test.go +++ b/internal/cmd/observability/instance/update/update_test.go @@ -12,7 +12,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -20,7 +20,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} type observabilityClientMocked struct { listPlansError bool @@ -29,22 +29,21 @@ type observabilityClientMocked struct { getInstanceResponse *observability.GetInstanceResponse } -func (c *observabilityClientMocked) UpdateInstance(ctx context.Context, instanceId, projectId string) observability.ApiUpdateInstanceRequest { - return testClient.UpdateInstance(ctx, instanceId, projectId) -} - -func (c *observabilityClientMocked) ListPlansExecute(_ context.Context, _ string) (*observability.PlansResponse, error) { - if c.listPlansError { - return nil, fmt.Errorf("list flavors failed") - } - return c.listPlansResponse, nil -} - -func (c *observabilityClientMocked) GetInstanceExecute(_ context.Context, _, _ string) (*observability.GetInstanceResponse, error) { - if c.getInstanceError { - return nil, fmt.Errorf("get instance failed") +func (c *observabilityClientMocked) newMock() observability.DefaultAPI { + return observability.DefaultAPIServiceMock{ + ListPlansExecuteMock: utils.Ptr(func(_ observability.ApiListPlansRequest) (*observability.PlansResponse, error) { + if c.listPlansError { + return nil, fmt.Errorf("list flavors failed") + } + return c.listPlansResponse, nil + }), + GetInstanceExecuteMock: utils.Ptr(func(_ observability.ApiGetInstanceRequest) (*observability.GetInstanceResponse, error) { + if c.getInstanceError { + return nil, fmt.Errorf("get instance failed") + } + return c.getInstanceResponse, nil + }), } - return c.getInstanceResponse, nil } const ( @@ -95,7 +94,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiUpdateInstanceRequest)) observability.ApiUpdateInstanceRequest { - request := testClient.UpdateInstance(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.UpdateInstance(testCtx, testInstanceId, testProjectId) request = request.UpdateInstancePayload(observability.UpdateInstancePayload{ PlanId: utils.Ptr(testNewPlanId), Name: utils.Ptr(testInstanceName), @@ -108,10 +107,10 @@ func fixtureRequest(mods ...func(request *observability.ApiUpdateInstanceRequest func fixturePlansResponse(mods ...func(response *observability.PlansResponse)) *observability.PlansResponse { response := &observability.PlansResponse{ - Plans: &[]observability.Plan{ + Plans: []observability.Plan{ { Name: utils.Ptr("example-plan-name"), - Id: utils.Ptr(testNewPlanId), + Id: testNewPlanId, }, }, } @@ -123,7 +122,7 @@ func fixturePlansResponse(mods ...func(response *observability.PlansResponse)) * func fixtureGetInstanceResponse(mods ...func(response *observability.GetInstanceResponse)) *observability.GetInstanceResponse { response := &observability.GetInstanceResponse{ - PlanId: utils.Ptr(testPlanId), + PlanId: testPlanId, Name: utils.Ptr(testInstanceName), } for _, mod := range mods { @@ -375,7 +374,7 @@ func TestBuildRequest(t *testing.T) { getInstanceError: tt.getInstanceFails, getInstanceResponse: tt.getInstanceResponse, } - request, err := buildRequest(testCtx, tt.model, client) + request, err := buildRequest(testCtx, tt.model, client.newMock()) if err != nil { if !tt.isValid { return @@ -390,6 +389,9 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + 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/observability/plans/plans.go b/internal/cmd/observability/plans/plans.go index ee4fcbb38..386ee26e0 100644 --- a/internal/cmd/observability/plans/plans.go +++ b/internal/cmd/observability/plans/plans.go @@ -18,7 +18,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) const ( @@ -61,7 +61,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) resp, err := req.Execute() if err != nil { return fmt.Errorf("get Observability service plans: %w", err) @@ -115,7 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiListPlansRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiListPlansRequest { req := apiClient.ListPlans(ctx, model.ProjectId) return req } @@ -131,7 +131,7 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, plans []o for i := range plans { o := plans[i] table.AddRow( - utils.PtrString(o.Id), + o.Id, utils.PtrString(o.Name), utils.PtrString(o.Description), ) diff --git a/internal/cmd/observability/plans/plans_test.go b/internal/cmd/observability/plans/plans_test.go index e09caacec..9c9b28b08 100644 --- a/internal/cmd/observability/plans/plans_test.go +++ b/internal/cmd/observability/plans/plans_test.go @@ -12,7 +12,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -20,7 +20,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { @@ -49,7 +49,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiListPlansRequest)) observability.ApiListPlansRequest { - request := testClient.ListPlans(testCtx, testProjectId) + request := testClient.DefaultAPI.ListPlans(testCtx, testProjectId) for _, mod := range mods { mod(&request) } @@ -134,10 +134,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/observability/scrape-config/create/create.go b/internal/cmd/observability/scrape-config/create/create.go index 87d206cfe..740166324 100644 --- a/internal/cmd/observability/scrape-config/create/create.go +++ b/internal/cmd/observability/scrape-config/create/create.go @@ -16,11 +16,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/client" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" - "github.com/stackitcloud/stackit-sdk-go/services/observability/wait" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" + "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api/wait" ) const ( @@ -74,7 +73,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -89,14 +88,14 @@ func NewCmd(params *types.CmdParams) *cobra.Command { model.Payload = &defaultPayload } - prompt := fmt.Sprintf("Are you sure you want to create scrape configuration %q on Observability instance %q?", *model.Payload.JobName, instanceLabel) + prompt := fmt.Sprintf("Are you sure you want to create scrape configuration %q on Observability instance %q?", model.Payload.JobName, instanceLabel) err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) _, err = req.Execute() if err != nil { return fmt.Errorf("create scrape configuration: %w", err) @@ -107,7 +106,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, "Creating scrape config", func() error { - _, err = wait.CreateScrapeConfigWaitHandler(ctx, apiClient, model.InstanceId, *jobName, model.ProjectId).WaitWithContext(ctx) + _, err = wait.CreateScrapeConfigWaitHandler(ctx, apiClient.DefaultAPI, model.InstanceId, jobName, model.ProjectId).WaitWithContext(ctx) return err }) if err != nil { @@ -119,7 +118,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if model.Async { operationState = "Triggered creation of" } - params.Printer.Outputf("%s scrape configuration with name %q for Observability instance %q\n", operationState, utils.PtrString(jobName), instanceLabel) + params.Printer.Outputf("%s scrape configuration with name %q for Observability instance %q\n", operationState, jobName, instanceLabel) return nil }, } @@ -158,7 +157,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, }, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiCreateScrapeConfigRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiCreateScrapeConfigRequest { req := apiClient.CreateScrapeConfig(ctx, model.InstanceId, model.ProjectId) req = req.CreateScrapeConfigPayload(*model.Payload) diff --git a/internal/cmd/observability/scrape-config/create/create_test.go b/internal/cmd/observability/scrape-config/create/create_test.go index 8da9b00a2..2431e1ed9 100644 --- a/internal/cmd/observability/scrape-config/create/create_test.go +++ b/internal/cmd/observability/scrape-config/create/create_test.go @@ -13,7 +13,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -21,12 +21,12 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() var testPayload = &observability.CreateScrapeConfigPayload{ - BasicAuth: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{ + BasicAuth: &observability.CreateScrapeConfigPayloadBasicAuth{ Username: utils.Ptr("username"), Password: utils.Ptr("password"), }, @@ -34,36 +34,36 @@ var testPayload = &observability.CreateScrapeConfigPayload{ HonorLabels: utils.Ptr(true), HonorTimeStamps: utils.Ptr(true), MetricsPath: utils.Ptr("/metrics"), - JobName: utils.Ptr("default-name"), - MetricsRelabelConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner{ + JobName: "default-name", + MetricsRelabelConfigs: []observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner{ { - Action: observability.PARTIALUPDATESCRAPECONFIGSREQUESTINNERMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), - Modulus: utils.Ptr(1.0), + Action: observability.CREATESCRAPECONFIGPAYLOADMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), + Modulus: utils.Ptr(float32(1.0)), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), Separator: utils.Ptr("separator"), - SourceLabels: &[]string{"sourceLabel"}, + SourceLabels: []string{"sourceLabel"}, TargetLabel: utils.Ptr("targetLabel"), }, }, - Params: &map[string]interface{}{ + Params: map[string]interface{}{ "key": []interface{}{string("value1"), string("value2")}, "key2": []interface{}{}, }, - SampleLimit: utils.Ptr(1.0), - Scheme: observability.CREATESCRAPECONFIGPAYLOADSCHEME_HTTPS.Ptr(), - ScrapeInterval: utils.Ptr("interval"), - ScrapeTimeout: utils.Ptr("timeout"), - StaticConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerStaticConfigsInner{ + SampleLimit: utils.Ptr(float32(1.0)), + Scheme: observability.CREATESCRAPECONFIGPAYLOADSCHEME_HTTPS, + ScrapeInterval: "interval", + ScrapeTimeout: "timeout", + StaticConfigs: []observability.CreateScrapeConfigPayloadStaticConfigsInner{ { - Labels: &map[string]interface{}{ + Labels: map[string]interface{}{ "label": "value", "label2": "value2", }, - Targets: &[]string{"target"}, + Targets: []string{"target"}, }, }, - TlsConfig: &observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig{ + TlsConfig: &observability.CreateScrapeConfigPayloadTlsConfig{ InsecureSkipVerify: utils.Ptr(true), }, } @@ -137,7 +137,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiCreateScrapeConfigRequest)) observability.ApiCreateScrapeConfigRequest { - request := testClient.CreateScrapeConfig(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.CreateScrapeConfig(testCtx, testInstanceId, testProjectId) request = request.CreateScrapeConfigPayload(*testPayload) for _, mod := range mods { mod(&request) @@ -233,7 +233,12 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + testutils.TestParseInputWithOptions(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, nil, tt.isValid, []testutils.TestingOption{ + testutils.WithCmpOptions(cmp.FilterPath(func(p cmp.Path) bool { + last := p.Last().String() + return last == ".AdditionalProperties" + }, cmp.Ignore())), + }) }) } } @@ -254,10 +259,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/observability/scrape-config/delete/delete.go b/internal/cmd/observability/scrape-config/delete/delete.go index 7ec1e8ccf..c953c4e5e 100644 --- a/internal/cmd/observability/scrape-config/delete/delete.go +++ b/internal/cmd/observability/scrape-config/delete/delete.go @@ -17,8 +17,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" - "github.com/stackitcloud/stackit-sdk-go/services/observability/wait" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" + "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api/wait" ) const ( @@ -57,7 +57,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -70,7 +70,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) _, err = req.Execute() if err != nil { return fmt.Errorf("delete scrape configuration: %w", err) @@ -79,7 +79,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 scrape config", func() error { - _, err = wait.DeleteScrapeConfigWaitHandler(ctx, apiClient, model.InstanceId, model.JobName, model.ProjectId).WaitWithContext(ctx) + _, err = wait.DeleteScrapeConfigWaitHandler(ctx, apiClient.DefaultAPI, model.InstanceId, model.JobName, model.ProjectId).WaitWithContext(ctx) return err }) if err != nil { @@ -121,7 +121,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu }, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiDeleteScrapeConfigRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiDeleteScrapeConfigRequest { req := apiClient.DeleteScrapeConfig(ctx, model.InstanceId, model.JobName, model.ProjectId) return req } diff --git a/internal/cmd/observability/scrape-config/delete/delete_test.go b/internal/cmd/observability/scrape-config/delete/delete_test.go index c9549964d..be623a878 100644 --- a/internal/cmd/observability/scrape-config/delete/delete_test.go +++ b/internal/cmd/observability/scrape-config/delete/delete_test.go @@ -9,7 +9,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -17,7 +17,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() var testJobName = "my-config" @@ -59,7 +59,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiDeleteScrapeConfigRequest)) observability.ApiDeleteScrapeConfigRequest { - request := testClient.DeleteScrapeConfig(testCtx, testInstanceId, testJobName, testProjectId) + request := testClient.DefaultAPI.DeleteScrapeConfig(testCtx, testInstanceId, testJobName, testProjectId) for _, mod := range mods { mod(&request) } @@ -219,10 +219,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/observability/scrape-config/describe/describe.go b/internal/cmd/observability/scrape-config/describe/describe.go index 5dc11a619..edf2427b6 100644 --- a/internal/cmd/observability/scrape-config/describe/describe.go +++ b/internal/cmd/observability/scrape-config/describe/describe.go @@ -8,7 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -60,13 +60,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) resp, err := req.Execute() if err != nil { return fmt.Errorf("read scrape configuration: %w", err) } - return outputResult(params.Printer, model.OutputFormat, resp.Data) + return outputResult(params.Printer, model.OutputFormat, &resp.Data) }, } configureFlags(cmd) @@ -95,16 +95,12 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu }, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiGetScrapeConfigRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiGetScrapeConfigRequest { req := apiClient.GetScrapeConfig(ctx, model.InstanceId, model.JobName, model.ProjectId) return req } func outputResult(p *print.Printer, outputFormat string, config *observability.Job) error { - if config == nil { - return fmt.Errorf(`config is nil`) - } - return p.OutputResult(outputFormat, config, func() error { saml2Enabled := "Enabled" if config.Params != nil { @@ -116,7 +112,7 @@ func outputResult(p *print.Printer, outputFormat string, config *observability.J var targets []string if config.StaticConfigs != nil { - for _, target := range *config.StaticConfigs { + for _, target := range config.StaticConfigs { targetLabels := []string{} targetLabelStr := "N/A" if target.Labels != nil { @@ -130,22 +126,22 @@ func outputResult(p *print.Printer, outputFormat string, config *observability.J } targetUrlsStr := "N/A" if target.Targets != nil { - targetUrlsStr = strings.Join(*target.Targets, ",") + targetUrlsStr = strings.Join(target.Targets, ",") } targets = append(targets, fmt.Sprintf("labels: %s\nurls: %s", targetLabelStr, targetUrlsStr)) } } table := tables.NewTable() - table.AddRow("NAME", utils.PtrString(config.JobName)) + table.AddRow("NAME", config.JobName) table.AddSeparator() table.AddRow("METRICS PATH", utils.PtrString(config.MetricsPath)) table.AddSeparator() table.AddRow("SCHEME", utils.PtrString(config.Scheme)) table.AddSeparator() - table.AddRow("SCRAPE INTERVAL", utils.PtrString(config.ScrapeInterval)) + table.AddRow("SCRAPE INTERVAL", config.ScrapeInterval) table.AddSeparator() - table.AddRow("SCRAPE TIMEOUT", utils.PtrString(config.ScrapeTimeout)) + table.AddRow("SCRAPE TIMEOUT", config.ScrapeTimeout) table.AddSeparator() table.AddRow("SAML2", saml2Enabled) table.AddSeparator() @@ -154,9 +150,9 @@ func outputResult(p *print.Printer, outputFormat string, config *observability.J } else { table.AddRow("AUTHENTICATION", "Basic Auth") table.AddSeparator() - table.AddRow("USERNAME", utils.PtrString(config.BasicAuth.Username)) + table.AddRow("USERNAME", config.BasicAuth.Username) table.AddSeparator() - table.AddRow("PASSWORD", utils.PtrString(config.BasicAuth.Password)) + table.AddRow("PASSWORD", config.BasicAuth.Password) } table.AddSeparator() for i, target := range targets { diff --git a/internal/cmd/observability/scrape-config/describe/describe_test.go b/internal/cmd/observability/scrape-config/describe/describe_test.go index 97083464a..23cbc4c2f 100644 --- a/internal/cmd/observability/scrape-config/describe/describe_test.go +++ b/internal/cmd/observability/scrape-config/describe/describe_test.go @@ -10,7 +10,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -18,7 +18,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() var testJobName = "my-config" @@ -60,7 +60,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiGetScrapeConfigRequest)) observability.ApiGetScrapeConfigRequest { - request := testClient.GetScrapeConfig(testCtx, testInstanceId, testJobName, testProjectId) + request := testClient.DefaultAPI.GetScrapeConfig(testCtx, testInstanceId, testJobName, testProjectId) for _, mod := range mods { mod(&request) } @@ -220,10 +220,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { @@ -236,7 +236,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string - config *observability.Job + config observability.Job } tests := []struct { name string @@ -244,14 +244,13 @@ func TestOutputResult(t *testing.T) { wantErr bool }{ { - name: "empty", - args: args{}, - wantErr: true, + name: "empty", + args: args{}, }, { name: "empty config", args: args{ - config: &observability.Job{}, + config: observability.Job{}, }, wantErr: false, }, @@ -259,7 +258,7 @@ func TestOutputResult(t *testing.T) { params := testparams.NewTestParams() for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(params.Printer, tt.args.outputFormat, tt.args.config); (err != nil) != tt.wantErr { + if err := outputResult(params.Printer, tt.args.outputFormat, &tt.args.config); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go index e891d728e..ab489abe4 100644 --- a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go @@ -17,7 +17,7 @@ import ( observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) const ( @@ -79,7 +79,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return outputCreateResult(params.Printer, model.FilePath, &createPayload) } - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) resp, err := req.Execute() if err != nil { return fmt.Errorf("read Observability scrape config: %w", err) @@ -121,7 +121,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, }, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiGetScrapeConfigRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiGetScrapeConfigRequest { req := apiClient.GetScrapeConfig(ctx, model.InstanceId, *model.JobName, model.ProjectId) return req } @@ -131,7 +131,7 @@ func outputCreateResult(p *print.Printer, filePath *string, payload *observabili return fmt.Errorf("payload is nil") } - payloadBytes, err := json.MarshalIndent(*payload, "", " ") + payloadBytes, err := json.MarshalIndent(*payload, "", " ") // nolint:gosec // false positive if err != nil { return fmt.Errorf("marshal payload: %w", err) } @@ -153,7 +153,7 @@ func outputUpdateResult(p *print.Printer, filePath *string, payload *observabili return fmt.Errorf("payload is nil") } - payloadBytes, err := json.MarshalIndent(*payload, "", " ") + payloadBytes, err := json.MarshalIndent(*payload, "", " ") // nolint:gosec // false positive if err != nil { return fmt.Errorf("marshal payload: %w", err) } diff --git a/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go b/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go index 23d437632..f59b3d66b 100644 --- a/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go +++ b/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go @@ -13,7 +13,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -21,7 +21,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -60,7 +60,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiGetScrapeConfigRequest)) observability.ApiGetScrapeConfigRequest { - request := testClient.GetScrapeConfig(testCtx, testInstanceId, testJobName, testProjectId) + request := testClient.DefaultAPI.GetScrapeConfig(testCtx, testInstanceId, testJobName, testProjectId) for _, mod := range mods { mod(&request) } @@ -194,10 +194,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/observability/scrape-config/list/list.go b/internal/cmd/observability/scrape-config/list/list.go index a5a9ad642..2af2c8d82 100644 --- a/internal/cmd/observability/scrape-config/list/list.go +++ b/internal/cmd/observability/scrape-config/list/list.go @@ -14,12 +14,11 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) const ( @@ -64,7 +63,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) resp, err := req.Execute() if err != nil { return fmt.Errorf("get scrape configurations: %w", err) @@ -72,7 +71,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { configs := resp.GetData() - instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) + instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient.DefaultAPI, model.InstanceId, model.ProjectId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -120,7 +119,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, }, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiListScrapeConfigsRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiListScrapeConfigsRequest { req := apiClient.ListScrapeConfigs(ctx, model.InstanceId, model.ProjectId) return req } @@ -138,18 +137,18 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, configs targets := 0 if c.StaticConfigs != nil { - for _, sc := range *c.StaticConfigs { + for _, sc := range c.StaticConfigs { if sc.Targets == nil { continue } - targets += len(*sc.Targets) + targets += len(sc.Targets) } } table.AddRow( - utils.PtrString(c.JobName), + c.JobName, targets, - utils.PtrString(c.ScrapeInterval), + c.ScrapeInterval, ) } err := table.Display(p) diff --git a/internal/cmd/observability/scrape-config/list/list_test.go b/internal/cmd/observability/scrape-config/list/list_test.go index 52d73330f..f993e0a1c 100644 --- a/internal/cmd/observability/scrape-config/list/list_test.go +++ b/internal/cmd/observability/scrape-config/list/list_test.go @@ -13,7 +13,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -21,7 +21,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() @@ -53,7 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiListScrapeConfigsRequest)) observability.ApiListScrapeConfigsRequest { - request := testClient.ListScrapeConfigs(testCtx, testInstanceId, testProjectId) + request := testClient.DefaultAPI.ListScrapeConfigs(testCtx, testInstanceId, testProjectId) for _, mod := range mods { mod(&request) } @@ -159,10 +159,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/observability/scrape-config/update/update.go b/internal/cmd/observability/scrape-config/update/update.go index 130199713..e5eb24e06 100644 --- a/internal/cmd/observability/scrape-config/update/update.go +++ b/internal/cmd/observability/scrape-config/update/update.go @@ -16,7 +16,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/client" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) const ( @@ -76,7 +76,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, model, apiClient) + req := buildRequest(ctx, model, apiClient.DefaultAPI) _, err = req.Execute() if err != nil { return fmt.Errorf("update scrape config: %w", err) @@ -122,7 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu }, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *observability.APIClient) observability.ApiUpdateScrapeConfigRequest { +func buildRequest(ctx context.Context, model *inputModel, apiClient observability.DefaultAPI) observability.ApiUpdateScrapeConfigRequest { req := apiClient.UpdateScrapeConfig(ctx, model.InstanceId, model.JobName, model.ProjectId) req = req.UpdateScrapeConfigPayload(model.Payload) diff --git a/internal/cmd/observability/scrape-config/update/update_test.go b/internal/cmd/observability/scrape-config/update/update_test.go index 2f7ce1b13..5a41cfbe9 100644 --- a/internal/cmd/observability/scrape-config/update/update_test.go +++ b/internal/cmd/observability/scrape-config/update/update_test.go @@ -10,7 +10,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/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -18,35 +18,39 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &observability.APIClient{} +var testClient = &observability.APIClient{DefaultAPI: &observability.DefaultAPIService{}} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() var testJobName = "my-config" var testPayload = observability.UpdateScrapeConfigPayload{ - BasicAuth: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{ + BasicAuth: &observability.UpdateScrapeConfigPayloadBasicAuth{ Username: utils.Ptr("username"), Password: utils.Ptr("password"), }, BearerToken: utils.Ptr("bearerToken"), HonorLabels: utils.Ptr(true), HonorTimeStamps: utils.Ptr(true), - MetricsPath: utils.Ptr("/metrics"), - MetricsRelabelConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner{ + MetricsPath: "/metrics", + MetricsRelabelConfigs: []observability.UpdateScrapeConfigPayloadMetricsRelabelConfigsInner{ { - Action: observability.PARTIALUPDATESCRAPECONFIGSREQUESTINNERMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), - Modulus: utils.Ptr(1.0), + Action: observability.UPDATESCRAPECONFIGPAYLOADMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), + Modulus: utils.Ptr(float32(1.0)), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), Separator: utils.Ptr("separator"), - SourceLabels: &[]string{"sourceLabel"}, + SourceLabels: []string{"sourceLabel"}, TargetLabel: utils.Ptr("targetLabel"), }, }, - Params: &map[string]interface{}{ - "key": []interface{}{string("value1"), string("value2")}, + Params: map[string]interface{}{ + "key": []interface{}{"value1", "value2"}, "key2": []interface{}{}, }, + ScrapeInterval: "5m", + ScrapeTimeout: "10s", + Scheme: "https", + StaticConfigs: []observability.UpdateScrapeConfigPayloadStaticConfigsInner{}, } func fixtureArgValues(mods ...func(argValues []string)) []string { @@ -86,7 +90,11 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st "params": { "key": ["value1", "value2"], "key2": [] - } + }, + "scheme": "https", + "scrapeInterval": "5m", + "scrapeTimeout": "10s", + "staticConfigs": [] }`, } for _, mod := range mods { @@ -112,7 +120,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *observability.ApiUpdateScrapeConfigRequest)) observability.ApiUpdateScrapeConfigRequest { - request := testClient.UpdateScrapeConfig(testCtx, testInstanceId, testJobName, testProjectId) + request := testClient.DefaultAPI.UpdateScrapeConfig(testCtx, testInstanceId, testJobName, testProjectId) request = request.UpdateScrapeConfigPayload(testPayload) for _, mod := range mods { mod(&request) @@ -262,7 +270,9 @@ func TestParseInput(t *testing.T) { if !tt.isValid { t.Fatalf("did not fail on invalid input") } - diff := cmp.Diff(model, tt.expectedModel) + diff := cmp.Diff(model, tt.expectedModel, cmp.FilterPath(func(path cmp.Path) bool { + return path.Last().String() == ".AdditionalProperties" + }, cmp.Ignore())) if diff != "" { t.Fatalf("Data does not match: %s", diff) } @@ -286,10 +296,10 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildRequest(testCtx, tt.model, testClient.DefaultAPI) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, observability.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/pkg/services/observability/client/client.go b/internal/pkg/services/observability/client/client.go index eae8204d7..b8e5a5fbc 100644 --- a/internal/pkg/services/observability/client/client.go +++ b/internal/pkg/services/observability/client/client.go @@ -1,7 +1,7 @@ package client import ( - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" "github.com/stackitcloud/stackit-cli/internal/pkg/config" genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" diff --git a/internal/pkg/services/observability/utils/utils.go b/internal/pkg/services/observability/utils/utils.go index 7a15180c5..c5b2be317 100644 --- a/internal/pkg/services/observability/utils/utils.go +++ b/internal/pkg/services/observability/utils/utils.go @@ -3,9 +3,10 @@ package utils import ( "context" "fmt" + "reflect" "strings" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -15,27 +16,21 @@ const ( service = "observability" ) -type ObservabilityClient interface { - GetInstanceExecute(ctx context.Context, instanceId, projectId string) (*observability.GetInstanceResponse, error) - GetGrafanaConfigsExecute(ctx context.Context, instanceId, projectId string) (*observability.GrafanaConfigs, error) - UpdateGrafanaConfigs(ctx context.Context, instanceId string, projectId string) observability.ApiUpdateGrafanaConfigsRequest -} - var ( - defaultStaticConfigs = []observability.PartialUpdateScrapeConfigsRequestInnerStaticConfigsInner{ + defaultStaticConfigs = []observability.CreateScrapeConfigPayloadStaticConfigsInner{ { - Targets: utils.Ptr([]string{ + Targets: []string{ "url-target", - }), + }, }, } DefaultCreateScrapeConfigPayload = observability.CreateScrapeConfigPayload{ - JobName: utils.Ptr("default-name"), + JobName: "default-name", MetricsPath: utils.Ptr("/metrics"), - Scheme: observability.CREATESCRAPECONFIGPAYLOADSCHEME_HTTPS.Ptr(), - ScrapeInterval: utils.Ptr("5m"), - ScrapeTimeout: utils.Ptr("2m"), - StaticConfigs: utils.Ptr(defaultStaticConfigs), + Scheme: observability.CREATESCRAPECONFIGPAYLOADSCHEME_HTTPS, + ScrapeInterval: "5m", + ScrapeTimeout: "2m", + StaticConfigs: defaultStaticConfigs, } ) @@ -44,9 +39,9 @@ func ValidatePlanId(planId string, resp *observability.PlansResponse) error { return fmt.Errorf("no Observability plans provided") } - for i := range *resp.Plans { - plan := (*resp.Plans)[i] - if plan.Id != nil && strings.EqualFold(*plan.Id, planId) { + for i := range resp.Plans { + plan := resp.Plans[i] + if strings.EqualFold(plan.Id, planId) { return nil } } @@ -57,32 +52,32 @@ func ValidatePlanId(planId string, resp *observability.PlansResponse) error { } } -func LoadPlanId(planName string, resp *observability.PlansResponse) (*string, error) { +func LoadPlanId(planName string, resp *observability.PlansResponse) (string, error) { availablePlanNames := "" if resp == nil { - return nil, fmt.Errorf("no Observability plans provided") + return "", fmt.Errorf("no Observability plans provided") } - for i := range *resp.Plans { - plan := (*resp.Plans)[i] + for i := range resp.Plans { + plan := resp.Plans[i] if plan.Name == nil { continue } - if strings.EqualFold(*plan.Name, planName) && plan.Id != nil { + if strings.EqualFold(*plan.Name, planName) { return plan.Id, nil } availablePlanNames = fmt.Sprintf("%s\n- %s", availablePlanNames, *plan.Name) } details := fmt.Sprintf("You provided plan name %q, which is invalid. Available plan names are: %s", planName, availablePlanNames) - return nil, &errors.ObservabilityInvalidPlanError{ + return "", &errors.ObservabilityInvalidPlanError{ Service: service, Details: details, } } func MapToUpdateScrapeConfigPayload(resp *observability.GetScrapeConfigResponse) (*observability.UpdateScrapeConfigPayload, error) { - if resp == nil || resp.Data == nil { + if resp == nil { return nil, fmt.Errorf("no Observability scrape config provided") } @@ -93,9 +88,14 @@ func MapToUpdateScrapeConfigPayload(resp *observability.GetScrapeConfigResponse) tlsConfig := mapTlsConfig(data.TlsConfig) metricsRelabelConfigs := mapMetricsRelabelConfig(data.MetricsRelabelConfigs) - var params *map[string]interface{} + var params map[string]interface{} if data.Params != nil { - params = utils.Ptr(mapParams(*data.Params)) + params = mapParams(*data.Params) + } + + var scheme observability.UpdateScrapeConfigPayloadScheme + if data.Scheme != nil { + scheme = observability.UpdateScrapeConfigPayloadScheme(*data.Scheme) } payload := observability.UpdateScrapeConfigPayload{ @@ -103,33 +103,33 @@ func MapToUpdateScrapeConfigPayload(resp *observability.GetScrapeConfigResponse) BearerToken: data.BearerToken, HonorLabels: data.HonorLabels, HonorTimeStamps: data.HonorTimeStamps, - MetricsPath: data.MetricsPath, + MetricsPath: utils.PtrString(data.MetricsPath), MetricsRelabelConfigs: metricsRelabelConfigs, Params: params, - SampleLimit: utils.ConvertInt64PToFloat64P(data.SampleLimit), - Scheme: observability.UpdateScrapeConfigPayloadGetSchemeAttributeType(data.Scheme), + SampleLimit: utils.ConvertInt32PToFloat32P(data.SampleLimit), + Scheme: scheme, ScrapeInterval: data.ScrapeInterval, ScrapeTimeout: data.ScrapeTimeout, StaticConfigs: staticConfigs, TlsConfig: tlsConfig, } - if payload == (observability.UpdateScrapeConfigPayload{}) { + if reflect.DeepEqual(payload, observability.UpdateScrapeConfigPayload{}) { return nil, fmt.Errorf("the provided Observability scrape config payload is empty") } return &payload, nil } -func mapMetricsRelabelConfig(metricsRelabelConfigs *[]observability.MetricsRelabelConfig) *[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner { +func mapMetricsRelabelConfig(metricsRelabelConfigs []observability.MetricsRelabelConfig) []observability.UpdateScrapeConfigPayloadMetricsRelabelConfigsInner { if metricsRelabelConfigs == nil { return nil } - var mappedConfigs []observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner - for _, config := range *metricsRelabelConfigs { - mappedConfig := observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner{ - Action: observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInnerGetActionAttributeType(config.Action), - Modulus: utils.ConvertInt64PToFloat64P(config.Modulus), + var mappedConfigs []observability.UpdateScrapeConfigPayloadMetricsRelabelConfigsInner + for _, config := range metricsRelabelConfigs { + mappedConfig := observability.UpdateScrapeConfigPayloadMetricsRelabelConfigsInner{ + Action: (*observability.UpdateScrapeConfigPayloadMetricsRelabelConfigsInnerAction)(config.Action), + Modulus: utils.ConvertInt32PToFloat32P(config.Modulus), Regex: config.Regex, Replacement: config.Replacement, Separator: config.Separator, @@ -138,18 +138,18 @@ func mapMetricsRelabelConfig(metricsRelabelConfigs *[]observability.MetricsRelab } mappedConfigs = append(mappedConfigs, mappedConfig) } - return &mappedConfigs + return mappedConfigs } -func mapStaticConfig(staticConfigs *[]observability.StaticConfigs) *[]observability.UpdateScrapeConfigPayloadStaticConfigsInner { +func mapStaticConfig(staticConfigs []observability.StaticConfigs) []observability.UpdateScrapeConfigPayloadStaticConfigsInner { if staticConfigs == nil { return nil } var mappedConfigs []observability.UpdateScrapeConfigPayloadStaticConfigsInner - for _, config := range *staticConfigs { - var labels *map[string]interface{} + for _, config := range staticConfigs { + var labels map[string]interface{} if config.Labels != nil { - labels = utils.Ptr(mapStaticConfigLabels(*config.Labels)) + labels = mapStaticConfigLabels(*config.Labels) } mappedConfig := observability.UpdateScrapeConfigPayloadStaticConfigsInner{ Labels: labels, @@ -158,26 +158,34 @@ func mapStaticConfig(staticConfigs *[]observability.StaticConfigs) *[]observabil mappedConfigs = append(mappedConfigs, mappedConfig) } - return &mappedConfigs + return mappedConfigs } -func mapBasicAuth(basicAuth *observability.BasicAuth) *observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth { +func mapBasicAuth(basicAuth *observability.BasicAuth) *observability.UpdateScrapeConfigPayloadBasicAuth { if basicAuth == nil { return nil } - return &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{ - Password: basicAuth.Password, - Username: basicAuth.Username, + var password, username *string + if basicAuth.Password != "" { + password = &basicAuth.Password + } + if basicAuth.Username != "" { + username = &basicAuth.Username + } + + return &observability.UpdateScrapeConfigPayloadBasicAuth{ + Password: password, + Username: username, } } -func mapTlsConfig(tlsConfig *observability.TLSConfig) *observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig { +func mapTlsConfig(tlsConfig *observability.TLSConfig) *observability.UpdateScrapeConfigPayloadTlsConfig { if tlsConfig == nil { return nil } - return &observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig{ + return &observability.UpdateScrapeConfigPayloadTlsConfig{ InsecureSkipVerify: tlsConfig.InsecureSkipVerify, } } @@ -198,8 +206,8 @@ func mapStaticConfigLabels(labels map[string]string) map[string]interface{} { return labelsMap } -func GetInstanceName(ctx context.Context, apiClient ObservabilityClient, instanceId, projectId string) (string, error) { - resp, err := apiClient.GetInstanceExecute(ctx, instanceId, projectId) +func GetInstanceName(ctx context.Context, apiClient observability.DefaultAPI, instanceId, projectId string) (string, error) { + resp, err := apiClient.GetInstance(ctx, instanceId, projectId).Execute() if err != nil { return "", fmt.Errorf("get Observability instance: %w", err) } @@ -225,8 +233,8 @@ func ToPayloadGenericOAuth(respOAuth *observability.GrafanaOauth) *observability } } -func GetPartialUpdateGrafanaConfigsPayload(ctx context.Context, apiClient ObservabilityClient, instanceId, projectId string, singleSignOn, publicReadAccess *bool) (*observability.UpdateGrafanaConfigsPayload, error) { - currentConfigs, err := apiClient.GetGrafanaConfigsExecute(ctx, instanceId, projectId) +func GetPartialUpdateGrafanaConfigsPayload(ctx context.Context, apiClient observability.DefaultAPI, instanceId, projectId string, singleSignOn, publicReadAccess *bool) (*observability.UpdateGrafanaConfigsPayload, error) { + currentConfigs, err := apiClient.GetGrafanaConfigs(ctx, instanceId, projectId).Execute() if err != nil { return nil, fmt.Errorf("get current Grafana configs: %w", err) } diff --git a/internal/pkg/services/observability/utils/utils_test.go b/internal/pkg/services/observability/utils/utils_test.go index 18919db62..12ffaca07 100644 --- a/internal/pkg/services/observability/utils/utils_test.go +++ b/internal/pkg/services/observability/utils/utils_test.go @@ -10,11 +10,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/observability" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" ) var ( - testClient = &observability.APIClient{} testProjectId = uuid.NewString() testInstanceId = uuid.NewString() testPlanId = uuid.NewString() @@ -26,34 +25,34 @@ const ( ) var testPlansResponse = observability.PlansResponse{ - Plans: &[]observability.Plan{ + Plans: []observability.Plan{ { - Id: utils.Ptr(testPlanId), + Id: testPlanId, Name: utils.Ptr(testPlanName), }, }, } func fixtureGetScrapeConfigResponse(mods ...func(*observability.GetScrapeConfigResponse)) *observability.GetScrapeConfigResponse { - number := int64(1) + number := int32(1) resp := &observability.GetScrapeConfigResponse{ - Data: &observability.Job{ + Data: observability.Job{ BasicAuth: &observability.BasicAuth{ - Username: utils.Ptr("username"), - Password: utils.Ptr("password"), + Username: "username", + Password: "password", }, BearerToken: utils.Ptr("bearerToken"), HonorLabels: utils.Ptr(true), HonorTimeStamps: utils.Ptr(true), MetricsPath: utils.Ptr("/metrics"), - MetricsRelabelConfigs: &[]observability.MetricsRelabelConfig{ + MetricsRelabelConfigs: []observability.MetricsRelabelConfig{ { - Action: observability.METRICSRELABELCONFIGACTION_REPLACE.Ptr(), + Action: observability.ACTION_REPLACE.Ptr(), Modulus: &number, Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), Separator: utils.Ptr("separator"), - SourceLabels: &[]string{"sourceLabel"}, + SourceLabels: []string{"sourceLabel"}, TargetLabel: utils.Ptr("targetLabel"), }, }, @@ -62,16 +61,16 @@ func fixtureGetScrapeConfigResponse(mods ...func(*observability.GetScrapeConfigR "key2": {}, }, SampleLimit: &number, - Scheme: observability.JOBSCHEME_HTTP.Ptr(), - ScrapeInterval: utils.Ptr("interval"), - ScrapeTimeout: utils.Ptr("timeout"), - StaticConfigs: &[]observability.StaticConfigs{ + Scheme: observability.SCHEME_HTTP.Ptr(), + ScrapeInterval: "interval", + ScrapeTimeout: "timeout", + StaticConfigs: []observability.StaticConfigs{ { Labels: &map[string]string{ "label": "value", "label2": "value2", }, - Targets: &[]string{"target"}, + Targets: []string{"target"}, }, }, TlsConfig: &observability.TLSConfig{ @@ -89,43 +88,43 @@ func fixtureGetScrapeConfigResponse(mods ...func(*observability.GetScrapeConfigR func fixtureUpdateScrapeConfigPayload(mods ...func(*observability.UpdateScrapeConfigPayload)) *observability.UpdateScrapeConfigPayload { payload := &observability.UpdateScrapeConfigPayload{ - BasicAuth: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{ + BasicAuth: &observability.UpdateScrapeConfigPayloadBasicAuth{ Username: utils.Ptr("username"), Password: utils.Ptr("password"), }, BearerToken: utils.Ptr("bearerToken"), HonorLabels: utils.Ptr(true), HonorTimeStamps: utils.Ptr(true), - MetricsPath: utils.Ptr("/metrics"), - MetricsRelabelConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner{ + MetricsPath: "/metrics", + MetricsRelabelConfigs: []observability.UpdateScrapeConfigPayloadMetricsRelabelConfigsInner{ { - Action: observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInnerGetActionAttributeType(utils.Ptr("replace")), - Modulus: utils.Ptr(1.0), + Action: observability.UpdateScrapeConfigPayloadMetricsRelabelConfigsInnerAction("replace").Ptr(), + Modulus: utils.Ptr(float32(1.0)), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), Separator: utils.Ptr("separator"), - SourceLabels: &[]string{"sourceLabel"}, + SourceLabels: []string{"sourceLabel"}, TargetLabel: utils.Ptr("targetLabel"), }, }, - Params: &map[string]interface{}{ + Params: map[string]interface{}{ "key": []string{"value1", "value2"}, "key2": []string{}, }, - SampleLimit: utils.Ptr(1.0), - Scheme: observability.UPDATESCRAPECONFIGPAYLOADSCHEME_HTTP.Ptr(), - ScrapeInterval: utils.Ptr("interval"), - ScrapeTimeout: utils.Ptr("timeout"), - StaticConfigs: &[]observability.UpdateScrapeConfigPayloadStaticConfigsInner{ + SampleLimit: utils.Ptr(float32(1.0)), + Scheme: observability.UPDATESCRAPECONFIGPAYLOADSCHEME_HTTP, + ScrapeInterval: "interval", + ScrapeTimeout: "timeout", + StaticConfigs: []observability.UpdateScrapeConfigPayloadStaticConfigsInner{ { - Labels: &map[string]interface{}{ + Labels: map[string]interface{}{ "label": "value", "label2": "value2", }, - Targets: &[]string{"target"}, + Targets: []string{"target"}, }, }, - TlsConfig: &observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig{ + TlsConfig: &observability.UpdateScrapeConfigPayloadTlsConfig{ InsecureSkipVerify: utils.Ptr(true), }, } @@ -144,37 +143,36 @@ type observabilityClientMocked struct { getGrafanaConfigsResp *observability.GrafanaConfigs } -func (m *observabilityClientMocked) GetInstanceExecute(_ context.Context, _, _ string) (*observability.GetInstanceResponse, error) { - if m.getInstanceFails { - return nil, fmt.Errorf("could not get instance") - } - return m.getInstanceResp, nil -} - -func (m *observabilityClientMocked) GetGrafanaConfigsExecute(_ context.Context, _, _ string) (*observability.GrafanaConfigs, error) { - if m.getGrafanaConfigsFails { - return nil, fmt.Errorf("could not get grafana configs") +func (m *observabilityClientMocked) newMock() observability.DefaultAPI { + return observability.DefaultAPIServiceMock{ + GetInstanceExecuteMock: utils.Ptr(func(_ observability.ApiGetInstanceRequest) (*observability.GetInstanceResponse, error) { + if m.getInstanceFails { + return nil, fmt.Errorf("could not get instance") + } + return m.getInstanceResp, nil + }), + GetGrafanaConfigsExecuteMock: utils.Ptr(func(_ observability.ApiGetGrafanaConfigsRequest) (*observability.GrafanaConfigs, error) { + if m.getGrafanaConfigsFails { + return nil, fmt.Errorf("could not get grafana configs") + } + return m.getGrafanaConfigsResp, nil + }), } - return m.getGrafanaConfigsResp, nil -} - -func (c *observabilityClientMocked) UpdateGrafanaConfigs(ctx context.Context, instanceId, projectId string) observability.ApiUpdateGrafanaConfigsRequest { - return testClient.UpdateGrafanaConfigs(ctx, instanceId, projectId) } func fixtureGrafanaConfigs(mods ...func(gc *observability.GrafanaConfigs)) *observability.GrafanaConfigs { gc := observability.GrafanaConfigs{ - GenericOauth: &observability.GrafanaOauth{ - ApiUrl: utils.Ptr("apiUrl"), - AuthUrl: utils.Ptr("authUrl"), - Enabled: utils.Ptr(true), + GenericOauth: &observability.GrafanaOauth{ // nolint:gosec // false positive + ApiUrl: "apiUrl", + AuthUrl: "authUrl", + Enabled: true, Name: utils.Ptr("name"), - OauthClientId: utils.Ptr("oauthClientId"), - OauthClientSecret: utils.Ptr("oauthClientSecret"), - RoleAttributePath: utils.Ptr("roleAttributePath"), + OauthClientId: "oauthClientId", + OauthClientSecret: "oauthClientSecret", + RoleAttributePath: "roleAttributePath", RoleAttributeStrict: utils.Ptr(true), Scopes: utils.Ptr("scopes"), - TokenUrl: utils.Ptr("tokenUrl"), + TokenUrl: "tokenUrl", UsePkce: utils.Ptr(true), }, PublicReadAccess: utils.Ptr(false), @@ -216,7 +214,7 @@ func TestGetInstanceName(t *testing.T) { getInstanceResp: tt.getInstanceResp, } - output, err := GetInstanceName(context.Background(), client, testInstanceId, testProjectId) + output, err := GetInstanceName(context.Background(), client.newMock(), testInstanceId, testProjectId) if tt.isValid && err != nil { t.Errorf("failed on valid input") @@ -276,7 +274,7 @@ func TestLoadPlanId(t *testing.T) { description: "no available plans", planName: testPlanName, plansResponse: &observability.PlansResponse{ - Plans: &[]observability.Plan{}, + Plans: []observability.Plan{}, }, isValid: false, }, @@ -295,8 +293,8 @@ func TestLoadPlanId(t *testing.T) { if !tt.isValid { return } - if *output != tt.expectedOutput { - t.Errorf("expected output to be %s, got %s", tt.expectedOutput, *output) + if output != tt.expectedOutput { + t.Errorf("expected output to be %s, got %s", tt.expectedOutput, output) } }) } @@ -341,7 +339,7 @@ func TestValidatePlanId(t *testing.T) { description: "no available plans", planId: testPlanId, plansResponse: &observability.PlansResponse{ - Plans: &[]observability.Plan{}, + Plans: []observability.Plan{}, }, isValid: false, }, @@ -382,17 +380,10 @@ func TestMapToUpdateScrapeConfigPayload(t *testing.T) { resp: nil, isValid: false, }, - { - description: "nil data", - resp: &observability.GetScrapeConfigResponse{ - Data: nil, - }, - isValid: false, - }, { description: "empty data", resp: &observability.GetScrapeConfigResponse{ - Data: &observability.Job{}, + Data: observability.Job{}, }, isValid: false, }, @@ -425,37 +416,37 @@ func TestMapToUpdateScrapeConfigPayload(t *testing.T) { func TestMapMetricsRelabelConfig(t *testing.T) { tests := []struct { description string - config *[]observability.MetricsRelabelConfig - expected *[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner + config []observability.MetricsRelabelConfig + expected *[]observability.UpdateScrapeConfigPayloadMetricsRelabelConfigsInner }{ { description: "base case", - config: &[]observability.MetricsRelabelConfig{ + config: []observability.MetricsRelabelConfig{ { - Action: observability.METRICSRELABELCONFIGACTION_REPLACE.Ptr(), - Modulus: utils.Int64Ptr(1), + Action: observability.ACTION_REPLACE.Ptr(), + Modulus: utils.Ptr(int32(1)), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), Separator: utils.Ptr("separator"), - SourceLabels: utils.Ptr([]string{"sourceLabel", "sourceLabel2"}), + SourceLabels: []string{"sourceLabel", "sourceLabel2"}, TargetLabel: utils.Ptr("targetLabel"), }, }, - expected: &[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner{ + expected: &[]observability.UpdateScrapeConfigPayloadMetricsRelabelConfigsInner{ { - Action: observability.PARTIALUPDATESCRAPECONFIGSREQUESTINNERMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), - Modulus: utils.Float64Ptr(1.0), + Action: observability.UPDATESCRAPECONFIGPAYLOADMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), + Modulus: utils.Ptr(float32(1.0)), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), Separator: utils.Ptr("separator"), - SourceLabels: utils.Ptr([]string{"sourceLabel", "sourceLabel2"}), + SourceLabels: []string{"sourceLabel", "sourceLabel2"}, TargetLabel: utils.Ptr("targetLabel"), }, }, }, { description: "empty data", - config: &[]observability.MetricsRelabelConfig{}, + config: []observability.MetricsRelabelConfig{}, expected: nil, }, { @@ -469,11 +460,11 @@ func TestMapMetricsRelabelConfig(t *testing.T) { t.Run(tt.description, func(t *testing.T) { output := mapMetricsRelabelConfig(tt.config) - if tt.expected == nil && output == nil || *output == nil { + if tt.expected == nil && output == nil { return } - diff := cmp.Diff(*output, *tt.expected) + diff := cmp.Diff(output, *tt.expected) if diff != "" { t.Fatalf("Data does not match: %s", diff) } @@ -484,33 +475,33 @@ func TestMapMetricsRelabelConfig(t *testing.T) { func TestMapStaticConfig(t *testing.T) { tests := []struct { description string - config *[]observability.StaticConfigs + config []observability.StaticConfigs expected *[]observability.UpdateScrapeConfigPayloadStaticConfigsInner }{ { description: "base case", - config: &[]observability.StaticConfigs{ + config: []observability.StaticConfigs{ { Labels: &map[string]string{ "label": "value", "label2": "value2", }, - Targets: &[]string{"target", "target2"}, + Targets: []string{"target", "target2"}, }, }, expected: &[]observability.UpdateScrapeConfigPayloadStaticConfigsInner{ { - Labels: utils.Ptr(map[string]interface{}{ + Labels: map[string]interface{}{ "label": "value", "label2": "value2", - }), - Targets: utils.Ptr([]string{"target", "target2"}), + }, + Targets: []string{"target", "target2"}, }, }, }, { description: "empty data", - config: &[]observability.StaticConfigs{}, + config: []observability.StaticConfigs{}, expected: nil, }, { @@ -524,11 +515,11 @@ func TestMapStaticConfig(t *testing.T) { t.Run(tt.description, func(t *testing.T) { output := mapStaticConfig(tt.config) - if tt.expected == nil && (output == nil || *output == nil) { + if tt.expected == nil && output == nil { return } - diff := cmp.Diff(*output, *tt.expected) + diff := cmp.Diff(output, *tt.expected) if diff != "" { t.Fatalf("Data does not match: %s", diff) } @@ -540,15 +531,15 @@ func TestMapBasicAuth(t *testing.T) { tests := []struct { description string auth *observability.BasicAuth - expected *observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth + expected *observability.UpdateScrapeConfigPayloadBasicAuth }{ { description: "base case", auth: &observability.BasicAuth{ - Username: utils.Ptr("username"), - Password: utils.Ptr("password"), + Username: "username", + Password: "password", }, - expected: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{ + expected: &observability.UpdateScrapeConfigPayloadBasicAuth{ Username: utils.Ptr("username"), Password: utils.Ptr("password"), }, @@ -556,7 +547,7 @@ func TestMapBasicAuth(t *testing.T) { { description: "empty data", auth: &observability.BasicAuth{}, - expected: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{}, + expected: &observability.UpdateScrapeConfigPayloadBasicAuth{}, }, { description: "nil", @@ -585,21 +576,21 @@ func TestMapTlsConfig(t *testing.T) { tests := []struct { description string config *observability.TLSConfig - expected *observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig + expected *observability.UpdateScrapeConfigPayloadTlsConfig }{ { description: "base case", config: &observability.TLSConfig{ InsecureSkipVerify: utils.Ptr(true), }, - expected: &observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig{ + expected: &observability.UpdateScrapeConfigPayloadTlsConfig{ InsecureSkipVerify: utils.Ptr(true), }, }, { description: "empty data", config: &observability.TLSConfig{}, - expected: &observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig{}, + expected: &observability.UpdateScrapeConfigPayloadTlsConfig{}, }, { description: "nil", @@ -708,30 +699,30 @@ func TestToPayloadGenericOAuth(t *testing.T) { }{ { description: "base", - response: &observability.GrafanaOauth{ - ApiUrl: utils.Ptr("apiUrl"), - AuthUrl: utils.Ptr("authUrl"), - Enabled: utils.Ptr(true), + response: &observability.GrafanaOauth{ // nolint:gosec // false positive + ApiUrl: "apiUrl", + AuthUrl: "authUrl", + Enabled: true, Name: utils.Ptr("name"), - OauthClientId: utils.Ptr("oauthClientId"), - OauthClientSecret: utils.Ptr("oauthClientSecret"), - RoleAttributePath: utils.Ptr("roleAttributePath"), + OauthClientId: "oauthClientId", + OauthClientSecret: "oauthClientSecret", + RoleAttributePath: "roleAttributePath", RoleAttributeStrict: utils.Ptr(true), Scopes: utils.Ptr("scopes"), - TokenUrl: utils.Ptr("tokenUrl"), + TokenUrl: "tokenUrl", UsePkce: utils.Ptr(true), }, - expected: &observability.UpdateGrafanaConfigsPayloadGenericOauth{ - ApiUrl: utils.Ptr("apiUrl"), - AuthUrl: utils.Ptr("authUrl"), - Enabled: utils.Ptr(true), + expected: &observability.UpdateGrafanaConfigsPayloadGenericOauth{ // nolint:gosec // false positive + ApiUrl: "apiUrl", + AuthUrl: "authUrl", + Enabled: true, Name: utils.Ptr("name"), - OauthClientId: utils.Ptr("oauthClientId"), - OauthClientSecret: utils.Ptr("oauthClientSecret"), - RoleAttributePath: utils.Ptr("roleAttributePath"), + OauthClientId: "oauthClientId", + OauthClientSecret: "oauthClientSecret", + RoleAttributePath: "roleAttributePath", RoleAttributeStrict: utils.Ptr(true), Scopes: utils.Ptr("scopes"), - TokenUrl: utils.Ptr("tokenUrl"), + TokenUrl: "tokenUrl", UsePkce: utils.Ptr(true), }, }, @@ -875,7 +866,7 @@ func TestGetPartialUpdateGrafanaConfigsPayload(t *testing.T) { getGrafanaConfigsResp: tt.getGrafanaConfigsResp, } - payload, err := GetPartialUpdateGrafanaConfigsPayload(context.Background(), client, testInstanceId, testProjectId, tt.singleSignOn, tt.publicReadAccess) + payload, err := GetPartialUpdateGrafanaConfigsPayload(context.Background(), client.newMock(), testInstanceId, testProjectId, tt.singleSignOn, tt.publicReadAccess) if tt.isValid && err != nil { t.Errorf("failed on valid input") @@ -894,3 +885,36 @@ func TestGetPartialUpdateGrafanaConfigsPayload(t *testing.T) { }) } } + +// in internal/pkg/services/observability/utils/utils.go#mapMetricsRelabelConfig we cast from one enum to another, esure that both have the same values +func TestUpdateScrapeConfigPayloadMetricsRelabelConfigsInnerActionIsAction(t *testing.T) { + innerKeys := make(map[string]struct{}) + actionKeys := make(map[string]struct{}) + for _, innerEnumVal := range observability.AllowedUpdateScrapeConfigPayloadMetricsRelabelConfigsInnerActionEnumValues { + innerKeys[string(innerEnumVal)] = struct{}{} + } + for _, actionEnumVal := range observability.AllowedActionEnumValues { + actionKeys[string(actionEnumVal)] = struct{}{} + } + onlyInInner := make([]string, 0) + onlyInAction := make([]string, 0) + for innerKey := range innerKeys { + if _, ok := actionKeys[innerKey]; !ok { + onlyInInner = append(onlyInInner, innerKey) + } + } + for actionKey := range actionKeys { + if _, ok := innerKeys[actionKey]; !ok { + onlyInAction = append(onlyInAction, actionKey) + } + } + if len(onlyInInner) > 0 { + t.Logf("the following keys are only in AllowedUpdateScrapeConfigPayloadMetricsRelabelConfigsInnerActionEnumValues: %v", onlyInInner) + } + if len(onlyInAction) > 0 { + t.Logf("the following keys are only in AllowedActionEnumValues: %v", onlyInAction) + } + if len(onlyInInner) > 0 || len(onlyInAction) > 0 { + t.Fail() + } +} diff --git a/internal/pkg/utils/utils.go b/internal/pkg/utils/utils.go index bb2b36561..1326ec122 100644 --- a/internal/pkg/utils/utils.go +++ b/internal/pkg/utils/utils.go @@ -78,6 +78,17 @@ func ConvertInt64PToFloat64P(i *int64) *float64 { return &f } +// ConvertInt32PToFloat32P converts an int32 pointer to a float64 pointer +// This function will return nil if the input is nil +// This is a lossy conversion for i > 2^24 +func ConvertInt32PToFloat32P(i *int32) *float32 { + if i == nil { + return nil + } + f := float32(*i) + return &f +} + func ValidateURLDomain(value string) error { urlStruct, err := url.Parse(value) if err != nil { diff --git a/internal/pkg/utils/utils_test.go b/internal/pkg/utils/utils_test.go index df6a6c414..1fdd5844d 100644 --- a/internal/pkg/utils/utils_test.go +++ b/internal/pkg/utils/utils_test.go @@ -1,12 +1,13 @@ package utils import ( + "fmt" "reflect" "testing" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" - "github.com/spf13/viper" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/stackit-sdk-go/core/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/config" ) @@ -53,6 +54,57 @@ func TestConvertInt64PToFloat64P(t *testing.T) { } } +func TestConvertInt32PToFloat64P(t *testing.T) { + tests := []struct { + name string + input *int32 + expected *float32 + }{ + { + name: "positive", + input: utils.Ptr(int32(1)), + expected: utils.Ptr(float32(1)), + }, + { + name: "negative", + input: utils.Ptr(int32(-1)), + expected: utils.Ptr(float32(-1)), + }, + { + name: "zero", + input: utils.Ptr(int32(0)), + expected: utils.Ptr(float32(0)), + }, + { + name: "nil", + input: nil, + expected: nil, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + expected := ConvertInt32PToFloat32P(tt.input) + + if expected == nil && tt.expected == nil && tt.input == nil { + return + } + + if *expected != *tt.expected { + t.Errorf("ConvertInt64ToFloat64() = %v, want %v", *expected, *tt.expected) + } + }) + } +} + +func TestConvertInt32PToFloat64PLossyConversion(t *testing.T) { + i := int32(900_000_001) + f := ConvertInt32PToFloat32P(&i) + s := fmt.Sprintf("%f", *f) + if s != "900000000.000000" { + t.Errorf("Expected lossy conversion of %d to %f, got %s", i, *f, s) + } +} + func TestValidateURLDomain(t *testing.T) { tests := []struct { name string