diff --git a/extensions/machine-learning/config.json b/extensions/machine-learning/config.json index a206e4b3e7..84fe9414cc 100644 --- a/extensions/machine-learning/config.json +++ b/extensions/machine-learning/config.json @@ -3,7 +3,7 @@ "requiredPythonPackages": [ { "name": "sqlmlutils", - "version": "1.0.0" + "version": "1.0.1" } ], "requiredRPackages": [ diff --git a/extensions/machine-learning/src/packageManagement/sqlPythonPackageManageProvider.ts b/extensions/machine-learning/src/packageManagement/sqlPythonPackageManageProvider.ts index 642bbd0d92..9a8c5d8bbe 100644 --- a/extensions/machine-learning/src/packageManagement/sqlPythonPackageManageProvider.ts +++ b/extensions/machine-learning/src/packageManagement/sqlPythonPackageManageProvider.ts @@ -67,13 +67,14 @@ export class SqlPythonPackageManageProvider extends SqlPackageManageProviderBase let port = '1433'; let server = connection.serverName; let database = databaseName ? `, database="${databaseName}"` : ''; + const auth = connection.userName ? `, uid="${connection.userName}", pwd="${credentials[azdata.ConnectionOptionSpecialType.password]}"` : ''; let index = connection.serverName.indexOf(','); if (index > 0) { port = connection.serverName.substring(index + 1); server = connection.serverName.substring(0, index); } - let pythonConnectionParts = `server="${server}", port=${port}, uid="${connection.userName}", pwd="${credentials[azdata.ConnectionOptionSpecialType.password]}"${database})`; + let pythonConnectionParts = `server="${server}", port=${port}${auth}${database})`; let pythonCommandScript = scriptMode === ScriptMode.Install ? `pkgmanager.install(package="${packageDetails.name}", version="${packageDetails.version}")` : `pkgmanager.uninstall(package_name="${packageDetails.name}")`; diff --git a/extensions/machine-learning/src/test/packageManagement/sqlPythonPackageManageProvider.test.ts b/extensions/machine-learning/src/test/packageManagement/sqlPythonPackageManageProvider.test.ts index d8a38148c6..bb30529b88 100644 --- a/extensions/machine-learning/src/test/packageManagement/sqlPythonPackageManageProvider.test.ts +++ b/extensions/machine-learning/src/test/packageManagement/sqlPythonPackageManageProvider.test.ts @@ -132,6 +132,7 @@ describe('SQL Python Package Manager', () => { let connection = new azdata.connection.ConnectionProfile(); connection.serverName = 'serverName'; connection.databaseName = 'databaseName'; + connection.userName = 'user'; let credentials = { [azdata.ConnectionOptionSpecialType.password]: 'password' }; testContext.apiWrapper.setup(x => x.getCurrentConnection()).returns(() => { return Promise.resolve(connection); }); testContext.apiWrapper.setup(x => x.getCredentials(TypeMoq.It.isAny())).returns(() => { return Promise.resolve(credentials); }); @@ -173,6 +174,7 @@ describe('SQL Python Package Manager', () => { let connection = new azdata.connection.ConnectionProfile(); connection.serverName = 'serverName'; connection.databaseName = 'databaseName'; + connection.userName = 'user'; let credentials = { [azdata.ConnectionOptionSpecialType.password]: 'password' }; testContext.apiWrapper.setup(x => x.getCurrentConnection()).returns(() => { return Promise.resolve(connection); }); testContext.apiWrapper.setup(x => x.getCredentials(TypeMoq.It.isAny())).returns(() => { return Promise.resolve(credentials); }); @@ -213,6 +215,7 @@ describe('SQL Python Package Manager', () => { let connection = new azdata.connection.ConnectionProfile(); connection.serverName = 'serverName,3433'; connection.databaseName = 'databaseName'; + connection.userName = 'user'; let credentials = { [azdata.ConnectionOptionSpecialType.password]: 'password' }; testContext.apiWrapper.setup(x => x.getCurrentConnection()).returns(() => { return Promise.resolve(connection); }); testContext.apiWrapper.setup(x => x.getCredentials(TypeMoq.It.isAny())).returns(() => { return Promise.resolve(credentials); }); @@ -237,6 +240,88 @@ describe('SQL Python Package Manager', () => { should.deepEqual(packagesUpdated, true); }); + it('installPackages Should not include credential for windows auth', async function (): Promise { + let testContext = createContext(); + let packagesUpdated = false; + let packages: nbExtensionApis.IPackageDetails[] = [ + { + 'name': 'a-name', + 'version': '1.1.2' + }, + { + 'name': 'b-name', + 'version': '1.1.1' + } + ]; + + let connection = new azdata.connection.ConnectionProfile(); + connection.serverName = 'serverName,3433'; + connection.databaseName = 'databaseName'; + let credentials = { [azdata.ConnectionOptionSpecialType.password]: 'password' }; + testContext.apiWrapper.setup(x => x.getCurrentConnection()).returns(() => { return Promise.resolve(connection); }); + testContext.apiWrapper.setup(x => x.getCredentials(TypeMoq.It.isAny())).returns(() => { return Promise.resolve(credentials); }); + testContext.processService.setup(x => x.execScripts(TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns((path, scripts: string[]) => { + + if (path && scripts.find(x => x.indexOf('install') > 0) && + scripts.find(x => x.indexOf('port=3433') > 0) && + scripts.find(x => x.indexOf('server="serverName"') > 0) && + scripts.find(x => x.indexOf('database="databaseName"') > 0) && + scripts.find(x => x.indexOf('package="a-name"') > 0) && + scripts.find(x => x.indexOf('version="1.1.2"') > 0) && + scripts.find(x => x.indexOf('pwd="password"') < 0)) { + packagesUpdated = true; + } + + return Promise.resolve(''); + }); + + let provider = createProvider(testContext); + await provider.installPackages(packages, false, connection.databaseName); + + should.deepEqual(packagesUpdated, true); + }); + + it('installPackages Should not include database if not specified', async function (): Promise { + let testContext = createContext(); + let packagesUpdated = false; + let packages: nbExtensionApis.IPackageDetails[] = [ + { + 'name': 'a-name', + 'version': '1.1.2' + }, + { + 'name': 'b-name', + 'version': '1.1.1' + } + ]; + + let connection = new azdata.connection.ConnectionProfile(); + connection.serverName = 'serverName,3433'; + connection.databaseName = ''; + let credentials = { [azdata.ConnectionOptionSpecialType.password]: 'password' }; + testContext.apiWrapper.setup(x => x.getCurrentConnection()).returns(() => { return Promise.resolve(connection); }); + testContext.apiWrapper.setup(x => x.getCredentials(TypeMoq.It.isAny())).returns(() => { return Promise.resolve(credentials); }); + testContext.processService.setup(x => x.execScripts(TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns((path, scripts: string[]) => { + + if (path && scripts.find(x => x.indexOf('install') > 0) && + scripts.find(x => x.indexOf('port=3433') > 0) && + scripts.find(x => x.indexOf('server="serverName"') > 0) && + scripts.find(x => x.indexOf('database="databaseName"') < 0) && + scripts.find(x => x.indexOf('package="a-name"') > 0) && + scripts.find(x => x.indexOf('version="1.1.2"') > 0) && + scripts.find(x => x.indexOf('pwd="password"') < 0)) { + packagesUpdated = true; + } + + return Promise.resolve(''); + }); + + let provider = createProvider(testContext); + await provider.installPackages(packages, false, connection.databaseName); + + should.deepEqual(packagesUpdated, true); + }); + it('installPackages Should not install any packages give empty list', async function (): Promise { let testContext = createContext(); let packagesUpdated = false; diff --git a/extensions/machine-learning/src/test/views/externalLanguages/languagesDialog.test.ts b/extensions/machine-learning/src/test/views/externalLanguages/languagesDialog.test.ts deleted file mode 100644 index 535f78e6a6..0000000000 --- a/extensions/machine-learning/src/test/views/externalLanguages/languagesDialog.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as should from 'should'; -import 'mocha'; -import { createContext } from './utils'; -import { LanguagesDialog } from '../../../views/externalLanguages/languagesDialog'; - -describe('External Languages Dialog', () => { - it('Should open dialog successfully ', async function (): Promise { - let testContext = createContext(); - let dialog = new LanguagesDialog(testContext.apiWrapper.object, ''); - dialog.showDialog(); - should.notEqual(dialog.addNewLanguageTab, undefined); - should.notEqual(dialog.currentLanguagesTab, undefined); - }); -});