deployment extensibility (#7394)

* rename button and update dialog button width

* make deployment resource type contributable

* conflicts

* fix card width hight issue

* comments
This commit is contained in:
Alan Ren
2019-09-27 10:13:38 -07:00
committed by GitHub
parent 6ef415d0e6
commit 6385443a4c
8 changed files with 425 additions and 323 deletions

View File

@@ -68,295 +68,295 @@
"group": "secondary" "group": "secondary"
} }
] ]
}
},
"resourceTypes": [
{
"name": "sql-image",
"displayName": "%resource-type-sql-image-display-name%",
"description": "%resource-type-sql-image-description%",
"platforms": [
"darwin",
"win32",
"linux"
],
"icon": {
"light": "./images/sql_server.svg",
"dark": "./images/sql_server_inverse.svg"
},
"options": [
{
"name": "version",
"displayName": "%version-display-name%",
"values": [
{
"name": "sql2017",
"displayName": "%sql-2017-display-name%"
},
{
"name": "sql2019",
"displayName": "%sql-2019-display-name%"
}
]
}
],
"providers": [
{
"dialog": {
"notebook": "%sql-2017-docker-notebook%",
"title": "%docker-sql-2017-title%",
"name": "docker-sql-2017-dialog",
"tabs": [
{
"title": "",
"sections": [
{
"title": "",
"fields": [
{
"label": "%docker-container-name-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_CONTAINER_NAME",
"type": "datetime_text",
"defaultValue": "SQL2017-",
"required": true
},
{
"label": "%docker-sql-password-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_PASSWORD",
"type": "sql_password",
"userName": "sa",
"confirmationRequired": true,
"confirmationLabel": "%docker-confirm-sql-password-field%",
"defaultValue": "",
"required": true
},
{
"label": "%docker-sql-port-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_PORT",
"type": "number",
"defaultValue": "1433",
"required": true,
"min": 1,
"max": 65535
}
]
}
]
}
]
},
"requiredTools": [
{
"name": "docker"
}
],
"when": "version=sql2017"
},
{
"dialog": {
"notebook": "%sql-2019-docker-notebook%",
"title": "%docker-sql-2019-title%",
"name": "docker-sql-2019-dialog",
"tabs": [
{
"title": "",
"sections": [
{
"title": "",
"fields": [
{
"label": "%docker-container-name-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_CONTAINER_NAME",
"type": "datetime_text",
"defaultValue": "SQL2019-",
"required": true
},
{
"label": "%docker-sql-password-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_PASSWORD",
"type": "sql_password",
"userName": "sa",
"confirmationRequired": true,
"confirmationLabel": "%docker-confirm-sql-password-field%",
"defaultValue": "",
"required": true
},
{
"label": "%docker-sql-port-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_PORT",
"type": "number",
"defaultValue": "1433",
"required": true,
"min": 1,
"max": 65535
}
]
}
]
}
]
},
"requiredTools": [
{
"name": "docker"
}
],
"when": "version=sql2019"
}
]
}, },
{ "resourceDeploymentTypes": [
"name": "sql-bdc", {
"displayName": "%resource-type-sql-bdc-display-name%", "name": "sql-image",
"description": "%resource-type-sql-bdc-description%", "displayName": "%resource-type-sql-image-display-name%",
"platforms": [ "description": "%resource-type-sql-image-description%",
"darwin", "platforms": [
"linux", "darwin",
"win32" "win32",
], "linux"
"icon": { ],
"light": "./images/sql_bdc.svg", "icon": {
"dark": "./images/sql_bdc_inverse.svg" "light": "./images/sql_server.svg",
"dark": "./images/sql_server_inverse.svg"
},
"options": [
{
"name": "version",
"displayName": "%version-display-name%",
"values": [
{
"name": "sql2017",
"displayName": "%sql-2017-display-name%"
},
{
"name": "sql2019",
"displayName": "%sql-2019-display-name%"
}
]
}
],
"providers": [
{
"dialog": {
"notebook": "%sql-2017-docker-notebook%",
"title": "%docker-sql-2017-title%",
"name": "docker-sql-2017-dialog",
"tabs": [
{
"title": "",
"sections": [
{
"title": "",
"fields": [
{
"label": "%docker-container-name-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_CONTAINER_NAME",
"type": "datetime_text",
"defaultValue": "SQL2017-",
"required": true
},
{
"label": "%docker-sql-password-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_PASSWORD",
"type": "sql_password",
"userName": "sa",
"confirmationRequired": true,
"confirmationLabel": "%docker-confirm-sql-password-field%",
"defaultValue": "",
"required": true
},
{
"label": "%docker-sql-port-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_PORT",
"type": "number",
"defaultValue": "1433",
"required": true,
"min": 1,
"max": 65535
}
]
}
]
}
]
},
"requiredTools": [
{
"name": "docker"
}
],
"when": "version=sql2017"
},
{
"dialog": {
"notebook": "%sql-2019-docker-notebook%",
"title": "%docker-sql-2019-title%",
"name": "docker-sql-2019-dialog",
"tabs": [
{
"title": "",
"sections": [
{
"title": "",
"fields": [
{
"label": "%docker-container-name-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_CONTAINER_NAME",
"type": "datetime_text",
"defaultValue": "SQL2019-",
"required": true
},
{
"label": "%docker-sql-password-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_PASSWORD",
"type": "sql_password",
"userName": "sa",
"confirmationRequired": true,
"confirmationLabel": "%docker-confirm-sql-password-field%",
"defaultValue": "",
"required": true
},
{
"label": "%docker-sql-port-field%",
"variableName": "AZDATA_NB_VAR_DOCKER_PORT",
"type": "number",
"defaultValue": "1433",
"required": true,
"min": 1,
"max": 65535
}
]
}
]
}
]
},
"requiredTools": [
{
"name": "docker"
}
],
"when": "version=sql2019"
}
]
}, },
"options": [ {
{ "name": "sql-bdc",
"name": "version", "displayName": "%resource-type-sql-bdc-display-name%",
"displayName": "%version-display-name%", "description": "%resource-type-sql-bdc-description%",
"values": [ "platforms": [
{ "darwin",
"name": "bdc2019", "linux",
"displayName": "%bdc-2019-display-name%" "win32"
} ],
] "icon": {
"light": "./images/sql_bdc.svg",
"dark": "./images/sql_bdc_inverse.svg"
}, },
{ "options": [
"name": "target", {
"displayName": "%bdc-deployment-target%", "name": "version",
"values": [ "displayName": "%version-display-name%",
"values": [
{
"name": "bdc2019",
"displayName": "%bdc-2019-display-name%"
}
]
},
{
"name": "target",
"displayName": "%bdc-deployment-target%",
"values": [
{
"name": "new-aks",
"displayName": "%bdc-deployment-target-new-aks%"
},
{
"name": "existing-aks",
"displayName": "%bdc-deployment-target-existing-aks%"
},
{
"name": "existing-kubeadm",
"displayName": "%bdc-deployment-target-existing-kubeadm%"
}
]
}
],
"providers": [
{
"wizard": {
"type": "new-aks",
"notebook": "%bdc-2019-aks-notebook%"
},
"requiredTools": [
{
"name": "kubectl"
},
{
"name": "azcli"
},
{
"name": "azdata"
}
],
"when": "target=new-aks&&version=bdc2019"
},
{
"wizard": {
"type": "existing-aks",
"notebook": "%bdc-2019-existing-aks-notebook%"
},
"requiredTools": [
{
"name": "kubectl"
},
{
"name": "azdata"
}
],
"when": "target=existing-aks&&version=bdc2019"
},
{
"wizard": {
"type": "existing-kubeadm",
"notebook": "%bdc-2019-existing-kubeadm-notebook%"
},
"requiredTools": [
{
"name": "kubectl"
},
{
"name": "azdata"
}
],
"when": "target=existing-kubeadm&&version=bdc2019"
}
],
"agreement": {
"template": "%bdc-agreement%",
"links": [
{ {
"name": "new-aks", "text": "%bdc-agreement-privacy-statement%",
"displayName": "%bdc-deployment-target-new-aks%" "url": "https://go.microsoft.com/fwlink/?LinkId=853010"
}, },
{ {
"name": "existing-aks", "text": "%bdc-agreement-bdc-eula%",
"displayName": "%bdc-deployment-target-existing-aks%" "url": "https://go.microsoft.com/fwlink/?LinkId=2002534"
}, },
{ {
"name": "existing-kubeadm", "text": "%bdc-agreement-azdata-eula%",
"displayName": "%bdc-deployment-target-existing-kubeadm%" "url": "https://aka.ms/azdata-eula"
} }
] ]
} }
], },
"providers": [ {
{ "name": "sql-windows-setup",
"wizard": { "displayName": "%resource-type-sql-windows-setup-display-name%",
"type": "new-aks", "description": "%resource-type-sql-windows-setup-description%",
"notebook": "%bdc-2019-aks-notebook%" "platforms": [
}, "win32"
"requiredTools": [ ],
{ "icon": {
"name": "kubectl" "light": "./images/sql_server.svg",
}, "dark": "./images/sql_server_inverse.svg"
{
"name": "azcli"
},
{
"name": "azdata"
}
],
"when": "target=new-aks&&version=bdc2019"
}, },
{ "options": [
"wizard": {
"type": "existing-aks",
"notebook": "%bdc-2019-existing-aks-notebook%"
},
"requiredTools": [
{
"name": "kubectl"
},
{
"name": "azdata"
}
],
"when": "target=existing-aks&&version=bdc2019"
},
{
"wizard": {
"type": "existing-kubeadm",
"notebook": "%bdc-2019-existing-kubeadm-notebook%"
},
"requiredTools": [
{
"name": "kubectl"
},
{
"name": "azdata"
}
],
"when": "target=existing-kubeadm&&version=bdc2019"
}
],
"agreement": {
"template": "%bdc-agreement%",
"links": [
{ {
"text": "%bdc-agreement-privacy-statement%", "name": "version",
"url": "https://go.microsoft.com/fwlink/?LinkId=853010" "displayName": "%version-display-name%",
"values": [
{
"name": "sql2017",
"displayName": "%sql-2017-display-name%"
},
{
"name": "sql2019",
"displayName": "%sql-2019-display-name%"
}
]
}
],
"providers": [
{
"downloadUrl": "https://go.microsoft.com/fwlink/?linkid=853016",
"requiredTools": [],
"when": "version=sql2017"
}, },
{ {
"text": "%bdc-agreement-bdc-eula%", "webPageUrl": "https://www.microsoft.com/evalcenter/evaluate-sql-server-2019-rc",
"url": "https://go.microsoft.com/fwlink/?LinkId=2002534" "requiredTools": [],
}, "when": "version=sql2019"
{
"text": "%bdc-agreement-azdata-eula%",
"url": "https://aka.ms/azdata-eula"
} }
] ]
} }
}, ]
{ },
"name": "sql-windows-setup",
"displayName": "%resource-type-sql-windows-setup-display-name%",
"description": "%resource-type-sql-windows-setup-description%",
"platforms": [
"win32"
],
"icon": {
"light": "./images/sql_server.svg",
"dark": "./images/sql_server_inverse.svg"
},
"options": [
{
"name": "version",
"displayName": "%version-display-name%",
"values": [
{
"name": "sql2017",
"displayName": "%sql-2017-display-name%"
},
{
"name": "sql2019",
"displayName": "%sql-2019-display-name%"
}
]
}
],
"providers": [
{
"downloadUrl": "https://go.microsoft.com/fwlink/?linkid=853016",
"requiredTools": [],
"when": "version=sql2017"
},
{
"webPageUrl": "https://www.microsoft.com/evalcenter/evaluate-sql-server-2019-rc",
"requiredTools": [],
"when": "version=sql2019"
}
]
}
],
"dependencies": { "dependencies": {
"vscode-nls": "^4.0.0", "vscode-nls": "^4.0.0",
"yamljs": "^0.3.0" "yamljs": "^0.3.0"

View File

@@ -35,24 +35,85 @@ export interface ResourceTypeOptionValue {
displayName: string; displayName: string;
} }
export interface DeploymentProvider { export interface DialogDeploymentProvider extends DeploymentProviderBase {
title: string;
dialog: DialogInfo; dialog: DialogInfo;
notebook: string | NotebookInfo; }
downloadUrl: string;
webPageUrl: string; export interface WizardDeploymentProvider extends DeploymentProviderBase {
wizard: WizardInfo; wizard: WizardInfo;
}
export interface NotebookDeploymentProvider extends DeploymentProviderBase {
notebook: string | NotebookInfo;
}
export interface WebPageDeploymentProvider extends DeploymentProviderBase {
webPageUrl: string;
}
export interface DownloadDeploymentProvider extends DeploymentProviderBase {
downloadUrl: string;
}
export interface CommandDeploymentProvider extends DeploymentProviderBase {
command: string;
}
export function instanceOfDialogDeploymentProvider(obj: any): obj is DialogDeploymentProvider {
return obj && 'dialog' in obj;
}
export function instanceOfWizardDeploymentProvider(obj: any): obj is WizardDeploymentProvider {
return obj && 'wizard' in obj;
}
export function instanceOfNotebookDeploymentProvider(obj: any): obj is NotebookDeploymentProvider {
return obj && 'notebook' in obj;
}
export function instanceOfWebPageDeploymentProvider(obj: any): obj is WebPageDeploymentProvider {
return obj && 'webPageUrl' in obj;
}
export function instanceOfDownloadDeploymentProvider(obj: any): obj is DownloadDeploymentProvider {
return obj && 'downloadUrl' in obj;
}
export function instanceOfCommandDeploymentProvider(obj: any): obj is CommandDeploymentProvider {
return obj && 'command' in obj;
}
export interface DeploymentProviderBase {
requiredTools: ToolRequirementInfo[]; requiredTools: ToolRequirementInfo[];
when: string; when: string;
} }
export type DeploymentProvider = DialogDeploymentProvider | WizardDeploymentProvider | NotebookDeploymentProvider | WebPageDeploymentProvider | DownloadDeploymentProvider | CommandDeploymentProvider;
export interface WizardInfo { export interface WizardInfo {
notebook: string | NotebookInfo; notebook: string | NotebookInfo;
type: BdcDeploymentType; type: BdcDeploymentType;
} }
export interface DialogInfo { export interface NotebookBasedDialogInfo extends DialogInfoBase {
notebook: string | NotebookInfo; notebook: string | NotebookInfo;
}
export interface CommandBasedDialogInfo extends DialogInfoBase {
command: string;
}
export type DialogInfo = NotebookBasedDialogInfo | CommandBasedDialogInfo;
export function instanceOfNotebookBasedDialogInfo(obj: any): obj is NotebookBasedDialogInfo {
return obj && 'notebook' in obj;
}
export function instanceOfCommandBasedDialogInfo(obj: any): obj is CommandBasedDialogInfo {
return obj && 'command' in obj;
}
export interface DialogInfoBase {
title: string; title: string;
name: string; name: string;
tabs: DialogTabInfo[]; tabs: DialogTabInfo[];

View File

@@ -5,12 +5,12 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as nls from 'vscode-nls'; import * as nls from 'vscode-nls';
import { DialogInfo } from './interfaces'; import { NotebookBasedDialogInfo } from './interfaces';
import { NotebookService } from './services/notebookService'; import { NotebookService } from './services/notebookService';
import { PlatformService } from './services/platformService'; import { PlatformService } from './services/platformService';
import { ResourceTypeService } from './services/resourceTypeService'; import { ResourceTypeService } from './services/resourceTypeService';
import { ToolsService } from './services/toolsService'; import { ToolsService } from './services/toolsService';
import { NotebookInputDialog } from './ui/notebookInputDialog'; import { DeploymentInputDialog } from './ui/deploymentInputDialog';
import { ResourceTypePickerDialog } from './ui/resourceTypePickerDialog'; import { ResourceTypePickerDialog } from './ui/resourceTypePickerDialog';
const localize = nls.loadMessageBundle(); const localize = nls.loadMessageBundle();
@@ -33,7 +33,7 @@ export function activate(context: vscode.ExtensionContext) {
if (filtered.length !== 1) { if (filtered.length !== 1) {
vscode.window.showErrorMessage(localize('resourceDeployment.UnknownResourceType', 'The resource type: {0} is not defined', resourceTypeName)); vscode.window.showErrorMessage(localize('resourceDeployment.UnknownResourceType', 'The resource type: {0} is not defined', resourceTypeName));
} else { } else {
const dialog = new ResourceTypePickerDialog(context, toolsService, resourceTypeService, filtered[0]); const dialog = new ResourceTypePickerDialog(toolsService, resourceTypeService, filtered[0]);
dialog.open(); dialog.open();
} }
}; };
@@ -44,11 +44,11 @@ export function activate(context: vscode.ExtensionContext) {
vscode.commands.registerCommand('azdata.resource.sql-bdc.deploy', () => { vscode.commands.registerCommand('azdata.resource.sql-bdc.deploy', () => {
openDialog('sql-bdc'); openDialog('sql-bdc');
}); });
vscode.commands.registerCommand('azdata.resource.deploy', () => { vscode.commands.registerCommand('azdata.resource.deploy', (resourceType: string = 'sql-image') => {
openDialog('sql-bdc'); openDialog(resourceType);
}); });
vscode.commands.registerCommand('azdata.openNotebookInputDialog', (dialogInfo: DialogInfo) => { vscode.commands.registerCommand('azdata.openNotebookInputDialog', (dialogInfo: NotebookBasedDialogInfo) => {
const dialog = new NotebookInputDialog(notebookService, dialogInfo); const dialog = new DeploymentInputDialog(notebookService, dialogInfo);
dialog.open(); dialog.open();
}); });
} }

View File

@@ -14,9 +14,9 @@ import * as nls from 'vscode-nls';
import { INotebookService } from './notebookService'; import { INotebookService } from './notebookService';
import { IPlatformService } from './platformService'; import { IPlatformService } from './platformService';
import { IToolsService } from './toolsService'; import { IToolsService } from './toolsService';
import { ResourceType, ResourceTypeOption, DeploymentProvider } from '../interfaces'; import { ResourceType, ResourceTypeOption, NotebookInfo, DeploymentProvider, instanceOfWizardDeploymentProvider, instanceOfDialogDeploymentProvider, instanceOfNotebookDeploymentProvider, instanceOfDownloadDeploymentProvider, instanceOfWebPageDeploymentProvider, instanceOfCommandDeploymentProvider, instanceOfNotebookBasedDialogInfo } from '../interfaces';
import { DeployClusterWizard } from '../ui/deployClusterWizard/deployClusterWizard'; import { DeployClusterWizard } from '../ui/deployClusterWizard/deployClusterWizard';
import { NotebookInputDialog } from '../ui/notebookInputDialog'; import { DeploymentInputDialog } from '../ui/deploymentInputDialog';
import { KubeService } from './kubeService'; import { KubeService } from './kubeService';
import { AzdataService } from './azdataService'; import { AzdataService } from './azdataService';
const localize = nls.loadMessageBundle(); const localize = nls.loadMessageBundle();
@@ -38,20 +38,15 @@ export class ResourceTypeService implements IResourceTypeService {
*/ */
getResourceTypes(filterByPlatform: boolean = true): ResourceType[] { getResourceTypes(filterByPlatform: boolean = true): ResourceType[] {
if (this._resourceTypes.length === 0) { if (this._resourceTypes.length === 0) {
const pkgJson = require('../../package.json'); vscode.extensions.all.forEach((extension) => {
let extensionFullName: string; const extensionResourceTypes = extension.packageJSON.contributes && extension.packageJSON.contributes.resourceDeploymentTypes as ResourceType[];
if (pkgJson && pkgJson.name && pkgJson.publisher) { if (extensionResourceTypes) {
extensionFullName = `${pkgJson.publisher}.${pkgJson.name}`; extensionResourceTypes.forEach((resourceType) => {
} else { this.updatePathProperties(resourceType, extension.extensionPath);
const errorMessage = localize('resourceDeployment.extensionFullNameError', 'Could not find package.json or the name/publisher is not set'); resourceType.getProvider = (selectedOptions) => { return this.getProvider(resourceType, selectedOptions); };
this.platformService.showErrorMessage(errorMessage); this._resourceTypes.push(resourceType);
throw new Error(errorMessage); });
} }
// If we load package.json directly using require(path) the contents won't be localized
this._resourceTypes = vscode.extensions.getExtension(extensionFullName)!.packageJSON.resourceTypes as ResourceType[];
this._resourceTypes.forEach(resourceType => {
resourceType.getProvider = (selectedOptions) => { return this.getProvider(resourceType, selectedOptions); };
}); });
} }
@@ -63,6 +58,39 @@ export class ResourceTypeService implements IResourceTypeService {
return resourceTypes; return resourceTypes;
} }
private updatePathProperties(resourceType: ResourceType, extensionPath: string): void {
resourceType.icon.dark = path.join(extensionPath, resourceType.icon.dark);
resourceType.icon.light = path.join(extensionPath, resourceType.icon.light);
resourceType.providers.forEach((provider) => {
if (instanceOfNotebookDeploymentProvider(provider)) {
this.updateNotebookPath(provider, extensionPath);
} else if (instanceOfDialogDeploymentProvider(provider) && instanceOfNotebookBasedDialogInfo(provider.dialog)) {
this.updateNotebookPath(provider.dialog, extensionPath);
}
else if ('wizard' in provider) {
this.updateNotebookPath(provider.wizard, extensionPath);
}
});
}
private updateNotebookPath(objWithNotebookProperty: { notebook: string | NotebookInfo } | undefined, extensionPath: string): void {
if (objWithNotebookProperty && objWithNotebookProperty.notebook) {
if (typeof objWithNotebookProperty.notebook === 'string') {
objWithNotebookProperty.notebook = path.join(extensionPath, objWithNotebookProperty.notebook);
} else {
if (objWithNotebookProperty.notebook.darwin) {
objWithNotebookProperty.notebook.darwin = path.join(extensionPath, objWithNotebookProperty.notebook.darwin);
}
if (objWithNotebookProperty.notebook.win32) {
objWithNotebookProperty.notebook.darwin = path.join(extensionPath, objWithNotebookProperty.notebook.win32);
}
if (objWithNotebookProperty.notebook.linux) {
objWithNotebookProperty.notebook = path.join(extensionPath, objWithNotebookProperty.notebook.linux);
}
}
}
}
/** /**
* Validate the resource types and returns validation error messages if any. * Validate the resource types and returns validation error messages if any.
* @param resourceTypes resource types to be validated * @param resourceTypes resource types to be validated
@@ -140,7 +168,12 @@ export class ResourceTypeService implements IResourceTypeService {
let providerIndex = 1; let providerIndex = 1;
resourceType.providers.forEach(provider => { resourceType.providers.forEach(provider => {
const providerPositionInfo = `${positionInfo}, provider index: ${providerIndex} `; const providerPositionInfo = `${positionInfo}, provider index: ${providerIndex} `;
if (!provider.wizard && !provider.dialog && !provider.notebook && !provider.downloadUrl && !provider.webPageUrl) { if (!instanceOfWizardDeploymentProvider(provider)
&& !instanceOfDialogDeploymentProvider(provider)
&& !instanceOfNotebookDeploymentProvider(provider)
&& !instanceOfDownloadDeploymentProvider(provider)
&& !instanceOfWebPageDeploymentProvider(provider)
&& !instanceOfCommandDeploymentProvider(provider)) {
errorMessages.push(`No deployment method defined for the provider, ${providerPositionInfo}`); errorMessages.push(`No deployment method defined for the provider, ${providerPositionInfo}`);
} }
@@ -197,15 +230,15 @@ export class ResourceTypeService implements IResourceTypeService {
public startDeployment(provider: DeploymentProvider): void { public startDeployment(provider: DeploymentProvider): void {
const self = this; const self = this;
if (provider.wizard) { if (instanceOfWizardDeploymentProvider(provider)) {
const wizard = new DeployClusterWizard(provider.wizard, new KubeService(), new AzdataService(this.platformService), this.notebookService); const wizard = new DeployClusterWizard(provider.wizard, new KubeService(), new AzdataService(this.platformService), this.notebookService);
wizard.open(); wizard.open();
} else if (provider.dialog) { } else if (instanceOfDialogDeploymentProvider(provider)) {
const dialog = new NotebookInputDialog(this.notebookService, provider.dialog); const dialog = new DeploymentInputDialog(this.notebookService, provider.dialog);
dialog.open(); dialog.open();
} else if (provider.notebook) { } else if (instanceOfNotebookDeploymentProvider(provider)) {
this.notebookService.launchNotebook(provider.notebook); this.notebookService.launchNotebook(provider.notebook);
} else if (provider.downloadUrl) { } else if (instanceOfDownloadDeploymentProvider(provider)) {
const taskName = localize('resourceDeployment.DownloadAndLaunchTaskName', "Download and launch installer, URL: {0}", provider.downloadUrl); const taskName = localize('resourceDeployment.DownloadAndLaunchTaskName', "Download and launch installer, URL: {0}", provider.downloadUrl);
azdata.tasks.startBackgroundOperation({ azdata.tasks.startBackgroundOperation({
displayName: taskName, displayName: taskName,
@@ -223,8 +256,10 @@ export class ResourceTypeService implements IResourceTypeService {
}); });
} }
}); });
} else if (provider.webPageUrl) { } else if (instanceOfWebPageDeploymentProvider(provider)) {
vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(provider.webPageUrl)); vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(provider.webPageUrl));
} else if (instanceOfCommandDeploymentProvider(provider)) {
vscode.commands.executeCommand(provider.command);
} }
} }

View File

@@ -8,14 +8,14 @@ import * as vscode from 'vscode';
import * as nls from 'vscode-nls'; import * as nls from 'vscode-nls';
import { DialogBase } from './dialogBase'; import { DialogBase } from './dialogBase';
import { INotebookService } from '../services/notebookService'; import { INotebookService } from '../services/notebookService';
import { DialogInfo } from '../interfaces'; import { DialogInfo, instanceOfNotebookBasedDialogInfo } from '../interfaces';
import { Validator, initializeDialog, InputComponents, setModelValues } from './modelViewUtils'; import { Validator, initializeDialog, InputComponents, setModelValues } from './modelViewUtils';
import { Model } from './model'; import { Model } from './model';
import { EOL } from 'os'; import { EOL } from 'os';
const localize = nls.loadMessageBundle(); const localize = nls.loadMessageBundle();
export class NotebookInputDialog extends DialogBase { export class DeploymentInputDialog extends DialogBase {
private inputComponents: InputComponents = {}; private inputComponents: InputComponents = {};
@@ -62,10 +62,14 @@ export class NotebookInputDialog extends DialogBase {
private onComplete(): void { private onComplete(): void {
const model: Model = new Model(); const model: Model = new Model();
setModelValues(this.inputComponents, model); setModelValues(this.inputComponents, model);
model.setEnvironmentVariables(); if (instanceOfNotebookBasedDialogInfo(this.dialogInfo)) {
this.notebookService.launchNotebook(this.dialogInfo.notebook).then(() => { }, (error) => { model.setEnvironmentVariables();
vscode.window.showErrorMessage(error); this.notebookService.launchNotebook(this.dialogInfo.notebook).then(() => { }, (error) => {
}); vscode.window.showErrorMessage(error);
});
} else {
vscode.commands.executeCommand(this.dialogInfo.command, model);
}
this.dispose(); this.dispose();
} }
} }

View File

@@ -6,7 +6,7 @@
import * as azdata from 'azdata'; import * as azdata from 'azdata';
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as nls from 'vscode-nls'; import * as nls from 'vscode-nls';
import { DialogInfo, FieldType, FieldInfo, SectionInfo, LabelPosition } from '../interfaces'; import { DialogInfoBase, FieldType, FieldInfo, SectionInfo, LabelPosition } from '../interfaces';
import { Model } from './model'; import { Model } from './model';
const localize = nls.loadMessageBundle(); const localize = nls.loadMessageBundle();
@@ -30,7 +30,7 @@ export const DefaultInputComponentWidth = '400px';
export const DefaultLabelComponentWidth = '200px'; export const DefaultLabelComponentWidth = '200px';
export interface DialogContext extends CreateContext { export interface DialogContext extends CreateContext {
dialogInfo: DialogInfo; dialogInfo: DialogInfoBase;
container: azdata.window.Dialog; container: azdata.window.Dialog;
} }

View File

@@ -4,10 +4,9 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as azdata from 'azdata'; import * as azdata from 'azdata';
import * as vscode from 'vscode';
import * as nls from 'vscode-nls'; import * as nls from 'vscode-nls';
import { DialogBase } from './dialogBase'; import { DialogBase } from './dialogBase';
import { ResourceType, DeploymentProvider, AgreementInfo } from '../interfaces'; import { ResourceType, AgreementInfo, DeploymentProvider } from '../interfaces';
import { IResourceTypeService } from '../services/resourceTypeService'; import { IResourceTypeService } from '../services/resourceTypeService';
import { IToolsService } from '../services/toolsService'; import { IToolsService } from '../services/toolsService';
import { EOL } from 'os'; import { EOL } from 'os';
@@ -29,7 +28,7 @@ export class ResourceTypePickerDialog extends DialogBase {
private _agreementContainer!: azdata.DivContainer; private _agreementContainer!: azdata.DivContainer;
private _agreementCheckboxChecked: boolean = false; private _agreementCheckboxChecked: boolean = false;
constructor(private extensionContext: vscode.ExtensionContext, constructor(
private toolsService: IToolsService, private toolsService: IToolsService,
private resourceTypeService: IResourceTypeService, private resourceTypeService: IResourceTypeService,
resourceType: ResourceType) { resourceType: ResourceType) {
@@ -125,13 +124,16 @@ export class ResourceTypePickerDialog extends DialogBase {
const card = this._view.modelBuilder.card().withProperties<azdata.CardProperties>({ const card = this._view.modelBuilder.card().withProperties<azdata.CardProperties>({
cardType: azdata.CardType.VerticalButton, cardType: azdata.CardType.VerticalButton,
iconPath: { iconPath: {
dark: this.extensionContext.asAbsolutePath(resourceType.icon.dark), dark: resourceType.icon.dark,
light: this.extensionContext.asAbsolutePath(resourceType.icon.light) light: resourceType.icon.light
}, },
label: resourceType.displayName, label: resourceType.displayName,
selected: (this._selectedResourceType && this._selectedResourceType.name === resourceType.name) selected: (this._selectedResourceType && this._selectedResourceType.name === resourceType.name),
width: '220px',
height: '180px',
iconWidth: '50px',
iconHeight: '50px'
}).component(); }).component();
this._resourceTypeCards.push(card); this._resourceTypeCards.push(card);
this._cardResourceTypeMap.set(resourceType.name, card); this._cardResourceTypeMap.set(resourceType.name, card);
this._toDispose.push(card.onCardSelectedChanged(() => this.selectResourceType(resourceType))); this._toDispose.push(card.onCardSelectedChanged(() => this.selectResourceType(resourceType)));

View File

@@ -10,7 +10,7 @@
<ng-container *ngIf="isVerticalButton"> <ng-container *ngIf="isVerticalButton">
<div class="card-vertical-button"> <div class="card-vertical-button">
<div *ngIf="iconPath" class="iconContainer"> <div *ngIf="iconPath" class="iconContainer">
<div [class]="iconClass" [style.maxWidth]="iconWidth" [style.maxHeight]="iconHeight"></div> <div [class]="iconClass" [style.width]="iconWidth" [style.height]="iconHeight"></div>
</div> </div>
<h4 class="card-label">{{label}}</h4> <h4 class="card-label">{{label}}</h4>
<hr /> <hr />