func()

in cli/azd/pkg/project/service_target_ai_endpoint.go [68:193]


func (m *aiEndpointTarget) Deploy(
	ctx context.Context,
	serviceConfig *ServiceConfig,
	servicePackage *ServicePackageResult,
	targetResource *environment.TargetResource,
	progress *async.Progress[ServiceProgress],
) (*ServiceDeployResult, error) {
	endpointConfig, err := ai.ParseConfig[ai.EndpointDeploymentConfig](serviceConfig.Config)
	if err != nil {
		return nil, err
	}

	workspaceScope, err := m.getWorkspaceScope(serviceConfig, targetResource)
	if err != nil {
		return nil, err
	}

	deployResult := &AiEndpointDeploymentResult{}

	// Initialize the AI project that will be used for the python bridge
	progress.SetProgress(NewServiceProgress("Initializing AI project"))
	if err := m.aiHelper.Initialize(ctx); err != nil {
		return nil, fmt.Errorf("failed initializing AI project: %w", err)
	}

	// Ensure the workspace is valid
	if err := m.aiHelper.ValidateWorkspace(ctx, workspaceScope); err != nil {
		return nil, fmt.Errorf("workspace '%s' was not found within subscription '%s' and resource group '%s': %w",
			workspaceScope.Workspace(),
			workspaceScope.SubscriptionId(),
			workspaceScope.ResourceGroup(),
			err,
		)
	}

	// Deploy flow
	if endpointConfig.Flow != nil {
		progress.SetProgress(NewServiceProgress("Deploying AI Prompt Flow"))
		flow, err := m.aiHelper.CreateFlow(ctx, workspaceScope, serviceConfig, endpointConfig.Flow)
		if err != nil {
			return nil, err
		}

		deployResult.Flow = flow
	}

	// Deploy environment
	if endpointConfig.Environment != nil {
		progress.SetProgress(NewServiceProgress("Configuring AI environment"))
		envVersion, err := m.aiHelper.CreateEnvironmentVersion(
			ctx,
			workspaceScope,
			serviceConfig,
			endpointConfig.Environment,
		)
		if err != nil {
			return nil, err
		}

		deployResult.Environment = envVersion
	}

	// Deploy model
	if endpointConfig.Model != nil {
		progress.SetProgress(NewServiceProgress("Configuring AI model"))
		modelVersion, err := m.aiHelper.CreateModelVersion(ctx, workspaceScope, serviceConfig, endpointConfig.Model)
		if err != nil {
			return nil, err
		}

		deployResult.Model = modelVersion
	}

	// Deploy to endpoint
	if endpointConfig.Deployment != nil {
		progress.SetProgress(NewServiceProgress("Deploying to AI Online Endpoint"))
		endpointName := filepath.Base(targetResource.ResourceName())
		onlineDeployment, err := m.aiHelper.DeployToEndpoint(
			ctx,
			workspaceScope,
			serviceConfig,
			endpointName,
			endpointConfig,
		)
		if err != nil {
			return nil, err
		}

		if onlineDeployment == nil {
			return nil, fmt.Errorf("unexpected response from deployToEndpoint: deployment is nil")
		}
		if onlineDeployment.Name == nil {
			return nil, fmt.Errorf("unexpected response from deployToEndpoint: deployment name is nil")
		}

		deploymentName := *onlineDeployment.Name
		progress.SetProgress(NewServiceProgress("Updating traffic"))
		_, err = m.aiHelper.UpdateTraffic(ctx, workspaceScope, endpointName, deploymentName)
		if err != nil {
			return nil, fmt.Errorf("failed updating traffic: %w", err)
		}

		progress.SetProgress(NewServiceProgress("Removing old deployments"))
		if err := m.aiHelper.DeleteDeployments(
			ctx, workspaceScope, endpointName, []string{deploymentName}); err != nil {
			return nil, fmt.Errorf("failed deleting previous deployments: %w", err)
		}

		deployResult.Deployment = onlineDeployment
	}

	endpoints, err := m.Endpoints(ctx, serviceConfig, targetResource)
	if err != nil {
		return nil, err
	}

	if err := m.envManager.Save(ctx, m.env); err != nil {
		return nil, fmt.Errorf("failed saving environment: %w", err)
	}

	return &ServiceDeployResult{
		Details:   deployResult,
		Package:   servicePackage,
		Endpoints: endpoints,
	}, nil
}