Add ability to pass in initial variable values to deployment wizards (#14224)

This commit is contained in:
Charles Gagnon
2021-02-10 13:55:16 -08:00
committed by GitHub
parent bb29ae00c9
commit 45adb7d8d7
8 changed files with 26 additions and 16 deletions

View File

@@ -498,3 +498,8 @@ export interface Command {
additionalEnvironmentVariables?: NodeJS.ProcessEnv; additionalEnvironmentVariables?: NodeJS.ProcessEnv;
ignoreError?: boolean; ignoreError?: boolean;
} }
/**
* Map of the set of variables and the values to assign to them upon initialization - overriding the base default.
*/
export type InitialVariableValues = { [key: string]: string | boolean };

View File

@@ -9,7 +9,7 @@ import * as os from 'os';
import * as path from 'path'; import * as path from 'path';
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as nls from 'vscode-nls'; import * as nls from 'vscode-nls';
import { DeploymentProvider, instanceOfAzureSQLVMDeploymentProvider, instanceOfAzureSQLDBDeploymentProvider, instanceOfCommandDeploymentProvider, instanceOfDialogDeploymentProvider, instanceOfDownloadDeploymentProvider, instanceOfNotebookBasedDialogInfo, instanceOfNotebookDeploymentProvider, instanceOfNotebookWizardDeploymentProvider, instanceOfWebPageDeploymentProvider, instanceOfWizardDeploymentProvider, NotebookInfo, NotebookPathInfo, ResourceType, ResourceTypeOption, ResourceSubType, AgreementInfo, HelpText } from '../interfaces'; import { DeploymentProvider, instanceOfAzureSQLVMDeploymentProvider, instanceOfAzureSQLDBDeploymentProvider, instanceOfCommandDeploymentProvider, instanceOfDialogDeploymentProvider, instanceOfDownloadDeploymentProvider, instanceOfNotebookBasedDialogInfo, instanceOfNotebookDeploymentProvider, instanceOfNotebookWizardDeploymentProvider, instanceOfWebPageDeploymentProvider, instanceOfWizardDeploymentProvider, NotebookInfo, NotebookPathInfo, ResourceType, ResourceTypeOption, ResourceSubType, AgreementInfo, HelpText, InitialVariableValues } from '../interfaces';
import { AzdataService } from './azdataService'; import { AzdataService } from './azdataService';
import { KubeService } from './kubeService'; import { KubeService } from './kubeService';
import { INotebookService } from './notebookService'; import { INotebookService } from './notebookService';
@@ -322,8 +322,8 @@ export class ResourceTypeService implements IResourceTypeService {
return undefined; return undefined;
} }
public startDeployment(resourceType: ResourceType, optionValuesFilter?: OptionValuesFilter): void { public startDeployment(resourceType: ResourceType, optionValuesFilter?: OptionValuesFilter, initialVariableValues?: InitialVariableValues): void {
const wizard = new ResourceTypeWizard(resourceType, new KubeService(), new AzdataService(this.platformService), this.notebookService, this.toolsService, this.platformService, this, optionValuesFilter); const wizard = new ResourceTypeWizard(resourceType, new KubeService(), new AzdataService(this.platformService), this.notebookService, this.toolsService, this.platformService, this, optionValuesFilter, initialVariableValues);
wizard.open(); wizard.open();
} }

View File

