diff --git a/src/commands/createContainerApp/ContainerAppCreateStep.ts b/src/commands/createContainerApp/ContainerAppCreateStep.ts index a0375580b..4f63fe8e4 100644 --- a/src/commands/createContainerApp/ContainerAppCreateStep.ts +++ b/src/commands/createContainerApp/ContainerAppCreateStep.ts @@ -5,19 +5,21 @@ import { ContainerAppsAPIClient, Ingress, KnownActiveRevisionsMode } from "@azure/arm-appcontainers"; import { LocationListStep } from "@microsoft/vscode-azext-azureutils"; -import { AzureWizardExecuteStep, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils"; -import { Progress } from "vscode"; -import { containerAppsWebProvider } from "../../constants"; +import { GenericTreeItem, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils"; +import type { Progress } from "vscode"; +import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, containerAppsWebProvider } from "../../constants"; import { ContainerAppItem } from "../../tree/ContainerAppItem"; +import { ExecuteActivityOutput, ExecuteActivityOutputStepBase } from "../../utils/activity/ExecuteActivityOutputStepBase"; +import { createActivityChildContext } from "../../utils/activity/activityUtils"; import { createContainerAppsAPIClient } from "../../utils/azureClients"; import { localize } from "../../utils/localize"; import { getContainerNameForImage } from "../deployImage/imageSource/containerRegistry/getContainerNameForImage"; -import { ICreateContainerAppContext } from "./ICreateContainerAppContext"; +import type { ICreateContainerAppContext } from "./ICreateContainerAppContext"; -export class ContainerAppCreateStep extends AzureWizardExecuteStep { +export class ContainerAppCreateStep extends ExecuteActivityOutputStepBase { public priority: number = 750; - public async execute(context: ICreateContainerAppContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { + protected async executeCore(context: ICreateContainerAppContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { const appClient: ContainerAppsAPIClient = await createContainerAppsAPIClient(context); const resourceGroupName: string = nonNullValueAndProp(context.resourceGroup, 'name'); @@ -63,4 +65,26 @@ export class ContainerAppCreateStep extends AzureWizardExecuteStep { public priority: number = 220; diff --git a/src/commands/createManagedEnvironment/ManagedEnvironmentCreateStep.ts b/src/commands/createManagedEnvironment/ManagedEnvironmentCreateStep.ts index ab1bb4dd5..f9a9f01fa 100644 --- a/src/commands/createManagedEnvironment/ManagedEnvironmentCreateStep.ts +++ b/src/commands/createManagedEnvironment/ManagedEnvironmentCreateStep.ts @@ -5,56 +5,79 @@ import { ContainerAppsAPIClient } from "@azure/arm-appcontainers"; import { getResourceGroupFromId, LocationListStep } from "@microsoft/vscode-azext-azureutils"; -import { AzureWizardExecuteStep } from "@microsoft/vscode-azext-utils"; +import { GenericTreeItem } from "@microsoft/vscode-azext-utils"; import { Progress } from "vscode"; -import { managedEnvironmentsAppProvider } from "../../constants"; -import { ext } from "../../extensionVariables"; +import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, managedEnvironmentsAppProvider } from "../../constants"; +import { createActivityChildContext } from "../../utils/activity/activityUtils"; +import { ExecuteActivityOutput, ExecuteActivityOutputStepBase } from "../../utils/activity/ExecuteActivityOutputStepBase"; import { createContainerAppsAPIClient, createOperationalInsightsManagementClient } from '../../utils/azureClients'; import { localize } from "../../utils/localize"; import { nonNullProp, nonNullValueAndProp } from "../../utils/nonNull"; import { IManagedEnvironmentContext } from "./IManagedEnvironmentContext"; -export class ManagedEnvironmentCreateStep extends AzureWizardExecuteStep { +export class ManagedEnvironmentCreateStep extends ExecuteActivityOutputStepBase { public priority: number = 250; - public async execute(context: IManagedEnvironmentContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { + protected async executeCore(context: IManagedEnvironmentContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { const client: ContainerAppsAPIClient = await createContainerAppsAPIClient(context); const opClient = await createOperationalInsightsManagementClient(context); - const rgName = nonNullValueAndProp(context.resourceGroup, 'name'); + + const resourceGroupName = nonNullValueAndProp(context.resourceGroup, 'name'); + const managedEnvironmentName = nonNullProp(context, 'newManagedEnvironmentName'); const logAnalyticsWorkspace = nonNullProp(context, 'logAnalyticsWorkspace'); - const creatingKuEnv: string = localize('creatingManagedEnvironment', 'Creating new Container Apps environment "{0}"...', context.newManagedEnvironmentName); - progress.report({ message: creatingKuEnv }); - ext.outputChannel.appendLog(creatingKuEnv); + const creating: string = localize('creatingManagedEnvironment', 'Creating environment...'); + progress.report({ message: creating }); const sharedKeys = await opClient.sharedKeysOperations.getSharedKeys( getResourceGroupFromId(nonNullProp(logAnalyticsWorkspace, 'id')), nonNullProp(logAnalyticsWorkspace, 'name')); - context.managedEnvironment = await client.managedEnvironments.beginCreateOrUpdateAndWait(rgName, nonNullProp(context, 'newManagedEnvironmentName'), + context.managedEnvironment = await client.managedEnvironments.beginCreateOrUpdateAndWait(resourceGroupName, managedEnvironmentName, { location: (await LocationListStep.getLocation(context)).name, appLogsConfiguration: { "destination": "log-analytics", "logAnalyticsConfiguration": { - "customerId": nonNullProp(context, 'logAnalyticsWorkspace').customerId, + "customerId": logAnalyticsWorkspace.customerId, "sharedKey": sharedKeys.primarySharedKey } } } ); - context.activityResult = { - id: nonNullProp(context.managedEnvironment, 'id'), - name: nonNullProp(context, 'newManagedEnvironmentName'), - type: managedEnvironmentsAppProvider + if (!context.activityChildren) { + context.activityResult = { + id: nonNullProp(context.managedEnvironment, 'id'), + name: managedEnvironmentName, + type: managedEnvironmentsAppProvider + }; } - - const createdKuEnv: string = localize('createKuEnv', 'Successfully created new Container Apps environment "{0}".', context.newManagedEnvironmentName); - ext.outputChannel.appendLog(createdKuEnv); } public shouldExecute(context: IManagedEnvironmentContext): boolean { return !context.managedEnvironment; } + + protected createSuccessOutput(context: IManagedEnvironmentContext): ExecuteActivityOutput { + return { + item: new GenericTreeItem(undefined, { + contextValue: createActivityChildContext(['managedEnvironmentCreateStep', activitySuccessContext]), + label: localize('createManagedEnvironment', 'Create container apps environment "{0}"', context.newManagedEnvironmentName), + iconPath: activitySuccessIcon + }), + message: localize('createdManagedEnvironmentSuccess', 'Created container apps environment "{0}".', context.newManagedEnvironmentName) + }; + } + + protected createFailOutput(context: IManagedEnvironmentContext): ExecuteActivityOutput { + return { + item: new GenericTreeItem(undefined, { + contextValue: createActivityChildContext(['managedEnvironmentCreateStep', activityFailContext]), + label: localize('createManagedEnvironment', 'Create container apps environment "{0}"', context.newManagedEnvironmentName), + iconPath: activityFailIcon + }), + message: localize('createdManagedEnvironmentFail', 'Failed to create container apps environment "{0}".', context.newManagedEnvironmentName) + }; + } } diff --git a/src/commands/deployImage/ContainerAppUpdateStep.ts b/src/commands/deployImage/ContainerAppUpdateStep.ts index f35ac06f5..8d87c468f 100644 --- a/src/commands/deployImage/ContainerAppUpdateStep.ts +++ b/src/commands/deployImage/ContainerAppUpdateStep.ts @@ -3,19 +3,22 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { AzureWizardExecuteStep, nonNullProp } from "@microsoft/vscode-azext-utils"; -import type { Progress } from "vscode"; +import { GenericTreeItem, nonNullProp } from "@microsoft/vscode-azext-utils"; +import { type Progress } from "vscode"; +import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon } from "../../constants"; import { ext } from "../../extensionVariables"; import { ContainerAppModel, getContainerEnvelopeWithSecrets } from "../../tree/ContainerAppItem"; +import { ExecuteActivityOutput, ExecuteActivityOutputStepBase } from "../../utils/activity/ExecuteActivityOutputStepBase"; +import { createActivityChildContext } from "../../utils/activity/activityUtils"; import { localize } from "../../utils/localize"; import { updateContainerApp } from "../../utils/updateContainerApp"; import type { IDeployImageContext } from "./deployImage"; import { getContainerNameForImage } from "./imageSource/containerRegistry/getContainerNameForImage"; -export class ContainerAppUpdateStep extends AzureWizardExecuteStep { +export class ContainerAppUpdateStep extends ExecuteActivityOutputStepBase { public priority: number = 480; - public async execute(context: IDeployImageContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { + protected async executeCore(context: IDeployImageContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { const containerApp: ContainerAppModel = nonNullProp(context, 'containerApp'); const containerAppEnvelope = await getContainerEnvelopeWithSecrets(context, context.subscription, containerApp); @@ -44,4 +47,26 @@ export class ContainerAppUpdateStep extends AzureWizardExecuteStep, node?: ContainerAppItem): Promise { if (!node) { @@ -26,6 +27,7 @@ export async function deployImage(context: ITreeItemPickerContext & Partial { +export class BuildImageStep extends ExecuteActivityOutputStepBase { public priority: number = 450; - public async execute(context: IBuildImageInAzureContext): Promise { + protected async executeCore(context: IBuildImageInAzureContext): Promise { context.registryDomain = acrDomain; const run = await buildImageInAzure(context); @@ -40,10 +42,36 @@ export class BuildImageStep extends AzureWizardExecuteStep { +export class RunStep extends ExecuteActivityOutputStepBase { public priority: number = 440; - public async execute(context: IBuildImageInAzureContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { + protected async executeCore(context: IBuildImageInAzureContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { + // Need to keep the additional try wrapper here to execute finally, then we can catch any error that percolates up and display its output try { const rootUri = context.rootFolder.uri; @@ -26,7 +30,7 @@ export class RunStep extends AzureWizardExecuteStep { dockerFilePath: path.relative(rootUri.path, context.dockerfilePath) }; - const building: string = localize('buildingImage', 'Building image "{0}" in registry "{1}"...', context.imageName, context.registryName); + const building: string = localize('buildingImage', 'Building image...'); progress.report({ message: building }); context.run = await context.client.registries.beginScheduleRunAndWait(context.resourceGroupName, context.registryName, runRequest); @@ -38,6 +42,22 @@ export class RunStep extends AzureWizardExecuteStep { } public shouldExecute(context: IBuildImageInAzureContext): boolean { - return !context.run + return !context.run; + } + + protected createSuccessOutput(): ExecuteActivityOutput { + // Skip here, success will be output by the build image step + return {}; + } + + protected createFailOutput(context: IBuildImageInAzureContext): ExecuteActivityOutput { + return { + item: new GenericTreeItem(undefined, { + contextValue: createActivityChildContext(['runStep', activityFailContext]), + label: localize('runLabel', 'Build image "{0}" in registry "{1}"', context.imageName, context.registryName), + iconPath: activityFailIcon + }), + message: localize('runFail', 'Failed to build image "{0}" in registry "{1}".', context.imageName, context.registryName) + }; } } diff --git a/src/commands/deployImage/imageSource/buildImageInAzure/UploadSourceCodeStep.ts b/src/commands/deployImage/imageSource/buildImageInAzure/UploadSourceCodeStep.ts index 28fd75c92..b6a474aa8 100644 --- a/src/commands/deployImage/imageSource/buildImageInAzure/UploadSourceCodeStep.ts +++ b/src/commands/deployImage/imageSource/buildImageInAzure/UploadSourceCodeStep.ts @@ -3,27 +3,35 @@ * Licensed under the MIT License. See License.md in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { getResourceGroupFromId } from '@microsoft/vscode-azext-azureutils'; -import { AzExtFsExtra, AzureWizardExecuteStep, nonNullValue } from '@microsoft/vscode-azext-utils'; +import { AzExtFsExtra, GenericTreeItem, nonNullValue } from '@microsoft/vscode-azext-utils'; +import type { Progress } from 'vscode'; +import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon } from '../../../../constants'; import { fse } from '../../../../node/fs-extra'; import { tar } from '../../../../node/tar'; +import { ExecuteActivityOutput, ExecuteActivityOutputStepBase } from '../../../../utils/activity/ExecuteActivityOutputStepBase'; +import { createActivityChildContext } from '../../../../utils/activity/activityUtils'; import { createContainerRegistryManagementClient } from '../../../../utils/azureClients'; +import { localize } from '../../../../utils/localize'; import type { IBuildImageInAzureContext } from './IBuildImageInAzureContext'; const vcsIgnoreList = ['.git', '.gitignore', '.bzr', 'bzrignore', '.hg', '.hgignore', '.svn']; -export class UploadSourceCodeStep extends AzureWizardExecuteStep { +export class UploadSourceCodeStep extends ExecuteActivityOutputStepBase { public priority: number = 430; - public async execute(context: IBuildImageInAzureContext): Promise { + protected async executeCore(context: IBuildImageInAzureContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { context.registryName = nonNullValue(context.registry?.name); context.resourceGroupName = getResourceGroupFromId(nonNullValue(context.registry?.id)); context.client = await createContainerRegistryManagementClient(context); + const uploading: string = localize('uploadingSourceCode', 'Uploading source code...'); + progress.report({ message: uploading }); + const source: string = context.rootFolder.uri.fsPath; let items = await AzExtFsExtra.readDirectory(source); items = items.filter(i => { return !vcsIgnoreList.includes(i.name) - }) + }); tar.c({ cwd: source }, items.map(i => i.name)).pipe(fse.createWriteStream(context.tarFilePath)); @@ -39,6 +47,28 @@ export class UploadSourceCodeStep extends AzureWizardExecuteStep { +export class RegistryCreateStep extends ExecuteActivityOutputStepBase { public priority: number = 350; - public async execute(context: CreateAcrContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { + protected async executeCore(context: CreateAcrContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { progress.report({ message: localize('creatingRegistry', 'Creating registry...') }); const client: ContainerRegistryManagementClient = await createContainerRegistryManagementClient(context); @@ -30,6 +33,28 @@ export class RegistryCreateStep extends AzureWizardExecuteStep } public shouldExecute(context: CreateAcrContext): boolean { - return !!context.newRegistryName && !!context.newRegistrySku; + return !context.registry; + } + + protected createSuccessOutput(context: CreateAcrContext): ExecuteActivityOutput { + return { + item: new GenericTreeItem(undefined, { + contextValue: createActivityChildContext(['registryCreateStep', activitySuccessContext]), + label: localize('createRegistryLabel', 'Create container registry "{0}"', context.newRegistryName), + iconPath: activitySuccessIcon + }), + message: localize('createRegistrySuccess', 'Created container registry "{0}".', context.newRegistryName) + }; + } + + protected createFailOutput(context: CreateAcrContext): ExecuteActivityOutput { + return { + item: new GenericTreeItem(undefined, { + contextValue: createActivityChildContext(['registryCreateStep', activityFailContext]), + label: localize('createRegistryLabel', 'Create container registry "{0}"', context.newRegistryName), + iconPath: activityFailIcon + }), + message: localize('createRegistryFail', 'Failed to create container registry "{0}".', context.newRegistryName) + }; } } diff --git a/src/commands/deployWorkspaceProject/DeployWorkspaceProjectSaveSettingsStep.ts b/src/commands/deployWorkspaceProject/DeployWorkspaceProjectSaveSettingsStep.ts index 31edadd05..a57d992da 100644 --- a/src/commands/deployWorkspaceProject/DeployWorkspaceProjectSaveSettingsStep.ts +++ b/src/commands/deployWorkspaceProject/DeployWorkspaceProjectSaveSettingsStep.ts @@ -3,16 +3,25 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { AzureWizardExecuteStep, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils"; +import { GenericTreeItem, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils"; import { type Progress } from "vscode"; +import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, relativeSettingsFilePath } from "../../constants"; +import { ExecuteActivityOutput, ExecuteActivityOutputStepBase } from "../../utils/activity/ExecuteActivityOutputStepBase"; +import { createActivityChildContext } from "../../utils/activity/activityUtils"; import { localize } from "../../utils/localize"; -import { DeployWorkspaceProjectContext } from "./DeployWorkspaceProjectContext"; +import type { DeployWorkspaceProjectContext } from "./DeployWorkspaceProjectContext"; import { DeployWorkspaceProjectSettings, setDeployWorkspaceProjectSettings } from "./deployWorkspaceProjectSettings"; -export class DeployWorkspaceProjectSaveSettingsStep extends AzureWizardExecuteStep { +const saveSettingsLabel: string = localize('saveSettingsLabel', 'Save deployment settings to workspace "{0}"', relativeSettingsFilePath); + +export class DeployWorkspaceProjectSaveSettingsStep extends ExecuteActivityOutputStepBase { public priority: number = 1480; - public async execute(context: DeployWorkspaceProjectContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { + protected async executeCore(context: DeployWorkspaceProjectContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { + // Even if this step fails, there's no need to show the whole activity as failed. + // Swallow the error and just show the activity failed item and output log message instead. + this.options.shouldSwallowError = true; + progress.report({ message: localize('saving', 'Saving configuration...') }); const settings: DeployWorkspaceProjectSettings = { @@ -27,4 +36,26 @@ export class DeployWorkspaceProjectSaveSettingsStep extends AzureWizardExecuteSt public shouldExecute(context: DeployWorkspaceProjectContext): boolean { return !!context.shouldSaveDeploySettings; } + + protected createSuccessOutput(): ExecuteActivityOutput { + return { + item: new GenericTreeItem(undefined, { + contextValue: createActivityChildContext(['deployWorkspaceProjectSaveSettingsStep', activitySuccessContext]), + label: saveSettingsLabel, + iconPath: activitySuccessIcon + }), + message: localize('savedSettingsSuccess', 'Saved deployment settings to workspace "{0}".', relativeSettingsFilePath) + }; + } + + protected createFailOutput(): ExecuteActivityOutput { + return { + item: new GenericTreeItem(undefined, { + contextValue: createActivityChildContext(['deployWorkspaceProjectSaveSettingsStep', activityFailContext]), + label: saveSettingsLabel, + iconPath: activityFailIcon + }), + message: localize('savedSettingsFail', 'Failed to save deployment settings to workspace "{0}".', relativeSettingsFilePath) + }; + } } diff --git a/src/commands/deployWorkspaceProject/deployWorkspaceProject.ts b/src/commands/deployWorkspaceProject/deployWorkspaceProject.ts index 50bbe5352..867c38f22 100644 --- a/src/commands/deployWorkspaceProject/deployWorkspaceProject.ts +++ b/src/commands/deployWorkspaceProject/deployWorkspaceProject.ts @@ -4,13 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import { LocationListStep, ResourceGroupCreateStep, VerifyProvidersStep } from "@microsoft/vscode-azext-azureutils"; -import { AzureWizard, AzureWizardExecuteStep, AzureWizardPromptStep, IActionContext, ISubscriptionContext, createSubscriptionContext, nonNullProp, nonNullValueAndProp, subscriptionExperience } from "@microsoft/vscode-azext-utils"; +import { AzureWizard, AzureWizardExecuteStep, AzureWizardPromptStep, GenericTreeItem, IActionContext, ISubscriptionContext, createSubscriptionContext, nonNullProp, nonNullValueAndProp, subscriptionExperience } from "@microsoft/vscode-azext-utils"; import type { AzureSubscription } from "@microsoft/vscode-azureresources-api"; import { ProgressLocation, window } from "vscode"; -import { appProvider, managedEnvironmentsId, operationalInsightsProvider, webProvider } from "../../constants"; +import { activityInfoIcon, activitySuccessContext, appProvider, managedEnvironmentsId, operationalInsightsProvider, webProvider } from "../../constants"; import { ext } from "../../extensionVariables"; import { ContainerAppModel, isIngressEnabled } from "../../tree/ContainerAppItem"; -import { createActivityContext } from "../../utils/activity/activityUtils"; +import { createActivityChildContext, createActivityContext } from "../../utils/activity/activityUtils"; import { localize } from "../../utils/localize"; import { browseContainerApp } from "../browseContainerApp"; import { ContainerAppCreateStep } from "../createContainerApp/ContainerAppCreateStep"; @@ -67,13 +67,13 @@ export async function deployWorkspaceProject(context: IActionContext): Promise { +export class EnableIngressStep extends ExecuteActivityOutputStepBase { public priority: number = 650; - public async execute(context: IngressContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { + protected async executeCore(context: IngressContext, progress: Progress<{ message?: string | undefined; increment?: number | undefined }>): Promise { + progress.report({ message: localize('enablingIngress', 'Enabling ingress...') }); + const containerApp = nonNullProp(context, 'containerApp'); const ingress: Ingress = { targetPort: context.targetPort, @@ -28,13 +33,33 @@ export class EnableIngressStep extends IngressUpdateStepBase { ], } - const working: string = localize('enablingIngress', 'Enabling ingress...'); - const workCompleted: string = localize('enableCompleted', 'Enabled ingress on port {0} for container app "{1}"', context.targetPort, containerApp.name) - - await this.updateIngressSettings(context, progress, { ingress, working, workCompleted }); + await updateContainerApp(context, context.subscription, containerApp, { configuration: { ingress: ingress as Ingress | undefined } }); } + public shouldExecute(context: IngressContext): boolean { - return context.enableIngress === true; + return context.enableIngress === true && context.targetPort !== context.containerApp?.configuration?.ingress?.targetPort; + } + + protected createSuccessOutput(context: IngressContext): ExecuteActivityOutput { + return { + item: new GenericTreeItem(undefined, { + contextValue: createActivityChildContext(['enableIngressStep', activitySuccessContext]), + label: localize('enableIngressLabel', 'Enable ingress on port {0} for container app "{1}"', context.targetPort, context.containerApp?.name), + iconPath: activitySuccessIcon + }), + message: localize('enableCompleted', 'Enabled ingress on port {0} for container app "{1}".', context.targetPort, context.containerApp?.name) + }; + } + + protected createFailOutput(context: IngressContext): ExecuteActivityOutput { + return { + item: new GenericTreeItem(undefined, { + contextValue: createActivityChildContext(['enableIngressStep', activityFailContext]), + label: localize('enableIngressLabel', 'Enable ingress on port {0} for container app "{1}"', context.targetPort, context.containerApp?.name), + iconPath: activityFailIcon + }), + message: localize('enableIngressFailed', 'Failed to enable ingress on port {0} for container app "{1}".', context.targetPort, context.containerApp?.name) + }; } } diff --git a/src/constants.ts b/src/constants.ts index 517755455..9495e94ec 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -86,6 +86,7 @@ export const relativeSettingsFilePath: string = `${vscodeFolder}/${settingsFile} // Originally from the Docker extension: https://github.com/microsoft/vscode-docker/blob/main/src/constants.ts export const DOCKERFILE_GLOB_PATTERN = '**/{*.[dD][oO][cC][kK][eE][rR][fF][iI][lL][eE],[dD][oO][cC][kK][eE][rR][fF][iI][lL][eE],[dD][oO][cC][kK][eE][rR][fF][iI][lL][eE].*}'; +export const activityInfoIcon: ThemeIcon = new ThemeIcon('info', new ThemeColor('charts.blue')); export const activitySuccessIcon: ThemeIcon = new ThemeIcon('pass', new ThemeColor('testing.iconPassed')); export const activityFailIcon: ThemeIcon = new ThemeIcon('error', new ThemeColor('testing.iconFailed'));