Summary
Create ExternalProvisioningProvider implementing the core provisioning.Provider interface. This adapter runs in the azd core process and delegates all provider operations to the extension process via the MessageBroker. It handles proto↔core type conversions and progress streaming.
Parent Epic
Part of #7465 — Provisioning Providers in the AZD Extension Framework
Context
This is the core-side bridge. When azd's provisioning Manager resolves a provider from IoC, it gets an ExternalProvisioningProvider for extension-provided providers. Each method:
- Constructs the appropriate proto request message
- Calls
broker.SendAndWait() or broker.SendAndWaitWithProgress() (for Deploy/Preview/Destroy)
- Extracts the response
- Converts proto types → core provisioning types
- Returns the result
Pattern to Follow
ExternalServiceTarget in pkg/project/service_target_external.go
- Uses
uuid.New().String() for request IDs
- Uses
mapper.Convert() or manual type conversion for proto↔domain mapping
Detailed Requirements
Struct
type ExternalProvisioningProvider struct {
providerName string
extension *extensions.Extension
broker *grpcbroker.MessageBroker[azdext.ProvisioningMessage]
envManager environment.Manager
env *environment.Environment
console input.Console
prompters prompt.Prompter
}
Method Implementations
Name() — returns providerName
Initialize(ctx, projectPath, options):
- Convert
provisioning.Options → azdext.ProvisioningOptions (including Config → google.protobuf.Struct)
- Send
ProvisioningInitializeRequest via broker.SendAndWait()
State(ctx, options):
- Send
ProvisioningStateRequest via broker.SendAndWait()
- Convert response outputs/resources →
provisioning.StateResult
Deploy(ctx):
- Send
ProvisioningDeployRequest via broker.SendAndWaitWithProgress()
- Wire progress callback to console output
- Convert response →
provisioning.DeployResult
Preview(ctx):
- Send
ProvisioningPreviewRequest via broker.SendAndWaitWithProgress()
- Convert response →
provisioning.DeployPreviewResult (including change types, property changes)
Destroy(ctx, options):
- Convert
provisioning.DestroyOptions → proto
- Send
ProvisioningDestroyRequest via broker.SendAndWaitWithProgress()
- Convert response →
provisioning.DestroyResult
EnsureEnv(ctx):
- Send
ProvisioningEnsureEnvRequest via broker.SendAndWait()
Parameters(ctx):
- Send
ProvisioningParametersRequest via broker.SendAndWait()
- Convert response →
[]provisioning.Parameter
Type Conversion Requirements
provisioning.Options ↔ azdext.ProvisioningOptions (especially Config map[string]any ↔ google.protobuf.Struct)
provisioning.OutputParameter ↔ azdext.ProvisioningOutputParameter
provisioning.InputParameter ↔ azdext.ProvisioningInputParameter
provisioning.Resource ↔ azdext.ProvisioningResource
provisioning.Parameter ↔ azdext.ProvisioningParameter
- Preview change types, property changes, etc.
- Handle nil/empty cases gracefully
Acceptance Criteria
Dependencies
Files
- Create:
pkg/infra/provisioning/external/external_provider.go
Summary
Create
ExternalProvisioningProviderimplementing the coreprovisioning.Providerinterface. This adapter runs in the azd core process and delegates all provider operations to the extension process via theMessageBroker. It handles proto↔core type conversions and progress streaming.Parent Epic
Part of #7465 — Provisioning Providers in the AZD Extension Framework
Context
This is the core-side bridge. When azd's provisioning
Managerresolves a provider from IoC, it gets anExternalProvisioningProviderfor extension-provided providers. Each method:broker.SendAndWait()orbroker.SendAndWaitWithProgress()(for Deploy/Preview/Destroy)Pattern to Follow
ExternalServiceTargetinpkg/project/service_target_external.gouuid.New().String()for request IDsmapper.Convert()or manual type conversion for proto↔domain mappingDetailed Requirements
Struct
Method Implementations
Name()— returnsproviderNameInitialize(ctx, projectPath, options):provisioning.Options→azdext.ProvisioningOptions(including Config →google.protobuf.Struct)ProvisioningInitializeRequestviabroker.SendAndWait()State(ctx, options):ProvisioningStateRequestviabroker.SendAndWait()provisioning.StateResultDeploy(ctx):ProvisioningDeployRequestviabroker.SendAndWaitWithProgress()provisioning.DeployResultPreview(ctx):ProvisioningPreviewRequestviabroker.SendAndWaitWithProgress()provisioning.DeployPreviewResult(including change types, property changes)Destroy(ctx, options):provisioning.DestroyOptions→ protoProvisioningDestroyRequestviabroker.SendAndWaitWithProgress()provisioning.DestroyResultEnsureEnv(ctx):ProvisioningEnsureEnvRequestviabroker.SendAndWait()Parameters(ctx):ProvisioningParametersRequestviabroker.SendAndWait()[]provisioning.ParameterType Conversion Requirements
provisioning.Options↔azdext.ProvisioningOptions(especiallyConfig map[string]any↔google.protobuf.Struct)provisioning.OutputParameter↔azdext.ProvisioningOutputParameterprovisioning.InputParameter↔azdext.ProvisioningInputParameterprovisioning.Resource↔azdext.ProvisioningResourceprovisioning.Parameter↔azdext.ProvisioningParameterAcceptance Criteria
ExternalProvisioningProviderimplementsprovisioning.ProviderNewExternalProvisioningProvider()constructorName()returns registered provider nameInitialize()converts Options and sends requestState()returns converted StateResult with outputs and resourcesDeploy()usesSendAndWaitWithProgress(), converts DeployResultPreview()usesSendAndWaitWithProgress(), converts full preview resultDestroy()converts options, uses progress, converts resultEnsureEnv()sends request and handles responseParameters()converts parameter listuuid.New().String()for request IDsDependencies
Files
pkg/infra/provisioning/external/external_provider.go