Skip to content

Commit abc7dbd

Browse files
authored
Add step to prompt about app's authentication type (#4500)
* Change casing, add auth type step * Localize quick picks. Default instance mem and max mem for basic creation due to excess prompts * Minor fixes
1 parent a852378 commit abc7dbd

File tree

6 files changed

+45
-19
lines changed

6 files changed

+45
-19
lines changed

src/commands/addMIConnections/SettingsAddBaseStep.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ function getClientIdAndCredentialPropertiesForRemote(context: AddMIConnectionsCo
158158
},
159159
{
160160
name: `${connectionName}__credential`,
161-
value: 'managedIdentity'
161+
value: 'managedidentity'
162162
}
163163
);
164164
}

src/commands/createFunctionApp/AuthenticationPromptStep.ts

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { UserAssignedIdentityListStep } from "@microsoft/vscode-azext-azureutils";
7-
import { AzureWizardPromptStep, type IAzureQuickPickOptions, type IWizardOptions } from "@microsoft/vscode-azext-utils";
6+
import { AzureWizardPromptStep, type AzureWizardExecuteStep, type IAzureQuickPickOptions, type IWizardOptions } from "@microsoft/vscode-azext-utils";
87
import { type QuickPickItem } from "vscode";
8+
9+
import { UserAssignedIdentityCreateStep, UserAssignedIdentityListStep } from "@microsoft/vscode-azext-azureutils";
10+
import { localize } from "../../localize";
911
import { type IFunctionAppWizardContext } from "./IFunctionAppWizardContext";
1012

1113
export class AuthenticationPromptStep<T extends IFunctionAppWizardContext> extends AzureWizardPromptStep<T> {
@@ -14,35 +16,44 @@ export class AuthenticationPromptStep<T extends IFunctionAppWizardContext> exten
1416
super();
1517
}
1618

