diff --git a/pkg/recipes/configloader/environment.go b/pkg/recipes/configloader/environment.go index 3da4c7c132..5731b2e3a4 100644 --- a/pkg/recipes/configloader/environment.go +++ b/pkg/recipes/configloader/environment.go @@ -163,8 +163,12 @@ func getConfigurationV20250801(environment *v20250801preview.EnvironmentResource envDatamodel := env.(*datamodel.Environment_v20250801preview) if envDatamodel.Properties.Providers != nil { if envDatamodel.Properties.Providers.Azure != nil { + scope := "/subscriptions/" + envDatamodel.Properties.Providers.Azure.SubscriptionId + if envDatamodel.Properties.Providers.Azure.ResourceGroupName != "" { + scope += "/resourceGroups/" + envDatamodel.Properties.Providers.Azure.ResourceGroupName + } config.Providers.Azure = datamodel.ProvidersAzure{ - Scope: envDatamodel.Properties.Providers.Azure.SubscriptionId, + Scope: scope, } } if envDatamodel.Properties.Providers.AWS != nil { diff --git a/pkg/recipes/configloader/environment_test.go b/pkg/recipes/configloader/environment_test.go index 7a3da020e9..dbdf7d7066 100644 --- a/pkg/recipes/configloader/environment_test.go +++ b/pkg/recipes/configloader/environment_test.go @@ -399,7 +399,7 @@ func TestGetConfigurationV20250801(t *testing.T) { errString string }{ { - name: "azure provider with env resource v20250801", + name: "azure provider with subscription only v20250801", envResource: &modelv20250801.EnvironmentResource{ Properties: &modelv20250801.EnvironmentProperties{ Providers: &modelv20250801.Providers{ @@ -423,7 +423,39 @@ func TestGetConfigurationV20250801(t *testing.T) { }, Providers: datamodel.Providers{ Azure: datamodel.ProvidersAzure{ - Scope: "test-subscription-id", + Scope: "/subscriptions/test-subscription-id", + }, + }, + Simulated: false, + }, + }, + { + name: "azure provider with subscription and resource group v20250801", + envResource: &modelv20250801.EnvironmentResource{ + Properties: &modelv20250801.EnvironmentProperties{ + Providers: &modelv20250801.Providers{ + Azure: &modelv20250801.ProvidersAzure{ + SubscriptionID: to.Ptr("85716382-aaaa-aaaa-aaaa-2126e459a123"), + ResourceGroupName: to.Ptr("my-resource-group"), + }, + Kubernetes: &modelv20250801.ProvidersKubernetes{ + Namespace: to.Ptr(envNamespace), + }, + }, + Simulated: to.Ptr(false), + }, + }, + appResource: nil, + expectedConfig: &recipes.Configuration{ + Runtime: recipes.RuntimeConfiguration{ + Kubernetes: &recipes.KubernetesRuntime{ + Namespace: envNamespace, + EnvironmentNamespace: envNamespace, + }, + }, + Providers: datamodel.Providers{ + Azure: datamodel.ProvidersAzure{ + Scope: "/subscriptions/85716382-aaaa-aaaa-aaaa-2126e459a123/resourceGroups/my-resource-group", }, }, Simulated: false, diff --git a/pkg/recipes/recipecontext/context_test.go b/pkg/recipes/recipecontext/context_test.go index 8441e696c7..3002daacda 100644 --- a/pkg/recipes/recipecontext/context_test.go +++ b/pkg/recipes/recipecontext/context_test.go @@ -383,3 +383,76 @@ func TestNewContext_WithConnectedResources(t *testing.T) { "port": 6379, }, cacheConn.Properties) } + +func TestNewContext_AzureProviderWithResourceGroup(t *testing.T) { + // This test verifies the fix for the issue where Azure provider config + // with separate subscriptionId and resourceGroupName fields should construct + // the full Azure resource ID path correctly + testMetadata := &recipes.ResourceMetadata{ + ResourceID: "/planes/radius/local/resourceGroups/testGroup/providers/applications.datastores/mongodatabases/mongo0", + EnvironmentID: "/planes/radius/local/resourceGroups/test-group/providers/Applications.Core/environments/env0", + ApplicationID: "/planes/radius/local/resourceGroups/test-group/providers/Applications.Core/applications/testApplication", + Properties: map[string]any{ + "throughput": 100, + }, + } + + testConfig := &recipes.Configuration{ + Runtime: recipes.RuntimeConfiguration{ + Kubernetes: &recipes.KubernetesRuntime{ + Namespace: "radius-test-app", + EnvironmentNamespace: "radius-test-env", + }, + }, + Providers: coredm.Providers{ + Azure: coredm.ProvidersAzure{ + Scope: "/subscriptions/85716382-aaaa-aaaa-aaaa-2126e459a123/resourceGroups/my-resource-group", + }, + }, + } + + recipeContext, err := New(testMetadata, testConfig) + require.NoError(t, err) + require.NotNil(t, recipeContext) + require.NotNil(t, recipeContext.Azure) + + // Verify the Azure provider fields are correctly parsed + require.Equal(t, "85716382-aaaa-aaaa-aaaa-2126e459a123", recipeContext.Azure.Subscription.SubscriptionID) + require.Equal(t, "/subscriptions/85716382-aaaa-aaaa-aaaa-2126e459a123", recipeContext.Azure.Subscription.ID) + require.Equal(t, "my-resource-group", recipeContext.Azure.ResourceGroup.Name) + require.Equal(t, "/subscriptions/85716382-aaaa-aaaa-aaaa-2126e459a123/resourceGroups/my-resource-group", recipeContext.Azure.ResourceGroup.ID) +} + +func TestNewContext_AzureProviderSubscriptionOnly(t *testing.T) { + // Test that Azure provider with only subscription ID also works correctly + testMetadata := &recipes.ResourceMetadata{ + ResourceID: "/planes/radius/local/resourceGroups/testGroup/providers/applications.datastores/mongodatabases/mongo0", + EnvironmentID: "/planes/radius/local/resourceGroups/test-group/providers/Applications.Core/environments/env0", + ApplicationID: "/planes/radius/local/resourceGroups/test-group/providers/Applications.Core/applications/testApplication", + } + + testConfig := &recipes.Configuration{ + Runtime: recipes.RuntimeConfiguration{ + Kubernetes: &recipes.KubernetesRuntime{ + Namespace: "radius-test-app", + EnvironmentNamespace: "radius-test-env", + }, + }, + Providers: coredm.Providers{ + Azure: coredm.ProvidersAzure{ + Scope: "/subscriptions/test-subscription-id", + }, + }, + } + + recipeContext, err := New(testMetadata, testConfig) + require.NoError(t, err) + require.NotNil(t, recipeContext) + require.NotNil(t, recipeContext.Azure) + + // Verify the Azure provider fields are correctly parsed (no resource group) + require.Equal(t, "test-subscription-id", recipeContext.Azure.Subscription.SubscriptionID) + require.Equal(t, "/subscriptions/test-subscription-id", recipeContext.Azure.Subscription.ID) + require.Equal(t, "", recipeContext.Azure.ResourceGroup.Name) + require.Equal(t, "/subscriptions/test-subscription-id/resourceGroups/", recipeContext.Azure.ResourceGroup.ID) +}