Skip to content

Commit e6069fd

Browse files
authored
Activity children and output log support for deployWorkspaceProject (#464)
1 parent b4d8d0a commit e6069fd

File tree

16 files changed

+379
-138
lines changed

16 files changed

+379
-138
lines changed

src/commands/createContainerApp/ContainerAppCreateStep.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@
55

66
import { ContainerAppsAPIClient, Ingress, KnownActiveRevisionsMode } from "@azure/arm-appcontainers";
77
import { LocationListStep } from "@microsoft/vscode-azext-azureutils";
8-
import { AzureWizardExecuteStep, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils";
9-
import { Progress } from "vscode";
10-
import { containerAppsWebProvider } from "../../constants";
8+
import { GenericTreeItem, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils";
9+
import type { Progress } from "vscode";
10+
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, containerAppsWebProvider } from "../../constants";
1111
import { ContainerAppItem } from "../../tree/ContainerAppItem";
12+
import { ExecuteActivityOutput, ExecuteActivityOutputStepBase } from "../../utils/activity/ExecuteActivityOutputStepBase";
13+
import { createActivityChildContext } from "../../utils/activity/activityUtils";
1214
import { createContainerAppsAPIClient } from "../../utils/azureClients";
1315
import { localize } from "../../utils/localize";
1416
import { getContainerNameForImage } from "../deployImage/imageSource/containerRegistry/getContainerNameForImage";
15-
import { ICreateContainerAppContext } from "./ICreateContainerAppContext";
17+
import type { ICreateContainerAppContext } from "./ICreateContainerAppContext";
1618

17-
export class ContainerAppCreateStep extends AzureWizardExecuteStep<ICreateContainerAppContext> {
19+
export class ContainerAppCreateStep extends ExecuteActivityOutputStepBase<ICreateContainerAppContext> {
1820
public priority: number = 750;
1921

20-
public async execute(context: ICreateContainerAppContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise<void> {
22+
protected async executeCore(context: ICreateContainerAppContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise<void> {
2123
const appClient: ContainerAppsAPIClient = await createContainerAppsAPIClient(context);
2224

2325
const resourceGroupName: string = nonNullValueAndProp(context.resourceGroup, 'name');
@@ -63,4 +65,26 @@ export class ContainerAppCreateStep extends AzureWizardExecuteStep<ICreateContai
6365
public shouldExecute(context: ICreateContainerAppContext): boolean {
6466
return !context.containerApp;
6567
}
68+
69+
protected createSuccessOutput(context: ICreateContainerAppContext): ExecuteActivityOutput {
70+
return {
71+
item: new GenericTreeItem(undefined, {
72+
contextValue: createActivityChildContext(['containerAppCreateStep', activitySuccessContext]),
73+
label: localize('createContainerApp', 'Create container app "{0}"', context.newContainerAppName),
74+
iconPath: activitySuccessIcon
75+
}),
76+
message: localize('createContainerAppSuccess', 'Created container app "{0}".', context.newContainerAppName)
77+
};
78+
}
79+
80+
protected createFailOutput(context: ICreateContainerAppContext): ExecuteActivityOutput {
81+
return {
82+
item: new GenericTreeItem(undefined, {
83+
contextValue: createActivityChildContext(['containerAppCreateStep', activityFailContext]),
84+
label: localize('createContainerApp', 'Create container app "{0}"', context.newContainerAppName),
85+
iconPath: activityFailIcon
86+
}),
87+
message: localize('createContainerAppFail', 'Failed to create container app "{0}".', context.newContainerAppName)
88+
};
89+
}
6690
}

src/commands/createManagedEnvironment/LogAnalyticsCreateStep.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55

66
import { LocationListStep } from "@microsoft/vscode-azext-azureutils";
77
import { GenericTreeItem } from "@microsoft/vscode-azext-utils";
8-
import { Progress } from "vscode";
8+
import type { Progress } from "vscode";
99
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon } from "../../constants";
1010
import { ExecuteActivityOutput, ExecuteActivityOutputStepBase } from "../../utils/activity/ExecuteActivityOutputStepBase";
1111
import { createActivityChildContext } from "../../utils/activity/activityUtils";
1212
import { createOperationalInsightsManagementClient } from "../../utils/azureClients";
1313
import { localize } from "../../utils/localize";
1414
import { nonNullProp } from "../../utils/nonNull";
15-
import { IManagedEnvironmentContext } from "./IManagedEnvironmentContext";
15+
import type { IManagedEnvironmentContext } from "./IManagedEnvironmentContext";
1616

1717
export class LogAnalyticsCreateStep extends ExecuteActivityOutputStepBase<IManagedEnvironmentContext> {
1818
public priority: number = 220;

src/commands/createManagedEnvironment/ManagedEnvironmentCreateStep.ts

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,56 +5,79 @@
55

66
import { ContainerAppsAPIClient } from "@azure/arm-appcontainers";
77
import { getResourceGroupFromId, LocationListStep } from "@microsoft/vscode-azext-azureutils";
8-
import { AzureWizardExecuteStep } from "@microsoft/vscode-azext-utils";
8+
import { GenericTreeItem } from "@microsoft/vscode-azext-utils";
99
import { Progress } from "vscode";
10-
import { managedEnvironmentsAppProvider } from "../../constants";
11-
import { ext } from "../../extensionVariables";
10+
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, managedEnvironmentsAppProvider } from "../../constants";
11+
import { createActivityChildContext } from "../../utils/activity/activityUtils";
12+
import { ExecuteActivityOutput, ExecuteActivityOutputStepBase } from "../../utils/activity/ExecuteActivityOutputStepBase";
1213
import { createContainerAppsAPIClient, createOperationalInsightsManagementClient } from '../../utils/azureClients';
1314
import { localize } from "../../utils/localize";
1415
import { nonNullProp, nonNullValueAndProp } from "../../utils/nonNull";
1516
import { IManagedEnvironmentContext } from "./IManagedEnvironmentContext";
1617

17-
export class ManagedEnvironmentCreateStep extends AzureWizardExecuteStep<IManagedEnvironmentContext> {
18+
export class ManagedEnvironmentCreateStep extends ExecuteActivityOutputStepBase<IManagedEnvironmentContext> {
1819
public priority: number = 250;
1920

20-
public async execute(context: IManagedEnvironmentContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise<void> {
21+
protected async executeCore(context: IManagedEnvironmentContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise<void> {
2122
const client: ContainerAppsAPIClient = await createContainerAppsAPIClient(context);
2223
const opClient = await createOperationalInsightsManagementClient(context);
23-
const rgName = nonNullValueAndProp(context.resourceGroup, 'name');
24+
25+
const resourceGroupName = nonNullValueAndProp(context.resourceGroup, 'name');
26+
const managedEnvironmentName = nonNullProp(context, 'newManagedEnvironmentName');
2427
const logAnalyticsWorkspace = nonNullProp(context, 'logAnalyticsWorkspace');
2528

26-
const creatingKuEnv: string = localize('creatingManagedEnvironment', 'Creating new Container Apps environment "{0}"...', context.newManagedEnvironmentName);
27-
progress.report({ message: creatingKuEnv });
28-
ext.outputChannel.appendLog(creatingKuEnv);
29+
const creating: string = localize('creatingManagedEnvironment', 'Creating environment...');
30+
progress.report({ message: creating });
2931

3032
const sharedKeys = await opClient.sharedKeysOperations.getSharedKeys(
3133
getResourceGroupFromId(nonNullProp(logAnalyticsWorkspace, 'id')),
3234
nonNullProp(logAnalyticsWorkspace, 'name'));
3335

34-
context.managedEnvironment = await client.managedEnvironments.beginCreateOrUpdateAndWait(rgName, nonNullProp(context, 'newManagedEnvironmentName'),
36+
context.managedEnvironment = await client.managedEnvironments.beginCreateOrUpdateAndWait(resourceGroupName, managedEnvironmentName,
3537
{
3638
location: (await LocationListStep.getLocation(context)).name,
3739
appLogsConfiguration: {
3840
"destination": "log-analytics",
3941
"logAnalyticsConfiguration": {
40-
"customerId": nonNullProp(context, 'logAnalyticsWorkspace').customerId,
42+
"customerId": logAnalyticsWorkspace.customerId,
4143
"sharedKey": sharedKeys.primarySharedKey
4244
}
4345
}
4446
}
4547
);
4648

47-
context.activityResult = {
48-
id: nonNullProp(context.managedEnvironment, 'id'),
49-
name: nonNullProp(context, 'newManagedEnvironmentName'),
50-
type: managedEnvironmentsAppProvider
49+
if (!context.activityChildren) {
50+
context.activityResult = {
51+
id: nonNullProp(context.managedEnvironment, 'id'),
52+
name: managedEnvironmentName,
53+
type: managedEnvironmentsAppProvider
54+
};
5155
}
52-
53-
const createdKuEnv: string = localize('createKuEnv', 'Successfully created new Container Apps environment "{0}".', context.newManagedEnvironmentName);
54-
ext.outputChannel.appendLog(createdKuEnv);
5556
}
5657

5758
public shouldExecute(context: IManagedEnvironmentContext): boolean {
5859
return !context.managedEnvironment;
5960
}
61+
62+
protected createSuccessOutput(context: IManagedEnvironmentContext): ExecuteActivityOutput {
63+
return {
64+
item: new GenericTreeItem(undefined, {
65+
contextValue: createActivityChildContext(['managedEnvironmentCreateStep', activitySuccessContext]),
66+
label: localize('createManagedEnvironment', 'Create container apps environment "{0}"', context.newManagedEnvironmentName),
67+
iconPath: activitySuccessIcon
68+
}),
69+
message: localize('createdManagedEnvironmentSuccess', 'Created container apps environment "{0}".', context.newManagedEnvironmentName)
70+
};
71+
}
72+
73+
protected createFailOutput(context: IManagedEnvironmentContext): ExecuteActivityOutput {
74+
return {
75+
item: new GenericTreeItem(undefined, {
76+
contextValue: createActivityChildContext(['managedEnvironmentCreateStep', activityFailContext]),
77+
label: localize('createManagedEnvironment', 'Create container apps environment "{0}"', context.newManagedEnvironmentName),
78+
iconPath: activityFailIcon
79+
}),
80+
message: localize('createdManagedEnvironmentFail', 'Failed to create container apps environment "{0}".', context.newManagedEnvironmentName)
81+
};
82+
}
6083
}

src/commands/deployImage/ContainerAppUpdateStep.ts

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

6-
import { AzureWizardExecuteStep, nonNullProp } from "@microsoft/vscode-azext-utils";
7-
import type { Progress } from "vscode";
6+
import { GenericTreeItem, nonNullProp } from "@microsoft/vscode-azext-utils";
7+
import { type Progress } from "vscode";
8+
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon } from "../../constants";
89
import { ext } from "../../extensionVariables";
910
import { ContainerAppModel, getContainerEnvelopeWithSecrets } from "../../tree/ContainerAppItem";
11+
import { ExecuteActivityOutput, ExecuteActivityOutputStepBase } from "../../utils/activity/ExecuteActivityOutputStepBase";
12+
import { createActivityChildContext } from "../../utils/activity/activityUtils";
1013
import { localize } from "../../utils/localize";
1114
import { updateContainerApp } from "../../utils/updateContainerApp";
1215
import type { IDeployImageContext } from "./deployImage";
1316
import { getContainerNameForImage } from "./imageSource/containerRegistry/getContainerNameForImage";
1417

15-
export class ContainerAppUpdateStep extends AzureWizardExecuteStep<IDeployImageContext> {
18+
export class ContainerAppUpdateStep extends ExecuteActivityOutputStepBase<IDeployImageContext> {
1619
public priority: number = 480;
1720

18-
public async execute(context: IDeployImageContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise<void> {
21+
protected async executeCore(context: IDeployImageContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise<void> {
1922
const containerApp: ContainerAppModel = nonNullProp(context, 'containerApp');
2023
const containerAppEnvelope = await getContainerEnvelopeWithSecrets(context, context.subscription, containerApp);
2124

@@ -44,4 +47,26 @@ export class ContainerAppUpdateStep extends AzureWizardExecuteStep<IDeployImageC
4447
public shouldExecute(context: IDeployImageContext): boolean {
4548
return !!context.containerApp;
4649
}
50+
51+
protected createSuccessOutput(context: IDeployImageContext): ExecuteActivityOutput {
52+
return {
53+
item: new GenericTreeItem(undefined, {
54+
contextValue: createActivityChildContext(['containerAppUpdateStep', activitySuccessContext]),
55+
label: localize('updateContainerAppLabel', 'Update container app "{0}"', context.containerApp?.name),
56+
iconPath: activitySuccessIcon
57+
}),
58+
message: localize('updateContainerAppSuccess', 'Updated container app "{0}".', context.containerApp?.name)
59+
};
60+
}
61+
62+
protected createFailOutput(context: IDeployImageContext): ExecuteActivityOutput {
63+
return {
64+
item: new GenericTreeItem(undefined, {
65+
contextValue: createActivityChildContext(['containerAppUpdateStep', activityFailContext]),
66+
label: localize('updateContainerAppLabel', 'Update container app "{0}"', context.containerApp?.name),
67+
iconPath: activityFailIcon
68+
}),
69+
message: localize('updateContainerAppFail', 'Failed to update container app "{0}".', context.containerApp?.name)
70+
};
71+
}
4772
}

src/commands/deployImage/deployImage.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@
33
* Licensed under the MIT License. See License.md in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55
import { VerifyProvidersStep } from "@microsoft/vscode-azext-azureutils";
6-
import { AzureWizard, AzureWizardExecuteStep, AzureWizardPromptStep, ITreeItemPickerContext, createSubscriptionContext } from "@microsoft/vscode-azext-utils";
6+
import { AzureWizard, AzureWizardExecuteStep, AzureWizardPromptStep, ExecuteActivityContext, ITreeItemPickerContext, createSubscriptionContext } from "@microsoft/vscode-azext-utils";
77
import { webProvider } from "../../constants";
88
import type { ContainerAppItem } from "../../tree/ContainerAppItem";
9+
import { createActivityContext } from "../../utils/activity/activityUtils";
910
import { localize } from "../../utils/localize";
1011
import { pickContainerApp } from "../../utils/pickItem/pickContainerApp";
1112
import { ContainerAppOverwriteConfirmStep } from "./ContainerAppOverwriteConfirmStep";
1213
import { ContainerAppUpdateStep } from "./ContainerAppUpdateStep";
1314
import type { ImageSourceBaseContext } from "./imageSource/ImageSourceBaseContext";
1415
import { ImageSourceListStep } from "./imageSource/ImageSourceListStep";
1516

16-
export type IDeployImageContext = ImageSourceBaseContext;
17+
export type IDeployImageContext = ImageSourceBaseContext & ExecuteActivityContext;
1718

1819
export async function deployImage(context: ITreeItemPickerContext & Partial<IDeployImageContext>, node?: ContainerAppItem): Promise<void> {
1920
if (!node) {
@@ -26,6 +27,7 @@ export async function deployImage(context: ITreeItemPickerContext & Partial<IDep
2627
const wizardContext: IDeployImageContext = {
2728
...context,
2829
...createSubscriptionContext(subscription),
30+
...await createActivityContext(),
2931
subscription,
3032
containerApp
3133
};

src/commands/deployImage/imageSource/EnvironmentVariablesListStep.ts

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

6-
import { AzExtFsExtra, AzureWizardPromptStep } from "@microsoft/vscode-azext-utils";
6+
import { AzExtFsExtra, AzureWizardPromptStep, GenericTreeItem } from "@microsoft/vscode-azext-utils";
77
import { DotenvParseOutput, parse } from "dotenv";
88
import { Uri, workspace } from "vscode";
9-
import { ImageSource } from "../../../constants";
9+
import { ImageSource, activitySuccessContext, activitySuccessIcon } from "../../../constants";
1010
import { ext } from "../../../extensionVariables";
11+
import { createActivityChildContext } from "../../../utils/activity/activityUtils";
1112
import { localize } from "../../../utils/localize";
1213
import { selectWorkspaceFile } from "../../../utils/workspaceUtils";
1314
import type { ImageSourceBaseContext } from "./ImageSourceBaseContext";
@@ -61,18 +62,18 @@ export class EnvironmentVariablesListStep extends AzureWizardPromptStep<ImageSou
6162
}
6263

6364
// Todo: It might be nice to add a direct command to update just the environment variables rather than having to suggest to re-run the entire command again
64-
private outputLogs(_context: ImageSourceBaseContext, setEnvironmentVariableOption: SetEnvironmentVariableOption): void {
65+
private outputLogs(context: ImageSourceBaseContext, setEnvironmentVariableOption: SetEnvironmentVariableOption): void {
6566
if (setEnvironmentVariableOption !== SetEnvironmentVariableOption.ProvideFile) {
66-
// context.activityChildren?.push(
67-
// new GenericTreeItem(undefined, {
68-
// contextValue: createActivityChildContext(['environmentVariablesListStep', setEnvironmentVariableOption, activitySuccessContext]),
69-
// label: localize('skipEnvVarsLabel',
70-
// 'Skip environment variable configuration' +
71-
// (setEnvironmentVariableOption === SetEnvironmentVariableOption.NoDotEnv ? ' (no .env files found)' : '')
72-
// ),
73-
// iconPath: activitySuccessIcon
74-
// })
75-
// );
67+
context.activityChildren?.push(
68+
new GenericTreeItem(undefined, {
69+
contextValue: createActivityChildContext(['environmentVariablesListStep', setEnvironmentVariableOption, activitySuccessContext]),
70+
label: localize('skipEnvVarsLabel',
71+
'Skip environment variable configuration' +
72+
(setEnvironmentVariableOption === SetEnvironmentVariableOption.NoDotEnv ? ' (no .env files found)' : '')
73+
),
74+
iconPath: activitySuccessIcon
75+
})
76+
);
7677

7778
const logMessage: string = localize('skippedEnvVarsMessage',
7879
'Skipped environment variable configuration for the container app' +
@@ -81,16 +82,15 @@ export class EnvironmentVariablesListStep extends AzureWizardPromptStep<ImageSou
8182
);
8283
ext.outputChannel.appendLog(logMessage);
8384
} else {
84-
// context.activityChildren?.push(
85-
// new GenericTreeItem(undefined, {
86-
// contextValue: createActivityChildContext(['environmentVariablesListStep', setEnvironmentVariableOption, activitySuccessContext]),
87-
// label: localize('saveEnvVarsLabel', 'Save environment variable configuration for the container app'),
88-
// iconPath: activitySuccessIcon
89-
// })
90-
// );
85+
context.activityChildren?.push(
86+
new GenericTreeItem(undefined, {
87+
contextValue: createActivityChildContext(['environmentVariablesListStep', setEnvironmentVariableOption, activitySuccessContext]),
88+
label: localize('saveEnvVarsLabel', 'Save environment variable configuration'),
89+
iconPath: activitySuccessIcon
90+
})
91+
);
9192

92-
ext.outputChannel.appendLog(localize('savedEnvVarsMessage', 'Saved environment variable configuration for the container app.'));
93+
ext.outputChannel.appendLog(localize('savedEnvVarsMessage', 'Saved environment variable configuration.'));
9394
}
9495
}
95-
9696
}

0 commit comments

Comments
 (0)