From 1b462436a2255c5bf702d94b3b2247509eec0244 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Mon, 27 Jan 2025 16:48:04 -0800 Subject: [PATCH 01/12] WIP: First pass generic client call impl --- package-lock.json | 56 ++--- package.json | 6 +- .../createWebApp/IWebAppWizardContext.ts | 4 +- src/commands/createWebApp/createWebApp.ts | 4 +- .../createWebApp/webAppInterim/README.md | 1 + .../webAppInterim/WebAppInterimCreateStep.ts | 213 ++++++++++++++++++ .../webAppInterim/webAppInterimTypes.ts | 28 +++ 7 files changed, 277 insertions(+), 35 deletions(-) create mode 100644 src/commands/createWebApp/webAppInterim/README.md create mode 100644 src/commands/createWebApp/webAppInterim/WebAppInterimCreateStep.ts create mode 100644 src/commands/createWebApp/webAppInterim/webAppInterimTypes.ts diff --git a/package-lock.json b/package-lock.json index e299f091..5d45cc74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,15 +9,15 @@ "version": "0.25.4", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@azure/arm-appservice": "^13.0.2", + "@azure/arm-appservice": "^15.0.0", "@azure/arm-resources": "^5.0.0", "@azure/core-client": "^1.7.3", "@azure/core-rest-pipeline": "^1.11.0", - "@microsoft/vscode-azext-azureappservice": "^3.1.0", + "@microsoft/vscode-azext-azureappservice": "^3.3.1", "@microsoft/vscode-azext-azureappsettings": "^0.2.0", "@microsoft/vscode-azext-azureutils": "^3.1.1", "@microsoft/vscode-azext-utils": "^2.5.7", - "@microsoft/vscode-azureresources-api": "^2.1.0", + "@microsoft/vscode-azureresources-api": "^2.3.2", "dotenv": "^6.2.0", "fast-xml-parser": "^4.4.1", "fs-extra": "^8.0.0", @@ -80,20 +80,20 @@ } }, "node_modules/@azure/arm-appservice": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@azure/arm-appservice/-/arm-appservice-13.0.3.tgz", - "integrity": "sha512-Vu011o3/bikQNwtjouwmUJud+Z6Brcjij2D0omPWClRGg8i5gBfOYSpDkFGkHbhGlaky4fgvfkxD0uHGq34uYA==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@azure/arm-appservice/-/arm-appservice-15.0.0.tgz", + "integrity": "sha512-huJ2uFDXB7w0cYKqxhzYOHuTsuLCY1e0xmWFF8G3KpDbQGnFDM3AVNtxWPas50OxuSWClblqSaExiS/XnWhTTg==", "dependencies": { "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-client": "^1.6.1", - "@azure/core-lro": "^2.2.0", + "@azure/core-auth": "^1.6.0", + "@azure/core-client": "^1.7.0", + "@azure/core-lro": "^2.5.4", "@azure/core-paging": "^1.2.0", - "@azure/core-rest-pipeline": "^1.8.0", + "@azure/core-rest-pipeline": "^1.14.0", "tslib": "^2.2.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/arm-authorization": { @@ -858,13 +858,13 @@ } }, "node_modules/@microsoft/vscode-azext-azureappservice": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-azureappservice/-/vscode-azext-azureappservice-3.1.0.tgz", - "integrity": "sha512-w+0AJnb+Vygy1LX3WfVa5m2Si1bHH6ZoR4QSg7Y/Tw13hC4IfsOlD2cu6nrSaOKpZFLbu2Q5v4btDnsDNWJ2Hw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-azureappservice/-/vscode-azext-azureappservice-3.3.1.tgz", + "integrity": "sha512-l6Hr3mPDjZmrX6U6zC6pKc8G3Och5muJvUUY4q90Fh0mSLSNaor+U93BJj5fpEXkoqP+uun8/6N6V/tXsLPALQ==", "dependencies": { "@azure/abort-controller": "^1.0.4", "@azure/arm-appinsights": "^5.0.0-beta.4", - "@azure/arm-appservice": "^13.0.2", + "@azure/arm-appservice": "^15.0.0", "@azure/arm-operationalinsights": "^8.0.1", "@azure/arm-resourcegraph": "^5.0.0-beta.3", "@azure/arm-resources-subscriptions": "^2.0.1", @@ -873,7 +873,7 @@ "@azure/storage-blob": "^12.3.0", "@microsoft/vscode-azext-azureutils": "^3.0.0", "@microsoft/vscode-azext-github": "^1.0.0", - "@microsoft/vscode-azext-utils": "^2.2.0", + "@microsoft/vscode-azext-utils": "^2.5.0", "dayjs": "^1.11.2", "fs-extra": "^10.0.0", "p-retry": "^3.0.1", @@ -9487,16 +9487,16 @@ } }, "@azure/arm-appservice": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@azure/arm-appservice/-/arm-appservice-13.0.3.tgz", - "integrity": "sha512-Vu011o3/bikQNwtjouwmUJud+Z6Brcjij2D0omPWClRGg8i5gBfOYSpDkFGkHbhGlaky4fgvfkxD0uHGq34uYA==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@azure/arm-appservice/-/arm-appservice-15.0.0.tgz", + "integrity": "sha512-huJ2uFDXB7w0cYKqxhzYOHuTsuLCY1e0xmWFF8G3KpDbQGnFDM3AVNtxWPas50OxuSWClblqSaExiS/XnWhTTg==", "requires": { "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-client": "^1.6.1", - "@azure/core-lro": "^2.2.0", + "@azure/core-auth": "^1.6.0", + "@azure/core-client": "^1.7.0", + "@azure/core-lro": "^2.5.4", "@azure/core-paging": "^1.2.0", - "@azure/core-rest-pipeline": "^1.8.0", + "@azure/core-rest-pipeline": "^1.14.0", "tslib": "^2.2.0" } }, @@ -10120,13 +10120,13 @@ } }, "@microsoft/vscode-azext-azureappservice": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-azureappservice/-/vscode-azext-azureappservice-3.1.0.tgz", - "integrity": "sha512-w+0AJnb+Vygy1LX3WfVa5m2Si1bHH6ZoR4QSg7Y/Tw13hC4IfsOlD2cu6nrSaOKpZFLbu2Q5v4btDnsDNWJ2Hw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-azureappservice/-/vscode-azext-azureappservice-3.3.1.tgz", + "integrity": "sha512-l6Hr3mPDjZmrX6U6zC6pKc8G3Och5muJvUUY4q90Fh0mSLSNaor+U93BJj5fpEXkoqP+uun8/6N6V/tXsLPALQ==", "requires": { "@azure/abort-controller": "^1.0.4", "@azure/arm-appinsights": "^5.0.0-beta.4", - "@azure/arm-appservice": "^13.0.2", + "@azure/arm-appservice": "^15.0.0", "@azure/arm-operationalinsights": "^8.0.1", "@azure/arm-resourcegraph": "^5.0.0-beta.3", "@azure/arm-resources-subscriptions": "^2.0.1", @@ -10135,7 +10135,7 @@ "@azure/storage-blob": "^12.3.0", "@microsoft/vscode-azext-azureutils": "^3.0.0", "@microsoft/vscode-azext-github": "^1.0.0", - "@microsoft/vscode-azext-utils": "^2.2.0", + "@microsoft/vscode-azext-utils": "^2.5.0", "dayjs": "^1.11.2", "fs-extra": "^10.0.0", "p-retry": "^3.0.1", diff --git a/package.json b/package.json index 80a73c74..1d5809d3 100644 --- a/package.json +++ b/package.json @@ -773,15 +773,15 @@ "webpack-cli": "^4.6.0" }, "dependencies": { - "@azure/arm-appservice": "^13.0.2", + "@azure/arm-appservice": "^15.0.0", "@azure/arm-resources": "^5.0.0", "@azure/core-client": "^1.7.3", "@azure/core-rest-pipeline": "^1.11.0", - "@microsoft/vscode-azext-azureappservice": "^3.1.0", + "@microsoft/vscode-azext-azureappservice": "^3.3.1", "@microsoft/vscode-azext-azureappsettings": "^0.2.0", "@microsoft/vscode-azext-azureutils": "^3.1.1", "@microsoft/vscode-azext-utils": "^2.5.7", - "@microsoft/vscode-azureresources-api": "^2.1.0", + "@microsoft/vscode-azureresources-api": "^2.3.2", "dotenv": "^6.2.0", "fast-xml-parser": "^4.4.1", "fs-extra": "^8.0.0", diff --git a/src/commands/createWebApp/IWebAppWizardContext.ts b/src/commands/createWebApp/IWebAppWizardContext.ts index fff4460b..924932eb 100644 --- a/src/commands/createWebApp/IWebAppWizardContext.ts +++ b/src/commands/createWebApp/IWebAppWizardContext.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { type IAppServiceWizardContext } from '@microsoft/vscode-azext-azureappservice'; -import { type ExecuteActivityContext } from '@microsoft/vscode-azext-utils'; +import { type ExecuteActivityContext, type ISubscriptionActionContext } from '@microsoft/vscode-azext-utils'; import { type AppStackMajorVersion, type AppStackMinorVersion } from './stacks/models/AppStackModel'; import { type JavaContainers, type WebAppRuntimes, type WebAppStack, type WebAppStackValue } from './stacks/models/WebAppStackModel'; @@ -20,7 +20,7 @@ export type FullJavaStack = { minorVersion: AppStackMinorVersion; }; -export interface IWebAppWizardContext extends IAppServiceWizardContext, ExecuteActivityContext { +export interface IWebAppWizardContext extends ISubscriptionActionContext, IAppServiceWizardContext, ExecuteActivityContext { newSiteRuntime?: string; usingBackupStacks?: boolean; diff --git a/src/commands/createWebApp/createWebApp.ts b/src/commands/createWebApp/createWebApp.ts index 02681ad1..cabcea03 100644 --- a/src/commands/createWebApp/createWebApp.ts +++ b/src/commands/createWebApp/createWebApp.ts @@ -16,7 +16,7 @@ import { SetPostPromptDefaultsStep } from "./SetPostPromptDefaultsStep"; import { setPrePromptDefaults } from "./setPrePromptDefaults"; import { getCreatedWebAppMessage, showCreatedWebAppMessage } from "./showCreatedWebAppMessage"; import { WebAppStackStep } from "./stacks/WebAppStackStep"; -import { WebAppCreateStep } from "./WebAppCreateStep"; +import { WebAppInterimCreateStep } from "./webAppInterim/WebAppInterimCreateStep"; function isSubscription(item?: AzExtParentTreeItem): boolean { try { @@ -64,7 +64,7 @@ export async function createWebApp(context: IActionContext & Partial { + public priority: number = 140; + + public async execute(context: IWebAppWizardContext, progress: Progress<{ message?: string; increment?: number }>): Promise { + context.telemetry.properties.newSiteOS = context.newSiteOS; + context.telemetry.properties.newSiteStack = context.newSiteStack?.stack.value; + context.telemetry.properties.newSiteMajorVersion = context.newSiteStack?.majorVersion.value; + context.telemetry.properties.newSiteMinorVersion = context.newSiteStack?.minorVersion.value; + if (context.newSiteJavaStack) { + context.telemetry.properties.newSiteJavaStack = context.newSiteJavaStack.stack.value; + context.telemetry.properties.newSiteJavaMajorVersion = context.newSiteJavaStack.majorVersion.value; + context.telemetry.properties.newSiteJavaMinorVersion = context.newSiteJavaStack.minorVersion.value; + } + context.telemetry.properties.planSkuTier = context.plan && context.plan.sku && context.plan.sku.tier; + + const message: string = localize('creatingNewApp', 'Creating new web app "{0}"...', context.newSiteName); + ext.outputChannel.appendLog(message); + progress.report({ message }); + + const siteName: string = nonNullProp(context, 'newSiteName'); + const rgName: string = nonNullProp(nonNullProp(context, 'resourceGroup'), 'name'); + + const authToken = (await context.credentials.getToken() as { token?: string }).token; + const options: AzExtRequestPrepareOptions = { + url: `https://management.azure.com/subscriptions/${context.subscriptionId}/resourceGroups/${rgName}/providers/Microsoft.Web/sites/${siteName}?api-version=2024-04-01`, + method: 'PUT', + headers: createHttpHeaders({ + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${authToken}`, + }), + body: JSON.stringify(await this.getNewSite(context)), + }; + + const client = await createGenericClient(context, undefined); + const response = await client.sendRequest(createPipelineRequest(options)) as AzExtPipelineResponse; + + context.site = response.parsedBody as Site; + context.activityResult = context.site as AppResource; + } + + public shouldExecute(context: IWebAppWizardContext): boolean { + return !context.site; + } + + private async getNewSite(context: IWebAppWizardContext): Promise { + const location = await LocationListStep.getLocation(context, constants.webProvider); + const newSiteConfig: SiteConfig = this.getSiteConfig(context); + + const site: SiteInterim = { + name: context.newSiteName, + kind: this.getKind(context), + location: nonNullProp(location, 'name'), + properties: { + autoGeneratedDomainNameLabelScope: DomainNameLabelScope.Tenant, + clientAffinityEnabled: true, + serverFarmId: context.plan && context.plan.id, + reserved: context.newSiteOS === WebsiteOS.linux, // The secret property - must be set to true to make it a Linux plan. Confirmed by the team who owns this API. + siteConfig: newSiteConfig, + }, + }; + + if (context.customLocation) { + this.addCustomLocationProperties(site, context.customLocation); + } + + return site; + } + + private getKind(context: IWebAppWizardContext): string { + let kind: string = context.newSiteKind; + if (context.newSiteOS === 'linux') { + kind += ',linux'; + } + if (context.customLocation) { + kind += ',kubernetes'; + } + return kind; + } + + private addCustomLocationProperties(site: SiteInterim, customLocation: CustomLocation): void { + site.extendedLocation = { name: customLocation.id, type: 'customLocation' }; + } + + private getSiteConfig(context: IWebAppWizardContext): SiteConfig { + const newSiteConfig: SiteConfig = {}; + + newSiteConfig.appSettings = this.getAppSettings(context); + + const stack: FullWebAppStack = nonNullProp(context, 'newSiteStack'); + if (context.newSiteOS === WebsiteOS.linux) { + newSiteConfig.linuxFxVersion = stack.stack.value === 'java' ? + getJavaLinuxRuntime(stack.majorVersion.value, nonNullProp(context, 'newSiteJavaStack').minorVersion) : + nonNullProp(stack.minorVersion.stackSettings, 'linuxRuntimeSettings').runtimeVersion; + } else { + const runtimeVersion: string = nonNullProp(stack.minorVersion.stackSettings, 'windowsRuntimeSettings').runtimeVersion; + switch (stack.stack.value) { + case 'dotnet': + if (!/core/i.test(stack.minorVersion.displayText)) { // Filter out .NET _Core_ stacks because this is a .NET _Framework_ property + newSiteConfig.netFrameworkVersion = runtimeVersion; + } + break; + case 'php': + newSiteConfig.phpVersion = runtimeVersion; + break; + case 'node': + newSiteConfig.nodeVersion = runtimeVersion; + newSiteConfig.appSettings.push({ + name: 'WEBSITE_NODE_DEFAULT_VERSION', + value: runtimeVersion + }); + break; + case 'java': + newSiteConfig.javaVersion = runtimeVersion; + const javaStack: FullJavaStack = nonNullProp(context, 'newSiteJavaStack'); + const windowsStackSettings: WindowsJavaContainerSettings = nonNullProp(javaStack.minorVersion.stackSettings, 'windowsContainerSettings'); + newSiteConfig.javaContainer = windowsStackSettings.javaContainer; + newSiteConfig.javaContainerVersion = windowsStackSettings.javaContainerVersion; + break; + case 'python': + newSiteConfig.pythonVersion = runtimeVersion; + break; + default: + } + } + return newSiteConfig; + } + + private getAppSettings(context: IWebAppWizardContext): NameValuePair[] { + const appSettings: NameValuePair[] = []; + const disabled: string = 'disabled'; + const trueString: string = 'true'; + + const runtime: WebAppStackValue = nonNullProp(context, 'newSiteStack').stack.value; + if (context.newSiteOS === WebsiteOS.linux && (runtime === 'node' || runtime === 'python')) { + appSettings.push({ + name: 'SCM_DO_BUILD_DURING_DEPLOYMENT', + value: trueString + }); + } + if (context.appInsightsComponent) { + appSettings.push({ + name: 'APPLICATIONINSIGHTS_CONNECTION_STRING', + value: context.appInsightsComponent.connectionString + }); + + appSettings.push({ + name: 'ApplicationInsightsAgent_EXTENSION_VERSION', + value: context.newSiteOS === WebsiteOS.windows ? '~2' : '~3' // ~2 is for Windows, ~3 is for Linux + }); + + // all these settings are set on the portal if AI is enabled for Windows apps + if (context.newSiteOS === WebsiteOS.windows) { + appSettings.push( + { + name: 'APPINSIGHTS_PROFILERFEATURE_VERSION', + value: disabled + }, + { + name: 'APPINSIGHTS_SNAPSHOTFEATURE_VERSION', + value: disabled + }, + { + name: 'DiagnosticServices_EXTENSION_VERSION', + value: disabled + }, + { + name: 'InstrumentationEngine_EXTENSION_VERSION', + value: disabled + }, + { + name: 'SnapshotDebugger_EXTENSION_VERSION', + value: disabled + }, + { + name: 'XDT_MicrosoftApplicationInsights_BaseExtensions', + value: disabled + }, + { + name: 'XDT_MicrosoftApplicationInsights_Mode', + value: 'default' + }); + } else { + appSettings.push({ + name: 'APPLICATIONINSIGHTSAGENT_EXTENSION_ENABLED', + value: trueString + }); + } + } + + return appSettings; + } +} diff --git a/src/commands/createWebApp/webAppInterim/webAppInterimTypes.ts b/src/commands/createWebApp/webAppInterim/webAppInterimTypes.ts new file mode 100644 index 00000000..1ba839f2 --- /dev/null +++ b/src/commands/createWebApp/webAppInterim/webAppInterimTypes.ts @@ -0,0 +1,28 @@ +import { type SiteConfig } from "@azure/arm-appservice"; + +export enum DomainNameLabelScope { + Tenant = 'TenantReuse', + Subscription = 'SubscriptionReuse', + ResourceGroup = 'ResourceGroupReuse', + Global = 'NoReuse', +} + +export interface SiteInterim { + apiVersion?: string; + name?: string; + kind?: string; + location?: string; + extendedLocation?: { + name?: string; + type?: string; + }; + properties?: SitePropertiesInterim; +} + +export interface SitePropertiesInterim { + autoGeneratedDomainNameLabelScope: DomainNameLabelScope; + clientAffinityEnabled?: boolean; + reserved?: boolean; + serverFarmId?: string; + siteConfig?: SiteConfig; +} From ced0018e92e8388d381dfe8a08859443c90758fd Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Tue, 28 Jan 2025 12:30:47 -0800 Subject: [PATCH 02/12] Fix site return types --- .../webAppInterim/WebAppInterimCreateStep.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/commands/createWebApp/webAppInterim/WebAppInterimCreateStep.ts b/src/commands/createWebApp/webAppInterim/WebAppInterimCreateStep.ts index 5975ac4e..4cca3154 100644 --- a/src/commands/createWebApp/webAppInterim/WebAppInterimCreateStep.ts +++ b/src/commands/createWebApp/webAppInterim/WebAppInterimCreateStep.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { type NameValuePair, type Site, type SiteConfig } from '@azure/arm-appservice'; +import { type NameValuePair, type SiteConfig, type WebSiteManagementClient } from '@azure/arm-appservice'; import { createHttpHeaders, createPipelineRequest } from '@azure/core-rest-pipeline'; -import { WebsiteOS, type CustomLocation } from '@microsoft/vscode-azext-azureappservice'; +import { createWebSiteClient, WebsiteOS, type CustomLocation } from '@microsoft/vscode-azext-azureappservice'; import { createGenericClient, LocationListStep, type AzExtPipelineResponse, type AzExtRequestPrepareOptions } from '@microsoft/vscode-azext-azureutils'; import { AzureWizardExecuteStep } from '@microsoft/vscode-azext-utils'; import { type AppResource } from '@microsoft/vscode-azext-utils/hostapi'; @@ -41,6 +41,7 @@ export class WebAppInterimCreateStep extends AzureWizardExecuteStep Date: Tue, 28 Jan 2025 13:16:08 -0800 Subject: [PATCH 03/12] Finish basic scenario --- src/commands/createWebApp/createWebApp.ts | 2 +- src/commands/createWebApp/setPrePromptDefaults.ts | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/commands/createWebApp/createWebApp.ts b/src/commands/createWebApp/createWebApp.ts index cabcea03..edaaad00 100644 --- a/src/commands/createWebApp/createWebApp.ts +++ b/src/commands/createWebApp/createWebApp.ts @@ -53,9 +53,9 @@ export async function createWebApp(context: IActionContext & Partial Date: Tue, 28 Jan 2025 18:10:05 -0800 Subject: [PATCH 04/12] WIP: Appservice updates --- package-lock.json | 12 ++++++------ package.json | 2 +- src/commands/createWebApp/createWebApp.ts | 10 +++++++--- .../{webAppInterim => interimResources}/README.md | 0 .../WebAppInterimCreateStep.ts | 0 .../webAppInterimTypes.ts | 3 +-- 6 files changed, 15 insertions(+), 12 deletions(-) rename src/commands/createWebApp/{webAppInterim => interimResources}/README.md (100%) rename src/commands/createWebApp/{webAppInterim => interimResources}/WebAppInterimCreateStep.ts (100%) rename src/commands/createWebApp/{webAppInterim => interimResources}/webAppInterimTypes.ts (87%) diff --git a/package-lock.json b/package-lock.json index 5d45cc74..113d955a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@azure/arm-resources": "^5.0.0", "@azure/core-client": "^1.7.3", "@azure/core-rest-pipeline": "^1.11.0", - "@microsoft/vscode-azext-azureappservice": "^3.3.1", + "@microsoft/vscode-azext-azureappservice": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", "@microsoft/vscode-azext-azureappsettings": "^0.2.0", "@microsoft/vscode-azext-azureutils": "^3.1.1", "@microsoft/vscode-azext-utils": "^2.5.7", @@ -859,8 +859,9 @@ }, "node_modules/@microsoft/vscode-azext-azureappservice": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-azureappservice/-/vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-l6Hr3mPDjZmrX6U6zC6pKc8G3Och5muJvUUY4q90Fh0mSLSNaor+U93BJj5fpEXkoqP+uun8/6N6V/tXsLPALQ==", + "resolved": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", + "integrity": "sha512-g1+XdwC+q+iwId9mbv3YK6PV19+CJUYXZn+v44FgIjZAHFNwvoSs0yZs7oHy1ZswWRiOKnbVvJdetQl7TbLDow==", + "license": "MIT", "dependencies": { "@azure/abort-controller": "^1.0.4", "@azure/arm-appinsights": "^5.0.0-beta.4", @@ -10120,9 +10121,8 @@ } }, "@microsoft/vscode-azext-azureappservice": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-azureappservice/-/vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-l6Hr3mPDjZmrX6U6zC6pKc8G3Och5muJvUUY4q90Fh0mSLSNaor+U93BJj5fpEXkoqP+uun8/6N6V/tXsLPALQ==", + "version": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", + "integrity": "sha512-g1+XdwC+q+iwId9mbv3YK6PV19+CJUYXZn+v44FgIjZAHFNwvoSs0yZs7oHy1ZswWRiOKnbVvJdetQl7TbLDow==", "requires": { "@azure/abort-controller": "^1.0.4", "@azure/arm-appinsights": "^5.0.0-beta.4", diff --git a/package.json b/package.json index 1d5809d3..ea167057 100644 --- a/package.json +++ b/package.json @@ -777,7 +777,7 @@ "@azure/arm-resources": "^5.0.0", "@azure/core-client": "^1.7.3", "@azure/core-rest-pipeline": "^1.11.0", - "@microsoft/vscode-azext-azureappservice": "^3.3.1", + "@microsoft/vscode-azext-azureappservice": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", "@microsoft/vscode-azext-azureappsettings": "^0.2.0", "@microsoft/vscode-azext-azureutils": "^3.1.1", "@microsoft/vscode-azext-utils": "^2.5.7", diff --git a/src/commands/createWebApp/createWebApp.ts b/src/commands/createWebApp/createWebApp.ts index edaaad00..71ece1f2 100644 --- a/src/commands/createWebApp/createWebApp.ts +++ b/src/commands/createWebApp/createWebApp.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { AppInsightsCreateStep, AppInsightsListStep, AppKind, AppServicePlanCreateStep, AppServicePlanListStep, AppServicePlanSkuStep, CustomLocationListStep, LogAnalyticsCreateStep, ParsedSite, setLocationsTask, SiteNameStep } from "@microsoft/vscode-azext-azureappservice"; +import { AppInsightsCreateStep, AppInsightsListStep, AppKind, AppServicePlanCreateStep, AppServicePlanListStep, AppServicePlanSkuStep, CustomLocationListStep, LogAnalyticsCreateStep, ParsedSite, setLocationsTask, SiteDomainNameLabelScopeStep, SiteNameStep } from "@microsoft/vscode-azext-azureappservice"; import { LocationListStep, ResourceGroupCreateStep, ResourceGroupListStep, SubscriptionTreeItemBase, VerifyProvidersStep } from "@microsoft/vscode-azext-azureutils"; import { AzureWizard, maskUserInfo, nonNullProp, parseError, type AzExtParentTreeItem, type AzureWizardExecuteStep, type AzureWizardPromptStep, type IActionContext, type ICreateChildImplContext } from "@microsoft/vscode-azext-utils"; import { webProvider } from "../../constants"; @@ -11,12 +11,12 @@ import { ext } from "../../extensionVariables"; import { localize } from "../../localize"; import { SiteTreeItem } from "../../tree/SiteTreeItem"; import { createActivityContext } from "../../utils/activityUtils"; +import { WebAppInterimCreateStep } from "./interimResources/WebAppInterimCreateStep"; import { type IWebAppWizardContext } from "./IWebAppWizardContext"; import { SetPostPromptDefaultsStep } from "./SetPostPromptDefaultsStep"; import { setPrePromptDefaults } from "./setPrePromptDefaults"; import { getCreatedWebAppMessage, showCreatedWebAppMessage } from "./showCreatedWebAppMessage"; import { WebAppStackStep } from "./stacks/WebAppStackStep"; -import { WebAppInterimCreateStep } from "./webAppInterim/WebAppInterimCreateStep"; function isSubscription(item?: AzExtParentTreeItem): boolean { try { @@ -43,6 +43,11 @@ export async function createWebApp(context: IActionContext & Partial[] = []; const executeSteps: AzureWizardExecuteStep[] = []; + + // Add these steps to the front because we need the location information first for checking name availability later + LocationListStep.addStep(wizardContext, promptSteps); + promptSteps.push(new SiteDomainNameLabelScopeStep()); + const siteStep: SiteNameStep = new SiteNameStep(); promptSteps.push(siteStep); @@ -53,7 +58,6 @@ export async function createWebApp(context: IActionContext & Partial Date: Fri, 31 Jan 2025 12:05:50 -0800 Subject: [PATCH 05/12] Fully implemented, before feedback --- package-lock.json | 112 ++++-------------- package.json | 2 +- src/WebAppResolver.ts | 14 ++- src/commands/createWebApp/createWebApp.ts | 6 +- .../createWebApp/setPrePromptDefaults.ts | 6 +- src/tree/ResolvedWebAppResource.ts | 11 +- 6 files changed, 57 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index 113d955a..cab6632e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@microsoft/vscode-azext-azureappservice": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", "@microsoft/vscode-azext-azureappsettings": "^0.2.0", "@microsoft/vscode-azext-azureutils": "^3.1.1", - "@microsoft/vscode-azext-utils": "^2.5.7", + "@microsoft/vscode-azext-utils": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-2.5.13.tgz", "@microsoft/vscode-azureresources-api": "^2.3.2", "dotenv": "^6.2.0", "fast-xml-parser": "^4.4.1", @@ -860,7 +860,7 @@ "node_modules/@microsoft/vscode-azext-azureappservice": { "version": "3.3.1", "resolved": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-g1+XdwC+q+iwId9mbv3YK6PV19+CJUYXZn+v44FgIjZAHFNwvoSs0yZs7oHy1ZswWRiOKnbVvJdetQl7TbLDow==", + "integrity": "sha512-VGLbN6NzATDXm9NTaj4cMRfJhFJ41RFphIaKTozu2qJra7Ux4sJBfiMwr/f1LafLtxdiOGhx4Yj0Y37WT2Qyng==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^1.0.4", @@ -1080,9 +1080,10 @@ } }, "node_modules/@microsoft/vscode-azext-utils": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-utils/-/vscode-azext-utils-2.5.7.tgz", - "integrity": "sha512-ZZYsASAawR/JhIPeVsplIsN8JK5d3nc2IkIS7RE5AWbbWVtrheCPkS9OoNx+Roal1w3u7Bm0nYJ6eI5NaxnvJw==", + "version": "2.5.13", + "resolved": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-2.5.13.tgz", + "integrity": "sha512-0x9uW0VPCon/K3XwmedMuRc6F6S0b92FAlvaJHtzEi4EW1mek/1/nK8gLR2AP7rEaLOtq7sewoKdr9ejfs165g==", + "license": "MIT", "dependencies": { "@microsoft/vscode-azureresources-api": "^2.3.1", "@vscode/extension-telemetry": "^0.9.6", @@ -1091,7 +1092,7 @@ "html-to-text": "^8.2.0", "semver": "^7.3.7", "uuid": "^9.0.0", - "vscode-tas-client": "^0.1.47", + "vscode-tas-client": "^0.1.84", "vscode-uri": "^3.0.6" }, "peerDependencies": { @@ -2495,16 +2496,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/azure-devops-node-api": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.1.1.tgz", @@ -4306,25 +4297,6 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -7236,11 +7208,6 @@ "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -8246,12 +8213,9 @@ } }, "node_modules/tas-client": { - "version": "0.1.73", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.73.tgz", - "integrity": "sha512-UDdUF9kV2hYdlv+7AgqP2kXarVSUhjK7tg1BUflIRGEgND0/QoNpN64rcEuhEcM8AIbW65yrCopJWqRhLZ3m8w==", - "dependencies": { - "axios": "^1.6.1" - } + "version": "0.2.33", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.2.33.tgz", + "integrity": "sha512-V+uqV66BOQnWxvI6HjDnE4VkInmYZUQ4dgB7gzaDyFyFSK1i1nF/j7DpS9UbQAgV9NaF1XpcyuavnM1qOeiEIg==" }, "node_modules/teex": { "version": "1.0.1", @@ -8937,14 +8901,14 @@ "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==" }, "node_modules/vscode-tas-client": { - "version": "0.1.75", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.75.tgz", - "integrity": "sha512-/+ALFWPI4U3obeRvLFSt39guT7P9bZQrkmcLoiS+2HtzJ/7iPKNt5Sj+XTiitGlPYVFGFc0plxX8AAp6Uxs0xQ==", + "version": "0.1.84", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.84.tgz", + "integrity": "sha512-rUTrUopV+70hvx1hW5ebdw1nd6djxubkLvVxjGdyD/r5v/wcVF41LIfiAtbm5qLZDtQdsMH1IaCuDoluoIa88w==", "dependencies": { - "tas-client": "0.1.73" + "tas-client": "0.2.33" }, "engines": { - "vscode": "^1.19.1" + "vscode": "^1.85.0" } }, "node_modules/vscode-uri": { @@ -10122,7 +10086,7 @@ }, "@microsoft/vscode-azext-azureappservice": { "version": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-g1+XdwC+q+iwId9mbv3YK6PV19+CJUYXZn+v44FgIjZAHFNwvoSs0yZs7oHy1ZswWRiOKnbVvJdetQl7TbLDow==", + "integrity": "sha512-VGLbN6NzATDXm9NTaj4cMRfJhFJ41RFphIaKTozu2qJra7Ux4sJBfiMwr/f1LafLtxdiOGhx4Yj0Y37WT2Qyng==", "requires": { "@azure/abort-controller": "^1.0.4", "@azure/arm-appinsights": "^5.0.0-beta.4", @@ -10308,9 +10272,8 @@ } }, "@microsoft/vscode-azext-utils": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-utils/-/vscode-azext-utils-2.5.7.tgz", - "integrity": "sha512-ZZYsASAawR/JhIPeVsplIsN8JK5d3nc2IkIS7RE5AWbbWVtrheCPkS9OoNx+Roal1w3u7Bm0nYJ6eI5NaxnvJw==", + "version": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-2.5.13.tgz", + "integrity": "sha512-0x9uW0VPCon/K3XwmedMuRc6F6S0b92FAlvaJHtzEi4EW1mek/1/nK8gLR2AP7rEaLOtq7sewoKdr9ejfs165g==", "requires": { "@microsoft/vscode-azureresources-api": "^2.3.1", "@vscode/extension-telemetry": "^0.9.6", @@ -10319,7 +10282,7 @@ "html-to-text": "^8.2.0", "semver": "^7.3.7", "uuid": "^9.0.0", - "vscode-tas-client": "^0.1.47", + "vscode-tas-client": "^0.1.84", "vscode-uri": "^3.0.6" }, "dependencies": { @@ -11444,16 +11407,6 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, - "axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", - "requires": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "azure-devops-node-api": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.1.1.tgz", @@ -12817,11 +12770,6 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" - }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -14971,11 +14919,6 @@ "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -15736,12 +15679,9 @@ } }, "tas-client": { - "version": "0.1.73", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.73.tgz", - "integrity": "sha512-UDdUF9kV2hYdlv+7AgqP2kXarVSUhjK7tg1BUflIRGEgND0/QoNpN64rcEuhEcM8AIbW65yrCopJWqRhLZ3m8w==", - "requires": { - "axios": "^1.6.1" - } + "version": "0.2.33", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.2.33.tgz", + "integrity": "sha512-V+uqV66BOQnWxvI6HjDnE4VkInmYZUQ4dgB7gzaDyFyFSK1i1nF/j7DpS9UbQAgV9NaF1XpcyuavnM1qOeiEIg==" }, "teex": { "version": "1.0.1", @@ -16278,11 +16218,11 @@ "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==" }, "vscode-tas-client": { - "version": "0.1.75", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.75.tgz", - "integrity": "sha512-/+ALFWPI4U3obeRvLFSt39guT7P9bZQrkmcLoiS+2HtzJ/7iPKNt5Sj+XTiitGlPYVFGFc0plxX8AAp6Uxs0xQ==", + "version": "0.1.84", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.84.tgz", + "integrity": "sha512-rUTrUopV+70hvx1hW5ebdw1nd6djxubkLvVxjGdyD/r5v/wcVF41LIfiAtbm5qLZDtQdsMH1IaCuDoluoIa88w==", "requires": { - "tas-client": "0.1.73" + "tas-client": "0.2.33" } }, "vscode-uri": { diff --git a/package.json b/package.json index ea167057..09edb9f4 100644 --- a/package.json +++ b/package.json @@ -780,7 +780,7 @@ "@microsoft/vscode-azext-azureappservice": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", "@microsoft/vscode-azext-azureappsettings": "^0.2.0", "@microsoft/vscode-azext-azureutils": "^3.1.1", - "@microsoft/vscode-azext-utils": "^2.5.7", + "@microsoft/vscode-azext-utils": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-2.5.13.tgz", "@microsoft/vscode-azureresources-api": "^2.3.2", "dotenv": "^6.2.0", "fast-xml-parser": "^4.4.1", diff --git a/src/WebAppResolver.ts b/src/WebAppResolver.ts index b19d3769..c73a7ae6 100644 --- a/src/WebAppResolver.ts +++ b/src/WebAppResolver.ts @@ -1,6 +1,6 @@ import { type Site } from "@azure/arm-appservice"; import { uiUtils } from "@microsoft/vscode-azext-azureutils"; -import { callWithTelemetryAndErrorHandling, nonNullProp, nonNullValue, type IActionContext, type ISubscriptionContext } from "@microsoft/vscode-azext-utils"; +import { callWithTelemetryAndErrorHandling, nonNullProp, nonNullValue, nonNullValueAndProp, type IActionContext, type ISubscriptionContext } from "@microsoft/vscode-azext-utils"; import { type AppResource, type AppResourceResolver } from "@microsoft/vscode-azext-utils/hostapi"; import { ResolvedWebAppResource } from "./tree/ResolvedWebAppResource"; import { createWebSiteClient } from "./utils/azureClients"; @@ -9,6 +9,7 @@ export class WebAppResolver implements AppResourceResolver { private siteCacheLastUpdated = 0; private siteCache: Map = new Map(); + private siteNameCounter: Map = new Map(); private listWebAppsTask: Promise | undefined; public async resolveResource(subContext: ISubscriptionContext, resource: AppResource): Promise { @@ -21,6 +22,10 @@ export class WebAppResolver implements AppResourceResolver { this.siteCache.clear(); uiUtils.listAllIterator(client.webApps.list()).then((sites) => { for (const site of sites) { + const siteName: string = nonNullProp(site, 'name'); + const count: number = (this.siteNameCounter.get(siteName) ?? 0) + 1; + + this.siteNameCounter.set(siteName, count); this.siteCache.set(nonNullProp(site, 'id').toLowerCase(), site); } resolve(); @@ -33,7 +38,12 @@ export class WebAppResolver implements AppResourceResolver { await this.listWebAppsTask; const site = this.siteCache.get(nonNullProp(resource, 'id').toLowerCase()); - return new ResolvedWebAppResource(subContext, nonNullValue(site)); + + return new ResolvedWebAppResource(subContext, nonNullValue(site), { + // Multiple sites with the same name could be displayed as long as they are in different locations + // To help distinguish these apps for our users, lookahead and determine if the location should be provided for duplicate site names + showLocationAsTreeItemDescription: (this.siteNameCounter.get(nonNullValueAndProp(site, 'name')) ?? 1) > 1, + }); }); } diff --git a/src/commands/createWebApp/createWebApp.ts b/src/commands/createWebApp/createWebApp.ts index 71ece1f2..eadf2792 100644 --- a/src/commands/createWebApp/createWebApp.ts +++ b/src/commands/createWebApp/createWebApp.ts @@ -44,15 +44,17 @@ export async function createWebApp(context: IActionContext & Partial[] = []; const executeSteps: AzureWizardExecuteStep[] = []; - // Add these steps to the front because we need the location information first for checking name availability later + // Add these steps to the front because we need this information for checking site name availability LocationListStep.addStep(wizardContext, promptSteps); promptSteps.push(new SiteDomainNameLabelScopeStep()); + if (context.advancedCreation) { + promptSteps.push(new ResourceGroupListStep()); + } const siteStep: SiteNameStep = new SiteNameStep(); promptSteps.push(siteStep); if (context.advancedCreation) { - promptSteps.push(new ResourceGroupListStep()); promptSteps.push(new WebAppStackStep()); CustomLocationListStep.addStep(wizardContext, promptSteps); promptSteps.push(new AppServicePlanListStep()); diff --git a/src/commands/createWebApp/setPrePromptDefaults.ts b/src/commands/createWebApp/setPrePromptDefaults.ts index 503cb4ab..6ee8a4c2 100644 --- a/src/commands/createWebApp/setPrePromptDefaults.ts +++ b/src/commands/createWebApp/setPrePromptDefaults.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { type IDeployContext } from '@microsoft/vscode-azext-azureappservice'; +import { DomainNameLabelScope, type IDeployContext } from '@microsoft/vscode-azext-azureappservice'; import { LocationListStep } from '@microsoft/vscode-azext-azureutils'; import { type ICreateChildImplContext } from '@microsoft/vscode-azext-utils'; import * as fse from 'fs-extra'; @@ -34,4 +34,8 @@ export async function setPrePromptDefaults(wizardContext: IWebAppWizardContext & await LocationListStep.setLocation(wizardContext, 'westeurope'); } } + + if (!wizardContext.advancedCreation) { + wizardContext.newSiteDomainNameLabelScope = DomainNameLabelScope.Tenant; + } } diff --git a/src/tree/ResolvedWebAppResource.ts b/src/tree/ResolvedWebAppResource.ts index fdad7a6d..62f95be8 100644 --- a/src/tree/ResolvedWebAppResource.ts +++ b/src/tree/ResolvedWebAppResource.ts @@ -25,6 +25,10 @@ import { NotAvailableTreeItem } from './NotAvailableTreeItem'; import { type SiteTreeItem } from './SiteTreeItem'; import { WebJobsNATreeItem, WebJobsTreeItem } from './WebJobsTreeItem'; +type ResolvedWebAppResourceOptions = { + showLocationAsTreeItemDescription?: boolean; +}; + export function isResolvedWebAppResource(ti: unknown): ti is ResolvedWebAppResource { return (ti as unknown as ResolvedWebAppResource).instance === ResolvedWebAppResource.instance; } @@ -55,7 +59,7 @@ export class ResolvedWebAppResource implements ResolvedAppResourceBase, ISiteTre private _subscription: ISubscriptionContext; - constructor(subscription: ISubscriptionContext, site: Site) { + constructor(subscription: ISubscriptionContext, site: Site, readonly options?: ResolvedWebAppResourceOptions) { this.site = new ParsedSite(site, subscription); this._subscription = subscription; this.contextValuesToAdd = [this.site.isSlot ? ResolvedWebAppResource.slotContextValue : ResolvedWebAppResource.webAppContextValue]; @@ -86,7 +90,10 @@ export class ResolvedWebAppResource implements ResolvedAppResourceBase, ISiteTre } public get description(): string | undefined { - return this._state?.toLowerCase() !== 'running' ? this._state : undefined; + if (this._state?.toLowerCase() !== 'running') { + return this._state; + } + return this.options?.showLocationAsTreeItemDescription ? this.site.location : undefined; } public get logStreamLabel(): string { From 65896e1bcc9f83fde0cb50035d96c5b4352a0cc5 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Mon, 3 Feb 2025 12:03:37 -0800 Subject: [PATCH 06/12] WIP: Demo-able --- package-lock.json | 4 ++-- src/WebAppResolver.ts | 5 ++++- src/commands/createWebApp/createWebApp.ts | 14 +++++++++----- .../createWebApp/domainLabelScope/README.md | 1 + .../WebAppWithDomainLabelScopeCreateStep.ts} | 6 +++--- .../types.ts} | 8 +------- .../createWebApp/interimResources/README.md | 1 - 7 files changed, 20 insertions(+), 19 deletions(-) create mode 100644 src/commands/createWebApp/domainLabelScope/README.md rename src/commands/createWebApp/{interimResources/WebAppInterimCreateStep.ts => domainLabelScope/WebAppWithDomainLabelScopeCreateStep.ts} (97%) rename src/commands/createWebApp/{interimResources/webAppInterimTypes.ts => domainLabelScope/types.ts} (74%) delete mode 100644 src/commands/createWebApp/interimResources/README.md diff --git a/package-lock.json b/package-lock.json index cab6632e..78a86d49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -860,7 +860,7 @@ "node_modules/@microsoft/vscode-azext-azureappservice": { "version": "3.3.1", "resolved": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-VGLbN6NzATDXm9NTaj4cMRfJhFJ41RFphIaKTozu2qJra7Ux4sJBfiMwr/f1LafLtxdiOGhx4Yj0Y37WT2Qyng==", + "integrity": "sha512-d7qAbmz1nP8WU7BDmQEBD7C+fYHwE6fMrlCWvkFuP/QoBHlW8Nc5QWvC8j7PZOfP44qHcKEMoAbUp05sSbAycA==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^1.0.4", @@ -10086,7 +10086,7 @@ }, "@microsoft/vscode-azext-azureappservice": { "version": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-VGLbN6NzATDXm9NTaj4cMRfJhFJ41RFphIaKTozu2qJra7Ux4sJBfiMwr/f1LafLtxdiOGhx4Yj0Y37WT2Qyng==", + "integrity": "sha512-d7qAbmz1nP8WU7BDmQEBD7C+fYHwE6fMrlCWvkFuP/QoBHlW8Nc5QWvC8j7PZOfP44qHcKEMoAbUp05sSbAycA==", "requires": { "@azure/abort-controller": "^1.0.4", "@azure/arm-appinsights": "^5.0.0-beta.4", diff --git a/src/WebAppResolver.ts b/src/WebAppResolver.ts index c73a7ae6..48c9f16a 100644 --- a/src/WebAppResolver.ts +++ b/src/WebAppResolver.ts @@ -18,8 +18,11 @@ export class WebAppResolver implements AppResourceResolver { if (this.siteCacheLastUpdated < Date.now() - 1000 * 3) { this.siteCacheLastUpdated = Date.now(); + this.listWebAppsTask = new Promise((resolve, reject) => { this.siteCache.clear(); + this.siteNameCounter.clear(); + uiUtils.listAllIterator(client.webApps.list()).then((sites) => { for (const site of sites) { const siteName: string = nonNullProp(site, 'name'); @@ -41,7 +44,7 @@ export class WebAppResolver implements AppResourceResolver { return new ResolvedWebAppResource(subContext, nonNullValue(site), { // Multiple sites with the same name could be displayed as long as they are in different locations - // To help distinguish these apps for our users, lookahead and determine if the location should be provided for duplicate site names + // To help distinguish these apps for our users, lookahead and determine if the location should be provided for duplicated site names showLocationAsTreeItemDescription: (this.siteNameCounter.get(nonNullValueAndProp(site, 'name')) ?? 1) > 1, }); }); diff --git a/src/commands/createWebApp/createWebApp.ts b/src/commands/createWebApp/createWebApp.ts index eadf2792..eb744b86 100644 --- a/src/commands/createWebApp/createWebApp.ts +++ b/src/commands/createWebApp/createWebApp.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { AppInsightsCreateStep, AppInsightsListStep, AppKind, AppServicePlanCreateStep, AppServicePlanListStep, AppServicePlanSkuStep, CustomLocationListStep, LogAnalyticsCreateStep, ParsedSite, setLocationsTask, SiteDomainNameLabelScopeStep, SiteNameStep } from "@microsoft/vscode-azext-azureappservice"; +import { AppInsightsCreateStep, AppInsightsListStep, AppKind, AppServicePlanCreateStep, AppServicePlanListStep, AppServicePlanSkuStep, CustomLocationListStep, DomainNameLabelScope, LogAnalyticsCreateStep, ParsedSite, setLocationsTask, SiteDomainNameLabelScopeStep, SiteNameStep } from "@microsoft/vscode-azext-azureappservice"; import { LocationListStep, ResourceGroupCreateStep, ResourceGroupListStep, SubscriptionTreeItemBase, VerifyProvidersStep } from "@microsoft/vscode-azext-azureutils"; import { AzureWizard, maskUserInfo, nonNullProp, parseError, type AzExtParentTreeItem, type AzureWizardExecuteStep, type AzureWizardPromptStep, type IActionContext, type ICreateChildImplContext } from "@microsoft/vscode-azext-utils"; import { webProvider } from "../../constants"; @@ -11,12 +11,13 @@ import { ext } from "../../extensionVariables"; import { localize } from "../../localize"; import { SiteTreeItem } from "../../tree/SiteTreeItem"; import { createActivityContext } from "../../utils/activityUtils"; -import { WebAppInterimCreateStep } from "./interimResources/WebAppInterimCreateStep"; +import { WebAppWithDomainLabelScopeCreateStep } from "./domainLabelScope/WebAppWithDomainLabelScopeCreateStep"; import { type IWebAppWizardContext } from "./IWebAppWizardContext"; import { SetPostPromptDefaultsStep } from "./SetPostPromptDefaultsStep"; import { setPrePromptDefaults } from "./setPrePromptDefaults"; import { getCreatedWebAppMessage, showCreatedWebAppMessage } from "./showCreatedWebAppMessage"; import { WebAppStackStep } from "./stacks/WebAppStackStep"; +import { WebAppCreateStep } from "./WebAppCreateStep"; function isSubscription(item?: AzExtParentTreeItem): boolean { try { @@ -70,7 +71,6 @@ export async function createWebApp(context: IActionContext & Partial { +export class WebAppWithDomainLabelScopeCreateStep extends AzureWizardExecuteStep { public priority: number = 140; public async execute(context: IWebAppWizardContext, progress: Progress<{ message?: string; increment?: number }>): Promise { @@ -76,7 +76,7 @@ export class WebAppInterimCreateStep extends AzureWizardExecuteStep Date: Mon, 3 Feb 2025 12:09:00 -0800 Subject: [PATCH 07/12] Add copyright header --- src/commands/createWebApp/domainLabelScope/types.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/commands/createWebApp/domainLabelScope/types.ts b/src/commands/createWebApp/domainLabelScope/types.ts index f6778a7c..ab7f742f 100644 --- a/src/commands/createWebApp/domainLabelScope/types.ts +++ b/src/commands/createWebApp/domainLabelScope/types.ts @@ -1,3 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + import { type SiteConfig } from "@azure/arm-appservice"; import { type DomainNameLabelScope } from "@microsoft/vscode-azext-azureappservice"; From 3503a7a608274966c45961a0a86f06dca5a9bfac Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Mon, 3 Feb 2025 12:43:20 -0800 Subject: [PATCH 08/12] Rename types --- package-lock.json | 4 ++-- .../WebAppWithDomainLabelScopeCreateStep.ts | 8 ++++---- src/commands/createWebApp/domainLabelScope/types.ts | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78a86d49..ef6210f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -860,7 +860,7 @@ "node_modules/@microsoft/vscode-azext-azureappservice": { "version": "3.3.1", "resolved": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-d7qAbmz1nP8WU7BDmQEBD7C+fYHwE6fMrlCWvkFuP/QoBHlW8Nc5QWvC8j7PZOfP44qHcKEMoAbUp05sSbAycA==", + "integrity": "sha512-fl9mrX1PNSFW3qe2ta1x8kl8Y7GeIPFbnPDbXw6FgMc91gVquBPRH37LkGpVaL4BIv8jfxrRUoEfAx3hs2WymA==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^1.0.4", @@ -10086,7 +10086,7 @@ }, "@microsoft/vscode-azext-azureappservice": { "version": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-d7qAbmz1nP8WU7BDmQEBD7C+fYHwE6fMrlCWvkFuP/QoBHlW8Nc5QWvC8j7PZOfP44qHcKEMoAbUp05sSbAycA==", + "integrity": "sha512-fl9mrX1PNSFW3qe2ta1x8kl8Y7GeIPFbnPDbXw6FgMc91gVquBPRH37LkGpVaL4BIv8jfxrRUoEfAx3hs2WymA==", "requires": { "@azure/abort-controller": "^1.0.4", "@azure/arm-appinsights": "^5.0.0-beta.4", diff --git a/src/commands/createWebApp/domainLabelScope/WebAppWithDomainLabelScopeCreateStep.ts b/src/commands/createWebApp/domainLabelScope/WebAppWithDomainLabelScopeCreateStep.ts index 8ebcce95..0d4db8ce 100644 --- a/src/commands/createWebApp/domainLabelScope/WebAppWithDomainLabelScopeCreateStep.ts +++ b/src/commands/createWebApp/domainLabelScope/WebAppWithDomainLabelScopeCreateStep.ts @@ -17,7 +17,7 @@ import { nonNullProp } from '../../../utils/nonNull'; import { type FullJavaStack, type FullWebAppStack, type IWebAppWizardContext } from '../IWebAppWizardContext'; import { getJavaLinuxRuntime } from '../stacks/getJavaLinuxRuntime'; import { type WebAppStackValue, type WindowsJavaContainerSettings } from '../stacks/models/WebAppStackModel'; -import { type SiteInterim } from './types'; +import { type SitePayload } from './types'; export class WebAppWithDomainLabelScopeCreateStep extends AzureWizardExecuteStep { public priority: number = 140; @@ -67,11 +67,11 @@ export class WebAppWithDomainLabelScopeCreateStep extends AzureWizardExecuteStep return !context.site; } - private async getNewSite(context: IWebAppWizardContext): Promise { + private async getNewSite(context: IWebAppWizardContext): Promise { const location = await LocationListStep.getLocation(context, constants.webProvider); const newSiteConfig: SiteConfig = this.getSiteConfig(context); - const site: SiteInterim = { + const site: SitePayload = { name: context.newSiteName, kind: this.getKind(context), location: nonNullProp(location, 'name'), @@ -102,7 +102,7 @@ export class WebAppWithDomainLabelScopeCreateStep extends AzureWizardExecuteStep return kind; } - private addCustomLocationProperties(site: SiteInterim, customLocation: CustomLocation): void { + private addCustomLocationProperties(site: SitePayload, customLocation: CustomLocation): void { site.extendedLocation = { name: customLocation.id, type: 'customLocation' }; } diff --git a/src/commands/createWebApp/domainLabelScope/types.ts b/src/commands/createWebApp/domainLabelScope/types.ts index ab7f742f..fe42455d 100644 --- a/src/commands/createWebApp/domainLabelScope/types.ts +++ b/src/commands/createWebApp/domainLabelScope/types.ts @@ -6,7 +6,7 @@ import { type SiteConfig } from "@azure/arm-appservice"; import { type DomainNameLabelScope } from "@microsoft/vscode-azext-azureappservice"; -export interface SiteInterim { +export interface SitePayload { name?: string; kind?: string; location?: string; @@ -14,10 +14,10 @@ export interface SiteInterim { name?: string; type?: string; }; - properties?: SitePropertiesInterim; + properties?: SitePropertiesPayload; } -export interface SitePropertiesInterim { +export interface SitePropertiesPayload { autoGeneratedDomainNameLabelScope?: DomainNameLabelScope; clientAffinityEnabled?: boolean; reserved?: boolean; From b827efd7086a5bb1e2aa7e254234664a7520b866 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Tue, 4 Feb 2025 15:15:45 -0800 Subject: [PATCH 09/12] Update dep --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef6210f4..86b2440c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -860,7 +860,7 @@ "node_modules/@microsoft/vscode-azext-azureappservice": { "version": "3.3.1", "resolved": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-fl9mrX1PNSFW3qe2ta1x8kl8Y7GeIPFbnPDbXw6FgMc91gVquBPRH37LkGpVaL4BIv8jfxrRUoEfAx3hs2WymA==", + "integrity": "sha512-2WMGq+tv8knxIFDu/3CpMyaKSkcLBd5fcsVgtUnHwtgtiGG85FMIvB0Ywt1SRflqXgA48ZUOOvw0gKnIBy2CPg==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^1.0.4", @@ -874,7 +874,7 @@ "@azure/storage-blob": "^12.3.0", "@microsoft/vscode-azext-azureutils": "^3.0.0", "@microsoft/vscode-azext-github": "^1.0.0", - "@microsoft/vscode-azext-utils": "^2.5.0", + "@microsoft/vscode-azext-utils": "^2.5.13", "dayjs": "^1.11.2", "fs-extra": "^10.0.0", "p-retry": "^3.0.1", @@ -10086,7 +10086,7 @@ }, "@microsoft/vscode-azext-azureappservice": { "version": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-fl9mrX1PNSFW3qe2ta1x8kl8Y7GeIPFbnPDbXw6FgMc91gVquBPRH37LkGpVaL4BIv8jfxrRUoEfAx3hs2WymA==", + "integrity": "sha512-2WMGq+tv8knxIFDu/3CpMyaKSkcLBd5fcsVgtUnHwtgtiGG85FMIvB0Ywt1SRflqXgA48ZUOOvw0gKnIBy2CPg==", "requires": { "@azure/abort-controller": "^1.0.4", "@azure/arm-appinsights": "^5.0.0-beta.4", @@ -10099,7 +10099,7 @@ "@azure/storage-blob": "^12.3.0", "@microsoft/vscode-azext-azureutils": "^3.0.0", "@microsoft/vscode-azext-github": "^1.0.0", - "@microsoft/vscode-azext-utils": "^2.5.0", + "@microsoft/vscode-azext-utils": "^2.5.13", "dayjs": "^1.11.2", "fs-extra": "^10.0.0", "p-retry": "^3.0.1", From 95530d34595c9aa03de1ec98b1633f4c96debd24 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Wed, 5 Feb 2025 11:45:48 -0800 Subject: [PATCH 10/12] Add readme --- src/commands/createWebApp/domainLabelScope/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/commands/createWebApp/domainLabelScope/README.md b/src/commands/createWebApp/domainLabelScope/README.md index 8b137891..face65d3 100644 --- a/src/commands/createWebApp/domainLabelScope/README.md +++ b/src/commands/createWebApp/domainLabelScope/README.md @@ -1 +1,4 @@ +## Domain Label Scope + +The files in this folder are intended to be temporary because the App Service SDK does not currently support the required API version we need. Consequently, we needed to implement a custom call with custom types. In the future, we expect to be able to remove this folder and consolidate everything into a single web app creation file. From 34ad44663fb25173439987f756a22ec652d0b37c Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Mon, 10 Feb 2025 15:07:53 -0800 Subject: [PATCH 11/12] Update management endpoint --- package-lock.json | 12 ++++++------ package.json | 2 +- .../WebAppWithDomainLabelScopeCreateStep.ts | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86b2440c..6aa2d72c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@azure/arm-resources": "^5.0.0", "@azure/core-client": "^1.7.3", "@azure/core-rest-pipeline": "^1.11.0", - "@microsoft/vscode-azext-azureappservice": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", + "@microsoft/vscode-azext-azureappservice": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.4.0.tgz", "@microsoft/vscode-azext-azureappsettings": "^0.2.0", "@microsoft/vscode-azext-azureutils": "^3.1.1", "@microsoft/vscode-azext-utils": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-2.5.13.tgz", @@ -858,9 +858,9 @@ } }, "node_modules/@microsoft/vscode-azext-azureappservice": { - "version": "3.3.1", - "resolved": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-2WMGq+tv8knxIFDu/3CpMyaKSkcLBd5fcsVgtUnHwtgtiGG85FMIvB0Ywt1SRflqXgA48ZUOOvw0gKnIBy2CPg==", + "version": "3.4.0", + "resolved": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.4.0.tgz", + "integrity": "sha512-Us+ti2ZMUp877etXE+7ECdTIMEP6nahfmJPrkqQJOG353zLzG7/ur4ET0oVIrHLd9uvmyxsW3orTP/0BvWogKQ==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^1.0.4", @@ -10085,8 +10085,8 @@ } }, "@microsoft/vscode-azext-azureappservice": { - "version": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", - "integrity": "sha512-2WMGq+tv8knxIFDu/3CpMyaKSkcLBd5fcsVgtUnHwtgtiGG85FMIvB0Ywt1SRflqXgA48ZUOOvw0gKnIBy2CPg==", + "version": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.4.0.tgz", + "integrity": "sha512-Us+ti2ZMUp877etXE+7ECdTIMEP6nahfmJPrkqQJOG353zLzG7/ur4ET0oVIrHLd9uvmyxsW3orTP/0BvWogKQ==", "requires": { "@azure/abort-controller": "^1.0.4", "@azure/arm-appinsights": "^5.0.0-beta.4", diff --git a/package.json b/package.json index 09edb9f4..7a303a19 100644 --- a/package.json +++ b/package.json @@ -777,7 +777,7 @@ "@azure/arm-resources": "^5.0.0", "@azure/core-client": "^1.7.3", "@azure/core-rest-pipeline": "^1.11.0", - "@microsoft/vscode-azext-azureappservice": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.3.1.tgz", + "@microsoft/vscode-azext-azureappservice": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.4.0.tgz", "@microsoft/vscode-azext-azureappsettings": "^0.2.0", "@microsoft/vscode-azext-azureutils": "^3.1.1", "@microsoft/vscode-azext-utils": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-2.5.13.tgz", diff --git a/src/commands/createWebApp/domainLabelScope/WebAppWithDomainLabelScopeCreateStep.ts b/src/commands/createWebApp/domainLabelScope/WebAppWithDomainLabelScopeCreateStep.ts index 0d4db8ce..f703f96c 100644 --- a/src/commands/createWebApp/domainLabelScope/WebAppWithDomainLabelScopeCreateStep.ts +++ b/src/commands/createWebApp/domainLabelScope/WebAppWithDomainLabelScopeCreateStep.ts @@ -44,7 +44,7 @@ export class WebAppWithDomainLabelScopeCreateStep extends AzureWizardExecuteStep // The SDK does not currently support this updated api version, so we should make the call to the endpoint manually until the SDK gets updated const authToken = (await context.credentials.getToken() as { token?: string }).token; const options: AzExtRequestPrepareOptions = { - url: `https://management.azure.com/subscriptions/${context.subscriptionId}/resourceGroups/${rgName}/providers/Microsoft.Web/sites/${siteName}?api-version=2024-04-01`, + url: `${context.environment.resourceManagerEndpointUrl}subscriptions/${context.subscriptionId}/resourceGroups/${rgName}/providers/Microsoft.Web/sites/${siteName}?api-version=2024-04-01`, method: 'PUT', headers: createHttpHeaders({ 'Content-Type': 'application/json', From 3d91a944df5c41efb8b0fa4488084cfc12871129 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Fri, 28 Feb 2025 11:28:42 -0800 Subject: [PATCH 12/12] Revert package changes to baseline --- package-lock.json | 164 +++++++++++++++++++++++++++++++--------------- package.json | 8 +-- 2 files changed, 116 insertions(+), 56 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6aa2d72c..e299f091 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,15 +9,15 @@ "version": "0.25.4", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@azure/arm-appservice": "^15.0.0", + "@azure/arm-appservice": "^13.0.2", "@azure/arm-resources": "^5.0.0", "@azure/core-client": "^1.7.3", "@azure/core-rest-pipeline": "^1.11.0", - "@microsoft/vscode-azext-azureappservice": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.4.0.tgz", + "@microsoft/vscode-azext-azureappservice": "^3.1.0", "@microsoft/vscode-azext-azureappsettings": "^0.2.0", "@microsoft/vscode-azext-azureutils": "^3.1.1", - "@microsoft/vscode-azext-utils": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-2.5.13.tgz", - "@microsoft/vscode-azureresources-api": "^2.3.2", + "@microsoft/vscode-azext-utils": "^2.5.7", + "@microsoft/vscode-azureresources-api": "^2.1.0", "dotenv": "^6.2.0", "fast-xml-parser": "^4.4.1", "fs-extra": "^8.0.0", @@ -80,20 +80,20 @@ } }, "node_modules/@azure/arm-appservice": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@azure/arm-appservice/-/arm-appservice-15.0.0.tgz", - "integrity": "sha512-huJ2uFDXB7w0cYKqxhzYOHuTsuLCY1e0xmWFF8G3KpDbQGnFDM3AVNtxWPas50OxuSWClblqSaExiS/XnWhTTg==", + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@azure/arm-appservice/-/arm-appservice-13.0.3.tgz", + "integrity": "sha512-Vu011o3/bikQNwtjouwmUJud+Z6Brcjij2D0omPWClRGg8i5gBfOYSpDkFGkHbhGlaky4fgvfkxD0uHGq34uYA==", "dependencies": { "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.6.0", - "@azure/core-client": "^1.7.0", - "@azure/core-lro": "^2.5.4", + "@azure/core-auth": "^1.3.0", + "@azure/core-client": "^1.6.1", + "@azure/core-lro": "^2.2.0", "@azure/core-paging": "^1.2.0", - "@azure/core-rest-pipeline": "^1.14.0", + "@azure/core-rest-pipeline": "^1.8.0", "tslib": "^2.2.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, "node_modules/@azure/arm-authorization": { @@ -858,14 +858,13 @@ } }, "node_modules/@microsoft/vscode-azext-azureappservice": { - "version": "3.4.0", - "resolved": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.4.0.tgz", - "integrity": "sha512-Us+ti2ZMUp877etXE+7ECdTIMEP6nahfmJPrkqQJOG353zLzG7/ur4ET0oVIrHLd9uvmyxsW3orTP/0BvWogKQ==", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-azureappservice/-/vscode-azext-azureappservice-3.1.0.tgz", + "integrity": "sha512-w+0AJnb+Vygy1LX3WfVa5m2Si1bHH6ZoR4QSg7Y/Tw13hC4IfsOlD2cu6nrSaOKpZFLbu2Q5v4btDnsDNWJ2Hw==", "dependencies": { "@azure/abort-controller": "^1.0.4", "@azure/arm-appinsights": "^5.0.0-beta.4", - "@azure/arm-appservice": "^15.0.0", + "@azure/arm-appservice": "^13.0.2", "@azure/arm-operationalinsights": "^8.0.1", "@azure/arm-resourcegraph": "^5.0.0-beta.3", "@azure/arm-resources-subscriptions": "^2.0.1", @@ -874,7 +873,7 @@ "@azure/storage-blob": "^12.3.0", "@microsoft/vscode-azext-azureutils": "^3.0.0", "@microsoft/vscode-azext-github": "^1.0.0", - "@microsoft/vscode-azext-utils": "^2.5.13", + "@microsoft/vscode-azext-utils": "^2.2.0", "dayjs": "^1.11.2", "fs-extra": "^10.0.0", "p-retry": "^3.0.1", @@ -1080,10 +1079,9 @@ } }, "node_modules/@microsoft/vscode-azext-utils": { - "version": "2.5.13", - "resolved": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-2.5.13.tgz", - "integrity": "sha512-0x9uW0VPCon/K3XwmedMuRc6F6S0b92FAlvaJHtzEi4EW1mek/1/nK8gLR2AP7rEaLOtq7sewoKdr9ejfs165g==", - "license": "MIT", + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-utils/-/vscode-azext-utils-2.5.7.tgz", + "integrity": "sha512-ZZYsASAawR/JhIPeVsplIsN8JK5d3nc2IkIS7RE5AWbbWVtrheCPkS9OoNx+Roal1w3u7Bm0nYJ6eI5NaxnvJw==", "dependencies": { "@microsoft/vscode-azureresources-api": "^2.3.1", "@vscode/extension-telemetry": "^0.9.6", @@ -1092,7 +1090,7 @@ "html-to-text": "^8.2.0", "semver": "^7.3.7", "uuid": "^9.0.0", - "vscode-tas-client": "^0.1.84", + "vscode-tas-client": "^0.1.47", "vscode-uri": "^3.0.6" }, "peerDependencies": { @@ -2496,6 +2494,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/azure-devops-node-api": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.1.1.tgz", @@ -4297,6 +4305,25 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -7208,6 +7235,11 @@ "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -8213,9 +8245,12 @@ } }, "node_modules/tas-client": { - "version": "0.2.33", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.2.33.tgz", - "integrity": "sha512-V+uqV66BOQnWxvI6HjDnE4VkInmYZUQ4dgB7gzaDyFyFSK1i1nF/j7DpS9UbQAgV9NaF1XpcyuavnM1qOeiEIg==" + "version": "0.1.73", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.73.tgz", + "integrity": "sha512-UDdUF9kV2hYdlv+7AgqP2kXarVSUhjK7tg1BUflIRGEgND0/QoNpN64rcEuhEcM8AIbW65yrCopJWqRhLZ3m8w==", + "dependencies": { + "axios": "^1.6.1" + } }, "node_modules/teex": { "version": "1.0.1", @@ -8901,14 +8936,14 @@ "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==" }, "node_modules/vscode-tas-client": { - "version": "0.1.84", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.84.tgz", - "integrity": "sha512-rUTrUopV+70hvx1hW5ebdw1nd6djxubkLvVxjGdyD/r5v/wcVF41LIfiAtbm5qLZDtQdsMH1IaCuDoluoIa88w==", + "version": "0.1.75", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.75.tgz", + "integrity": "sha512-/+ALFWPI4U3obeRvLFSt39guT7P9bZQrkmcLoiS+2HtzJ/7iPKNt5Sj+XTiitGlPYVFGFc0plxX8AAp6Uxs0xQ==", "dependencies": { - "tas-client": "0.2.33" + "tas-client": "0.1.73" }, "engines": { - "vscode": "^1.85.0" + "vscode": "^1.19.1" } }, "node_modules/vscode-uri": { @@ -9452,16 +9487,16 @@ } }, "@azure/arm-appservice": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@azure/arm-appservice/-/arm-appservice-15.0.0.tgz", - "integrity": "sha512-huJ2uFDXB7w0cYKqxhzYOHuTsuLCY1e0xmWFF8G3KpDbQGnFDM3AVNtxWPas50OxuSWClblqSaExiS/XnWhTTg==", + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@azure/arm-appservice/-/arm-appservice-13.0.3.tgz", + "integrity": "sha512-Vu011o3/bikQNwtjouwmUJud+Z6Brcjij2D0omPWClRGg8i5gBfOYSpDkFGkHbhGlaky4fgvfkxD0uHGq34uYA==", "requires": { "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.6.0", - "@azure/core-client": "^1.7.0", - "@azure/core-lro": "^2.5.4", + "@azure/core-auth": "^1.3.0", + "@azure/core-client": "^1.6.1", + "@azure/core-lro": "^2.2.0", "@azure/core-paging": "^1.2.0", - "@azure/core-rest-pipeline": "^1.14.0", + "@azure/core-rest-pipeline": "^1.8.0", "tslib": "^2.2.0" } }, @@ -10085,12 +10120,13 @@ } }, "@microsoft/vscode-azext-azureappservice": { - "version": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.4.0.tgz", - "integrity": "sha512-Us+ti2ZMUp877etXE+7ECdTIMEP6nahfmJPrkqQJOG353zLzG7/ur4ET0oVIrHLd9uvmyxsW3orTP/0BvWogKQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-azureappservice/-/vscode-azext-azureappservice-3.1.0.tgz", + "integrity": "sha512-w+0AJnb+Vygy1LX3WfVa5m2Si1bHH6ZoR4QSg7Y/Tw13hC4IfsOlD2cu6nrSaOKpZFLbu2Q5v4btDnsDNWJ2Hw==", "requires": { "@azure/abort-controller": "^1.0.4", "@azure/arm-appinsights": "^5.0.0-beta.4", - "@azure/arm-appservice": "^15.0.0", + "@azure/arm-appservice": "^13.0.2", "@azure/arm-operationalinsights": "^8.0.1", "@azure/arm-resourcegraph": "^5.0.0-beta.3", "@azure/arm-resources-subscriptions": "^2.0.1", @@ -10099,7 +10135,7 @@ "@azure/storage-blob": "^12.3.0", "@microsoft/vscode-azext-azureutils": "^3.0.0", "@microsoft/vscode-azext-github": "^1.0.0", - "@microsoft/vscode-azext-utils": "^2.5.13", + "@microsoft/vscode-azext-utils": "^2.2.0", "dayjs": "^1.11.2", "fs-extra": "^10.0.0", "p-retry": "^3.0.1", @@ -10272,8 +10308,9 @@ } }, "@microsoft/vscode-azext-utils": { - "version": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-2.5.13.tgz", - "integrity": "sha512-0x9uW0VPCon/K3XwmedMuRc6F6S0b92FAlvaJHtzEi4EW1mek/1/nK8gLR2AP7rEaLOtq7sewoKdr9ejfs165g==", + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-utils/-/vscode-azext-utils-2.5.7.tgz", + "integrity": "sha512-ZZYsASAawR/JhIPeVsplIsN8JK5d3nc2IkIS7RE5AWbbWVtrheCPkS9OoNx+Roal1w3u7Bm0nYJ6eI5NaxnvJw==", "requires": { "@microsoft/vscode-azureresources-api": "^2.3.1", "@vscode/extension-telemetry": "^0.9.6", @@ -10282,7 +10319,7 @@ "html-to-text": "^8.2.0", "semver": "^7.3.7", "uuid": "^9.0.0", - "vscode-tas-client": "^0.1.84", + "vscode-tas-client": "^0.1.47", "vscode-uri": "^3.0.6" }, "dependencies": { @@ -11407,6 +11444,16 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, + "axios": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "azure-devops-node-api": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.1.1.tgz", @@ -12770,6 +12817,11 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -14919,6 +14971,11 @@ "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -15679,9 +15736,12 @@ } }, "tas-client": { - "version": "0.2.33", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.2.33.tgz", - "integrity": "sha512-V+uqV66BOQnWxvI6HjDnE4VkInmYZUQ4dgB7gzaDyFyFSK1i1nF/j7DpS9UbQAgV9NaF1XpcyuavnM1qOeiEIg==" + "version": "0.1.73", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.73.tgz", + "integrity": "sha512-UDdUF9kV2hYdlv+7AgqP2kXarVSUhjK7tg1BUflIRGEgND0/QoNpN64rcEuhEcM8AIbW65yrCopJWqRhLZ3m8w==", + "requires": { + "axios": "^1.6.1" + } }, "teex": { "version": "1.0.1", @@ -16218,11 +16278,11 @@ "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==" }, "vscode-tas-client": { - "version": "0.1.84", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.84.tgz", - "integrity": "sha512-rUTrUopV+70hvx1hW5ebdw1nd6djxubkLvVxjGdyD/r5v/wcVF41LIfiAtbm5qLZDtQdsMH1IaCuDoluoIa88w==", + "version": "0.1.75", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.75.tgz", + "integrity": "sha512-/+ALFWPI4U3obeRvLFSt39guT7P9bZQrkmcLoiS+2HtzJ/7iPKNt5Sj+XTiitGlPYVFGFc0plxX8AAp6Uxs0xQ==", "requires": { - "tas-client": "0.2.33" + "tas-client": "0.1.73" } }, "vscode-uri": { diff --git a/package.json b/package.json index 7a303a19..80a73c74 100644 --- a/package.json +++ b/package.json @@ -773,15 +773,15 @@ "webpack-cli": "^4.6.0" }, "dependencies": { - "@azure/arm-appservice": "^15.0.0", + "@azure/arm-appservice": "^13.0.2", "@azure/arm-resources": "^5.0.0", "@azure/core-client": "^1.7.3", "@azure/core-rest-pipeline": "^1.11.0", - "@microsoft/vscode-azext-azureappservice": "file:../vscode-azuretools/appservice/microsoft-vscode-azext-azureappservice-3.4.0.tgz", + "@microsoft/vscode-azext-azureappservice": "^3.1.0", "@microsoft/vscode-azext-azureappsettings": "^0.2.0", "@microsoft/vscode-azext-azureutils": "^3.1.1", - "@microsoft/vscode-azext-utils": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-2.5.13.tgz", - "@microsoft/vscode-azureresources-api": "^2.3.2", + "@microsoft/vscode-azext-utils": "^2.5.7", + "@microsoft/vscode-azureresources-api": "^2.1.0", "dotenv": "^6.2.0", "fast-xml-parser": "^4.4.1", "fs-extra": "^8.0.0",