Feature/viewlet cmsapis (#4312)

* first set of changes to experiment the registration of cms related apis

* Adding cms service entry to workbench

* Adding basic functionality for add remove reg servers and group

* Returning relative path as part of RegServerResult as string

* Removing the cms apis from core. Having mssql extension expose them for cms extension

* Propogating the backend name changes to apis

* Fixing some missing sqlops references

* Adding a sqltools service version with CMS apis available
This commit is contained in:
udeeshagautam
2019-03-22 17:24:45 -07:00
committed by Anthony Dresser
parent d00c3780a6
commit ddce7731b9
9 changed files with 283 additions and 7 deletions

View File

@@ -22,6 +22,14 @@ export interface MssqlExtensionApi {
* @memberof IMssqlExtensionApi
*/
getMssqlObjectExplorerBrowser(): MssqlObjectExplorerBrowser;
/**
* Get the Cms Service APIs to communicate with CMS connections supported by this extension
*
* @returns {Promise<CmsService>}
* @memberof IMssqlExtensionApi
*/
getCmsServiceProvider(): Promise<CmsService>;
}
/**
@@ -63,3 +71,95 @@ export interface ITreeNode {
export interface IFileNode extends ITreeNode {
getFileContentsAsString(maxBytes?: number): Promise<string>;
}
/**
*
* Interface containing all CMS related operations
*/
export interface CmsService {
/**
* Connects to or creates a Central management Server
*
* @param {string} name
* @param {string} description
* @param {azdata.ConnectionInfo} connectiondetails
* @param {string} ownerUri
* @returns {Thenable<azdata.ListRegisteredServersResult>}
*/
createCmsServer(name: string, description:string, connectiondetails: azdata.ConnectionInfo, ownerUri: string): Thenable<ListRegisteredServersResult>;
/**
* gets all Registered Servers inside a CMS on a particular level
*
* @param {string} ownerUri
* @param {string} relativePath
* @returns {Thenable<azdata.ListRegisteredServersResult>}
*/
getRegisteredServers(ownerUri: string, relativePath: string): Thenable<ListRegisteredServersResult>;
/**
* Adds a Registered Server inside a CMS on a particular level
*
* @param {string} ownerUri
* @param {string} relativePath
* @param {string} registeredServerName
* @param {string} registeredServerDescription
* @param {azdata.ConnectionInfo} connectiondetails
* @returns {Thenable<boolean>>}
*/
addRegisteredServer (ownerUri: string, relativePath: string, registeredServerName: string, registeredServerDescription:string, connectionDetails:azdata.ConnectionInfo): Thenable<boolean>;
/**
* Removes a Registered Server inside a CMS on a particular level
*
* @param {string} ownerUri
* @param {string} relativePath
* @param {string} registeredServerName
* @returns {Thenable<boolean>}
*/
removeRegisteredServer (ownerUri: string, relativePath: string, registeredServerName: string): Thenable<boolean>;
/**
* Adds a Server Group inside a CMS on a particular level
*
* @param {string} ownerUri
* @param {string} relativePath
* @param {string} groupName
* @param {string} groupDescription
* @param {azdata.ConnectionInfo} connectiondetails
*/
addServerGroup (ownerUri: string, relativePath: string, groupName: string, groupDescription:string): Thenable<boolean>;
/**
* Removes a Server Group inside a CMS on a particular level
*
* @param {string} ownerUri
* @param {string} relativePath
* @param {string} groupName
* @param {string} groupDescription
*/
removeServerGroup (ownerUri: string, relativePath: string, groupName: string): Thenable<boolean>;
}
/**
* CMS Result interfaces as passed back to Extensions
*/
export interface RegisteredServerResult {
name: string;
serverName: string;
description: string;
connectionDetails: azdata.ConnectionInfo;
relativePath: string;
}
export interface RegisteredServerGroup {
name: string;
description: string;
relativePath: string;
}
export interface ListRegisteredServersResult {
registeredServersList: Array<RegisteredServerResult>;
registeredServerGroups: Array<RegisteredServerGroup>;
}

View File

@@ -0,0 +1,102 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as azdata from 'azdata';
import * as constants from '../constants';
import * as contracts from '../contracts';
import { AppContext } from '../appContext';
import { ConnectParams } from 'dataprotocol-client/lib/protocol';
import { SqlOpsDataClient } from 'dataprotocol-client';
import { ListRegisteredServersResult } from '../api/mssqlapis';
export class CmsService {
constructor(private appContext: AppContext, private client: SqlOpsDataClient) {
this.appContext.registerService<CmsService>(constants.CmsService, this);
}
createCmsServer(name: string, description:string, connectiondetails: azdata.ConnectionInfo, ownerUri: string): Thenable<ListRegisteredServersResult> {
let connectparams: ConnectParams = { ownerUri: ownerUri, connection: connectiondetails };
let cmsparams: contracts.CreateCentralManagementServerParams = { registeredServerName: name, registeredServerDescription: description, connectParams: connectparams};
return this.client.sendRequest(contracts.CreateCentralManagementServerRequest.type, cmsparams).then(
r => {
return r;
},
e => {
this.client.logFailedRequest(contracts.CreateCentralManagementServerRequest.type, e);
return Promise.resolve(undefined);
}
);
}
getRegisteredServers(ownerUri: string, relativePath: string): Thenable<ListRegisteredServersResult> {
let params: contracts.ListRegisteredServersParams = { parentOwnerUri: ownerUri, relativePath: relativePath };
return this.client.sendRequest(contracts.ListRegisteredServersRequest.type, params).then(
r => {
return r;
},
e => {
this.client.logFailedRequest(contracts.ListRegisteredServersRequest.type, e);
return Promise.resolve(undefined);
}
);
}
addRegisteredServer (ownerUri: string, relativePath: string, registeredServerName: string, registeredServerDescription:string, connectionDetails:azdata.ConnectionInfo): Thenable<boolean> {
let params: contracts.AddRegisteredServerParams = { parentOwnerUri: ownerUri, relativePath: relativePath, registeredServerName: registeredServerName, registeredServerDescription: registeredServerDescription, registeredServerConnectionDetails: connectionDetails };
return this.client.sendRequest(contracts.AddRegisteredServerRequest.type, params).then(
r => {
return r;
},
e => {
this.client.logFailedRequest(contracts.AddRegisteredServerRequest.type, e);
return Promise.resolve(undefined);
}
);
}
removeRegisteredServer (ownerUri: string, relativePath: string, registeredServerName: string): Thenable<boolean> {
let params: contracts.RemoveRegisteredServerParams = { parentOwnerUri: ownerUri, relativePath: relativePath, registeredServerName: registeredServerName };
return this.client.sendRequest(contracts.RemoveRegisteredServerRequest.type, params).then(
r => {
return r;
},
e => {
this.client.logFailedRequest(contracts.RemoveRegisteredServerRequest.type, e);
return Promise.resolve(undefined);
}
);
}
addServerGroup (ownerUri: string, relativePath: string, groupName: string, groupDescription:string): Thenable<boolean> {
let params: contracts.AddServerGroupParams = { parentOwnerUri: ownerUri, relativePath: relativePath, groupName: groupName, groupDescription: groupDescription };
return this.client.sendRequest(contracts.AddServerGroupRequest.type, params).then(
r => {
return r;
},
e => {
this.client.logFailedRequest(contracts.AddServerGroupRequest.type, e);
return Promise.resolve(undefined);
}
);
}
removeServerGroup (ownerUri: string, relativePath: string, groupName: string): Thenable<boolean> {
let params: contracts.RemoveServerGroupParams = { parentOwnerUri: ownerUri, relativePath: relativePath, groupName: groupName };
return this.client.sendRequest(contracts.RemoveServerGroupRequest.type, params).then(
r => {
return r;
},
e => {
this.client.logFailedRequest(contracts.RemoveServerGroupRequest.type, e);
return Promise.resolve(undefined);
}
);
}
}

View File

@@ -1,6 +1,6 @@
{
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}",
"version": "1.5.0-alpha.71",
"version": "1.5.0-alpha.74",
"downloadFileNames": {
"Windows_86": "win-x86-netcoreapp2.2.zip",
"Windows_64": "win-x64-netcoreapp2.2.zip",

View File

@@ -37,6 +37,7 @@ export const isBigDataClusterProperty = 'isBigDataCluster';
// SERVICE NAMES //////////////////////////////////////////////////////////
export const ObjectExplorerService = 'objectexplorer';
export const CmsService = 'cmsService';
export const objectExplorerPrefix: string = 'objectexplorer://';
export const ViewType = 'view';

View File

@@ -7,6 +7,8 @@
import { NotificationType, RequestType } from 'vscode-languageclient';
import { ITelemetryEventProperties, ITelemetryEventMeasures } from './telemetry';
import * as azdata from 'azdata';
import { ConnectParams } from 'dataprotocol-client/lib/protocol';
import { ListRegisteredServersResult } from './api/mssqlapis';
// ------------------------------- < Telemetry Sent Event > ------------------------------------
@@ -369,4 +371,66 @@ export namespace GenerateDeployScriptRequest {
export namespace GenerateDeployPlanRequest {
export const type = new RequestType<GenerateDeployPlanParams, azdata.GenerateDeployPlanResult, void, void>('dacfx/generateDeployPlan');
}
// ------------------------------- < DacFx > ------------------------------------
// ------------------------------- < DacFx > ------------------------------------
// ------------------------------- <CMS> ----------------------------------------
export interface CreateCentralManagementServerParams {
registeredServerName: string;
registeredServerDescription : string;
connectParams: ConnectParams;
}
export interface ListRegisteredServersParams extends RegisteredServerParamsBase {
// same as base
}
export interface AddRegisteredServerParams extends RegisteredServerParamsBase {
registeredServerName: string;
registeredServerDescription : string;
registeredServerConnectionDetails: azdata.ConnectionInfo;
}
export interface RemoveRegisteredServerParams extends RegisteredServerParamsBase {
registeredServerName: string;
}
export interface AddServerGroupParams extends RegisteredServerParamsBase {
groupName: string;
groupDescription: string;
}
export interface RemoveServerGroupParams extends RegisteredServerParamsBase {
groupName: string;
}
export interface RegisteredServerParamsBase {
parentOwnerUri: string;
relativePath: string;
}
export namespace CreateCentralManagementServerRequest {
export const type = new RequestType<CreateCentralManagementServerParams, ListRegisteredServersResult, void, void>('cms/createCms');
}
export namespace ListRegisteredServersRequest {
export const type = new RequestType<ListRegisteredServersParams, ListRegisteredServersResult, void, void>('cms/listRegisteredServers');
}
export namespace AddRegisteredServerRequest {
export const type = new RequestType<AddRegisteredServerParams, boolean, void, void>('cms/addRegisteredServer');
}
export namespace RemoveRegisteredServerRequest {
export const type = new RequestType<RemoveRegisteredServerParams, boolean, void, void>('cms/removeRegisteredServer');
}
export namespace AddServerGroupRequest {
export const type = new RequestType<AddServerGroupParams, boolean, void, void>('cms/addCmsServerGroup');
}
export namespace RemoveServerGroupRequest {
export const type = new RequestType<RemoveServerGroupParams, boolean, void, void>('cms/removeCmsServerGroup');
}
// ------------------------------- <CMS> ----------------------------------------

View File

@@ -12,6 +12,7 @@ import * as contracts from './contracts';
import * as azdata from 'azdata';
import * as Utils from './utils';
import * as UUID from 'vscode-languageclient/lib/utils/uuid';
import { ConnectParams } from 'dataprotocol-client/lib/protocol';
export class TelemetryFeature implements StaticFeature {
@@ -672,4 +673,4 @@ export class AgentServicesFeature extends SqlOpsFeature<undefined> {
registerOnUpdated
});
}
}
}

