diff --git a/cli/azd/pkg/containerapps/container_app.go b/cli/azd/pkg/containerapps/container_app.go index 5c67c13aa44..39ed6a49c31 100644 --- a/cli/azd/pkg/containerapps/container_app.go +++ b/cli/azd/pkg/containerapps/container_app.go @@ -16,6 +16,8 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appcontainers/armappcontainers/v3" azdinternal "github.com/azure/azure-dev/cli/azd/internal" "github.com/azure/azure-dev/cli/azd/pkg/account" + "github.com/azure/azure-dev/cli/azd/pkg/alpha" + "github.com/azure/azure-dev/cli/azd/pkg/config" "github.com/azure/azure-dev/cli/azd/pkg/convert" "github.com/azure/azure-dev/cli/azd/pkg/httputil" "github.com/benbjohnson/clock" @@ -59,22 +61,25 @@ func NewContainerAppService( httpClient httputil.HttpClient, clock clock.Clock, armClientOptions *arm.ClientOptions, + alphaFeatureManager *alpha.FeatureManager, ) ContainerAppService { return &containerAppService{ - credentialProvider: credentialProvider, - httpClient: httpClient, - userAgent: azdinternal.UserAgent(), - clock: clock, - armClientOptions: armClientOptions, + credentialProvider: credentialProvider, + httpClient: httpClient, + userAgent: azdinternal.UserAgent(), + clock: clock, + armClientOptions: armClientOptions, + alphaFeatureManager: alphaFeatureManager, } } type containerAppService struct { - credentialProvider account.SubscriptionCredentialProvider - httpClient httputil.HttpClient - userAgent string - clock clock.Clock - armClientOptions *arm.ClientOptions + credentialProvider account.SubscriptionCredentialProvider + httpClient httputil.HttpClient + userAgent string + clock clock.Clock + armClientOptions *arm.ClientOptions + alphaFeatureManager *alpha.FeatureManager } type ContainerAppIngressConfiguration struct { @@ -112,6 +117,8 @@ func (cas *containerAppService) GetIngressConfiguration( // or updating the container app. When unset, we use the default API version of the armappcontainers.ContainerAppsClient. const apiVersionKey = "api-version" +var persistCustomDomainsFeature = alpha.MustFeatureKey("aca.persistDomains") + func (cas *containerAppService) DeployYaml( ctx context.Context, subscriptionId string, @@ -124,6 +131,21 @@ func (cas *containerAppService) DeployYaml( return fmt.Errorf("decoding yaml: %w", err) } + if shouldPersist := cas.alphaFeatureManager.IsEnabled(persistCustomDomainsFeature); shouldPersist { + aca, err := cas.getContainerApp(ctx, subscriptionId, resourceGroupName, appName) + if err == nil { + acaAsConfig := config.NewConfig(obj) + err := acaAsConfig.Set( + "properties.configuration.ingress.customDomains", aca.Properties.Configuration.Ingress.CustomDomains) + + if err == nil { + obj = acaAsConfig.Raw() + } else { + log.Printf("failed to set custom domains: %v. Domains will be ignored.", err) + } + } + } + var poller *runtime.Poller[armappcontainers.ContainerAppsClientCreateOrUpdateResponse] // The way we make the initial request depends on whether the apiVersion is specified in the YAML. diff --git a/cli/azd/pkg/containerapps/container_app_test.go b/cli/azd/pkg/containerapps/container_app_test.go index 352aef697ae..19b3ba8ef64 100644 --- a/cli/azd/pkg/containerapps/container_app_test.go +++ b/cli/azd/pkg/containerapps/container_app_test.go @@ -42,6 +42,7 @@ func Test_ContainerApp_GetIngressConfiguration(t *testing.T) { mockContext.HttpClient, clock.NewMock(), mockContext.ArmClientOptions, + mockContext.AlphaFeaturesManager, ) ingressConfig, err := cas.GetIngressConfiguration(*mockContext.Context, subscriptionId, resourceGroup, appName) require.NoError(t, err) @@ -137,6 +138,7 @@ func Test_ContainerApp_AddRevision(t *testing.T) { mockContext.HttpClient, clock.NewMock(), mockContext.ArmClientOptions, + mockContext.AlphaFeaturesManager, ) err := cas.AddRevision(*mockContext.Context, subscriptionId, resourceGroup, appName, updatedImageName) require.NoError(t, err) diff --git a/cli/azd/pkg/project/service_target_containerapp_test.go b/cli/azd/pkg/project/service_target_containerapp_test.go index 92e85c77103..cd13f4530d8 100644 --- a/cli/azd/pkg/project/service_target_containerapp_test.go +++ b/cli/azd/pkg/project/service_target_containerapp_test.go @@ -139,6 +139,7 @@ func createContainerAppServiceTarget( mockContext.HttpClient, clock.NewMock(), mockContext.ArmClientOptions, + mockContext.AlphaFeaturesManager, ) containerRegistryService := azcli.NewContainerRegistryService( credentialProvider, diff --git a/cli/azd/resources/alpha_features.yaml b/cli/azd/resources/alpha_features.yaml index 6344086cd80..39988d7d9a3 100644 --- a/cli/azd/resources/alpha_features.yaml +++ b/cli/azd/resources/alpha_features.yaml @@ -6,3 +6,5 @@ description: "Enable Helm support for AKS deployments." - id: aks.kustomize description: "Enable Kustomize support for AKS deployments." +- id: aca.persistDomains + description: "Do not change custom domains when deploying Azure Container Apps."