From 56a6f70c0db1070ba7bc606a7f6ac04109c25317 Mon Sep 17 00:00:00 2001 From: Leila Lali Date: Mon, 3 Feb 2020 09:25:36 -0800 Subject: [PATCH] Machine Learning Services Settings (#8968) * Added two config to Machine Learning Services extension to enable and disable python and r --- .../{src/configurations => }/config.json | 0 .../machine-learning-services/package.json | 10 +++++++++ .../package.nls.json | 6 +++-- .../src/common/constants.ts | 2 ++ .../src/configurations/config.ts | 22 ++++++++++++++----- .../src/packageManagement/packageManager.ts | 6 +++++ .../sqlPythonPackageManageProvider.ts | 3 +++ .../sqlRPackageManageProvider.ts | 3 +++ .../packageManagement/packageManager.test.ts | 2 ++ .../sqlPythonPackageManageProvider.test.ts | 11 ++++++++++ .../sqlRPackageManageProvider.test.ts | 11 ++++++++++ 11 files changed, 68 insertions(+), 8 deletions(-) rename extensions/machine-learning-services/{src/configurations => }/config.json (100%) diff --git a/extensions/machine-learning-services/src/configurations/config.json b/extensions/machine-learning-services/config.json similarity index 100% rename from extensions/machine-learning-services/src/configurations/config.json rename to extensions/machine-learning-services/config.json diff --git a/extensions/machine-learning-services/package.json b/extensions/machine-learning-services/package.json index b99aee3fcc..d4119b51ff 100644 --- a/extensions/machine-learning-services/package.json +++ b/extensions/machine-learning-services/package.json @@ -30,6 +30,16 @@ "type": "object", "title": "%mls.configuration.title%", "properties": { + "machineLearningServices.enablePython": { + "type": "boolean", + "default": "true", + "description": "%mls.enablePython.description%" + }, + "machineLearningServices.enableR": { + "type": "boolean", + "default": "true", + "description": "%mls.enableR.description%" + }, "machineLearningServices.pythonPath": { "type": "string", "default": "python", diff --git a/extensions/machine-learning-services/package.nls.json b/extensions/machine-learning-services/package.nls.json index fe627e0ff3..cf723b3dc4 100644 --- a/extensions/machine-learning-services/package.nls.json +++ b/extensions/machine-learning-services/package.nls.json @@ -8,7 +8,9 @@ "mls.command.odbcdriver": "Install ODBC Driver for SQL Server", "mls.command.mlsdocs": "Machine Learning Services Documentation", "mls.configuration.title": "Machine Learning Services configurations", - "mls.pythonPath.description": "Local path to a preexisting python installation used by Machine Learning Services.", - "mls.rPath.description": "Local path to a preexisting python installation used by Machine Learning Services.", + "mls.pythonPath.description": "Local path to a preexisting Python installation used by Machine Learning Services.", + "mls.enablePython.description": "Enable Python package management.", + "mls.enableR.description": "Enable R package management.", + "mls.rPath.description": "Local path to a preexisting R installation used by Machine Learning Services.", "mls.command.dependencies": "Install Machine Learning Services Dependencies" } diff --git a/extensions/machine-learning-services/src/common/constants.ts b/extensions/machine-learning-services/src/common/constants.ts index 33ddda939b..4171cba035 100644 --- a/extensions/machine-learning-services/src/common/constants.ts +++ b/extensions/machine-learning-services/src/common/constants.ts @@ -30,6 +30,8 @@ export const mlsDependenciesCommand = 'mls.command.dependencies'; // export const mlsConfigKey = 'machineLearningServices'; export const pythonPathConfigKey = 'pythonPath'; +export const pythonEnabledConfigKey = 'enablePython'; +export const rEnabledConfigKey = 'enableR'; export const rPathConfigKey = 'rPath'; // Localized texts diff --git a/extensions/machine-learning-services/src/configurations/config.ts b/extensions/machine-learning-services/src/configurations/config.ts index 90428681f2..3f804c4647 100644 --- a/extensions/machine-learning-services/src/configurations/config.ts +++ b/extensions/machine-learning-services/src/configurations/config.ts @@ -21,7 +21,6 @@ const defaultRExecutable = 'r'; export class Config { private _configValues: any; - private _mlsConfig: vscode.WorkspaceConfiguration | undefined; constructor(private _root: string, private _apiWrapper: ApiWrapper) { } @@ -30,7 +29,7 @@ export class Config { * Loads the config values */ public async load(): Promise { - const rawConfig = await fs.readFile(path.join(this._root, 'out', 'configurations', configFileName)); + const rawConfig = await fs.readFile(path.join(this._root, configFileName)); this._configValues = JSON.parse(rawConfig.toString()); } @@ -62,6 +61,20 @@ export class Config { return this.config.get(constants.pythonPathConfigKey) || defaultPythonExecutable; } + /** + * Returns true if python package management is enabled + */ + public get pythonEnabled(): boolean { + return this.config.get(constants.pythonEnabledConfigKey) || false; + } + + /** + * Returns true if r package management is enabled + */ + public get rEnabled(): boolean { + return this.config.get(constants.rEnabledConfigKey) || false; + } + /** * Returns r path from user settings */ @@ -70,9 +83,6 @@ export class Config { } private get config(): vscode.WorkspaceConfiguration { - if (!this._mlsConfig) { - this._mlsConfig = this._apiWrapper.getConfiguration(constants.mlsConfigKey); - } - return this._mlsConfig; + return this._apiWrapper.getConfiguration(constants.mlsConfigKey); } } diff --git a/extensions/machine-learning-services/src/packageManagement/packageManager.ts b/extensions/machine-learning-services/src/packageManagement/packageManager.ts index 5a597e98a3..fd23138f83 100644 --- a/extensions/machine-learning-services/src/packageManagement/packageManager.ts +++ b/extensions/machine-learning-services/src/packageManagement/packageManager.ts @@ -132,6 +132,9 @@ export class PackageManager { } private async installRequiredRPackages(startBackgroundOperation: azdata.BackgroundOperation): Promise { + if (!this._config.rEnabled) { + return; + } if (!this._rExecutable) { throw new Error(constants.rConfigError); } @@ -143,6 +146,9 @@ export class PackageManager { * Installs required python packages */ private async installRequiredPythonPackages(): Promise { + if (!this._config.pythonEnabled) { + return; + } if (!this._pythonExecutable) { throw new Error(constants.pythonConfigError); } diff --git a/extensions/machine-learning-services/src/packageManagement/sqlPythonPackageManageProvider.ts b/extensions/machine-learning-services/src/packageManagement/sqlPythonPackageManageProvider.ts index f79d863049..086a166af9 100644 --- a/extensions/machine-learning-services/src/packageManagement/sqlPythonPackageManageProvider.ts +++ b/extensions/machine-learning-services/src/packageManagement/sqlPythonPackageManageProvider.ts @@ -93,6 +93,9 @@ export class SqlPythonPackageManageProvider extends SqlPackageManageProviderBase * Returns true if the provider can be used */ async canUseProvider(): Promise { + if (!this._config.pythonEnabled) { + return false; + } let connection = await this.getCurrentConnection(); if (connection && await this._queryRunner.isPythonInstalled(connection)) { return true; diff --git a/extensions/machine-learning-services/src/packageManagement/sqlRPackageManageProvider.ts b/extensions/machine-learning-services/src/packageManagement/sqlRPackageManageProvider.ts index d51c6bf22b..eecbeec22f 100644 --- a/extensions/machine-learning-services/src/packageManagement/sqlRPackageManageProvider.ts +++ b/extensions/machine-learning-services/src/packageManagement/sqlRPackageManageProvider.ts @@ -92,6 +92,9 @@ export class SqlRPackageManageProvider extends SqlPackageManageProviderBase impl * Returns true if the provider can be used */ async canUseProvider(): Promise { + if (!this._config.rEnabled) { + return false; + } let connection = await this.getCurrentConnection(); if (connection && await this._queryRunner.isRInstalled(connection)) { return true; diff --git a/extensions/machine-learning-services/src/test/packageManagement/packageManager.test.ts b/extensions/machine-learning-services/src/test/packageManagement/packageManager.test.ts index dd3a489628..6e93c9ca79 100644 --- a/extensions/machine-learning-services/src/test/packageManagement/packageManager.test.ts +++ b/extensions/machine-learning-services/src/test/packageManagement/packageManager.test.ts @@ -192,6 +192,8 @@ describe('Package Manager', () => { testContext.httpClient.setup(x => x.download(TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => Promise.resolve()); testContext.config.setup(x => x.pythonExecutable).returns(() => 'python'); testContext.config.setup(x => x.rExecutable).returns(() => 'r'); + testContext.config.setup(x => x.rEnabled).returns(() => true); + testContext.config.setup(x => x.pythonEnabled).returns(() => true); let packageManager = new PackageManager( testContext.outputChannel, '', diff --git a/extensions/machine-learning-services/src/test/packageManagement/sqlPythonPackageManageProvider.test.ts b/extensions/machine-learning-services/src/test/packageManagement/sqlPythonPackageManageProvider.test.ts index b665e5ed14..afafb5db55 100644 --- a/extensions/machine-learning-services/src/test/packageManagement/sqlPythonPackageManageProvider.test.ts +++ b/extensions/machine-learning-services/src/test/packageManagement/sqlPythonPackageManageProvider.test.ts @@ -319,6 +319,16 @@ describe('SQL Python Package Manager', () => { should.deepEqual(actual, true); }); + it('canUseProvider Should return false if python is disabled in setting', async function (): Promise { + let testContext = createContext(); + + let provider = createProvider(testContext); + testContext.config.setup(x => x.pythonEnabled).returns(() => false); + let actual = await provider.canUseProvider(); + + should.deepEqual(actual, false); + }); + it('getPackageOverview Should return package info using python packages provider', async function (): Promise { let testContext = createContext(); let packagePreview = { @@ -376,6 +386,7 @@ describe('SQL Python Package Manager', () => { function createProvider(testContext: TestContext): SqlPythonPackageManageProvider { testContext.config.setup(x => x.pythonExecutable).returns(() => 'python'); + testContext.config.setup(x => x.pythonEnabled).returns(() => true); return new SqlPythonPackageManageProvider( testContext.outputChannel, testContext.apiWrapper.object, diff --git a/extensions/machine-learning-services/src/test/packageManagement/sqlRPackageManageProvider.test.ts b/extensions/machine-learning-services/src/test/packageManagement/sqlRPackageManageProvider.test.ts index 926398daac..2fbfc33121 100644 --- a/extensions/machine-learning-services/src/test/packageManagement/sqlRPackageManageProvider.test.ts +++ b/extensions/machine-learning-services/src/test/packageManagement/sqlRPackageManageProvider.test.ts @@ -243,6 +243,16 @@ describe('SQL R Package Manager', () => { should.deepEqual(actual, true); }); + it('canUseProvider Should return false if r is disabled in setting', async function (): Promise { + let testContext = createContext(); + + let provider = createProvider(testContext); + testContext.config.setup(x => x.rEnabled).returns(() => false); + let actual = await provider.canUseProvider(); + + should.deepEqual(actual, false); + }); + it('getPackageOverview Should return package info successfully', async function (): Promise { let testContext = createContext(); let packagePreview = { @@ -301,6 +311,7 @@ describe('SQL R Package Manager', () => { function createProvider(testContext: TestContext): SqlRPackageManageProvider { testContext.config.setup(x => x.rExecutable).returns(() => 'r'); + testContext.config.setup(x => x.rEnabled).returns(() => true); testContext.config.setup(x => x.rPackagesRepository).returns(() => 'http://cran.r-project.org'); return new SqlRPackageManageProvider( testContext.outputChannel,