diff --git a/extensions/arc/package.json b/extensions/arc/package.json index e1991703f9..9c32e97eaa 100644 --- a/extensions/arc/package.json +++ b/extensions/arc/package.json @@ -1016,6 +1016,11 @@ "when": "mi-type=arc-mi" } } + ], + "resourceDeploymentOptionsSources": [ + { + "id": "arc.controllers" + } ] }, "dependencies": { diff --git a/extensions/azdata/package.json b/extensions/azdata/package.json index ca9cd7e608..54a2fd498e 100644 --- a/extensions/azdata/package.json +++ b/extensions/azdata/package.json @@ -107,7 +107,12 @@ "when": "azdata.found" } ] - } + }, + "resourceDeploymentOptionsSources": [ + { + "id": "arc.controller.config.profiles" + } + ] }, "dependencies": { "request": "^2.88.2", diff --git a/extensions/azurecore/package.json b/extensions/azurecore/package.json index cd2002e36d..bed8c6804e 100644 --- a/extensions/azurecore/package.json +++ b/extensions/azurecore/package.json @@ -317,6 +317,11 @@ } ] }, + "resourceDeploymentValueProviders": [ + { + "id": "subscription-id-to-tenant-id" + } + ], "hasAzureResourceProviders": true }, "dependencies": { diff --git a/extensions/resource-deployment/src/services/optionSourcesService.ts b/extensions/resource-deployment/src/services/optionSourcesService.ts index 3c6e12d276..05f38dfa7b 100644 --- a/extensions/resource-deployment/src/services/optionSourcesService.ts +++ b/extensions/resource-deployment/src/services/optionSourcesService.ts @@ -7,8 +7,13 @@ import * as vscode from 'vscode'; import * as rd from 'resource-deployment'; import * as loc from '../localizedConstants'; +interface OptionsSourceContribution { + id: string; +} + class OptionsSourcesService { private _optionsSourceStore = new Map(); + registerOptionsSourceProvider(provider: rd.IOptionsSourceProvider): vscode.Disposable { if (this._optionsSourceStore.has(provider.id)) { throw new Error(loc.optionsSourceAlreadyDefined(provider.id)); @@ -23,12 +28,23 @@ class OptionsSourcesService { this._optionsSourceStore.delete(providerId); } - getOptionsSource(optionsSourceProviderId: string): rd.IOptionsSourceProvider { - const optionsSource = this._optionsSourceStore.get(optionsSourceProviderId); + async getOptionsSource(optionsSourceProviderId: string): Promise { + let optionsSource = this._optionsSourceStore.get(optionsSourceProviderId); if (optionsSource === undefined) { - throw new Error(loc.noOptionsSourceDefined(optionsSourceProviderId)); + // We don't have the provider registered yet so try to find and activate the extension that contributes it + const ext = vscode.extensions.all.find(extension => { + return !!(extension.packageJSON.contributes?.resourceDeploymentOptionsSources as OptionsSourceContribution[])?.find(optionsSource => optionsSource.id === optionsSourceProviderId); + }); + if (ext) { + await ext.activate(); + } + optionsSource = this._optionsSourceStore.get(optionsSourceProviderId); + // Still don't have it registered - is the extension not properly registering it? + if (optionsSource === undefined) { + throw new Error(loc.noOptionsSourceDefined(optionsSourceProviderId)); + } } - return optionsSource; + return optionsSource!; } } diff --git a/extensions/resource-deployment/src/services/valueProviderService.ts b/extensions/resource-deployment/src/services/valueProviderService.ts index d447200f12..0a075e3365 100644 --- a/extensions/resource-deployment/src/services/valueProviderService.ts +++ b/extensions/resource-deployment/src/services/valueProviderService.ts @@ -7,6 +7,10 @@ import * as vscode from 'vscode'; import * as rd from 'resource-deployment'; import * as loc from '../localizedConstants'; +interface ValueProviderContribution { + id: string; +} + class ValueProviderService { private _valueProviderStore = new Map(); registerValueProvider(provider: rd.IValueProvider): vscode.Disposable { @@ -23,10 +27,21 @@ class ValueProviderService { this._valueProviderStore.delete(providerId); } - getValueProvider(providerId: string): rd.IValueProvider { - const valueProvider = this._valueProviderStore.get(providerId); + async getValueProvider(providerId: string): Promise { + let valueProvider = this._valueProviderStore.get(providerId); if (valueProvider === undefined) { - throw new Error(loc.noValueProviderDefined(providerId)); + // We don't have the provider registered yet so try to find and activate the extension that contributes it + const ext = vscode.extensions.all.find(extension => { + return !!(extension.packageJSON.contributes?.resourceDeploymentValueProviders as ValueProviderContribution[])?.find(valueProvider => valueProvider.id === providerId); + }); + if (ext) { + await ext.activate(); + } + valueProvider = this._valueProviderStore.get(providerId); + // Still don't have it registered - is the extension not properly registering it? + if (valueProvider === undefined) { + throw new Error(loc.noValueProviderDefined(providerId)); + } } return valueProvider; } diff --git a/extensions/resource-deployment/src/ui/modelViewUtils.ts b/extensions/resource-deployment/src/ui/modelViewUtils.ts index e1d068e431..b41a7dbf61 100644 --- a/extensions/resource-deployment/src/ui/modelViewUtils.ts +++ b/extensions/resource-deployment/src/ui/modelViewUtils.ts @@ -422,7 +422,7 @@ async function hookUpValueProviders(context: WizardPageContext): Promise { console.error(`Could not find target component ${field.valueProvider.triggerField} when hooking up value providers for ${field.label}`); return; } - const provider = valueProviderService.getValueProvider(field.valueProvider.providerId); + const provider = await valueProviderService.getValueProvider(field.valueProvider.providerId); const updateFields = async () => { const targetComponentValue = await targetComponent.getValue(); const newFieldValue = await provider.getValue(targetComponentValue?.toString() ?? ''); @@ -619,7 +619,7 @@ async function processOptionsTypeField(context: FieldContext): Promise { throwUnless('optionsType' in context.fieldInfo.options, loc.optionsTypeNotFound); if (context.fieldInfo.options.source?.providerId) { try { - context.fieldInfo.options.source.provider = optionsSourcesService.getOptionsSource(context.fieldInfo.options.source.providerId); + context.fieldInfo.options.source.provider = await optionsSourcesService.getOptionsSource(context.fieldInfo.options.source.providerId); } catch (e) { disableControlButtons(context.container);