src/utils/cloudShellUtils.ts (96 lines of code) (raw):

/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ "use strict"; import * as request from "request-promise-native"; import * as TelemetryWrapper from "vscode-extension-telemetry-wrapper"; import { AzureSession, CloudShell } from "../azure-account.api"; export interface IStorageAccount { resourceGroup: string; storageAccountName: string; fileShareName: string; storageAccountKey: string; } export async function getStorageAccountforCloudShell(cloudShell: CloudShell): Promise<IStorageAccount | undefined> { const session: AzureSession = await cloudShell.session; const token: IToken = await acquireToken(session); const userSettings: IUserSettings | undefined = await getUserSettings(token.accessToken, session.environment.resourceManagerEndpointUrl); if (!userSettings) { TelemetryWrapper.sendError(Error("getUserSettingsFail")); return; } const storageProfile: any = userSettings.storageProfile; const storageAccountSettings: any = storageProfile.storageAccountResourceId.substr(1, storageProfile.storageAccountResourceId.length).split("/"); const storageAccountKey: string | undefined = await getStorageAccountKey(token.accessToken, storageAccountSettings[1], storageAccountSettings[3], storageAccountSettings[7]); if (!storageAccountKey) { TelemetryWrapper.sendError(Error("getStorageAccountKeyFail")); return; } return { resourceGroup: storageAccountSettings[3], storageAccountName: storageAccountSettings[7], fileShareName: storageProfile.fileShareName, storageAccountKey, }; } interface IUserSettings { preferredLocation: string; preferredOsType: string; // The last OS chosen in the portal. storageProfile: any; } interface IToken { session: AzureSession; accessToken: string; refreshToken: string; } async function acquireToken(session: AzureSession): Promise<IToken> { return new Promise<IToken>((resolve, reject) => { const credentials: any = session.credentials; const environment: any = session.environment; credentials.context.acquireToken(environment.activeDirectoryResourceId, credentials.username, credentials.clientId, (err: any, result: any) => { if (err) { reject(err); } else { resolve({ session, accessToken: result.accessToken, refreshToken: result.refreshToken, }); } }); }); } const consoleApiVersion = "2017-08-01-preview"; async function getUserSettings(accessToken: string, armEndpoint: string): Promise<IUserSettings | undefined> { const targetUri = `${armEndpoint}/providers/Microsoft.Portal/userSettings/cloudconsole?api-version=${consoleApiVersion}`; const response = await request({ uri: targetUri, method: "GET", headers: { "Accept": "application/json", "Content-Type": "application/json", "Authorization": `Bearer ${accessToken}`, }, simple: false, resolveWithFullResponse: true, json: true, }); if (response.statusCode < 200 || response.statusCode > 299) { return; } return response.body && response.body.properties; } async function getStorageAccountKey(accessToken: string, subscriptionId: string, resourceGroup: string, storageAccountName: string): Promise<string | undefined> { const response = await request({ uri: `https://management.azure.com/subscriptions/${subscriptionId}/resourceGroups/${resourceGroup}/providers/Microsoft.Storage/storageAccounts/${storageAccountName}/listKeys?api-version=2017-06-01`, method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${accessToken}`, }, simple: false, resolveWithFullResponse: true, json: true, }); if (response.statusCode < 200 || response.statusCode > 299) { return; } return response.body && response.body.keys && response.body.keys[0] && response.body.keys[0].value; }