in Tasks/AzureAppServiceManageV0/azureappservicemanage.ts [40:220]
async function run() {
let kuduService: Kudu;
let kuduServiceUtils: KuduServiceUtils;
let appService: AzureAppService;
let azureAppServiceUtils: AzureAppServiceUtils;
let appServiceSourceSlot: AzureAppService;
let appServiceTargetSlot: AzureAppService;
let appServiceSourceSlotUtils: AzureAppServiceUtils;
let appServiceTargetSlotUtils: AzureAppServiceUtils;
let taskResult = true;
let errorMessage: string = "";
let updateDeploymentStatus: boolean = true;
let action: string;
try {
tl.setResourcePath(path.join( __dirname, 'task.json'));
action = tl.getInput('Action', true);
let connectedServiceName = tl.getInput('ConnectedServiceName', true);
let webAppName: string = tl.getInput('WebAppName', true);
let resourceGroupName: string = tl.getInput('ResourceGroupName', false);
let specifySlotFlag: boolean = tl.getBoolInput('SpecifySlot', false);
let slotName: string = specifySlotFlag || (action == "Delete Slot" || action == "Cancel Swap") ? tl.getInput('Slot', false) : null;
let appInsightsResourceGroupName: string = tl.getInput('AppInsightsResourceGroupName', false);
let appInsightsResourceName: string = tl.getInput('ApplicationInsightsResourceName', false);
let sourceSlot: string = tl.getInput('SourceSlot', false);
let swapWithProduction = tl.getBoolInput('SwapWithProduction', false);
let targetSlot: string = tl.getInput('TargetSlot', false);
let preserveVnet: boolean = tl.getBoolInput('PreserveVnet', false);
let extensionList = tl.getInput('ExtensionsList', false);
let extensionOutputVariables = tl.getInput('OutputVariable');
let appInsightsWebTestName = tl.getInput('ApplicationInsightsWebTestName', false);
let azureEndpoint: AzureEndpoint = await new AzureRMEndpoint(connectedServiceName).getEndpoint();
let endpointTelemetry = '{"endpointId":"' + connectedServiceName + '"}';
console.log("##vso[telemetry.publish area=TaskEndpointId;feature=AzureAppServiceManage]" + endpointTelemetry);
if (azureEndpoint.scheme && azureEndpoint.scheme.toLowerCase() === AzureRmEndpointAuthenticationScheme.PublishProfile) {
if (action !== "Start all continuous webjobs" && action !== "Stop all continuous webjobs" && action !== "Install Extensions") {
throw Error(tl.loc('InvalidActionForPublishProfileEndpoint'));
}
let scmCreds: publishProfileUtility.ScmCredentials = await publishProfileUtility.getSCMCredentialsFromPublishProfile(azureEndpoint.PublishProfile);
kuduService = new Kudu(scmCreds.scmUri, scmCreds.username, scmCreds.password);
kuduServiceUtils = new KuduServiceUtils(kuduService);
} else {
if(action != "Swap Slots" && !slotName) {
resourceGroupName = await AzureResourceFilterUtils.getResourceGroupName(azureEndpoint, 'Microsoft.Web/Sites', webAppName);
}
tl.debug(`Resource Group: ${resourceGroupName}`);
appService = new AzureAppService(azureEndpoint, resourceGroupName, webAppName, slotName);
azureAppServiceUtils = new AzureAppServiceUtils(appService);
let appServiceKuduService = await azureAppServiceUtils.getKuduService();
kuduServiceUtils = new KuduServiceUtils(appServiceKuduService);
let configSettings = await appService.get(true);
let WebAppKind = webAppKindMap.get(configSettings.kind) ? webAppKindMap.get(configSettings.kind) : configSettings.kind;
let isLinuxApp = WebAppKind && WebAppKind.indexOf("linux") !=-1;
let isContainerApp = WebAppKind && WebAppKind.indexOf("container") !=-1;
if((action == "Start Swap With Preview" || action == "Complete Swap" || action == "Cancel Swap") && (isLinuxApp || isContainerApp))
{
throw Error(tl.loc('SwapWithPreviewNotsupported'));
}
if(action == "Swap Slots" || action == "Start Swap With Preview" || action == "Complete Swap")
{
targetSlot = (swapWithProduction) ? "production" : targetSlot;
appServiceSourceSlot = new AzureAppService(azureEndpoint, resourceGroupName, webAppName, sourceSlot);
appServiceTargetSlot = new AzureAppService(azureEndpoint, resourceGroupName, webAppName, targetSlot);
appServiceSourceSlotUtils = new AzureAppServiceUtils(appServiceSourceSlot);
appServiceTargetSlotUtils = new AzureAppServiceUtils(appServiceTargetSlot);
}
}
switch(action) {
case "Start Azure App Service": {
await appService.start();
await azureAppServiceUtils.monitorApplicationState("running");
await azureAppServiceUtils.pingApplication();
break;
}
case "Stop Azure App Service": {
await appService.stop();
await azureAppServiceUtils.monitorApplicationState("stopped");
break;
}
case "Restart Azure App Service": {
await appService.restart();
await azureAppServiceUtils.pingApplication();
break;
}
case "Delete Slot": {
await appService.delete();
break;
}
case "Complete Swap":
case "Swap Slots": {
updateDeploymentStatus = await advancedSlotSwap(updateDeploymentStatus, appServiceSourceSlot, appServiceTargetSlot, appServiceSourceSlotUtils, appServiceTargetSlotUtils);
await appServiceSourceSlot.swap(targetSlot, preserveVnet);
break;
}
case "Start Swap With Preview": {
updateDeploymentStatus = await advancedSlotSwap(updateDeploymentStatus, appServiceSourceSlot, appServiceTargetSlot, appServiceSourceSlotUtils, appServiceTargetSlotUtils);
await appServiceSourceSlot.swapSlotWithPreview(targetSlot, preserveVnet);
break;
}
case "Cancel Swap": {
appServiceSourceSlot = new AzureAppService(azureEndpoint, resourceGroupName, webAppName, slotName);
appServiceSourceSlot.cancelSwapSlotWithPreview();
break;
}
case "Start all continuous webjobs": {
await kuduServiceUtils.startContinuousWebJobs();
break;
}
case "Stop all continuous webjobs": {
await kuduServiceUtils.stopContinuousWebJobs();
break;
}
case "Install Extensions": {
let extensionOutputVariablesArray = (extensionOutputVariables) ? extensionOutputVariables.split(',') : [];
await kuduServiceUtils.installSiteExtensions(extensionList.split(','), extensionOutputVariablesArray);
break;
}
case "Enable Continuous Monitoring": {
let appInsights: AzureApplicationInsights = new AzureApplicationInsights(azureEndpoint, appInsightsResourceGroupName, appInsightsResourceName);
await enableContinuousMonitoring(azureEndpoint, appService, appInsights, appInsightsWebTestName);
break;
}
default: {
throw Error(tl.loc('InvalidAction'));
}
}
}
catch(exception) {
taskResult = false;
errorMessage = exception;
}
tl.debug('Completed action');
try {
switch(action) {
case "Complete Swap":
case "Swap Slots": {
if(appServiceSourceSlotUtils && appServiceTargetSlotUtils && updateDeploymentStatus) {
let sourceSlotKuduService = await appServiceSourceSlotUtils.getKuduService();
let targetSlotKuduService = await appServiceTargetSlotUtils.getKuduService();
let sourceSlotKuduServiceUtils = new KuduServiceUtils(sourceSlotKuduService);
let targetSlotKuduServiceUtils = new KuduServiceUtils(targetSlotKuduService);
let customMessage = {
'type': 'SlotSwap',
'sourceSlot': appServiceSourceSlot.getSlot(),
'targetSlot': appServiceTargetSlot.getSlot()
}
let DeploymentID = await sourceSlotKuduServiceUtils.updateDeploymentStatus(taskResult, null, customMessage);
await targetSlotKuduServiceUtils.updateDeploymentStatus(taskResult, DeploymentID, customMessage);
}
break;
}
case "Install Extensions": {
if(kuduServiceUtils) {
await kuduServiceUtils.updateDeploymentStatus(taskResult, null, { "type" : action });
}
break;
}
default: {
tl.debug(`deployment status not updated for action: ${action}`);
}
}
}
catch(error) {
tl.debug(error);
}
finally {
dispose();
}
if (!taskResult) {
tl.setResult(tl.TaskResult.Failed, errorMessage);
}
}