From 526183ac2336f94d449850bd1e7962bb27a9ee35 Mon Sep 17 00:00:00 2001 From: Ruben Hoenle Date: Mon, 17 Mar 2025 14:06:35 +0100 Subject: [PATCH 1/3] chore(loadbalancer): regional adjustment relates to STACKITCLI-127 --- go.mod | 2 +- go.sum | 4 +- internal/cmd/load-balancer/create/create.go | 4 +- .../cmd/load-balancer/create/create_test.go | 26 +++++++----- internal/cmd/load-balancer/delete/delete.go | 4 +- .../cmd/load-balancer/delete/delete_test.go | 16 +++++--- .../cmd/load-balancer/describe/describe.go | 2 +- .../load-balancer/describe/describe_test.go | 18 +++++---- .../generate-payload/generate_payload.go | 2 +- .../generate-payload/generate_payload_test.go | 20 ++++++---- internal/cmd/load-balancer/list/list.go | 2 +- internal/cmd/load-balancer/list/list_test.go | 18 +++++---- .../observability-credentials/add/add.go | 2 +- .../observability-credentials/add/add_test.go | 22 +++++----- .../cleanup/cleanup.go | 6 +-- .../cleanup/cleanup_test.go | 21 +++++----- .../delete/delete.go | 4 +- .../delete/delete_test.go | 19 +++++---- .../describe/describe.go | 2 +- .../describe/describe_test.go | 19 +++++---- .../observability-credentials/list/list.go | 4 +- .../list/list_test.go | 18 +++++---- .../update/update.go | 21 ++++++---- .../update/update_test.go | 40 ++++++++++--------- internal/cmd/load-balancer/quota/quota.go | 2 +- .../cmd/load-balancer/quota/quota_test.go | 16 +++++--- .../target-pool/add-target/add_target.go | 4 +- .../target-pool/add-target/add_target_test.go | 31 +++++++------- .../target-pool/describe/describe.go | 2 +- .../target-pool/describe/describe_test.go | 17 ++++---- .../remove-target/remove_target.go | 6 +-- .../remove-target/remove_target_test.go | 30 +++++++------- internal/cmd/load-balancer/update/update.go | 2 +- .../cmd/load-balancer/update/update_test.go | 18 +++++---- .../pkg/services/load-balancer/utils/utils.go | 33 ++++++++------- .../load-balancer/utils/utils_test.go | 19 ++++----- 36 files changed, 270 insertions(+), 206 deletions(-) diff --git a/go.mod b/go.mod index 37c11f601..634c5e032 100644 --- a/go.mod +++ b/go.mod @@ -79,7 +79,7 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v0.18.0 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.21.0 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.21.0 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.0 diff --git a/go.sum b/go.sum index 1c461e0c3..4e94d6af3 100644 --- a/go.sum +++ b/go.sum @@ -125,8 +125,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.0 h1:gEoA2oj3OcDg3XI0K github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.0/go.mod h1:JE8POcTfSxTo+g1MkgVQ+OjT4jWEr08MIY8qx3Hi+Tw= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.21.1 h1:ZFFJr54FcYTUBjE+5E3Cx92jTDdHGKT2DTIvvJSRrTc= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.21.1/go.mod h1:9p5IIdOKOM5/DIjbenKrWvz6GlSps4jsPJZkH7QJuRU= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v0.18.0 h1:7nNjIIcBQRDVnW4NL7+R8DaCKEqxxxsmVsgOVe50ZMU= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v0.18.0/go.mod h1:UFujBT+JlNvl6JNrY96UpLGqp+lZTD+JWL7siqhGPlw= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.0 h1:z2p0OobEAgSE5bQr+KR+4Y1QTvDbSC2a7w2eCV/oSp4= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.0/go.mod h1:x0jgrL+/K2cE4BvcIQByFUf0nOPVZRqq5Z074kjjr64= github.com/stackitcloud/stackit-sdk-go/services/logme v0.21.0 h1:P7bxaVzkZPGMWItLynKIvc88Xh6jCnK4dPTTT+L607o= github.com/stackitcloud/stackit-sdk-go/services/logme v0.21.0/go.mod h1:os4Kp2+jkMUJ2dZtgU9A91N3EJSw3MMh2slxgK1609g= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.21.0 h1:ks1i+cfD/YPRss//4aq6uvxbLvUwb5QvcUrOPeboLFY= diff --git a/internal/cmd/load-balancer/create/create.go b/internal/cmd/load-balancer/create/create.go index e106d4aa9..a0600f66d 100644 --- a/internal/cmd/load-balancer/create/create.go +++ b/internal/cmd/load-balancer/create/create.go @@ -95,7 +95,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.Async { s := spinner.New(p) s.Start("Creating load balancer") - _, err = wait.CreateLoadBalancerWaitHandler(ctx, apiClient, model.ProjectId, *model.Payload.Name).WaitWithContext(ctx) + _, err = wait.CreateLoadBalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *model.Payload.Name).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for load balancer creation: %w", err) } @@ -155,7 +155,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiCreateLoadBalancerRequest { - req := apiClient.CreateLoadBalancer(ctx, model.ProjectId) + req := apiClient.CreateLoadBalancer(ctx, model.ProjectId, model.Region) req = req.CreateLoadBalancerPayload(*model.Payload) req = req.XRequestID(xRequestId) return req diff --git a/internal/cmd/load-balancer/create/create_test.go b/internal/cmd/load-balancer/create/create_test.go index 09dae8cc1..da7bfce83 100644 --- a/internal/cmd/load-balancer/create/create_test.go +++ b/internal/cmd/load-balancer/create/create_test.go @@ -15,14 +15,18 @@ import ( "github.com/google/uuid" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} -var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &loadbalancer.APIClient{} -var testProjectId = uuid.NewString() -var testRequestId = xRequestId +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &loadbalancer.APIClient{} + testProjectId = uuid.NewString() + testRequestId = xRequestId +) var testPayload = &loadbalancer.CreateLoadBalancerPayload{ ExternalAddress: utils.Ptr(""), @@ -98,7 +102,8 @@ var testPayload = &loadbalancer.CreateLoadBalancerPayload{ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, payloadFlag: `{ "externalAddress": "", "listeners": [ @@ -180,6 +185,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Payload: testPayload, @@ -191,7 +197,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiCreateLoadBalancerRequest)) loadbalancer.ApiCreateLoadBalancerRequest { - request := testClient.CreateLoadBalancer(testCtx, testProjectId) + request := testClient.CreateLoadBalancer(testCtx, testProjectId, testRegion) request = request.CreateLoadBalancerPayload(*testPayload) request = request.XRequestID(testRequestId) for _, mod := range mods { @@ -226,21 +232,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/delete/delete.go b/internal/cmd/load-balancer/delete/delete.go index ff3f50e80..c2410db74 100644 --- a/internal/cmd/load-balancer/delete/delete.go +++ b/internal/cmd/load-balancer/delete/delete.go @@ -68,7 +68,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.Async { s := spinner.New(p) s.Start("Deleting load balancer") - _, err = wait.DeleteLoadBalancerWaitHandler(ctx, apiClient, model.ProjectId, model.LoadBalancerName).WaitWithContext(ctx) + _, err = wait.DeleteLoadBalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.LoadBalancerName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for load balancer deletion: %w", err) } @@ -112,6 +112,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiDeleteLoadBalancerRequest { - req := apiClient.DeleteLoadBalancer(ctx, model.ProjectId, model.LoadBalancerName) + req := apiClient.DeleteLoadBalancer(ctx, model.ProjectId, model.Region, model.LoadBalancerName) return req } diff --git a/internal/cmd/load-balancer/delete/delete_test.go b/internal/cmd/load-balancer/delete/delete_test.go index eac37e0fa..621113c56 100644 --- a/internal/cmd/load-balancer/delete/delete_test.go +++ b/internal/cmd/load-balancer/delete/delete_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -34,7 +36,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -46,6 +49,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, LoadBalancerName: testLoadBalancerName, @@ -57,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiDeleteLoadBalancerRequest)) loadbalancer.ApiDeleteLoadBalancerRequest { - request := testClient.DeleteLoadBalancer(testCtx, testProjectId, testLoadBalancerName) + request := testClient.DeleteLoadBalancer(testCtx, testProjectId, testRegion, testLoadBalancerName) for _, mod := range mods { mod(&request) } @@ -101,7 +105,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -109,7 +113,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -117,7 +121,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/describe/describe.go b/internal/cmd/load-balancer/describe/describe.go index 0c759d545..603bfd185 100644 --- a/internal/cmd/load-balancer/describe/describe.go +++ b/internal/cmd/load-balancer/describe/describe.go @@ -94,7 +94,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiGetLoadBalancerRequest { - req := apiClient.GetLoadBalancer(ctx, model.ProjectId, model.LoadBalancerName) + req := apiClient.GetLoadBalancer(ctx, model.ProjectId, model.Region, model.LoadBalancerName) return req } diff --git a/internal/cmd/load-balancer/describe/describe_test.go b/internal/cmd/load-balancer/describe/describe_test.go index 24720dac8..821f942b7 100644 --- a/internal/cmd/load-balancer/describe/describe_test.go +++ b/internal/cmd/load-balancer/describe/describe_test.go @@ -12,14 +12,16 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" + testloadBalancerName = "loadBalancer" +) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &loadbalancer.APIClient{} var testProjectId = uuid.NewString() -var testloadBalancerName = "loadBalancer" func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ @@ -33,7 +35,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -45,6 +48,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, LoadBalancerName: testloadBalancerName, @@ -56,7 +60,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiGetLoadBalancerRequest)) loadbalancer.ApiGetLoadBalancerRequest { - request := testClient.GetLoadBalancer(testCtx, testProjectId, testloadBalancerName) + request := testClient.GetLoadBalancer(testCtx, testProjectId, testRegion, testloadBalancerName) for _, mod := range mods { mod(&request) } @@ -100,7 +104,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -108,7 +112,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -116,7 +120,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index b947aa629..ba14de569 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -208,7 +208,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiGetLoadBalancerRequest { - req := apiClient.GetLoadBalancer(ctx, model.ProjectId, *model.LoadBalancerName) + req := apiClient.GetLoadBalancer(ctx, model.ProjectId, model.Region, *model.LoadBalancerName) return req } diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go index e8dd6dd2e..0e2ee4beb 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -28,9 +30,10 @@ const ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - loadBalancerNameFlag: testLoadBalancerName, - filePathFlag: testFilePath, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + loadBalancerNameFlag: testLoadBalancerName, + filePathFlag: testFilePath, } for _, mod := range mods { mod(flagValues) @@ -42,6 +45,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, LoadBalancerName: utils.Ptr(testLoadBalancerName), @@ -54,7 +58,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiGetLoadBalancerRequest)) loadbalancer.ApiGetLoadBalancerRequest { - request := testClient.GetLoadBalancer(testCtx, testProjectId, testLoadBalancerName) + request := testClient.GetLoadBalancer(testCtx, testProjectId, testRegion, testLoadBalancerName) for _, mod := range mods { mod(&request) } @@ -105,21 +109,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/list/list.go b/internal/cmd/load-balancer/list/list.go index fa2036c29..0179c81f8 100644 --- a/internal/cmd/load-balancer/list/list.go +++ b/internal/cmd/load-balancer/list/list.go @@ -127,7 +127,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiListLoadBalancersRequest { - req := apiClient.ListLoadBalancers(ctx, model.ProjectId) + req := apiClient.ListLoadBalancers(ctx, model.ProjectId, model.Region) return req } diff --git a/internal/cmd/load-balancer/list/list_test.go b/internal/cmd/load-balancer/list/list_test.go index 2ad30db36..d2ee551e5 100644 --- a/internal/cmd/load-balancer/list/list_test.go +++ b/internal/cmd/load-balancer/list/list_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -23,8 +25,9 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -36,6 +39,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Limit: utils.Ptr(int64(10)), @@ -47,7 +51,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiListLoadBalancersRequest)) loadbalancer.ApiListLoadBalancersRequest { - request := testClient.ListLoadBalancers(testCtx, testProjectId) + request := testClient.ListLoadBalancers(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -75,21 +79,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/observability-credentials/add/add.go b/internal/cmd/load-balancer/observability-credentials/add/add.go index 77dfbf48e..a75b5e064 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add.go @@ -133,7 +133,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiCreateCredentialsRequest { - req := apiClient.CreateCredentials(ctx, model.ProjectId) + req := apiClient.CreateCredentials(ctx, model.ProjectId, model.Region) req = req.XRequestID(uuid.NewString()) req = req.CreateCredentialsPayload(loadbalancer.CreateCredentialsPayload{ diff --git a/internal/cmd/load-balancer/observability-credentials/add/add_test.go b/internal/cmd/load-balancer/observability-credentials/add/add_test.go index a9cfb8719..57557613a 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add_test.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -23,10 +25,11 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - displayNameFlag: "name", - usernameFlag: "username", - passwordFlag: "pwd", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: "name", + usernameFlag: "username", + passwordFlag: "pwd", } for _, mod := range mods { mod(flagValues) @@ -38,6 +41,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, DisplayName: utils.Ptr("name"), @@ -51,7 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiCreateCredentialsRequest)) loadbalancer.ApiCreateCredentialsRequest { - request := testClient.CreateCredentials(testCtx, testProjectId) + request := testClient.CreateCredentials(testCtx, testProjectId, testRegion) request = request.CreateCredentialsPayload(loadbalancer.CreateCredentialsPayload{ DisplayName: utils.Ptr("name"), Username: utils.Ptr("username"), @@ -84,21 +88,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go index 221b155e5..28b560b2a 100644 --- a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go +++ b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go @@ -59,7 +59,7 @@ func NewCmd(p *print.Printer) *cobra.Command { var credentials []loadbalancer.CredentialsResponse if resp.Credentials != nil && len(*resp.Credentials) > 0 { - credentials, err = utils.FilterCredentials(ctx, apiClient, *resp.Credentials, model.ProjectId, utils.OP_FILTER_UNUSED) + credentials, err = utils.FilterCredentials(ctx, apiClient, *resp.Credentials, model.ProjectId, model.Region, utils.OP_FILTER_UNUSED) if err != nil { return fmt.Errorf("filter Load Balancer observability credentials: %w", err) } @@ -130,11 +130,11 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildDeleteCredentialRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient, credentialsRef string) loadbalancer.ApiDeleteCredentialsRequest { - req := apiClient.DeleteCredentials(ctx, model.ProjectId, credentialsRef) + req := apiClient.DeleteCredentials(ctx, model.ProjectId, model.Region, credentialsRef) return req } func buildListCredentialsRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiListCredentialsRequest { - req := apiClient.ListCredentials(ctx, model.ProjectId) + req := apiClient.ListCredentials(ctx, model.ProjectId, model.Region) return req } diff --git a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go index ffa7a07e7..ae7b8e3c4 100644 --- a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go +++ b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go @@ -13,9 +13,10 @@ import ( "github.com/google/uuid" ) -const testCredentialsRef = "credentials-1" - -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" + testCredentialsRef = "credentials-1" +) type testCtxKey struct{} @@ -25,7 +26,8 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -37,6 +39,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, } @@ -47,7 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureDeleteCredentialRequest(mods ...func(request *loadbalancer.ApiDeleteCredentialsRequest)) loadbalancer.ApiDeleteCredentialsRequest { - request := testClient.DeleteCredentials(testCtx, testProjectId, testCredentialsRef) + request := testClient.DeleteCredentials(testCtx, testProjectId, testRegion, testCredentialsRef) for _, mod := range mods { mod(&request) } @@ -55,7 +58,7 @@ func fixtureDeleteCredentialRequest(mods ...func(request *loadbalancer.ApiDelete } func fixtureListCredentialsRequest(mods ...func(request *loadbalancer.ApiListCredentialsRequest)) loadbalancer.ApiListCredentialsRequest { - request := testClient.ListCredentials(testCtx, testProjectId) + request := testClient.ListCredentials(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -90,21 +93,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/observability-credentials/delete/delete.go b/internal/cmd/load-balancer/observability-credentials/delete/delete.go index a3c6eb87d..73c9db46d 100644 --- a/internal/cmd/load-balancer/observability-credentials/delete/delete.go +++ b/internal/cmd/load-balancer/observability-credentials/delete/delete.go @@ -56,7 +56,7 @@ func NewCmd(p *print.Printer) *cobra.Command { projectLabel = model.ProjectId } - credentialsLabel, err := loadbalancerUtils.GetCredentialsDisplayName(ctx, apiClient, model.ProjectId, model.CredentialsRef) + credentialsLabel, err := loadbalancerUtils.GetCredentialsDisplayName(ctx, apiClient, model.ProjectId, model.Region, model.CredentialsRef) if err != nil { p.Debug(print.ErrorLevel, "get observability credentials display name: %v", err) credentialsLabel = model.CredentialsRef @@ -110,6 +110,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiDeleteCredentialsRequest { - req := apiClient.DeleteCredentials(ctx, model.ProjectId, model.CredentialsRef) + req := apiClient.DeleteCredentials(ctx, model.ProjectId, model.Region, model.CredentialsRef) return req } diff --git a/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go b/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go index 629b93f5c..d4f22f799 100644 --- a/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go +++ b/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go @@ -13,7 +13,10 @@ import ( "github.com/google/uuid" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" + testCredentialsRef = "credentials-xxx" +) type testCtxKey struct{} @@ -21,8 +24,6 @@ var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &loadbalancer.APIClient{} var testProjectId = uuid.NewString() -const testCredentialsRef = "credentials-xxx" - func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ testCredentialsRef, @@ -35,7 +36,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +49,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, CredentialsRef: testCredentialsRef, @@ -58,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiDeleteCredentialsRequest)) loadbalancer.ApiDeleteCredentialsRequest { - request := testClient.DeleteCredentials(testCtx, testProjectId, testCredentialsRef) + request := testClient.DeleteCredentials(testCtx, testProjectId, testRegion, testCredentialsRef) for _, mod := range mods { mod(&request) } @@ -102,7 +105,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -110,7 +113,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -118,7 +121,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/observability-credentials/describe/describe.go b/internal/cmd/load-balancer/observability-credentials/describe/describe.go index e16b9eb4f..9f622f750 100644 --- a/internal/cmd/load-balancer/observability-credentials/describe/describe.go +++ b/internal/cmd/load-balancer/observability-credentials/describe/describe.go @@ -91,7 +91,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiGetCredentialsRequest { - req := apiClient.GetCredentials(ctx, model.ProjectId, model.CredentialsRef) + req := apiClient.GetCredentials(ctx, model.ProjectId, model.Region, model.CredentialsRef) return req } diff --git a/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go b/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go index 05f8a8d64..a67979219 100644 --- a/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go +++ b/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go @@ -12,7 +12,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" + testCredentialsRef = "credentials-test" +) type testCtxKey struct{} @@ -20,8 +23,6 @@ var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &loadbalancer.APIClient{} var testProjectId = uuid.NewString() -const testCredentialsRef = "credentials-test" - func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ testCredentialsRef, @@ -34,7 +35,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -46,6 +48,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, CredentialsRef: testCredentialsRef, @@ -57,7 +60,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiGetCredentialsRequest)) loadbalancer.ApiGetCredentialsRequest { - request := testClient.GetCredentials(testCtx, testProjectId, testCredentialsRef) + request := testClient.GetCredentials(testCtx, testProjectId, testRegion, testCredentialsRef) for _, mod := range mods { mod(&request) } @@ -101,7 +104,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -109,7 +112,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -117,7 +120,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/observability-credentials/list/list.go b/internal/cmd/load-balancer/observability-credentials/list/list.go index bafed9561..87e149053 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list.go @@ -92,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return err } - credentials, err = lbUtils.FilterCredentials(ctx, apiClient, credentials, model.ProjectId, filterOp) + credentials, err = lbUtils.FilterCredentials(ctx, apiClient, credentials, model.ProjectId, model.Region, filterOp) if err != nil { return fmt.Errorf("filter credentials: %w", err) } @@ -162,7 +162,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiListCredentialsRequest { - req := apiClient.ListCredentials(ctx, model.ProjectId) + req := apiClient.ListCredentials(ctx, model.ProjectId, model.Region) return req } diff --git a/internal/cmd/load-balancer/observability-credentials/list/list_test.go b/internal/cmd/load-balancer/observability-credentials/list/list_test.go index e37d0b3c2..ddf04272e 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list_test.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -24,8 +26,9 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -37,6 +40,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Limit: utils.Ptr(int64(10)), @@ -48,7 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiListCredentialsRequest)) loadbalancer.ApiListCredentialsRequest { - request := testClient.ListCredentials(testCtx, testProjectId) + request := testClient.ListCredentials(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -76,21 +80,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/observability-credentials/update/update.go b/internal/cmd/load-balancer/observability-credentials/update/update.go index 8c3d7ebbc..4c76da9f9 100644 --- a/internal/cmd/load-balancer/observability-credentials/update/update.go +++ b/internal/cmd/load-balancer/observability-credentials/update/update.go @@ -27,6 +27,16 @@ const ( credentialsRefArg = "CREDENTIALS_REF" //nolint:gosec // linter false positive ) +// enforce implementation of interfaces +var ( + _ loadBalancerClient = &loadbalancer.APIClient{} +) + +type loadBalancerClient interface { + UpdateCredentials(ctx context.Context, projectId, region, credentialsRef string) loadbalancer.ApiUpdateCredentialsRequest + GetCredentialsExecute(ctx context.Context, projectId, region, credentialsRef string) (*loadbalancer.GetCredentialsResponse, error) +} + type inputModel struct { *globalflags.GlobalFlagModel CredentialsRef string @@ -68,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { projectLabel = model.ProjectId } - credentialsLabel, err := loadBalancerUtils.GetCredentialsDisplayName(ctx, apiClient, model.ProjectId, model.CredentialsRef) + credentialsLabel, err := loadBalancerUtils.GetCredentialsDisplayName(ctx, apiClient, model.ProjectId, model.Region, model.CredentialsRef) if err != nil { p.Debug(print.ErrorLevel, "get credentials display name: %v", err) credentialsLabel = model.CredentialsRef @@ -137,15 +147,10 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu }, nil } -type loadBalancerClient interface { - UpdateCredentials(ctx context.Context, instanceId, projectId string) loadbalancer.ApiUpdateCredentialsRequest - GetCredentialsExecute(ctx context.Context, instanceId, projectId string) (*loadbalancer.GetCredentialsResponse, error) -} - func buildRequest(ctx context.Context, model *inputModel, apiClient loadBalancerClient) (loadbalancer.ApiUpdateCredentialsRequest, error) { - req := apiClient.UpdateCredentials(ctx, model.ProjectId, model.CredentialsRef) + req := apiClient.UpdateCredentials(ctx, model.ProjectId, model.Region, model.CredentialsRef) - currentCredentials, err := apiClient.GetCredentialsExecute(ctx, model.ProjectId, model.CredentialsRef) + currentCredentials, err := apiClient.GetCredentialsExecute(ctx, model.ProjectId, model.Region, model.CredentialsRef) if err != nil { return req, fmt.Errorf("get Load Balancer observability credentials: %w", err) } diff --git a/internal/cmd/load-balancer/observability-credentials/update/update_test.go b/internal/cmd/load-balancer/observability-credentials/update/update_test.go index 6b30da82b..87677fa86 100644 --- a/internal/cmd/load-balancer/observability-credentials/update/update_test.go +++ b/internal/cmd/load-balancer/observability-credentials/update/update_test.go @@ -15,33 +15,35 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" + testCredentialsRef = "credentials-test" +) type testCtxKey struct{} -var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &loadbalancer.APIClient{} +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &loadbalancer.APIClient{} + testProjectId = uuid.NewString() +) type loadBalancerClientMocked struct { getCredentialsError bool getCredentialsResponse *loadbalancer.GetCredentialsResponse } -func (c *loadBalancerClientMocked) UpdateCredentials(ctx context.Context, projectId, credentialsRef string) loadbalancer.ApiUpdateCredentialsRequest { - return testClient.UpdateCredentials(ctx, projectId, credentialsRef) +func (c *loadBalancerClientMocked) UpdateCredentials(ctx context.Context, projectId, region, credentialsRef string) loadbalancer.ApiUpdateCredentialsRequest { + return testClient.UpdateCredentials(ctx, projectId, region, credentialsRef) } -func (c *loadBalancerClientMocked) GetCredentialsExecute(_ context.Context, _, _ string) (*loadbalancer.GetCredentialsResponse, error) { +func (c *loadBalancerClientMocked) GetCredentialsExecute(_ context.Context, _, _, _ string) (*loadbalancer.GetCredentialsResponse, error) { if c.getCredentialsError { return nil, fmt.Errorf("get credentials failed") } return c.getCredentialsResponse, nil } -var testProjectId = uuid.NewString() - -const testCredentialsRef = "credentials-test" - func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ testCredentialsRef, @@ -54,10 +56,11 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - displayNameFlag: "name", - usernameFlag: "username", - passwordFlag: "pwd", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: "name", + usernameFlag: "username", + passwordFlag: "pwd", } for _, mod := range mods { mod(flagValues) @@ -69,6 +72,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, DisplayName: utils.Ptr("name"), @@ -83,7 +87,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiUpdateCredentialsRequest)) loadbalancer.ApiUpdateCredentialsRequest { - request := testClient.UpdateCredentials(testCtx, testProjectId, testCredentialsRef) + request := testClient.UpdateCredentials(testCtx, testProjectId, testRegion, testCredentialsRef) request = request.UpdateCredentialsPayload(loadbalancer.UpdateCredentialsPayload{ DisplayName: utils.Ptr("name"), Username: utils.Ptr("username"), @@ -145,7 +149,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -153,7 +157,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -161,7 +165,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/quota/quota.go b/internal/cmd/load-balancer/quota/quota.go index fb99fb6f7..9c2fb2840 100644 --- a/internal/cmd/load-balancer/quota/quota.go +++ b/internal/cmd/load-balancer/quota/quota.go @@ -81,7 +81,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiGetQuotaRequest { - req := apiClient.GetQuota(ctx, model.ProjectId) + req := apiClient.GetQuota(ctx, model.ProjectId, model.Region) return req } diff --git a/internal/cmd/load-balancer/quota/quota_test.go b/internal/cmd/load-balancer/quota/quota_test.go index b6938c379..e1ba5a893 100644 --- a/internal/cmd/load-balancer/quota/quota_test.go +++ b/internal/cmd/load-balancer/quota/quota_test.go @@ -12,7 +12,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -22,7 +24,8 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -34,6 +37,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, } @@ -44,7 +48,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiGetQuotaRequest)) loadbalancer.ApiGetQuotaRequest { - request := testClient.GetQuota(testCtx, testProjectId) + request := testClient.GetQuota(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -67,21 +71,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target.go b/internal/cmd/load-balancer/target-pool/add-target/add_target.go index 13d816e9f..139dfda26 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target.go @@ -124,9 +124,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient utils.LoadBalancerClient) (loadbalancer.ApiUpdateTargetPoolRequest, error) { - req := apiClient.UpdateTargetPool(ctx, model.ProjectId, model.LBName, model.TargetPoolName) + req := apiClient.UpdateTargetPool(ctx, model.ProjectId, model.Region, model.LBName, model.TargetPoolName) - targetPool, err := utils.GetLoadBalancerTargetPool(ctx, apiClient, model.ProjectId, model.LBName, model.TargetPoolName) + targetPool, err := utils.GetLoadBalancerTargetPool(ctx, apiClient, model.ProjectId, model.Region, model.LBName, model.TargetPoolName) if err != nil { return req, fmt.Errorf("get load balancer target pool: %w", err) } diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go b/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go index 8120dc497..6fd3da6c9 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go @@ -15,8 +15,6 @@ import ( "github.com/google/uuid" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var ( @@ -26,6 +24,7 @@ var ( ) const ( + testRegion = "eu02" testLBName = "my-load-balancer" testTargetPoolName = "target-pool-1" testTargetName = "my-target" @@ -39,25 +38,25 @@ type loadBalancerClientMocked struct { getLoadBalancerResp *loadbalancer.LoadBalancer } -func (m *loadBalancerClientMocked) GetCredentialsExecute(_ context.Context, _, _ string) (*loadbalancer.GetCredentialsResponse, error) { +func (m *loadBalancerClientMocked) GetCredentialsExecute(_ context.Context, _, _, _ string) (*loadbalancer.GetCredentialsResponse, error) { if m.getCredentialsFails { return nil, fmt.Errorf("could not get credentials") } return m.getCredentialsResp, nil } -func (m *loadBalancerClientMocked) GetLoadBalancerExecute(_ context.Context, _, _ string) (*loadbalancer.LoadBalancer, error) { +func (m *loadBalancerClientMocked) GetLoadBalancerExecute(_ context.Context, _, _, _ string) (*loadbalancer.LoadBalancer, error) { if m.getLoadBalancerFails { return nil, fmt.Errorf("could not get load balancer") } return m.getLoadBalancerResp, nil } -func (m *loadBalancerClientMocked) UpdateTargetPool(ctx context.Context, projectId, loadBalancerName, targetPoolName string) loadbalancer.ApiUpdateTargetPoolRequest { - return testClient.UpdateTargetPool(ctx, projectId, loadBalancerName, targetPoolName) +func (m *loadBalancerClientMocked) UpdateTargetPool(ctx context.Context, projectId, region, loadBalancerName, targetPoolName string) loadbalancer.ApiUpdateTargetPoolRequest { + return testClient.UpdateTargetPool(ctx, projectId, region, loadBalancerName, targetPoolName) } -func (m *loadBalancerClientMocked) ListLoadBalancersExecute(_ context.Context, _ string) (*loadbalancer.ListLoadBalancersResponse, error) { +func (m *loadBalancerClientMocked) ListLoadBalancersExecute(_ context.Context, _, _ string) (*loadbalancer.ListLoadBalancersResponse, error) { return nil, nil } @@ -73,10 +72,11 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - lbNameFlag: testLBName, - targetNameFlag: testTargetName, - targetPoolNameFlag: testTargetPoolName, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + lbNameFlag: testLBName, + targetNameFlag: testTargetName, + targetPoolNameFlag: testTargetPoolName, } for _, mod := range mods { mod(flagValues) @@ -88,6 +88,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, TargetPoolName: testTargetPoolName, @@ -171,7 +172,7 @@ func fixturePayload(mods ...func(payload *loadbalancer.UpdateTargetPoolPayload)) } func fixtureRequest(mods ...func(request *loadbalancer.ApiUpdateTargetPoolRequest)) loadbalancer.ApiUpdateTargetPoolRequest { - request := testClient.UpdateTargetPool(testCtx, testProjectId, testLBName, testTargetPoolName) + request := testClient.UpdateTargetPool(testCtx, testProjectId, testRegion, testLBName, testTargetPoolName) request = request.UpdateTargetPoolPayload(*fixturePayload()) for _, mod := range mods { mod(&request) @@ -204,7 +205,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -212,7 +213,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -220,7 +221,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/target-pool/describe/describe.go b/internal/cmd/load-balancer/target-pool/describe/describe.go index 70af7ce15..a4ffa6d65 100644 --- a/internal/cmd/load-balancer/target-pool/describe/describe.go +++ b/internal/cmd/load-balancer/target-pool/describe/describe.go @@ -115,7 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiGetLoadBalancerRequest { - req := apiClient.GetLoadBalancer(ctx, model.ProjectId, model.LBName) + req := apiClient.GetLoadBalancer(ctx, model.ProjectId, model.Region, model.LBName) return req } diff --git a/internal/cmd/load-balancer/target-pool/describe/describe_test.go b/internal/cmd/load-balancer/target-pool/describe/describe_test.go index 502a965f8..e1acadb53 100644 --- a/internal/cmd/load-balancer/target-pool/describe/describe_test.go +++ b/internal/cmd/load-balancer/target-pool/describe/describe_test.go @@ -12,8 +12,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var ( @@ -23,6 +21,7 @@ var ( ) const ( + testRegion = "eu02" testLoadBalancerName = "my-load-balancer" testTargetPoolName = "target-pool-1" ) @@ -39,8 +38,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - lbNameFlag: testLoadBalancerName, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + lbNameFlag: testLoadBalancerName, } for _, mod := range mods { mod(flagValues) @@ -52,6 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, LBName: testLoadBalancerName, @@ -64,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiGetLoadBalancerRequest)) loadbalancer.ApiGetLoadBalancerRequest { - request := testClient.GetLoadBalancer(testCtx, testProjectId, testLoadBalancerName) + request := testClient.GetLoadBalancer(testCtx, testProjectId, testRegion, testLoadBalancerName) for _, mod := range mods { mod(&request) } @@ -96,7 +97,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -104,7 +105,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -112,7 +113,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go index 36a84313f..2fbb0c447 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go @@ -56,7 +56,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } - targetLabel, err := utils.GetTargetName(ctx, apiClient, model.ProjectId, model.LBName, model.TargetPoolName, model.IP) + targetLabel, err := utils.GetTargetName(ctx, apiClient, model.ProjectId, model.Region, model.LBName, model.TargetPoolName, model.IP) if err != nil { p.Debug(print.ErrorLevel, "get target name: %v", err) targetLabel = model.IP @@ -124,9 +124,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient utils.LoadBalancerClient) (loadbalancer.ApiUpdateTargetPoolRequest, error) { - req := apiClient.UpdateTargetPool(ctx, model.ProjectId, model.LBName, model.TargetPoolName) + req := apiClient.UpdateTargetPool(ctx, model.ProjectId, model.Region, model.LBName, model.TargetPoolName) - targetPool, err := utils.GetLoadBalancerTargetPool(ctx, apiClient, model.ProjectId, model.LBName, model.TargetPoolName) + targetPool, err := utils.GetLoadBalancerTargetPool(ctx, apiClient, model.ProjectId, model.Region, model.LBName, model.TargetPoolName) if err != nil { return req, fmt.Errorf("get load balancer target pool: %w", err) } diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go index ec31f13e2..e961447d2 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go @@ -15,8 +15,6 @@ import ( "github.com/google/uuid" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var ( @@ -26,9 +24,9 @@ var ( ) const ( + testRegion = "eu02" testLBName = "my-load-balancer" testTargetPoolName = "target-pool-1" - testTargetName = "my-target" testIP = "1.2.3.4" ) @@ -39,25 +37,25 @@ type loadBalancerClientMocked struct { getLoadBalancerResp *loadbalancer.LoadBalancer } -func (m *loadBalancerClientMocked) GetCredentialsExecute(_ context.Context, _, _ string) (*loadbalancer.GetCredentialsResponse, error) { +func (m *loadBalancerClientMocked) GetCredentialsExecute(_ context.Context, _, _, _ string) (*loadbalancer.GetCredentialsResponse, error) { if m.getCredentialsFails { return nil, fmt.Errorf("could not get credentials") } return m.getCredentialsResp, nil } -func (m *loadBalancerClientMocked) GetLoadBalancerExecute(_ context.Context, _, _ string) (*loadbalancer.LoadBalancer, error) { +func (m *loadBalancerClientMocked) GetLoadBalancerExecute(_ context.Context, _, _, _ string) (*loadbalancer.LoadBalancer, error) { if m.getLoadBalancerFails { return nil, fmt.Errorf("could not get load balancer") } return m.getLoadBalancerResp, nil } -func (m *loadBalancerClientMocked) UpdateTargetPool(ctx context.Context, projectId, loadBalancerName, targetPoolName string) loadbalancer.ApiUpdateTargetPoolRequest { - return testClient.UpdateTargetPool(ctx, projectId, loadBalancerName, targetPoolName) +func (m *loadBalancerClientMocked) UpdateTargetPool(ctx context.Context, projectId, region, loadBalancerName, targetPoolName string) loadbalancer.ApiUpdateTargetPoolRequest { + return testClient.UpdateTargetPool(ctx, projectId, region, loadBalancerName, targetPoolName) } -func (m *loadBalancerClientMocked) ListLoadBalancersExecute(_ context.Context, _ string) (*loadbalancer.ListLoadBalancersResponse, error) { +func (m *loadBalancerClientMocked) ListLoadBalancersExecute(_ context.Context, _, _ string) (*loadbalancer.ListLoadBalancersResponse, error) { return nil, nil } @@ -73,9 +71,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - lbNameFlag: testLBName, - targetPoolNameFlag: testTargetPoolName, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + lbNameFlag: testLBName, + targetPoolNameFlag: testTargetPoolName, } for _, mod := range mods { mod(flagValues) @@ -87,6 +86,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, LBName: testLBName, @@ -169,7 +169,7 @@ func fixturePayload(mods ...func(payload *loadbalancer.UpdateTargetPoolPayload)) } func fixtureRequest(mods ...func(request *loadbalancer.ApiUpdateTargetPoolRequest)) loadbalancer.ApiUpdateTargetPoolRequest { - request := testClient.UpdateTargetPool(testCtx, testProjectId, testLBName, testTargetPoolName) + request := testClient.UpdateTargetPool(testCtx, testProjectId, testRegion, testLBName, testTargetPoolName) request = request.UpdateTargetPoolPayload(*fixturePayload()) for _, mod := range mods { mod(&request) @@ -202,7 +202,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -210,7 +210,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -218,7 +218,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/load-balancer/update/update.go b/internal/cmd/load-balancer/update/update.go index ba10a2d7f..154e9d992 100644 --- a/internal/cmd/load-balancer/update/update.go +++ b/internal/cmd/load-balancer/update/update.go @@ -129,7 +129,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalancer.APIClient) loadbalancer.ApiUpdateLoadBalancerRequest { - req := apiClient.UpdateLoadBalancer(ctx, model.ProjectId, model.LoadBalancerName) + req := apiClient.UpdateLoadBalancer(ctx, model.ProjectId, model.Region, model.LoadBalancerName) req = req.UpdateLoadBalancerPayload(model.Payload) return req diff --git a/internal/cmd/load-balancer/update/update_test.go b/internal/cmd/load-balancer/update/update_test.go index ea03f5932..b6c998138 100644 --- a/internal/cmd/load-balancer/update/update_test.go +++ b/internal/cmd/load-balancer/update/update_test.go @@ -14,14 +14,16 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" + testLoadBalancerName = "loadBalancer" +) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &loadbalancer.APIClient{} var testProjectId = uuid.NewString() -var testLoadBalancerName = "loadBalancer" var testPayload = loadbalancer.UpdateLoadBalancerPayload{ ExternalAddress: utils.Ptr(""), @@ -108,7 +110,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, payloadFlag: ` { "externalAddress": "", @@ -193,6 +196,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, LoadBalancerName: testLoadBalancerName, @@ -205,7 +209,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *loadbalancer.ApiUpdateLoadBalancerRequest)) loadbalancer.ApiUpdateLoadBalancerRequest { - request := testClient.UpdateLoadBalancer(testCtx, testProjectId, testLoadBalancerName) + request := testClient.UpdateLoadBalancer(testCtx, testProjectId, testRegion, testLoadBalancerName) request = request.UpdateLoadBalancerPayload(testPayload) for _, mod := range mods { mod(&request) @@ -250,7 +254,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -258,7 +262,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -266,7 +270,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/pkg/services/load-balancer/utils/utils.go b/internal/pkg/services/load-balancer/utils/utils.go index 1ad93ce18..4bc13db61 100644 --- a/internal/pkg/services/load-balancer/utils/utils.go +++ b/internal/pkg/services/load-balancer/utils/utils.go @@ -15,23 +15,28 @@ const ( OP_FILTER_UNUSED ) +// enforce implementation of interfaces +var ( + _ LoadBalancerClient = &loadbalancer.APIClient{} +) + type LoadBalancerClient interface { - GetCredentialsExecute(ctx context.Context, projectId, credentialsRef string) (*loadbalancer.GetCredentialsResponse, error) - GetLoadBalancerExecute(ctx context.Context, projectId, name string) (*loadbalancer.LoadBalancer, error) - UpdateTargetPool(ctx context.Context, projectId, loadBalancerName, targetPoolName string) loadbalancer.ApiUpdateTargetPoolRequest - ListLoadBalancersExecute(ctx context.Context, projectId string) (*loadbalancer.ListLoadBalancersResponse, error) + GetCredentialsExecute(ctx context.Context, projectId, region, credentialsRef string) (*loadbalancer.GetCredentialsResponse, error) + GetLoadBalancerExecute(ctx context.Context, projectId, region, name string) (*loadbalancer.LoadBalancer, error) + UpdateTargetPool(ctx context.Context, projectId, region, loadBalancerName, targetPoolName string) loadbalancer.ApiUpdateTargetPoolRequest + ListLoadBalancersExecute(ctx context.Context, projectId, region string) (*loadbalancer.ListLoadBalancersResponse, error) } -func GetCredentialsDisplayName(ctx context.Context, apiClient LoadBalancerClient, projectId, credentialsRef string) (string, error) { - resp, err := apiClient.GetCredentialsExecute(ctx, projectId, credentialsRef) +func GetCredentialsDisplayName(ctx context.Context, apiClient LoadBalancerClient, projectId, region, credentialsRef string) (string, error) { + resp, err := apiClient.GetCredentialsExecute(ctx, projectId, region, credentialsRef) if err != nil { return "", fmt.Errorf("get Load Balancer credentials: %w", err) } return *resp.Credential.DisplayName, nil } -func GetLoadBalancerTargetPool(ctx context.Context, apiClient LoadBalancerClient, projectId, loadBalancerName, targetPoolName string) (*loadbalancer.TargetPool, error) { - resp, err := apiClient.GetLoadBalancerExecute(ctx, projectId, loadBalancerName) +func GetLoadBalancerTargetPool(ctx context.Context, apiClient LoadBalancerClient, projectId, region, loadBalancerName, targetPoolName string) (*loadbalancer.TargetPool, error) { + resp, err := apiClient.GetLoadBalancerExecute(ctx, projectId, region, loadBalancerName) if err != nil { return nil, fmt.Errorf("get load balancer: %w", err) } @@ -121,8 +126,8 @@ func ToPayloadTargetPool(targetPool *loadbalancer.TargetPool) *loadbalancer.Upda } } -func GetTargetName(ctx context.Context, apiClient LoadBalancerClient, projectId, loadBalancerName, targetPoolName, targetIp string) (string, error) { - targetPool, err := GetLoadBalancerTargetPool(ctx, apiClient, projectId, loadBalancerName, targetPoolName) +func GetTargetName(ctx context.Context, apiClient LoadBalancerClient, projectId, region, loadBalancerName, targetPoolName, targetIp string) (string, error) { + targetPool, err := GetLoadBalancerTargetPool(ctx, apiClient, projectId, region, loadBalancerName, targetPoolName) if err != nil { return "", fmt.Errorf("get target pool: %w", err) } @@ -142,10 +147,10 @@ func GetTargetName(ctx context.Context, apiClient LoadBalancerClient, projectId, // GetUsedObsCredentials returns a list of credentials that are used by load balancers for observability metrics or logs. // It goes through all load balancers and checks what observability credentials are being used, then returns a list of those credentials. -func GetUsedObsCredentials(ctx context.Context, apiClient LoadBalancerClient, allCredentials []loadbalancer.CredentialsResponse, projectId string) ([]loadbalancer.CredentialsResponse, error) { +func GetUsedObsCredentials(ctx context.Context, apiClient LoadBalancerClient, allCredentials []loadbalancer.CredentialsResponse, projectId, region string) ([]loadbalancer.CredentialsResponse, error) { var usedCredentialsSlice []loadbalancer.CredentialsResponse - loadBalancers, err := apiClient.ListLoadBalancersExecute(ctx, projectId) + loadBalancers, err := apiClient.ListLoadBalancersExecute(ctx, projectId, region) if err != nil { return nil, fmt.Errorf("list load balancers: %w", err) } @@ -218,7 +223,7 @@ func GetUnusedObsCredentials(usedCredentials, allCredentials []loadbalancer.Cred // If unused is true, it returns only the credentials that are not used by any load balancer for observability metrics or logs. // If both used and unused are true, it returns an error. // If both used and unused are false, it returns the original list of credentials. -func FilterCredentials(ctx context.Context, client LoadBalancerClient, allCredentials []loadbalancer.CredentialsResponse, projectId string, filterOp int) ([]loadbalancer.CredentialsResponse, error) { +func FilterCredentials(ctx context.Context, client LoadBalancerClient, allCredentials []loadbalancer.CredentialsResponse, projectId, region string, filterOp int) ([]loadbalancer.CredentialsResponse, error) { // check that filter OP is valid if filterOp != OP_FILTER_USED && filterOp != OP_FILTER_UNUSED && filterOp != OP_FILTER_NOP { return nil, fmt.Errorf("invalid filter operation") @@ -228,7 +233,7 @@ func FilterCredentials(ctx context.Context, client LoadBalancerClient, allCreden return allCredentials, nil } - usedCredentials, err := GetUsedObsCredentials(ctx, client, allCredentials, projectId) + usedCredentials, err := GetUsedObsCredentials(ctx, client, allCredentials, projectId, region) if err != nil { return nil, fmt.Errorf("get used observability credentials: %w", err) } diff --git a/internal/pkg/services/load-balancer/utils/utils_test.go b/internal/pkg/services/load-balancer/utils/utils_test.go index 93b8f6ff3..e33fd75b8 100644 --- a/internal/pkg/services/load-balancer/utils/utils_test.go +++ b/internal/pkg/services/load-balancer/utils/utils_test.go @@ -19,6 +19,7 @@ var ( ) const ( + testRegion = "eu02" testCredentialsRef = "credentials-ref" testCredentialsDisplayName = "credentials-name" testLoadBalancerName = "my-load-balancer" @@ -33,28 +34,28 @@ type loadBalancerClientMocked struct { listLoadBalancersResp *loadbalancer.ListLoadBalancersResponse } -func (m *loadBalancerClientMocked) GetCredentialsExecute(_ context.Context, _, _ string) (*loadbalancer.GetCredentialsResponse, error) { +func (m *loadBalancerClientMocked) GetCredentialsExecute(_ context.Context, _, _, _ string) (*loadbalancer.GetCredentialsResponse, error) { if m.getCredentialsFails { return nil, fmt.Errorf("could not get credentials") } return m.getCredentialsResp, nil } -func (m *loadBalancerClientMocked) GetLoadBalancerExecute(_ context.Context, _, _ string) (*loadbalancer.LoadBalancer, error) { +func (m *loadBalancerClientMocked) GetLoadBalancerExecute(_ context.Context, _, _, _ string) (*loadbalancer.LoadBalancer, error) { if m.getLoadBalancerFails { return nil, fmt.Errorf("could not get load balancer") } return m.getLoadBalancerResp, nil } -func (m *loadBalancerClientMocked) ListLoadBalancersExecute(_ context.Context, _ string) (*loadbalancer.ListLoadBalancersResponse, error) { +func (m *loadBalancerClientMocked) ListLoadBalancersExecute(_ context.Context, _, _ string) (*loadbalancer.ListLoadBalancersResponse, error) { if m.listLoadBalancersFails { return nil, fmt.Errorf("could not list load balancers") } return m.listLoadBalancersResp, nil } -func (m *loadBalancerClientMocked) UpdateTargetPool(_ context.Context, _, _, _ string) loadbalancer.ApiUpdateTargetPoolRequest { +func (m *loadBalancerClientMocked) UpdateTargetPool(_ context.Context, _, _, _, _ string) loadbalancer.ApiUpdateTargetPoolRequest { return loadbalancer.ApiUpdateTargetPoolRequest{} } @@ -190,7 +191,7 @@ func TestGetCredentialsDisplayName(t *testing.T) { getCredentialsResp: tt.getCredentialsResp, } - output, err := GetCredentialsDisplayName(context.Background(), client, testProjectId, testCredentialsRef) + output, err := GetCredentialsDisplayName(context.Background(), client, testProjectId, testRegion, testCredentialsRef) if tt.isValid && err != nil { t.Errorf("failed on valid input") @@ -270,7 +271,7 @@ func TestGetLoadBalancerTargetPool(t *testing.T) { getLoadBalancerResp: tt.getLoadBalancerResp, } - output, err := GetLoadBalancerTargetPool(context.Background(), client, testProjectId, testLoadBalancerName, tt.targetPoolName) + output, err := GetLoadBalancerTargetPool(context.Background(), client, testProjectId, testRegion, testLoadBalancerName, tt.targetPoolName) if tt.isValid && err != nil { t.Errorf("failed on valid input") @@ -824,7 +825,7 @@ func TestGetTargetName(t *testing.T) { getLoadBalancerResp: tt.getLoadBalancerResp, } - output, err := GetTargetName(context.Background(), client, testProjectId, testLoadBalancerName, tt.targetPoolName, tt.targetIp) + output, err := GetTargetName(context.Background(), client, testProjectId, testRegion, testLoadBalancerName, tt.targetPoolName, tt.targetIp) if tt.isValid && err != nil { t.Errorf("failed on valid input") @@ -962,7 +963,7 @@ func TestGetUsedObsCredentials(t *testing.T) { listLoadBalancersResp: tt.listLoadBalancersResp, } - output, err := GetUsedObsCredentials(testCtx, client, tt.allCredentials, testProjectId) + output, err := GetUsedObsCredentials(testCtx, client, tt.allCredentials, testProjectId, testRegion) if tt.isValid && err != nil { t.Errorf("failed on valid input") @@ -1139,7 +1140,7 @@ func TestFilterCredentials(t *testing.T) { listLoadBalancersResp: tt.listLoadBalancersResp, listLoadBalancersFails: tt.listLoadBalancersFails, } - filteredCredentials, err := FilterCredentials(testCtx, client, tt.allCredentials, testProjectId, tt.filterOp) + filteredCredentials, err := FilterCredentials(testCtx, client, tt.allCredentials, testProjectId, testRegion, tt.filterOp) if err != nil { if !tt.isValid { return From a18c6bd42107021fad7d9f8779e1b9d131054d41 Mon Sep 17 00:00:00 2001 From: Ruben Hoenle Date: Tue, 18 Mar 2025 17:31:38 +0100 Subject: [PATCH 2/3] chore(loadbalancer): remove region adjustment from client --- internal/pkg/services/load-balancer/client/client.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/pkg/services/load-balancer/client/client.go b/internal/pkg/services/load-balancer/client/client.go index dc0f51639..94d0b0a17 100644 --- a/internal/pkg/services/load-balancer/client/client.go +++ b/internal/pkg/services/load-balancer/client/client.go @@ -27,8 +27,7 @@ func ConfigureClient(p *print.Printer) (*loadbalancer.APIClient, error) { if customEndpoint != "" { cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) } else { - region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + cfgOptions = append(cfgOptions, authCfgOption) } if p.IsVerbosityDebug() { From 01ebe32498ba289bb341f38882e8244815c7a425 Mon Sep 17 00:00:00 2001 From: Ruben Hoenle Date: Wed, 19 Mar 2025 15:03:36 +0100 Subject: [PATCH 3/3] fix(loadbalancer): show correct number of listeners & targets in list cmd --- internal/cmd/load-balancer/list/list.go | 16 ++++++++++++---- internal/cmd/load-balancer/list/list_test.go | 7 +++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/internal/cmd/load-balancer/list/list.go b/internal/cmd/load-balancer/list/list.go index 0179c81f8..a9611e137 100644 --- a/internal/cmd/load-balancer/list/list.go +++ b/internal/cmd/load-balancer/list/list.go @@ -154,13 +154,21 @@ func outputResult(p *print.Printer, outputFormat string, loadBalancers []loadbal table.SetHeader("NAME", "STATE", "IP ADDRESS", "LISTENERS", "TARGET POOLS") for i := range loadBalancers { l := loadBalancers[i] - externalAdress := utils.PtrStringDefault(l.ExternalAddress, "-") + var numListeners, numTargetPools int + if l.Listeners != nil { + numListeners = len(*l.Listeners) + } + if l.TargetPools != nil { + numTargetPools = len(*l.TargetPools) + } + + externalAddress := utils.PtrStringDefault(l.ExternalAddress, "-") table.AddRow( utils.PtrString(l.Name), utils.PtrString(l.Status), - externalAdress, - len(utils.PtrString(l.Listeners)), - len(utils.PtrString(l.TargetPools)), + externalAddress, + numListeners, + numTargetPools, ) } err := table.Display(p) diff --git a/internal/cmd/load-balancer/list/list_test.go b/internal/cmd/load-balancer/list/list_test.go index d2ee551e5..d0210b9cb 100644 --- a/internal/cmd/load-balancer/list/list_test.go +++ b/internal/cmd/load-balancer/list/list_test.go @@ -202,6 +202,13 @@ func TestOutputResult(t *testing.T) { args: args{}, wantErr: false, }, + { + name: "empty loadbalancers slice", + args: args{ + loadBalancers: []loadbalancer.LoadBalancer{}, + }, + wantErr: false, + }, { name: "empty loadbalancer in loadbalancers slice", args: args{