File: AzdAzureContainerAppEnvironment.cs
Web Access
Project: src\src\Aspire.Hosting.Azure.AppContainers\Aspire.Hosting.Azure.AppContainers.csproj (Aspire.Hosting.Azure.AppContainers)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.Hosting.ApplicationModel;
 
namespace Aspire.Hosting.Azure.AppContainers;
 
/// <summary>
/// This class encapsulates the Azure Container App environment details when it is provided
/// by azd. It implements the IAzureContainerAppEnvironment interface, which provides properties
/// and methods to access various environment-related information.
/// </summary>
internal sealed class AzdAzureContainerAppEnvironment : IAzureContainerAppEnvironment
{
    public IManifestExpressionProvider ContainerAppEnvironmentId => AzureContainerAppsEnvironment.AZURE_CONTAINER_APPS_ENVIRONMENT_ID;
 
    public IManifestExpressionProvider ContainerAppDomain => AzureContainerAppsEnvironment.AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN;
 
    public IManifestExpressionProvider ContainerRegistryUrl => AzureContainerAppsEnvironment.AZURE_CONTAINER_REGISTRY_ENDPOINT;
 
    public IManifestExpressionProvider ContainerRegistryManagedIdentityId => AzureContainerAppsEnvironment.AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID;
 
    public IManifestExpressionProvider LogAnalyticsWorkspaceId => AzureContainerAppsEnvironment.AZURE_LOG_ANALYTICS_WORKSPACE_ID;
 
    public IManifestExpressionProvider PrincipalId => AzureContainerAppsEnvironment.MANAGED_IDENTITY_PRINCIPAL_ID;
 
    public IManifestExpressionProvider PrincipalName => AzureContainerAppsEnvironment.MANAGED_IDENTITY_NAME;
 
    public IManifestExpressionProvider ContainerAppEnvironmentName => AzureContainerAppsEnvironment.AZURE_CONTAINER_APPS_ENVIRONMENT_NAME;
 
    public IManifestExpressionProvider GetSecretOutputKeyVault(AzureBicepResource resource)
    {
        return SecretOutputExpression.GetSecretOutputKeyVault(resource);
    }
 
    public IManifestExpressionProvider GetVolumeStorage(IResource resource, ContainerMountAnnotation volume, int volumeIndex)
    {
        return VolumeStorageExpression.GetVolumeStorage(resource, volume.Type, volumeIndex);
    }
 
    /// <summary>
    /// These are referencing outputs from azd's main.bicep file. We represent the global namespace in the manifest
    /// by using {.outputs.property} expressions.
    /// </summary>
    private sealed class AzureContainerAppsEnvironment(string outputName) : IManifestExpressionProvider
    {
        public string ValueExpression => $"{{.outputs.{outputName}}}";
 
        public static IManifestExpressionProvider MANAGED_IDENTITY_NAME => GetExpression("MANAGED_IDENTITY_NAME");
        public static IManifestExpressionProvider MANAGED_IDENTITY_PRINCIPAL_ID => GetExpression("MANAGED_IDENTITY_PRINCIPAL_ID");
        public static IManifestExpressionProvider AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID => GetExpression("AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID");
        public static IManifestExpressionProvider AZURE_CONTAINER_REGISTRY_ENDPOINT => GetExpression("AZURE_CONTAINER_REGISTRY_ENDPOINT");
        public static IManifestExpressionProvider AZURE_CONTAINER_REGISTRY_NAME => GetExpression("AZURE_CONTAINER_REGISTRY_NAME");
        public static IManifestExpressionProvider AZURE_CONTAINER_APPS_ENVIRONMENT_ID => GetExpression("AZURE_CONTAINER_APPS_ENVIRONMENT_ID");
        public static IManifestExpressionProvider AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN => GetExpression("AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN");
        public static IManifestExpressionProvider AZURE_LOG_ANALYTICS_WORKSPACE_ID => GetExpression("AZURE_LOG_ANALYTICS_WORKSPACE_ID");
        public static IManifestExpressionProvider AZURE_CONTAINER_APPS_ENVIRONMENT_NAME => GetExpression("AZURE_CONTAINER_APPS_ENVIRONMENT_NAME");
 
        private static IManifestExpressionProvider GetExpression(string propertyExpression) =>
            new AzureContainerAppsEnvironment(propertyExpression);
    }
 
    /// <summary>
    /// Generates expressions for the secret outputs of the Azure Bicep resource. These are referencing outputs from azd's main.bicep file.
    /// </summary>
    /// <param name="resource"></param>
    private sealed class SecretOutputExpression(AzureBicepResource resource) : IManifestExpressionProvider
    {
        public string ValueExpression => $"{{{resource.Name}.secretOutputs}}";
        public static IManifestExpressionProvider GetSecretOutputKeyVault(AzureBicepResource resource) =>
            new SecretOutputExpression(resource);
    }
 
    /// <summary>
    /// Generates expressions for the volume storage account. That azd creates.
    /// </summary>
    private sealed class VolumeStorageExpression(IResource resource, ContainerMountType type, int index) : IManifestExpressionProvider
    {
        public string ValueExpression => type switch
        {
            ContainerMountType.BindMount => $"{{{resource.Name}.bindMounts.{index}.storage}}",
            ContainerMountType.Volume => $"{{{resource.Name}.volumes.{index}.storage}}",
            _ => throw new NotSupportedException()
        };
 
        public static IManifestExpressionProvider GetVolumeStorage(IResource resource, ContainerMountType type, int index) =>
            new VolumeStorageExpression(resource, type, index);
    }
}