mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 18:46:40 -05:00
Added SQL MI tile and sub resource types to resource deployment (#14043)
* Made azure arc as resourcesubtype Added new azure arc resource type Added support for different eula statement for different subtypes Consolidated getSelectedOption * Fixed some PR based comments * Fixed more pr comments * Fixed the error in unit test by deep copying extension resourceTypes (to keep the original one intact) * Fixed property name 'agreement' to 'agreements' * Cloning subresourceTypes
This commit is contained in:
@@ -9,7 +9,7 @@ import * as os from 'os';
|
||||
import * as path from 'path';
|
||||
import * as vscode from 'vscode';
|
||||
import * as nls from 'vscode-nls';
|
||||
import { DeploymentProvider, instanceOfAzureSQLVMDeploymentProvider, instanceOfAzureSQLDBDeploymentProvider, instanceOfCommandDeploymentProvider, instanceOfDialogDeploymentProvider, instanceOfDownloadDeploymentProvider, instanceOfNotebookBasedDialogInfo, instanceOfNotebookDeploymentProvider, instanceOfNotebookWizardDeploymentProvider, instanceOfWebPageDeploymentProvider, instanceOfWizardDeploymentProvider, NotebookInfo, NotebookPathInfo, ResourceType, ResourceTypeOption } from '../interfaces';
|
||||
import { DeploymentProvider, instanceOfAzureSQLVMDeploymentProvider, instanceOfAzureSQLDBDeploymentProvider, instanceOfCommandDeploymentProvider, instanceOfDialogDeploymentProvider, instanceOfDownloadDeploymentProvider, instanceOfNotebookBasedDialogInfo, instanceOfNotebookDeploymentProvider, instanceOfNotebookWizardDeploymentProvider, instanceOfWebPageDeploymentProvider, instanceOfWizardDeploymentProvider, NotebookInfo, NotebookPathInfo, ResourceType, ResourceTypeOption, ResourceSubType, AgreementInfo } from '../interfaces';
|
||||
import { AzdataService } from './azdataService';
|
||||
import { KubeService } from './kubeService';
|
||||
import { INotebookService } from './notebookService';
|
||||
@@ -39,19 +39,20 @@ export class ResourceTypeService implements IResourceTypeService {
|
||||
getResourceTypes(filterByPlatform: boolean = true): ResourceType[] {
|
||||
if (this._resourceTypes.length === 0) {
|
||||
vscode.extensions.all.forEach((extension) => {
|
||||
const extensionResourceTypes = extension.packageJSON.contributes && extension.packageJSON.contributes.resourceDeploymentTypes as ResourceType[];
|
||||
if (extensionResourceTypes) {
|
||||
extensionResourceTypes.forEach((extensionResourceType: ResourceType) => {
|
||||
// Clone the object - we modify it by adding complex types and so if we modify the original contribution then
|
||||
// we can break VS Code functionality since it will sometimes pass this object over the RPC layer which requires
|
||||
// stringifying it - which can break with some of the complex types we add.
|
||||
const resourceType = deepClone(extensionResourceType);
|
||||
this.updatePathProperties(resourceType, extension.extensionPath);
|
||||
resourceType.getProvider = (selectedOptions) => { return this.getProvider(resourceType, selectedOptions); };
|
||||
resourceType.getOkButtonText = (selectedOptions) => { return this.getOkButtonText(resourceType, selectedOptions); };
|
||||
this._resourceTypes.push(resourceType);
|
||||
});
|
||||
}
|
||||
const extensionResourceTypes = extension.packageJSON.contributes?.resourceDeploymentTypes as ResourceType[];
|
||||
extensionResourceTypes?.forEach((extensionResourceType: ResourceType) => {
|
||||
// Clone the object - we modify it by adding complex types and so if we modify the original contribution then
|
||||
// we can break VS Code functionality since it will sometimes pass this object over the RPC layer which requires
|
||||
// stringifying it - which can break with some of the complex types we add.
|
||||
const resourceType = deepClone(extensionResourceType);
|
||||
this.updatePathProperties(resourceType, extension.extensionPath);
|
||||
resourceType.getProvider = (selectedOptions) => { return this.getProvider(resourceType, selectedOptions); };
|
||||
resourceType.getOkButtonText = (selectedOptions) => { return this.getOkButtonText(resourceType, selectedOptions); };
|
||||
resourceType.getAgreementInfo = (selectedOptions) => { return this.getAgreementInfo(resourceType, selectedOptions); };
|
||||
this.getResourceSubTypes(filterByPlatform, resourceType);
|
||||
this._resourceTypes.push(resourceType);
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@@ -71,26 +72,30 @@ export class ResourceTypeService implements IResourceTypeService {
|
||||
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 ('bdcWizard' in provider) {
|
||||
this.updateNotebookPath(provider.bdcWizard, extensionPath);
|
||||
}
|
||||
else if ('notebookWizard' in provider) {
|
||||
this.updateNotebookPath(provider.notebookWizard, extensionPath);
|
||||
}
|
||||
else if ('azureSQLVMWizard' in provider) {
|
||||
this.updateNotebookPath(provider.azureSQLVMWizard, extensionPath);
|
||||
}
|
||||
else if ('azureSQLDBWizard' in provider) {
|
||||
this.updateNotebookPath(provider.azureSQLDBWizard, extensionPath);
|
||||
}
|
||||
this.updateProviderPathProperties(provider, extensionPath);
|
||||
});
|
||||
}
|
||||
|
||||
private updateProviderPathProperties(provider: DeploymentProvider, extensionPath: string): void {
|
||||
if (instanceOfNotebookDeploymentProvider(provider)) {
|
||||
this.updateNotebookPath(provider, extensionPath);
|
||||
} else if (instanceOfDialogDeploymentProvider(provider) && instanceOfNotebookBasedDialogInfo(provider.dialog)) {
|
||||
this.updateNotebookPath(provider.dialog, extensionPath);
|
||||
}
|
||||
else if ('bdcWizard' in provider) {
|
||||
this.updateNotebookPath(provider.bdcWizard, extensionPath);
|
||||
}
|
||||
else if ('notebookWizard' in provider) {
|
||||
this.updateNotebookPath(provider.notebookWizard, extensionPath);
|
||||
}
|
||||
else if ('azureSQLVMWizard' in provider) {
|
||||
this.updateNotebookPath(provider.azureSQLVMWizard, extensionPath);
|
||||
}
|
||||
else if ('azureSQLDBWizard' in provider) {
|
||||
this.updateNotebookPath(provider.azureSQLDBWizard, extensionPath);
|
||||
}
|
||||
}
|
||||
|
||||
private updateNotebookPath(objWithNotebookProperty: { notebook: string | NotebookPathInfo | NotebookInfo[] } | undefined, extensionPath: string): void {
|
||||
if (objWithNotebookProperty && objWithNotebookProperty.notebook) {
|
||||
if (typeof objWithNotebookProperty.notebook === 'string') {
|
||||
@@ -113,6 +118,40 @@ export class ResourceTypeService implements IResourceTypeService {
|
||||
}
|
||||
}
|
||||
|
||||
private getResourceSubTypes(filterByPlatform: boolean = true, resourceType: ResourceType): void {
|
||||
const resourceSubTypes: ResourceSubType[] = [];
|
||||
vscode.extensions.all.forEach((extension) => {
|
||||
const extensionResourceSubTypes = extension.packageJSON.contributes?.resourceDeploymentSubTypes as ResourceSubType[];
|
||||
extensionResourceSubTypes?.forEach((extensionResourceSubType: ResourceSubType) => {
|
||||
const resourceSubType = deepClone(extensionResourceSubType);
|
||||
if (resourceSubType.name === resourceType.name) {
|
||||
this.updateProviderPathProperties(resourceSubType.provider, extension.extensionPath);
|
||||
resourceSubTypes.push(resourceSubType);
|
||||
const tagSet = new Set(resourceType.tags);
|
||||
resourceSubType.tags?.forEach(tag => tagSet.add(tag));
|
||||
resourceType.tags = Array.from(tagSet);
|
||||
resourceType.providers.push(resourceSubType.provider);
|
||||
if (resourceSubType.okButtonText) {
|
||||
resourceType.okButtonText?.push(resourceSubType.okButtonText!);
|
||||
}
|
||||
if (resourceSubType.options) {
|
||||
resourceType.options.forEach((roption) => {
|
||||
resourceSubType.options.forEach((soption) => {
|
||||
if (roption.name === soption.name) {
|
||||
roption.values = roption.values.concat(soption.values);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
if (resourceSubType.agreement) {
|
||||
resourceType.agreements?.push(resourceSubType.agreement!);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the resource types and returns validation error messages if any.
|
||||
* @param resourceTypes resource types to be validated
|
||||
@@ -177,6 +216,7 @@ export class ResourceTypeService implements IResourceTypeService {
|
||||
|
||||
if (dupePositions.length !== 0) {
|
||||
errorMessages.push(`Option values with same name or display name are found at the following positions: ${i + 1}, ${dupePositions.join(',')}.${positionInfo} `);
|
||||
errorMessages.push(JSON.stringify(option));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -250,6 +290,16 @@ export class ResourceTypeService implements IResourceTypeService {
|
||||
return loc.select;
|
||||
}
|
||||
|
||||
private getAgreementInfo(resourceType: ResourceType, selectedOptions: { option: string, value: string }[]): AgreementInfo | undefined {
|
||||
if (resourceType.agreements) {
|
||||
for (const possibleOption of resourceType.agreements) {
|
||||
if (processWhenClause(possibleOption.when, selectedOptions)) {
|
||||
return possibleOption;
|
||||
}
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
public startDeployment(resourceType: ResourceType): void {
|
||||
const wizard = new ResourceTypeWizard(resourceType, new KubeService(), new AzdataService(this.platformService), this.notebookService, this.toolsService, this.platformService, this);
|
||||
|
||||
Reference in New Issue
Block a user