Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 41 additions & 6 deletions cli/azd/pkg/project/service_target_aks.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,12 +284,9 @@ func (t *aksTarget) ensureClusterContext(
}

// Login to AKS cluster
clusterName, has := t.env.LookupEnv(environment.AksClusterEnvVarName)
if !has {
return "", fmt.Errorf(
"could not determine AKS cluster, ensure %s is set as an output of your infrastructure",
environment.AksClusterEnvVarName,
)
clusterName, err := t.resolveClusterName(serviceConfig, targetResource)
if err != nil {
return "", err
}

log.Printf("getting AKS credentials for cluster '%s'\n", clusterName)
Expand Down Expand Up @@ -578,3 +575,41 @@ func (t *aksTarget) setK8sContext(ctx context.Context, serviceConfig *ServiceCon

return nil
}

// resolveClusterName attempts to resolve the cluster name from the following sources:
// 1. The 'AZD_AKS_CLUSTER' environment variable
Comment thread
wbreza marked this conversation as resolved.
// 2. The 'resourceName' property in the azure.yaml (Can use expandable string as well)
// 3. The 'resourceName' property passed the target resource
func (t *aksTarget) resolveClusterName(
serviceConfig *ServiceConfig,
targetResource *environment.TargetResource,
) (string, error) {
// Resolve cluster name
clusterName, found := t.env.LookupEnv(environment.AksClusterEnvVarName)
if !found {
log.Printf("'%s' environment variable not found\n", environment.AksClusterEnvVarName)
}

if clusterName == "" {
yamlClusterName, err := serviceConfig.ResourceName.Envsubst(t.env.Getenv)
if err != nil {
log.Println("failed resolving cluster name from `resourceName` in azure.yaml", err)
}

clusterName = yamlClusterName
}

if clusterName == "" {
clusterName = targetResource.ResourceName()
}

if clusterName == "" {
return "", fmt.Errorf(
// nolint:lll
"could not determine AKS cluster, ensure 'resourceName' is set in your azure.yaml or '%s' environment variable has been set.",
environment.AksClusterEnvVarName,
)
}

return clusterName, nil
}
84 changes: 70 additions & 14 deletions cli/azd/pkg/project/service_target_aks_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ func Test_Package_Deploy_HappyPath(t *testing.T) {
require.NotNil(t, packageResult)
require.IsType(t, new(dockerPackageResult), packageResult.Details)

scope := environment.NewTargetResource("SUB_ID", "RG_ID", "CLUSTER_NAME", string(infra.AzureResourceTypeManagedCluster))
scope := environment.NewTargetResource("SUB_ID", "RG_ID", "", string(infra.AzureResourceTypeManagedCluster))
deployTask := serviceTarget.Deploy(*mockContext.Context, serviceConfig, packageResult, scope)
logProgress(deployTask)
deployResult, err := deployTask.Await()
Expand All @@ -117,24 +117,80 @@ func Test_Package_Deploy_HappyPath(t *testing.T) {
require.Equal(t, "REGISTRY.azurecr.io/test-app/api-test:azd-deploy-0", env.Dotenv()["SERVICE_API_IMAGE_NAME"])
}

func Test_Deploy_No_Cluster_Name(t *testing.T) {
func Test_Resolve_Cluster_Name(t *testing.T) {
tempDir := t.TempDir()
ostest.Chdir(t, tempDir)

mockContext := mocks.NewMockContext(context.Background())
err := setupMocksForAksTarget(mockContext)
require.NoError(t, err)
t.Run("Default env var", func(t *testing.T) {
tempDir := t.TempDir()
ostest.Chdir(t, tempDir)

serviceConfig := createTestServiceConfig(tempDir, AksTarget, ServiceLanguageTypeScript)
env := createEnv()
mockContext := mocks.NewMockContext(context.Background())
err := setupMocksForAksTarget(mockContext)
require.NoError(t, err)

// Simulate AKS cluster name not found in env file
env.DotenvDelete(environment.AksClusterEnvVarName)
serviceConfig := createTestServiceConfig(tempDir, AksTarget, ServiceLanguageTypeScript)
env := createEnv()

serviceTarget := createAksServiceTarget(mockContext, serviceConfig, env)
err = simulateInitliaze(*mockContext.Context, serviceTarget, serviceConfig)
require.Error(t, err)
require.ErrorContains(t, err, "could not determine AKS cluster")
serviceTarget := createAksServiceTarget(mockContext, serviceConfig, env)
err = simulateInitliaze(*mockContext.Context, serviceTarget, serviceConfig)
require.NoError(t, err)
})

t.Run("Simple String", func(t *testing.T) {
mockContext := mocks.NewMockContext(context.Background())
err := setupMocksForAksTarget(mockContext)
require.NoError(t, err)

serviceConfig := createTestServiceConfig(tempDir, AksTarget, ServiceLanguageTypeScript)
serviceConfig.ResourceName = NewExpandableString("MY_AKS_CLUSTER")
env := createEnv()

// Remove default AKS cluster name from env file
env.DotenvDelete(environment.AksClusterEnvVarName)

serviceTarget := createAksServiceTarget(mockContext, serviceConfig, env)
err = simulateInitliaze(*mockContext.Context, serviceTarget, serviceConfig)
require.NoError(t, err)
})

t.Run("Expandable String", func(t *testing.T) {
mockContext := mocks.NewMockContext(context.Background())
err := setupMocksForAksTarget(mockContext)
require.NoError(t, err)

serviceConfig := createTestServiceConfig(tempDir, AksTarget, ServiceLanguageTypeScript)
serviceConfig.ResourceName = NewExpandableString("$MY_CUSTOM_ENV_VAR")
env := createEnv()
env.DotenvSet("MY_CUSTOM_ENV_VAR", "MY_AKS_CLUSTER")

// Remove default AKS cluster name from env file
env.DotenvDelete(environment.AksClusterEnvVarName)

serviceTarget := createAksServiceTarget(mockContext, serviceConfig, env)
err = simulateInitliaze(*mockContext.Context, serviceTarget, serviceConfig)
require.NoError(t, err)
})

t.Run("No Cluster Name", func(t *testing.T) {
tempDir := t.TempDir()
ostest.Chdir(t, tempDir)

mockContext := mocks.NewMockContext(context.Background())
err := setupMocksForAksTarget(mockContext)
require.NoError(t, err)

serviceConfig := createTestServiceConfig(tempDir, AksTarget, ServiceLanguageTypeScript)
env := createEnv()

// Simulate AKS cluster name not found in env file
env.DotenvDelete(environment.AksClusterEnvVarName)

serviceTarget := createAksServiceTarget(mockContext, serviceConfig, env)
err = simulateInitliaze(*mockContext.Context, serviceTarget, serviceConfig)
require.Error(t, err)
require.ErrorContains(t, err, "could not determine AKS cluster")
})
}

func Test_Deploy_No_Credentials(t *testing.T) {
Expand Down Expand Up @@ -506,7 +562,7 @@ func createAksServiceTarget(
targetResource := environment.NewTargetResource(
"SUBSCRIPTION_ID",
"RESOURCE_GROUP",
"CLUSTER_NAME",
"",
string(infra.AzureResourceTypeManagedCluster),
)
resourceManager.
Expand Down