View File

@@ -13,7 +13,7 @@ const localize = nls.loadMessageBundle();
import { SqlOpsDataClient, ClientOptions } from 'dataprotocol-client';
import { IConfig, ServerProvider, Events } from 'service-downloader';
import { ServerOptions, TransportKind } from 'vscode-languageclient';
import { ServerOptions, TransportKind, LanguageClient } from 'vscode-languageclient';
import * as Constants from './constants';
import ContextProvider from './contextProvider';
@@ -31,6 +31,7 @@ import { MssqlExtensionApi, MssqlObjectExplorerBrowser } from './api/mssqlapis';
import { OpenSparkJobSubmissionDialogCommand, OpenSparkJobSubmissionDialogFromFileCommand, OpenSparkJobSubmissionDialogTask } from './sparkFeature/dialog/dialogCommands';
import { OpenSparkYarnHistoryTask } from './sparkFeature/historyTask';
import { MssqlObjectExplorerNodeProvider, mssqlOutputChannel } from './objectExplorerNodeProvider/objectExplorerNodeProvider';
import { CmsService } from './cms/cmsService';
const baseConfig = require('./config.json');
const outputChannel = vscode.window.createOutputChannel(Constants.serviceName);
@@ -57,6 +58,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<MssqlE
const credentialsStore = new CredentialStore(config);
const resourceProvider = new AzureResourceProvider(config);
let languageClient: SqlOpsDataClient;
let cmsService: CmsService;
const serverdownloader = new ServerProvider(config);
@@ -83,7 +85,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<MssqlE
let appContext = new AppContext(context, new ApiWrapper());
const installationStart = Date.now();
serverdownloader.getOrDownloadServer().then(e => {
let serverPromise = serverdownloader.getOrDownloadServer().then(e => {
const installationComplete = Date.now();
let serverOptions = generateServerOptions(e);
languageClient = new SqlOpsDataClient(Constants.serviceName, serverOptions, clientOptions);
@@ -109,6 +111,9 @@ export async function activate(context: vscode.ExtensionContext): Promise<MssqlE
let nodeProvider = new MssqlObjectExplorerNodeProvider(prompter, appContext);
azdata.dataprotocol.registerObjectExplorerNodeProvider(nodeProvider);
cmsService = new CmsService(appContext, languageClient);
activateSparkFeatures(appContext);
activateNotebookTask(appContext);
}, e => {
@@ -136,6 +141,9 @@ export async function activate(context: vscode.ExtensionContext): Promise<MssqlE
return <any>oeProvider.findSqlClusterNodeByContext(context);
}
};
},
getCmsServiceProvider(): Promise<CmsService> {
return serverPromise.then(() => cmsService);
}
};
return api;