diff --git a/chart/compass/charts/external-services-mock/templates/deployment.yaml b/chart/compass/charts/external-services-mock/templates/deployment.yaml index b0d6e3d0ad..82c362caba 100644 --- a/chart/compass/charts/external-services-mock/templates/deployment.yaml +++ b/chart/compass/charts/external-services-mock/templates/deployment.yaml @@ -87,6 +87,8 @@ spec: value: "{{ (index .Values.global.tenants 40).id }}" - name: APP_ON_DEMAND_TENANT value: {{ .Values.global.tests.tenantFetcher.missingTenantOnDemandID }} + - name: APP_TENANT_REGION + value: {{ .Values.global.tests.tenantFetcher.tenantRegion }} - name: APP_CA_CERT valueFrom: secretKeyRef: diff --git a/chart/compass/templates/tests/tenant-fetcher/tenant-fetcher-test.yaml b/chart/compass/templates/tests/tenant-fetcher/tenant-fetcher-test.yaml index 33a56ec4a0..13d4167b84 100644 --- a/chart/compass/templates/tests/tenant-fetcher/tenant-fetcher-test.yaml +++ b/chart/compass/templates/tests/tenant-fetcher/tenant-fetcher-test.yaml @@ -109,6 +109,10 @@ spec: value: {{ .Values.global.tests.selfRegistration.region }} - name: APP_ON_DEMAND_TENANT value: {{ .Values.global.tests.tenantFetcher.missingTenantOnDemandID }} + - name: APP_TENANT_REGION + value: {{ .Values.global.tests.tenantFetcher.tenantRegion }} + - name: APP_TENANT_REGION_PREFIX + value: {{ .Values.global.tests.tenantFetcher.tenantRegionPrefix }} restartPolicy: Never --- apiVersion: v1 diff --git a/chart/compass/values.yaml b/chart/compass/values.yaml index 09c924f515..01e76a7ad8 100644 --- a/chart/compass/values.yaml +++ b/chart/compass/values.yaml @@ -173,8 +173,8 @@ global: version: "v20240301-97563d8f" name: compass-pairing-adapter director: - dir: prod/incubator/ - version: "v20240301-1a4c377a" + dir: dev/incubator/ + version: "PR-3706" name: compass-director hydrator: dir: prod/incubator/ @@ -222,16 +222,16 @@ global: dir: version: "0a651695" external_services_mock: - dir: prod/incubator/ - version: "v20240228-bbf7843b" + dir: dev/incubator/ + version: "PR-3706" name: compass-external-services-mock console: dir: prod/incubator/ version: "v20230421-e8840c18" name: compass-console e2e_tests: - dir: prod/incubator/ - version: "v20240229-e395d039" + dir: dev/incubator/ + version: "PR-3706" name: compass-e2e-tests isLocalEnv: false isForTesting: false @@ -1310,6 +1310,8 @@ global: tenantFetcher: tenantOnDemandID: "8d42d818-d4c4-4036-b82f-b199db7ffeb5" missingTenantOnDemandID: "subaccount-external-tnt" + tenantRegion: "us-1" + tenantRegionPrefix: "cf-" region: "eu-1" region2: "eu-2" ordAggregator: diff --git a/components/director/internal/tenantfetchersvc/resync/synchronizer.go b/components/director/internal/tenantfetchersvc/resync/synchronizer.go index 37c7beebfc..c07f2bb5a4 100644 --- a/components/director/internal/tenantfetchersvc/resync/synchronizer.go +++ b/components/director/internal/tenantfetchersvc/resync/synchronizer.go @@ -243,9 +243,10 @@ func (ts *TenantsSynchronizer) SynchronizeTenant(ctx context.Context, parentTena return ts.creator.CreateTenants(ctx, []model.BusinessTenantMappingInput{fetchedTenant}) } - for _, fetchedTenant := range fetchedTenants { + for idx := range fetchedTenants { + fetchedTenant := fetchedTenants[idx] if fetchedTenant.Region != "" { - fetchedTenant.Region = ts.config.RegionPrefix + fetchedTenant.Region + fetchedTenants[idx].Region = ts.config.RegionPrefix + fetchedTenant.Region } if len(fetchedTenant.Parents) == 0 && fetchedTenant.Type != string(tenant.CostObject) { diff --git a/components/director/internal/tenantfetchersvc/resync/synchronizer_test.go b/components/director/internal/tenantfetchersvc/resync/synchronizer_test.go index 6d05d28066..bd7527568d 100644 --- a/components/director/internal/tenantfetchersvc/resync/synchronizer_test.go +++ b/components/director/internal/tenantfetchersvc/resync/synchronizer_test.go @@ -510,6 +510,7 @@ func TestTenantsSynchronizer_SynchronizeTenant(t *testing.T) { jobCfg := resync.JobConfig{ TenantProvider: resync.TenantOnDemandProvider, + RegionPrefix: "cf-", } newSubaccountTenant := model.BusinessTenantMappingInput{ExternalTenant: newTenantID, Parents: []string{parentTenantID}, Region: region, Type: string(tenant.Subaccount)} @@ -539,6 +540,7 @@ func TestTenantsSynchronizer_SynchronizeTenant(t *testing.T) { svc := &automock.TenantCreator{} tenantWithExistingParent := newSubaccountTenant tenantWithExistingParent.Parents = []string{parentTenantID} + tenantWithExistingParent.Region = jobCfg.RegionPrefix + tenantWithExistingParent.Region svc.On("FetchTenants", ctx, newTenantID).Return([]model.BusinessTenantMappingInput{newSubaccountTenant}, nil) svc.On("CreateTenants", ctx, []model.BusinessTenantMappingInput{tenantWithExistingParent}).Return(nil) return svc diff --git a/components/director/internal/tenantfetchersvc/resync/tenant_manager.go b/components/director/internal/tenantfetchersvc/resync/tenant_manager.go index 2174ccb530..8d4baaa631 100644 --- a/components/director/internal/tenantfetchersvc/resync/tenant_manager.go +++ b/components/director/internal/tenantfetchersvc/resync/tenant_manager.go @@ -151,10 +151,11 @@ func (tm *TenantsManager) FetchTenants(ctx context.Context, externalTenantID str return } - for _, tnt := range createdRegionalTenants { + for idx := range createdRegionalTenants { + tnt := createdRegionalTenants[idx] log.C(ctx).Infof("Tenant %q found in region %s", tnt.ExternalTenant, region) if tnt.Region == "" { - tnt.Region = region + createdRegionalTenants[idx].Region = region } } diff --git a/components/director/internal/tenantfetchersvc/resync/tenant_manager_test.go b/components/director/internal/tenantfetchersvc/resync/tenant_manager_test.go index d92d52ba3b..1c3a8b06ac 100644 --- a/components/director/internal/tenantfetchersvc/resync/tenant_manager_test.go +++ b/components/director/internal/tenantfetchersvc/resync/tenant_manager_test.go @@ -738,6 +738,8 @@ func TestTenantManager_FetchTenant(t *testing.T) { busTenant := fixBusinessTenantMappingInputWithCostObjectID("1", provider, "subdomain-1", region, "", tenant.Subaccount, &testLicenseType, &costObjectID) costObjTenant := fixBusinessTenantMappingInputWithCostObjectType("id-here", provider, "", "", "", tenant.CostObject, &testLicenseType, &costObjectType) costObjTenant.Parents = []string{} + regionalCostObjTenant := fixBusinessTenantMappingInputWithCostObjectType("id-here", provider, "", centralRegion, "", tenant.CostObject, &testLicenseType, &costObjectType) + regionalCostObjTenant.Parents = []string{} event := fixEvent(t, "Subaccount", busTenant.Parents[0], eventFieldsFromTenant(tenant.Subaccount, jobConfig.APIConfig.TenantFieldMapping, busTenant, eventAdditionalFields)) @@ -804,7 +806,7 @@ func TestTenantManager_FetchTenant(t *testing.T) { return details, []*automock.EventAPIClient{client} }, - expectedTenant: []model.BusinessTenantMappingInput{busTenant, costObjTenant}, + expectedTenant: []model.BusinessTenantMappingInput{busTenant, regionalCostObjTenant}, }, { name: "[Temporary] Success when tenant is not found", diff --git a/components/director/internal/tenantfetchersvc/resync/types.go b/components/director/internal/tenantfetchersvc/resync/types.go index 1feba055b6..ae41ca86fe 100644 --- a/components/director/internal/tenantfetchersvc/resync/types.go +++ b/components/director/internal/tenantfetchersvc/resync/types.go @@ -19,7 +19,7 @@ type TenantFieldMapping struct { DiscriminatorField string `envconfig:"MAPPING_FIELD_DISCRIMINATOR"` DiscriminatorValue string `envconfig:"MAPPING_VALUE_DISCRIMINATOR"` - RegionField string `envconfig:"MAPPING_FIELD_REGION" default:"APP_MAPPING_FIELD_REGION"` + RegionField string `envconfig:"MAPPING_FIELD_REGION" default:"region"` EntityIDField string `envconfig:"MAPPING_FIELD_ENTITY_ID" default:"entityId"` EntityTypeField string `envconfig:"MAPPING_FIELD_ENTITY_TYPE" default:"entityType"` LicenseTypeField string `envconfig:"MAPPING_FIELD_LICENSE_TYPE" default:"licenseType"` diff --git a/components/external-services-mock/cmd/main.go b/components/external-services-mock/cmd/main.go index da54951a1a..f934ce22fb 100755 --- a/components/external-services-mock/cmd/main.go +++ b/components/external-services-mock/cmd/main.go @@ -83,6 +83,7 @@ type config struct { TrustedTenant string `envconfig:"APP_TRUSTED_TENANT"` TrustedNewGA string `envconfig:"APP_TRUSTED_NEW_GA"` OnDemandTenant string `envconfig:"APP_ON_DEMAND_TENANT"` + TenantRegion string `envconfig:"APP_TENANT_REGION"` KeyLoaderConfig credloader.KeysConfig @@ -306,7 +307,7 @@ func initDefaultServer(cfg config, keyCache credloader.KeysCache, key *rsa.Priva // Tenant fetcher handlers allowedSubaccounts := []string{cfg.OnDemandTenant, cfg.TenantConfig.TestTenantOnDemandID} - tenantFetcherHandler := tenantfetcher.NewHandler(allowedSubaccounts, cfg.DefaultTenant, cfg.DefaultCustomerTenant) + tenantFetcherHandler := tenantfetcher.NewHandler(allowedSubaccounts, cfg.DefaultTenant, cfg.DefaultCustomerTenant, cfg.TenantRegion) router.Methods(http.MethodPost).PathPrefix("/tenant-fetcher/global-account-create/configure").HandlerFunc(tenantFetcherHandler.HandleConfigure(tenantfetcher.AccountCreationEventType)) router.Methods(http.MethodDelete).PathPrefix("/tenant-fetcher/global-account-create/reset").HandlerFunc(tenantFetcherHandler.HandleReset(tenantfetcher.AccountCreationEventType)) diff --git a/components/external-services-mock/internal/tenantfetcher/handler.go b/components/external-services-mock/internal/tenantfetcher/handler.go index 77608a048f..d092d93ad1 100644 --- a/components/external-services-mock/internal/tenantfetcher/handler.go +++ b/components/external-services-mock/internal/tenantfetcher/handler.go @@ -31,15 +31,17 @@ type Handler struct { allowedTenantOnDemandIDs []string defaultTenantID string defaultCustomerTenantID string + tenantRegion string } -func NewHandler(allowedTenantOnDemandIDs []string, defaultTenantID, defaultCustomerTenantID string) *Handler { +func NewHandler(allowedTenantOnDemandIDs []string, defaultTenantID, defaultCustomerTenantID, tenantRegion string) *Handler { return &Handler{ mutex: sync.Mutex{}, mockedEvents: make(map[string][][]byte), allowedTenantOnDemandIDs: allowedTenantOnDemandIDs, defaultTenantID: defaultTenantID, defaultCustomerTenantID: defaultCustomerTenantID, + tenantRegion: tenantRegion, } } @@ -146,7 +148,7 @@ func (s *Handler) getMockEventForSubaccount(tenantOnDemandID string) []byte { }` if slices.Contains(s.allowedTenantOnDemandIDs, tenantOnDemandID) { - mockedEvent := fmt.Sprintf(mockSubaccountEventPattern, tenantOnDemandID, "Subaccount on demand", "subdomain", "LICENSETYPE", s.defaultTenantID, "region", s.defaultCustomerTenantID, s.defaultTenantID) + mockedEvent := fmt.Sprintf(mockSubaccountEventPattern, tenantOnDemandID, "Subaccount on demand", "subdomain", "LICENSETYPE", s.defaultTenantID, s.tenantRegion, s.defaultCustomerTenantID, s.defaultTenantID) return []byte(mockedEvent) } return []byte(emptyTenantProviderResponse) diff --git a/installation/resources/compass-overrides-local.yaml b/installation/resources/compass-overrides-local.yaml index 56e5cc741c..d3e5f842f9 100644 --- a/installation/resources/compass-overrides-local.yaml +++ b/installation/resources/compass-overrides-local.yaml @@ -190,6 +190,7 @@ global: enabled: true api: regionName: "central" + regionPrefix: "cf-" authConfigSecretKey: "central" endpoints: subaccountCreated: "http://compass-external-services-mock.compass-system.svc.cluster.local:8080/tenant-fetcher/subaccount-create" @@ -210,6 +211,7 @@ global: labelsField: "labels" subaccountCostObjectIDField: "costObjectId" subaccountCostObjectTypeField: "costObjectType" + regionField: "region" kubernetes: configMapNamespace: "compass-system" pollInterval: "2s" diff --git a/tests/tenant-fetcher/tests/handler_test.go b/tests/tenant-fetcher/tests/handler_test.go index f106ce6d58..dc27904849 100644 --- a/tests/tenant-fetcher/tests/handler_test.go +++ b/tests/tenant-fetcher/tests/handler_test.go @@ -1318,10 +1318,13 @@ func TestGetSubaccountOnDemandIfMissing(t *testing.T) { t.Logf("Retrieving tenant %q by external id", subaccountExternalTenant) subaccount, err := fixtures.GetTenantByExternalID(certSecuredGraphQLClient, subaccountExternalTenant) + region, regionExists := subaccount.Labels[tenantfetcher.RegionKey] require.NoError(t, err) require.NotNil(t, subaccount) require.Equal(t, subaccount.ID, subaccountExternalTenant) + require.True(t, regionExists) + require.Equal(t, region, config.TenantRegionPrefix+config.TenantRegion) t.Log("TestGetSubaccountOnDemandIfMissing checks are successful") } diff --git a/tests/tenant-fetcher/tests/main_test.go b/tests/tenant-fetcher/tests/main_test.go index afa8d7afe8..b8416af3db 100644 --- a/tests/tenant-fetcher/tests/main_test.go +++ b/tests/tenant-fetcher/tests/main_test.go @@ -50,7 +50,10 @@ type testConfig struct { CertLoaderConfig credloader.CertConfig ExternalClientCertSecretName string `envconfig:"APP_EXTERNAL_CLIENT_CERT_SECRET_NAME"` OnDemandTenant string `envconfig:"APP_ON_DEMAND_TENANT"` - GatewayOauth string `envconfig:"APP_GATEWAY_OAUTH"` + TenantRegion string `envconfig:"APP_TENANT_REGION"` + TenantRegionPrefix string `envconfig:"APP_TENANT_REGION_PREFIX"` + + GatewayOauth string `envconfig:"APP_GATEWAY_OAUTH"` } type TenantProviderConfig struct {