From 2b63eeecc69fc136112300e080f163a793e8c4c7 Mon Sep 17 00:00:00 2001 From: Felix Breuer Date: Wed, 17 Dec 2025 16:32:16 +0100 Subject: [PATCH 1/4] change region from secret to provider spec Signed-off-by: Felix Breuer --- pkg/provider/apis/provider_spec.go | 4 +++ pkg/provider/apis/validation/validation.go | 26 +++++++++++++------ pkg/provider/core.go | 29 ++++++++++++++++------ 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/pkg/provider/apis/provider_spec.go b/pkg/provider/apis/provider_spec.go index af3cc972..f8b91ba8 100644 --- a/pkg/provider/apis/provider_spec.go +++ b/pkg/provider/apis/provider_spec.go @@ -6,6 +6,10 @@ package api // ProviderSpec is the spec to be used while parsing the calls. type ProviderSpec struct { + // Region is the STACKIT region (e.g., "eu01", "eu02") + // Required field for creating a server. + Region string `json:"region"` + // MachineType is the STACKIT server type (e.g., "c2i.2", "m2i.8") // Required field for creating a server. MachineType string `json:"machineType"` diff --git a/pkg/provider/apis/validation/validation.go b/pkg/provider/apis/validation/validation.go index 9dda3eee..c27bac58 100644 --- a/pkg/provider/apis/validation/validation.go +++ b/pkg/provider/apis/validation/validation.go @@ -30,8 +30,12 @@ var emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z] var machineTypeRegex = regexp.MustCompile(`^[a-z]+\d+[a-z]*\.\d+[a-z]*(\.[a-z]+\d+)*$`) // regionRegex is a regex pattern for validating STACKIT region format +// Pattern: lowercase letters/digits (e.g., eu01, eu01) +var regionRegex = regexp.MustCompile(`^[a-z0-9]+$`) + +// availabilityZoneRegex is a regex pattern for validating STACKIT availability zone format // Pattern: lowercase letters/digits followed by digits, dash, then digit(s) (e.g., eu01-1, eu01-2) -var regionRegex = regexp.MustCompile(`^[a-z0-9]+-\d+$`) +var availabilityZoneRegex = regexp.MustCompile(`^[a-z0-9]+-\d+$`) // labelKeyRegex validates Kubernetes label keys (must start/end with alphanumeric, can contain -, _, .) // Maximum length: 63 characters @@ -74,13 +78,14 @@ func ValidateProviderSpecNSecret(spec *api.ProviderSpec, secrets *corev1.Secret) } // Validate region (required for SDK) - region, ok := secrets.Data["region"] - if !ok { - errors = append(errors, fmt.Errorf("secret field 'region' is required")) - } else if len(region) == 0 { - errors = append(errors, fmt.Errorf("secret field 'region' cannot be empty")) - } else if !isValidRegion(string(region)) { - errors = append(errors, fmt.Errorf("secret field 'region' has invalid format (expected format: eu01-1, eu01-2, etc.)")) + if spec.Region == "" { + errors = append(errors, fmt.Errorf("providerSpec.Region cannot be empty")) + } else if !isValidRegion(spec.Region) { + errors = append(errors, fmt.Errorf("providerSpec.Region has invalid format (expected format: eu01, eu02, etc.)")) + } + + if spec.AvailabilityZone != "" && !isValidAvailabilityZone(spec.AvailabilityZone) { + errors = append(errors, fmt.Errorf("providerSpec.availabilityZone has invalid format (expected format: eu01-1, eu01-2, etc.)")) } // Validate ProviderSpec @@ -287,6 +292,11 @@ func isValidRegion(s string) bool { return regionRegex.MatchString(s) } +// isValidAvailabilityZone checks if a string matches the STACKIT availability zone format +func isValidAvailabilityZone(s string) bool { + return availabilityZoneRegex.MatchString(s) +} + // isValidJSON checks if a string is valid JSON func isValidJSON(s string) bool { var js json.RawMessage diff --git a/pkg/provider/core.go b/pkg/provider/core.go index 07ced5ad..d1b70bf6 100644 --- a/pkg/provider/core.go +++ b/pkg/provider/core.go @@ -53,7 +53,6 @@ func (p *Provider) CreateMachine(ctx context.Context, req *driver.CreateMachineR // Extract credentials from Secret projectID := string(req.Secret.Data["project-id"]) serviceAccountKey := string(req.Secret.Data["serviceaccount.json"]) - region := string(req.Secret.Data["region"]) // Initialize client on first use (lazy initialization) if err := p.ensureClient(serviceAccountKey); err != nil { @@ -171,7 +170,7 @@ func (p *Provider) CreateMachine(ctx context.Context, req *driver.CreateMachineR } // Call STACKIT API to create server - server, err := p.client.CreateServer(ctx, projectID, region, createReq) + server, err := p.client.CreateServer(ctx, projectID, providerSpec.Region, createReq) if err != nil { klog.Errorf("Failed to create server for machine %q: %v", req.Machine.Name, err) return nil, status.Error(codes.Internal, fmt.Sprintf("failed to create server: %v", err)) @@ -211,7 +210,6 @@ func (p *Provider) DeleteMachine(ctx context.Context, req *driver.DeleteMachineR // Extract credentials from Secret serviceAccountKey := string(req.Secret.Data["serviceaccount.json"]) - region := string(req.Secret.Data["region"]) // Initialize client on first use (lazy initialization) if err := p.ensureClient(serviceAccountKey); err != nil { @@ -227,8 +225,13 @@ func (p *Provider) DeleteMachine(ctx context.Context, req *driver.DeleteMachineR return nil, status.Error(codes.InvalidArgument, fmt.Sprintf("invalid ProviderID format: %v", err)) } + providerSpec, err := decodeProviderSpec(req.MachineClass) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + // Call STACKIT API to delete server - err = p.client.DeleteServer(ctx, projectID, region, serverID) + err = p.client.DeleteServer(ctx, projectID, providerSpec.Region, serverID) if err != nil { // Check if server was not found (404) - this is OK for idempotency if errors.Is(err, ErrServerNotFound) { @@ -273,7 +276,6 @@ func (p *Provider) GetMachineStatus(ctx context.Context, req *driver.GetMachineS // Extract credentials from Secret serviceAccountKey := string(req.Secret.Data["serviceaccount.json"]) - region := string(req.Secret.Data["region"]) // Initialize client on first use (lazy initialization) if err := p.ensureClient(serviceAccountKey); err != nil { @@ -290,8 +292,14 @@ func (p *Provider) GetMachineStatus(ctx context.Context, req *driver.GetMachineS return nil, status.Error(codes.InvalidArgument, fmt.Sprintf("invalid ProviderID format: %v", err)) } + // Decode ProviderSpec from MachineClass + providerSpec, err := decodeProviderSpec(req.MachineClass) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + // Call STACKIT API to get server status - server, err := p.client.GetServer(ctx, projectID, region, serverID) + server, err := p.client.GetServer(ctx, projectID, providerSpec.Region, serverID) if err != nil { // Check if server was not found (404) if errors.Is(err, ErrServerNotFound) { @@ -330,15 +338,20 @@ func (p *Provider) ListMachines(ctx context.Context, req *driver.ListMachinesReq // Extract credentials from Secret projectID := string(req.Secret.Data["project-id"]) serviceAccountKey := string(req.Secret.Data["serviceaccount.json"]) - region := string(req.Secret.Data["region"]) // Initialize client on first use (lazy initialization) if err := p.ensureClient(serviceAccountKey); err != nil { return nil, status.Error(codes.Internal, fmt.Sprintf("failed to initialize STACKIT client: %v", err)) } + // Decode ProviderSpec from MachineClass + providerSpec, err := decodeProviderSpec(req.MachineClass) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + // Call STACKIT API to list all servers - servers, err := p.client.ListServers(ctx, projectID, region) + servers, err := p.client.ListServers(ctx, projectID, providerSpec.Region) if err != nil { klog.Errorf("Failed to list servers for MachineClass %q: %v", req.MachineClass.Name, err) return nil, status.Error(codes.Internal, fmt.Sprintf("failed to list servers: %v", err)) From 6fb8f2af5c7f52bc9097a89b74ce2a97b37cb665 Mon Sep 17 00:00:00 2001 From: Felix Breuer Date: Thu, 18 Dec 2025 12:59:32 +0100 Subject: [PATCH 2/4] remove extract region function Signed-off-by: Felix Breuer --- pkg/provider/sdk_client.go | 18 ---- pkg/provider/sdk_client_test.go | 140 -------------------------------- 2 files changed, 158 deletions(-) diff --git a/pkg/provider/sdk_client.go b/pkg/provider/sdk_client.go index cb956fa7..de912584 100644 --- a/pkg/provider/sdk_client.go +++ b/pkg/provider/sdk_client.go @@ -85,24 +85,6 @@ func createIAASClient(serviceAccountKey string) (*iaas.APIClient, error) { // Pattern: <2 letters><2 digits>- var validRegionPattern = regexp.MustCompile(`^[a-z]{2}\d{2}-\d+$`) -// extractRegion extracts and validates the region from the secret data -// Region is required by STACKIT SDK v1.0.0+ -func extractRegion(secretData map[string][]byte) (string, error) { - region, ok := secretData["region"] - if !ok || len(region) == 0 { - return "", fmt.Errorf("'region' field is required in Secret (e.g., 'eu01-1')") - } - - regionStr := string(region) - - // Validate region format - if !validRegionPattern.MatchString(regionStr) { - return "", fmt.Errorf("invalid region format '%s': must match pattern '-' (e.g., 'eu01-1', 'eu01-2')", regionStr) - } - - return regionStr, nil -} - // CreateServer creates a new server via STACKIT SDK // //nolint:gocyclo//TODO:refactor diff --git a/pkg/provider/sdk_client_test.go b/pkg/provider/sdk_client_test.go index 7b0c8b19..3b1da0a8 100644 --- a/pkg/provider/sdk_client_test.go +++ b/pkg/provider/sdk_client_test.go @@ -16,146 +16,6 @@ import ( var _ = Describe("SDK Client Helpers", func() { - Describe("extractRegion", func() { - Context("with valid region", func() { - It("should extract region from secret data", func() { - secretData := map[string][]byte{ - "region": []byte("eu01-1"), - } - - region, err := extractRegion(secretData) - - Expect(err).NotTo(HaveOccurred()) - Expect(region).To(Equal("eu01-1")) - }) - - It("should extract region with different value", func() { - secretData := map[string][]byte{ - "region": []byte("eu01-2"), - } - - region, err := extractRegion(secretData) - - Expect(err).NotTo(HaveOccurred()) - Expect(region).To(Equal("eu01-2")) - }) - - It("should extract region when other fields are present", func() { - secretData := map[string][]byte{ - "projectId": []byte("11111111-2222-3333-4444-555555555555"), - "serviceAccountKey": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), - "userData": []byte("some-user-data"), - } - - region, err := extractRegion(secretData) - - Expect(err).NotTo(HaveOccurred()) - Expect(region).To(Equal("eu01-1")) - }) - }) - - Context("with missing or invalid region", func() { - It("should fail when region field is missing", func() { - secretData := map[string][]byte{ - "projectId": []byte("11111111-2222-3333-4444-555555555555"), - "serviceAccountKey": []byte(`{"credentials":{"iss":"test"}}`), - } - - _, err := extractRegion(secretData) - - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("'region' field is required")) - Expect(err.Error()).To(ContainSubstring("eu01-1")) - }) - - It("should fail when region field is empty", func() { - secretData := map[string][]byte{ - "region": []byte(""), - } - - _, err := extractRegion(secretData) - - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("'region' field is required")) - }) - - It("should fail when region field is nil bytes", func() { - secretData := map[string][]byte{ - "region": nil, - } - - _, err := extractRegion(secretData) - - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("'region' field is required")) - }) - - It("should fail when secret data is empty", func() { - secretData := map[string][]byte{} - - _, err := extractRegion(secretData) - - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("'region' field is required")) - }) - - It("should fail when secret data is nil", func() { - var secretData map[string][]byte - - _, err := extractRegion(secretData) - - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("'region' field is required")) - }) - - It("should fail when region has invalid format - missing zone", func() { - secretData := map[string][]byte{ - "region": []byte("eu01"), - } - - _, err := extractRegion(secretData) - - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("invalid region format")) - Expect(err.Error()).To(ContainSubstring("eu01")) - }) - - It("should fail when region has invalid format - wrong pattern", func() { - secretData := map[string][]byte{ - "region": []byte("invalid-region"), - } - - _, err := extractRegion(secretData) - - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("invalid region format")) - }) - - It("should fail when region has invalid format - uppercase", func() { - secretData := map[string][]byte{ - "region": []byte("EU01-1"), - } - - _, err := extractRegion(secretData) - - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("invalid region format")) - }) - - It("should fail when region has invalid format - extra characters", func() { - secretData := map[string][]byte{ - "region": []byte("eu01-1-extra"), - } - - _, err := extractRegion(secretData) - - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("invalid region format")) - }) - }) - }) - Describe("getStringValue", func() { Context("with valid pointer", func() { It("should return string value", func() { From 00a9a7ea7b4f48f7293ecd9c4c236d45674d3f4c Mon Sep 17 00:00:00 2001 From: Felix Breuer Date: Thu, 18 Dec 2025 14:11:27 +0100 Subject: [PATCH 3/4] fix lint --- pkg/provider/sdk_client.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pkg/provider/sdk_client.go b/pkg/provider/sdk_client.go index de912584..167cb05c 100644 --- a/pkg/provider/sdk_client.go +++ b/pkg/provider/sdk_client.go @@ -9,7 +9,6 @@ import ( "errors" "fmt" "os" - "regexp" "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" @@ -81,10 +80,6 @@ func createIAASClient(serviceAccountKey string) (*iaas.APIClient, error) { return iaasClient, nil } -// validRegionPattern matches STACKIT region formats like "eu01-1", "eu01-2" -// Pattern: <2 letters><2 digits>- -var validRegionPattern = regexp.MustCompile(`^[a-z]{2}\d{2}-\d+$`) - // CreateServer creates a new server via STACKIT SDK // //nolint:gocyclo//TODO:refactor From 8891a2dc577bff02efefb20451c60b67f0e9bead Mon Sep 17 00:00:00 2001 From: Felix Breuer Date: Thu, 18 Dec 2025 14:31:58 +0100 Subject: [PATCH 4/4] fix tests Signed-off-by: Felix Breuer --- hack/test.sh | 2 +- .../validation/validation_core_labels_test.go | 2 +- .../apis/validation/validation_fields_test.go | 47 +++++++++++++++++-- .../validation/validation_networking_test.go | 2 +- .../validation/validation_secgroup_test.go | 2 +- .../apis/validation/validation_secret_test.go | 2 +- .../validation/validation_volumes_test.go | 2 +- .../core_create_machine_basic_test.go | 2 +- .../core_create_machine_config_test.go | 8 +++- .../core_create_machine_networking_test.go | 7 ++- .../core_create_machine_storage_test.go | 6 ++- .../core_create_machine_userdata_test.go | 4 +- pkg/provider/core_delete_machine_test.go | 2 +- pkg/provider/core_get_machine_status_test.go | 2 +- pkg/provider/core_list_machines_test.go | 1 + 15 files changed, 75 insertions(+), 16 deletions(-) diff --git a/hack/test.sh b/hack/test.sh index 10c78774..1dbca712 100755 --- a/hack/test.sh +++ b/hack/test.sh @@ -24,4 +24,4 @@ else timeout_flag="-timeout=2m" fi -go test ${timeout_flag:+"$timeout_flag"} "$@" "${test_flags[@]}" +go test ${timeout_flag:+"$timeout_flag"} "$@" ${test_flags:+"${test_flags[@]}"} \ No newline at end of file diff --git a/pkg/provider/apis/validation/validation_core_labels_test.go b/pkg/provider/apis/validation/validation_core_labels_test.go index 9e0581dc..2e59f1bc 100644 --- a/pkg/provider/apis/validation/validation_core_labels_test.go +++ b/pkg/provider/apis/validation/validation_core_labels_test.go @@ -23,12 +23,12 @@ var _ = Describe("ValidateProviderSpecNSecret", func() { providerSpec = &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "550e8400-e29b-41d4-a716-446655440000", + Region: "eu01", } secret = &corev1.Secret{ Data: map[string][]byte{ "project-id": []byte("11111111-2222-3333-4444-555555555555"), "serviceaccount.json": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), }, } }) diff --git a/pkg/provider/apis/validation/validation_fields_test.go b/pkg/provider/apis/validation/validation_fields_test.go index 507c670e..7ceb3aba 100644 --- a/pkg/provider/apis/validation/validation_fields_test.go +++ b/pkg/provider/apis/validation/validation_fields_test.go @@ -23,12 +23,12 @@ var _ = Describe("ValidateProviderSpecNSecret", func() { providerSpec = &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "550e8400-e29b-41d4-a716-446655440000", + Region: "eu01", } secret = &corev1.Secret{ Data: map[string][]byte{ "project-id": []byte("11111111-2222-3333-4444-555555555555"), "serviceaccount.json": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), }, } }) @@ -70,6 +70,47 @@ var _ = Describe("ValidateProviderSpecNSecret", func() { }) }) + Context("Region validation", func() { + It("should succeed with valid region", func() { + providerSpec.Region = "eu01" + errors := ValidateProviderSpecNSecret(providerSpec, secret) + Expect(errors).To(BeEmpty()) + }) + + It("should fail when region is empty", func() { + providerSpec.Region = "" + errors := ValidateProviderSpecNSecret(providerSpec, secret) + Expect(errors[0].Error()).To(ContainSubstring("Region cannot be empty")) + }) + + It("should succeed with various region formats", func() { + testCases := []string{ + "eu01", + "eu02", + "eu10", + "us02", + } + for _, r := range testCases { + providerSpec.Region = r + errors := ValidateProviderSpecNSecret(providerSpec, secret) + Expect(errors).To(BeEmpty(), "Region %q should be valid", r) + } + }) + + It("should fail with various region formats", func() { + testCases := []string{ + "eu01-1", + "eu02-b", + "us-east-01", + } + for _, r := range testCases { + providerSpec.Region = r + errors := ValidateProviderSpecNSecret(providerSpec, secret) + Expect(errors[0].Error()).To(ContainSubstring("Region has invalid format")) + } + }) + }) + Context("AvailabilityZone validation", func() { It("should succeed with valid availabilityZone", func() { providerSpec.AvailabilityZone = "eu01-1" @@ -87,8 +128,8 @@ var _ = Describe("ValidateProviderSpecNSecret", func() { testCases := []string{ "eu01-1", "eu01-2", - "us-west-1a", - "zone-1", + "eu02-1", + "eu02-4", } for _, az := range testCases { providerSpec.AvailabilityZone = az diff --git a/pkg/provider/apis/validation/validation_networking_test.go b/pkg/provider/apis/validation/validation_networking_test.go index de63df49..beb22110 100644 --- a/pkg/provider/apis/validation/validation_networking_test.go +++ b/pkg/provider/apis/validation/validation_networking_test.go @@ -23,12 +23,12 @@ var _ = Describe("ValidateProviderSpecNSecret", func() { providerSpec = &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "550e8400-e29b-41d4-a716-446655440000", + Region: "eu01", } secret = &corev1.Secret{ Data: map[string][]byte{ "project-id": []byte("11111111-2222-3333-4444-555555555555"), "serviceaccount.json": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), }, } }) diff --git a/pkg/provider/apis/validation/validation_secgroup_test.go b/pkg/provider/apis/validation/validation_secgroup_test.go index be879ff7..5477366b 100644 --- a/pkg/provider/apis/validation/validation_secgroup_test.go +++ b/pkg/provider/apis/validation/validation_secgroup_test.go @@ -23,12 +23,12 @@ var _ = Describe("ValidateProviderSpecNSecret", func() { providerSpec = &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "550e8400-e29b-41d4-a716-446655440000", + Region: "eu01", } secret = &corev1.Secret{ Data: map[string][]byte{ "project-id": []byte("11111111-2222-3333-4444-555555555555"), "serviceaccount.json": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), }, } }) diff --git a/pkg/provider/apis/validation/validation_secret_test.go b/pkg/provider/apis/validation/validation_secret_test.go index 0025a922..89cb9773 100644 --- a/pkg/provider/apis/validation/validation_secret_test.go +++ b/pkg/provider/apis/validation/validation_secret_test.go @@ -23,12 +23,12 @@ var _ = Describe("ValidateProviderSpecNSecret", func() { providerSpec = &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "550e8400-e29b-41d4-a716-446655440000", + Region: "eu01", } secret = &corev1.Secret{ Data: map[string][]byte{ "project-id": []byte("11111111-2222-3333-4444-555555555555"), "serviceaccount.json": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), }, } }) diff --git a/pkg/provider/apis/validation/validation_volumes_test.go b/pkg/provider/apis/validation/validation_volumes_test.go index b0ce8bea..4576c4be 100644 --- a/pkg/provider/apis/validation/validation_volumes_test.go +++ b/pkg/provider/apis/validation/validation_volumes_test.go @@ -23,12 +23,12 @@ var _ = Describe("ValidateProviderSpecNSecret", func() { providerSpec = &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "550e8400-e29b-41d4-a716-446655440000", + Region: "eu01", } secret = &corev1.Secret{ Data: map[string][]byte{ "project-id": []byte("11111111-2222-3333-4444-555555555555"), "serviceaccount.json": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), }, } }) diff --git a/pkg/provider/core_create_machine_basic_test.go b/pkg/provider/core_create_machine_basic_test.go index 59b4fd4f..95e40eda 100644 --- a/pkg/provider/core_create_machine_basic_test.go +++ b/pkg/provider/core_create_machine_basic_test.go @@ -43,7 +43,6 @@ var _ = Describe("CreateMachine", func() { Data: map[string][]byte{ "project-id": []byte("11111111-2222-3333-4444-555555555555"), "serviceaccount.json": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), "networkId": []byte("770e8400-e29b-41d4-a716-446655440000"), }, } @@ -52,6 +51,7 @@ var _ = Describe("CreateMachine", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", } providerSpecRaw, _ := encodeProviderSpec(providerSpec) diff --git a/pkg/provider/core_create_machine_config_test.go b/pkg/provider/core_create_machine_config_test.go index bfcb33b2..1b57bb03 100644 --- a/pkg/provider/core_create_machine_config_test.go +++ b/pkg/provider/core_create_machine_config_test.go @@ -40,7 +40,6 @@ var _ = Describe("CreateMachine", func() { Data: map[string][]byte{ "project-id": []byte("11111111-2222-3333-4444-555555555555"), "serviceaccount.json": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), "networkId": []byte("770e8400-e29b-41d4-a716-446655440000"), }, } @@ -49,6 +48,7 @@ var _ = Describe("CreateMachine", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", } providerSpecRaw, _ := encodeProviderSpec(providerSpec) @@ -82,6 +82,7 @@ var _ = Describe("CreateMachine", func() { It("should pass KeypairName to API when specified", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", + Region: "eu01", ImageID: "12345678-1234-1234-1234-123456789abc", KeypairName: "my-ssh-key", } @@ -129,6 +130,7 @@ var _ = Describe("CreateMachine", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", AvailabilityZone: "eu01-1", } providerSpecRaw, _ := encodeProviderSpec(providerSpec) @@ -174,6 +176,7 @@ var _ = Describe("CreateMachine", func() { It("should pass AffinityGroup to API when specified", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", + Region: "eu01", ImageID: "12345678-1234-1234-1234-123456789abc", AffinityGroup: "880e8400-e29b-41d4-a716-446655440000", } @@ -218,6 +221,7 @@ var _ = Describe("CreateMachine", func() { It("should pass ServiceAccountMails to API when specified", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", + Region: "eu01", ImageID: "12345678-1234-1234-1234-123456789abc", ServiceAccountMails: []string{ "my-service@sa.stackit.cloud", @@ -268,6 +272,7 @@ var _ = Describe("CreateMachine", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", Agent: &api.AgentSpec{ Provisioned: &provisioned, }, @@ -314,6 +319,7 @@ var _ = Describe("CreateMachine", func() { It("should pass Metadata to API when specified", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", + Region: "eu01", ImageID: "12345678-1234-1234-1234-123456789abc", Metadata: map[string]interface{}{ "environment": "production", diff --git a/pkg/provider/core_create_machine_networking_test.go b/pkg/provider/core_create_machine_networking_test.go index 5606ddc2..6d5952cd 100644 --- a/pkg/provider/core_create_machine_networking_test.go +++ b/pkg/provider/core_create_machine_networking_test.go @@ -40,7 +40,6 @@ var _ = Describe("CreateMachine - Networking", func() { Data: map[string][]byte{ "project-id": []byte("11111111-2222-3333-4444-555555555555"), "serviceaccount.json": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), }, } @@ -57,6 +56,7 @@ var _ = Describe("CreateMachine - Networking", func() { It("should use networkId from ProviderSpec", func() { providerSpec := &api.ProviderSpec{ MachineType: "c1.2", + Region: "eu01", ImageID: "12345678-1234-1234-1234-123456789abc", Networking: &api.NetworkingSpec{ NetworkID: "770e8400-e29b-41d4-a716-446655440000", @@ -100,6 +100,7 @@ var _ = Describe("CreateMachine - Networking", func() { It("should use nicIds from ProviderSpec", func() { providerSpec := &api.ProviderSpec{ MachineType: "c1.2", + Region: "eu01", ImageID: "12345678-1234-1234-1234-123456789abc", Networking: &api.NetworkingSpec{ NICIDs: []string{ @@ -154,6 +155,7 @@ var _ = Describe("CreateMachine - Networking", func() { providerSpec := &api.ProviderSpec{ MachineType: "c1.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", // Networking is nil - should fall back to Secret } providerSpecRaw, _ := encodeProviderSpec(providerSpec) @@ -195,6 +197,7 @@ var _ = Describe("CreateMachine - Networking", func() { providerSpec := &api.ProviderSpec{ MachineType: "c1.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", // Networking is nil } providerSpecRaw, _ := encodeProviderSpec(providerSpec) @@ -241,6 +244,7 @@ var _ = Describe("CreateMachine - Networking", func() { providerSpec := &api.ProviderSpec{ MachineType: "c1.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", Networking: &api.NetworkingSpec{ NetworkID: "990e8400-e29b-41d4-a716-446655440002", }, @@ -287,6 +291,7 @@ var _ = Describe("CreateMachine - Networking", func() { providerSpec := &api.ProviderSpec{ MachineType: "c1.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", Networking: &api.NetworkingSpec{ // Both NetworkID and NICIDs are empty - should fail validation }, diff --git a/pkg/provider/core_create_machine_storage_test.go b/pkg/provider/core_create_machine_storage_test.go index 2b4d0438..aaaee5ac 100644 --- a/pkg/provider/core_create_machine_storage_test.go +++ b/pkg/provider/core_create_machine_storage_test.go @@ -40,7 +40,6 @@ var _ = Describe("CreateMachine", func() { Data: map[string][]byte{ "project-id": []byte("11111111-2222-3333-4444-555555555555"), "serviceaccount.json": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), "networkId": []byte("770e8400-e29b-41d4-a716-446655440000"), }, } @@ -49,6 +48,7 @@ var _ = Describe("CreateMachine", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", } providerSpecRaw, _ := encodeProviderSpec(providerSpec) @@ -84,6 +84,7 @@ var _ = Describe("CreateMachine", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", BootVolume: &api.BootVolumeSpec{ DeleteOnTermination: &deleteOnTermination, PerformanceClass: "premium", @@ -124,6 +125,7 @@ var _ = Describe("CreateMachine", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", BootVolume: &api.BootVolumeSpec{ Size: 50, }, @@ -153,6 +155,7 @@ var _ = Describe("CreateMachine", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", Volumes: []string{ "550e8400-e29b-41d4-a716-446655440000", "660e8400-e29b-41d4-a716-446655440001", @@ -185,6 +188,7 @@ var _ = Describe("CreateMachine", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", BootVolume: &api.BootVolumeSpec{ Size: 50, }, diff --git a/pkg/provider/core_create_machine_userdata_test.go b/pkg/provider/core_create_machine_userdata_test.go index 75935ebe..049ada46 100644 --- a/pkg/provider/core_create_machine_userdata_test.go +++ b/pkg/provider/core_create_machine_userdata_test.go @@ -41,7 +41,6 @@ var _ = Describe("CreateMachine", func() { Data: map[string][]byte{ "project-id": []byte("11111111-2222-3333-4444-555555555555"), "serviceaccount.json": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), "networkId": []byte("770e8400-e29b-41d4-a716-446655440000"), }, } @@ -50,6 +49,7 @@ var _ = Describe("CreateMachine", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", + Region: "eu01", } providerSpecRaw, _ := encodeProviderSpec(providerSpec) @@ -85,6 +85,7 @@ var _ = Describe("CreateMachine", func() { MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", UserData: "#cloud-config\nruncmd:\n - echo 'Hello from ProviderSpec'", + Region: "eu01", } providerSpecRaw, _ := encodeProviderSpec(providerSpec) req.MachineClass.ProviderSpec.Raw = providerSpecRaw @@ -133,6 +134,7 @@ var _ = Describe("CreateMachine", func() { MachineType: "c2i.2", ImageID: "12345678-1234-1234-1234-123456789abc", UserData: "#cloud-config from ProviderSpec", + Region: "eu01", } providerSpecRaw, _ := encodeProviderSpec(providerSpec) req.MachineClass.ProviderSpec.Raw = providerSpecRaw diff --git a/pkg/provider/core_delete_machine_test.go b/pkg/provider/core_delete_machine_test.go index 29d9f885..da9684d4 100644 --- a/pkg/provider/core_delete_machine_test.go +++ b/pkg/provider/core_delete_machine_test.go @@ -43,7 +43,6 @@ var _ = Describe("DeleteMachine", func() { Data: map[string][]byte{ "projectId": []byte("11111111-2222-3333-4444-555555555555"), "serviceAccountKey": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), "networkId": []byte("770e8400-e29b-41d4-a716-446655440000"), }, } @@ -52,6 +51,7 @@ var _ = Describe("DeleteMachine", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "image-uuid-123", + Region: "eu01", } providerSpecRaw, _ := encodeProviderSpec(providerSpec) diff --git a/pkg/provider/core_get_machine_status_test.go b/pkg/provider/core_get_machine_status_test.go index 573058cd..c70a46a0 100644 --- a/pkg/provider/core_get_machine_status_test.go +++ b/pkg/provider/core_get_machine_status_test.go @@ -43,7 +43,6 @@ var _ = Describe("GetMachineStatus", func() { Data: map[string][]byte{ "projectId": []byte("11111111-2222-3333-4444-555555555555"), "serviceAccountKey": []byte(`{"credentials":{"iss":"test"}}`), - "region": []byte("eu01-1"), "networkId": []byte("770e8400-e29b-41d4-a716-446655440000"), }, } @@ -52,6 +51,7 @@ var _ = Describe("GetMachineStatus", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "image-uuid-123", + Region: "eu01", } providerSpecRaw, _ := encodeProviderSpec(providerSpec) diff --git a/pkg/provider/core_list_machines_test.go b/pkg/provider/core_list_machines_test.go index b2196583..5732ea31 100644 --- a/pkg/provider/core_list_machines_test.go +++ b/pkg/provider/core_list_machines_test.go @@ -49,6 +49,7 @@ var _ = Describe("ListMachines", func() { providerSpec := &api.ProviderSpec{ MachineType: "c2i.2", ImageID: "image-uuid-123", + Region: "eu01", } providerSpecRaw, _ := encodeProviderSpec(providerSpec)