Skip to content

Commit

Permalink
Allow setting ACR registry name or cluster name in azure.yaml
Browse files Browse the repository at this point in the history
  • Loading branch information
wbreza committed Jan 26, 2024
1 parent 3973624 commit f273ff5
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 76 deletions.
34 changes: 26 additions & 8 deletions cli/azd/pkg/project/container_helper.go
Expand Up @@ -39,11 +39,27 @@ func NewContainerHelper(
}
}

func (ch *ContainerHelper) RegistryName(ctx context.Context) (string, error) {
loginServer, has := ch.env.LookupEnv(environment.ContainerRegistryEndpointEnvVarName)
if !has {
func (ch *ContainerHelper) RegistryName(ctx context.Context, serviceConfig *ServiceConfig) (string, error) {
var loginServer string
envVarRegistryName, _ := ch.env.LookupEnv(environment.ContainerRegistryEndpointEnvVarName)
yamlRegistryName := serviceConfig.Docker.Registry

registryNameResolution := []string{
envVarRegistryName,
yamlRegistryName,
}

for _, registryName := range registryNameResolution {
if registryName != "" {
loginServer = registryName
break
}
}

if loginServer == "" {
return "", fmt.Errorf(
"could not determine container registry endpoint, ensure %s is set as an output of your infrastructure",
//nolint:lll
"could not determine container registry endpoint, ensure 'registry' has been set in the docker options or '%s' is set as an output of your infrastructure",
environment.ContainerRegistryEndpointEnvVarName,
)
}
Expand All @@ -56,7 +72,7 @@ func (ch *ContainerHelper) RemoteImageTag(
serviceConfig *ServiceConfig,
localImageTag string,
) (string, error) {
loginServer, err := ch.RegistryName(ctx)
loginServer, err := ch.RegistryName(ctx, serviceConfig)
if err != nil {
return "", err
}
Expand Down Expand Up @@ -94,9 +110,10 @@ func (ch *ContainerHelper) RequiredExternalTools(context.Context) []tools.Extern
// it returns the name of the container registry that was logged into.
func (ch *ContainerHelper) Login(
ctx context.Context,
serviceConfig *ServiceConfig,
targetResource *environment.TargetResource,
) (string, error) {
loginServer, err := ch.RegistryName(ctx)
loginServer, err := ch.RegistryName(ctx, serviceConfig)
if err != nil {
return "", err
}
Expand All @@ -106,9 +123,10 @@ func (ch *ContainerHelper) Login(

func (ch *ContainerHelper) Credentials(
ctx context.Context,
serviceConfig *ServiceConfig,
targetResource *environment.TargetResource,
) (*azcli.DockerCredentials, error) {
loginServer, err := ch.RegistryName(ctx)
loginServer, err := ch.RegistryName(ctx, serviceConfig)
if err != nil {
return nil, err
}
Expand All @@ -128,7 +146,7 @@ func (ch *ContainerHelper) Deploy(
return async.RunTaskWithProgress(
func(task *async.TaskContextWithProgress[*ServiceDeployResult, ServiceProgress]) {
// Get ACR Login Server
loginServer, err := ch.RegistryName(ctx)
loginServer, err := ch.RegistryName(ctx, serviceConfig)
if err != nil {
task.SetError(err)
return
Expand Down
1 change: 1 addition & 0 deletions cli/azd/pkg/project/framework_service_docker.go
Expand Up @@ -33,6 +33,7 @@ import (
)

type DockerProjectOptions struct {
Registry string `yaml:"registry,omitempty" json:"registry,omitempty"`
Path string `yaml:"path,omitempty" json:"path,omitempty"`
Context string `yaml:"context,omitempty" json:"context,omitempty"`
Platform string `yaml:"platform,omitempty" json:"platform,omitempty"`
Expand Down
97 changes: 30 additions & 67 deletions cli/azd/pkg/project/service_target_aks.go
Expand Up @@ -192,69 +192,16 @@ func (t *aksTarget) Deploy(
return
}

// WIP: Helm stuff
if serviceConfig.K8s.Helm != nil {
for _, repo := range serviceConfig.K8s.Helm.Repositories {
task.SetProgress(NewServiceProgress(fmt.Sprintf("Configuring helm repo: %s", repo.Name)))
if err := t.helmCli.AddRepo(ctx, repo); err != nil {
task.SetError(err)
return
}

if err := t.helmCli.UpdateRepo(ctx, repo.Name); err != nil {
task.SetError(err)
return
}
}

for _, release := range serviceConfig.K8s.Helm.Releases {
if release.Namespace == "" {
release.Namespace = t.getK8sNamespace(serviceConfig)
}

if err := t.ensureNamespace(ctx, release.Namespace); err != nil {
task.SetError(err)
return
}

task.SetProgress(NewServiceProgress(fmt.Sprintf("Installing helm release: %s", release.Name)))
if err := t.helmCli.Upgrade(ctx, release); err != nil {
task.SetError(err)
return
}

task.SetProgress(NewServiceProgress(fmt.Sprintf("Checking helm release status: %s", release.Name)))
err := retry.Do(
ctx,
retry.WithMaxDuration(10*time.Minute, retry.NewConstant(5*time.Second)),
func(ctx context.Context) error {
status, err := t.helmCli.Status(ctx, release)
if err != nil {
return err
}

if status.Info.Status != helm.StatusKindDeployed {
fmt.Printf("Status: %s\n", status.Info.Status)
return retry.RetryableError(
fmt.Errorf("helm release '%s' is not ready, %w", release.Name, err),
)
}

return nil
},
)

if err != nil {
task.SetError(err)
return
}
}
}

if packageOutput.PackagePath != "" {
// Login, tag & push container image to ACR
containerDeployTask := t.containerHelper.Deploy(ctx, serviceConfig, packageOutput, targetResource, true)
syncProgress(task, containerDeployTask.Progress())

_, err := containerDeployTask.Await()
if err != nil {
task.SetError(err)
return
}
}

// Sync environment
Expand Down Expand Up @@ -297,8 +244,6 @@ func (t *aksTarget) Deploy(

deployed = deployed || deployment != nil

task.SetError(fmt.Errorf("kustomize deployment failed: %w", err))

if !deployed {
task.SetError(errors.New("no deployment manifests found"))

Expand Down Expand Up @@ -338,8 +283,8 @@ func (t *aksTarget) Deploy(
targetResource.ResourceGroupName(),
targetResource.ResourceName(),
),
Kind: AksTarget,
//Details: deployment,
Kind: AksTarget,
Details: deployment,
Endpoints: endpoints,
})
})
Expand Down Expand Up @@ -582,15 +527,33 @@ func (t *aksTarget) ensureClusterContext(
return kubeConfigPath, nil
}

// Login to AKS cluster
clusterName, has := t.env.LookupEnv(environment.AksClusterEnvVarName)
if !has {
// Resolve cluster name
var clusterName string
envVarClusterName, _ := t.env.LookupEnv(environment.AksClusterEnvVarName)
yamlClusterName, _ := serviceConfig.ResourceName.Envsubst(t.env.Getenv)

clusterNameResolutions := []string{
envVarClusterName,
yamlClusterName,
targetResource.ResourceName(),
}

for _, resourceName := range clusterNameResolutions {
if resourceName != "" {
clusterName = resourceName
break
}
}

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

// Login to AKS cluster
log.Printf("getting AKS credentials for cluster '%s'\n", clusterName)
clusterCreds, err := t.managedClustersService.GetUserCredentials(
ctx,
Expand Down
2 changes: 1 addition & 1 deletion cli/azd/pkg/project/service_target_dotnet_containerapp.go
Expand Up @@ -102,7 +102,7 @@ func (at *dotnetContainerAppTarget) Deploy(
task.SetProgress(NewServiceProgress("Logging in to registry"))

// Login, tag & push container image to ACR
dockerCreds, err := at.containerHelper.Credentials(ctx, targetResource)
dockerCreds, err := at.containerHelper.Credentials(ctx, serviceConfig, targetResource)
if err != nil {
task.SetError(fmt.Errorf("logging in to registry: %w", err))
return
Expand Down

0 comments on commit f273ff5

Please sign in to comment.