All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.microsoft.azure.toolkit.lib.containerapps.task.DeployContainerAppTask Maven / Gradle / Ivy

The newest version!
package com.microsoft.azure.toolkit.lib.containerapps.task;

import com.microsoft.azure.toolkit.lib.Azure;
import com.microsoft.azure.toolkit.lib.common.bundle.AzureString;
import com.microsoft.azure.toolkit.lib.common.exception.AzureToolkitRuntimeException;
import com.microsoft.azure.toolkit.lib.common.model.Region;
import com.microsoft.azure.toolkit.lib.common.operation.AzureOperation;
import com.microsoft.azure.toolkit.lib.common.task.AzureTask;
import com.microsoft.azure.toolkit.lib.containerapps.AzureContainerApps;
import com.microsoft.azure.toolkit.lib.containerapps.config.ContainerAppConfig;
import com.microsoft.azure.toolkit.lib.containerapps.config.ContainerAppsEnvironmentConfig;
import com.microsoft.azure.toolkit.lib.containerapps.containerapp.ContainerApp;
import com.microsoft.azure.toolkit.lib.containerapps.containerapp.ContainerAppDraft;
import com.microsoft.azure.toolkit.lib.containerapps.environment.ContainerAppsEnvironment;
import com.microsoft.azure.toolkit.lib.containerapps.environment.ContainerAppsEnvironmentDraft;
import com.microsoft.azure.toolkit.lib.containerregistry.AzureContainerRegistry;
import com.microsoft.azure.toolkit.lib.containerregistry.ContainerRegistry;
import com.microsoft.azure.toolkit.lib.containerregistry.ContainerRegistryDraft;
import com.microsoft.azure.toolkit.lib.containerregistry.config.ContainerRegistryConfig;
import com.microsoft.azure.toolkit.lib.containerregistry.model.Sku;
import com.microsoft.azure.toolkit.lib.resource.AzureResources;
import com.microsoft.azure.toolkit.lib.resource.ResourceGroup;
import com.microsoft.azure.toolkit.lib.resource.task.CreateResourceGroupTask;
import org.apache.commons.lang3.StringUtils;

import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;


public class DeployContainerAppTask extends AzureTask {
    private final ContainerAppConfig config;
    private ContainerApp containerApp;
    @Nonnull
    private final List> subTasks;
    public DeployContainerAppTask(ContainerAppConfig config) {
        this.config = config;
        this.subTasks = new ArrayList<>();
        this.initTasks();
    }
    private void initTasks() {
        final ContainerAppsEnvironmentConfig environmentConfig = config.getEnvironment();
        preCheck(environmentConfig);
        addCreateResourceGroupTaskIfNecessary(environmentConfig);
        addCreateAppEnvironmentTaskIfNecessary(environmentConfig);
        addCreateContainerRegistryTaskIfNecessary(config.getRegistryConfig());
        addCreateOrUpdateContainerAppTask();
    }

    private void preCheck(ContainerAppsEnvironmentConfig environmentConfig) {
        checkNotBlank(environmentConfig, ContainerAppsEnvironmentConfig::getSubscriptionId, "subscriptionId");
        checkNotBlank(environmentConfig, ContainerAppsEnvironmentConfig::getAppEnvironmentName, "environmentName");
        checkNotBlank(config, ContainerAppConfig::getAppName, "appName");
        checkNotBlank(environmentConfig, ContainerAppsEnvironmentConfig::getResourceGroup, "resourceGroup");
    }

    private void addCreateResourceGroupTaskIfNecessary(@Nonnull final ContainerAppsEnvironmentConfig config) {
        final ResourceGroup resourceGroup = Azure.az(AzureResources.class).groups(config.getSubscriptionId())
            .getOrDraft(config.getResourceGroup(), config.getResourceGroup());

        if (resourceGroup.isDraftForCreating() && !resourceGroup.exists()) {
            final String region = checkNotBlank(config, ContainerAppsEnvironmentConfig::getRegion, "region");
            this.subTasks.add(new CreateResourceGroupTask(config.getSubscriptionId(), config.getResourceGroup(), Region.fromName(region)));
        }
    }

