Skip to content

Adapter: Implement ExternalProvisioningProvider core-side bridge #7473

Description

@wbreza

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:

  1. Constructs the appropriate proto request message
  2. Calls broker.SendAndWait() or broker.SendAndWaitWithProgress() (for Deploy/Preview/Destroy)
  3. Extracts the response
  4. Converts proto types → core provisioning types
  5. 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.Optionsazdext.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.Optionsazdext.ProvisioningOptions (especially Config map[string]anygoogle.protobuf.Struct)
  • provisioning.OutputParameterazdext.ProvisioningOutputParameter
  • provisioning.InputParameterazdext.ProvisioningInputParameter
  • provisioning.Resourceazdext.ProvisioningResource
  • provisioning.Parameterazdext.ProvisioningParameter
  • Preview change types, property changes, etc.
  • Handle nil/empty cases gracefully

Acceptance Criteria

  • ExternalProvisioningProvider implements provisioning.Provider
  • NewExternalProvisioningProvider() constructor
  • Name() returns registered provider name
  • Initialize() converts Options and sends request
  • State() returns converted StateResult with outputs and resources
  • Deploy() uses SendAndWaitWithProgress(), converts DeployResult
  • Preview() uses SendAndWaitWithProgress(), converts full preview result
  • Destroy() converts options, uses progress, converts result
  • EnsureEnv() sends request and handles response
  • Parameters() converts parameter list
  • All conversions handle nil/empty gracefully
  • Uses uuid.New().String() for request IDs
  • Progress callback wired for Deploy/Preview/Destroy

Dependencies

Files

  • Create: pkg/infra/provisioning/external/external_provider.go

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions