Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
269 changes: 203 additions & 66 deletions package-lock.json

Large diffs are not rendered by default.

11 changes: 10 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,11 @@
"command": "containerApps.createAcr",
"title": "%containerApps.createAcr%",
"category": "Azure Container Apps"
},
{
"command": "containerApps.openAcrBuildLogs",
"title": "%containerApps.openAcrBuildLogs%",
"category": "Azure Container Apps"
}
],
"submenus": [
Expand Down Expand Up @@ -501,6 +506,10 @@
{
"command": "containerApps.deployImageApi",
"when": "never"
},
{
"command": "containerApps.openAcrBuildLogs",
"when": "never"
}
]
},
Expand Down Expand Up @@ -608,7 +617,7 @@
"@azure/storage-blob": "^12.4.1",
"@microsoft/vscode-azext-azureutils": "^2.0.0",
"@microsoft/vscode-azext-github": "^1.0.0",
"@microsoft/vscode-azext-utils": "^2.1.3",
"@microsoft/vscode-azext-utils": "^2.1.5",
"@microsoft/vscode-azureresources-api": "^2.0.2",
"buffer": "^6.0.3",
"dayjs": "^1.11.3",
Expand Down
1 change: 1 addition & 0 deletions package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
"containerApps.startStreamingLogs": "Start Streaming Logs...",
"containerApps.stopStreamingLogs": "Stop Streaming Logs...",
"containerApps.createAcr": "Create Azure Container Registry...",
"containerApps.openAcrBuildLogs": "Open Azure Container Registry Build Logs",
"containerApps.deployWorkspaceProject.containerAppName": "When deploying from a local workspace project, the name of the target container app to deploy to.",
"containerApps.deployWorkspaceProject.containerAppResourceGroupName": "When deploying from a local workspace project, the name of the target container app's resource group.",
"containerApps.deployWorkspaceProject.containerRegistryName": "When deploying from a local workspace project, the name of the Azure Container Registry to use for storing and building images."
Expand Down
4 changes: 2 additions & 2 deletions src/commands/createContainerApp/ContainerAppCreateStep.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

import { KnownActiveRevisionsMode, type ContainerAppsAPIClient, type Ingress } from "@azure/arm-appcontainers";
import { LocationListStep } from "@microsoft/vscode-azext-azureutils";
import { GenericTreeItem, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils";
import { GenericTreeItem, activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils";
import { type Progress } from "vscode";
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, containerAppsWebProvider } from "../../constants";
import { containerAppsWebProvider } from "../../constants";
import { ContainerAppItem } from "../../tree/ContainerAppItem";
import { ExecuteActivityOutputStepBase, type ExecuteActivityOutput } from "../../utils/activity/ExecuteActivityOutputStepBase";
import { createActivityChildContext } from "../../utils/activity/activityUtils";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
*--------------------------------------------------------------------------------------------*/

import { LocationListStep } from "@microsoft/vscode-azext-azureutils";
import { GenericTreeItem } from "@microsoft/vscode-azext-utils";
import { GenericTreeItem, activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon } from "@microsoft/vscode-azext-utils";
import { type Progress } from "vscode";
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon } from "../../constants";
import { ExecuteActivityOutputStepBase, type ExecuteActivityOutput } from "../../utils/activity/ExecuteActivityOutputStepBase";
import { createActivityChildContext } from "../../utils/activity/activityUtils";
import { createOperationalInsightsManagementClient } from "../../utils/azureClients";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

import { type ContainerAppsAPIClient } from "@azure/arm-appcontainers";
import { getResourceGroupFromId, LocationListStep } from "@microsoft/vscode-azext-azureutils";
import { GenericTreeItem } from "@microsoft/vscode-azext-utils";
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, GenericTreeItem } from "@microsoft/vscode-azext-utils";
import { type Progress } from "vscode";
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, managedEnvironmentsAppProvider } from "../../constants";
import { managedEnvironmentsAppProvider } from "../../constants";
import { createActivityChildContext } from "../../utils/activity/activityUtils";
import { ExecuteActivityOutputStepBase, type ExecuteActivityOutput } from "../../utils/activity/ExecuteActivityOutputStepBase";
import { createContainerAppsAPIClient, createOperationalInsightsManagementClient } from '../../utils/azureClients';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { GenericTreeItem, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils";
import { GenericTreeItem, activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils";
import { type Progress } from "vscode";
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, relativeSettingsFilePath } from "../../constants";
import { relativeSettingsFilePath } from "../../constants";
import { ExecuteActivityOutputStepBase, type ExecuteActivityOutput } from "../../utils/activity/ExecuteActivityOutputStepBase";
import { createActivityChildContext } from "../../utils/activity/activityUtils";
import { localize } from "../../utils/localize";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
*--------------------------------------------------------------------------------------------*/

import { LocationListStep, ResourceGroupCreateStep } from "@microsoft/vscode-azext-azureutils";
import { AzureWizard, GenericTreeItem, callWithTelemetryAndErrorHandling, createSubscriptionContext, nonNullProp, nonNullValueAndProp, subscriptionExperience, type AzureWizardExecuteStep, type AzureWizardPromptStep, type IActionContext, type ISubscriptionContext } from "@microsoft/vscode-azext-utils";
import { AzureWizard, GenericTreeItem, activityInfoIcon, activitySuccessContext, callWithTelemetryAndErrorHandling, createSubscriptionContext, nonNullProp, nonNullValueAndProp, subscriptionExperience, type AzureWizardExecuteStep, type AzureWizardPromptStep, type IActionContext, type ISubscriptionContext } from "@microsoft/vscode-azext-utils";
import { type AzureSubscription } from "@microsoft/vscode-azureresources-api";
import { ProgressLocation, window } from "vscode";
import { activityInfoIcon, activitySuccessContext, appProvider, managedEnvironmentsId } from "../../constants";
import { appProvider, managedEnvironmentsId } from "../../constants";
import { ext } from "../../extensionVariables";
import { type SetTelemetryProps } from "../../telemetry/SetTelemetryProps";
import { type DeployWorkspaceProjectNotificationTelemetryProps as NotificationTelemetryProps } from "../../telemetry/commandTelemetryProps";
Expand Down
3 changes: 1 addition & 2 deletions src/commands/image/imageSource/ContainerAppUpdateStep.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { GenericTreeItem, nonNullProp } from "@microsoft/vscode-azext-utils";
import { GenericTreeItem, activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, nonNullProp } from "@microsoft/vscode-azext-utils";
import { type Progress } from "vscode";
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon } from "../../../constants";
import { ext } from "../../../extensionVariables";
import { getContainerEnvelopeWithSecrets, type ContainerAppModel } from "../../../tree/ContainerAppItem";
import { ExecuteActivityOutputStepBase, type ExecuteActivityOutput } from "../../../utils/activity/ExecuteActivityOutputStepBase";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { AzExtFsExtra, AzureWizardPromptStep, GenericTreeItem } from "@microsoft/vscode-azext-utils";
import { AzExtFsExtra, AzureWizardPromptStep, GenericTreeItem, activitySuccessContext, activitySuccessIcon } from "@microsoft/vscode-azext-utils";
import { parse, type DotenvParseOutput } from "dotenv";
import { workspace, type Uri } from "vscode";
import { ImageSource, SetEnvironmentVariableOption, activitySuccessContext, activitySuccessIcon, envFileGlobPattern } from "../../../constants";
import { ImageSource, SetEnvironmentVariableOption, envFileGlobPattern } from "../../../constants";
import { ext } from "../../../extensionVariables";
import { type EnvironmentVariableTelemetryProps as TelemetryProps } from "../../../telemetry/ImageSourceTelemetryProps";
import { type SetTelemetryProps } from "../../../telemetry/SetTelemetryProps";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,20 @@
* Licensed under the MIT License. See License.md in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { sendRequestWithTimeout } from "@microsoft/vscode-azext-azureutils";
import { GenericTreeItem, nonNullProp, nonNullValue, openReadOnlyContent } from "@microsoft/vscode-azext-utils";
import { window, type MessageItem } from "vscode";
import { acrDomain, activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon } from "../../../../constants";
import { sendRequestWithTimeout, type AzExtPipelineResponse } from "@microsoft/vscode-azext-azureutils";
import { GenericParentTreeItem, GenericTreeItem, activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, nonNullProp, nonNullValue, nonNullValueAndProp, type AzExtTreeItem } from "@microsoft/vscode-azext-utils";
import { ThemeColor, ThemeIcon, window, type MessageItem } from "vscode";
import { acrDomain } from "../../../../constants";
import { ExecuteActivityOutputStepBase, type ExecuteActivityOutput } from "../../../../utils/activity/ExecuteActivityOutputStepBase";
import { createActivityChildContext } from "../../../../utils/activity/activityUtils";
import { localize } from "../../../../utils/localize";
import { openAcrBuildLogs, type AcrBuildResults } from "../../openAcrBuildLogs";
import { type BuildImageInAzureImageSourceContext } from "./BuildImageInAzureImageSourceContext";
import { buildImageInAzure } from "./buildImageInAzure";