    private void addCreateAppEnvironmentTaskIfNecessary(@Nonnull final ContainerAppsEnvironmentConfig config) {
        final ContainerAppsEnvironment environment = Azure.az(AzureContainerApps.class).environments(config.getSubscriptionId())
            .getOrDraft(config.getAppEnvironmentName(), config.getResourceGroup());
        if (environment.isDraftForCreating() && !environment.exists()) {
            final AzureString title = AzureString.format("Create new Container Apps Environment({0})", environment.getName());
            this.subTasks.add(new AzureTask(title, () -> {
                final ResourceGroup resourceGroup = Azure.az(AzureResources.class).groups(config.getSubscriptionId())
                    .get(config.getResourceGroup(), config.getResourceGroup());
                final ContainerAppsEnvironmentDraft draft = (ContainerAppsEnvironmentDraft) environment;
                final ContainerAppsEnvironmentDraft.Config draftConfig = new ContainerAppsEnvironmentDraft.Config();
                draftConfig.setName(config.getAppEnvironmentName());
                draftConfig.setResourceGroup(resourceGroup);
                draftConfig.setRegion(Region.fromName(config.getRegion()));
                draft.setConfig(draftConfig);
                draft.commit();
            }));
        }
    }

    private void addCreateContainerRegistryTaskIfNecessary(@Nonnull final ContainerRegistryConfig containerRegistryConfig) {
        final ContainerRegistry registry = Azure.az(AzureContainerRegistry.class).registry(containerRegistryConfig.getSubscriptionId())
            .getOrDraft(containerRegistryConfig.getRegistryName(), containerRegistryConfig.getResourceGroup());
        if (registry.isDraftForCreating() && !registry.exists()) {
            final AzureString title = AzureString.format("Create new Container Registry({0})", registry.getName());
            this.subTasks.add(new AzureTask(title, () -> {
                final ContainerRegistryDraft draft = (ContainerRegistryDraft) registry;
                draft.setRegion(Region.fromName(containerRegistryConfig.getRegion()));
                draft.setSku(Sku.Standard);
                draft.setAdminUserEnabled(true);
                config.getImageConfig().setContainerRegistry(draft.commit());
            }));
        }
    }

    private void addCreateOrUpdateContainerAppTask() {
        final ContainerAppDraft containerAppDraft = Azure.az(AzureContainerApps.class).containerApps(config.getEnvironment().getSubscriptionId())
            .updateOrCreate(config.getAppName(), config.getEnvironment().getResourceGroup());
        final AzureString title = AzureString.format("Create or update Container App({0})", config.getAppName());
        this.subTasks.add(new AzureTask(title, () -> {
            containerAppDraft.setConfig(toContainerAppDraftConfig());
            containerApp = containerAppDraft.commit();
        }));
    }

    private ContainerAppDraft.Config toContainerAppDraftConfig() {
        final ContainerAppDraft.Config draftConfig = new ContainerAppDraft.Config();
        final ContainerAppsEnvironmentConfig environmentConfig = config.getEnvironment();
        final ContainerAppsEnvironment environment = Azure.az(AzureContainerApps.class).environments(environmentConfig.getSubscriptionId())
            .get(environmentConfig.getAppEnvironmentName(), environmentConfig.getResourceGroup());
        draftConfig.setEnvironment(environment);
        draftConfig.setSubscription(environment.getSubscription());
        draftConfig.setResourceGroup(environment.getResourceGroup());
        draftConfig.setName(config.getAppName());
        draftConfig.setImageConfig(config.getImageConfig());
        draftConfig.setIngressConfig(config.getIngressConfig());
        draftConfig.setResourceConfiguration(config.getResourceConfiguration());
        draftConfig.setScaleConfig(config.getScaleConfig());

        return draftConfig;
    }

    @Override
    @AzureOperation(name = "internal/containerapps.create_update_app.app", params = {"this.config.getAppName()"})
    public ContainerApp doExecute()  throws Exception {
        for (final AzureTask t : this.subTasks) {
            t.getBody().call();
        }
        return containerApp;
    }

    private static  String checkNotBlank(T config, Function getter, String name) {
        if (config != null) {
            String value = getter.apply(config);
            if (StringUtils.isNotBlank(value)) {
                return value;
            }
        }
        throw new AzureToolkitRuntimeException(String.format("'%s' is required", name));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy