Notebooks: Support User-Installed Kernels (#10194)

* Fixes for attach to. Still need to update cache

* Don't have jupyter hardcoded

* Handle DOTNET_ROOT env var

* Fix on load

* Put behind feature flag

* Cleanup

* Error check

* PR feedback
This commit is contained in:
Chris LaFreniere
2020-04-29 10:34:27 -07:00
committed by GitHub
parent 5b57b13005
commit 0a3a0ec80f
7 changed files with 78 additions and 39 deletions

View File

@@ -27,6 +27,7 @@ import { IObjectExplorerService } from 'sql/workbench/services/objectExplorer/br
import { TreeUpdateUtils } from 'sql/workbench/services/objectExplorer/browser/treeUpdateUtils';
import { find, firstIndex } from 'vs/base/common/arrays';
import { INotebookEditor } from 'sql/workbench/services/notebook/browser/notebookService';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
const msgLoading = localize('loading', "Loading kernels...");
const msgChanging = localize('changing', "Changing kernel...");
@@ -208,9 +209,12 @@ export class CollapseCellsAction extends ToggleableAction {
}
}
const ShowAllKernelsConfigName = 'notebook.showAllKernels';
const WorkbenchPreviewConfigName = 'workbench.enablePreviewFeatures';
export class KernelsDropdown extends SelectBox {
private model: NotebookModel;
constructor(container: HTMLElement, contextViewProvider: IContextViewProvider, modelReady: Promise<INotebookModel>) {
private _showAllKernels: boolean = false;
constructor(container: HTMLElement, contextViewProvider: IContextViewProvider, modelReady: Promise<INotebookModel>, @IConfigurationService private _configurationService: IConfigurationService) {
super([msgLoading], msgLoading, contextViewProvider, container, { labelText: kernelLabel, labelOnTop: false, ariaLabel: kernelLabel } as ISelectBoxOptionsWithLabel);
if (modelReady) {
@@ -222,6 +226,12 @@ export class KernelsDropdown extends SelectBox {
}
this.onDidSelect(e => this.doChangeKernel(e.selected));
this.getAllKernelConfigValue();
this._register(this._configurationService.onDidChangeConfiguration(e => {
if (e.affectsConfiguration(ShowAllKernelsConfigName) || e.affectsConfiguration(WorkbenchPreviewConfigName)) {
this.getAllKernelConfigValue();
}
}));
}
updateModel(model: INotebookModel): void {
@@ -235,12 +245,23 @@ export class KernelsDropdown extends SelectBox {
// Update SelectBox values
public updateKernel(kernel: azdata.nb.IKernel) {
let kernels: string[] = this.model.standardKernelsDisplayName();
let kernels: string[] = this._showAllKernels ? [...new Set(this.model.specs.kernels.map(a => a.display_name).concat(this.model.standardKernelsDisplayName()))]
: this.model.standardKernelsDisplayName();
if (kernel && kernel.isReady) {
let standardKernel = this.model.getStandardKernelFromName(kernel.name);
if (kernels && standardKernel) {
let index = firstIndex(kernels, kernel => kernel === standardKernel.displayName);
if (kernels) {
let index;
if (standardKernel) {
index = firstIndex(kernels, kernel => kernel === standardKernel.displayName);
} else {
let kernelSpec = this.model.specs.kernels.find(k => k.name === kernel.name);
index = firstIndex(kernels, k => k === kernelSpec.display_name);
}
// This is an error case that should never happen
// Just in case, setting index to 0
if (index < 0) {
index = 0;
}
this.setOptions(kernels, index);
}
} else if (this.model.clientSession.isInErrorState) {
@@ -254,6 +275,10 @@ export class KernelsDropdown extends SelectBox {
this.setOptions([msgChanging], 0);
this.model.changeKernel(displayName);
}
private getAllKernelConfigValue(): void {
this._showAllKernels = !!this._configurationService.getValue(ShowAllKernelsConfigName) && !!this._configurationService.getValue(WorkbenchPreviewConfigName);
}
}
export class AttachToDropdown extends SelectBox {