From 9ebf1436d298c1dbc7e7f27db4a5bb3f30a3c67b Mon Sep 17 00:00:00 2001 From: Chris LaFreniere <40371649+chlafreniere@users.noreply.github.com> Date: Tue, 12 Feb 2019 12:46:58 -1000 Subject: [PATCH] Ensure we always switch to a kernel that exists in the session manager (#4015) * Ensure we always switch to a kernel that exists in the session manager * PR feedback, create new helper method --- src/sql/parts/notebook/models/notebookModel.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/sql/parts/notebook/models/notebookModel.ts b/src/sql/parts/notebook/models/notebookModel.ts index d9dd868cd1..d4a5df5bed 100644 --- a/src/sql/parts/notebook/models/notebookModel.ts +++ b/src/sql/parts/notebook/models/notebookModel.ts @@ -427,6 +427,11 @@ export class NotebookModel extends Disposable implements INotebookModel { public doChangeKernel(kernelSpec: nb.IKernelSpec): Promise { this.setProviderIdForKernel(kernelSpec); + // Ensure that the kernel we try to switch to is a valid kernel; if not, use the default + let kernelSpecs = this.getKernelSpecs(); + if (kernelSpecs && kernelSpecs.length > 0 && kernelSpecs.findIndex(k => k.name === kernelSpec.name) < 0) { + kernelSpec = kernelSpecs.find(spec => spec.name === this.notebookManager.sessionManager.specs.defaultKernel); + } if (this._activeClientSession && this._activeClientSession.isReady) { return this._activeClientSession.changeKernel(kernelSpec) .then((kernel) => { @@ -673,13 +678,23 @@ export class NotebookModel extends Disposable implements INotebookModel { // If no SessionManager exists, utilize passed in StandardKernels to see if we can intelligently set _providerId if (!sessionManagerFound) { let provider = this._kernelDisplayNameToNotebookProviderIds.get(kernelSpec.display_name); - if (provider) { + if (provider && provider !== this._providerId) { this._providerId = provider; this._onProviderIdChanged.fire(this._providerId); } } } } + + // Get kernel specs from current sessionManager + private getKernelSpecs(): nb.IKernelSpec[] { + if (this.notebookManager && this.notebookManager.sessionManager && this.notebookManager.sessionManager.specs && + this.notebookManager.sessionManager.specs.kernels) { + return this.notebookManager.sessionManager.specs.kernels; + } + return []; + } + /** * Serialize the model to JSON. */