From b92203aae441d1b264a23ed1db584dc698f0c643 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Thu, 17 Sep 2020 14:40:12 -0700 Subject: [PATCH] Merge in changes to release (#13976) * Up release version for new release (#13928) * Up release version * Update changelog * Update changelog * Workaround test issue (#13930) * Try different version of VS code in release * Change to make it use the actual variable * Use a real version * More tests failing with gpu error (#13935) * Try different version of VS code in release * Change to make it use the actual variable * Use a real version * Two more version changes * Fix kernel and server name missing in certain situations (#13974) * Fix kernel name and server name * Fixup server name for remote situations * Add some functional tests * Add news entry * Delete news file --- CHANGELOG.md | 5 ++ build/ci/templates/globals.yml | 1 + .../interactive-common/interactiveBase.ts | 80 ++++++++++++------- .../interactive-ipynb/nativeEditor.ts | 4 +- .../datascience/jupyter/kernels/helpers.ts | 7 +- .../history-react/interactivePanel.tsx | 3 +- .../interactive-common/jupyterInfo.tsx | 42 +--------- .../interactive-common/mainState.ts | 8 +- .../redux/reducers/kernel.ts | 4 +- .../interactive-common/redux/store.ts | 4 +- src/datascience-ui/native-editor/toolbar.tsx | 1 - .../interactivePanel.functional.test.tsx | 4 +- .../nativeEditor.functional.test.tsx | 9 ++- .../nativeEditor.toolbar.functional.test.tsx | 8 +- src/test/datascience/testHelpers.tsx | 9 +++ src/test/debuggerTest.ts | 3 +- src/test/multiRootTest.ts | 4 +- src/test/standardTest.ts | 4 +- 18 files changed, 108 insertions(+), 92 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a6881c00fdb..cae1f6150600 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -84,6 +84,11 @@ ([#13729](https://github.com/Microsoft/vscode-python/issues/13729)) 1. Fix nighly failure with beakerx. ([#13734](https://github.com/Microsoft/vscode-python/issues/13734)) +## 2020.8.6 (15 September 2020) + +### Fixes + +1. Workaround problem caused by https://github.com/microsoft/vscode/issues/106547 ### Thanks diff --git a/build/ci/templates/globals.yml b/build/ci/templates/globals.yml index 03457023e99e..98bd51685dd0 100644 --- a/build/ci/templates/globals.yml +++ b/build/ci/templates/globals.yml @@ -11,3 +11,4 @@ variables: npm_config_cache: $(Pipeline.Workspace)/.npm vmImageMacOS: 'macOS-10.15' TS_NODE_FILES: true # Temporarily enabled to allow using types from vscode.proposed.d.ts from ts-node (for tests). + VSC_PYTHON_CI_TEST_VSC_CHANNEL: '1.48.0' # Enforce this until https://github.com/microsoft/vscode-test/issues/73 is fixed diff --git a/src/client/datascience/interactive-common/interactiveBase.ts b/src/client/datascience/interactive-common/interactiveBase.ts index 1290190964d3..5e0c1d11e16c 100644 --- a/src/client/datascience/interactive-common/interactiveBase.ts +++ b/src/client/datascience/interactive-common/interactiveBase.ts @@ -47,7 +47,7 @@ import { captureTelemetry, sendTelemetryEvent } from '../../telemetry'; import { generateCellRangesFromDocument } from '../cellFactory'; import { CellMatcher } from '../cellMatcher'; import { addToUriList, translateKernelLanguageToMonaco } from '../common'; -import { Commands, Identifiers, Telemetry } from '../constants'; +import { Commands, Identifiers, Settings, Telemetry } from '../constants'; import { ColumnWarningSize, IDataViewerFactory } from '../data-viewing/types'; import { IAddedSysInfo, @@ -865,9 +865,54 @@ export abstract class InteractiveBase extends WebviewPanelHost { + // If we don't have a server connection, make one if remote. We need the remote connection in order + // to compute the display name. However only do this if the user is allowing auto start. + if ( + !serverConnection && + this.configService.getSettings(this.owningResource).datascience.jupyterServerURI !== + Settings.JupyterServerLocalLaunch && + !this.configService.getSettings(this.owningResource).datascience.disableJupyterAutoStart + ) { + serverConnection = await this.notebookProvider.connect({ disableUI: true }); + } + + let displayName = + serverConnection?.displayName || + (!serverConnection?.localLaunch ? serverConnection?.url : undefined) || + (this.configService.getSettings().datascience.jupyterServerURI === Settings.JupyterServerLocalLaunch + ? localize.DataScience.localJupyterServer() + : localize.DataScience.serverNotStarted()); + + if (serverConnection) { + // Determine the connection URI of the connected server to display + if (serverConnection.localLaunch) { + displayName = localize.DataScience.localJupyterServer(); + } else { + // Log this remote URI into our MRU list + addToUriList( + this.globalStorage, + !isNil(serverConnection.url) ? serverConnection.url : serverConnection.displayName, + Date.now(), + serverConnection.displayName + ); + } + } + + return displayName; + } + private combineData( oldData: nbformat.ICodeCell | nbformat.IRawCell | nbformat.IMarkdownCell | undefined, cell: ICell @@ -1154,27 +1199,6 @@ export abstract class InteractiveBase extends WebviewPanelHost { const statusChangeHandler = async (status: ServerStatus) => { const connectionMetadata = notebook.getKernelConnection(); @@ -1182,8 +1206,8 @@ export abstract class InteractiveBase extends WebviewPanelHost } private renderKernelSelection() { - if (this.props.kernel.localizedUri === getLocString('DataScience.localJupyterServer', 'local')) { + if (this.props.kernel.serverName === getLocString('DataScience.localJupyterServer', 'local')) { return; } @@ -235,7 +235,6 @@ ${buildSettingsCss(this.props.settings)}`} selectServer={this.props.selectServer} selectKernel={this.props.selectKernel} shouldShowTrustMessage={false} - settings={this.props.settings} /> ); } diff --git a/src/datascience-ui/interactive-common/jupyterInfo.tsx b/src/datascience-ui/interactive-common/jupyterInfo.tsx index ec94902757f3..62d16d111053 100644 --- a/src/datascience-ui/interactive-common/jupyterInfo.tsx +++ b/src/datascience-ui/interactive-common/jupyterInfo.tsx @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. 'use strict'; -import { isEmpty, isNil } from 'lodash'; import * as React from 'react'; -import { IDataScienceExtraSettings } from '../../client/datascience/types'; import { Image, ImageName } from '../react-common/image'; import { getLocString } from '../react-common/locReactSide'; import { IFont, IServerState, ServerStatus } from './mainState'; @@ -16,7 +14,6 @@ export interface IJupyterInfoProps { kernel: IServerState; isNotebookTrusted?: boolean; shouldShowTrustMessage: boolean; - settings?: IDataScienceExtraSettings | undefined; selectServer(): void; launchNotebookTrustPrompt?(): void; // Native editor-specific selectKernel(): void; @@ -37,17 +34,10 @@ export class JupyterInfo extends React.Component { } public render() { - let jupyterServerDisplayName: string = this.props.kernel.localizedUri; - if (!isNil(this.props.settings) && isEmpty(jupyterServerDisplayName)) { - const jupyterServerUriSetting: string = this.props.settings.jupyterServerURI; - if (!isEmpty(jupyterServerUriSetting) && this.isUriOfComputeInstance(jupyterServerUriSetting)) { - jupyterServerDisplayName = this.getComputeInstanceNameFromId(jupyterServerUriSetting); - } - } - + const jupyterServerDisplayName: string = this.props.kernel.serverName; const serverTextSize = getLocString('DataScience.jupyterServer', 'Jupyter Server').length + jupyterServerDisplayName.length + 4; // plus 4 for the icon - const displayNameTextSize = this.props.kernel.displayName.length + this.props.kernel.jupyterServerStatus.length; + const displayNameTextSize = this.props.kernel.kernelName.length + this.props.kernel.jupyterServerStatus.length; const dynamicFont: React.CSSProperties = { fontSize: 'var(--vscode-font-size)', // Use the same font and size as the menu fontFamily: 'var(--vscode-font-family)', @@ -98,11 +88,11 @@ export class JupyterInfo extends React.Component { role="button" aria-disabled={ariaDisabled} > - {this.props.kernel.displayName}: {this.props.kernel.jupyterServerStatus} + {this.props.kernel.kernelName}: {this.props.kernel.jupyterServerStatus} ); } else { - const displayName = this.props.kernel.displayName ?? getLocString('DataScience.noKernel', 'No Kernel'); + const displayName = this.props.kernel.kernelName ?? getLocString('DataScience.noKernel', 'No Kernel'); return (
{displayName}: {this.props.kernel.jupyterServerStatus} @@ -138,30 +128,6 @@ export class JupyterInfo extends React.Component { : getLocString('DataScience.connected', 'Connected'); } - private isUriOfComputeInstance(uri: string): boolean { - try { - const parsedUrl: URL = new URL(uri); - return parsedUrl.searchParams.get('id') === 'azureml_compute_instances'; - } catch (e) { - return false; - } - } - - private getComputeInstanceNameFromId(id: string | undefined): string { - if (isNil(id)) { - return ''; - } - - const res: string[] | null = id.match( - /\/providers\/Microsoft.MachineLearningServices\/workspaces\/[^\/]+\/computes\/([^\/]+)(\/)?/ - ); - if (isNil(res) || res.length < 2) { - return ''; - } - - return res[1]; - } - private selectServer(): void { this.props.selectServer(); } diff --git a/src/datascience-ui/interactive-common/mainState.ts b/src/datascience-ui/interactive-common/mainState.ts index 250831ac5c3a..f84713746568 100644 --- a/src/datascience-ui/interactive-common/mainState.ts +++ b/src/datascience-ui/interactive-common/mainState.ts @@ -134,8 +134,8 @@ export interface IFont { export interface IServerState { jupyterServerStatus: ServerStatus; - localizedUri: string; - displayName: string; + serverName: string; + kernelName: string; language: string; } @@ -192,8 +192,8 @@ export function generateTestState(filePath: string = '', editable: boolean = fal loaded: false, testMode: true, kernel: { - localizedUri: 'No Kernel', - displayName: 'Python', + serverName: '', + kernelName: 'Python', jupyterServerStatus: ServerStatus.NotStarted, language: PYTHON_LANGUAGE }, diff --git a/src/datascience-ui/interactive-common/redux/reducers/kernel.ts b/src/datascience-ui/interactive-common/redux/reducers/kernel.ts index 7f8f2a8ad95c..c4f3f1de1387 100644 --- a/src/datascience-ui/interactive-common/redux/reducers/kernel.ts +++ b/src/datascience-ui/interactive-common/redux/reducers/kernel.ts @@ -40,9 +40,9 @@ export namespace Kernel { return { ...arg.prevState, kernel: { - localizedUri: arg.payload.data.localizedUri, + serverName: arg.payload.data.serverName, jupyterServerStatus: arg.payload.data.jupyterServerStatus, - displayName: arg.payload.data.displayName, + kernelName: arg.payload.data.kernelName, language: arg.payload.data.language } }; diff --git a/src/datascience-ui/interactive-common/redux/store.ts b/src/datascience-ui/interactive-common/redux/store.ts index 345be932aa1f..7ee0e58627ee 100644 --- a/src/datascience-ui/interactive-common/redux/store.ts +++ b/src/datascience-ui/interactive-common/redux/store.ts @@ -68,8 +68,8 @@ function generateDefaultState( monacoReady: testMode, // When testing, monaco starts out ready loaded: false, kernel: { - displayName: getLocString('DataScience.noKernel', 'No Kernel'), - localizedUri: getLocString('DataScience.serverNotStarted', 'Not Started'), + kernelName: getLocString('DataScience.noKernel', 'No Kernel'), + serverName: getLocString('DataScience.serverNotStarted', 'Not Started'), jupyterServerStatus: ServerStatus.NotStarted, language: PYTHON_LANGUAGE }, diff --git a/src/datascience-ui/native-editor/toolbar.tsx b/src/datascience-ui/native-editor/toolbar.tsx index 63ffab3abf18..ecba9b191e02 100644 --- a/src/datascience-ui/native-editor/toolbar.tsx +++ b/src/datascience-ui/native-editor/toolbar.tsx @@ -268,7 +268,6 @@ export class Toolbar extends React.PureComponent { shouldShowTrustMessage={true} isNotebookTrusted={this.props.isNotebookTrusted} launchNotebookTrustPrompt={launchNotebookTrustPrompt} - settings={this.props.settings} />
diff --git a/src/test/datascience/interactivePanel.functional.test.tsx b/src/test/datascience/interactivePanel.functional.test.tsx index 0ef60f1e23cd..8f2e1179bc41 100644 --- a/src/test/datascience/interactivePanel.functional.test.tsx +++ b/src/test/datascience/interactivePanel.functional.test.tsx @@ -76,9 +76,9 @@ suite('DataScience Interactive Panel', () => { interruptKernel: noopAny, isAtBottom: false, kernel: { - displayName: '', + kernelName: '', jupyterServerStatus: ServerStatus.Busy, - localizedUri: '', + serverName: '', language: PYTHON_LANGUAGE }, knownDark: false, diff --git a/src/test/datascience/nativeEditor.functional.test.tsx b/src/test/datascience/nativeEditor.functional.test.tsx index 041b71198905..f2ec387bd364 100644 --- a/src/test/datascience/nativeEditor.functional.test.tsx +++ b/src/test/datascience/nativeEditor.functional.test.tsx @@ -83,7 +83,8 @@ import { typeCode, verifyCellIndex, verifyCellSource, - verifyHtmlOnCell + verifyHtmlOnCell, + verifyServerStatus } from './testHelpers'; import { ITestNativeEditorProvider } from './testNativeEditorProvider'; @@ -713,6 +714,8 @@ df.head()`; // Make sure it has a server assert.ok(editor.editor.notebook, 'Notebook did not start with a server'); + // Make sure it does have a name though + verifyServerStatus(editor.mount.wrapper, 'local'); } else { context.skip(); } @@ -721,6 +724,7 @@ df.head()`; runMountedTest('Server load skipped', async (context) => { if (ioc.mockJupyter) { ioc.getSettings().datascience.disableJupyterAutoStart = true; + ioc.getSettings().datascience.jupyterServerURI = 'https://remotetest'; await ioc.activate(); // Create an editor so something is listening to messages @@ -731,6 +735,9 @@ df.head()`; // Make sure it does not have a server assert.notOk(editor.editor.notebook, 'Notebook should not start with a server'); + + // Make sure it does have a name though + verifyServerStatus(editor.mount.wrapper, 'Not Started'); } else { context.skip(); } diff --git a/src/test/datascience/nativeEditor.toolbar.functional.test.tsx b/src/test/datascience/nativeEditor.toolbar.functional.test.tsx index b1e86f026daa..e51a44826a41 100644 --- a/src/test/datascience/nativeEditor.toolbar.functional.test.tsx +++ b/src/test/datascience/nativeEditor.toolbar.functional.test.tsx @@ -45,9 +45,9 @@ suite('DataScience Native Toolbar', () => { font: { family: '', size: 1 }, interruptKernel: sinon.stub(), kernel: { - displayName: '', + kernelName: '', jupyterServerStatus: ServerStatus.Busy, - localizedUri: '', + serverName: '', language: PYTHON_LANGUAGE }, restartKernel: sinon.stub(), @@ -245,9 +245,9 @@ suite('DataScience Native Toolbar', () => { font: { family: '', size: 1 }, interruptKernel: sinon.stub(), kernel: { - displayName: '', + kernelName: '', jupyterServerStatus: ServerStatus.Busy, - localizedUri: '', + serverName: '', language: PYTHON_LANGUAGE }, restartKernel: sinon.stub(), diff --git a/src/test/datascience/testHelpers.tsx b/src/test/datascience/testHelpers.tsx index d8c07d1236b6..88798f4334f9 100644 --- a/src/test/datascience/testHelpers.tsx +++ b/src/test/datascience/testHelpers.tsx @@ -221,6 +221,15 @@ export function verifyCellSource( assert.deepStrictEqual(inst.state.model?.getValue(), source, 'Source does not match on cell'); } +export function verifyServerStatus(wrapper: ReactWrapper, React.Component>, statusText: string) { + wrapper.update(); + + const foundResult = wrapper.find('div.kernel-status-server'); + assert.ok(foundResult.length >= 1, "Didn't find server status"); + const html = foundResult.html(); + assert.ok(html.includes(statusText), `${statusText} not found in server status`); +} + export function verifyHtmlOnCell( wrapper: ReactWrapper, React.Component>, cellType: 'NativeCell' | 'InteractiveCell', diff --git a/src/test/debuggerTest.ts b/src/test/debuggerTest.ts index c7fc3e1058d1..3720b0e662ed 100644 --- a/src/test/debuggerTest.ts +++ b/src/test/debuggerTest.ts @@ -10,6 +10,7 @@ import { EXTENSION_ROOT_DIR_FOR_TESTS } from './constants'; const workspacePath = path.join(__dirname, '..', '..', 'src', 'testMultiRootWkspc', 'multi.code-workspace'); process.env.IS_CI_SERVER_TEST_DEBUGGER = '1'; process.env.VSC_PYTHON_CI_TEST = '1'; +const channel = process.env.VSC_PYTHON_CI_TEST_VSC_CHANNEL || 'stable'; function start() { console.log('*'.repeat(100)); @@ -18,7 +19,7 @@ function start() { extensionDevelopmentPath: EXTENSION_ROOT_DIR_FOR_TESTS, extensionTestsPath: path.join(EXTENSION_ROOT_DIR_FOR_TESTS, 'out', 'test', 'index'), launchArgs: [workspacePath], - version: 'stable', + version: channel, extensionTestsEnv: { ...process.env, UITEST_DISABLE_INSIDERS: '1' } }).catch((ex) => { console.error('End Debugger tests (with errors)', ex); diff --git a/src/test/multiRootTest.ts b/src/test/multiRootTest.ts index 5859708a8e99..04631bd1b2ca 100644 --- a/src/test/multiRootTest.ts +++ b/src/test/multiRootTest.ts @@ -11,6 +11,8 @@ process.env.VSC_PYTHON_CI_TEST = '1'; initializeLogger(); +const channel = process.env.VSC_PYTHON_CI_TEST_VSC_CHANNEL || 'stable'; + function start() { console.log('*'.repeat(100)); console.log('Start Multiroot tests'); @@ -18,7 +20,7 @@ function start() { extensionDevelopmentPath: EXTENSION_ROOT_DIR_FOR_TESTS, extensionTestsPath: path.join(EXTENSION_ROOT_DIR_FOR_TESTS, 'out', 'test', 'index'), launchArgs: [workspacePath], - version: 'stable', + version: channel, extensionTestsEnv: { ...process.env, UITEST_DISABLE_INSIDERS: '1' } }).catch((ex) => { console.error('End Multiroot tests (with errors)', ex); diff --git a/src/test/standardTest.ts b/src/test/standardTest.ts index 4a6dd9f2e287..76739ae4b667 100644 --- a/src/test/standardTest.ts +++ b/src/test/standardTest.ts @@ -16,9 +16,7 @@ const extensionDevelopmentPath = process.env.CODE_EXTENSIONS_PATH ? process.env.CODE_EXTENSIONS_PATH : EXTENSION_ROOT_DIR_FOR_TESTS; -const channel = (process.env.VSC_PYTHON_CI_TEST_VSC_CHANNEL || '').toLowerCase().includes('insiders') - ? 'insiders' - : 'stable'; +const channel = process.env.VSC_PYTHON_CI_TEST_VSC_CHANNEL || 'stable'; function start() { console.log('*'.repeat(100));