Skip to content
Draft
Show file tree
Hide file tree
Changes from all 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
22 changes: 9 additions & 13 deletions src/commands/aksCRUDDiagnostics/aksCRUDDiagnostics.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as vscode from 'vscode';
import * as k8s from 'vscode-kubernetes-tools-api';
import { IActionContext } from "vscode-azureextensionui";
import { getAksClusterTreeItem } from '../utils/clusters';
import { getExtensionPath, longRunning } from '../utils/host';
import { AppLensARMResponse, getAppLensDetectorData } from '../utils/detectors';
import * as fs from 'fs';
Expand All @@ -10,24 +11,19 @@ import { htmlHandlerRegisterHelper } from './helpers/crudhtmlhelper';
import AksClusterTreeItem from '../../tree/aksClusterTreeItem';

export default async function aksCRUDDiagnostics(
context: IActionContext,
_context: IActionContext,
target: any
): Promise<void> {
const cloudExplorer = await k8s.extension.cloudExplorer.v1;

if (cloudExplorer.available) {
const cloudTarget = cloudExplorer.api.resolveCommandTarget(target);
const cluster = getAksClusterTreeItem(target, cloudExplorer);
if (cluster === undefined) {
return;
}

if (cloudTarget && cloudTarget.cloudName === "Azure" &&
cloudTarget.nodeType === "resource" && cloudTarget.cloudResource.nodeType === "cluster") {
const cluster = cloudTarget.cloudResource as AksClusterTreeItem;
const extensionPath = getExtensionPath();
if (extensionPath && cluster) {
await loadDetector(cluster, extensionPath);
}
} else {
vscode.window.showInformationMessage('This command only applies to AKS clusters.');
}
const extensionPath = getExtensionPath();
if (extensionPath) {
await loadDetector(cluster, extensionPath);
}
}

Expand Down
41 changes: 12 additions & 29 deletions src/commands/aksStarterWorkflow/configureStarterWorkflow.ts
Original file line number Diff line number Diff line change
@@ -1,43 +1,26 @@
import * as vscode from 'vscode';
import * as k8s from 'vscode-kubernetes-tools-api';
import { IActionContext } from 'vscode-azureextensionui';
import AksClusterTreeItem from '../../tree/aksClusterTreeItem';
import { getAksClusterTreeItem } from '../utils/clusters';
import { configureStarterConfigDataForAKS } from './configureStarterWorkflowHelper';

export default async function configureStarterWorkflow(
context: IActionContext,
_context: IActionContext,
target: any
): Promise<void> {
const cloudExplorer = await k8s.extension.cloudExplorer.v1;
const clusterExplorer = await k8s.extension.clusterExplorer.v1;

if (!cloudExplorer.available) {
vscode.window.showWarningMessage(`Cloud explorer is unavailable.`);
return undefined;
const cluster = getAksClusterTreeItem(target, cloudExplorer);
if (cluster === undefined) {
return;
}

if (!clusterExplorer.available) {
vscode.window.showWarningMessage(`Cluster explorer is unavailable.`);
return undefined;
}

const clusterTarget = cloudExplorer.api.resolveCommandTarget(target);

if (clusterTarget && clusterTarget.cloudName === "Azure" &&
clusterTarget.nodeType === "resource" && clusterTarget.cloudResource.nodeType === "cluster" &&
clusterExplorer.available) {
// Configure the starter workflow data.
const aksStarterWorkflowData = configureStarterConfigDataForAKS(cluster.armId.split("/")[4], cluster.name);

const aksCluster = clusterTarget.cloudResource as AksClusterTreeItem;

// Configure the starter workflow data.
const aksStarterWorkflowData = configureStarterConfigDataForAKS(clusterTarget.cloudResource.armId.split("/")[4], aksCluster.name);

// Display it to the end-user in their vscode editor.
vscode.workspace.openTextDocument({
content: aksStarterWorkflowData,
language: "yaml"
});
} else {
vscode.window.showInformationMessage('This command only applies to AKS clusters.');
}
// Display it to the end-user in their vscode editor.
vscode.workspace.openTextDocument({
content: aksStarterWorkflowData,
language: "yaml"
});
}
25 changes: 8 additions & 17 deletions src/commands/azureServiceOperators/installAzureServiceOperator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ import {
} from './helpers/azureservicehtmlhelper';
import * as clusters from '../utils/clusters';
import { InstallationResponse } from './models/installationResponse';
import { getAksClusterTreeItem } from '../utils/clusters';
import { getExtensionPath } from '../utils/host';

export default async function installAzureServiceOperator(
context: IActionContext,
_context: IActionContext,
target: any
): Promise<void> {
const kubectl = await k8s.extension.kubectl.v1;
Expand All @@ -25,28 +26,18 @@ export default async function installAzureServiceOperator(
return undefined;
}

if (!cloudExplorer.available) {
vscode.window.showWarningMessage(`Cloud explorer is unavailable.`);
return undefined;
}

if (!clusterExplorer.available) {
vscode.window.showWarningMessage(`Cluster explorer is unavailable.`);
return undefined;
}

const clusterTarget = cloudExplorer.api.resolveCommandTarget(target);

if (clusterTarget && clusterTarget.cloudName === "Azure" &&
clusterTarget.nodeType === "resource" && clusterTarget.cloudResource.nodeType === "cluster" &&
clusterExplorer.available) {

const aksCluster = clusterTarget.cloudResource as AksClusterTreeItem;
await install(kubectl.api, aksCluster);
clusterExplorer.api.refresh();
} else {
vscode.window.showInformationMessage('This command only applies to AKS clusters.');
const cluster = getAksClusterTreeItem(target, cloudExplorer);
if (cluster === undefined) {
return undefined;
}

await install(kubectl.api, cluster);
clusterExplorer.api.refresh();
}

export async function install(
Expand Down
15 changes: 6 additions & 9 deletions src/commands/deployAzurePipeline/browsePipeline.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import * as vscode from 'vscode';
import * as k8s from 'vscode-kubernetes-tools-api';
import { IActionContext } from 'vscode-azureextensionui';
import { CloudExplorerV1 } from 'vscode-kubernetes-tools-api';
import { AksClusterTreeNode } from '../../tree/aksClusterTreeItem';
import { getAksClusterTreeItem } from '../utils/clusters';

export async function browsePipeline(context: IActionContext, target: any): Promise<void> {
const deploymentCenterUrl = await getDeploymentCenterUrl(target);
Expand All @@ -15,12 +14,10 @@ export async function browsePipeline(context: IActionContext, target: any): Prom

async function getDeploymentCenterUrl(target: any): Promise<string | undefined> {
const cloudExplorer = await k8s.extension.cloudExplorer.v1;
if (cloudExplorer.available) {
const clusterTarget = cloudExplorer.api.resolveCommandTarget(target) as CloudExplorerV1.CloudExplorerResourceNode;
const clusterTreeNode = clusterTarget.cloudResource as AksClusterTreeNode;
if (clusterTarget) {
return `https://portal.azure.com/#@${clusterTreeNode.session.tenantId}/resource${clusterTreeNode.armId}/deloymentCenter`;
}
const cluster = getAksClusterTreeItem(target, cloudExplorer);
if (cluster === undefined) {
return undefined;
}
return undefined;

return `https://portal.azure.com/#@${cluster.session.tenantId}/resource${cluster.armId}/deloymentCenter`;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,27 @@ import * as vscode from 'vscode';
import * as k8s from 'vscode-kubernetes-tools-api';
import { IActionContext } from 'vscode-azureextensionui';
import { resourceNode } from './models/resourceNode';
import { getAksClusterTreeItem } from '../../utils/clusters';

const CONFIGURE_PIPELINE_COMMAND = 'configure-cicd-pipeline';
const DEPLOY_TO_AZURE_EXTENSION_ID = 'ms-vscode-deploy-azure.azure-deploy';

export async function configurePipeline(context: IActionContext, target: any): Promise<void> {
const deployToAzureExtensionInstalled = isDeployToAzureExtensionInstalled();
if (deployToAzureExtensionInstalled) {
const cloudExplorer = await k8s.extension.cloudExplorer.v1;
if (cloudExplorer.available) {
const clusterTarget = cloudExplorer.api.resolveCommandTarget(target);
if (clusterTarget && clusterTarget.cloudName === "Azure" && clusterTarget.nodeType === "resource" && clusterTarget.cloudResource.nodeType === "cluster") {
const cluster: resourceNode = { resource: { id: clusterTarget.cloudResource.armId, type: clusterTarget.cloudResource.nodeType }, subscriptionId: clusterTarget.cloudResource.subscription.subscriptionId };
await executeDeployToAzureExtensionInstalled(CONFIGURE_PIPELINE_COMMAND, cluster);
} else {
vscode.window.showInformationMessage('This command only applies to AKS clusters.');
}
const clusterTreeItem = getAksClusterTreeItem(target, cloudExplorer);
if (clusterTreeItem === undefined) {
return;
}

if (clusterTreeItem.subscription.subscriptionId === undefined) {
vscode.window.showErrorMessage(`subscriptionId not set for cluster tree item ${clusterTreeItem.name}`);
return;
}

const cluster: resourceNode = { resource: { id: clusterTreeItem.armId, type: clusterTreeItem.nodeType }, subscriptionId: clusterTreeItem.subscription.subscriptionId };
await executeDeployToAzureExtensionInstalled(CONFIGURE_PIPELINE_COMMAND, cluster);
} else {
const installDeployToAzure = await vscode.window.showInformationMessage(
'"Deploy to Azure" VSCode extension is needed for this command. Please install/enable the extension and try again.',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,27 @@ import * as k8s from 'vscode-kubernetes-tools-api';
import { IActionContext } from "vscode-azureextensionui";
import { AppLensARMResponse, getAppLensDetectorData } from '../utils/detectors';
import { convertHtmlJsonConfiguration, htmlHandlerRegisterHelper } from './helpers/networkconnectivityhtmlhelper';
import { getAksClusterTreeItem } from '../utils/clusters';
import { longRunning, getExtensionPath } from '../utils/host';
import * as path from 'path';
import * as fs from 'fs';
import * as htmlhandlers from "handlebars";
import AksClusterTreeItem from '../../tree/aksClusterTreeItem';

export default async function networkAndConnectivityDiagnostics(
context: IActionContext,
_context: IActionContext,
target: any
): Promise<void> {
const cloudExplorer = await k8s.extension.cloudExplorer.v1;

if (cloudExplorer.available) {
const cloudTarget = cloudExplorer.api.resolveCommandTarget(target);
const cluster = getAksClusterTreeItem(target, cloudExplorer);
if (cluster === undefined) {
return;
}

if (cloudTarget && cloudTarget.cloudName === "Azure" &&
cloudTarget.nodeType === "resource" && cloudTarget.cloudResource.nodeType === "cluster") {
const extensionPath = getExtensionPath();
if (extensionPath) {
await loadNetworkConnectivityDetector(cloudTarget.cloudResource, extensionPath);
}
} else {
vscode.window.showInformationMessage('This command only applies to AKS clusters.');
}
const extensionPath = getExtensionPath();
if (extensionPath) {
await loadNetworkConnectivityDetector(cluster, extensionPath);
}
}

Expand Down
28 changes: 13 additions & 15 deletions src/commands/periscope/periscope.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as vscode from 'vscode';
import * as k8s from 'vscode-kubernetes-tools-api';
import { IActionContext } from 'vscode-azureextensionui';
import * as tmpfile from '../utils/tempfile';
import * as clusters from '../utils/clusters';
import { getAksClusterTreeItem, getKubeconfigYaml } from '../utils/clusters';
import { getExtensionPath, longRunning } from '../utils/host';
import {
getClusterDiagnosticSettings,
Expand All @@ -16,26 +16,24 @@ import { PeriscopeStorage } from './models/storage';
import AksClusterTreeItem from '../../tree/aksClusterTreeItem';

export default async function periscope(
context: IActionContext,
_context: IActionContext,
target: any
): Promise<void> {
const kubectl = await k8s.extension.kubectl.v1;
const cloudExplorer = await k8s.extension.cloudExplorer.v1;
if (!kubectl.available) {
return;
}

if (cloudExplorer.available && kubectl.available) {
const clusterTarget = cloudExplorer.api.resolveCommandTarget(target);
const cloudExplorer = await k8s.extension.cloudExplorer.v1;

if (clusterTarget && clusterTarget.cloudName === "Azure" &&
clusterTarget.nodeType === "resource" && clusterTarget.cloudResource.nodeType === "cluster") {
const cluster = clusterTarget.cloudResource as AksClusterTreeItem;
const clusterKubeConfig = await clusters.getKubeconfigYaml(cluster);
const cluster = getAksClusterTreeItem(target, cloudExplorer);
if (cluster === undefined) {
return;
}

if (clusterKubeConfig) {
await runAKSPeriscope(cluster, clusterKubeConfig);
}
} else {
vscode.window.showInformationMessage('This command only applies to AKS clusters.');
}
const clusterKubeConfig = await getKubeconfigYaml(cluster);
if (clusterKubeConfig) {
await runAKSPeriscope(cluster, clusterKubeConfig);
}
}

Expand Down
27 changes: 27 additions & 0 deletions src/commands/utils/clusters.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,35 @@
import * as vscode from 'vscode';
import { API, CloudExplorerV1 } from 'vscode-kubernetes-tools-api';
import AksClusterTreeItem from "../../tree/aksClusterTreeItem";
import { parseResource } from "../../azure-api-utils";
import * as azcs from '@azure/arm-containerservice';

export function getAksClusterTreeItem(commandTarget: any, cloudExplorer: API<CloudExplorerV1>): AksClusterTreeItem | undefined {
if (!cloudExplorer.available) {
vscode.window.showWarningMessage('Cloud explorer is unavailable.');
return undefined;
}

const cloudTarget = cloudExplorer.api.resolveCommandTarget(commandTarget) as CloudExplorerV1.CloudExplorerResourceNode;

const isClusterTarget = cloudTarget !== undefined &&
cloudTarget.cloudName === "Azure" &&
cloudTarget.cloudResource.nodeType === "cluster";

if (!isClusterTarget) {
vscode.window.showInformationMessage('This command only applies to AKS clusters.');
return undefined;
}

const cluster = cloudTarget.cloudResource as AksClusterTreeItem;
if (cluster === undefined) {
vscode.window.showErrorMessage('Cloud target cluster resource is not of type AksClusterTreeItem');
return undefined;
}

return cluster;
}

export async function getKubeconfigYaml(target: AksClusterTreeItem): Promise<string | undefined> {
const { resourceGroupName, name } = parseResource(target.id!);
if (!resourceGroupName || !name) {
Expand Down