diff --git a/src/commands/aksCRUDDiagnostics/aksCRUDDiagnostics.ts b/src/commands/aksCRUDDiagnostics/aksCRUDDiagnostics.ts index 2fa99a8f3..c61848ad1 100644 --- a/src/commands/aksCRUDDiagnostics/aksCRUDDiagnostics.ts +++ b/src/commands/aksCRUDDiagnostics/aksCRUDDiagnostics.ts @@ -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'; @@ -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 { 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); } } diff --git a/src/commands/aksStarterWorkflow/configureStarterWorkflow.ts b/src/commands/aksStarterWorkflow/configureStarterWorkflow.ts index 64a0dc870..e36be8dc6 100644 --- a/src/commands/aksStarterWorkflow/configureStarterWorkflow.ts +++ b/src/commands/aksStarterWorkflow/configureStarterWorkflow.ts @@ -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 { 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" + }); } diff --git a/src/commands/azureServiceOperators/installAzureServiceOperator.ts b/src/commands/azureServiceOperators/installAzureServiceOperator.ts index b2949cd62..ed05ae922 100644 --- a/src/commands/azureServiceOperators/installAzureServiceOperator.ts +++ b/src/commands/azureServiceOperators/installAzureServiceOperator.ts @@ -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 { const kubectl = await k8s.extension.kubectl.v1; @@ -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( diff --git a/src/commands/deployAzurePipeline/browsePipeline.ts b/src/commands/deployAzurePipeline/browsePipeline.ts index b010c1d9a..03b9f0cba 100644 --- a/src/commands/deployAzurePipeline/browsePipeline.ts +++ b/src/commands/deployAzurePipeline/browsePipeline.ts @@ -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 { const deploymentCenterUrl = await getDeploymentCenterUrl(target); @@ -15,12 +14,10 @@ export async function browsePipeline(context: IActionContext, target: any): Prom async function getDeploymentCenterUrl(target: any): Promise { 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`; } \ No newline at end of file diff --git a/src/commands/deployAzurePipeline/configureCicdPipeline/configurePipeline.ts b/src/commands/deployAzurePipeline/configureCicdPipeline/configurePipeline.ts index 3a39abf0d..26d5dc12d 100644 --- a/src/commands/deployAzurePipeline/configureCicdPipeline/configurePipeline.ts +++ b/src/commands/deployAzurePipeline/configureCicdPipeline/configurePipeline.ts @@ -2,6 +2,8 @@ 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'; @@ -9,15 +11,18 @@ export async function configurePipeline(context: IActionContext, target: any): P 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.', diff --git a/src/commands/networkAndConnectivityDiagnostics/networkAndConnectivityDiagnostics.ts b/src/commands/networkAndConnectivityDiagnostics/networkAndConnectivityDiagnostics.ts index 78d3ac64a..4b4321388 100644 --- a/src/commands/networkAndConnectivityDiagnostics/networkAndConnectivityDiagnostics.ts +++ b/src/commands/networkAndConnectivityDiagnostics/networkAndConnectivityDiagnostics.ts @@ -3,6 +3,7 @@ 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'; @@ -10,23 +11,19 @@ import * as htmlhandlers from "handlebars"; import AksClusterTreeItem from '../../tree/aksClusterTreeItem'; export default async function networkAndConnectivityDiagnostics( - context: IActionContext, + _context: IActionContext, target: any ): Promise { 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); } } diff --git a/src/commands/periscope/periscope.ts b/src/commands/periscope/periscope.ts index 7000d092f..a4a3bc7ec 100644 --- a/src/commands/periscope/periscope.ts +++ b/src/commands/periscope/periscope.ts @@ -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, @@ -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 { 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); } } diff --git a/src/commands/utils/clusters.ts b/src/commands/utils/clusters.ts index 654c0f86e..40be06e9c 100644 --- a/src/commands/utils/clusters.ts +++ b/src/commands/utils/clusters.ts @@ -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): 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 { const { resourceGroupName, name } = parseResource(target.id!); if (!resourceGroupName || !name) {