async function createVm()

in tasks/Node/src/tasks/AzureDtlCreateVM/task.ts [82:157]


async function createVm(clients: TaskClients, inputData: CreateVmTaskInputData): Promise<void> {
    let labVmId: string = '';

    const labName: string = resutil.getLabResourceName(inputData.labId, 'labs');
    const labRgName: string = resutil.getLabResourceName(inputData.labId, 'resourcegroups');

    console.log(`Creating Virtual Machine in Lab '${labName}' under Resource Group '${labRgName}'.`);

    const baseVmName: string = inputData.vmName;
    const count: number = 1 + inputData.retryCount;

    for (let i = 1; i <= count; i++) {
        const deploymentName: string = deployutil.getDeploymentName();

        resutil.testVmName(inputData.vmName);

        try {
            const deployment: ResourceManagementModels.Deployment = getDeployment(labName, inputData.vmName, inputData.templateFile, inputData.parametersFile, inputData.parameterOverrides);

            console.log('Invoking deployment with the following parameters:');
            console.log(`  DeploymentName = ${deploymentName}`);
            console.log(`  ResourceGroupName = ${labRgName}`);
            console.log(`  LabName = ${labName}`);
            console.log(`  VmName = ${inputData.vmName}`);
            console.log(`  TemplateFile = ${inputData.templateFile}`);

            const results: ResourceManagementModels.DeploymentsCreateOrUpdateResponse = await clients.arm.deployments.createOrUpdate(labRgName, deploymentName, deployment);

            if (results && results.properties) {
                const properties: any = results.properties;

                if (properties.provisioningState !== 'Succeeded') {
                    throw results._response.parsedBody;
                }

                if (properties.outputResources) {
                    const outputs: any = properties.outputResources[0];
                    if (outputs.id) {
                        labVmId = outputs.id;
                    }
                }
            }

            if (labVmId) {
                await waitForApplyArtifacts(clients.dtl, labVmId, inputData.waitMinutes);
                await checkArtifactsStatus(clients.dtl, labVmId, inputData.templateFile, inputData.failOnArtifactError);
                break;
            }
        }
        catch (error) {
            if (i === count) {
                throw error;
            }
            else {
                // Reset labVmId to ensure we don't mistakenly return a previously invalid value in case of a subsequent retry error.
                labVmId = '';

                tl.warning(`A deployment failure occured. Retrying deployment (attempt ${i} of ${count - 1}).`);
                tl.debug('Deployment failed with error:');
                tl.debug(JSON.stringify(error, null, 2));

                await removeFailedResources(clients.arm, labRgName, deploymentName, inputData.deleteLabVm, inputData.deleteDeployment);

                if (inputData.appendRetryNumberToVmName) {
                    inputData.vmName = `${baseVmName}-${i}`;
                }
            }
        }
    }

    if (labVmId) {
        tl.setVariable('labVmId', labVmId);
    }

    console.log(`Finished creating Lab Virtual Machine '${inputData.vmName}'.`);
}