17-
public async prompt(wizardContext: T): Promise<void> {
19+
public async prompt(context: T): Promise<void> {
1820
const options: IAzureQuickPickOptions = { placeHolder: 'Select resource authentication type', id: `AuthenticationPromptStep` };
19-
this._useManagedIdentity = (await wizardContext.ui.showQuickPick(this.getQuickPicks(wizardContext), options)).label === 'Managed identity';
21+
this._useManagedIdentity = (await context.ui.showQuickPick(this.getQuickPicks(context), options)).label === 'Managed identity';
2022
}
2123

22-
public shouldPrompt(wizardContext: T): boolean {
24+
public shouldPrompt(context: T): boolean {
2325
// don't need to prompt if the user has already selected a managed identity
24-
return !wizardContext.managedIdentity;
26+
return !context.managedIdentity;
2527
}
2628

27-
public async getSubWizard(_wizardContext: T): Promise<IWizardOptions<T> | undefined> {
29+
public async getSubWizard(context: T): Promise<IWizardOptions<T> | undefined> {
2830
if (this._useManagedIdentity) {
31+
const promptSteps: AzureWizardPromptStep<T>[] = [];
32+
const executeSteps: AzureWizardExecuteStep<T>[] = [];
33+
if (context.advancedCreation) {
34+
promptSteps.push(new UserAssignedIdentityListStep());
35+
} else {
36+
executeSteps.push(new UserAssignedIdentityCreateStep());
37+
}
38+
2939
return {
30-
promptSteps: [new UserAssignedIdentityListStep()],
31-
executeSteps: [],
40+
promptSteps,
41+
executeSteps
3242
}
3343
}
3444

3545
return undefined;
3646
}
3747

38-
private async getQuickPicks(_wizardContext: T): Promise<QuickPickItem[]> {
48+
private getQuickPicks(_context: T): QuickPickItem[] {
3949
return [
4050
{
41-
label: 'Secrets',
51+
label: localize('secrets', 'Secrets'),
52+
detail: localize('secretsDetails', 'Uses storage connection strings which may be insecure and expose sensitive credentials.')
4253
},
4354
{
44-
label: 'Managed identity',
45-
detail: 'For best security practice, use managed idenity authentication when available (some resources may only use secrets).',
55+
label: localize('managedIdentity', 'Managed identity'),
56+
detail: localize('managedIdentityDetails', 'For best security practice, use managed identity authentication when available.'),
4657
},
4758
]
4859
}

src/commands/createFunctionApp/createCreateFunctionAppComponents.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { AppInsightsCreateStep, AppInsightsListStep, AppKind, AppServicePlanCreateStep, AppServicePlanListStep, CustomLocationListStep, LogAnalyticsCreateStep, SiteNameStep, WebsiteOS, type IAppServiceWizardContext } from "@microsoft/vscode-azext-azureappservice";
7-
import { CommonRoleDefinitions, createRoleId, LocationListStep, ResourceGroupCreateStep, ResourceGroupListStep, RoleAssignmentExecuteStep, StorageAccountCreateStep, StorageAccountKind, StorageAccountListStep, StorageAccountPerformance, StorageAccountReplication, UserAssignedIdentityCreateStep, UserAssignedIdentityListStep, type INewStorageAccountDefaults, type Role } from "@microsoft/vscode-azext-azureutils";
7+
import { CommonRoleDefinitions, createRoleId, LocationListStep, ResourceGroupCreateStep, ResourceGroupListStep, RoleAssignmentExecuteStep, StorageAccountCreateStep, StorageAccountKind, StorageAccountListStep, StorageAccountPerformance, StorageAccountReplication, UserAssignedIdentityListStep, type INewStorageAccountDefaults, type Role } from "@microsoft/vscode-azext-azureutils";
88
import { type AzureWizardExecuteStep, type AzureWizardPromptStep, type ISubscriptionContext } from "@microsoft/vscode-azext-utils";
99
import { FuncVersion, latestGAVersion, tryParseFuncVersion } from "../../FuncVersion";
1010
import { funcVersionSetting } from "../../constants";
1111
import { tryGetLocalFuncVersion } from "../../funcCoreTools/tryGetLocalFuncVersion";
1212
import { type ICreateFunctionAppContext } from "../../tree/SubscriptionTreeItem";
1313
import { createActivityContext } from "../../utils/activityUtils";
1414
import { getRootFunctionsWorkerRuntime, getWorkspaceSetting, getWorkspaceSettingFromAnyFolder } from "../../vsCodeConfig/settings";
15+
import { AuthenticationPromptStep } from "./AuthenticationPromptStep";
1516
import { FunctionAppCreateStep } from "./FunctionAppCreateStep";
1617
import { FunctionAppHostingPlanStep } from "./FunctionAppHostingPlanStep";
1718
import { type IFunctionAppWizardContext } from "./IFunctionAppWizardContext";
@@ -64,6 +65,7 @@ export async function createCreateFunctionAppComponents(context: ICreateFunction
6465
promptSteps.push(...functionAppWizard.promptSteps);
6566
executeSteps.push(...functionAppWizard.executeSteps);
6667
}
68+
promptSteps.push(new AuthenticationPromptStep());
6769

6870
if (!wizardContext.advancedCreation) {
6971
LocationListStep.addStep(wizardContext, promptSteps);
@@ -73,7 +75,6 @@ export async function createCreateFunctionAppComponents(context: ICreateFunction
7375
executeSteps.push(new ResourceGroupCreateStep());
7476
executeSteps.push(new StorageAccountCreateStep(storageAccountCreateOptions));
7577
executeSteps.push(new AppInsightsCreateStep());
76-
executeSteps.push(new UserAssignedIdentityCreateStep());
7778
if (!context.dockerfilePath) {
7879
executeSteps.push(new AppServicePlanCreateStep());
7980
executeSteps.push(new LogAnalyticsCreateStep());
@@ -103,8 +104,8 @@ export async function createCreateFunctionAppComponents(context: ICreateFunction
103104
executeSteps.push(new RoleAssignmentExecuteStep(() => {
104105
const role: Role = {
105106
scopeId: wizardContext?.storageAccount?.id,
106-
roleDefinitionId: createRoleId(wizardContext?.subscriptionId, CommonRoleDefinitions.storageBlobDataOwner),
107-
roleDefinitionName: CommonRoleDefinitions.storageBlobDataOwner.roleName
107+
roleDefinitionId: createRoleId(wizardContext?.subscriptionId, CommonRoleDefinitions.storageBlobDataContributor),
108+
roleDefinitionName: CommonRoleDefinitions.storageBlobDataContributor.roleName
108109
};
109110

110111
return [role];

src/commands/createFunctionApp/flex/InstanceMemoryMBPromptStep.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ export class InstanceMemoryMBPromptStep extends AzureWizardPromptStep<IFlexFunct
2222
return !context.newFlexInstanceMemoryMB;
2323
}
2424

25+
public configureBeforePrompt(context: IFlexFunctionAppWizardContext): void | Promise<void> {
26+
// use default instance memory size if not using advanced creation
27+
if (!context.advancedCreation) {
28+
context.newFlexInstanceMemoryMB = context.newFlexSku?.instanceMemoryMB.find(im => im.isDefault)?.size;
29+
}
30+
}
31+
2532
private getPicks(flexSku: Sku): IAzureQuickPickItem<number>[] {
2633
const picks = flexSku.instanceMemoryMB.map(im => { return { label: im.size.toString(), data: im.size, description: im.isDefault ? 'Default' : undefined } });
2734
return picks.sort((a, b) => Number(!!b.description) - Number(!!a.description));

src/commands/createFunctionApp/flex/MaximumInstanceCountPromptStep.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ export class MaximumInstanceCountPromptStep extends AzureWizardPromptStep<IFlexF
2424
return !context.newFlexMaximumInstanceCount;
2525
}
2626

27+
public configureBeforePrompt(context: IFlexFunctionAppWizardContext): void | Promise<void> {
28+
// use default maximum instance count if not using advanced creation
29+
if (!context.advancedCreation) {
30+
context.newFlexMaximumInstanceCount = context.newFlexSku?.maximumInstanceCount.defaultValue;
31+
}
32+
}
33+
2734
private validateInput(flexSku: Sku, val: string): string | undefined {
2835
const num = Number(val);
2936

src/utils/managedIdentityUtils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export function createAzureWebJobsStorageManagedIdentitySettings(context: IFunct
3030
});
3131
appSettings.push({
3232
name: `${ConnectionKey.Storage}__credential`,
33-
value: 'managedIdentity'
33+
value: 'managedidentity'
3434
});
3535
}
3636

0 commit comments

Comments
 (0)