export class BuildImageStep extends ExecuteActivityOutputStepBase<BuildImageInAzureImageSourceContext> {
public priority: number = 450;
protected acrBuildError: AcrBuildResults;

protected async executeCore(context: BuildImageInAzureImageSourceContext): Promise<void> {
context.registryDomain = acrDomain;
Expand All @@ -28,14 +30,21 @@ export class BuildImageStep extends ExecuteActivityOutputStepBase<BuildImageInAz
context.image = `${image.registry}/${image.repository}:${image.tag}`;
} else {
const logSasUrl = (await context.client.runs.getLogSasUrl(context.resourceGroupName, context.registryName, nonNullValue(context.run.runId))).logLink;
const contentTask = sendRequestWithTimeout(context, { method: 'GET', url: nonNullValue(logSasUrl) }, 2500, undefined)
const response: AzExtPipelineResponse = await sendRequestWithTimeout(context, { method: 'GET', url: nonNullValue(logSasUrl) }, 2500, undefined);
const content: string = nonNullProp(response, 'bodyAsText');

this.acrBuildError = {
name: nonNullValueAndProp(context.run, 'name'),
runId: nonNullValueAndProp(context.run, 'id'),
content
};

const viewLogsButton: MessageItem = { title: localize('viewLogs', 'View Logs') };
const errorMessage = localize('noImagesBuilt', 'Failed to build image. View logs for more details.');

void window.showErrorMessage(errorMessage, viewLogsButton).then(async result => {
if (result === viewLogsButton) {
const content = nonNullProp((await contentTask), 'bodyAsText')
await openReadOnlyContent({ label: nonNullValue(context.run.name), fullId: nonNullValue(context.run.id) }, content, '.log');
await openAcrBuildLogs(context, this.acrBuildError);
}
});

Expand All @@ -51,7 +60,7 @@ export class BuildImageStep extends ExecuteActivityOutputStepBase<BuildImageInAz
protected createSuccessOutput(context: BuildImageInAzureImageSourceContext): ExecuteActivityOutput {
return {
item: new GenericTreeItem(undefined, {
contextValue: createActivityChildContext(['buildImageStep', activitySuccessContext]),
contextValue: createActivityChildContext(['buildImageStepSuccessItem', activitySuccessContext]),
label: localize('buildImageLabel', 'Build image "{0}" in registry "{1}"', context.imageName, context.registryName),
iconPath: activitySuccessIcon
}),
Expand All @@ -63,11 +72,26 @@ export class BuildImageStep extends ExecuteActivityOutputStepBase<BuildImageInAz
}

protected createFailOutput(context: BuildImageInAzureImageSourceContext): ExecuteActivityOutput {
let loadMoreChildrenImpl: (() => Promise<AzExtTreeItem[]>) | undefined;
Comment thread
MicroFish91 marked this conversation as resolved.
Outdated
if (this.acrBuildError) {
loadMoreChildrenImpl = () => {
const buildImageLogsItem = new GenericTreeItem(undefined, {
contextValue: createActivityChildContext(['logsLinkItem']),
label: localize('buildImageLogs', 'Click to view build image logs'),
iconPath: new ThemeIcon('note', new ThemeColor('terminal.ansiWhite')),
Comment thread
MicroFish91 marked this conversation as resolved.
Outdated
commandId: 'containerApps.openAcrBuildLogs',
});
buildImageLogsItem.commandArgs = [this.acrBuildError];
return Promise.resolve([buildImageLogsItem]);
};
}

return {
item: new GenericTreeItem(undefined, {
contextValue: createActivityChildContext(['buildImageStep', activityFailContext]),
item: new GenericParentTreeItem(undefined, {
contextValue: createActivityChildContext(['buildImageStepFailItem', activityFailContext]),
label: localize('buildImageLabel', 'Build image "{0}" in registry "{1}"', context.imageName, context.registryName),
iconPath: activityFailIcon
iconPath: activityFailIcon,
loadMoreChildrenImpl: loadMoreChildrenImpl ?? (() => Promise.resolve([]))
}),
message: localize('buildImageFail', 'Failed to build image "{0}" in registry "{1}".', context.imageName, context.registryName)
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
*--------------------------------------------------------------------------------------------*/

import { type DockerBuildRequest as AcrDockerBuildRequest } from "@azure/arm-containerregistry";
import { AzExtFsExtra, GenericTreeItem } from "@microsoft/vscode-azext-utils";
import { AzExtFsExtra, GenericTreeItem, activityFailContext, activityFailIcon } from "@microsoft/vscode-azext-utils";
import * as path from 'path';
import { type Progress } from "vscode";
import { activityFailContext, activityFailIcon } from "../../../../constants";
import { ExecuteActivityOutputStepBase, type ExecuteActivityOutput } from "../../../../utils/activity/ExecuteActivityOutputStepBase";
import { createActivityChildContext } from "../../../../utils/activity/activityUtils";
import { localize } from "../../../../utils/localize";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
*--------------------------------------------------------------------------------------------*/

import { getResourceGroupFromId } from '@microsoft/vscode-azext-azureutils';
import { AzExtFsExtra, GenericTreeItem, nonNullValue } from '@microsoft/vscode-azext-utils';
import { AzExtFsExtra, GenericTreeItem, activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, nonNullValue } from '@microsoft/vscode-azext-utils';
import * as path from 'path';
import { type Progress } from 'vscode';
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon } from '../../../../constants';
import { fse } from '../../../../node/fs-extra';
import { tar } from '../../../../node/tar';
import { ExecuteActivityOutputStepBase, type ExecuteActivityOutput } from '../../../../utils/activity/ExecuteActivityOutputStepBase';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@

import { type ContainerRegistryManagementClient } from "@azure/arm-containerregistry";
import { LocationListStep } from "@microsoft/vscode-azext-azureutils";
import { GenericTreeItem, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils";
import { GenericTreeItem, activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon, nonNullProp, nonNullValueAndProp } from "@microsoft/vscode-azext-utils";
import { type Progress } from "vscode";
import { activityFailContext, activityFailIcon, activitySuccessContext, activitySuccessIcon } from "../../../../../../constants";
import { ExecuteActivityOutputStepBase, type ExecuteActivityOutput } from "../../../../../../utils/activity/ExecuteActivityOutputStepBase";
import { createActivityChildContext } from "../../../../../../utils/activity/activityUtils";
import { createContainerRegistryManagementClient } from "../../../../../../utils/azureClients";
Expand Down
22 changes: 22 additions & 0 deletions src/commands/image/openAcrBuildLogs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.md in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { type Run as AcrRun } from '@azure/arm-containerregistry';
import { nonNullProp, openReadOnlyContent, type IActionContext } from "@microsoft/vscode-azext-utils";
import { localize } from '../../utils/localize';

export interface AcrBuildResults {
name: AcrRun['name'];
runId: AcrRun['runId'];
content: string;
}

export async function openAcrBuildLogs(_context: IActionContext, acrBuildResults: AcrBuildResults): Promise<void> {
if (!acrBuildResults) {
throw new Error(localize('noAcrBuildResults', 'No Azure Container Registry build results to display.'));
}

await openReadOnlyContent({ label: nonNullProp(acrBuildResults, 'name'), fullId: nonNullProp(acrBuildResults, 'runId') }, nonNullProp(acrBuildResults, 'content'), '.log');
}
3 changes: 1 addition & 2 deletions src/commands/ingress/IngressPromptStep.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { AzureWizardPromptStep, GenericTreeItem, type AzureWizardExecuteStep, type IWizardOptions } from "@microsoft/vscode-azext-utils";
import { activitySuccessContext, activitySuccessIcon } from "../../constants";
import { AzureWizardPromptStep, GenericTreeItem, activitySuccessContext, activitySuccessIcon, type AzureWizardExecuteStep, type IWizardOptions } from "@microsoft/vscode-azext-utils";
import { ext } from "../../extensionVariables";
import { createActivityChildContext } from "../../utils/activity/activityUtils";
import { localize } from "../../utils/localize";
Expand Down
Loading