override fun create()

in plugin-azure-server/src/main/kotlin/jetbrains/buildServer/clouds/azure/arm/connector/tasks/CreateDeploymentTaskImpl.kt [44:132]


    override fun create(api: AzureApi, taskContext: AzureTaskContext, parameter: CreateDeploymentTaskParameter): Single<CreateDeploymentTaskDescriptor> {
        if (TeamCityProperties.getBooleanOrTrue(TEAMCITY_CLOUDS_AZURE_TASKS_CTREATEDEPLOYMENT_USE_MILTITHREAD_POLLING)) {
            val managerClient = api.deploymentsClient()

            LOG.debug("Starting deployment. Name: ${parameter.deploymentName}, corellationId: [${taskContext.corellationId}]")

            val service = managerClient.azureClient.retrofit().create(DeploymentService::class.java)
            return managerClient
                .azureClient
                .putOrPatchAsync<DeploymentExtendedInner>(service.createOrUpdate(
                    parameter.groupName,
                    parameter.deploymentName,
                    api.subscriptionId(),
                    getDeploymentInner(parameter),
                    managerClient.apiVersion(),
                    managerClient.acceptLanguage(),
                    managerClient.userAgent()
                )) {
                    taskContext.getDeferralSequence()
                }
                .concatMap {
                    val event = AzureTaskDeploymentStatusChangedEventArgs(
                            api,
                            it.id(),
                            it.name(),
                            it.properties().provisioningState(),
                            it.properties().providers(),
                            it.properties().dependencies(),
                            taskContext,
                    )
                    myNotifications
                            .raise(event)
                            .map { CreateDeploymentTaskDescriptor(event.instance) }
                }
                .onErrorResumeNext { throwable ->
                    if (throwable is CloudException &&
                        DEPLOYMENT_NOT_FOUND_CODE.equals(throwable.body()?.code(), ignoreCase = true) &&
                        VIRTUAL_MACHINES_RESOURCE_TYPE.equals(parameter.targetResourceType, ignoreCase = true)
                    ) {
                        LOG.debug("Deployment has gone. Name: ${parameter.deploymentName}, corellationId: [${taskContext.corellationId}]")
                        val event = AzureTaskVirtualMachineCreated(
                            api,
                            taskContext,
                            ResourceUtils.constructResourceId(
                                api.subscriptionId(),
                                parameter.groupName,
                                VIRTUAL_MACHINES_PROVIDER_NAMESPACE,
                                VIRTUAL_MACHINES_RESOURCE_TYPE_SHORT,
                                parameter.deploymentName,
                                ""),
                        )
                        myNotifications
                            .raise(event)
                            .map { CreateDeploymentTaskDescriptor(event.instance) }
                    } else {
                        Observable.error(throwable)
                    }
                }
                .toSingle()

        } else {
            return Utils.rootResource<Deployment>(
                api
                    .deployments()
                    .define(parameter.deploymentName)
                    .withExistingResourceGroup(parameter.groupName)
                    .withTemplate(parameter.template)
                    .withParameters(parameter.params)
                    .withMode(DeploymentMode.INCREMENTAL)
                    .createAsync()
            )
                .concatMap {
                    val inner = it.inner()
                    val event = AzureTaskDeploymentStatusChangedEventArgs(
                        api,
                        inner.id(),
                        inner.name(),
                        inner.properties().provisioningState(),
                        inner.properties().providers(),
                        inner.properties().dependencies(),
                        taskContext
                    )
                    myNotifications
                        .raise(event)
                        .map { CreateDeploymentTaskDescriptor(event.instance) }
                }
                .toSingle()
        }
    }