Skip to content

Proto: Define provisioning.proto with bidirectional streaming RPC #7466

Description

@wbreza

Summary

Create grpc/proto/provisioning.proto following the established patterns in service_target.proto and framework_service.proto. This is the foundational schema that defines the gRPC contract between azd core and extension-provided provisioning providers.

Parent Epic

Part of #7465 — Provisioning Providers in the AZD Extension Framework

Context

The extension framework uses bidirectional streaming gRPC with a MessageBroker pattern for request-response correlation. Each extension capability (service targets, framework services) has its own proto file defining a Stream() RPC and a message envelope with oneof for all request/response/progress message types.

Patterns to Follow

  • grpc/proto/service_target.proto — Service definition, envelope pattern, progress messages
  • grpc/proto/framework_service.proto — Another example of the same pattern
  • Both use ExtensionError from errors.proto for standardized error handling

Detailed Requirements

Service Definition

service ProvisioningService {
  rpc Stream(stream ProvisioningMessage) returns (stream ProvisioningMessage);
}

Message Envelope (ProvisioningMessage)

Must include:

  • string request_id — correlation ID for request-response matching
  • ExtensionError error — standardized error from errors.proto
  • oneof message_type containing all 15+ message types below

Message Types (in the oneof)

Registration:

  • RegisterProvisioningProviderRequest — fields: string name (provider name for IoC registration)
  • RegisterProvisioningProviderResponse — confirmation

Initialize:

  • ProvisioningInitializeRequest — fields: string project_path, ProvisioningOptions options
  • ProvisioningInitializeResponse — confirmation

State:

  • ProvisioningStateRequest — (may include state options/hint)
  • ProvisioningStateResponse — fields: outputs map, resources list

Deploy:

  • ProvisioningDeployRequest — trigger deployment
  • ProvisioningDeployResponse — fields: deployment outputs, skipped reason
  • ProvisioningDeployProgressMessage — fields: string message (in-band progress)

Preview:

  • ProvisioningPreviewRequest — trigger preview
  • ProvisioningPreviewResponse — fields: preview status, changes list
  • ProvisioningPreviewProgressMessage — fields: string message

Destroy:

  • ProvisioningDestroyRequest — fields: destroy options (force, purge flags)
  • ProvisioningDestroyResponse — fields: invalidated env keys
  • ProvisioningDestroyProgressMessage — fields: string message

EnsureEnv:

  • ProvisioningEnsureEnvRequest
  • ProvisioningEnsureEnvResponse

Parameters:

  • ProvisioningParametersRequest
  • ProvisioningParametersResponse — fields: repeated ProvisioningParameter

Shared Types

  • ProvisioningOptions — provider kind, path, module, name, deployment stacks, config (google.protobuf.Struct)
  • ProvisioningParameter — name, secret flag, value, env var mappings
  • ProvisioningInputParameter — type, default value, value
  • ProvisioningOutputParameter — type, value
  • ProvisioningResource — id
  • ProvisioningDeployPreviewChange — change type, resource, before/after, delta
  • ProvisioningDestroyOptions — force, purge booleans

Key Requirements

  • Use ExtensionError from errors.proto (NOT a custom error type)
  • Use google.protobuf.Struct for flexible config payloads
  • Set go_package to match existing convention (azdext)
  • Import errors.proto for ExtensionError

Acceptance Criteria

  • Proto file compiles without errors via protoc
  • Service ProvisioningService with Stream() bidirectional RPC defined
  • ProvisioningMessage envelope has request_id, ExtensionError, and oneof with all message types
  • Registration: RegisterProvisioningProviderRequest (with name), RegisterProvisioningProviderResponse
  • Initialize: request with project_path + options, response
  • State: request, response with outputs and resources
  • Deploy: request, response with deployment result, progress message
  • Preview: request, response with preview result, progress message
  • Destroy: request with options, response with invalidated keys, progress message
  • EnsureEnv: request, response
  • Parameters: request, response with parameter list
  • All shared types defined with proper field types
  • Uses ExtensionError from errors.proto
  • Uses google.protobuf.Struct for config
  • go_package consistent with other protos

Dependencies

  • None (this is the foundation)

Files

  • Create: grpc/proto/provisioning.proto

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