Skip to content

Commit 37cb055

Browse files
authored
Add ability to quickly convert existing environment variable to a secret (#825)
1 parent f666158 commit 37cb055

File tree

11 files changed

+151
-14
lines changed

11 files changed

+151
-14
lines changed

package.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,12 @@
226226
"shortTitle": "%containerApps.editEnvironmentVariableValue.shortTitle%",
227227
"category": "Azure Container Apps"
228228
},
229+
{
230+
"command": "containerApps.convertEnvironmentVariable",
231+
"title": "%containerApps.convertEnvironmentVariable.title%",
232+
"shortTitle": "%containerApps.convertEnvironmentVariable.shortTitle%",
233+
"category": "Azure Container Apps"
234+
},
229235
{
230236
"command": "containerApps.editEnvironmentVariables",
231237
"title": "%containerApps.editEnvironmentVariables%",
@@ -522,6 +528,11 @@
522528
"when": "view =~ /(azureResourceGroups|azureFocusView)/ && viewItem =~ /environmentVariableItem/i",
523529
"group": "1@2"
524530
},
531+
{
532+
"command": "containerApps.convertEnvironmentVariable",
533+
"when": "view =~ /(azureResourceGroups|azureFocusView)/ && viewItem =~ /environmentVariableItem/i",
534+
"group": "1@3"
535+
},
525536
{
526537
"command": "containerApps.deleteEnvironmentVariable",
527538
"when": "view =~ /(azureResourceGroups|azureFocusView)/ && viewItem =~ /environmentVariableItem/i",

package.nls.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
"containerApps.editEnvironmentVariableName.shortTitle": "Edit Name...",
1818
"containerApps.editEnvironmentVariableValue.title": "Edit Environment Variable Value...",
1919
"containerApps.editEnvironmentVariableValue.shortTitle": "Edit Value...",
20+
"containerApps.convertEnvironmentVariable.title": "Convert Environment Variable to Secret...",
21+
"containerApps.convertEnvironmentVariable.shortTitle": "Convert to Secret...",
2022
"containerApps.editEnvironmentVariables": "Edit Environment Variables (.env)...",
2123
"containerApps.deleteEnvironmentVariable.title": "Delete Environment Variable...",
2224
"containerApps.deleteEnvironmentVariable.shortTitle": "Delete...",

src/commands/EXECUTE_PRIORITY.md

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,31 +93,44 @@ When creating or updating resources, execute steps should occupy certain priorit
9393
- SecretCreateStep: 820
9494
- SecretUpdateStep: 850
9595

96-
### 8. Unallocated Space
96+
### 8. Environment Variables
9797

98-
<b>Priority Range</b>: 900 - 1090
98+
<b>Priority Range</b>: 900 - 990
99+
100+
#### Steps
101+
<!-- Bulk edit -->
102+
- EnvironmentVariablesEditDraftStep: 920 (single command)
103+
104+
<!-- Single edit -->
105+
- EnvironmentVariableAddDraftStep: 940 (single command)
106+
- EnvironmentVariableEditDraftStep: 960 (single command)
107+
- EnvironmentVariableDeleteDraftStep: 980 (single command)
108+
109+
### 9. Unallocated Space
110+
111+
<b>Priority Range</b>: 1000 - 1090
99112

100113
#### Steps
101114

102115
- Reserved for future commands TBD.
103116

104-
### 9. Scaling
117+
### 10. Scaling
105118

106119
<b>Priority Range</b>: 1100 - 1190
107120

108121
#### Steps
109122

110123
- AddScaleRuleStep: 1120 (revision draft)
111124

112-
### 10. Unallocated Space
125+
### 11. Unallocated Space
113126

114127
<b>Priority Range</b>: 1200 - 1390
115128

116129
#### Steps
117130

118131
- Reserved for future commands TBD.
119132

120-
### 11. Deploy
133+
### 12. Deploy
121134

122135
<b>Priority Range</b>: 1400 - 1490
123136

src/commands/environmentVariables/addEnvironmentVariable/EnvironmentVariableAddDraftStep.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { RevisionDraftUpdateBaseStep } from "../../revisionDraft/RevisionDraftUp
1212
import { type EnvironmentVariableAddContext } from "./EnvironmentVariableAddContext";
1313

1414
export class EnvironmentVariableAddDraftStep<T extends EnvironmentVariableAddContext> extends RevisionDraftUpdateBaseStep<T> {
15-
public priority: number = 590;
15+
public priority: number = 940;
1616

1717
constructor(baseItem: ContainerAppItem | RevisionsItemModel) {
1818
super(baseItem);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.md in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { type ContainerUpdateTelemetryProps as TelemetryProps } from "../../../telemetry/commandTelemetryProps";
7+
import { type SetTelemetryProps } from "../../../telemetry/SetTelemetryProps";
8+
import { type ISecretContext } from "../../secret/ISecretContext";
9+
import { type EnvironmentVariableEditBaseContext } from "../editEnvironmentVariable/EnvironmentVariableEditContext";
10+
11+
export interface EnvironmentVariableConvertBaseContext extends EnvironmentVariableEditBaseContext, ISecretContext {
12+
// Make newSecretValue required
13+
newSecretValue: string;
14+
}
15+
16+
export type EnvironmentVariableConvertContext = EnvironmentVariableConvertBaseContext & SetTelemetryProps<TelemetryProps>;
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.md in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { AzureWizard, createSubscriptionContext, nonNullValueAndProp, type IActionContext, type ISubscriptionContext } from "@microsoft/vscode-azext-utils";
7+
import { type EnvironmentVariableItem } from "../../../tree/containers/EnvironmentVariableItem";
8+
import { createActivityContext } from "../../../utils/activityUtils";
9+
import { getManagedEnvironmentFromContainerApp } from "../../../utils/getResourceUtils";
10+
import { getVerifyProvidersStep } from "../../../utils/getVerifyProvidersStep";
11+
import { localize } from "../../../utils/localize";
12+
import { pickEnvironmentVariable } from "../../../utils/pickItem/pickEnvironmentVariables";
13+
import { isTemplateItemEditable, TemplateItemNotEditableError } from "../../../utils/revisionDraftUtils";
14+
import { RevisionDraftDeployPromptStep } from "../../revisionDraft/RevisionDraftDeployPromptStep";
15+
import { SecretCreateStep } from "../../secret/addSecret/SecretCreateStep";
16+
import { SecretNameStep } from "../../secret/addSecret/SecretNameStep";
17+
import { EnvironmentVariableType } from "../addEnvironmentVariable/EnvironmentVariableTypeListStep";
18+
import { EnvironmentVariableEditDraftStep } from "../editEnvironmentVariable/EnvironmentVariableEditDraftStep";
19+
import { type EnvironmentVariableConvertContext } from "./EnvironmentVariableConvertContext";
20+
21+
/**
22+
* Automatically convert a 'Manual Input' environment variable to use a container app secret instead
23+
*/
24+
export async function convertEnvironmentVariable(context: IActionContext, node?: EnvironmentVariableItem): Promise<void> {
25+
const item: EnvironmentVariableItem = node ?? await pickEnvironmentVariable(context, { autoSelectDraft: true });
26+
const { subscription, containerApp } = item;
27+
28+
if (!isTemplateItemEditable(item)) {
29+
throw new TemplateItemNotEditableError(item);
30+
}
31+
32+
if (item.envVariable.secretRef) {
33+
throw new Error(localize('alreadySecret', 'The environment variable you chose to convert already uses a secret reference.'));
34+
}
35+
36+
const subscriptionContext: ISubscriptionContext = createSubscriptionContext(subscription);
37+
const wizardContext: EnvironmentVariableConvertContext = {
38+
...context,
39+
...subscriptionContext,
40+
...await createActivityContext(true),
41+
subscription,
42+
managedEnvironment: await getManagedEnvironmentFromContainerApp({ ...context, ...subscriptionContext }, containerApp),
43+
containerApp,
44+
containersIdx: item.containersIdx,
45+
environmentVariable: item.envVariable,
46+
newSecretValue: nonNullValueAndProp(item.envVariable, 'value'),
47+
newEnvironmentVariableType: EnvironmentVariableType.SecretRef,
48+
isDraftCommand: true,
49+
};
50+
wizardContext.telemetry.properties.revisionMode = containerApp.revisionsMode;
51+
52+
const wizard: AzureWizard<EnvironmentVariableConvertContext> = new AzureWizard(wizardContext, {
53+
title: localize('convertEnvironmentVariableTitle', 'Convert environment variable "{0}" to use a secret (draft)', wizardContext.environmentVariable.name),
54+
promptSteps: [
55+
new SecretNameStep(),
56+
new RevisionDraftDeployPromptStep(),
57+
],
58+
executeSteps: [
59+
getVerifyProvidersStep<EnvironmentVariableConvertContext>(),
60+
new SecretCreateStep(),
61+
new EnvironmentVariableEditDraftStep(item),
62+
],
63+
});
64+
65+
await wizard.prompt();
66+
wizardContext.activityTitle = localize('convertEnvironmentVariableActivityTitle', 'Convert environment variable "{0}" to use secret "{1}" (draft)', wizardContext.environmentVariable.name, wizardContext.newSecretName);
67+
await wizard.execute();
68+
}

src/commands/environmentVariables/deleteEnvironmentVariable/EnvironmentVariableDeleteDraftStep.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { RevisionDraftUpdateBaseStep } from "../../revisionDraft/RevisionDraftUp
1212
import { type EnvironmentVariableDeleteContext } from "./EnvironmentVariableDeleteContext";
1313

1414
export class EnvironmentVariableDeleteDraftStep<T extends EnvironmentVariableDeleteContext> extends RevisionDraftUpdateBaseStep<T> {
15-
public priority: number = 590;
15+
public priority: number = 980;
1616

1717
constructor(baseItem: ContainerAppItem | RevisionsItemModel) {
1818
super(baseItem);

src/commands/environmentVariables/editEnvironmentVariable/EnvironmentVariableEditContext.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import { type EnvironmentVar } from "@azure/arm-appcontainers";
77
import { type SetTelemetryProps } from "../../../telemetry/SetTelemetryProps";
88
import { type ContainerUpdateTelemetryProps as TelemetryProps } from "../../../telemetry/commandTelemetryProps";
9-
import { type EnvironmentVariableAddContext } from "../addEnvironmentVariable/EnvironmentVariableAddContext";
9+
import { type EnvironmentVariableAddBaseContext } from "../addEnvironmentVariable/EnvironmentVariableAddContext";
1010

11-
export interface EnvironmentVariableEditBaseContext extends EnvironmentVariableAddContext {
11+
export interface EnvironmentVariableEditBaseContext extends EnvironmentVariableAddBaseContext {
1212
// Require the environment variable upfront so we can make edits
1313
environmentVariable: EnvironmentVar;
1414
}

src/commands/environmentVariables/editEnvironmentVariable/EnvironmentVariableEditDraftStep.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { type Container, type EnvironmentVar } from "@azure/arm-appcontainers";
7-
import { nonNullValue } from "@microsoft/vscode-azext-utils";
7+
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, createUniversallyUniqueContextValue, GenericParentTreeItem, GenericTreeItem, nonNullValue, type ExecuteActivityOutput } from "@microsoft/vscode-azext-utils";
88
import { type Progress } from "vscode";
99
import { type ContainerAppItem } from "../../../tree/ContainerAppItem";
1010
import { type RevisionsItemModel } from "../../../tree/revisionManagement/RevisionItem";
@@ -14,7 +14,7 @@ import { EnvironmentVariableType } from "../addEnvironmentVariable/EnvironmentVa
1414
import { type EnvironmentVariableEditContext } from "./EnvironmentVariableEditContext";
1515

1616
export class EnvironmentVariableEditDraftStep<T extends EnvironmentVariableEditContext> extends RevisionDraftUpdateBaseStep<T> {
17-
public priority: number = 590;
17+
public priority: number = 960;
1818

1919
constructor(baseItem: ContainerAppItem | RevisionsItemModel) {
2020
super(baseItem);
@@ -49,4 +49,26 @@ export class EnvironmentVariableEditDraftStep<T extends EnvironmentVariableEditC
4949
public shouldExecute(context: T): boolean {
5050
return !!context.environmentVariable;
5151
}
52+
53+
public createSuccessOutput(): ExecuteActivityOutput {
54+
return {
55+
item: new GenericTreeItem(undefined, {
56+
contextValue: createUniversallyUniqueContextValue(['environmentVariableEditDraftStepSuccessItem', activitySuccessContext]),
57+
label: localize('editEnvironmentVariable', 'Edit environment variable (draft)'),
58+
iconPath: activitySuccessIcon
59+
}),
60+
message: localize('editEnvironmentVariableSuccess', 'Edited environment variable (draft)')
61+
};
62+
}
63+
64+
public createFailOutput(): ExecuteActivityOutput {
65+
return {
66+
item: new GenericParentTreeItem(undefined, {
67+
contextValue: createUniversallyUniqueContextValue(['environmentVariableEditDraftStepFailItem', activityFailContext]),
68+
label: localize('editEnvironmentVariable', 'Edit environment variable (draft)'),
69+
iconPath: activityFailIcon
70+
}),
71+
message: localize('editEnvironmentVariableFail', 'Failed to edit environment variable (draft).')
72+
};
73+
}
5274
}

src/commands/environmentVariables/editEnvironmentVariables/EnvironmentVariablesEditDraftStep.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { RevisionDraftUpdateBaseStep } from "../../revisionDraft/RevisionDraftUp
1212
import { type EnvironmentVariablesEditContext } from "./EnvironmentVariablesEditContext";
1313

1414
export class EnvironmentVariablesEditDraftStep<T extends EnvironmentVariablesEditContext> extends RevisionDraftUpdateBaseStep<T> {
15-
public priority: number = 590;
15+
public priority: number = 920;
1616

1717
constructor(baseItem: ContainerAppItem | RevisionsItemModel) {
1818
super(baseItem);

0 commit comments

Comments
 (0)