From dbf51375ac04223c955d12183a5d474d28d7a865 Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Sun, 9 Feb 2025 13:41:19 -0800 Subject: [PATCH] Follow-up fixes to RunAsExisting flow (#7494) * Follow-up fixes to RunAsExisting flow * Update src/Aspire.Hosting.Azure/Provisioning/Provisioners/BicepProvisioner.cs Co-authored-by: David Fowler * Update Azure Key Vault snapshot test --------- Co-authored-by: David Fowler --- .../AzureKeyVaultResourceExtensions.cs | 7 +++--- .../AzureResourceProvisionerOfT.cs | 15 ------------ .../Provisioners/BicepProvisioner.cs | 24 +++++++++++++++---- .../ExistingAzureResourceTests.cs | 3 --- 4 files changed, 23 insertions(+), 26 deletions(-) diff --git a/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultResourceExtensions.cs b/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultResourceExtensions.cs index 377c234a65..329b23a910 100644 --- a/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultResourceExtensions.cs +++ b/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultResourceExtensions.cs @@ -43,8 +43,9 @@ public static IResourceBuilder AddAzureKeyVault(this IDis Family = KeyVaultSkuFamily.A, Name = KeyVaultSkuName.Standard }, - EnableRbacAuthorization = true - } + EnableRbacAuthorization = true, + }, + Tags = { { "aspire-resource-name", infrastructure.AspireResource.Name } } }); infrastructure.Add(new ProvisioningOutput("vaultUri", typeof(string)) @@ -52,8 +53,6 @@ public static IResourceBuilder AddAzureKeyVault(this IDis Value = keyVault.Properties.VaultUri }); - keyVault.Tags["aspire-resource-name"] = infrastructure.AspireResource.Name; - var principalTypeParameter = new ProvisioningParameter(AzureBicepResource.KnownParameters.PrincipalType, typeof(string)); infrastructure.Add(principalTypeParameter); var principalIdParameter = new ProvisioningParameter(AzureBicepResource.KnownParameters.PrincipalId, typeof(string)); diff --git a/src/Aspire.Hosting.Azure/Provisioning/Provisioners/AzureResourceProvisionerOfT.cs b/src/Aspire.Hosting.Azure/Provisioning/Provisioners/AzureResourceProvisionerOfT.cs index 688c30baed..9055a2e5cc 100644 --- a/src/Aspire.Hosting.Azure/Provisioning/Provisioners/AzureResourceProvisionerOfT.cs +++ b/src/Aspire.Hosting.Azure/Provisioning/Provisioners/AzureResourceProvisionerOfT.cs @@ -10,7 +10,6 @@ using Azure.ResourceManager.Authorization; using Azure; using Aspire.Hosting.ApplicationModel; -using Microsoft.Extensions.Logging; namespace Aspire.Hosting.Azure.Provisioning; @@ -36,20 +35,6 @@ internal sealed class ProvisioningContext( public AzureLocation Location => location; public UserPrincipal Principal => principal; public JsonObject UserSecrets => userSecrets; - - public async Task GetResourceGroup(string resourceGroupName, ILogger resourceLogger, CancellationToken cancellationToken) - { - var targetResourceGroup = ResourceGroup; - try - { - targetResourceGroup = await Subscription.GetResourceGroupAsync(resourceGroupName, cancellationToken).ConfigureAwait(false); - } - catch (RequestFailedException ex) when (ex.Status == 404) - { - resourceLogger.LogWarning("Resource group {ResourceGroupName} not found. Using default resource group.", resourceGroupName); - } - return targetResourceGroup; - } } internal interface IAzureResourceProvisioner diff --git a/src/Aspire.Hosting.Azure/Provisioning/Provisioners/BicepProvisioner.cs b/src/Aspire.Hosting.Azure/Provisioning/Provisioners/BicepProvisioner.cs index b6851a4bf1..9281cdf088 100644 --- a/src/Aspire.Hosting.Azure/Provisioning/Provisioners/BicepProvisioner.cs +++ b/src/Aspire.Hosting.Azure/Provisioning/Provisioners/BicepProvisioner.cs @@ -114,9 +114,9 @@ public override async Task GetOrCreateResourceAsync(AzureBicepResource resource, existingResource.ResourceGroup is { } existingResourceGroup) { var existingResourceGroupName = existingResourceGroup is ParameterResource parameterResource - ? parameterResource.Name + ? parameterResource.Value : (string)existingResourceGroup; - resourceGroup = await context.GetResourceGroup(existingResourceGroupName, resourceLogger, cancellationToken).ConfigureAwait(false); + resourceGroup = await context.Subscription.GetResourceGroupAsync(existingResourceGroupName, cancellationToken).ConfigureAwait(false); } await notificationService.PublishUpdateAsync(resource, state => state with @@ -312,6 +312,12 @@ await notificationService.PublishUpdateAsync(resource, state => resourceConfig["Outputs"] = outputObj.ToJsonString(); } + // Write resource scope to config for consistent checksums + if (scope is not null) + { + resourceConfig["Scope"] = scope.ToJsonString(); + } + // Save the checksum to the configuration resourceConfig["CheckSum"] = GetChecksum(resource, parameters, scope); @@ -535,12 +541,22 @@ internal static async Task SetParametersAsync(JsonObject parameters, AzureBicepR internal static async Task SetScopeAsync(JsonObject scope, AzureBicepResource resource, CancellationToken cancellationToken = default) { - scope["resourceGroup"] = resource.Scope?.ResourceGroup switch + // Resolve the scope from the AzureBicepResource if it has already been set + // via the ConfigureInfrastructure callback. If not, fallback to the ExistingAzureResourceAnnotation. + var targetScope = resource.Scope; + if (targetScope is null + && resource.TryGetLastAnnotation(out var existingResource) + && existingResource.ResourceGroup is { } existingResourceGroup) + { + targetScope = new AzureBicepResourceScope(existingResourceGroup); + } + + scope["resourceGroup"] = targetScope?.ResourceGroup switch { string s => s, IValueProvider v => await v.GetValueAsync(cancellationToken).ConfigureAwait(false), null => null, - _ => throw new NotSupportedException($"The scope value type {resource.Scope.ResourceGroup.GetType()} is not supported.") + _ => throw new NotSupportedException($"The scope value type {targetScope.ResourceGroup.GetType()} is not supported.") }; } diff --git a/tests/Aspire.Hosting.Azure.Tests/ExistingAzureResourceTests.cs b/tests/Aspire.Hosting.Azure.Tests/ExistingAzureResourceTests.cs index 58305bf228..f0239dc49d 100644 --- a/tests/Aspire.Hosting.Azure.Tests/ExistingAzureResourceTests.cs +++ b/tests/Aspire.Hosting.Azure.Tests/ExistingAzureResourceTests.cs @@ -659,9 +659,6 @@ param principalId string resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' existing = { name: existingResourceName - tags: { - 'aspire-resource-name': 'keyVault' - } } resource keyVault_KeyVaultAdministrator 'Microsoft.Authorization/roleAssignments@2022-04-01' = {