@@ -11,7 +11,7 @@ import { IOptionsSourceProvider } from 'resource-deployment';
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as nls from 'vscode-nls'; import * as nls from 'vscode-nls';
import { getDateTimeString, getErrorMessage, isUserCancelledError, throwUnless } from '../common/utils'; import { getDateTimeString, getErrorMessage, isUserCancelledError, throwUnless } from '../common/utils';
import { AzureAccountFieldInfo, AzureLocationsFieldInfo, ComponentCSSStyles, DialogInfoBase, FieldInfo, FieldType, FilePickerFieldInfo, instanceOfDynamicEnablementInfo, IOptionsSource, KubeClusterContextFieldInfo, LabelPosition, NoteBookEnvironmentVariablePrefix, OptionsInfo, OptionsType, PageInfoBase, RowInfo, SectionInfo, TextCSSStyles } from '../interfaces'; import { AzureAccountFieldInfo, AzureLocationsFieldInfo, ComponentCSSStyles, DialogInfoBase, FieldInfo, FieldType, FilePickerFieldInfo, InitialVariableValues, instanceOfDynamicEnablementInfo, IOptionsSource, KubeClusterContextFieldInfo, LabelPosition, NoteBookEnvironmentVariablePrefix, OptionsInfo, OptionsType, PageInfoBase, RowInfo, SectionInfo, TextCSSStyles } from '../interfaces';
import * as loc from '../localizedConstants'; import * as loc from '../localizedConstants';
import { apiService } from '../services/apiService'; import { apiService } from '../services/apiService';
import { valueProviderService } from '../services/valueProviderService'; import { valueProviderService } from '../services/valueProviderService';
@@ -126,6 +126,7 @@ interface ContextBase {
container: azdata.window.Dialog | azdata.window.Wizard; container: azdata.window.Dialog | azdata.window.Wizard;
toolsService: IToolsService, toolsService: IToolsService,
inputComponents: InputComponents; inputComponents: InputComponents;
initialVariableValues?: InitialVariableValues;
onNewValidatorCreated: (validator: Validator) => void; onNewValidatorCreated: (validator: Validator) => void;
onNewDisposableCreated: (disposable: vscode.Disposable) => void; onNewDisposableCreated: (disposable: vscode.Disposable) => void;
onNewInputComponentCreated: (name: string, inputComponentInfo: InputComponentInfo<InputComponent>) => void; onNewInputComponentCreated: (name: string, inputComponentInfo: InputComponentInfo<InputComponent>) => void;
@@ -170,9 +171,10 @@ interface InputBoxInfo {
*/ */
function createInputBoxField({ context, inputBoxType = 'text' }: { context: FieldContext; inputBoxType?: azdata.InputBoxInputType; }) { function createInputBoxField({ context, inputBoxType = 'text' }: { context: FieldContext; inputBoxType?: azdata.InputBoxInputType; }) {
const label = createLabel(context.view, { text: context.fieldInfo.label, description: context.fieldInfo.description, required: context.fieldInfo.required, width: context.fieldInfo.labelWidth, cssStyles: context.fieldInfo.labelCSSStyles }); const label = createLabel(context.view, { text: context.fieldInfo.label, description: context.fieldInfo.description, required: context.fieldInfo.required, width: context.fieldInfo.labelWidth, cssStyles: context.fieldInfo.labelCSSStyles });
const defaultValue = context.initialVariableValues?.[context.fieldInfo.variableName || '']?.toString() || context.fieldInfo.defaultValue;
const input = createInputBoxInputInfo(context.view, { const input = createInputBoxInputInfo(context.view, {
type: inputBoxType, type: inputBoxType,
defaultValue: context.fieldInfo.defaultValue, defaultValue: defaultValue,
ariaLabel: context.fieldInfo.label, ariaLabel: context.fieldInfo.label,
required: context.fieldInfo.required, required: context.fieldInfo.required,
min: context.fieldInfo.min, min: context.fieldInfo.min,
@@ -329,6 +331,7 @@ export function initializeWizardPage(context: WizardPageContext): void {
container: context.container, container: context.container,
toolsService: context.toolsService, toolsService: context.toolsService,
inputComponents: context.inputComponents, inputComponents: context.inputComponents,
initialVariableValues: context.initialVariableValues,
onNewDisposableCreated: context.onNewDisposableCreated, onNewDisposableCreated: context.onNewDisposableCreated,
onNewInputComponentCreated: context.onNewInputComponentCreated, onNewInputComponentCreated: context.onNewInputComponentCreated,
onNewValidatorCreated: context.onNewValidatorCreated, onNewValidatorCreated: context.onNewValidatorCreated,
@@ -483,6 +486,7 @@ async function processFields(fieldInfoArray: FieldInfo[], components: azdata.Com
fieldInfo: fieldInfo, fieldInfo: fieldInfo,
container: context.container, container: context.container,
inputComponents: context.inputComponents, inputComponents: context.inputComponents,
initialVariableValues: context.initialVariableValues,
components: components, components: components,
toolsService: context.toolsService toolsService: context.toolsService
}); });

View File

@@ -6,7 +6,7 @@ import * as azdata from 'azdata';
import { EOL } from 'os'; import { EOL } from 'os';
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as nls from 'vscode-nls'; import * as nls from 'vscode-nls';
import { NotebookWizardPageInfo } from '../../interfaces'; import { InitialVariableValues, NotebookWizardPageInfo } from '../../interfaces';
import { initializeWizardPage, InputComponent, InputComponentInfo, setModelValues, Validator } from '../modelViewUtils'; import { initializeWizardPage, InputComponent, InputComponentInfo, setModelValues, Validator } from '../modelViewUtils';
import { ResourceTypePage } from '../resourceTypePage'; import { ResourceTypePage } from '../resourceTypePage';
import { WizardPageInfo } from '../wizardPageInfo'; import { WizardPageInfo } from '../wizardPageInfo';
@@ -47,13 +47,14 @@ export class NotebookWizardPage extends ResourceTypePage {
return !!this._model.wizardInfo.scriptAction; return !!this._model.wizardInfo.scriptAction;
} }
public initialize(): void { public initialize(initialParamValues?: InitialVariableValues): void {
initializeWizardPage({ initializeWizardPage({
container: this.wizard.wizardObject, container: this.wizard.wizardObject,
inputComponents: this._model.inputComponents, inputComponents: this._model.inputComponents,
wizardInfo: this._model.wizardInfo, wizardInfo: this._model.wizardInfo,
pageInfo: this.pageInfo, pageInfo: this.pageInfo,
page: this.pageObject, page: this.pageObject,
initialVariableValues: initialParamValues,
onNewDisposableCreated: (disposable: vscode.Disposable): void => { onNewDisposableCreated: (disposable: vscode.Disposable): void => {
this.wizard.registerDisposable(disposable); this.wizard.registerDisposable(disposable);
}, },

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information. * Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { DeploymentProvider } from '../interfaces'; import { DeploymentProvider, InitialVariableValues } from '../interfaces';
import { Model } from './model'; import { Model } from './model';
import { ResourceTypeWizard } from './resourceTypeWizard'; import { ResourceTypeWizard } from './resourceTypeWizard';
@@ -13,7 +13,7 @@ export abstract class ResourceTypeModel extends Model {
super(); super();
} }
abstract initialize(): void; abstract initialize(initialParams?: InitialVariableValues): void;
abstract onOk(): Promise<void>; abstract onOk(): Promise<void>;
abstract onCancel(): void; abstract onCancel(): void;
/** /**

View File

@@ -6,6 +6,4 @@
import { ResourceTypeWizard } from './resourceTypeWizard'; import { ResourceTypeWizard } from './resourceTypeWizard';
import { WizardPageBase } from './wizardPageBase'; import { WizardPageBase } from './wizardPageBase';
export abstract class ResourceTypePage extends WizardPageBase<ResourceTypeWizard>{ export abstract class ResourceTypePage extends WizardPageBase<ResourceTypeWizard>{ }
abstract initialize(): void;
}

View File

@@ -5,7 +5,7 @@
import * as azdata from 'azdata'; import * as azdata from 'azdata';
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import { DeploymentProvider, instanceOfAzureSQLDBDeploymentProvider, instanceOfAzureSQLVMDeploymentProvider, instanceOfNotebookWizardDeploymentProvider, instanceOfWizardDeploymentProvider, ResourceType, ResourceTypeOptionValue } from '../interfaces'; import { DeploymentProvider, InitialVariableValues, instanceOfAzureSQLDBDeploymentProvider, instanceOfAzureSQLVMDeploymentProvider, instanceOfNotebookWizardDeploymentProvider, instanceOfWizardDeploymentProvider, ResourceType, ResourceTypeOptionValue } from '../interfaces';
import { DeployClusterWizardModel } from './deployClusterWizard/deployClusterWizardModel'; import { DeployClusterWizardModel } from './deployClusterWizard/deployClusterWizardModel';
import { DeployAzureSQLVMWizardModel } from './deployAzureSQLVMWizard/deployAzureSQLVMWizardModel'; import { DeployAzureSQLVMWizardModel } from './deployAzureSQLVMWizard/deployAzureSQLVMWizardModel';
import { WizardPageInfo } from './wizardPageInfo'; import { WizardPageInfo } from './wizardPageInfo';
@@ -59,7 +59,8 @@ export class ResourceTypeWizard {
public toolsService: IToolsService, public toolsService: IToolsService,
public platformService: IPlatformService, public platformService: IPlatformService,
public resourceTypeService: ResourceTypeService, public resourceTypeService: ResourceTypeService,
private _optionValuesFilter?: OptionValuesFilter) { private _optionValuesFilter?: OptionValuesFilter,
private _initialVariableValues?: InitialVariableValues) {
/** /**
* Setting the first provider from the first value of the dropdowns. * Setting the first provider from the first value of the dropdowns.
* If there are no options (dropdowns) then the resource type has only one provider which is set as default here. * If there are no options (dropdowns) then the resource type has only one provider which is set as default here.
@@ -164,7 +165,7 @@ export class ResourceTypeWizard {
// generateScriptButton is enabled only when the page is valid. // generateScriptButton is enabled only when the page is valid.
this.wizardObject.generateScriptButton.enabled = isValid; this.wizardObject.generateScriptButton.enabled = isValid;
}); });
page.initialize(); page.initialize(this._initialVariableValues);
}); });
} }

View File

@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as azdata from 'azdata'; import * as azdata from 'azdata';
import { InitialVariableValues } from '../interfaces';
import { Validator } from './modelViewUtils'; import { Validator } from './modelViewUtils';
import { WizardPageInfo } from './wizardPageInfo'; import { WizardPageInfo } from './wizardPageInfo';
@@ -29,7 +30,7 @@ export abstract class WizardPageBase<T> {
public async onLeave(_pageInfo?: WizardPageInfo): Promise<void> { } public async onLeave(_pageInfo?: WizardPageInfo): Promise<void> { }
public abstract initialize(): void; public abstract initialize(initialVariableValues?: InitialVariableValues): void;
protected get validators(): Validator[] { protected get validators(): Validator[] {
return this._validators; return this._validators;