From ab31a7b9649eb80392a2934c1c10f8ff3814c2ee Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Fri, 18 Oct 2019 17:35:47 -0700 Subject: [PATCH] Open cluster dashboard from SQL Dashboard (#7783) * Open cluster dashboard * Remove old translated strings and update var name * Add exported auth type * Add newline * PR feedback --- .../dialog/bdcDashboardModel.ts | 10 ++--- extensions/big-data-cluster/src/extension.ts | 8 ++-- extensions/mssql/package.json | 8 ++-- extensions/mssql/package.nls.json | 2 +- extensions/mssql/src/constants.ts | 2 +- extensions/mssql/src/main.ts | 39 +++++++++---------- extensions/mssql/src/util/auth.ts | 5 +++ resources/xlf/de/mssql.de.xlf | 4 -- resources/xlf/en/mssql.xlf | 5 +-- resources/xlf/es/mssql.es.xlf | 4 -- resources/xlf/fr/mssql.fr.xlf | 4 -- resources/xlf/it/mssql.it.xlf | 4 -- resources/xlf/ja/mssql.ja.xlf | 4 -- resources/xlf/ko/mssql.ko.xlf | 4 -- resources/xlf/pt-br/mssql.pt-BR.xlf | 4 -- resources/xlf/ru/mssql.ru.xlf | 4 -- resources/xlf/zh-hans/mssql.zh-Hans.xlf | 4 -- resources/xlf/zh-hant/mssql.zh-Hant.xlf | 4 -- 18 files changed, 39 insertions(+), 80 deletions(-) diff --git a/extensions/big-data-cluster/src/bigDataCluster/dialog/bdcDashboardModel.ts b/extensions/big-data-cluster/src/bigDataCluster/dialog/bdcDashboardModel.ts index fe9ad7adfb..09ef025746 100644 --- a/extensions/big-data-cluster/src/bigDataCluster/dialog/bdcDashboardModel.ts +++ b/extensions/big-data-cluster/src/bigDataCluster/dialog/bdcDashboardModel.ts @@ -3,8 +3,6 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import * as azdata from 'azdata'; import * as vscode from 'vscode'; import { ClusterController } from '../controller/clusterControllerApi'; @@ -12,6 +10,8 @@ import { EndpointModel, BdcStatusModel } from '../controller/apiGenerated'; import { showErrorMessage, Endpoint } from '../utils'; import { AuthType } from '../constants'; +export type BdcDashboardOptions = { url: string, auth: AuthType, username: string, password: string }; + export class BdcDashboardModel { private _clusterController: ClusterController; @@ -24,8 +24,8 @@ export class BdcDashboardModel { public onDidUpdateEndpoints = this._onDidUpdateEndpoints.event; public onDidUpdateBdcStatus = this._onDidUpdateBdcStatus.event; - constructor(url: string, auth: AuthType, username: string, private password: string, ignoreSslVerification = true) { - this._clusterController = new ClusterController(url, auth, username, password, ignoreSslVerification); + constructor(private options: BdcDashboardOptions, ignoreSslVerification = true) { + this._clusterController = new ClusterController(options.url, options.auth, options.username, options.password, ignoreSslVerification); this.refresh(); } @@ -81,7 +81,7 @@ export class BdcDashboardModel { serverName: sqlServerMasterEndpoint.endpoint, databaseName: undefined, userName: 'sa', - password: this.password, + password: this.options.password, authenticationType: '', savePassword: true, groupFullName: undefined, diff --git a/extensions/big-data-cluster/src/extension.ts b/extensions/big-data-cluster/src/extension.ts index 1a1f8dd575..9ecf965234 100644 --- a/extensions/big-data-cluster/src/extension.ts +++ b/extensions/big-data-cluster/src/extension.ts @@ -14,7 +14,7 @@ import { TreeNode } from './bigDataCluster/tree/treeNode'; import { AddControllerDialogModel, AddControllerDialog } from './bigDataCluster/dialog/addControllerDialog'; import { ControllerNode } from './bigDataCluster/tree/controllerTreeNode'; import { BdcDashboard } from './bigDataCluster/dialog/bdcDashboard'; -import { BdcDashboardModel } from './bigDataCluster/dialog/bdcDashboardModel'; +import { BdcDashboardModel, BdcDashboardOptions } from './bigDataCluster/dialog/bdcDashboardModel'; import { MountHdfsDialogModel as MountHdfsModel, MountHdfsProperties, MountHdfsDialog, DeleteMountDialog, DeleteMountModel, RefreshMountDialog, RefreshMountModel } from './bigDataCluster/dialog/mountHdfsDialog'; import { getControllerEndpoint } from './bigDataCluster/utils'; @@ -62,9 +62,9 @@ function registerCommands(context: vscode.ExtensionContext, treeDataProvider: Co treeDataProvider.notifyNodeChanged(node); }); - vscode.commands.registerCommand(ManageControllerCommand, async (node: ControllerNode) => { - const title: string = `${localize('bdc.dashboard.title', "Big Data Cluster Dashboard -")} ${ControllerNode.toIpAndPort(node.url)}`; - const dashboard: BdcDashboard = new BdcDashboard(title, new BdcDashboardModel(node.url, node.auth, node.username, node.password)); + vscode.commands.registerCommand(ManageControllerCommand, async (info: ControllerNode | BdcDashboardOptions) => { + const title: string = `${localize('bdc.dashboard.title', "Big Data Cluster Dashboard -")} ${ControllerNode.toIpAndPort(info.url)}`; + const dashboard: BdcDashboard = new BdcDashboard(title, new BdcDashboardModel(info)); dashboard.showDashboard(); }); diff --git a/extensions/mssql/package.json b/extensions/mssql/package.json index 5a373b3b1f..157ea5ec4b 100644 --- a/extensions/mssql/package.json +++ b/extensions/mssql/package.json @@ -77,8 +77,8 @@ } }, { - "command": "mssqlCluster.task.openClusterStatusNotebook", - "title": "%title.openClusterStatusNotebook%", + "command": "mssqlCluster.task.openClusterDashboard", + "title": "%title.openClusterDashboard%", "icon": { "dark": "resources/dark/cluster_status_inverse.svg", "light": "resources/light/cluster_status.svg" @@ -251,7 +251,7 @@ "when": "false" }, { - "command": "mssqlCluster.task.openClusterStatusNotebook", + "command": "mssqlCluster.task.openClusterDashboard", "when": "false" } ], @@ -417,7 +417,7 @@ "mssqlCluster.task.newNotebook", "mssqlCluster.task.openNotebook", "mssqlCluster.livy.task.submitSparkJob", - "mssqlCluster.task.openClusterStatusNotebook" + "mssqlCluster.task.openClusterDashboard" ] } }, diff --git a/extensions/mssql/package.nls.json b/extensions/mssql/package.nls.json index eb4292f53f..451f6abe5d 100644 --- a/extensions/mssql/package.nls.json +++ b/extensions/mssql/package.nls.json @@ -26,7 +26,7 @@ "title.tasks": "Tasks", "title.installPackages": "Install Packages", "title.configurePython": "Configure Python for Notebooks", - "title.openClusterStatusNotebook": "Cluster Status", + "title.openClusterDashboard": "Cluster\nDashboard", "title.searchServers": "Search: Servers", "title.clearSearchServerResult": "Search: Clear Search Server Results", diff --git a/extensions/mssql/src/constants.ts b/extensions/mssql/src/constants.ts index e071911efc..f837ff6c66 100644 --- a/extensions/mssql/src/constants.ts +++ b/extensions/mssql/src/constants.ts @@ -64,7 +64,7 @@ export enum MssqlClusterItemsSubType { // SPARK JOB SUBMISSION ////////////////////////////////////////////////////////// export const mssqlClusterNewNotebookTask = 'mssqlCluster.task.newNotebook'; export const mssqlClusterOpenNotebookTask = 'mssqlCluster.task.openNotebook'; -export const mssqlopenClusterStatusNotebook = 'mssqlCluster.task.openClusterStatusNotebook'; +export const mssqlOpenClusterDashboard = 'mssqlCluster.task.openClusterDashboard'; export const mssqlClusterLivySubmitSparkJobCommand = 'mssqlCluster.livy.cmd.submitSparkJob'; export const mssqlClusterLivySubmitSparkJobFromFileCommand = 'mssqlCluster.livy.cmd.submitFileToSparkJob'; export const mssqlClusterLivySubmitSparkJobTask = 'mssqlCluster.livy.task.submitSparkJob'; diff --git a/extensions/mssql/src/main.ts b/extensions/mssql/src/main.ts index 0b8b33b7fc..b2a2853db5 100644 --- a/extensions/mssql/src/main.ts +++ b/extensions/mssql/src/main.ts @@ -22,11 +22,11 @@ import { OpenSparkYarnHistoryTask } from './sparkFeature/historyTask'; import { MssqlObjectExplorerNodeProvider, mssqlOutputChannel } from './objectExplorerNodeProvider/objectExplorerNodeProvider'; import { registerSearchServerCommand } from './objectExplorerNodeProvider/command'; import { MssqlIconProvider } from './iconProvider'; -import { registerServiceEndpoints } from './dashboard/serviceEndpoints'; +import { registerServiceEndpoints, Endpoint } from './dashboard/serviceEndpoints'; import { getBookExtensionContributions } from './dashboard/bookExtensions'; import { registerBooksWidget } from './dashboard/bookWidget'; import { createMssqlApi } from './mssqlApiFactory'; - +import { AuthType } from './util/auth'; import { SqlToolsServer } from './sqlToolsServer'; import { promises as fs } from 'fs'; import { IconPathHelper } from './iconHelper'; @@ -131,8 +131,8 @@ function activateNotebookTask(appContext: AppContext): void { apiWrapper.registerTaskHandler(Constants.mssqlClusterOpenNotebookTask, (profile: azdata.IConnectionProfile) => { return handleOpenNotebookTask(profile); }); - apiWrapper.registerTaskHandler(Constants.mssqlopenClusterStatusNotebook, (profile: azdata.IConnectionProfile) => { - return handleOpenClusterStatusNotebookTask(profile, appContext); + apiWrapper.registerTaskHandler(Constants.mssqlOpenClusterDashboard, (profile: azdata.IConnectionProfile) => { + return handleOpenClusterDashboardTask(profile, appContext); }); } @@ -203,24 +203,21 @@ async function handleOpenNotebookTask(profile: azdata.IConnectionProfile): Promi } } -async function handleOpenClusterStatusNotebookTask(profile: azdata.IConnectionProfile, appContext: AppContext): Promise { - const notebookRelativePath: string = 'notebooks/tsg/cluster-status.ipynb'; - const notebookFullPath: string = path.join(appContext.extensionContext.extensionPath, notebookRelativePath); - if (!(await Utils.exists(notebookFullPath))) { - vscode.window.showErrorMessage(localize("fileNotFound", "Unable to find the file specified")); - } else { - const title: string = Utils.findNextUntitledEditorName(notebookFullPath); - const untitledFileName: vscode.Uri = vscode.Uri.parse(`untitled:${title}`); - vscode.workspace.openTextDocument(notebookFullPath).then((document) => { - let initialContent = document.getText(); - azdata.nb.showNotebookDocument(untitledFileName, { - connectionProfile: profile, - preview: true, - initialContent: initialContent, - initialDirtyState: false - }); - }); +async function handleOpenClusterDashboardTask(profile: azdata.IConnectionProfile, appContext: AppContext): Promise { + const serverInfo = await azdata.connection.getServerInfo(profile.id); + const controller = Utils.getClusterEndpoints(serverInfo).find(e => e.serviceName === Endpoint.controller); + if (!controller) { + appContext.apiWrapper.showErrorMessage(localize('noController', "Could not find the controller endpoint for this instance")); + return; } + + appContext.apiWrapper.executeCommand('bigDataClusters.command.manageController', + { + url: controller.endpoint, + auth: profile.authenticationType === 'Integrated' ? AuthType.Integrated : AuthType.Basic, + username: 'admin', // Default to admin as a best-guess, we'll prompt for re-entering credentials if that fails + password: profile.password + }); } // this method is called when your extension is deactivated diff --git a/extensions/mssql/src/util/auth.ts b/extensions/mssql/src/util/auth.ts index c6bb89672d..f6b6766549 100644 --- a/extensions/mssql/src/util/auth.ts +++ b/extensions/mssql/src/util/auth.ts @@ -5,6 +5,11 @@ import * as kerberos from 'kerberos'; +export enum AuthType { + Integrated = 'integrated', + Basic = 'basic' +} + export async function authenticateKerberos(hostname: string): Promise { const service = 'HTTP' + (process.platform === 'win32' ? '/' : '@') + hostname; const mechOID = kerberos.GSS_MECH_OID_KRB5; diff --git a/resources/xlf/de/mssql.de.xlf b/resources/xlf/de/mssql.de.xlf index 1baca93b9e..c380d85ad2 100644 --- a/resources/xlf/de/mssql.de.xlf +++ b/resources/xlf/de/mssql.de.xlf @@ -94,10 +94,6 @@ Configure Python for Notebooks Python für Notebooks konfigurieren - - Cluster Status - Clusterstatus - Search: Servers Suche: Server diff --git a/resources/xlf/en/mssql.xlf b/resources/xlf/en/mssql.xlf index b4dc86c66c..fdd6f478c4 100644 --- a/resources/xlf/en/mssql.xlf +++ b/resources/xlf/en/mssql.xlf @@ -73,9 +73,6 @@ Configure Python for Notebooks - - Cluster Status - Search: Servers @@ -905,4 +902,4 @@ Done installing {0} - \ No newline at end of file + diff --git a/resources/xlf/es/mssql.es.xlf b/resources/xlf/es/mssql.es.xlf index d2f142037e..c9ff348cff 100644 --- a/resources/xlf/es/mssql.es.xlf +++ b/resources/xlf/es/mssql.es.xlf @@ -94,10 +94,6 @@ Configure Python for Notebooks Configurar Python para Notebooks - - Cluster Status - Estado del clúster - Search: Servers Buscar: Servidores diff --git a/resources/xlf/fr/mssql.fr.xlf b/resources/xlf/fr/mssql.fr.xlf index d310e79a72..d4193074b3 100644 --- a/resources/xlf/fr/mssql.fr.xlf +++ b/resources/xlf/fr/mssql.fr.xlf @@ -94,10 +94,6 @@ Configure Python for Notebooks Configurer Python pour Notebooks - - Cluster Status - État du cluster - Search: Servers Recherche : Serveurs diff --git a/resources/xlf/it/mssql.it.xlf b/resources/xlf/it/mssql.it.xlf index 303b754fd2..02d410fb8f 100644 --- a/resources/xlf/it/mssql.it.xlf +++ b/resources/xlf/it/mssql.it.xlf @@ -94,10 +94,6 @@ Configure Python for Notebooks Configura Python per Notebooks - - Cluster Status - Stato cluster - Search: Servers Ricerca: Server diff --git a/resources/xlf/ja/mssql.ja.xlf b/resources/xlf/ja/mssql.ja.xlf index 6b3cc0b31a..47bd5fefdd 100644 --- a/resources/xlf/ja/mssql.ja.xlf +++ b/resources/xlf/ja/mssql.ja.xlf @@ -94,10 +94,6 @@ Configure Python for Notebooks ノートブック用 Python の構成 - - Cluster Status - クラスター状態 - Search: Servers 検索: サーバー diff --git a/resources/xlf/ko/mssql.ko.xlf b/resources/xlf/ko/mssql.ko.xlf index dfb8244c7e..3d6b0b084b 100644 --- a/resources/xlf/ko/mssql.ko.xlf +++ b/resources/xlf/ko/mssql.ko.xlf @@ -94,10 +94,6 @@ Configure Python for Notebooks 노트북용 Python 구성 - - Cluster Status - 클러스터 상태 - Search: Servers 검색: 서버 diff --git a/resources/xlf/pt-br/mssql.pt-BR.xlf b/resources/xlf/pt-br/mssql.pt-BR.xlf index 3867d48e30..d7da7fa80f 100644 --- a/resources/xlf/pt-br/mssql.pt-BR.xlf +++ b/resources/xlf/pt-br/mssql.pt-BR.xlf @@ -94,10 +94,6 @@ Configure Python for Notebooks Configurar o Python para notebooks - - Cluster Status - Status do cluster - Search: Servers Pesquisa: servidores diff --git a/resources/xlf/ru/mssql.ru.xlf b/resources/xlf/ru/mssql.ru.xlf index 8b36820ca0..d2699d72a7 100644 --- a/resources/xlf/ru/mssql.ru.xlf +++ b/resources/xlf/ru/mssql.ru.xlf @@ -94,10 +94,6 @@ Configure Python for Notebooks Настройка Python для Записных книжек - - Cluster Status - Состояние кластера - Search: Servers Поиск: Серверы diff --git a/resources/xlf/zh-hans/mssql.zh-Hans.xlf b/resources/xlf/zh-hans/mssql.zh-Hans.xlf index 551b82cea6..401e68aab1 100644 --- a/resources/xlf/zh-hans/mssql.zh-Hans.xlf +++ b/resources/xlf/zh-hans/mssql.zh-Hans.xlf @@ -94,10 +94,6 @@ Configure Python for Notebooks 为笔记本配置 Python - - Cluster Status - 群集状态 - Search: Servers 搜索: 服务器 diff --git a/resources/xlf/zh-hant/mssql.zh-Hant.xlf b/resources/xlf/zh-hant/mssql.zh-Hant.xlf index 75ac606de2..8705fbdc96 100644 --- a/resources/xlf/zh-hant/mssql.zh-Hant.xlf +++ b/resources/xlf/zh-hant/mssql.zh-Hant.xlf @@ -94,10 +94,6 @@ Configure Python for Notebooks 為 Notebooks 設定 Python - - Cluster Status - 叢集狀態 - Search: Servers 搜尋: 伺服器