mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
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:
@@ -14,9 +14,9 @@ import * as nls from 'vscode-nls';
|
||||
import { INotebookService } from './notebookService';
|
||||
import { IPlatformService } from './platformService';
|
||||
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 { NotebookInputDialog } from '../ui/notebookInputDialog';
|
||||
import { DeploymentInputDialog } from '../ui/deploymentInputDialog';
|
||||
import { KubeService } from './kubeService';
|
||||
import { AzdataService } from './azdataService';
|
||||
const localize = nls.loadMessageBundle();
|
||||
@@ -38,20 +38,15 @@ export class ResourceTypeService implements IResourceTypeService {
|
||||
*/
|
||||
getResourceTypes(filterByPlatform: boolean = true): ResourceType[] {
|
||||
if (this._resourceTypes.length === 0) {
|
||||
const pkgJson = require('../../package.json');
|
||||
let extensionFullName: string;
|
||||
if (pkgJson && pkgJson.name && pkgJson.publisher) {
|
||||
extensionFullName = `${pkgJson.publisher}.${pkgJson.name}`;
|
||||
} else {
|
||||
const errorMessage = localize('resourceDeployment.extensionFullNameError', 'Could not find package.json or the name/publisher is not set');
|
||||
this.platformService.showErrorMessage(errorMessage);
|
||||
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); };
|
||||
vscode.extensions.all.forEach((extension) => {
|
||||
const extensionResourceTypes = extension.packageJSON.contributes && extension.packageJSON.contributes.resourceDeploymentTypes as ResourceType[];
|
||||
if (extensionResourceTypes) {
|
||||
extensionResourceTypes.forEach((resourceType) => {
|
||||
this.updatePathProperties(resourceType, extension.extensionPath);
|
||||
resourceType.getProvider = (selectedOptions) => { return this.getProvider(resourceType, selectedOptions); };
|
||||
this._resourceTypes.push(resourceType);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -63,6 +58,39 @@ export class ResourceTypeService implements IResourceTypeService {
|
||||
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.
|
||||
* @param resourceTypes resource types to be validated
|
||||
@@ -140,7 +168,12 @@ export class ResourceTypeService implements IResourceTypeService {
|
||||
let providerIndex = 1;
|
||||
resourceType.providers.forEach(provider => {
|
||||
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}`);
|
||||
}
|
||||
|
||||
@@ -197,15 +230,15 @@ export class ResourceTypeService implements IResourceTypeService {
|
||||
|
||||
public startDeployment(provider: DeploymentProvider): void {
|
||||
const self = this;
|
||||
if (provider.wizard) {
|
||||
if (instanceOfWizardDeploymentProvider(provider)) {
|
||||
const wizard = new DeployClusterWizard(provider.wizard, new KubeService(), new AzdataService(this.platformService), this.notebookService);
|
||||
wizard.open();
|
||||
} else if (provider.dialog) {
|
||||
const dialog = new NotebookInputDialog(this.notebookService, provider.dialog);
|
||||
} else if (instanceOfDialogDeploymentProvider(provider)) {
|
||||
const dialog = new DeploymentInputDialog(this.notebookService, provider.dialog);
|
||||
dialog.open();
|
||||
} else if (provider.notebook) {
|
||||
} else if (instanceOfNotebookDeploymentProvider(provider)) {
|
||||
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);
|
||||
azdata.tasks.startBackgroundOperation({
|
||||
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));
|
||||
} else if (instanceOfCommandDeploymentProvider(provider)) {
|
||||
vscode.commands.executeCommand(provider.command);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user