From e43cb142cbd457b8c19948d7c0a6ac5c7e41dd05 Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 10 May 2026 02:09:43 -0400 Subject: [PATCH 1/8] feat(proto): add iac.proto with IaCProviderRequired + 6 optional services + ResourceDriver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task 3 of the strict-contracts force-cutover plan (docs/plans/2026-05-10-strict-contracts-force-cutover.md, rev5). Adds plugin/external/proto/iac.proto defining the typed gRPC contract that supersedes the legacy InvokeService/structpb dispatch path for IaCProvider + ResourceDriver: - service IaCProviderRequired: 11 RPCs every IaC plugin MUST implement (Initialize, Name, Version, Capabilities, Plan, Apply, Destroy, Status, Import, ResolveSizing, BootstrapStateBackend). Compile-time enforced via the SDK type-assert in Task 4. - 6 optional services — providers register only the ones they support: IaCProviderEnumerator (EnumerateAll, EnumerateByTag), IaCProviderDriftDetector (DetectDrift, DetectDriftWithSpecs), IaCProviderCredentialRevoker (RevokeProviderCredential), IaCProviderMigrationRepairer (RepairDirtyMigration), IaCProviderValidator (ValidatePlan), IaCProviderDriftConfigDetector (DetectDriftConfig). Absence of registration IS the negative signal — no NotSupported field on any optional response (per design §Optional services). - service ResourceDriver: 9 RPCs for per-resource-type CRUD dispatch (Create, Read, Update, Delete, Diff, Scale, HealthCheck, SensitiveKeys, Troubleshoot), each carrying resource_type so a single server can route to the per-type driver implementation. Hard invariants honored: - NO google.protobuf.Struct, NO google.protobuf.Any anywhere. - Free-form per-resource Config/Outputs payloads cross the wire as bytes _json (the plugin owns json.Marshal/Unmarshal); this eliminates the structpb conversion surface that previously dropped map[string]bool entries silently (T3.9 finding). - ResourceOutput.sensitive uses typed map per design. Generated iac.pb.go + iac_grpc.pb.go via protoc v34.1 + protoc-gen-go v1.36.11 + protoc-gen-go-grpc v1.6.1. Failing test (plugin/external/proto/iac_proto_test.go) asserts the generated server interfaces exist and have the methods the design requires — drops in iac.proto cause the test file to fail to compile. Verification: GOWORK=off go test ./plugin/external/proto/... PASSES; GOWORK=off go build ./plugin/... ./cmd/... ./module/... clean. Rollback: revert this commit; legacy InvokeService dispatch in plugin.proto remains functional; the additive-only nature of this PR means no consumer is affected until subsequent tasks wire callers. --- plugin/external/proto/iac.pb.go | 5139 +++++++++++++++++++++++ plugin/external/proto/iac.proto | 578 +++ plugin/external/proto/iac_grpc.pb.go | 1649 ++++++++ plugin/external/proto/iac_proto_test.go | 64 + 4 files changed, 7430 insertions(+) create mode 100644 plugin/external/proto/iac.pb.go create mode 100644 plugin/external/proto/iac.proto create mode 100644 plugin/external/proto/iac_grpc.pb.go create mode 100644 plugin/external/proto/iac_proto_test.go diff --git a/plugin/external/proto/iac.pb.go b/plugin/external/proto/iac.pb.go new file mode 100644 index 00000000..8bff86bb --- /dev/null +++ b/plugin/external/proto/iac.pb.go @@ -0,0 +1,5139 @@ +// iac.proto — typed gRPC contract for IaCProvider + ResourceDriver plugins. +// +// Design: docs/plans/2026-05-10-strict-contracts-force-cutover-design.md +// Plan: docs/plans/2026-05-10-strict-contracts-force-cutover.md (Task 3) +// +// Hard invariants (per cycle 4 §Acceptance criteria): +// - NO google.protobuf.Struct, NO google.protobuf.Any used in any message. +// - Free-form per-resource Config / Outputs payloads cross the wire as +// bytes _json, JSON-encoded by the plugin/host. The plugin owns +// the serialization shape; the proto layer carries opaque bytes. +// - ResourceOutput.sensitive uses typed map (NOT structpb). +// - REQUIRED service: every method must be implemented by every plugin. +// Compile fails on the SDK type-assert if a method is missing. +// - OPTIONAL services: providers register only the services they support. +// Absence of registration IS the negative signal — no NotSupported flag. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc v7.34.1 +// source: plugin/external/proto/iac.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// DriftClass mirrors interfaces.DriftClass. Wire-stable string-equivalent +// enum: zero value is UNKNOWN (matches Go's "" zero value), with explicit +// IN_SYNC / GHOST / CONFIG variants. +type DriftClass int32 + +const ( + DriftClass_DRIFT_CLASS_UNKNOWN DriftClass = 0 + DriftClass_DRIFT_CLASS_IN_SYNC DriftClass = 1 + DriftClass_DRIFT_CLASS_GHOST DriftClass = 2 + DriftClass_DRIFT_CLASS_CONFIG DriftClass = 3 +) + +// Enum value maps for DriftClass. +var ( + DriftClass_name = map[int32]string{ + 0: "DRIFT_CLASS_UNKNOWN", + 1: "DRIFT_CLASS_IN_SYNC", + 2: "DRIFT_CLASS_GHOST", + 3: "DRIFT_CLASS_CONFIG", + } + DriftClass_value = map[string]int32{ + "DRIFT_CLASS_UNKNOWN": 0, + "DRIFT_CLASS_IN_SYNC": 1, + "DRIFT_CLASS_GHOST": 2, + "DRIFT_CLASS_CONFIG": 3, + } +) + +func (x DriftClass) Enum() *DriftClass { + p := new(DriftClass) + *p = x + return p +} + +func (x DriftClass) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DriftClass) Descriptor() protoreflect.EnumDescriptor { + return file_plugin_external_proto_iac_proto_enumTypes[0].Descriptor() +} + +func (DriftClass) Type() protoreflect.EnumType { + return &file_plugin_external_proto_iac_proto_enumTypes[0] +} + +func (x DriftClass) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DriftClass.Descriptor instead. +func (DriftClass) EnumDescriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{0} +} + +// PlanDiagnosticSeverity mirrors interfaces.PlanDiagnosticSeverity. +// Wire ordering matches the Go iota: INFO=0, WARNING=1, ERROR=2. +type PlanDiagnosticSeverity int32 + +const ( + PlanDiagnosticSeverity_PLAN_DIAGNOSTIC_INFO PlanDiagnosticSeverity = 0 + PlanDiagnosticSeverity_PLAN_DIAGNOSTIC_WARNING PlanDiagnosticSeverity = 1 + PlanDiagnosticSeverity_PLAN_DIAGNOSTIC_ERROR PlanDiagnosticSeverity = 2 +) + +// Enum value maps for PlanDiagnosticSeverity. +var ( + PlanDiagnosticSeverity_name = map[int32]string{ + 0: "PLAN_DIAGNOSTIC_INFO", + 1: "PLAN_DIAGNOSTIC_WARNING", + 2: "PLAN_DIAGNOSTIC_ERROR", + } + PlanDiagnosticSeverity_value = map[string]int32{ + "PLAN_DIAGNOSTIC_INFO": 0, + "PLAN_DIAGNOSTIC_WARNING": 1, + "PLAN_DIAGNOSTIC_ERROR": 2, + } +) + +func (x PlanDiagnosticSeverity) Enum() *PlanDiagnosticSeverity { + p := new(PlanDiagnosticSeverity) + *p = x + return p +} + +func (x PlanDiagnosticSeverity) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PlanDiagnosticSeverity) Descriptor() protoreflect.EnumDescriptor { + return file_plugin_external_proto_iac_proto_enumTypes[1].Descriptor() +} + +func (PlanDiagnosticSeverity) Type() protoreflect.EnumType { + return &file_plugin_external_proto_iac_proto_enumTypes[1] +} + +func (x PlanDiagnosticSeverity) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PlanDiagnosticSeverity.Descriptor instead. +func (PlanDiagnosticSeverity) EnumDescriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{1} +} + +// ResourceSpec mirrors interfaces.ResourceSpec. +type ResourceSpec struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + // config_json is a JSON-encoded map[string]any of provider-specific + // configuration. Plugins parse it with encoding/json. + ConfigJson []byte `protobuf:"bytes,3,opt,name=config_json,json=configJson,proto3" json:"config_json,omitempty"` + Size string `protobuf:"bytes,4,opt,name=size,proto3" json:"size,omitempty"` // interfaces.Size string ("xs","s","m","l","xl") + Hints *ResourceHints `protobuf:"bytes,5,opt,name=hints,proto3" json:"hints,omitempty"` + DependsOn []string `protobuf:"bytes,6,rep,name=depends_on,json=dependsOn,proto3" json:"depends_on,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceSpec) Reset() { + *x = ResourceSpec{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceSpec) ProtoMessage() {} + +func (x *ResourceSpec) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceSpec.ProtoReflect.Descriptor instead. +func (*ResourceSpec) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{0} +} + +func (x *ResourceSpec) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ResourceSpec) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ResourceSpec) GetConfigJson() []byte { + if x != nil { + return x.ConfigJson + } + return nil +} + +func (x *ResourceSpec) GetSize() string { + if x != nil { + return x.Size + } + return "" +} + +func (x *ResourceSpec) GetHints() *ResourceHints { + if x != nil { + return x.Hints + } + return nil +} + +func (x *ResourceSpec) GetDependsOn() []string { + if x != nil { + return x.DependsOn + } + return nil +} + +// ResourceRef mirrors interfaces.ResourceRef. +type ResourceRef struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + ProviderId string `protobuf:"bytes,3,opt,name=provider_id,json=providerId,proto3" json:"provider_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceRef) Reset() { + *x = ResourceRef{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceRef) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceRef) ProtoMessage() {} + +func (x *ResourceRef) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceRef.ProtoReflect.Descriptor instead. +func (*ResourceRef) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{1} +} + +func (x *ResourceRef) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ResourceRef) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ResourceRef) GetProviderId() string { + if x != nil { + return x.ProviderId + } + return "" +} + +// ResourceHints mirrors interfaces.ResourceHints. +type ResourceHints struct { + state protoimpl.MessageState `protogen:"open.v1"` + Cpu string `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory string `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` + Storage string `protobuf:"bytes,3,opt,name=storage,proto3" json:"storage,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceHints) Reset() { + *x = ResourceHints{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceHints) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceHints) ProtoMessage() {} + +func (x *ResourceHints) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceHints.ProtoReflect.Descriptor instead. +func (*ResourceHints) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{2} +} + +func (x *ResourceHints) GetCpu() string { + if x != nil { + return x.Cpu + } + return "" +} + +func (x *ResourceHints) GetMemory() string { + if x != nil { + return x.Memory + } + return "" +} + +func (x *ResourceHints) GetStorage() string { + if x != nil { + return x.Storage + } + return "" +} + +// ProviderSizing mirrors interfaces.ProviderSizing. +type ProviderSizing struct { + state protoimpl.MessageState `protogen:"open.v1"` + InstanceType string `protobuf:"bytes,1,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` + SpecsJson []byte `protobuf:"bytes,2,opt,name=specs_json,json=specsJson,proto3" json:"specs_json,omitempty"` // JSON-encoded map[string]any of provider-specific specs + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ProviderSizing) Reset() { + *x = ProviderSizing{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ProviderSizing) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProviderSizing) ProtoMessage() {} + +func (x *ProviderSizing) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProviderSizing.ProtoReflect.Descriptor instead. +func (*ProviderSizing) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{3} +} + +func (x *ProviderSizing) GetInstanceType() string { + if x != nil { + return x.InstanceType + } + return "" +} + +func (x *ProviderSizing) GetSpecsJson() []byte { + if x != nil { + return x.SpecsJson + } + return nil +} + +// IaCCapabilityDeclaration mirrors interfaces.IaCCapabilityDeclaration. +type IaCCapabilityDeclaration struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Tier int32 `protobuf:"varint,2,opt,name=tier,proto3" json:"tier,omitempty"` + Operations []string `protobuf:"bytes,3,rep,name=operations,proto3" json:"operations,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IaCCapabilityDeclaration) Reset() { + *x = IaCCapabilityDeclaration{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IaCCapabilityDeclaration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IaCCapabilityDeclaration) ProtoMessage() {} + +func (x *IaCCapabilityDeclaration) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IaCCapabilityDeclaration.ProtoReflect.Descriptor instead. +func (*IaCCapabilityDeclaration) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{4} +} + +func (x *IaCCapabilityDeclaration) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *IaCCapabilityDeclaration) GetTier() int32 { + if x != nil { + return x.Tier + } + return 0 +} + +func (x *IaCCapabilityDeclaration) GetOperations() []string { + if x != nil { + return x.Operations + } + return nil +} + +// ResourceState mirrors interfaces.ResourceState. The on-disk JSON state +// file format is unchanged across the cutover (per design §State-file +// compat invariant); this proto carries the in-flight RPC representation. +type ResourceState struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` + Provider string `protobuf:"bytes,4,opt,name=provider,proto3" json:"provider,omitempty"` + ProviderRef string `protobuf:"bytes,5,opt,name=provider_ref,json=providerRef,proto3" json:"provider_ref,omitempty"` + ProviderId string `protobuf:"bytes,6,opt,name=provider_id,json=providerId,proto3" json:"provider_id,omitempty"` + ConfigHash string `protobuf:"bytes,7,opt,name=config_hash,json=configHash,proto3" json:"config_hash,omitempty"` + // applied_config_json is the JSON-encoded map[string]any. + AppliedConfigJson []byte `protobuf:"bytes,8,opt,name=applied_config_json,json=appliedConfigJson,proto3" json:"applied_config_json,omitempty"` + // applied_config_source: "" | "apply" | "adoption" (provenance discriminator). + AppliedConfigSource string `protobuf:"bytes,9,opt,name=applied_config_source,json=appliedConfigSource,proto3" json:"applied_config_source,omitempty"` + // outputs_json is the JSON-encoded map[string]any. + OutputsJson []byte `protobuf:"bytes,10,opt,name=outputs_json,json=outputsJson,proto3" json:"outputs_json,omitempty"` + Dependencies []string `protobuf:"bytes,11,rep,name=dependencies,proto3" json:"dependencies,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + LastDriftCheck *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=last_drift_check,json=lastDriftCheck,proto3" json:"last_drift_check,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceState) Reset() { + *x = ResourceState{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceState) ProtoMessage() {} + +func (x *ResourceState) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceState.ProtoReflect.Descriptor instead. +func (*ResourceState) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{5} +} + +func (x *ResourceState) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ResourceState) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ResourceState) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ResourceState) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *ResourceState) GetProviderRef() string { + if x != nil { + return x.ProviderRef + } + return "" +} + +func (x *ResourceState) GetProviderId() string { + if x != nil { + return x.ProviderId + } + return "" +} + +func (x *ResourceState) GetConfigHash() string { + if x != nil { + return x.ConfigHash + } + return "" +} + +func (x *ResourceState) GetAppliedConfigJson() []byte { + if x != nil { + return x.AppliedConfigJson + } + return nil +} + +func (x *ResourceState) GetAppliedConfigSource() string { + if x != nil { + return x.AppliedConfigSource + } + return "" +} + +func (x *ResourceState) GetOutputsJson() []byte { + if x != nil { + return x.OutputsJson + } + return nil +} + +func (x *ResourceState) GetDependencies() []string { + if x != nil { + return x.Dependencies + } + return nil +} + +func (x *ResourceState) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *ResourceState) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *ResourceState) GetLastDriftCheck() *timestamppb.Timestamp { + if x != nil { + return x.LastDriftCheck + } + return nil +} + +// ResourceOutput mirrors interfaces.ResourceOutput. The sensitive map is +// typed map per the design — the structpb roundtrip that +// previously dropped this map silently is eliminated. +type ResourceOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + ProviderId string `protobuf:"bytes,3,opt,name=provider_id,json=providerId,proto3" json:"provider_id,omitempty"` + // outputs_json is the JSON-encoded map[string]any of provider-emitted + // fields (IPs, endpoints, connection strings, etc.). + OutputsJson []byte `protobuf:"bytes,4,opt,name=outputs_json,json=outputsJson,proto3" json:"outputs_json,omitempty"` + Sensitive map[string]bool `protobuf:"bytes,5,rep,name=sensitive,proto3" json:"sensitive,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` + Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceOutput) Reset() { + *x = ResourceOutput{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceOutput) ProtoMessage() {} + +func (x *ResourceOutput) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceOutput.ProtoReflect.Descriptor instead. +func (*ResourceOutput) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{6} +} + +func (x *ResourceOutput) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ResourceOutput) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ResourceOutput) GetProviderId() string { + if x != nil { + return x.ProviderId + } + return "" +} + +func (x *ResourceOutput) GetOutputsJson() []byte { + if x != nil { + return x.OutputsJson + } + return nil +} + +func (x *ResourceOutput) GetSensitive() map[string]bool { + if x != nil { + return x.Sensitive + } + return nil +} + +func (x *ResourceOutput) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +// ResourceStatus mirrors interfaces.ResourceStatus. +type ResourceStatus struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + ProviderId string `protobuf:"bytes,3,opt,name=provider_id,json=providerId,proto3" json:"provider_id,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` // running | stopped | degraded | unknown + OutputsJson []byte `protobuf:"bytes,5,opt,name=outputs_json,json=outputsJson,proto3" json:"outputs_json,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceStatus) Reset() { + *x = ResourceStatus{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceStatus) ProtoMessage() {} + +func (x *ResourceStatus) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceStatus.ProtoReflect.Descriptor instead. +func (*ResourceStatus) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{7} +} + +func (x *ResourceStatus) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ResourceStatus) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ResourceStatus) GetProviderId() string { + if x != nil { + return x.ProviderId + } + return "" +} + +func (x *ResourceStatus) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *ResourceStatus) GetOutputsJson() []byte { + if x != nil { + return x.OutputsJson + } + return nil +} + +// FieldChange mirrors interfaces.FieldChange. +type FieldChange struct { + state protoimpl.MessageState `protogen:"open.v1"` + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + // old_json / new_json carry arbitrary scalar/map/list values JSON-encoded. + OldJson []byte `protobuf:"bytes,2,opt,name=old_json,json=oldJson,proto3" json:"old_json,omitempty"` + NewJson []byte `protobuf:"bytes,3,opt,name=new_json,json=newJson,proto3" json:"new_json,omitempty"` + ForceNew bool `protobuf:"varint,4,opt,name=force_new,json=forceNew,proto3" json:"force_new,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FieldChange) Reset() { + *x = FieldChange{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FieldChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FieldChange) ProtoMessage() {} + +func (x *FieldChange) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FieldChange.ProtoReflect.Descriptor instead. +func (*FieldChange) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{8} +} + +func (x *FieldChange) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *FieldChange) GetOldJson() []byte { + if x != nil { + return x.OldJson + } + return nil +} + +func (x *FieldChange) GetNewJson() []byte { + if x != nil { + return x.NewJson + } + return nil +} + +func (x *FieldChange) GetForceNew() bool { + if x != nil { + return x.ForceNew + } + return false +} + +// DiffResult mirrors interfaces.DiffResult. +type DiffResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + NeedsUpdate bool `protobuf:"varint,1,opt,name=needs_update,json=needsUpdate,proto3" json:"needs_update,omitempty"` + NeedsReplace bool `protobuf:"varint,2,opt,name=needs_replace,json=needsReplace,proto3" json:"needs_replace,omitempty"` + Changes []*FieldChange `protobuf:"bytes,3,rep,name=changes,proto3" json:"changes,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DiffResult) Reset() { + *x = DiffResult{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DiffResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DiffResult) ProtoMessage() {} + +func (x *DiffResult) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DiffResult.ProtoReflect.Descriptor instead. +func (*DiffResult) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{9} +} + +func (x *DiffResult) GetNeedsUpdate() bool { + if x != nil { + return x.NeedsUpdate + } + return false +} + +func (x *DiffResult) GetNeedsReplace() bool { + if x != nil { + return x.NeedsReplace + } + return false +} + +func (x *DiffResult) GetChanges() []*FieldChange { + if x != nil { + return x.Changes + } + return nil +} + +// DriftResult mirrors interfaces.DriftResult. +type DriftResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Drifted bool `protobuf:"varint,3,opt,name=drifted,proto3" json:"drifted,omitempty"` + Class DriftClass `protobuf:"varint,4,opt,name=class,proto3,enum=workflow.plugin.external.iac.DriftClass" json:"class,omitempty"` + ExpectedJson []byte `protobuf:"bytes,5,opt,name=expected_json,json=expectedJson,proto3" json:"expected_json,omitempty"` // JSON-encoded map[string]any + ActualJson []byte `protobuf:"bytes,6,opt,name=actual_json,json=actualJson,proto3" json:"actual_json,omitempty"` // JSON-encoded map[string]any + Fields []string `protobuf:"bytes,7,rep,name=fields,proto3" json:"fields,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DriftResult) Reset() { + *x = DriftResult{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DriftResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DriftResult) ProtoMessage() {} + +func (x *DriftResult) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DriftResult.ProtoReflect.Descriptor instead. +func (*DriftResult) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{10} +} + +func (x *DriftResult) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DriftResult) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *DriftResult) GetDrifted() bool { + if x != nil { + return x.Drifted + } + return false +} + +func (x *DriftResult) GetClass() DriftClass { + if x != nil { + return x.Class + } + return DriftClass_DRIFT_CLASS_UNKNOWN +} + +func (x *DriftResult) GetExpectedJson() []byte { + if x != nil { + return x.ExpectedJson + } + return nil +} + +func (x *DriftResult) GetActualJson() []byte { + if x != nil { + return x.ActualJson + } + return nil +} + +func (x *DriftResult) GetFields() []string { + if x != nil { + return x.Fields + } + return nil +} + +// DriftEntry mirrors interfaces.DriftEntry. +type DriftEntry struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PlanFingerprint string `protobuf:"bytes,2,opt,name=plan_fingerprint,json=planFingerprint,proto3" json:"plan_fingerprint,omitempty"` + ApplyFingerprint string `protobuf:"bytes,3,opt,name=apply_fingerprint,json=applyFingerprint,proto3" json:"apply_fingerprint,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DriftEntry) Reset() { + *x = DriftEntry{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DriftEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DriftEntry) ProtoMessage() {} + +func (x *DriftEntry) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DriftEntry.ProtoReflect.Descriptor instead. +func (*DriftEntry) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{11} +} + +func (x *DriftEntry) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DriftEntry) GetPlanFingerprint() string { + if x != nil { + return x.PlanFingerprint + } + return "" +} + +func (x *DriftEntry) GetApplyFingerprint() string { + if x != nil { + return x.ApplyFingerprint + } + return "" +} + +// HealthResult mirrors interfaces.HealthResult. +type HealthResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + Healthy bool `protobuf:"varint,1,opt,name=healthy,proto3" json:"healthy,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HealthResult) Reset() { + *x = HealthResult{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HealthResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HealthResult) ProtoMessage() {} + +func (x *HealthResult) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HealthResult.ProtoReflect.Descriptor instead. +func (*HealthResult) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{12} +} + +func (x *HealthResult) GetHealthy() bool { + if x != nil { + return x.Healthy + } + return false +} + +func (x *HealthResult) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// Diagnostic mirrors interfaces.Diagnostic (Troubleshooter type). +type Diagnostic struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Phase string `protobuf:"bytes,2,opt,name=phase,proto3" json:"phase,omitempty"` + Cause string `protobuf:"bytes,3,opt,name=cause,proto3" json:"cause,omitempty"` + At *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=at,proto3" json:"at,omitempty"` + Detail string `protobuf:"bytes,5,opt,name=detail,proto3" json:"detail,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Diagnostic) Reset() { + *x = Diagnostic{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Diagnostic) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Diagnostic) ProtoMessage() {} + +func (x *Diagnostic) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Diagnostic.ProtoReflect.Descriptor instead. +func (*Diagnostic) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{13} +} + +func (x *Diagnostic) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Diagnostic) GetPhase() string { + if x != nil { + return x.Phase + } + return "" +} + +func (x *Diagnostic) GetCause() string { + if x != nil { + return x.Cause + } + return "" +} + +func (x *Diagnostic) GetAt() *timestamppb.Timestamp { + if x != nil { + return x.At + } + return nil +} + +func (x *Diagnostic) GetDetail() string { + if x != nil { + return x.Detail + } + return "" +} + +// PlanDiagnostic mirrors interfaces.PlanDiagnostic. +type PlanDiagnostic struct { + state protoimpl.MessageState `protogen:"open.v1"` + Severity PlanDiagnosticSeverity `protobuf:"varint,1,opt,name=severity,proto3,enum=workflow.plugin.external.iac.PlanDiagnosticSeverity" json:"severity,omitempty"` + Resource string `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` + Field string `protobuf:"bytes,3,opt,name=field,proto3" json:"field,omitempty"` + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PlanDiagnostic) Reset() { + *x = PlanDiagnostic{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PlanDiagnostic) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlanDiagnostic) ProtoMessage() {} + +func (x *PlanDiagnostic) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlanDiagnostic.ProtoReflect.Descriptor instead. +func (*PlanDiagnostic) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{14} +} + +func (x *PlanDiagnostic) GetSeverity() PlanDiagnosticSeverity { + if x != nil { + return x.Severity + } + return PlanDiagnosticSeverity_PLAN_DIAGNOSTIC_INFO +} + +func (x *PlanDiagnostic) GetResource() string { + if x != nil { + return x.Resource + } + return "" +} + +func (x *PlanDiagnostic) GetField() string { + if x != nil { + return x.Field + } + return "" +} + +func (x *PlanDiagnostic) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// PlanAction mirrors interfaces.PlanAction. +type PlanAction struct { + state protoimpl.MessageState `protogen:"open.v1"` + Action string `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` // create | update | replace | delete + Resource *ResourceSpec `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` + Current *ResourceState `protobuf:"bytes,3,opt,name=current,proto3" json:"current,omitempty"` + Changes []*FieldChange `protobuf:"bytes,4,rep,name=changes,proto3" json:"changes,omitempty"` + ResolvedConfigHash string `protobuf:"bytes,5,opt,name=resolved_config_hash,json=resolvedConfigHash,proto3" json:"resolved_config_hash,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PlanAction) Reset() { + *x = PlanAction{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PlanAction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlanAction) ProtoMessage() {} + +func (x *PlanAction) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlanAction.ProtoReflect.Descriptor instead. +func (*PlanAction) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{15} +} + +func (x *PlanAction) GetAction() string { + if x != nil { + return x.Action + } + return "" +} + +func (x *PlanAction) GetResource() *ResourceSpec { + if x != nil { + return x.Resource + } + return nil +} + +func (x *PlanAction) GetCurrent() *ResourceState { + if x != nil { + return x.Current + } + return nil +} + +func (x *PlanAction) GetChanges() []*FieldChange { + if x != nil { + return x.Changes + } + return nil +} + +func (x *PlanAction) GetResolvedConfigHash() string { + if x != nil { + return x.ResolvedConfigHash + } + return "" +} + +// IaCPlan mirrors interfaces.IaCPlan. +type IaCPlan struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Actions []*PlanAction `protobuf:"bytes,2,rep,name=actions,proto3" json:"actions,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + DesiredHash string `protobuf:"bytes,4,opt,name=desired_hash,json=desiredHash,proto3" json:"desired_hash,omitempty"` + SchemaVersion int32 `protobuf:"varint,5,opt,name=schema_version,json=schemaVersion,proto3" json:"schema_version,omitempty"` + InputSnapshot map[string]string `protobuf:"bytes,6,rep,name=input_snapshot,json=inputSnapshot,proto3" json:"input_snapshot,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IaCPlan) Reset() { + *x = IaCPlan{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IaCPlan) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IaCPlan) ProtoMessage() {} + +func (x *IaCPlan) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IaCPlan.ProtoReflect.Descriptor instead. +func (*IaCPlan) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{16} +} + +func (x *IaCPlan) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *IaCPlan) GetActions() []*PlanAction { + if x != nil { + return x.Actions + } + return nil +} + +func (x *IaCPlan) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *IaCPlan) GetDesiredHash() string { + if x != nil { + return x.DesiredHash + } + return "" +} + +func (x *IaCPlan) GetSchemaVersion() int32 { + if x != nil { + return x.SchemaVersion + } + return 0 +} + +func (x *IaCPlan) GetInputSnapshot() map[string]string { + if x != nil { + return x.InputSnapshot + } + return nil +} + +// ActionError mirrors interfaces.ActionError. +type ActionError struct { + state protoimpl.MessageState `protogen:"open.v1"` + Resource string `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` + Action string `protobuf:"bytes,2,opt,name=action,proto3" json:"action,omitempty"` + Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ActionError) Reset() { + *x = ActionError{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ActionError) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActionError) ProtoMessage() {} + +func (x *ActionError) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActionError.ProtoReflect.Descriptor instead. +func (*ActionError) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{17} +} + +func (x *ActionError) GetResource() string { + if x != nil { + return x.Resource + } + return "" +} + +func (x *ActionError) GetAction() string { + if x != nil { + return x.Action + } + return "" +} + +func (x *ActionError) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +// ApplyResult mirrors interfaces.ApplyResult. +type ApplyResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + PlanId string `protobuf:"bytes,1,opt,name=plan_id,json=planId,proto3" json:"plan_id,omitempty"` + Resources []*ResourceOutput `protobuf:"bytes,2,rep,name=resources,proto3" json:"resources,omitempty"` + Errors []*ActionError `protobuf:"bytes,3,rep,name=errors,proto3" json:"errors,omitempty"` + InitialInputSnapshot map[string]string `protobuf:"bytes,4,rep,name=initial_input_snapshot,json=initialInputSnapshot,proto3" json:"initial_input_snapshot,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + InputDriftReport []*DriftEntry `protobuf:"bytes,5,rep,name=input_drift_report,json=inputDriftReport,proto3" json:"input_drift_report,omitempty"` + ReplaceIdMap map[string]string `protobuf:"bytes,6,rep,name=replace_id_map,json=replaceIdMap,proto3" json:"replace_id_map,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ApplyResult) Reset() { + *x = ApplyResult{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ApplyResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApplyResult) ProtoMessage() {} + +func (x *ApplyResult) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ApplyResult.ProtoReflect.Descriptor instead. +func (*ApplyResult) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{18} +} + +func (x *ApplyResult) GetPlanId() string { + if x != nil { + return x.PlanId + } + return "" +} + +func (x *ApplyResult) GetResources() []*ResourceOutput { + if x != nil { + return x.Resources + } + return nil +} + +func (x *ApplyResult) GetErrors() []*ActionError { + if x != nil { + return x.Errors + } + return nil +} + +func (x *ApplyResult) GetInitialInputSnapshot() map[string]string { + if x != nil { + return x.InitialInputSnapshot + } + return nil +} + +func (x *ApplyResult) GetInputDriftReport() []*DriftEntry { + if x != nil { + return x.InputDriftReport + } + return nil +} + +func (x *ApplyResult) GetReplaceIdMap() map[string]string { + if x != nil { + return x.ReplaceIdMap + } + return nil +} + +// DestroyResult mirrors interfaces.DestroyResult. +type DestroyResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + Destroyed []string `protobuf:"bytes,1,rep,name=destroyed,proto3" json:"destroyed,omitempty"` + Errors []*ActionError `protobuf:"bytes,2,rep,name=errors,proto3" json:"errors,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DestroyResult) Reset() { + *x = DestroyResult{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DestroyResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DestroyResult) ProtoMessage() {} + +func (x *DestroyResult) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DestroyResult.ProtoReflect.Descriptor instead. +func (*DestroyResult) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{19} +} + +func (x *DestroyResult) GetDestroyed() []string { + if x != nil { + return x.Destroyed + } + return nil +} + +func (x *DestroyResult) GetErrors() []*ActionError { + if x != nil { + return x.Errors + } + return nil +} + +// BootstrapResult mirrors interfaces.BootstrapResult. +type BootstrapResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + Region string `protobuf:"bytes,2,opt,name=region,proto3" json:"region,omitempty"` + Endpoint string `protobuf:"bytes,3,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + EnvVars map[string]string `protobuf:"bytes,4,rep,name=env_vars,json=envVars,proto3" json:"env_vars,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BootstrapResult) Reset() { + *x = BootstrapResult{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BootstrapResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BootstrapResult) ProtoMessage() {} + +func (x *BootstrapResult) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BootstrapResult.ProtoReflect.Descriptor instead. +func (*BootstrapResult) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{20} +} + +func (x *BootstrapResult) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *BootstrapResult) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +func (x *BootstrapResult) GetEndpoint() string { + if x != nil { + return x.Endpoint + } + return "" +} + +func (x *BootstrapResult) GetEnvVars() map[string]string { + if x != nil { + return x.EnvVars + } + return nil +} + +// MigrationRepairRequest mirrors interfaces.MigrationRepairRequest. +type MigrationRepairRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + AppResourceName string `protobuf:"bytes,1,opt,name=app_resource_name,json=appResourceName,proto3" json:"app_resource_name,omitempty"` + DatabaseResourceName string `protobuf:"bytes,2,opt,name=database_resource_name,json=databaseResourceName,proto3" json:"database_resource_name,omitempty"` + JobImage string `protobuf:"bytes,3,opt,name=job_image,json=jobImage,proto3" json:"job_image,omitempty"` + SourceDir string `protobuf:"bytes,4,opt,name=source_dir,json=sourceDir,proto3" json:"source_dir,omitempty"` + ExpectedDirtyVersion string `protobuf:"bytes,5,opt,name=expected_dirty_version,json=expectedDirtyVersion,proto3" json:"expected_dirty_version,omitempty"` + ForceVersion string `protobuf:"bytes,6,opt,name=force_version,json=forceVersion,proto3" json:"force_version,omitempty"` + ThenUp bool `protobuf:"varint,7,opt,name=then_up,json=thenUp,proto3" json:"then_up,omitempty"` + UpIfClean bool `protobuf:"varint,8,opt,name=up_if_clean,json=upIfClean,proto3" json:"up_if_clean,omitempty"` + // confirm_force MUST equal interfaces.MigrationRepairConfirmation + // ("FORCE_MIGRATION_METADATA"); the plugin re-validates server-side. + ConfirmForce string `protobuf:"bytes,9,opt,name=confirm_force,json=confirmForce,proto3" json:"confirm_force,omitempty"` + Env map[string]string `protobuf:"bytes,10,rep,name=env,proto3" json:"env,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + TimeoutSeconds int32 `protobuf:"varint,11,opt,name=timeout_seconds,json=timeoutSeconds,proto3" json:"timeout_seconds,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MigrationRepairRequest) Reset() { + *x = MigrationRepairRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MigrationRepairRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MigrationRepairRequest) ProtoMessage() {} + +func (x *MigrationRepairRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MigrationRepairRequest.ProtoReflect.Descriptor instead. +func (*MigrationRepairRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{21} +} + +func (x *MigrationRepairRequest) GetAppResourceName() string { + if x != nil { + return x.AppResourceName + } + return "" +} + +func (x *MigrationRepairRequest) GetDatabaseResourceName() string { + if x != nil { + return x.DatabaseResourceName + } + return "" +} + +func (x *MigrationRepairRequest) GetJobImage() string { + if x != nil { + return x.JobImage + } + return "" +} + +func (x *MigrationRepairRequest) GetSourceDir() string { + if x != nil { + return x.SourceDir + } + return "" +} + +func (x *MigrationRepairRequest) GetExpectedDirtyVersion() string { + if x != nil { + return x.ExpectedDirtyVersion + } + return "" +} + +func (x *MigrationRepairRequest) GetForceVersion() string { + if x != nil { + return x.ForceVersion + } + return "" +} + +func (x *MigrationRepairRequest) GetThenUp() bool { + if x != nil { + return x.ThenUp + } + return false +} + +func (x *MigrationRepairRequest) GetUpIfClean() bool { + if x != nil { + return x.UpIfClean + } + return false +} + +func (x *MigrationRepairRequest) GetConfirmForce() string { + if x != nil { + return x.ConfirmForce + } + return "" +} + +func (x *MigrationRepairRequest) GetEnv() map[string]string { + if x != nil { + return x.Env + } + return nil +} + +func (x *MigrationRepairRequest) GetTimeoutSeconds() int32 { + if x != nil { + return x.TimeoutSeconds + } + return 0 +} + +// MigrationRepairResult mirrors interfaces.MigrationRepairResult. +type MigrationRepairResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProviderJobId string `protobuf:"bytes,1,opt,name=provider_job_id,json=providerJobId,proto3" json:"provider_job_id,omitempty"` + // status is one of MigrationRepairStatusSucceeded / Failed / + // ApprovalRequired / Unsupported (interfaces/migration_repair.go). + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + Applied []string `protobuf:"bytes,3,rep,name=applied,proto3" json:"applied,omitempty"` + Logs string `protobuf:"bytes,4,opt,name=logs,proto3" json:"logs,omitempty"` + Diagnostics []*Diagnostic `protobuf:"bytes,5,rep,name=diagnostics,proto3" json:"diagnostics,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MigrationRepairResult) Reset() { + *x = MigrationRepairResult{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MigrationRepairResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MigrationRepairResult) ProtoMessage() {} + +func (x *MigrationRepairResult) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[22] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MigrationRepairResult.ProtoReflect.Descriptor instead. +func (*MigrationRepairResult) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{22} +} + +func (x *MigrationRepairResult) GetProviderJobId() string { + if x != nil { + return x.ProviderJobId + } + return "" +} + +func (x *MigrationRepairResult) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *MigrationRepairResult) GetApplied() []string { + if x != nil { + return x.Applied + } + return nil +} + +func (x *MigrationRepairResult) GetLogs() string { + if x != nil { + return x.Logs + } + return "" +} + +func (x *MigrationRepairResult) GetDiagnostics() []*Diagnostic { + if x != nil { + return x.Diagnostics + } + return nil +} + +type InitializeRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // config_json is the JSON-encoded provider-config map[string]any. + ConfigJson []byte `protobuf:"bytes,1,opt,name=config_json,json=configJson,proto3" json:"config_json,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *InitializeRequest) Reset() { + *x = InitializeRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *InitializeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InitializeRequest) ProtoMessage() {} + +func (x *InitializeRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[23] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InitializeRequest.ProtoReflect.Descriptor instead. +func (*InitializeRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{23} +} + +func (x *InitializeRequest) GetConfigJson() []byte { + if x != nil { + return x.ConfigJson + } + return nil +} + +type InitializeResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *InitializeResponse) Reset() { + *x = InitializeResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *InitializeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InitializeResponse) ProtoMessage() {} + +func (x *InitializeResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[24] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InitializeResponse.ProtoReflect.Descriptor instead. +func (*InitializeResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{24} +} + +type NameRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *NameRequest) Reset() { + *x = NameRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NameRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NameRequest) ProtoMessage() {} + +func (x *NameRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[25] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NameRequest.ProtoReflect.Descriptor instead. +func (*NameRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{25} +} + +type NameResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *NameResponse) Reset() { + *x = NameResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NameResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NameResponse) ProtoMessage() {} + +func (x *NameResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[26] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NameResponse.ProtoReflect.Descriptor instead. +func (*NameResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{26} +} + +func (x *NameResponse) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type VersionRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VersionRequest) Reset() { + *x = VersionRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VersionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VersionRequest) ProtoMessage() {} + +func (x *VersionRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VersionRequest.ProtoReflect.Descriptor instead. +func (*VersionRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{27} +} + +type VersionResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VersionResponse) Reset() { + *x = VersionResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VersionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VersionResponse) ProtoMessage() {} + +func (x *VersionResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[28] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VersionResponse.ProtoReflect.Descriptor instead. +func (*VersionResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{28} +} + +func (x *VersionResponse) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +type CapabilitiesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CapabilitiesRequest) Reset() { + *x = CapabilitiesRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CapabilitiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CapabilitiesRequest) ProtoMessage() {} + +func (x *CapabilitiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[29] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CapabilitiesRequest.ProtoReflect.Descriptor instead. +func (*CapabilitiesRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{29} +} + +type CapabilitiesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Capabilities []*IaCCapabilityDeclaration `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CapabilitiesResponse) Reset() { + *x = CapabilitiesResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CapabilitiesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CapabilitiesResponse) ProtoMessage() {} + +func (x *CapabilitiesResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[30] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CapabilitiesResponse.ProtoReflect.Descriptor instead. +func (*CapabilitiesResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{30} +} + +func (x *CapabilitiesResponse) GetCapabilities() []*IaCCapabilityDeclaration { + if x != nil { + return x.Capabilities + } + return nil +} + +type PlanRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Desired []*ResourceSpec `protobuf:"bytes,1,rep,name=desired,proto3" json:"desired,omitempty"` + Current []*ResourceState `protobuf:"bytes,2,rep,name=current,proto3" json:"current,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PlanRequest) Reset() { + *x = PlanRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PlanRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlanRequest) ProtoMessage() {} + +func (x *PlanRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[31] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlanRequest.ProtoReflect.Descriptor instead. +func (*PlanRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{31} +} + +func (x *PlanRequest) GetDesired() []*ResourceSpec { + if x != nil { + return x.Desired + } + return nil +} + +func (x *PlanRequest) GetCurrent() []*ResourceState { + if x != nil { + return x.Current + } + return nil +} + +type PlanResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Plan *IaCPlan `protobuf:"bytes,1,opt,name=plan,proto3" json:"plan,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PlanResponse) Reset() { + *x = PlanResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PlanResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlanResponse) ProtoMessage() {} + +func (x *PlanResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[32] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlanResponse.ProtoReflect.Descriptor instead. +func (*PlanResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{32} +} + +func (x *PlanResponse) GetPlan() *IaCPlan { + if x != nil { + return x.Plan + } + return nil +} + +type ApplyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Plan *IaCPlan `protobuf:"bytes,1,opt,name=plan,proto3" json:"plan,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ApplyRequest) Reset() { + *x = ApplyRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ApplyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApplyRequest) ProtoMessage() {} + +func (x *ApplyRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[33] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ApplyRequest.ProtoReflect.Descriptor instead. +func (*ApplyRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{33} +} + +func (x *ApplyRequest) GetPlan() *IaCPlan { + if x != nil { + return x.Plan + } + return nil +} + +type ApplyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Result *ApplyResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ApplyResponse) Reset() { + *x = ApplyResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ApplyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApplyResponse) ProtoMessage() {} + +func (x *ApplyResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[34] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ApplyResponse.ProtoReflect.Descriptor instead. +func (*ApplyResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{34} +} + +func (x *ApplyResponse) GetResult() *ApplyResult { + if x != nil { + return x.Result + } + return nil +} + +type DestroyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Refs []*ResourceRef `protobuf:"bytes,1,rep,name=refs,proto3" json:"refs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DestroyRequest) Reset() { + *x = DestroyRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DestroyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DestroyRequest) ProtoMessage() {} + +func (x *DestroyRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[35] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DestroyRequest.ProtoReflect.Descriptor instead. +func (*DestroyRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{35} +} + +func (x *DestroyRequest) GetRefs() []*ResourceRef { + if x != nil { + return x.Refs + } + return nil +} + +type DestroyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Result *DestroyResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DestroyResponse) Reset() { + *x = DestroyResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DestroyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DestroyResponse) ProtoMessage() {} + +func (x *DestroyResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[36] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DestroyResponse.ProtoReflect.Descriptor instead. +func (*DestroyResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{36} +} + +func (x *DestroyResponse) GetResult() *DestroyResult { + if x != nil { + return x.Result + } + return nil +} + +type StatusRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Refs []*ResourceRef `protobuf:"bytes,1,rep,name=refs,proto3" json:"refs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StatusRequest) Reset() { + *x = StatusRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatusRequest) ProtoMessage() {} + +func (x *StatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[37] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. +func (*StatusRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{37} +} + +func (x *StatusRequest) GetRefs() []*ResourceRef { + if x != nil { + return x.Refs + } + return nil +} + +type StatusResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Statuses []*ResourceStatus `protobuf:"bytes,1,rep,name=statuses,proto3" json:"statuses,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StatusResponse) Reset() { + *x = StatusResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatusResponse) ProtoMessage() {} + +func (x *StatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[38] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. +func (*StatusResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{38} +} + +func (x *StatusResponse) GetStatuses() []*ResourceStatus { + if x != nil { + return x.Statuses + } + return nil +} + +type ImportRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProviderId string `protobuf:"bytes,1,opt,name=provider_id,json=providerId,proto3" json:"provider_id,omitempty"` + ResourceType string `protobuf:"bytes,2,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ImportRequest) Reset() { + *x = ImportRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ImportRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImportRequest) ProtoMessage() {} + +func (x *ImportRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[39] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImportRequest.ProtoReflect.Descriptor instead. +func (*ImportRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{39} +} + +func (x *ImportRequest) GetProviderId() string { + if x != nil { + return x.ProviderId + } + return "" +} + +func (x *ImportRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +type ImportResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + State *ResourceState `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ImportResponse) Reset() { + *x = ImportResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ImportResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImportResponse) ProtoMessage() {} + +func (x *ImportResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[40] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImportResponse.ProtoReflect.Descriptor instead. +func (*ImportResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{40} +} + +func (x *ImportResponse) GetState() *ResourceState { + if x != nil { + return x.State + } + return nil +} + +type ResolveSizingRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Size string `protobuf:"bytes,2,opt,name=size,proto3" json:"size,omitempty"` // interfaces.Size string + Hints *ResourceHints `protobuf:"bytes,3,opt,name=hints,proto3" json:"hints,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResolveSizingRequest) Reset() { + *x = ResolveSizingRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResolveSizingRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResolveSizingRequest) ProtoMessage() {} + +func (x *ResolveSizingRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[41] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResolveSizingRequest.ProtoReflect.Descriptor instead. +func (*ResolveSizingRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{41} +} + +func (x *ResolveSizingRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *ResolveSizingRequest) GetSize() string { + if x != nil { + return x.Size + } + return "" +} + +func (x *ResolveSizingRequest) GetHints() *ResourceHints { + if x != nil { + return x.Hints + } + return nil +} + +type ResolveSizingResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Sizing *ProviderSizing `protobuf:"bytes,1,opt,name=sizing,proto3" json:"sizing,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResolveSizingResponse) Reset() { + *x = ResolveSizingResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResolveSizingResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResolveSizingResponse) ProtoMessage() {} + +func (x *ResolveSizingResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[42] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResolveSizingResponse.ProtoReflect.Descriptor instead. +func (*ResolveSizingResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{42} +} + +func (x *ResolveSizingResponse) GetSizing() *ProviderSizing { + if x != nil { + return x.Sizing + } + return nil +} + +type BootstrapStateBackendRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // config_json is the JSON-encoded iac.state module config map[string]any. + ConfigJson []byte `protobuf:"bytes,1,opt,name=config_json,json=configJson,proto3" json:"config_json,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BootstrapStateBackendRequest) Reset() { + *x = BootstrapStateBackendRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BootstrapStateBackendRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BootstrapStateBackendRequest) ProtoMessage() {} + +func (x *BootstrapStateBackendRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[43] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BootstrapStateBackendRequest.ProtoReflect.Descriptor instead. +func (*BootstrapStateBackendRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{43} +} + +func (x *BootstrapStateBackendRequest) GetConfigJson() []byte { + if x != nil { + return x.ConfigJson + } + return nil +} + +type BootstrapStateBackendResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Result *BootstrapResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BootstrapStateBackendResponse) Reset() { + *x = BootstrapStateBackendResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BootstrapStateBackendResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BootstrapStateBackendResponse) ProtoMessage() {} + +func (x *BootstrapStateBackendResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[44] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BootstrapStateBackendResponse.ProtoReflect.Descriptor instead. +func (*BootstrapStateBackendResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{44} +} + +func (x *BootstrapStateBackendResponse) GetResult() *BootstrapResult { + if x != nil { + return x.Result + } + return nil +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderEnumerator messages. +// ───────────────────────────────────────────────────────────────────────────── +type EnumerateAllRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnumerateAllRequest) Reset() { + *x = EnumerateAllRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnumerateAllRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnumerateAllRequest) ProtoMessage() {} + +func (x *EnumerateAllRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[45] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnumerateAllRequest.ProtoReflect.Descriptor instead. +func (*EnumerateAllRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{45} +} + +func (x *EnumerateAllRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +type EnumerateAllResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Outputs []*ResourceOutput `protobuf:"bytes,1,rep,name=outputs,proto3" json:"outputs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnumerateAllResponse) Reset() { + *x = EnumerateAllResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnumerateAllResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnumerateAllResponse) ProtoMessage() {} + +func (x *EnumerateAllResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[46] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnumerateAllResponse.ProtoReflect.Descriptor instead. +func (*EnumerateAllResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{46} +} + +func (x *EnumerateAllResponse) GetOutputs() []*ResourceOutput { + if x != nil { + return x.Outputs + } + return nil +} + +type EnumerateByTagRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnumerateByTagRequest) Reset() { + *x = EnumerateByTagRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnumerateByTagRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnumerateByTagRequest) ProtoMessage() {} + +func (x *EnumerateByTagRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[47] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnumerateByTagRequest.ProtoReflect.Descriptor instead. +func (*EnumerateByTagRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{47} +} + +func (x *EnumerateByTagRequest) GetTag() string { + if x != nil { + return x.Tag + } + return "" +} + +type EnumerateByTagResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Refs []*ResourceRef `protobuf:"bytes,1,rep,name=refs,proto3" json:"refs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnumerateByTagResponse) Reset() { + *x = EnumerateByTagResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnumerateByTagResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnumerateByTagResponse) ProtoMessage() {} + +func (x *EnumerateByTagResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[48] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnumerateByTagResponse.ProtoReflect.Descriptor instead. +func (*EnumerateByTagResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{48} +} + +func (x *EnumerateByTagResponse) GetRefs() []*ResourceRef { + if x != nil { + return x.Refs + } + return nil +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderDriftDetector messages. +// ───────────────────────────────────────────────────────────────────────────── +type DetectDriftRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Refs []*ResourceRef `protobuf:"bytes,1,rep,name=refs,proto3" json:"refs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DetectDriftRequest) Reset() { + *x = DetectDriftRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DetectDriftRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectDriftRequest) ProtoMessage() {} + +func (x *DetectDriftRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[49] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectDriftRequest.ProtoReflect.Descriptor instead. +func (*DetectDriftRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{49} +} + +func (x *DetectDriftRequest) GetRefs() []*ResourceRef { + if x != nil { + return x.Refs + } + return nil +} + +type DetectDriftResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Drifts []*DriftResult `protobuf:"bytes,1,rep,name=drifts,proto3" json:"drifts,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DetectDriftResponse) Reset() { + *x = DetectDriftResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DetectDriftResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectDriftResponse) ProtoMessage() {} + +func (x *DetectDriftResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[50] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectDriftResponse.ProtoReflect.Descriptor instead. +func (*DetectDriftResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{50} +} + +func (x *DetectDriftResponse) GetDrifts() []*DriftResult { + if x != nil { + return x.Drifts + } + return nil +} + +type DetectDriftWithSpecsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Refs []*ResourceRef `protobuf:"bytes,1,rep,name=refs,proto3" json:"refs,omitempty"` + // specs is keyed by ResourceRef.Name (matches ResourceState.Name) per the + // Go DriftConfigDetector.DetectDriftWithSpecs contract. + Specs map[string]*ResourceSpec `protobuf:"bytes,2,rep,name=specs,proto3" json:"specs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DetectDriftWithSpecsRequest) Reset() { + *x = DetectDriftWithSpecsRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DetectDriftWithSpecsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectDriftWithSpecsRequest) ProtoMessage() {} + +func (x *DetectDriftWithSpecsRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[51] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectDriftWithSpecsRequest.ProtoReflect.Descriptor instead. +func (*DetectDriftWithSpecsRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{51} +} + +func (x *DetectDriftWithSpecsRequest) GetRefs() []*ResourceRef { + if x != nil { + return x.Refs + } + return nil +} + +func (x *DetectDriftWithSpecsRequest) GetSpecs() map[string]*ResourceSpec { + if x != nil { + return x.Specs + } + return nil +} + +type DetectDriftWithSpecsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Drifts []*DriftResult `protobuf:"bytes,1,rep,name=drifts,proto3" json:"drifts,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DetectDriftWithSpecsResponse) Reset() { + *x = DetectDriftWithSpecsResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DetectDriftWithSpecsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectDriftWithSpecsResponse) ProtoMessage() {} + +func (x *DetectDriftWithSpecsResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[52] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectDriftWithSpecsResponse.ProtoReflect.Descriptor instead. +func (*DetectDriftWithSpecsResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{52} +} + +func (x *DetectDriftWithSpecsResponse) GetDrifts() []*DriftResult { + if x != nil { + return x.Drifts + } + return nil +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderCredentialRevoker messages. +// ───────────────────────────────────────────────────────────────────────────── +type RevokeProviderCredentialRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // source is the provider_credential source string (e.g. "digitalocean.spaces"). + Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` + // credential_id is the provider-specific identifier of the OLD credential. + CredentialId string `protobuf:"bytes,2,opt,name=credential_id,json=credentialId,proto3" json:"credential_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RevokeProviderCredentialRequest) Reset() { + *x = RevokeProviderCredentialRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RevokeProviderCredentialRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevokeProviderCredentialRequest) ProtoMessage() {} + +func (x *RevokeProviderCredentialRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[53] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RevokeProviderCredentialRequest.ProtoReflect.Descriptor instead. +func (*RevokeProviderCredentialRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{53} +} + +func (x *RevokeProviderCredentialRequest) GetSource() string { + if x != nil { + return x.Source + } + return "" +} + +func (x *RevokeProviderCredentialRequest) GetCredentialId() string { + if x != nil { + return x.CredentialId + } + return "" +} + +type RevokeProviderCredentialResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RevokeProviderCredentialResponse) Reset() { + *x = RevokeProviderCredentialResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RevokeProviderCredentialResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevokeProviderCredentialResponse) ProtoMessage() {} + +func (x *RevokeProviderCredentialResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[54] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RevokeProviderCredentialResponse.ProtoReflect.Descriptor instead. +func (*RevokeProviderCredentialResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{54} +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderMigrationRepairer messages. +// ───────────────────────────────────────────────────────────────────────────── +type RepairDirtyMigrationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Request *MigrationRepairRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RepairDirtyMigrationRequest) Reset() { + *x = RepairDirtyMigrationRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RepairDirtyMigrationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RepairDirtyMigrationRequest) ProtoMessage() {} + +func (x *RepairDirtyMigrationRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[55] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RepairDirtyMigrationRequest.ProtoReflect.Descriptor instead. +func (*RepairDirtyMigrationRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{55} +} + +func (x *RepairDirtyMigrationRequest) GetRequest() *MigrationRepairRequest { + if x != nil { + return x.Request + } + return nil +} + +type RepairDirtyMigrationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Result *MigrationRepairResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RepairDirtyMigrationResponse) Reset() { + *x = RepairDirtyMigrationResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RepairDirtyMigrationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RepairDirtyMigrationResponse) ProtoMessage() {} + +func (x *RepairDirtyMigrationResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[56] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RepairDirtyMigrationResponse.ProtoReflect.Descriptor instead. +func (*RepairDirtyMigrationResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{56} +} + +func (x *RepairDirtyMigrationResponse) GetResult() *MigrationRepairResult { + if x != nil { + return x.Result + } + return nil +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderValidator messages. +// ───────────────────────────────────────────────────────────────────────────── +type ValidatePlanRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Plan *IaCPlan `protobuf:"bytes,1,opt,name=plan,proto3" json:"plan,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePlanRequest) Reset() { + *x = ValidatePlanRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePlanRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePlanRequest) ProtoMessage() {} + +func (x *ValidatePlanRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[57] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePlanRequest.ProtoReflect.Descriptor instead. +func (*ValidatePlanRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{57} +} + +func (x *ValidatePlanRequest) GetPlan() *IaCPlan { + if x != nil { + return x.Plan + } + return nil +} + +type ValidatePlanResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Diagnostics []*PlanDiagnostic `protobuf:"bytes,1,rep,name=diagnostics,proto3" json:"diagnostics,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ValidatePlanResponse) Reset() { + *x = ValidatePlanResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidatePlanResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePlanResponse) ProtoMessage() {} + +func (x *ValidatePlanResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[58] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePlanResponse.ProtoReflect.Descriptor instead. +func (*ValidatePlanResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{58} +} + +func (x *ValidatePlanResponse) GetDiagnostics() []*PlanDiagnostic { + if x != nil { + return x.Diagnostics + } + return nil +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderDriftConfigDetector messages. +// Mirrors the existing interfaces.DriftConfigDetector.DetectDriftWithSpecs +// contract: refs + per-ref applied-config specs → drift classifications. +// Carried as a separate optional service per design §Optional services. +// ───────────────────────────────────────────────────────────────────────────── +type DetectDriftConfigRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Refs []*ResourceRef `protobuf:"bytes,1,rep,name=refs,proto3" json:"refs,omitempty"` + Specs map[string]*ResourceSpec `protobuf:"bytes,2,rep,name=specs,proto3" json:"specs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DetectDriftConfigRequest) Reset() { + *x = DetectDriftConfigRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DetectDriftConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectDriftConfigRequest) ProtoMessage() {} + +func (x *DetectDriftConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[59] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectDriftConfigRequest.ProtoReflect.Descriptor instead. +func (*DetectDriftConfigRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{59} +} + +func (x *DetectDriftConfigRequest) GetRefs() []*ResourceRef { + if x != nil { + return x.Refs + } + return nil +} + +func (x *DetectDriftConfigRequest) GetSpecs() map[string]*ResourceSpec { + if x != nil { + return x.Specs + } + return nil +} + +type DetectDriftConfigResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Drifts []*DriftResult `protobuf:"bytes,1,rep,name=drifts,proto3" json:"drifts,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DetectDriftConfigResponse) Reset() { + *x = DetectDriftConfigResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DetectDriftConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectDriftConfigResponse) ProtoMessage() {} + +func (x *DetectDriftConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[60] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectDriftConfigResponse.ProtoReflect.Descriptor instead. +func (*DetectDriftConfigResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{60} +} + +func (x *DetectDriftConfigResponse) GetDrifts() []*DriftResult { + if x != nil { + return x.Drifts + } + return nil +} + +// ───────────────────────────────────────────────────────────────────────────── +// ResourceDriver request/response messages. +// Each request carries resource_type so a single ResourceDriver server can +// dispatch to the per-type driver implementation (matches DO plugin's +// 14-driver type-routing pattern in Task 11). +// ───────────────────────────────────────────────────────────────────────────── +type ResourceCreateRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Spec *ResourceSpec `protobuf:"bytes,2,opt,name=spec,proto3" json:"spec,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceCreateRequest) Reset() { + *x = ResourceCreateRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceCreateRequest) ProtoMessage() {} + +func (x *ResourceCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[61] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceCreateRequest.ProtoReflect.Descriptor instead. +func (*ResourceCreateRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{61} +} + +func (x *ResourceCreateRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *ResourceCreateRequest) GetSpec() *ResourceSpec { + if x != nil { + return x.Spec + } + return nil +} + +type ResourceCreateResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Output *ResourceOutput `protobuf:"bytes,1,opt,name=output,proto3" json:"output,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceCreateResponse) Reset() { + *x = ResourceCreateResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceCreateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceCreateResponse) ProtoMessage() {} + +func (x *ResourceCreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[62] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceCreateResponse.ProtoReflect.Descriptor instead. +func (*ResourceCreateResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{62} +} + +func (x *ResourceCreateResponse) GetOutput() *ResourceOutput { + if x != nil { + return x.Output + } + return nil +} + +type ResourceReadRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Ref *ResourceRef `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceReadRequest) Reset() { + *x = ResourceReadRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceReadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceReadRequest) ProtoMessage() {} + +func (x *ResourceReadRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[63] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceReadRequest.ProtoReflect.Descriptor instead. +func (*ResourceReadRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{63} +} + +func (x *ResourceReadRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *ResourceReadRequest) GetRef() *ResourceRef { + if x != nil { + return x.Ref + } + return nil +} + +type ResourceReadResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Output *ResourceOutput `protobuf:"bytes,1,opt,name=output,proto3" json:"output,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceReadResponse) Reset() { + *x = ResourceReadResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceReadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceReadResponse) ProtoMessage() {} + +func (x *ResourceReadResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[64] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceReadResponse.ProtoReflect.Descriptor instead. +func (*ResourceReadResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{64} +} + +func (x *ResourceReadResponse) GetOutput() *ResourceOutput { + if x != nil { + return x.Output + } + return nil +} + +type ResourceUpdateRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Ref *ResourceRef `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"` + Spec *ResourceSpec `protobuf:"bytes,3,opt,name=spec,proto3" json:"spec,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceUpdateRequest) Reset() { + *x = ResourceUpdateRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceUpdateRequest) ProtoMessage() {} + +func (x *ResourceUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[65] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceUpdateRequest.ProtoReflect.Descriptor instead. +func (*ResourceUpdateRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{65} +} + +func (x *ResourceUpdateRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *ResourceUpdateRequest) GetRef() *ResourceRef { + if x != nil { + return x.Ref + } + return nil +} + +func (x *ResourceUpdateRequest) GetSpec() *ResourceSpec { + if x != nil { + return x.Spec + } + return nil +} + +type ResourceUpdateResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Output *ResourceOutput `protobuf:"bytes,1,opt,name=output,proto3" json:"output,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceUpdateResponse) Reset() { + *x = ResourceUpdateResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceUpdateResponse) ProtoMessage() {} + +func (x *ResourceUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[66] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceUpdateResponse.ProtoReflect.Descriptor instead. +func (*ResourceUpdateResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{66} +} + +func (x *ResourceUpdateResponse) GetOutput() *ResourceOutput { + if x != nil { + return x.Output + } + return nil +} + +type ResourceDeleteRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Ref *ResourceRef `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceDeleteRequest) Reset() { + *x = ResourceDeleteRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceDeleteRequest) ProtoMessage() {} + +func (x *ResourceDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[67] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceDeleteRequest.ProtoReflect.Descriptor instead. +func (*ResourceDeleteRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{67} +} + +func (x *ResourceDeleteRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *ResourceDeleteRequest) GetRef() *ResourceRef { + if x != nil { + return x.Ref + } + return nil +} + +type ResourceDeleteResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceDeleteResponse) Reset() { + *x = ResourceDeleteResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceDeleteResponse) ProtoMessage() {} + +func (x *ResourceDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[68] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceDeleteResponse.ProtoReflect.Descriptor instead. +func (*ResourceDeleteResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{68} +} + +type ResourceDiffRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Desired *ResourceSpec `protobuf:"bytes,2,opt,name=desired,proto3" json:"desired,omitempty"` + Current *ResourceOutput `protobuf:"bytes,3,opt,name=current,proto3" json:"current,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceDiffRequest) Reset() { + *x = ResourceDiffRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceDiffRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceDiffRequest) ProtoMessage() {} + +func (x *ResourceDiffRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[69] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceDiffRequest.ProtoReflect.Descriptor instead. +func (*ResourceDiffRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{69} +} + +func (x *ResourceDiffRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *ResourceDiffRequest) GetDesired() *ResourceSpec { + if x != nil { + return x.Desired + } + return nil +} + +func (x *ResourceDiffRequest) GetCurrent() *ResourceOutput { + if x != nil { + return x.Current + } + return nil +} + +type ResourceDiffResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Result *DiffResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceDiffResponse) Reset() { + *x = ResourceDiffResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceDiffResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceDiffResponse) ProtoMessage() {} + +func (x *ResourceDiffResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[70] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceDiffResponse.ProtoReflect.Descriptor instead. +func (*ResourceDiffResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{70} +} + +func (x *ResourceDiffResponse) GetResult() *DiffResult { + if x != nil { + return x.Result + } + return nil +} + +type ResourceScaleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Ref *ResourceRef `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"` + Replicas int32 `protobuf:"varint,3,opt,name=replicas,proto3" json:"replicas,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceScaleRequest) Reset() { + *x = ResourceScaleRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceScaleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceScaleRequest) ProtoMessage() {} + +func (x *ResourceScaleRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[71] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceScaleRequest.ProtoReflect.Descriptor instead. +func (*ResourceScaleRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{71} +} + +func (x *ResourceScaleRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *ResourceScaleRequest) GetRef() *ResourceRef { + if x != nil { + return x.Ref + } + return nil +} + +func (x *ResourceScaleRequest) GetReplicas() int32 { + if x != nil { + return x.Replicas + } + return 0 +} + +type ResourceScaleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Output *ResourceOutput `protobuf:"bytes,1,opt,name=output,proto3" json:"output,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceScaleResponse) Reset() { + *x = ResourceScaleResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceScaleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceScaleResponse) ProtoMessage() {} + +func (x *ResourceScaleResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[72] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceScaleResponse.ProtoReflect.Descriptor instead. +func (*ResourceScaleResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{72} +} + +func (x *ResourceScaleResponse) GetOutput() *ResourceOutput { + if x != nil { + return x.Output + } + return nil +} + +type ResourceHealthCheckRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Ref *ResourceRef `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceHealthCheckRequest) Reset() { + *x = ResourceHealthCheckRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceHealthCheckRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceHealthCheckRequest) ProtoMessage() {} + +func (x *ResourceHealthCheckRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[73] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceHealthCheckRequest.ProtoReflect.Descriptor instead. +func (*ResourceHealthCheckRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{73} +} + +func (x *ResourceHealthCheckRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *ResourceHealthCheckRequest) GetRef() *ResourceRef { + if x != nil { + return x.Ref + } + return nil +} + +type ResourceHealthCheckResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Result *HealthResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResourceHealthCheckResponse) Reset() { + *x = ResourceHealthCheckResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResourceHealthCheckResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceHealthCheckResponse) ProtoMessage() {} + +func (x *ResourceHealthCheckResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[74] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceHealthCheckResponse.ProtoReflect.Descriptor instead. +func (*ResourceHealthCheckResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{74} +} + +func (x *ResourceHealthCheckResponse) GetResult() *HealthResult { + if x != nil { + return x.Result + } + return nil +} + +type SensitiveKeysRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SensitiveKeysRequest) Reset() { + *x = SensitiveKeysRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SensitiveKeysRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SensitiveKeysRequest) ProtoMessage() {} + +func (x *SensitiveKeysRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[75] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SensitiveKeysRequest.ProtoReflect.Descriptor instead. +func (*SensitiveKeysRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{75} +} + +func (x *SensitiveKeysRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +type SensitiveKeysResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Keys []string `protobuf:"bytes,1,rep,name=keys,proto3" json:"keys,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SensitiveKeysResponse) Reset() { + *x = SensitiveKeysResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SensitiveKeysResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SensitiveKeysResponse) ProtoMessage() {} + +func (x *SensitiveKeysResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[76] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SensitiveKeysResponse.ProtoReflect.Descriptor instead. +func (*SensitiveKeysResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{76} +} + +func (x *SensitiveKeysResponse) GetKeys() []string { + if x != nil { + return x.Keys + } + return nil +} + +type TroubleshootRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Ref *ResourceRef `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"` + FailureMsg string `protobuf:"bytes,3,opt,name=failure_msg,json=failureMsg,proto3" json:"failure_msg,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TroubleshootRequest) Reset() { + *x = TroubleshootRequest{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TroubleshootRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TroubleshootRequest) ProtoMessage() {} + +func (x *TroubleshootRequest) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[77] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TroubleshootRequest.ProtoReflect.Descriptor instead. +func (*TroubleshootRequest) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{77} +} + +func (x *TroubleshootRequest) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *TroubleshootRequest) GetRef() *ResourceRef { + if x != nil { + return x.Ref + } + return nil +} + +func (x *TroubleshootRequest) GetFailureMsg() string { + if x != nil { + return x.FailureMsg + } + return "" +} + +type TroubleshootResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Diagnostics []*Diagnostic `protobuf:"bytes,1,rep,name=diagnostics,proto3" json:"diagnostics,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TroubleshootResponse) Reset() { + *x = TroubleshootResponse{} + mi := &file_plugin_external_proto_iac_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TroubleshootResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TroubleshootResponse) ProtoMessage() {} + +func (x *TroubleshootResponse) ProtoReflect() protoreflect.Message { + mi := &file_plugin_external_proto_iac_proto_msgTypes[78] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TroubleshootResponse.ProtoReflect.Descriptor instead. +func (*TroubleshootResponse) Descriptor() ([]byte, []int) { + return file_plugin_external_proto_iac_proto_rawDescGZIP(), []int{78} +} + +func (x *TroubleshootResponse) GetDiagnostics() []*Diagnostic { + if x != nil { + return x.Diagnostics + } + return nil +} + +var File_plugin_external_proto_iac_proto protoreflect.FileDescriptor + +const file_plugin_external_proto_iac_proto_rawDesc = "" + + "\n" + + "\x1fplugin/external/proto/iac.proto\x12\x1cworkflow.plugin.external.iac\x1a\x1fgoogle/protobuf/timestamp.proto\"\xcd\x01\n" + + "\fResourceSpec\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + + "\x04type\x18\x02 \x01(\tR\x04type\x12\x1f\n" + + "\vconfig_json\x18\x03 \x01(\fR\n" + + "configJson\x12\x12\n" + + "\x04size\x18\x04 \x01(\tR\x04size\x12A\n" + + "\x05hints\x18\x05 \x01(\v2+.workflow.plugin.external.iac.ResourceHintsR\x05hints\x12\x1d\n" + + "\n" + + "depends_on\x18\x06 \x03(\tR\tdependsOn\"V\n" + + "\vResourceRef\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + + "\x04type\x18\x02 \x01(\tR\x04type\x12\x1f\n" + + "\vprovider_id\x18\x03 \x01(\tR\n" + + "providerId\"S\n" + + "\rResourceHints\x12\x10\n" + + "\x03cpu\x18\x01 \x01(\tR\x03cpu\x12\x16\n" + + "\x06memory\x18\x02 \x01(\tR\x06memory\x12\x18\n" + + "\astorage\x18\x03 \x01(\tR\astorage\"T\n" + + "\x0eProviderSizing\x12#\n" + + "\rinstance_type\x18\x01 \x01(\tR\finstanceType\x12\x1d\n" + + "\n" + + "specs_json\x18\x02 \x01(\fR\tspecsJson\"s\n" + + "\x18IaCCapabilityDeclaration\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\x12\x12\n" + + "\x04tier\x18\x02 \x01(\x05R\x04tier\x12\x1e\n" + + "\n" + + "operations\x18\x03 \x03(\tR\n" + + "operations\"\xaf\x04\n" + + "\rResourceState\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x12\n" + + "\x04type\x18\x03 \x01(\tR\x04type\x12\x1a\n" + + "\bprovider\x18\x04 \x01(\tR\bprovider\x12!\n" + + "\fprovider_ref\x18\x05 \x01(\tR\vproviderRef\x12\x1f\n" + + "\vprovider_id\x18\x06 \x01(\tR\n" + + "providerId\x12\x1f\n" + + "\vconfig_hash\x18\a \x01(\tR\n" + + "configHash\x12.\n" + + "\x13applied_config_json\x18\b \x01(\fR\x11appliedConfigJson\x122\n" + + "\x15applied_config_source\x18\t \x01(\tR\x13appliedConfigSource\x12!\n" + + "\foutputs_json\x18\n" + + " \x01(\fR\voutputsJson\x12\"\n" + + "\fdependencies\x18\v \x03(\tR\fdependencies\x129\n" + + "\n" + + "created_at\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" + + "\n" + + "updated_at\x18\r \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\x12D\n" + + "\x10last_drift_check\x18\x0e \x01(\v2\x1a.google.protobuf.TimestampR\x0elastDriftCheck\"\xad\x02\n" + + "\x0eResourceOutput\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + + "\x04type\x18\x02 \x01(\tR\x04type\x12\x1f\n" + + "\vprovider_id\x18\x03 \x01(\tR\n" + + "providerId\x12!\n" + + "\foutputs_json\x18\x04 \x01(\fR\voutputsJson\x12Y\n" + + "\tsensitive\x18\x05 \x03(\v2;.workflow.plugin.external.iac.ResourceOutput.SensitiveEntryR\tsensitive\x12\x16\n" + + "\x06status\x18\x06 \x01(\tR\x06status\x1a<\n" + + "\x0eSensitiveEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\bR\x05value:\x028\x01\"\x94\x01\n" + + "\x0eResourceStatus\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + + "\x04type\x18\x02 \x01(\tR\x04type\x12\x1f\n" + + "\vprovider_id\x18\x03 \x01(\tR\n" + + "providerId\x12\x16\n" + + "\x06status\x18\x04 \x01(\tR\x06status\x12!\n" + + "\foutputs_json\x18\x05 \x01(\fR\voutputsJson\"t\n" + + "\vFieldChange\x12\x12\n" + + "\x04path\x18\x01 \x01(\tR\x04path\x12\x19\n" + + "\bold_json\x18\x02 \x01(\fR\aoldJson\x12\x19\n" + + "\bnew_json\x18\x03 \x01(\fR\anewJson\x12\x1b\n" + + "\tforce_new\x18\x04 \x01(\bR\bforceNew\"\x99\x01\n" + + "\n" + + "DiffResult\x12!\n" + + "\fneeds_update\x18\x01 \x01(\bR\vneedsUpdate\x12#\n" + + "\rneeds_replace\x18\x02 \x01(\bR\fneedsReplace\x12C\n" + + "\achanges\x18\x03 \x03(\v2).workflow.plugin.external.iac.FieldChangeR\achanges\"\xed\x01\n" + + "\vDriftResult\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + + "\x04type\x18\x02 \x01(\tR\x04type\x12\x18\n" + + "\adrifted\x18\x03 \x01(\bR\adrifted\x12>\n" + + "\x05class\x18\x04 \x01(\x0e2(.workflow.plugin.external.iac.DriftClassR\x05class\x12#\n" + + "\rexpected_json\x18\x05 \x01(\fR\fexpectedJson\x12\x1f\n" + + "\vactual_json\x18\x06 \x01(\fR\n" + + "actualJson\x12\x16\n" + + "\x06fields\x18\a \x03(\tR\x06fields\"x\n" + + "\n" + + "DriftEntry\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12)\n" + + "\x10plan_fingerprint\x18\x02 \x01(\tR\x0fplanFingerprint\x12+\n" + + "\x11apply_fingerprint\x18\x03 \x01(\tR\x10applyFingerprint\"B\n" + + "\fHealthResult\x12\x18\n" + + "\ahealthy\x18\x01 \x01(\bR\ahealthy\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\"\x8c\x01\n" + + "\n" + + "Diagnostic\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" + + "\x05phase\x18\x02 \x01(\tR\x05phase\x12\x14\n" + + "\x05cause\x18\x03 \x01(\tR\x05cause\x12*\n" + + "\x02at\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\x02at\x12\x16\n" + + "\x06detail\x18\x05 \x01(\tR\x06detail\"\xae\x01\n" + + "\x0ePlanDiagnostic\x12P\n" + + "\bseverity\x18\x01 \x01(\x0e24.workflow.plugin.external.iac.PlanDiagnosticSeverityR\bseverity\x12\x1a\n" + + "\bresource\x18\x02 \x01(\tR\bresource\x12\x14\n" + + "\x05field\x18\x03 \x01(\tR\x05field\x12\x18\n" + + "\amessage\x18\x04 \x01(\tR\amessage\"\xaa\x02\n" + + "\n" + + "PlanAction\x12\x16\n" + + "\x06action\x18\x01 \x01(\tR\x06action\x12F\n" + + "\bresource\x18\x02 \x01(\v2*.workflow.plugin.external.iac.ResourceSpecR\bresource\x12E\n" + + "\acurrent\x18\x03 \x01(\v2+.workflow.plugin.external.iac.ResourceStateR\acurrent\x12C\n" + + "\achanges\x18\x04 \x03(\v2).workflow.plugin.external.iac.FieldChangeR\achanges\x120\n" + + "\x14resolved_config_hash\x18\x05 \x01(\tR\x12resolvedConfigHash\"\x85\x03\n" + + "\aIaCPlan\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12B\n" + + "\aactions\x18\x02 \x03(\v2(.workflow.plugin.external.iac.PlanActionR\aactions\x129\n" + + "\n" + + "created_at\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12!\n" + + "\fdesired_hash\x18\x04 \x01(\tR\vdesiredHash\x12%\n" + + "\x0eschema_version\x18\x05 \x01(\x05R\rschemaVersion\x12_\n" + + "\x0einput_snapshot\x18\x06 \x03(\v28.workflow.plugin.external.iac.IaCPlan.InputSnapshotEntryR\rinputSnapshot\x1a@\n" + + "\x12InputSnapshotEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"W\n" + + "\vActionError\x12\x1a\n" + + "\bresource\x18\x01 \x01(\tR\bresource\x12\x16\n" + + "\x06action\x18\x02 \x01(\tR\x06action\x12\x14\n" + + "\x05error\x18\x03 \x01(\tR\x05error\"\xf5\x04\n" + + "\vApplyResult\x12\x17\n" + + "\aplan_id\x18\x01 \x01(\tR\x06planId\x12J\n" + + "\tresources\x18\x02 \x03(\v2,.workflow.plugin.external.iac.ResourceOutputR\tresources\x12A\n" + + "\x06errors\x18\x03 \x03(\v2).workflow.plugin.external.iac.ActionErrorR\x06errors\x12y\n" + + "\x16initial_input_snapshot\x18\x04 \x03(\v2C.workflow.plugin.external.iac.ApplyResult.InitialInputSnapshotEntryR\x14initialInputSnapshot\x12V\n" + + "\x12input_drift_report\x18\x05 \x03(\v2(.workflow.plugin.external.iac.DriftEntryR\x10inputDriftReport\x12a\n" + + "\x0ereplace_id_map\x18\x06 \x03(\v2;.workflow.plugin.external.iac.ApplyResult.ReplaceIdMapEntryR\freplaceIdMap\x1aG\n" + + "\x19InitialInputSnapshotEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1a?\n" + + "\x11ReplaceIdMapEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"p\n" + + "\rDestroyResult\x12\x1c\n" + + "\tdestroyed\x18\x01 \x03(\tR\tdestroyed\x12A\n" + + "\x06errors\x18\x02 \x03(\v2).workflow.plugin.external.iac.ActionErrorR\x06errors\"\xf0\x01\n" + + "\x0fBootstrapResult\x12\x16\n" + + "\x06bucket\x18\x01 \x01(\tR\x06bucket\x12\x16\n" + + "\x06region\x18\x02 \x01(\tR\x06region\x12\x1a\n" + + "\bendpoint\x18\x03 \x01(\tR\bendpoint\x12U\n" + + "\benv_vars\x18\x04 \x03(\v2:.workflow.plugin.external.iac.BootstrapResult.EnvVarsEntryR\aenvVars\x1a:\n" + + "\fEnvVarsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xa1\x04\n" + + "\x16MigrationRepairRequest\x12*\n" + + "\x11app_resource_name\x18\x01 \x01(\tR\x0fappResourceName\x124\n" + + "\x16database_resource_name\x18\x02 \x01(\tR\x14databaseResourceName\x12\x1b\n" + + "\tjob_image\x18\x03 \x01(\tR\bjobImage\x12\x1d\n" + + "\n" + + "source_dir\x18\x04 \x01(\tR\tsourceDir\x124\n" + + "\x16expected_dirty_version\x18\x05 \x01(\tR\x14expectedDirtyVersion\x12#\n" + + "\rforce_version\x18\x06 \x01(\tR\fforceVersion\x12\x17\n" + + "\athen_up\x18\a \x01(\bR\x06thenUp\x12\x1e\n" + + "\vup_if_clean\x18\b \x01(\bR\tupIfClean\x12#\n" + + "\rconfirm_force\x18\t \x01(\tR\fconfirmForce\x12O\n" + + "\x03env\x18\n" + + " \x03(\v2=.workflow.plugin.external.iac.MigrationRepairRequest.EnvEntryR\x03env\x12'\n" + + "\x0ftimeout_seconds\x18\v \x01(\x05R\x0etimeoutSeconds\x1a6\n" + + "\bEnvEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xd1\x01\n" + + "\x15MigrationRepairResult\x12&\n" + + "\x0fprovider_job_id\x18\x01 \x01(\tR\rproviderJobId\x12\x16\n" + + "\x06status\x18\x02 \x01(\tR\x06status\x12\x18\n" + + "\aapplied\x18\x03 \x03(\tR\aapplied\x12\x12\n" + + "\x04logs\x18\x04 \x01(\tR\x04logs\x12J\n" + + "\vdiagnostics\x18\x05 \x03(\v2(.workflow.plugin.external.iac.DiagnosticR\vdiagnostics\"4\n" + + "\x11InitializeRequest\x12\x1f\n" + + "\vconfig_json\x18\x01 \x01(\fR\n" + + "configJson\"\x14\n" + + "\x12InitializeResponse\"\r\n" + + "\vNameRequest\"\"\n" + + "\fNameResponse\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"\x10\n" + + "\x0eVersionRequest\"+\n" + + "\x0fVersionResponse\x12\x18\n" + + "\aversion\x18\x01 \x01(\tR\aversion\"\x15\n" + + "\x13CapabilitiesRequest\"r\n" + + "\x14CapabilitiesResponse\x12Z\n" + + "\fcapabilities\x18\x01 \x03(\v26.workflow.plugin.external.iac.IaCCapabilityDeclarationR\fcapabilities\"\x9a\x01\n" + + "\vPlanRequest\x12D\n" + + "\adesired\x18\x01 \x03(\v2*.workflow.plugin.external.iac.ResourceSpecR\adesired\x12E\n" + + "\acurrent\x18\x02 \x03(\v2+.workflow.plugin.external.iac.ResourceStateR\acurrent\"I\n" + + "\fPlanResponse\x129\n" + + "\x04plan\x18\x01 \x01(\v2%.workflow.plugin.external.iac.IaCPlanR\x04plan\"I\n" + + "\fApplyRequest\x129\n" + + "\x04plan\x18\x01 \x01(\v2%.workflow.plugin.external.iac.IaCPlanR\x04plan\"R\n" + + "\rApplyResponse\x12A\n" + + "\x06result\x18\x01 \x01(\v2).workflow.plugin.external.iac.ApplyResultR\x06result\"O\n" + + "\x0eDestroyRequest\x12=\n" + + "\x04refs\x18\x01 \x03(\v2).workflow.plugin.external.iac.ResourceRefR\x04refs\"V\n" + + "\x0fDestroyResponse\x12C\n" + + "\x06result\x18\x01 \x01(\v2+.workflow.plugin.external.iac.DestroyResultR\x06result\"N\n" + + "\rStatusRequest\x12=\n" + + "\x04refs\x18\x01 \x03(\v2).workflow.plugin.external.iac.ResourceRefR\x04refs\"Z\n" + + "\x0eStatusResponse\x12H\n" + + "\bstatuses\x18\x01 \x03(\v2,.workflow.plugin.external.iac.ResourceStatusR\bstatuses\"U\n" + + "\rImportRequest\x12\x1f\n" + + "\vprovider_id\x18\x01 \x01(\tR\n" + + "providerId\x12#\n" + + "\rresource_type\x18\x02 \x01(\tR\fresourceType\"S\n" + + "\x0eImportResponse\x12A\n" + + "\x05state\x18\x01 \x01(\v2+.workflow.plugin.external.iac.ResourceStateR\x05state\"\x92\x01\n" + + "\x14ResolveSizingRequest\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\x12\x12\n" + + "\x04size\x18\x02 \x01(\tR\x04size\x12A\n" + + "\x05hints\x18\x03 \x01(\v2+.workflow.plugin.external.iac.ResourceHintsR\x05hints\"]\n" + + "\x15ResolveSizingResponse\x12D\n" + + "\x06sizing\x18\x01 \x01(\v2,.workflow.plugin.external.iac.ProviderSizingR\x06sizing\"?\n" + + "\x1cBootstrapStateBackendRequest\x12\x1f\n" + + "\vconfig_json\x18\x01 \x01(\fR\n" + + "configJson\"f\n" + + "\x1dBootstrapStateBackendResponse\x12E\n" + + "\x06result\x18\x01 \x01(\v2-.workflow.plugin.external.iac.BootstrapResultR\x06result\":\n" + + "\x13EnumerateAllRequest\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\"^\n" + + "\x14EnumerateAllResponse\x12F\n" + + "\aoutputs\x18\x01 \x03(\v2,.workflow.plugin.external.iac.ResourceOutputR\aoutputs\")\n" + + "\x15EnumerateByTagRequest\x12\x10\n" + + "\x03tag\x18\x01 \x01(\tR\x03tag\"W\n" + + "\x16EnumerateByTagResponse\x12=\n" + + "\x04refs\x18\x01 \x03(\v2).workflow.plugin.external.iac.ResourceRefR\x04refs\"S\n" + + "\x12DetectDriftRequest\x12=\n" + + "\x04refs\x18\x01 \x03(\v2).workflow.plugin.external.iac.ResourceRefR\x04refs\"X\n" + + "\x13DetectDriftResponse\x12A\n" + + "\x06drifts\x18\x01 \x03(\v2).workflow.plugin.external.iac.DriftResultR\x06drifts\"\x9e\x02\n" + + "\x1bDetectDriftWithSpecsRequest\x12=\n" + + "\x04refs\x18\x01 \x03(\v2).workflow.plugin.external.iac.ResourceRefR\x04refs\x12Z\n" + + "\x05specs\x18\x02 \x03(\v2D.workflow.plugin.external.iac.DetectDriftWithSpecsRequest.SpecsEntryR\x05specs\x1ad\n" + + "\n" + + "SpecsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12@\n" + + "\x05value\x18\x02 \x01(\v2*.workflow.plugin.external.iac.ResourceSpecR\x05value:\x028\x01\"a\n" + + "\x1cDetectDriftWithSpecsResponse\x12A\n" + + "\x06drifts\x18\x01 \x03(\v2).workflow.plugin.external.iac.DriftResultR\x06drifts\"^\n" + + "\x1fRevokeProviderCredentialRequest\x12\x16\n" + + "\x06source\x18\x01 \x01(\tR\x06source\x12#\n" + + "\rcredential_id\x18\x02 \x01(\tR\fcredentialId\"\"\n" + + " RevokeProviderCredentialResponse\"m\n" + + "\x1bRepairDirtyMigrationRequest\x12N\n" + + "\arequest\x18\x01 \x01(\v24.workflow.plugin.external.iac.MigrationRepairRequestR\arequest\"k\n" + + "\x1cRepairDirtyMigrationResponse\x12K\n" + + "\x06result\x18\x01 \x01(\v23.workflow.plugin.external.iac.MigrationRepairResultR\x06result\"P\n" + + "\x13ValidatePlanRequest\x129\n" + + "\x04plan\x18\x01 \x01(\v2%.workflow.plugin.external.iac.IaCPlanR\x04plan\"f\n" + + "\x14ValidatePlanResponse\x12N\n" + + "\vdiagnostics\x18\x01 \x03(\v2,.workflow.plugin.external.iac.PlanDiagnosticR\vdiagnostics\"\x98\x02\n" + + "\x18DetectDriftConfigRequest\x12=\n" + + "\x04refs\x18\x01 \x03(\v2).workflow.plugin.external.iac.ResourceRefR\x04refs\x12W\n" + + "\x05specs\x18\x02 \x03(\v2A.workflow.plugin.external.iac.DetectDriftConfigRequest.SpecsEntryR\x05specs\x1ad\n" + + "\n" + + "SpecsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12@\n" + + "\x05value\x18\x02 \x01(\v2*.workflow.plugin.external.iac.ResourceSpecR\x05value:\x028\x01\"^\n" + + "\x19DetectDriftConfigResponse\x12A\n" + + "\x06drifts\x18\x01 \x03(\v2).workflow.plugin.external.iac.DriftResultR\x06drifts\"|\n" + + "\x15ResourceCreateRequest\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\x12>\n" + + "\x04spec\x18\x02 \x01(\v2*.workflow.plugin.external.iac.ResourceSpecR\x04spec\"^\n" + + "\x16ResourceCreateResponse\x12D\n" + + "\x06output\x18\x01 \x01(\v2,.workflow.plugin.external.iac.ResourceOutputR\x06output\"w\n" + + "\x13ResourceReadRequest\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\x12;\n" + + "\x03ref\x18\x02 \x01(\v2).workflow.plugin.external.iac.ResourceRefR\x03ref\"\\\n" + + "\x14ResourceReadResponse\x12D\n" + + "\x06output\x18\x01 \x01(\v2,.workflow.plugin.external.iac.ResourceOutputR\x06output\"\xb9\x01\n" + + "\x15ResourceUpdateRequest\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\x12;\n" + + "\x03ref\x18\x02 \x01(\v2).workflow.plugin.external.iac.ResourceRefR\x03ref\x12>\n" + + "\x04spec\x18\x03 \x01(\v2*.workflow.plugin.external.iac.ResourceSpecR\x04spec\"^\n" + + "\x16ResourceUpdateResponse\x12D\n" + + "\x06output\x18\x01 \x01(\v2,.workflow.plugin.external.iac.ResourceOutputR\x06output\"y\n" + + "\x15ResourceDeleteRequest\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\x12;\n" + + "\x03ref\x18\x02 \x01(\v2).workflow.plugin.external.iac.ResourceRefR\x03ref\"\x18\n" + + "\x16ResourceDeleteResponse\"\xc8\x01\n" + + "\x13ResourceDiffRequest\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\x12D\n" + + "\adesired\x18\x02 \x01(\v2*.workflow.plugin.external.iac.ResourceSpecR\adesired\x12F\n" + + "\acurrent\x18\x03 \x01(\v2,.workflow.plugin.external.iac.ResourceOutputR\acurrent\"X\n" + + "\x14ResourceDiffResponse\x12@\n" + + "\x06result\x18\x01 \x01(\v2(.workflow.plugin.external.iac.DiffResultR\x06result\"\x94\x01\n" + + "\x14ResourceScaleRequest\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\x12;\n" + + "\x03ref\x18\x02 \x01(\v2).workflow.plugin.external.iac.ResourceRefR\x03ref\x12\x1a\n" + + "\breplicas\x18\x03 \x01(\x05R\breplicas\"]\n" + + "\x15ResourceScaleResponse\x12D\n" + + "\x06output\x18\x01 \x01(\v2,.workflow.plugin.external.iac.ResourceOutputR\x06output\"~\n" + + "\x1aResourceHealthCheckRequest\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\x12;\n" + + "\x03ref\x18\x02 \x01(\v2).workflow.plugin.external.iac.ResourceRefR\x03ref\"a\n" + + "\x1bResourceHealthCheckResponse\x12B\n" + + "\x06result\x18\x01 \x01(\v2*.workflow.plugin.external.iac.HealthResultR\x06result\";\n" + + "\x14SensitiveKeysRequest\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\"+\n" + + "\x15SensitiveKeysResponse\x12\x12\n" + + "\x04keys\x18\x01 \x03(\tR\x04keys\"\x98\x01\n" + + "\x13TroubleshootRequest\x12#\n" + + "\rresource_type\x18\x01 \x01(\tR\fresourceType\x12;\n" + + "\x03ref\x18\x02 \x01(\v2).workflow.plugin.external.iac.ResourceRefR\x03ref\x12\x1f\n" + + "\vfailure_msg\x18\x03 \x01(\tR\n" + + "failureMsg\"b\n" + + "\x14TroubleshootResponse\x12J\n" + + "\vdiagnostics\x18\x01 \x03(\v2(.workflow.plugin.external.iac.DiagnosticR\vdiagnostics*m\n" + + "\n" + + "DriftClass\x12\x17\n" + + "\x13DRIFT_CLASS_UNKNOWN\x10\x00\x12\x17\n" + + "\x13DRIFT_CLASS_IN_SYNC\x10\x01\x12\x15\n" + + "\x11DRIFT_CLASS_GHOST\x10\x02\x12\x16\n" + + "\x12DRIFT_CLASS_CONFIG\x10\x03*j\n" + + "\x16PlanDiagnosticSeverity\x12\x18\n" + + "\x14PLAN_DIAGNOSTIC_INFO\x10\x00\x12\x1b\n" + + "\x17PLAN_DIAGNOSTIC_WARNING\x10\x01\x12\x19\n" + + "\x15PLAN_DIAGNOSTIC_ERROR\x10\x022\xc4\t\n" + + "\x13IaCProviderRequired\x12o\n" + + "\n" + + "Initialize\x12/.workflow.plugin.external.iac.InitializeRequest\x1a0.workflow.plugin.external.iac.InitializeResponse\x12]\n" + + "\x04Name\x12).workflow.plugin.external.iac.NameRequest\x1a*.workflow.plugin.external.iac.NameResponse\x12f\n" + + "\aVersion\x12,.workflow.plugin.external.iac.VersionRequest\x1a-.workflow.plugin.external.iac.VersionResponse\x12u\n" + + "\fCapabilities\x121.workflow.plugin.external.iac.CapabilitiesRequest\x1a2.workflow.plugin.external.iac.CapabilitiesResponse\x12]\n" + + "\x04Plan\x12).workflow.plugin.external.iac.PlanRequest\x1a*.workflow.plugin.external.iac.PlanResponse\x12`\n" + + "\x05Apply\x12*.workflow.plugin.external.iac.ApplyRequest\x1a+.workflow.plugin.external.iac.ApplyResponse\x12f\n" + + "\aDestroy\x12,.workflow.plugin.external.iac.DestroyRequest\x1a-.workflow.plugin.external.iac.DestroyResponse\x12c\n" + + "\x06Status\x12+.workflow.plugin.external.iac.StatusRequest\x1a,.workflow.plugin.external.iac.StatusResponse\x12c\n" + + "\x06Import\x12+.workflow.plugin.external.iac.ImportRequest\x1a,.workflow.plugin.external.iac.ImportResponse\x12x\n" + + "\rResolveSizing\x122.workflow.plugin.external.iac.ResolveSizingRequest\x1a3.workflow.plugin.external.iac.ResolveSizingResponse\x12\x90\x01\n" + + "\x15BootstrapStateBackend\x12:.workflow.plugin.external.iac.BootstrapStateBackendRequest\x1a;.workflow.plugin.external.iac.BootstrapStateBackendResponse2\x8b\x02\n" + + "\x15IaCProviderEnumerator\x12u\n" + + "\fEnumerateAll\x121.workflow.plugin.external.iac.EnumerateAllRequest\x1a2.workflow.plugin.external.iac.EnumerateAllResponse\x12{\n" + + "\x0eEnumerateByTag\x123.workflow.plugin.external.iac.EnumerateByTagRequest\x1a4.workflow.plugin.external.iac.EnumerateByTagResponse2\x9e\x02\n" + + "\x18IaCProviderDriftDetector\x12r\n" + + "\vDetectDrift\x120.workflow.plugin.external.iac.DetectDriftRequest\x1a1.workflow.plugin.external.iac.DetectDriftResponse\x12\x8d\x01\n" + + "\x14DetectDriftWithSpecs\x129.workflow.plugin.external.iac.DetectDriftWithSpecsRequest\x1a:.workflow.plugin.external.iac.DetectDriftWithSpecsResponse2\xba\x01\n" + + "\x1cIaCProviderCredentialRevoker\x12\x99\x01\n" + + "\x18RevokeProviderCredential\x12=.workflow.plugin.external.iac.RevokeProviderCredentialRequest\x1a>.workflow.plugin.external.iac.RevokeProviderCredentialResponse2\xae\x01\n" + + "\x1cIaCProviderMigrationRepairer\x12\x8d\x01\n" + + "\x14RepairDirtyMigration\x129.workflow.plugin.external.iac.RepairDirtyMigrationRequest\x1a:.workflow.plugin.external.iac.RepairDirtyMigrationResponse2\x8d\x01\n" + + "\x14IaCProviderValidator\x12u\n" + + "\fValidatePlan\x121.workflow.plugin.external.iac.ValidatePlanRequest\x1a2.workflow.plugin.external.iac.ValidatePlanResponse2\xa7\x01\n" + + "\x1eIaCProviderDriftConfigDetector\x12\x84\x01\n" + + "\x11DetectDriftConfig\x126.workflow.plugin.external.iac.DetectDriftConfigRequest\x1a7.workflow.plugin.external.iac.DetectDriftConfigResponse2\xb5\b\n" + + "\x0eResourceDriver\x12s\n" + + "\x06Create\x123.workflow.plugin.external.iac.ResourceCreateRequest\x1a4.workflow.plugin.external.iac.ResourceCreateResponse\x12m\n" + + "\x04Read\x121.workflow.plugin.external.iac.ResourceReadRequest\x1a2.workflow.plugin.external.iac.ResourceReadResponse\x12s\n" + + "\x06Update\x123.workflow.plugin.external.iac.ResourceUpdateRequest\x1a4.workflow.plugin.external.iac.ResourceUpdateResponse\x12s\n" + + "\x06Delete\x123.workflow.plugin.external.iac.ResourceDeleteRequest\x1a4.workflow.plugin.external.iac.ResourceDeleteResponse\x12m\n" + + "\x04Diff\x121.workflow.plugin.external.iac.ResourceDiffRequest\x1a2.workflow.plugin.external.iac.ResourceDiffResponse\x12p\n" + + "\x05Scale\x122.workflow.plugin.external.iac.ResourceScaleRequest\x1a3.workflow.plugin.external.iac.ResourceScaleResponse\x12\x82\x01\n" + + "\vHealthCheck\x128.workflow.plugin.external.iac.ResourceHealthCheckRequest\x1a9.workflow.plugin.external.iac.ResourceHealthCheckResponse\x12x\n" + + "\rSensitiveKeys\x122.workflow.plugin.external.iac.SensitiveKeysRequest\x1a3.workflow.plugin.external.iac.SensitiveKeysResponse\x12u\n" + + "\fTroubleshoot\x121.workflow.plugin.external.iac.TroubleshootRequest\x1a2.workflow.plugin.external.iac.TroubleshootResponseB=Z;github.com/GoCodeAlone/workflow/plugin/external/proto;protob\x06proto3" + +var ( + file_plugin_external_proto_iac_proto_rawDescOnce sync.Once + file_plugin_external_proto_iac_proto_rawDescData []byte +) + +func file_plugin_external_proto_iac_proto_rawDescGZIP() []byte { + file_plugin_external_proto_iac_proto_rawDescOnce.Do(func() { + file_plugin_external_proto_iac_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_plugin_external_proto_iac_proto_rawDesc), len(file_plugin_external_proto_iac_proto_rawDesc))) + }) + return file_plugin_external_proto_iac_proto_rawDescData +} + +var file_plugin_external_proto_iac_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_plugin_external_proto_iac_proto_msgTypes = make([]protoimpl.MessageInfo, 87) +var file_plugin_external_proto_iac_proto_goTypes = []any{ + (DriftClass)(0), // 0: workflow.plugin.external.iac.DriftClass + (PlanDiagnosticSeverity)(0), // 1: workflow.plugin.external.iac.PlanDiagnosticSeverity + (*ResourceSpec)(nil), // 2: workflow.plugin.external.iac.ResourceSpec + (*ResourceRef)(nil), // 3: workflow.plugin.external.iac.ResourceRef + (*ResourceHints)(nil), // 4: workflow.plugin.external.iac.ResourceHints + (*ProviderSizing)(nil), // 5: workflow.plugin.external.iac.ProviderSizing + (*IaCCapabilityDeclaration)(nil), // 6: workflow.plugin.external.iac.IaCCapabilityDeclaration + (*ResourceState)(nil), // 7: workflow.plugin.external.iac.ResourceState + (*ResourceOutput)(nil), // 8: workflow.plugin.external.iac.ResourceOutput + (*ResourceStatus)(nil), // 9: workflow.plugin.external.iac.ResourceStatus + (*FieldChange)(nil), // 10: workflow.plugin.external.iac.FieldChange + (*DiffResult)(nil), // 11: workflow.plugin.external.iac.DiffResult + (*DriftResult)(nil), // 12: workflow.plugin.external.iac.DriftResult + (*DriftEntry)(nil), // 13: workflow.plugin.external.iac.DriftEntry + (*HealthResult)(nil), // 14: workflow.plugin.external.iac.HealthResult + (*Diagnostic)(nil), // 15: workflow.plugin.external.iac.Diagnostic + (*PlanDiagnostic)(nil), // 16: workflow.plugin.external.iac.PlanDiagnostic + (*PlanAction)(nil), // 17: workflow.plugin.external.iac.PlanAction + (*IaCPlan)(nil), // 18: workflow.plugin.external.iac.IaCPlan + (*ActionError)(nil), // 19: workflow.plugin.external.iac.ActionError + (*ApplyResult)(nil), // 20: workflow.plugin.external.iac.ApplyResult + (*DestroyResult)(nil), // 21: workflow.plugin.external.iac.DestroyResult + (*BootstrapResult)(nil), // 22: workflow.plugin.external.iac.BootstrapResult + (*MigrationRepairRequest)(nil), // 23: workflow.plugin.external.iac.MigrationRepairRequest + (*MigrationRepairResult)(nil), // 24: workflow.plugin.external.iac.MigrationRepairResult + (*InitializeRequest)(nil), // 25: workflow.plugin.external.iac.InitializeRequest + (*InitializeResponse)(nil), // 26: workflow.plugin.external.iac.InitializeResponse + (*NameRequest)(nil), // 27: workflow.plugin.external.iac.NameRequest + (*NameResponse)(nil), // 28: workflow.plugin.external.iac.NameResponse + (*VersionRequest)(nil), // 29: workflow.plugin.external.iac.VersionRequest + (*VersionResponse)(nil), // 30: workflow.plugin.external.iac.VersionResponse + (*CapabilitiesRequest)(nil), // 31: workflow.plugin.external.iac.CapabilitiesRequest + (*CapabilitiesResponse)(nil), // 32: workflow.plugin.external.iac.CapabilitiesResponse + (*PlanRequest)(nil), // 33: workflow.plugin.external.iac.PlanRequest + (*PlanResponse)(nil), // 34: workflow.plugin.external.iac.PlanResponse + (*ApplyRequest)(nil), // 35: workflow.plugin.external.iac.ApplyRequest + (*ApplyResponse)(nil), // 36: workflow.plugin.external.iac.ApplyResponse + (*DestroyRequest)(nil), // 37: workflow.plugin.external.iac.DestroyRequest + (*DestroyResponse)(nil), // 38: workflow.plugin.external.iac.DestroyResponse + (*StatusRequest)(nil), // 39: workflow.plugin.external.iac.StatusRequest + (*StatusResponse)(nil), // 40: workflow.plugin.external.iac.StatusResponse + (*ImportRequest)(nil), // 41: workflow.plugin.external.iac.ImportRequest + (*ImportResponse)(nil), // 42: workflow.plugin.external.iac.ImportResponse + (*ResolveSizingRequest)(nil), // 43: workflow.plugin.external.iac.ResolveSizingRequest + (*ResolveSizingResponse)(nil), // 44: workflow.plugin.external.iac.ResolveSizingResponse + (*BootstrapStateBackendRequest)(nil), // 45: workflow.plugin.external.iac.BootstrapStateBackendRequest + (*BootstrapStateBackendResponse)(nil), // 46: workflow.plugin.external.iac.BootstrapStateBackendResponse + (*EnumerateAllRequest)(nil), // 47: workflow.plugin.external.iac.EnumerateAllRequest + (*EnumerateAllResponse)(nil), // 48: workflow.plugin.external.iac.EnumerateAllResponse + (*EnumerateByTagRequest)(nil), // 49: workflow.plugin.external.iac.EnumerateByTagRequest + (*EnumerateByTagResponse)(nil), // 50: workflow.plugin.external.iac.EnumerateByTagResponse + (*DetectDriftRequest)(nil), // 51: workflow.plugin.external.iac.DetectDriftRequest + (*DetectDriftResponse)(nil), // 52: workflow.plugin.external.iac.DetectDriftResponse + (*DetectDriftWithSpecsRequest)(nil), // 53: workflow.plugin.external.iac.DetectDriftWithSpecsRequest + (*DetectDriftWithSpecsResponse)(nil), // 54: workflow.plugin.external.iac.DetectDriftWithSpecsResponse + (*RevokeProviderCredentialRequest)(nil), // 55: workflow.plugin.external.iac.RevokeProviderCredentialRequest + (*RevokeProviderCredentialResponse)(nil), // 56: workflow.plugin.external.iac.RevokeProviderCredentialResponse + (*RepairDirtyMigrationRequest)(nil), // 57: workflow.plugin.external.iac.RepairDirtyMigrationRequest + (*RepairDirtyMigrationResponse)(nil), // 58: workflow.plugin.external.iac.RepairDirtyMigrationResponse + (*ValidatePlanRequest)(nil), // 59: workflow.plugin.external.iac.ValidatePlanRequest + (*ValidatePlanResponse)(nil), // 60: workflow.plugin.external.iac.ValidatePlanResponse + (*DetectDriftConfigRequest)(nil), // 61: workflow.plugin.external.iac.DetectDriftConfigRequest + (*DetectDriftConfigResponse)(nil), // 62: workflow.plugin.external.iac.DetectDriftConfigResponse + (*ResourceCreateRequest)(nil), // 63: workflow.plugin.external.iac.ResourceCreateRequest + (*ResourceCreateResponse)(nil), // 64: workflow.plugin.external.iac.ResourceCreateResponse + (*ResourceReadRequest)(nil), // 65: workflow.plugin.external.iac.ResourceReadRequest + (*ResourceReadResponse)(nil), // 66: workflow.plugin.external.iac.ResourceReadResponse + (*ResourceUpdateRequest)(nil), // 67: workflow.plugin.external.iac.ResourceUpdateRequest + (*ResourceUpdateResponse)(nil), // 68: workflow.plugin.external.iac.ResourceUpdateResponse + (*ResourceDeleteRequest)(nil), // 69: workflow.plugin.external.iac.ResourceDeleteRequest + (*ResourceDeleteResponse)(nil), // 70: workflow.plugin.external.iac.ResourceDeleteResponse + (*ResourceDiffRequest)(nil), // 71: workflow.plugin.external.iac.ResourceDiffRequest + (*ResourceDiffResponse)(nil), // 72: workflow.plugin.external.iac.ResourceDiffResponse + (*ResourceScaleRequest)(nil), // 73: workflow.plugin.external.iac.ResourceScaleRequest + (*ResourceScaleResponse)(nil), // 74: workflow.plugin.external.iac.ResourceScaleResponse + (*ResourceHealthCheckRequest)(nil), // 75: workflow.plugin.external.iac.ResourceHealthCheckRequest + (*ResourceHealthCheckResponse)(nil), // 76: workflow.plugin.external.iac.ResourceHealthCheckResponse + (*SensitiveKeysRequest)(nil), // 77: workflow.plugin.external.iac.SensitiveKeysRequest + (*SensitiveKeysResponse)(nil), // 78: workflow.plugin.external.iac.SensitiveKeysResponse + (*TroubleshootRequest)(nil), // 79: workflow.plugin.external.iac.TroubleshootRequest + (*TroubleshootResponse)(nil), // 80: workflow.plugin.external.iac.TroubleshootResponse + nil, // 81: workflow.plugin.external.iac.ResourceOutput.SensitiveEntry + nil, // 82: workflow.plugin.external.iac.IaCPlan.InputSnapshotEntry + nil, // 83: workflow.plugin.external.iac.ApplyResult.InitialInputSnapshotEntry + nil, // 84: workflow.plugin.external.iac.ApplyResult.ReplaceIdMapEntry + nil, // 85: workflow.plugin.external.iac.BootstrapResult.EnvVarsEntry + nil, // 86: workflow.plugin.external.iac.MigrationRepairRequest.EnvEntry + nil, // 87: workflow.plugin.external.iac.DetectDriftWithSpecsRequest.SpecsEntry + nil, // 88: workflow.plugin.external.iac.DetectDriftConfigRequest.SpecsEntry + (*timestamppb.Timestamp)(nil), // 89: google.protobuf.Timestamp +} +var file_plugin_external_proto_iac_proto_depIdxs = []int32{ + 4, // 0: workflow.plugin.external.iac.ResourceSpec.hints:type_name -> workflow.plugin.external.iac.ResourceHints + 89, // 1: workflow.plugin.external.iac.ResourceState.created_at:type_name -> google.protobuf.Timestamp + 89, // 2: workflow.plugin.external.iac.ResourceState.updated_at:type_name -> google.protobuf.Timestamp + 89, // 3: workflow.plugin.external.iac.ResourceState.last_drift_check:type_name -> google.protobuf.Timestamp + 81, // 4: workflow.plugin.external.iac.ResourceOutput.sensitive:type_name -> workflow.plugin.external.iac.ResourceOutput.SensitiveEntry + 10, // 5: workflow.plugin.external.iac.DiffResult.changes:type_name -> workflow.plugin.external.iac.FieldChange + 0, // 6: workflow.plugin.external.iac.DriftResult.class:type_name -> workflow.plugin.external.iac.DriftClass + 89, // 7: workflow.plugin.external.iac.Diagnostic.at:type_name -> google.protobuf.Timestamp + 1, // 8: workflow.plugin.external.iac.PlanDiagnostic.severity:type_name -> workflow.plugin.external.iac.PlanDiagnosticSeverity + 2, // 9: workflow.plugin.external.iac.PlanAction.resource:type_name -> workflow.plugin.external.iac.ResourceSpec + 7, // 10: workflow.plugin.external.iac.PlanAction.current:type_name -> workflow.plugin.external.iac.ResourceState + 10, // 11: workflow.plugin.external.iac.PlanAction.changes:type_name -> workflow.plugin.external.iac.FieldChange + 17, // 12: workflow.plugin.external.iac.IaCPlan.actions:type_name -> workflow.plugin.external.iac.PlanAction + 89, // 13: workflow.plugin.external.iac.IaCPlan.created_at:type_name -> google.protobuf.Timestamp + 82, // 14: workflow.plugin.external.iac.IaCPlan.input_snapshot:type_name -> workflow.plugin.external.iac.IaCPlan.InputSnapshotEntry + 8, // 15: workflow.plugin.external.iac.ApplyResult.resources:type_name -> workflow.plugin.external.iac.ResourceOutput + 19, // 16: workflow.plugin.external.iac.ApplyResult.errors:type_name -> workflow.plugin.external.iac.ActionError + 83, // 17: workflow.plugin.external.iac.ApplyResult.initial_input_snapshot:type_name -> workflow.plugin.external.iac.ApplyResult.InitialInputSnapshotEntry + 13, // 18: workflow.plugin.external.iac.ApplyResult.input_drift_report:type_name -> workflow.plugin.external.iac.DriftEntry + 84, // 19: workflow.plugin.external.iac.ApplyResult.replace_id_map:type_name -> workflow.plugin.external.iac.ApplyResult.ReplaceIdMapEntry + 19, // 20: workflow.plugin.external.iac.DestroyResult.errors:type_name -> workflow.plugin.external.iac.ActionError + 85, // 21: workflow.plugin.external.iac.BootstrapResult.env_vars:type_name -> workflow.plugin.external.iac.BootstrapResult.EnvVarsEntry + 86, // 22: workflow.plugin.external.iac.MigrationRepairRequest.env:type_name -> workflow.plugin.external.iac.MigrationRepairRequest.EnvEntry + 15, // 23: workflow.plugin.external.iac.MigrationRepairResult.diagnostics:type_name -> workflow.plugin.external.iac.Diagnostic + 6, // 24: workflow.plugin.external.iac.CapabilitiesResponse.capabilities:type_name -> workflow.plugin.external.iac.IaCCapabilityDeclaration + 2, // 25: workflow.plugin.external.iac.PlanRequest.desired:type_name -> workflow.plugin.external.iac.ResourceSpec + 7, // 26: workflow.plugin.external.iac.PlanRequest.current:type_name -> workflow.plugin.external.iac.ResourceState + 18, // 27: workflow.plugin.external.iac.PlanResponse.plan:type_name -> workflow.plugin.external.iac.IaCPlan + 18, // 28: workflow.plugin.external.iac.ApplyRequest.plan:type_name -> workflow.plugin.external.iac.IaCPlan + 20, // 29: workflow.plugin.external.iac.ApplyResponse.result:type_name -> workflow.plugin.external.iac.ApplyResult + 3, // 30: workflow.plugin.external.iac.DestroyRequest.refs:type_name -> workflow.plugin.external.iac.ResourceRef + 21, // 31: workflow.plugin.external.iac.DestroyResponse.result:type_name -> workflow.plugin.external.iac.DestroyResult + 3, // 32: workflow.plugin.external.iac.StatusRequest.refs:type_name -> workflow.plugin.external.iac.ResourceRef + 9, // 33: workflow.plugin.external.iac.StatusResponse.statuses:type_name -> workflow.plugin.external.iac.ResourceStatus + 7, // 34: workflow.plugin.external.iac.ImportResponse.state:type_name -> workflow.plugin.external.iac.ResourceState + 4, // 35: workflow.plugin.external.iac.ResolveSizingRequest.hints:type_name -> workflow.plugin.external.iac.ResourceHints + 5, // 36: workflow.plugin.external.iac.ResolveSizingResponse.sizing:type_name -> workflow.plugin.external.iac.ProviderSizing + 22, // 37: workflow.plugin.external.iac.BootstrapStateBackendResponse.result:type_name -> workflow.plugin.external.iac.BootstrapResult + 8, // 38: workflow.plugin.external.iac.EnumerateAllResponse.outputs:type_name -> workflow.plugin.external.iac.ResourceOutput + 3, // 39: workflow.plugin.external.iac.EnumerateByTagResponse.refs:type_name -> workflow.plugin.external.iac.ResourceRef + 3, // 40: workflow.plugin.external.iac.DetectDriftRequest.refs:type_name -> workflow.plugin.external.iac.ResourceRef + 12, // 41: workflow.plugin.external.iac.DetectDriftResponse.drifts:type_name -> workflow.plugin.external.iac.DriftResult + 3, // 42: workflow.plugin.external.iac.DetectDriftWithSpecsRequest.refs:type_name -> workflow.plugin.external.iac.ResourceRef + 87, // 43: workflow.plugin.external.iac.DetectDriftWithSpecsRequest.specs:type_name -> workflow.plugin.external.iac.DetectDriftWithSpecsRequest.SpecsEntry + 12, // 44: workflow.plugin.external.iac.DetectDriftWithSpecsResponse.drifts:type_name -> workflow.plugin.external.iac.DriftResult + 23, // 45: workflow.plugin.external.iac.RepairDirtyMigrationRequest.request:type_name -> workflow.plugin.external.iac.MigrationRepairRequest + 24, // 46: workflow.plugin.external.iac.RepairDirtyMigrationResponse.result:type_name -> workflow.plugin.external.iac.MigrationRepairResult + 18, // 47: workflow.plugin.external.iac.ValidatePlanRequest.plan:type_name -> workflow.plugin.external.iac.IaCPlan + 16, // 48: workflow.plugin.external.iac.ValidatePlanResponse.diagnostics:type_name -> workflow.plugin.external.iac.PlanDiagnostic + 3, // 49: workflow.plugin.external.iac.DetectDriftConfigRequest.refs:type_name -> workflow.plugin.external.iac.ResourceRef + 88, // 50: workflow.plugin.external.iac.DetectDriftConfigRequest.specs:type_name -> workflow.plugin.external.iac.DetectDriftConfigRequest.SpecsEntry + 12, // 51: workflow.plugin.external.iac.DetectDriftConfigResponse.drifts:type_name -> workflow.plugin.external.iac.DriftResult + 2, // 52: workflow.plugin.external.iac.ResourceCreateRequest.spec:type_name -> workflow.plugin.external.iac.ResourceSpec + 8, // 53: workflow.plugin.external.iac.ResourceCreateResponse.output:type_name -> workflow.plugin.external.iac.ResourceOutput + 3, // 54: workflow.plugin.external.iac.ResourceReadRequest.ref:type_name -> workflow.plugin.external.iac.ResourceRef + 8, // 55: workflow.plugin.external.iac.ResourceReadResponse.output:type_name -> workflow.plugin.external.iac.ResourceOutput + 3, // 56: workflow.plugin.external.iac.ResourceUpdateRequest.ref:type_name -> workflow.plugin.external.iac.ResourceRef + 2, // 57: workflow.plugin.external.iac.ResourceUpdateRequest.spec:type_name -> workflow.plugin.external.iac.ResourceSpec + 8, // 58: workflow.plugin.external.iac.ResourceUpdateResponse.output:type_name -> workflow.plugin.external.iac.ResourceOutput + 3, // 59: workflow.plugin.external.iac.ResourceDeleteRequest.ref:type_name -> workflow.plugin.external.iac.ResourceRef + 2, // 60: workflow.plugin.external.iac.ResourceDiffRequest.desired:type_name -> workflow.plugin.external.iac.ResourceSpec + 8, // 61: workflow.plugin.external.iac.ResourceDiffRequest.current:type_name -> workflow.plugin.external.iac.ResourceOutput + 11, // 62: workflow.plugin.external.iac.ResourceDiffResponse.result:type_name -> workflow.plugin.external.iac.DiffResult + 3, // 63: workflow.plugin.external.iac.ResourceScaleRequest.ref:type_name -> workflow.plugin.external.iac.ResourceRef + 8, // 64: workflow.plugin.external.iac.ResourceScaleResponse.output:type_name -> workflow.plugin.external.iac.ResourceOutput + 3, // 65: workflow.plugin.external.iac.ResourceHealthCheckRequest.ref:type_name -> workflow.plugin.external.iac.ResourceRef + 14, // 66: workflow.plugin.external.iac.ResourceHealthCheckResponse.result:type_name -> workflow.plugin.external.iac.HealthResult + 3, // 67: workflow.plugin.external.iac.TroubleshootRequest.ref:type_name -> workflow.plugin.external.iac.ResourceRef + 15, // 68: workflow.plugin.external.iac.TroubleshootResponse.diagnostics:type_name -> workflow.plugin.external.iac.Diagnostic + 2, // 69: workflow.plugin.external.iac.DetectDriftWithSpecsRequest.SpecsEntry.value:type_name -> workflow.plugin.external.iac.ResourceSpec + 2, // 70: workflow.plugin.external.iac.DetectDriftConfigRequest.SpecsEntry.value:type_name -> workflow.plugin.external.iac.ResourceSpec + 25, // 71: workflow.plugin.external.iac.IaCProviderRequired.Initialize:input_type -> workflow.plugin.external.iac.InitializeRequest + 27, // 72: workflow.plugin.external.iac.IaCProviderRequired.Name:input_type -> workflow.plugin.external.iac.NameRequest + 29, // 73: workflow.plugin.external.iac.IaCProviderRequired.Version:input_type -> workflow.plugin.external.iac.VersionRequest + 31, // 74: workflow.plugin.external.iac.IaCProviderRequired.Capabilities:input_type -> workflow.plugin.external.iac.CapabilitiesRequest + 33, // 75: workflow.plugin.external.iac.IaCProviderRequired.Plan:input_type -> workflow.plugin.external.iac.PlanRequest + 35, // 76: workflow.plugin.external.iac.IaCProviderRequired.Apply:input_type -> workflow.plugin.external.iac.ApplyRequest + 37, // 77: workflow.plugin.external.iac.IaCProviderRequired.Destroy:input_type -> workflow.plugin.external.iac.DestroyRequest + 39, // 78: workflow.plugin.external.iac.IaCProviderRequired.Status:input_type -> workflow.plugin.external.iac.StatusRequest + 41, // 79: workflow.plugin.external.iac.IaCProviderRequired.Import:input_type -> workflow.plugin.external.iac.ImportRequest + 43, // 80: workflow.plugin.external.iac.IaCProviderRequired.ResolveSizing:input_type -> workflow.plugin.external.iac.ResolveSizingRequest + 45, // 81: workflow.plugin.external.iac.IaCProviderRequired.BootstrapStateBackend:input_type -> workflow.plugin.external.iac.BootstrapStateBackendRequest + 47, // 82: workflow.plugin.external.iac.IaCProviderEnumerator.EnumerateAll:input_type -> workflow.plugin.external.iac.EnumerateAllRequest + 49, // 83: workflow.plugin.external.iac.IaCProviderEnumerator.EnumerateByTag:input_type -> workflow.plugin.external.iac.EnumerateByTagRequest + 51, // 84: workflow.plugin.external.iac.IaCProviderDriftDetector.DetectDrift:input_type -> workflow.plugin.external.iac.DetectDriftRequest + 53, // 85: workflow.plugin.external.iac.IaCProviderDriftDetector.DetectDriftWithSpecs:input_type -> workflow.plugin.external.iac.DetectDriftWithSpecsRequest + 55, // 86: workflow.plugin.external.iac.IaCProviderCredentialRevoker.RevokeProviderCredential:input_type -> workflow.plugin.external.iac.RevokeProviderCredentialRequest + 57, // 87: workflow.plugin.external.iac.IaCProviderMigrationRepairer.RepairDirtyMigration:input_type -> workflow.plugin.external.iac.RepairDirtyMigrationRequest + 59, // 88: workflow.plugin.external.iac.IaCProviderValidator.ValidatePlan:input_type -> workflow.plugin.external.iac.ValidatePlanRequest + 61, // 89: workflow.plugin.external.iac.IaCProviderDriftConfigDetector.DetectDriftConfig:input_type -> workflow.plugin.external.iac.DetectDriftConfigRequest + 63, // 90: workflow.plugin.external.iac.ResourceDriver.Create:input_type -> workflow.plugin.external.iac.ResourceCreateRequest + 65, // 91: workflow.plugin.external.iac.ResourceDriver.Read:input_type -> workflow.plugin.external.iac.ResourceReadRequest + 67, // 92: workflow.plugin.external.iac.ResourceDriver.Update:input_type -> workflow.plugin.external.iac.ResourceUpdateRequest + 69, // 93: workflow.plugin.external.iac.ResourceDriver.Delete:input_type -> workflow.plugin.external.iac.ResourceDeleteRequest + 71, // 94: workflow.plugin.external.iac.ResourceDriver.Diff:input_type -> workflow.plugin.external.iac.ResourceDiffRequest + 73, // 95: workflow.plugin.external.iac.ResourceDriver.Scale:input_type -> workflow.plugin.external.iac.ResourceScaleRequest + 75, // 96: workflow.plugin.external.iac.ResourceDriver.HealthCheck:input_type -> workflow.plugin.external.iac.ResourceHealthCheckRequest + 77, // 97: workflow.plugin.external.iac.ResourceDriver.SensitiveKeys:input_type -> workflow.plugin.external.iac.SensitiveKeysRequest + 79, // 98: workflow.plugin.external.iac.ResourceDriver.Troubleshoot:input_type -> workflow.plugin.external.iac.TroubleshootRequest + 26, // 99: workflow.plugin.external.iac.IaCProviderRequired.Initialize:output_type -> workflow.plugin.external.iac.InitializeResponse + 28, // 100: workflow.plugin.external.iac.IaCProviderRequired.Name:output_type -> workflow.plugin.external.iac.NameResponse + 30, // 101: workflow.plugin.external.iac.IaCProviderRequired.Version:output_type -> workflow.plugin.external.iac.VersionResponse + 32, // 102: workflow.plugin.external.iac.IaCProviderRequired.Capabilities:output_type -> workflow.plugin.external.iac.CapabilitiesResponse + 34, // 103: workflow.plugin.external.iac.IaCProviderRequired.Plan:output_type -> workflow.plugin.external.iac.PlanResponse + 36, // 104: workflow.plugin.external.iac.IaCProviderRequired.Apply:output_type -> workflow.plugin.external.iac.ApplyResponse + 38, // 105: workflow.plugin.external.iac.IaCProviderRequired.Destroy:output_type -> workflow.plugin.external.iac.DestroyResponse + 40, // 106: workflow.plugin.external.iac.IaCProviderRequired.Status:output_type -> workflow.plugin.external.iac.StatusResponse + 42, // 107: workflow.plugin.external.iac.IaCProviderRequired.Import:output_type -> workflow.plugin.external.iac.ImportResponse + 44, // 108: workflow.plugin.external.iac.IaCProviderRequired.ResolveSizing:output_type -> workflow.plugin.external.iac.ResolveSizingResponse + 46, // 109: workflow.plugin.external.iac.IaCProviderRequired.BootstrapStateBackend:output_type -> workflow.plugin.external.iac.BootstrapStateBackendResponse + 48, // 110: workflow.plugin.external.iac.IaCProviderEnumerator.EnumerateAll:output_type -> workflow.plugin.external.iac.EnumerateAllResponse + 50, // 111: workflow.plugin.external.iac.IaCProviderEnumerator.EnumerateByTag:output_type -> workflow.plugin.external.iac.EnumerateByTagResponse + 52, // 112: workflow.plugin.external.iac.IaCProviderDriftDetector.DetectDrift:output_type -> workflow.plugin.external.iac.DetectDriftResponse + 54, // 113: workflow.plugin.external.iac.IaCProviderDriftDetector.DetectDriftWithSpecs:output_type -> workflow.plugin.external.iac.DetectDriftWithSpecsResponse + 56, // 114: workflow.plugin.external.iac.IaCProviderCredentialRevoker.RevokeProviderCredential:output_type -> workflow.plugin.external.iac.RevokeProviderCredentialResponse + 58, // 115: workflow.plugin.external.iac.IaCProviderMigrationRepairer.RepairDirtyMigration:output_type -> workflow.plugin.external.iac.RepairDirtyMigrationResponse + 60, // 116: workflow.plugin.external.iac.IaCProviderValidator.ValidatePlan:output_type -> workflow.plugin.external.iac.ValidatePlanResponse + 62, // 117: workflow.plugin.external.iac.IaCProviderDriftConfigDetector.DetectDriftConfig:output_type -> workflow.plugin.external.iac.DetectDriftConfigResponse + 64, // 118: workflow.plugin.external.iac.ResourceDriver.Create:output_type -> workflow.plugin.external.iac.ResourceCreateResponse + 66, // 119: workflow.plugin.external.iac.ResourceDriver.Read:output_type -> workflow.plugin.external.iac.ResourceReadResponse + 68, // 120: workflow.plugin.external.iac.ResourceDriver.Update:output_type -> workflow.plugin.external.iac.ResourceUpdateResponse + 70, // 121: workflow.plugin.external.iac.ResourceDriver.Delete:output_type -> workflow.plugin.external.iac.ResourceDeleteResponse + 72, // 122: workflow.plugin.external.iac.ResourceDriver.Diff:output_type -> workflow.plugin.external.iac.ResourceDiffResponse + 74, // 123: workflow.plugin.external.iac.ResourceDriver.Scale:output_type -> workflow.plugin.external.iac.ResourceScaleResponse + 76, // 124: workflow.plugin.external.iac.ResourceDriver.HealthCheck:output_type -> workflow.plugin.external.iac.ResourceHealthCheckResponse + 78, // 125: workflow.plugin.external.iac.ResourceDriver.SensitiveKeys:output_type -> workflow.plugin.external.iac.SensitiveKeysResponse + 80, // 126: workflow.plugin.external.iac.ResourceDriver.Troubleshoot:output_type -> workflow.plugin.external.iac.TroubleshootResponse + 99, // [99:127] is the sub-list for method output_type + 71, // [71:99] is the sub-list for method input_type + 71, // [71:71] is the sub-list for extension type_name + 71, // [71:71] is the sub-list for extension extendee + 0, // [0:71] is the sub-list for field type_name +} + +func init() { file_plugin_external_proto_iac_proto_init() } +func file_plugin_external_proto_iac_proto_init() { + if File_plugin_external_proto_iac_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_plugin_external_proto_iac_proto_rawDesc), len(file_plugin_external_proto_iac_proto_rawDesc)), + NumEnums: 2, + NumMessages: 87, + NumExtensions: 0, + NumServices: 8, + }, + GoTypes: file_plugin_external_proto_iac_proto_goTypes, + DependencyIndexes: file_plugin_external_proto_iac_proto_depIdxs, + EnumInfos: file_plugin_external_proto_iac_proto_enumTypes, + MessageInfos: file_plugin_external_proto_iac_proto_msgTypes, + }.Build() + File_plugin_external_proto_iac_proto = out.File + file_plugin_external_proto_iac_proto_goTypes = nil + file_plugin_external_proto_iac_proto_depIdxs = nil +} diff --git a/plugin/external/proto/iac.proto b/plugin/external/proto/iac.proto new file mode 100644 index 00000000..766b3f12 --- /dev/null +++ b/plugin/external/proto/iac.proto @@ -0,0 +1,578 @@ +// iac.proto — typed gRPC contract for IaCProvider + ResourceDriver plugins. +// +// Design: docs/plans/2026-05-10-strict-contracts-force-cutover-design.md +// Plan: docs/plans/2026-05-10-strict-contracts-force-cutover.md (Task 3) +// +// Hard invariants (per cycle 4 §Acceptance criteria): +// - NO google.protobuf.Struct, NO google.protobuf.Any used in any message. +// - Free-form per-resource Config / Outputs payloads cross the wire as +// bytes _json, JSON-encoded by the plugin/host. The plugin owns +// the serialization shape; the proto layer carries opaque bytes. +// - ResourceOutput.sensitive uses typed map (NOT structpb). +// - REQUIRED service: every method must be implemented by every plugin. +// Compile fails on the SDK type-assert if a method is missing. +// - OPTIONAL services: providers register only the services they support. +// Absence of registration IS the negative signal — no NotSupported flag. +syntax = "proto3"; + +package workflow.plugin.external.iac; + +option go_package = "github.com/GoCodeAlone/workflow/plugin/external/proto;proto"; + +import "google/protobuf/timestamp.proto"; + +// ───────────────────────────────────────────────────────────────────────────── +// REQUIRED service — every IaC provider MUST implement every RPC. +// Go compiler enforces full interface satisfaction at the SDK type-assert. +// ───────────────────────────────────────────────────────────────────────────── +service IaCProviderRequired { + rpc Initialize(InitializeRequest) returns (InitializeResponse); + rpc Name(NameRequest) returns (NameResponse); + rpc Version(VersionRequest) returns (VersionResponse); + rpc Capabilities(CapabilitiesRequest) returns (CapabilitiesResponse); + rpc Plan(PlanRequest) returns (PlanResponse); + rpc Apply(ApplyRequest) returns (ApplyResponse); + rpc Destroy(DestroyRequest) returns (DestroyResponse); + rpc Status(StatusRequest) returns (StatusResponse); + rpc Import(ImportRequest) returns (ImportResponse); + rpc ResolveSizing(ResolveSizingRequest) returns (ResolveSizingResponse); + rpc BootstrapStateBackend(BootstrapStateBackendRequest) returns (BootstrapStateBackendResponse); +} + +// ───────────────────────────────────────────────────────────────────────────── +// OPTIONAL services — providers register only the services they implement. +// wfctl checks at handle-open which optional services are registered via +// the existing ContractRegistry RPC. The absence of a registration is the +// negative signal; there is no NotSupported field on any optional response. +// ───────────────────────────────────────────────────────────────────────────── +service IaCProviderEnumerator { + rpc EnumerateAll(EnumerateAllRequest) returns (EnumerateAllResponse); + rpc EnumerateByTag(EnumerateByTagRequest) returns (EnumerateByTagResponse); +} + +service IaCProviderDriftDetector { + rpc DetectDrift(DetectDriftRequest) returns (DetectDriftResponse); + rpc DetectDriftWithSpecs(DetectDriftWithSpecsRequest) returns (DetectDriftWithSpecsResponse); +} + +service IaCProviderCredentialRevoker { + rpc RevokeProviderCredential(RevokeProviderCredentialRequest) returns (RevokeProviderCredentialResponse); +} + +service IaCProviderMigrationRepairer { + rpc RepairDirtyMigration(RepairDirtyMigrationRequest) returns (RepairDirtyMigrationResponse); +} + +service IaCProviderValidator { + rpc ValidatePlan(ValidatePlanRequest) returns (ValidatePlanResponse); +} + +service IaCProviderDriftConfigDetector { + rpc DetectDriftConfig(DetectDriftConfigRequest) returns (DetectDriftConfigResponse); +} + +// ───────────────────────────────────────────────────────────────────────────── +// ResourceDriver — separate gRPC service for per-resource-type CRUD dispatch. +// The driver instance is identified by (resource_type) carried on every RPC. +// ───────────────────────────────────────────────────────────────────────────── +service ResourceDriver { + rpc Create(ResourceCreateRequest) returns (ResourceCreateResponse); + rpc Read(ResourceReadRequest) returns (ResourceReadResponse); + rpc Update(ResourceUpdateRequest) returns (ResourceUpdateResponse); + rpc Delete(ResourceDeleteRequest) returns (ResourceDeleteResponse); + rpc Diff(ResourceDiffRequest) returns (ResourceDiffResponse); + rpc Scale(ResourceScaleRequest) returns (ResourceScaleResponse); + rpc HealthCheck(ResourceHealthCheckRequest) returns (ResourceHealthCheckResponse); + rpc SensitiveKeys(SensitiveKeysRequest) returns (SensitiveKeysResponse); + rpc Troubleshoot(TroubleshootRequest) returns (TroubleshootResponse); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Common typed messages. +// +// JSON-bytes fields (config_json, outputs_json, applied_config_json, +// old_json, new_json) carry provider-specific free-form payloads that +// cannot be statically typed at the engine boundary. They are the +// strict-contract replacement for *structpb.Struct: the plugin owns +// json.Marshal/Unmarshal directly, eliminating the structpb conversion +// surface that previously dropped map[string]bool entries silently +// (T3.9 runtime-launch-validation finding). +// ───────────────────────────────────────────────────────────────────────────── + +// ResourceSpec mirrors interfaces.ResourceSpec. +message ResourceSpec { + string name = 1; + string type = 2; + // config_json is a JSON-encoded map[string]any of provider-specific + // configuration. Plugins parse it with encoding/json. + bytes config_json = 3; + string size = 4; // interfaces.Size string ("xs","s","m","l","xl") + ResourceHints hints = 5; + repeated string depends_on = 6; +} + +// ResourceRef mirrors interfaces.ResourceRef. +message ResourceRef { + string name = 1; + string type = 2; + string provider_id = 3; +} + +// ResourceHints mirrors interfaces.ResourceHints. +message ResourceHints { + string cpu = 1; + string memory = 2; + string storage = 3; +} + +// ProviderSizing mirrors interfaces.ProviderSizing. +message ProviderSizing { + string instance_type = 1; + bytes specs_json = 2; // JSON-encoded map[string]any of provider-specific specs +} + +// IaCCapabilityDeclaration mirrors interfaces.IaCCapabilityDeclaration. +message IaCCapabilityDeclaration { + string resource_type = 1; + int32 tier = 2; + repeated string operations = 3; +} + +// ResourceState mirrors interfaces.ResourceState. The on-disk JSON state +// file format is unchanged across the cutover (per design §State-file +// compat invariant); this proto carries the in-flight RPC representation. +message ResourceState { + string id = 1; + string name = 2; + string type = 3; + string provider = 4; + string provider_ref = 5; + string provider_id = 6; + string config_hash = 7; + // applied_config_json is the JSON-encoded map[string]any. + bytes applied_config_json = 8; + // applied_config_source: "" | "apply" | "adoption" (provenance discriminator). + string applied_config_source = 9; + // outputs_json is the JSON-encoded map[string]any. + bytes outputs_json = 10; + repeated string dependencies = 11; + google.protobuf.Timestamp created_at = 12; + google.protobuf.Timestamp updated_at = 13; + google.protobuf.Timestamp last_drift_check = 14; +} + +// ResourceOutput mirrors interfaces.ResourceOutput. The sensitive map is +// typed map per the design — the structpb roundtrip that +// previously dropped this map silently is eliminated. +message ResourceOutput { + string name = 1; + string type = 2; + string provider_id = 3; + // outputs_json is the JSON-encoded map[string]any of provider-emitted + // fields (IPs, endpoints, connection strings, etc.). + bytes outputs_json = 4; + map sensitive = 5; + string status = 6; +} + +// ResourceStatus mirrors interfaces.ResourceStatus. +message ResourceStatus { + string name = 1; + string type = 2; + string provider_id = 3; + string status = 4; // running | stopped | degraded | unknown + bytes outputs_json = 5; +} + +// FieldChange mirrors interfaces.FieldChange. +message FieldChange { + string path = 1; + // old_json / new_json carry arbitrary scalar/map/list values JSON-encoded. + bytes old_json = 2; + bytes new_json = 3; + bool force_new = 4; +} + +// DiffResult mirrors interfaces.DiffResult. +message DiffResult { + bool needs_update = 1; + bool needs_replace = 2; + repeated FieldChange changes = 3; +} + +// DriftClass mirrors interfaces.DriftClass. Wire-stable string-equivalent +// enum: zero value is UNKNOWN (matches Go's "" zero value), with explicit +// IN_SYNC / GHOST / CONFIG variants. +enum DriftClass { + DRIFT_CLASS_UNKNOWN = 0; + DRIFT_CLASS_IN_SYNC = 1; + DRIFT_CLASS_GHOST = 2; + DRIFT_CLASS_CONFIG = 3; +} + +// DriftResult mirrors interfaces.DriftResult. +message DriftResult { + string name = 1; + string type = 2; + bool drifted = 3; + DriftClass class = 4; + bytes expected_json = 5; // JSON-encoded map[string]any + bytes actual_json = 6; // JSON-encoded map[string]any + repeated string fields = 7; +} + +// DriftEntry mirrors interfaces.DriftEntry. +message DriftEntry { + string name = 1; + string plan_fingerprint = 2; + string apply_fingerprint = 3; +} + +// HealthResult mirrors interfaces.HealthResult. +message HealthResult { + bool healthy = 1; + string message = 2; +} + +// Diagnostic mirrors interfaces.Diagnostic (Troubleshooter type). +message Diagnostic { + string id = 1; + string phase = 2; + string cause = 3; + google.protobuf.Timestamp at = 4; + string detail = 5; +} + +// PlanDiagnosticSeverity mirrors interfaces.PlanDiagnosticSeverity. +// Wire ordering matches the Go iota: INFO=0, WARNING=1, ERROR=2. +enum PlanDiagnosticSeverity { + PLAN_DIAGNOSTIC_INFO = 0; + PLAN_DIAGNOSTIC_WARNING = 1; + PLAN_DIAGNOSTIC_ERROR = 2; +} + +// PlanDiagnostic mirrors interfaces.PlanDiagnostic. +message PlanDiagnostic { + PlanDiagnosticSeverity severity = 1; + string resource = 2; + string field = 3; + string message = 4; +} + +// PlanAction mirrors interfaces.PlanAction. +message PlanAction { + string action = 1; // create | update | replace | delete + ResourceSpec resource = 2; + ResourceState current = 3; + repeated FieldChange changes = 4; + string resolved_config_hash = 5; +} + +// IaCPlan mirrors interfaces.IaCPlan. +message IaCPlan { + string id = 1; + repeated PlanAction actions = 2; + google.protobuf.Timestamp created_at = 3; + string desired_hash = 4; + int32 schema_version = 5; + map input_snapshot = 6; +} + +// ActionError mirrors interfaces.ActionError. +message ActionError { + string resource = 1; + string action = 2; + string error = 3; +} + +// ApplyResult mirrors interfaces.ApplyResult. +message ApplyResult { + string plan_id = 1; + repeated ResourceOutput resources = 2; + repeated ActionError errors = 3; + map initial_input_snapshot = 4; + repeated DriftEntry input_drift_report = 5; + map replace_id_map = 6; +} + +// DestroyResult mirrors interfaces.DestroyResult. +message DestroyResult { + repeated string destroyed = 1; + repeated ActionError errors = 2; +} + +// BootstrapResult mirrors interfaces.BootstrapResult. +message BootstrapResult { + string bucket = 1; + string region = 2; + string endpoint = 3; + map env_vars = 4; +} + +// MigrationRepairRequest mirrors interfaces.MigrationRepairRequest. +message MigrationRepairRequest { + string app_resource_name = 1; + string database_resource_name = 2; + string job_image = 3; + string source_dir = 4; + string expected_dirty_version = 5; + string force_version = 6; + bool then_up = 7; + bool up_if_clean = 8; + // confirm_force MUST equal interfaces.MigrationRepairConfirmation + // ("FORCE_MIGRATION_METADATA"); the plugin re-validates server-side. + string confirm_force = 9; + map env = 10; + int32 timeout_seconds = 11; +} + +// MigrationRepairResult mirrors interfaces.MigrationRepairResult. +message MigrationRepairResult { + string provider_job_id = 1; + // status is one of MigrationRepairStatusSucceeded / Failed / + // ApprovalRequired / Unsupported (interfaces/migration_repair.go). + string status = 2; + repeated string applied = 3; + string logs = 4; + repeated Diagnostic diagnostics = 5; +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderRequired request/response messages. +// ───────────────────────────────────────────────────────────────────────────── + +message InitializeRequest { + // config_json is the JSON-encoded provider-config map[string]any. + bytes config_json = 1; +} +message InitializeResponse {} + +message NameRequest {} +message NameResponse { + string name = 1; +} + +message VersionRequest {} +message VersionResponse { + string version = 1; +} + +message CapabilitiesRequest {} +message CapabilitiesResponse { + repeated IaCCapabilityDeclaration capabilities = 1; +} + +message PlanRequest { + repeated ResourceSpec desired = 1; + repeated ResourceState current = 2; +} +message PlanResponse { + IaCPlan plan = 1; +} + +message ApplyRequest { + IaCPlan plan = 1; +} +message ApplyResponse { + ApplyResult result = 1; +} + +message DestroyRequest { + repeated ResourceRef refs = 1; +} +message DestroyResponse { + DestroyResult result = 1; +} + +message StatusRequest { + repeated ResourceRef refs = 1; +} +message StatusResponse { + repeated ResourceStatus statuses = 1; +} + +message ImportRequest { + string provider_id = 1; + string resource_type = 2; +} +message ImportResponse { + ResourceState state = 1; +} + +message ResolveSizingRequest { + string resource_type = 1; + string size = 2; // interfaces.Size string + ResourceHints hints = 3; +} +message ResolveSizingResponse { + ProviderSizing sizing = 1; +} + +message BootstrapStateBackendRequest { + // config_json is the JSON-encoded iac.state module config map[string]any. + bytes config_json = 1; +} +message BootstrapStateBackendResponse { + BootstrapResult result = 1; +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderEnumerator messages. +// ───────────────────────────────────────────────────────────────────────────── +message EnumerateAllRequest { + string resource_type = 1; +} +message EnumerateAllResponse { + repeated ResourceOutput outputs = 1; +} + +message EnumerateByTagRequest { + string tag = 1; +} +message EnumerateByTagResponse { + repeated ResourceRef refs = 1; +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderDriftDetector messages. +// ───────────────────────────────────────────────────────────────────────────── +message DetectDriftRequest { + repeated ResourceRef refs = 1; +} +message DetectDriftResponse { + repeated DriftResult drifts = 1; +} + +message DetectDriftWithSpecsRequest { + repeated ResourceRef refs = 1; + // specs is keyed by ResourceRef.Name (matches ResourceState.Name) per the + // Go DriftConfigDetector.DetectDriftWithSpecs contract. + map specs = 2; +} +message DetectDriftWithSpecsResponse { + repeated DriftResult drifts = 1; +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderCredentialRevoker messages. +// ───────────────────────────────────────────────────────────────────────────── +message RevokeProviderCredentialRequest { + // source is the provider_credential source string (e.g. "digitalocean.spaces"). + string source = 1; + // credential_id is the provider-specific identifier of the OLD credential. + string credential_id = 2; +} +message RevokeProviderCredentialResponse {} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderMigrationRepairer messages. +// ───────────────────────────────────────────────────────────────────────────── +message RepairDirtyMigrationRequest { + MigrationRepairRequest request = 1; +} +message RepairDirtyMigrationResponse { + MigrationRepairResult result = 1; +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderValidator messages. +// ───────────────────────────────────────────────────────────────────────────── +message ValidatePlanRequest { + IaCPlan plan = 1; +} +message ValidatePlanResponse { + repeated PlanDiagnostic diagnostics = 1; +} + +// ───────────────────────────────────────────────────────────────────────────── +// IaCProviderDriftConfigDetector messages. +// Mirrors the existing interfaces.DriftConfigDetector.DetectDriftWithSpecs +// contract: refs + per-ref applied-config specs → drift classifications. +// Carried as a separate optional service per design §Optional services. +// ───────────────────────────────────────────────────────────────────────────── +message DetectDriftConfigRequest { + repeated ResourceRef refs = 1; + map specs = 2; +} +message DetectDriftConfigResponse { + repeated DriftResult drifts = 1; +} + +// ───────────────────────────────────────────────────────────────────────────── +// ResourceDriver request/response messages. +// Each request carries resource_type so a single ResourceDriver server can +// dispatch to the per-type driver implementation (matches DO plugin's +// 14-driver type-routing pattern in Task 11). +// ───────────────────────────────────────────────────────────────────────────── +message ResourceCreateRequest { + string resource_type = 1; + ResourceSpec spec = 2; +} +message ResourceCreateResponse { + ResourceOutput output = 1; +} + +message ResourceReadRequest { + string resource_type = 1; + ResourceRef ref = 2; +} +message ResourceReadResponse { + ResourceOutput output = 1; +} + +message ResourceUpdateRequest { + string resource_type = 1; + ResourceRef ref = 2; + ResourceSpec spec = 3; +} +message ResourceUpdateResponse { + ResourceOutput output = 1; +} + +message ResourceDeleteRequest { + string resource_type = 1; + ResourceRef ref = 2; +} +message ResourceDeleteResponse {} + +message ResourceDiffRequest { + string resource_type = 1; + ResourceSpec desired = 2; + ResourceOutput current = 3; +} +message ResourceDiffResponse { + DiffResult result = 1; +} + +message ResourceScaleRequest { + string resource_type = 1; + ResourceRef ref = 2; + int32 replicas = 3; +} +message ResourceScaleResponse { + ResourceOutput output = 1; +} + +message ResourceHealthCheckRequest { + string resource_type = 1; + ResourceRef ref = 2; +} +message ResourceHealthCheckResponse { + HealthResult result = 1; +} + +message SensitiveKeysRequest { + string resource_type = 1; +} +message SensitiveKeysResponse { + repeated string keys = 1; +} + +message TroubleshootRequest { + string resource_type = 1; + ResourceRef ref = 2; + string failure_msg = 3; +} +message TroubleshootResponse { + repeated Diagnostic diagnostics = 1; +} diff --git a/plugin/external/proto/iac_grpc.pb.go b/plugin/external/proto/iac_grpc.pb.go new file mode 100644 index 00000000..7b8a99ea --- /dev/null +++ b/plugin/external/proto/iac_grpc.pb.go @@ -0,0 +1,1649 @@ +// iac.proto — typed gRPC contract for IaCProvider + ResourceDriver plugins. +// +// Design: docs/plans/2026-05-10-strict-contracts-force-cutover-design.md +// Plan: docs/plans/2026-05-10-strict-contracts-force-cutover.md (Task 3) +// +// Hard invariants (per cycle 4 §Acceptance criteria): +// - NO google.protobuf.Struct, NO google.protobuf.Any used in any message. +// - Free-form per-resource Config / Outputs payloads cross the wire as +// bytes _json, JSON-encoded by the plugin/host. The plugin owns +// the serialization shape; the proto layer carries opaque bytes. +// - ResourceOutput.sensitive uses typed map (NOT structpb). +// - REQUIRED service: every method must be implemented by every plugin. +// Compile fails on the SDK type-assert if a method is missing. +// - OPTIONAL services: providers register only the services they support. +// Absence of registration IS the negative signal — no NotSupported flag. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.6.1 +// - protoc v7.34.1 +// source: plugin/external/proto/iac.proto + +package proto + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + IaCProviderRequired_Initialize_FullMethodName = "/workflow.plugin.external.iac.IaCProviderRequired/Initialize" + IaCProviderRequired_Name_FullMethodName = "/workflow.plugin.external.iac.IaCProviderRequired/Name" + IaCProviderRequired_Version_FullMethodName = "/workflow.plugin.external.iac.IaCProviderRequired/Version" + IaCProviderRequired_Capabilities_FullMethodName = "/workflow.plugin.external.iac.IaCProviderRequired/Capabilities" + IaCProviderRequired_Plan_FullMethodName = "/workflow.plugin.external.iac.IaCProviderRequired/Plan" + IaCProviderRequired_Apply_FullMethodName = "/workflow.plugin.external.iac.IaCProviderRequired/Apply" + IaCProviderRequired_Destroy_FullMethodName = "/workflow.plugin.external.iac.IaCProviderRequired/Destroy" + IaCProviderRequired_Status_FullMethodName = "/workflow.plugin.external.iac.IaCProviderRequired/Status" + IaCProviderRequired_Import_FullMethodName = "/workflow.plugin.external.iac.IaCProviderRequired/Import" + IaCProviderRequired_ResolveSizing_FullMethodName = "/workflow.plugin.external.iac.IaCProviderRequired/ResolveSizing" + IaCProviderRequired_BootstrapStateBackend_FullMethodName = "/workflow.plugin.external.iac.IaCProviderRequired/BootstrapStateBackend" +) + +// IaCProviderRequiredClient is the client API for IaCProviderRequired service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// ───────────────────────────────────────────────────────────────────────────── +// REQUIRED service — every IaC provider MUST implement every RPC. +// Go compiler enforces full interface satisfaction at the SDK type-assert. +// ───────────────────────────────────────────────────────────────────────────── +type IaCProviderRequiredClient interface { + Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*InitializeResponse, error) + Name(ctx context.Context, in *NameRequest, opts ...grpc.CallOption) (*NameResponse, error) + Version(ctx context.Context, in *VersionRequest, opts ...grpc.CallOption) (*VersionResponse, error) + Capabilities(ctx context.Context, in *CapabilitiesRequest, opts ...grpc.CallOption) (*CapabilitiesResponse, error) + Plan(ctx context.Context, in *PlanRequest, opts ...grpc.CallOption) (*PlanResponse, error) + Apply(ctx context.Context, in *ApplyRequest, opts ...grpc.CallOption) (*ApplyResponse, error) + Destroy(ctx context.Context, in *DestroyRequest, opts ...grpc.CallOption) (*DestroyResponse, error) + Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) + Import(ctx context.Context, in *ImportRequest, opts ...grpc.CallOption) (*ImportResponse, error) + ResolveSizing(ctx context.Context, in *ResolveSizingRequest, opts ...grpc.CallOption) (*ResolveSizingResponse, error) + BootstrapStateBackend(ctx context.Context, in *BootstrapStateBackendRequest, opts ...grpc.CallOption) (*BootstrapStateBackendResponse, error) +} + +type iaCProviderRequiredClient struct { + cc grpc.ClientConnInterface +} + +func NewIaCProviderRequiredClient(cc grpc.ClientConnInterface) IaCProviderRequiredClient { + return &iaCProviderRequiredClient{cc} +} + +func (c *iaCProviderRequiredClient) Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*InitializeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(InitializeResponse) + err := c.cc.Invoke(ctx, IaCProviderRequired_Initialize_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderRequiredClient) Name(ctx context.Context, in *NameRequest, opts ...grpc.CallOption) (*NameResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(NameResponse) + err := c.cc.Invoke(ctx, IaCProviderRequired_Name_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderRequiredClient) Version(ctx context.Context, in *VersionRequest, opts ...grpc.CallOption) (*VersionResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(VersionResponse) + err := c.cc.Invoke(ctx, IaCProviderRequired_Version_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderRequiredClient) Capabilities(ctx context.Context, in *CapabilitiesRequest, opts ...grpc.CallOption) (*CapabilitiesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CapabilitiesResponse) + err := c.cc.Invoke(ctx, IaCProviderRequired_Capabilities_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderRequiredClient) Plan(ctx context.Context, in *PlanRequest, opts ...grpc.CallOption) (*PlanResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(PlanResponse) + err := c.cc.Invoke(ctx, IaCProviderRequired_Plan_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderRequiredClient) Apply(ctx context.Context, in *ApplyRequest, opts ...grpc.CallOption) (*ApplyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ApplyResponse) + err := c.cc.Invoke(ctx, IaCProviderRequired_Apply_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderRequiredClient) Destroy(ctx context.Context, in *DestroyRequest, opts ...grpc.CallOption) (*DestroyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DestroyResponse) + err := c.cc.Invoke(ctx, IaCProviderRequired_Destroy_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderRequiredClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(StatusResponse) + err := c.cc.Invoke(ctx, IaCProviderRequired_Status_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderRequiredClient) Import(ctx context.Context, in *ImportRequest, opts ...grpc.CallOption) (*ImportResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ImportResponse) + err := c.cc.Invoke(ctx, IaCProviderRequired_Import_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderRequiredClient) ResolveSizing(ctx context.Context, in *ResolveSizingRequest, opts ...grpc.CallOption) (*ResolveSizingResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResolveSizingResponse) + err := c.cc.Invoke(ctx, IaCProviderRequired_ResolveSizing_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderRequiredClient) BootstrapStateBackend(ctx context.Context, in *BootstrapStateBackendRequest, opts ...grpc.CallOption) (*BootstrapStateBackendResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(BootstrapStateBackendResponse) + err := c.cc.Invoke(ctx, IaCProviderRequired_BootstrapStateBackend_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IaCProviderRequiredServer is the server API for IaCProviderRequired service. +// All implementations must embed UnimplementedIaCProviderRequiredServer +// for forward compatibility. +// +// ───────────────────────────────────────────────────────────────────────────── +// REQUIRED service — every IaC provider MUST implement every RPC. +// Go compiler enforces full interface satisfaction at the SDK type-assert. +// ───────────────────────────────────────────────────────────────────────────── +type IaCProviderRequiredServer interface { + Initialize(context.Context, *InitializeRequest) (*InitializeResponse, error) + Name(context.Context, *NameRequest) (*NameResponse, error) + Version(context.Context, *VersionRequest) (*VersionResponse, error) + Capabilities(context.Context, *CapabilitiesRequest) (*CapabilitiesResponse, error) + Plan(context.Context, *PlanRequest) (*PlanResponse, error) + Apply(context.Context, *ApplyRequest) (*ApplyResponse, error) + Destroy(context.Context, *DestroyRequest) (*DestroyResponse, error) + Status(context.Context, *StatusRequest) (*StatusResponse, error) + Import(context.Context, *ImportRequest) (*ImportResponse, error) + ResolveSizing(context.Context, *ResolveSizingRequest) (*ResolveSizingResponse, error) + BootstrapStateBackend(context.Context, *BootstrapStateBackendRequest) (*BootstrapStateBackendResponse, error) + mustEmbedUnimplementedIaCProviderRequiredServer() +} + +// UnimplementedIaCProviderRequiredServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedIaCProviderRequiredServer struct{} + +func (UnimplementedIaCProviderRequiredServer) Initialize(context.Context, *InitializeRequest) (*InitializeResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Initialize not implemented") +} +func (UnimplementedIaCProviderRequiredServer) Name(context.Context, *NameRequest) (*NameResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Name not implemented") +} +func (UnimplementedIaCProviderRequiredServer) Version(context.Context, *VersionRequest) (*VersionResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Version not implemented") +} +func (UnimplementedIaCProviderRequiredServer) Capabilities(context.Context, *CapabilitiesRequest) (*CapabilitiesResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Capabilities not implemented") +} +func (UnimplementedIaCProviderRequiredServer) Plan(context.Context, *PlanRequest) (*PlanResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Plan not implemented") +} +func (UnimplementedIaCProviderRequiredServer) Apply(context.Context, *ApplyRequest) (*ApplyResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Apply not implemented") +} +func (UnimplementedIaCProviderRequiredServer) Destroy(context.Context, *DestroyRequest) (*DestroyResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Destroy not implemented") +} +func (UnimplementedIaCProviderRequiredServer) Status(context.Context, *StatusRequest) (*StatusResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Status not implemented") +} +func (UnimplementedIaCProviderRequiredServer) Import(context.Context, *ImportRequest) (*ImportResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Import not implemented") +} +func (UnimplementedIaCProviderRequiredServer) ResolveSizing(context.Context, *ResolveSizingRequest) (*ResolveSizingResponse, error) { + return nil, status.Error(codes.Unimplemented, "method ResolveSizing not implemented") +} +func (UnimplementedIaCProviderRequiredServer) BootstrapStateBackend(context.Context, *BootstrapStateBackendRequest) (*BootstrapStateBackendResponse, error) { + return nil, status.Error(codes.Unimplemented, "method BootstrapStateBackend not implemented") +} +func (UnimplementedIaCProviderRequiredServer) mustEmbedUnimplementedIaCProviderRequiredServer() {} +func (UnimplementedIaCProviderRequiredServer) testEmbeddedByValue() {} + +// UnsafeIaCProviderRequiredServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to IaCProviderRequiredServer will +// result in compilation errors. +type UnsafeIaCProviderRequiredServer interface { + mustEmbedUnimplementedIaCProviderRequiredServer() +} + +func RegisterIaCProviderRequiredServer(s grpc.ServiceRegistrar, srv IaCProviderRequiredServer) { + // If the following call panics, it indicates UnimplementedIaCProviderRequiredServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&IaCProviderRequired_ServiceDesc, srv) +} + +func _IaCProviderRequired_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InitializeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderRequiredServer).Initialize(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderRequired_Initialize_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderRequiredServer).Initialize(ctx, req.(*InitializeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderRequired_Name_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NameRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderRequiredServer).Name(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderRequired_Name_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderRequiredServer).Name(ctx, req.(*NameRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderRequired_Version_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(VersionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderRequiredServer).Version(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderRequired_Version_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderRequiredServer).Version(ctx, req.(*VersionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderRequired_Capabilities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CapabilitiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderRequiredServer).Capabilities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderRequired_Capabilities_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderRequiredServer).Capabilities(ctx, req.(*CapabilitiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderRequired_Plan_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PlanRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderRequiredServer).Plan(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderRequired_Plan_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderRequiredServer).Plan(ctx, req.(*PlanRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderRequired_Apply_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ApplyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderRequiredServer).Apply(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderRequired_Apply_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderRequiredServer).Apply(ctx, req.(*ApplyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderRequired_Destroy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DestroyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderRequiredServer).Destroy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderRequired_Destroy_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderRequiredServer).Destroy(ctx, req.(*DestroyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderRequired_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderRequiredServer).Status(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderRequired_Status_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderRequiredServer).Status(ctx, req.(*StatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderRequired_Import_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ImportRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderRequiredServer).Import(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderRequired_Import_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderRequiredServer).Import(ctx, req.(*ImportRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderRequired_ResolveSizing_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResolveSizingRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderRequiredServer).ResolveSizing(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderRequired_ResolveSizing_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderRequiredServer).ResolveSizing(ctx, req.(*ResolveSizingRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderRequired_BootstrapStateBackend_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BootstrapStateBackendRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderRequiredServer).BootstrapStateBackend(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderRequired_BootstrapStateBackend_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderRequiredServer).BootstrapStateBackend(ctx, req.(*BootstrapStateBackendRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// IaCProviderRequired_ServiceDesc is the grpc.ServiceDesc for IaCProviderRequired service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var IaCProviderRequired_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "workflow.plugin.external.iac.IaCProviderRequired", + HandlerType: (*IaCProviderRequiredServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Initialize", + Handler: _IaCProviderRequired_Initialize_Handler, + }, + { + MethodName: "Name", + Handler: _IaCProviderRequired_Name_Handler, + }, + { + MethodName: "Version", + Handler: _IaCProviderRequired_Version_Handler, + }, + { + MethodName: "Capabilities", + Handler: _IaCProviderRequired_Capabilities_Handler, + }, + { + MethodName: "Plan", + Handler: _IaCProviderRequired_Plan_Handler, + }, + { + MethodName: "Apply", + Handler: _IaCProviderRequired_Apply_Handler, + }, + { + MethodName: "Destroy", + Handler: _IaCProviderRequired_Destroy_Handler, + }, + { + MethodName: "Status", + Handler: _IaCProviderRequired_Status_Handler, + }, + { + MethodName: "Import", + Handler: _IaCProviderRequired_Import_Handler, + }, + { + MethodName: "ResolveSizing", + Handler: _IaCProviderRequired_ResolveSizing_Handler, + }, + { + MethodName: "BootstrapStateBackend", + Handler: _IaCProviderRequired_BootstrapStateBackend_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "plugin/external/proto/iac.proto", +} + +const ( + IaCProviderEnumerator_EnumerateAll_FullMethodName = "/workflow.plugin.external.iac.IaCProviderEnumerator/EnumerateAll" + IaCProviderEnumerator_EnumerateByTag_FullMethodName = "/workflow.plugin.external.iac.IaCProviderEnumerator/EnumerateByTag" +) + +// IaCProviderEnumeratorClient is the client API for IaCProviderEnumerator service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// ───────────────────────────────────────────────────────────────────────────── +// OPTIONAL services — providers register only the services they implement. +// wfctl checks at handle-open which optional services are registered via +// the existing ContractRegistry RPC. The absence of a registration is the +// negative signal; there is no NotSupported field on any optional response. +// ───────────────────────────────────────────────────────────────────────────── +type IaCProviderEnumeratorClient interface { + EnumerateAll(ctx context.Context, in *EnumerateAllRequest, opts ...grpc.CallOption) (*EnumerateAllResponse, error) + EnumerateByTag(ctx context.Context, in *EnumerateByTagRequest, opts ...grpc.CallOption) (*EnumerateByTagResponse, error) +} + +type iaCProviderEnumeratorClient struct { + cc grpc.ClientConnInterface +} + +func NewIaCProviderEnumeratorClient(cc grpc.ClientConnInterface) IaCProviderEnumeratorClient { + return &iaCProviderEnumeratorClient{cc} +} + +func (c *iaCProviderEnumeratorClient) EnumerateAll(ctx context.Context, in *EnumerateAllRequest, opts ...grpc.CallOption) (*EnumerateAllResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(EnumerateAllResponse) + err := c.cc.Invoke(ctx, IaCProviderEnumerator_EnumerateAll_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderEnumeratorClient) EnumerateByTag(ctx context.Context, in *EnumerateByTagRequest, opts ...grpc.CallOption) (*EnumerateByTagResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(EnumerateByTagResponse) + err := c.cc.Invoke(ctx, IaCProviderEnumerator_EnumerateByTag_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IaCProviderEnumeratorServer is the server API for IaCProviderEnumerator service. +// All implementations must embed UnimplementedIaCProviderEnumeratorServer +// for forward compatibility. +// +// ───────────────────────────────────────────────────────────────────────────── +// OPTIONAL services — providers register only the services they implement. +// wfctl checks at handle-open which optional services are registered via +// the existing ContractRegistry RPC. The absence of a registration is the +// negative signal; there is no NotSupported field on any optional response. +// ───────────────────────────────────────────────────────────────────────────── +type IaCProviderEnumeratorServer interface { + EnumerateAll(context.Context, *EnumerateAllRequest) (*EnumerateAllResponse, error) + EnumerateByTag(context.Context, *EnumerateByTagRequest) (*EnumerateByTagResponse, error) + mustEmbedUnimplementedIaCProviderEnumeratorServer() +} + +// UnimplementedIaCProviderEnumeratorServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedIaCProviderEnumeratorServer struct{} + +func (UnimplementedIaCProviderEnumeratorServer) EnumerateAll(context.Context, *EnumerateAllRequest) (*EnumerateAllResponse, error) { + return nil, status.Error(codes.Unimplemented, "method EnumerateAll not implemented") +} +func (UnimplementedIaCProviderEnumeratorServer) EnumerateByTag(context.Context, *EnumerateByTagRequest) (*EnumerateByTagResponse, error) { + return nil, status.Error(codes.Unimplemented, "method EnumerateByTag not implemented") +} +func (UnimplementedIaCProviderEnumeratorServer) mustEmbedUnimplementedIaCProviderEnumeratorServer() {} +func (UnimplementedIaCProviderEnumeratorServer) testEmbeddedByValue() {} + +// UnsafeIaCProviderEnumeratorServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to IaCProviderEnumeratorServer will +// result in compilation errors. +type UnsafeIaCProviderEnumeratorServer interface { + mustEmbedUnimplementedIaCProviderEnumeratorServer() +} + +func RegisterIaCProviderEnumeratorServer(s grpc.ServiceRegistrar, srv IaCProviderEnumeratorServer) { + // If the following call panics, it indicates UnimplementedIaCProviderEnumeratorServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&IaCProviderEnumerator_ServiceDesc, srv) +} + +func _IaCProviderEnumerator_EnumerateAll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EnumerateAllRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderEnumeratorServer).EnumerateAll(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderEnumerator_EnumerateAll_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderEnumeratorServer).EnumerateAll(ctx, req.(*EnumerateAllRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderEnumerator_EnumerateByTag_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EnumerateByTagRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderEnumeratorServer).EnumerateByTag(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderEnumerator_EnumerateByTag_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderEnumeratorServer).EnumerateByTag(ctx, req.(*EnumerateByTagRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// IaCProviderEnumerator_ServiceDesc is the grpc.ServiceDesc for IaCProviderEnumerator service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var IaCProviderEnumerator_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "workflow.plugin.external.iac.IaCProviderEnumerator", + HandlerType: (*IaCProviderEnumeratorServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "EnumerateAll", + Handler: _IaCProviderEnumerator_EnumerateAll_Handler, + }, + { + MethodName: "EnumerateByTag", + Handler: _IaCProviderEnumerator_EnumerateByTag_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "plugin/external/proto/iac.proto", +} + +const ( + IaCProviderDriftDetector_DetectDrift_FullMethodName = "/workflow.plugin.external.iac.IaCProviderDriftDetector/DetectDrift" + IaCProviderDriftDetector_DetectDriftWithSpecs_FullMethodName = "/workflow.plugin.external.iac.IaCProviderDriftDetector/DetectDriftWithSpecs" +) + +// IaCProviderDriftDetectorClient is the client API for IaCProviderDriftDetector service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type IaCProviderDriftDetectorClient interface { + DetectDrift(ctx context.Context, in *DetectDriftRequest, opts ...grpc.CallOption) (*DetectDriftResponse, error) + DetectDriftWithSpecs(ctx context.Context, in *DetectDriftWithSpecsRequest, opts ...grpc.CallOption) (*DetectDriftWithSpecsResponse, error) +} + +type iaCProviderDriftDetectorClient struct { + cc grpc.ClientConnInterface +} + +func NewIaCProviderDriftDetectorClient(cc grpc.ClientConnInterface) IaCProviderDriftDetectorClient { + return &iaCProviderDriftDetectorClient{cc} +} + +func (c *iaCProviderDriftDetectorClient) DetectDrift(ctx context.Context, in *DetectDriftRequest, opts ...grpc.CallOption) (*DetectDriftResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DetectDriftResponse) + err := c.cc.Invoke(ctx, IaCProviderDriftDetector_DetectDrift_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *iaCProviderDriftDetectorClient) DetectDriftWithSpecs(ctx context.Context, in *DetectDriftWithSpecsRequest, opts ...grpc.CallOption) (*DetectDriftWithSpecsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DetectDriftWithSpecsResponse) + err := c.cc.Invoke(ctx, IaCProviderDriftDetector_DetectDriftWithSpecs_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IaCProviderDriftDetectorServer is the server API for IaCProviderDriftDetector service. +// All implementations must embed UnimplementedIaCProviderDriftDetectorServer +// for forward compatibility. +type IaCProviderDriftDetectorServer interface { + DetectDrift(context.Context, *DetectDriftRequest) (*DetectDriftResponse, error) + DetectDriftWithSpecs(context.Context, *DetectDriftWithSpecsRequest) (*DetectDriftWithSpecsResponse, error) + mustEmbedUnimplementedIaCProviderDriftDetectorServer() +} + +// UnimplementedIaCProviderDriftDetectorServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedIaCProviderDriftDetectorServer struct{} + +func (UnimplementedIaCProviderDriftDetectorServer) DetectDrift(context.Context, *DetectDriftRequest) (*DetectDriftResponse, error) { + return nil, status.Error(codes.Unimplemented, "method DetectDrift not implemented") +} +func (UnimplementedIaCProviderDriftDetectorServer) DetectDriftWithSpecs(context.Context, *DetectDriftWithSpecsRequest) (*DetectDriftWithSpecsResponse, error) { + return nil, status.Error(codes.Unimplemented, "method DetectDriftWithSpecs not implemented") +} +func (UnimplementedIaCProviderDriftDetectorServer) mustEmbedUnimplementedIaCProviderDriftDetectorServer() { +} +func (UnimplementedIaCProviderDriftDetectorServer) testEmbeddedByValue() {} + +// UnsafeIaCProviderDriftDetectorServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to IaCProviderDriftDetectorServer will +// result in compilation errors. +type UnsafeIaCProviderDriftDetectorServer interface { + mustEmbedUnimplementedIaCProviderDriftDetectorServer() +} + +func RegisterIaCProviderDriftDetectorServer(s grpc.ServiceRegistrar, srv IaCProviderDriftDetectorServer) { + // If the following call panics, it indicates UnimplementedIaCProviderDriftDetectorServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&IaCProviderDriftDetector_ServiceDesc, srv) +} + +func _IaCProviderDriftDetector_DetectDrift_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DetectDriftRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderDriftDetectorServer).DetectDrift(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderDriftDetector_DetectDrift_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderDriftDetectorServer).DetectDrift(ctx, req.(*DetectDriftRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IaCProviderDriftDetector_DetectDriftWithSpecs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DetectDriftWithSpecsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderDriftDetectorServer).DetectDriftWithSpecs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderDriftDetector_DetectDriftWithSpecs_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderDriftDetectorServer).DetectDriftWithSpecs(ctx, req.(*DetectDriftWithSpecsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// IaCProviderDriftDetector_ServiceDesc is the grpc.ServiceDesc for IaCProviderDriftDetector service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var IaCProviderDriftDetector_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "workflow.plugin.external.iac.IaCProviderDriftDetector", + HandlerType: (*IaCProviderDriftDetectorServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "DetectDrift", + Handler: _IaCProviderDriftDetector_DetectDrift_Handler, + }, + { + MethodName: "DetectDriftWithSpecs", + Handler: _IaCProviderDriftDetector_DetectDriftWithSpecs_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "plugin/external/proto/iac.proto", +} + +const ( + IaCProviderCredentialRevoker_RevokeProviderCredential_FullMethodName = "/workflow.plugin.external.iac.IaCProviderCredentialRevoker/RevokeProviderCredential" +) + +// IaCProviderCredentialRevokerClient is the client API for IaCProviderCredentialRevoker service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type IaCProviderCredentialRevokerClient interface { + RevokeProviderCredential(ctx context.Context, in *RevokeProviderCredentialRequest, opts ...grpc.CallOption) (*RevokeProviderCredentialResponse, error) +} + +type iaCProviderCredentialRevokerClient struct { + cc grpc.ClientConnInterface +} + +func NewIaCProviderCredentialRevokerClient(cc grpc.ClientConnInterface) IaCProviderCredentialRevokerClient { + return &iaCProviderCredentialRevokerClient{cc} +} + +func (c *iaCProviderCredentialRevokerClient) RevokeProviderCredential(ctx context.Context, in *RevokeProviderCredentialRequest, opts ...grpc.CallOption) (*RevokeProviderCredentialResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RevokeProviderCredentialResponse) + err := c.cc.Invoke(ctx, IaCProviderCredentialRevoker_RevokeProviderCredential_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IaCProviderCredentialRevokerServer is the server API for IaCProviderCredentialRevoker service. +// All implementations must embed UnimplementedIaCProviderCredentialRevokerServer +// for forward compatibility. +type IaCProviderCredentialRevokerServer interface { + RevokeProviderCredential(context.Context, *RevokeProviderCredentialRequest) (*RevokeProviderCredentialResponse, error) + mustEmbedUnimplementedIaCProviderCredentialRevokerServer() +} + +// UnimplementedIaCProviderCredentialRevokerServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedIaCProviderCredentialRevokerServer struct{} + +func (UnimplementedIaCProviderCredentialRevokerServer) RevokeProviderCredential(context.Context, *RevokeProviderCredentialRequest) (*RevokeProviderCredentialResponse, error) { + return nil, status.Error(codes.Unimplemented, "method RevokeProviderCredential not implemented") +} +func (UnimplementedIaCProviderCredentialRevokerServer) mustEmbedUnimplementedIaCProviderCredentialRevokerServer() { +} +func (UnimplementedIaCProviderCredentialRevokerServer) testEmbeddedByValue() {} + +// UnsafeIaCProviderCredentialRevokerServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to IaCProviderCredentialRevokerServer will +// result in compilation errors. +type UnsafeIaCProviderCredentialRevokerServer interface { + mustEmbedUnimplementedIaCProviderCredentialRevokerServer() +} + +func RegisterIaCProviderCredentialRevokerServer(s grpc.ServiceRegistrar, srv IaCProviderCredentialRevokerServer) { + // If the following call panics, it indicates UnimplementedIaCProviderCredentialRevokerServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&IaCProviderCredentialRevoker_ServiceDesc, srv) +} + +func _IaCProviderCredentialRevoker_RevokeProviderCredential_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RevokeProviderCredentialRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderCredentialRevokerServer).RevokeProviderCredential(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderCredentialRevoker_RevokeProviderCredential_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderCredentialRevokerServer).RevokeProviderCredential(ctx, req.(*RevokeProviderCredentialRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// IaCProviderCredentialRevoker_ServiceDesc is the grpc.ServiceDesc for IaCProviderCredentialRevoker service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var IaCProviderCredentialRevoker_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "workflow.plugin.external.iac.IaCProviderCredentialRevoker", + HandlerType: (*IaCProviderCredentialRevokerServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "RevokeProviderCredential", + Handler: _IaCProviderCredentialRevoker_RevokeProviderCredential_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "plugin/external/proto/iac.proto", +} + +const ( + IaCProviderMigrationRepairer_RepairDirtyMigration_FullMethodName = "/workflow.plugin.external.iac.IaCProviderMigrationRepairer/RepairDirtyMigration" +) + +// IaCProviderMigrationRepairerClient is the client API for IaCProviderMigrationRepairer service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type IaCProviderMigrationRepairerClient interface { + RepairDirtyMigration(ctx context.Context, in *RepairDirtyMigrationRequest, opts ...grpc.CallOption) (*RepairDirtyMigrationResponse, error) +} + +type iaCProviderMigrationRepairerClient struct { + cc grpc.ClientConnInterface +} + +func NewIaCProviderMigrationRepairerClient(cc grpc.ClientConnInterface) IaCProviderMigrationRepairerClient { + return &iaCProviderMigrationRepairerClient{cc} +} + +func (c *iaCProviderMigrationRepairerClient) RepairDirtyMigration(ctx context.Context, in *RepairDirtyMigrationRequest, opts ...grpc.CallOption) (*RepairDirtyMigrationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(RepairDirtyMigrationResponse) + err := c.cc.Invoke(ctx, IaCProviderMigrationRepairer_RepairDirtyMigration_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IaCProviderMigrationRepairerServer is the server API for IaCProviderMigrationRepairer service. +// All implementations must embed UnimplementedIaCProviderMigrationRepairerServer +// for forward compatibility. +type IaCProviderMigrationRepairerServer interface { + RepairDirtyMigration(context.Context, *RepairDirtyMigrationRequest) (*RepairDirtyMigrationResponse, error) + mustEmbedUnimplementedIaCProviderMigrationRepairerServer() +} + +// UnimplementedIaCProviderMigrationRepairerServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedIaCProviderMigrationRepairerServer struct{} + +func (UnimplementedIaCProviderMigrationRepairerServer) RepairDirtyMigration(context.Context, *RepairDirtyMigrationRequest) (*RepairDirtyMigrationResponse, error) { + return nil, status.Error(codes.Unimplemented, "method RepairDirtyMigration not implemented") +} +func (UnimplementedIaCProviderMigrationRepairerServer) mustEmbedUnimplementedIaCProviderMigrationRepairerServer() { +} +func (UnimplementedIaCProviderMigrationRepairerServer) testEmbeddedByValue() {} + +// UnsafeIaCProviderMigrationRepairerServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to IaCProviderMigrationRepairerServer will +// result in compilation errors. +type UnsafeIaCProviderMigrationRepairerServer interface { + mustEmbedUnimplementedIaCProviderMigrationRepairerServer() +} + +func RegisterIaCProviderMigrationRepairerServer(s grpc.ServiceRegistrar, srv IaCProviderMigrationRepairerServer) { + // If the following call panics, it indicates UnimplementedIaCProviderMigrationRepairerServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&IaCProviderMigrationRepairer_ServiceDesc, srv) +} + +func _IaCProviderMigrationRepairer_RepairDirtyMigration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RepairDirtyMigrationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderMigrationRepairerServer).RepairDirtyMigration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderMigrationRepairer_RepairDirtyMigration_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderMigrationRepairerServer).RepairDirtyMigration(ctx, req.(*RepairDirtyMigrationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// IaCProviderMigrationRepairer_ServiceDesc is the grpc.ServiceDesc for IaCProviderMigrationRepairer service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var IaCProviderMigrationRepairer_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "workflow.plugin.external.iac.IaCProviderMigrationRepairer", + HandlerType: (*IaCProviderMigrationRepairerServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "RepairDirtyMigration", + Handler: _IaCProviderMigrationRepairer_RepairDirtyMigration_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "plugin/external/proto/iac.proto", +} + +const ( + IaCProviderValidator_ValidatePlan_FullMethodName = "/workflow.plugin.external.iac.IaCProviderValidator/ValidatePlan" +) + +// IaCProviderValidatorClient is the client API for IaCProviderValidator service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type IaCProviderValidatorClient interface { + ValidatePlan(ctx context.Context, in *ValidatePlanRequest, opts ...grpc.CallOption) (*ValidatePlanResponse, error) +} + +type iaCProviderValidatorClient struct { + cc grpc.ClientConnInterface +} + +func NewIaCProviderValidatorClient(cc grpc.ClientConnInterface) IaCProviderValidatorClient { + return &iaCProviderValidatorClient{cc} +} + +func (c *iaCProviderValidatorClient) ValidatePlan(ctx context.Context, in *ValidatePlanRequest, opts ...grpc.CallOption) (*ValidatePlanResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ValidatePlanResponse) + err := c.cc.Invoke(ctx, IaCProviderValidator_ValidatePlan_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IaCProviderValidatorServer is the server API for IaCProviderValidator service. +// All implementations must embed UnimplementedIaCProviderValidatorServer +// for forward compatibility. +type IaCProviderValidatorServer interface { + ValidatePlan(context.Context, *ValidatePlanRequest) (*ValidatePlanResponse, error) + mustEmbedUnimplementedIaCProviderValidatorServer() +} + +// UnimplementedIaCProviderValidatorServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedIaCProviderValidatorServer struct{} + +func (UnimplementedIaCProviderValidatorServer) ValidatePlan(context.Context, *ValidatePlanRequest) (*ValidatePlanResponse, error) { + return nil, status.Error(codes.Unimplemented, "method ValidatePlan not implemented") +} +func (UnimplementedIaCProviderValidatorServer) mustEmbedUnimplementedIaCProviderValidatorServer() {} +func (UnimplementedIaCProviderValidatorServer) testEmbeddedByValue() {} + +// UnsafeIaCProviderValidatorServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to IaCProviderValidatorServer will +// result in compilation errors. +type UnsafeIaCProviderValidatorServer interface { + mustEmbedUnimplementedIaCProviderValidatorServer() +} + +func RegisterIaCProviderValidatorServer(s grpc.ServiceRegistrar, srv IaCProviderValidatorServer) { + // If the following call panics, it indicates UnimplementedIaCProviderValidatorServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&IaCProviderValidator_ServiceDesc, srv) +} + +func _IaCProviderValidator_ValidatePlan_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ValidatePlanRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderValidatorServer).ValidatePlan(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderValidator_ValidatePlan_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderValidatorServer).ValidatePlan(ctx, req.(*ValidatePlanRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// IaCProviderValidator_ServiceDesc is the grpc.ServiceDesc for IaCProviderValidator service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var IaCProviderValidator_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "workflow.plugin.external.iac.IaCProviderValidator", + HandlerType: (*IaCProviderValidatorServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ValidatePlan", + Handler: _IaCProviderValidator_ValidatePlan_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "plugin/external/proto/iac.proto", +} + +const ( + IaCProviderDriftConfigDetector_DetectDriftConfig_FullMethodName = "/workflow.plugin.external.iac.IaCProviderDriftConfigDetector/DetectDriftConfig" +) + +// IaCProviderDriftConfigDetectorClient is the client API for IaCProviderDriftConfigDetector service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type IaCProviderDriftConfigDetectorClient interface { + DetectDriftConfig(ctx context.Context, in *DetectDriftConfigRequest, opts ...grpc.CallOption) (*DetectDriftConfigResponse, error) +} + +type iaCProviderDriftConfigDetectorClient struct { + cc grpc.ClientConnInterface +} + +func NewIaCProviderDriftConfigDetectorClient(cc grpc.ClientConnInterface) IaCProviderDriftConfigDetectorClient { + return &iaCProviderDriftConfigDetectorClient{cc} +} + +func (c *iaCProviderDriftConfigDetectorClient) DetectDriftConfig(ctx context.Context, in *DetectDriftConfigRequest, opts ...grpc.CallOption) (*DetectDriftConfigResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DetectDriftConfigResponse) + err := c.cc.Invoke(ctx, IaCProviderDriftConfigDetector_DetectDriftConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IaCProviderDriftConfigDetectorServer is the server API for IaCProviderDriftConfigDetector service. +// All implementations must embed UnimplementedIaCProviderDriftConfigDetectorServer +// for forward compatibility. +type IaCProviderDriftConfigDetectorServer interface { + DetectDriftConfig(context.Context, *DetectDriftConfigRequest) (*DetectDriftConfigResponse, error) + mustEmbedUnimplementedIaCProviderDriftConfigDetectorServer() +} + +// UnimplementedIaCProviderDriftConfigDetectorServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedIaCProviderDriftConfigDetectorServer struct{} + +func (UnimplementedIaCProviderDriftConfigDetectorServer) DetectDriftConfig(context.Context, *DetectDriftConfigRequest) (*DetectDriftConfigResponse, error) { + return nil, status.Error(codes.Unimplemented, "method DetectDriftConfig not implemented") +} +func (UnimplementedIaCProviderDriftConfigDetectorServer) mustEmbedUnimplementedIaCProviderDriftConfigDetectorServer() { +} +func (UnimplementedIaCProviderDriftConfigDetectorServer) testEmbeddedByValue() {} + +// UnsafeIaCProviderDriftConfigDetectorServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to IaCProviderDriftConfigDetectorServer will +// result in compilation errors. +type UnsafeIaCProviderDriftConfigDetectorServer interface { + mustEmbedUnimplementedIaCProviderDriftConfigDetectorServer() +} + +func RegisterIaCProviderDriftConfigDetectorServer(s grpc.ServiceRegistrar, srv IaCProviderDriftConfigDetectorServer) { + // If the following call panics, it indicates UnimplementedIaCProviderDriftConfigDetectorServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&IaCProviderDriftConfigDetector_ServiceDesc, srv) +} + +func _IaCProviderDriftConfigDetector_DetectDriftConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DetectDriftConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IaCProviderDriftConfigDetectorServer).DetectDriftConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IaCProviderDriftConfigDetector_DetectDriftConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IaCProviderDriftConfigDetectorServer).DetectDriftConfig(ctx, req.(*DetectDriftConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// IaCProviderDriftConfigDetector_ServiceDesc is the grpc.ServiceDesc for IaCProviderDriftConfigDetector service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var IaCProviderDriftConfigDetector_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "workflow.plugin.external.iac.IaCProviderDriftConfigDetector", + HandlerType: (*IaCProviderDriftConfigDetectorServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "DetectDriftConfig", + Handler: _IaCProviderDriftConfigDetector_DetectDriftConfig_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "plugin/external/proto/iac.proto", +} + +const ( + ResourceDriver_Create_FullMethodName = "/workflow.plugin.external.iac.ResourceDriver/Create" + ResourceDriver_Read_FullMethodName = "/workflow.plugin.external.iac.ResourceDriver/Read" + ResourceDriver_Update_FullMethodName = "/workflow.plugin.external.iac.ResourceDriver/Update" + ResourceDriver_Delete_FullMethodName = "/workflow.plugin.external.iac.ResourceDriver/Delete" + ResourceDriver_Diff_FullMethodName = "/workflow.plugin.external.iac.ResourceDriver/Diff" + ResourceDriver_Scale_FullMethodName = "/workflow.plugin.external.iac.ResourceDriver/Scale" + ResourceDriver_HealthCheck_FullMethodName = "/workflow.plugin.external.iac.ResourceDriver/HealthCheck" + ResourceDriver_SensitiveKeys_FullMethodName = "/workflow.plugin.external.iac.ResourceDriver/SensitiveKeys" + ResourceDriver_Troubleshoot_FullMethodName = "/workflow.plugin.external.iac.ResourceDriver/Troubleshoot" +) + +// ResourceDriverClient is the client API for ResourceDriver service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// ───────────────────────────────────────────────────────────────────────────── +// ResourceDriver — separate gRPC service for per-resource-type CRUD dispatch. +// The driver instance is identified by (resource_type) carried on every RPC. +// ───────────────────────────────────────────────────────────────────────────── +type ResourceDriverClient interface { + Create(ctx context.Context, in *ResourceCreateRequest, opts ...grpc.CallOption) (*ResourceCreateResponse, error) + Read(ctx context.Context, in *ResourceReadRequest, opts ...grpc.CallOption) (*ResourceReadResponse, error) + Update(ctx context.Context, in *ResourceUpdateRequest, opts ...grpc.CallOption) (*ResourceUpdateResponse, error) + Delete(ctx context.Context, in *ResourceDeleteRequest, opts ...grpc.CallOption) (*ResourceDeleteResponse, error) + Diff(ctx context.Context, in *ResourceDiffRequest, opts ...grpc.CallOption) (*ResourceDiffResponse, error) + Scale(ctx context.Context, in *ResourceScaleRequest, opts ...grpc.CallOption) (*ResourceScaleResponse, error) + HealthCheck(ctx context.Context, in *ResourceHealthCheckRequest, opts ...grpc.CallOption) (*ResourceHealthCheckResponse, error) + SensitiveKeys(ctx context.Context, in *SensitiveKeysRequest, opts ...grpc.CallOption) (*SensitiveKeysResponse, error) + Troubleshoot(ctx context.Context, in *TroubleshootRequest, opts ...grpc.CallOption) (*TroubleshootResponse, error) +} + +type resourceDriverClient struct { + cc grpc.ClientConnInterface +} + +func NewResourceDriverClient(cc grpc.ClientConnInterface) ResourceDriverClient { + return &resourceDriverClient{cc} +} + +func (c *resourceDriverClient) Create(ctx context.Context, in *ResourceCreateRequest, opts ...grpc.CallOption) (*ResourceCreateResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResourceCreateResponse) + err := c.cc.Invoke(ctx, ResourceDriver_Create_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceDriverClient) Read(ctx context.Context, in *ResourceReadRequest, opts ...grpc.CallOption) (*ResourceReadResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResourceReadResponse) + err := c.cc.Invoke(ctx, ResourceDriver_Read_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceDriverClient) Update(ctx context.Context, in *ResourceUpdateRequest, opts ...grpc.CallOption) (*ResourceUpdateResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResourceUpdateResponse) + err := c.cc.Invoke(ctx, ResourceDriver_Update_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceDriverClient) Delete(ctx context.Context, in *ResourceDeleteRequest, opts ...grpc.CallOption) (*ResourceDeleteResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResourceDeleteResponse) + err := c.cc.Invoke(ctx, ResourceDriver_Delete_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceDriverClient) Diff(ctx context.Context, in *ResourceDiffRequest, opts ...grpc.CallOption) (*ResourceDiffResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResourceDiffResponse) + err := c.cc.Invoke(ctx, ResourceDriver_Diff_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceDriverClient) Scale(ctx context.Context, in *ResourceScaleRequest, opts ...grpc.CallOption) (*ResourceScaleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResourceScaleResponse) + err := c.cc.Invoke(ctx, ResourceDriver_Scale_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceDriverClient) HealthCheck(ctx context.Context, in *ResourceHealthCheckRequest, opts ...grpc.CallOption) (*ResourceHealthCheckResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResourceHealthCheckResponse) + err := c.cc.Invoke(ctx, ResourceDriver_HealthCheck_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceDriverClient) SensitiveKeys(ctx context.Context, in *SensitiveKeysRequest, opts ...grpc.CallOption) (*SensitiveKeysResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SensitiveKeysResponse) + err := c.cc.Invoke(ctx, ResourceDriver_SensitiveKeys_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *resourceDriverClient) Troubleshoot(ctx context.Context, in *TroubleshootRequest, opts ...grpc.CallOption) (*TroubleshootResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(TroubleshootResponse) + err := c.cc.Invoke(ctx, ResourceDriver_Troubleshoot_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ResourceDriverServer is the server API for ResourceDriver service. +// All implementations must embed UnimplementedResourceDriverServer +// for forward compatibility. +// +// ───────────────────────────────────────────────────────────────────────────── +// ResourceDriver — separate gRPC service for per-resource-type CRUD dispatch. +// The driver instance is identified by (resource_type) carried on every RPC. +// ───────────────────────────────────────────────────────────────────────────── +type ResourceDriverServer interface { + Create(context.Context, *ResourceCreateRequest) (*ResourceCreateResponse, error) + Read(context.Context, *ResourceReadRequest) (*ResourceReadResponse, error) + Update(context.Context, *ResourceUpdateRequest) (*ResourceUpdateResponse, error) + Delete(context.Context, *ResourceDeleteRequest) (*ResourceDeleteResponse, error) + Diff(context.Context, *ResourceDiffRequest) (*ResourceDiffResponse, error) + Scale(context.Context, *ResourceScaleRequest) (*ResourceScaleResponse, error) + HealthCheck(context.Context, *ResourceHealthCheckRequest) (*ResourceHealthCheckResponse, error) + SensitiveKeys(context.Context, *SensitiveKeysRequest) (*SensitiveKeysResponse, error) + Troubleshoot(context.Context, *TroubleshootRequest) (*TroubleshootResponse, error) + mustEmbedUnimplementedResourceDriverServer() +} + +// UnimplementedResourceDriverServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedResourceDriverServer struct{} + +func (UnimplementedResourceDriverServer) Create(context.Context, *ResourceCreateRequest) (*ResourceCreateResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Create not implemented") +} +func (UnimplementedResourceDriverServer) Read(context.Context, *ResourceReadRequest) (*ResourceReadResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Read not implemented") +} +func (UnimplementedResourceDriverServer) Update(context.Context, *ResourceUpdateRequest) (*ResourceUpdateResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Update not implemented") +} +func (UnimplementedResourceDriverServer) Delete(context.Context, *ResourceDeleteRequest) (*ResourceDeleteResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Delete not implemented") +} +func (UnimplementedResourceDriverServer) Diff(context.Context, *ResourceDiffRequest) (*ResourceDiffResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Diff not implemented") +} +func (UnimplementedResourceDriverServer) Scale(context.Context, *ResourceScaleRequest) (*ResourceScaleResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Scale not implemented") +} +func (UnimplementedResourceDriverServer) HealthCheck(context.Context, *ResourceHealthCheckRequest) (*ResourceHealthCheckResponse, error) { + return nil, status.Error(codes.Unimplemented, "method HealthCheck not implemented") +} +func (UnimplementedResourceDriverServer) SensitiveKeys(context.Context, *SensitiveKeysRequest) (*SensitiveKeysResponse, error) { + return nil, status.Error(codes.Unimplemented, "method SensitiveKeys not implemented") +} +func (UnimplementedResourceDriverServer) Troubleshoot(context.Context, *TroubleshootRequest) (*TroubleshootResponse, error) { + return nil, status.Error(codes.Unimplemented, "method Troubleshoot not implemented") +} +func (UnimplementedResourceDriverServer) mustEmbedUnimplementedResourceDriverServer() {} +func (UnimplementedResourceDriverServer) testEmbeddedByValue() {} + +// UnsafeResourceDriverServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ResourceDriverServer will +// result in compilation errors. +type UnsafeResourceDriverServer interface { + mustEmbedUnimplementedResourceDriverServer() +} + +func RegisterResourceDriverServer(s grpc.ServiceRegistrar, srv ResourceDriverServer) { + // If the following call panics, it indicates UnimplementedResourceDriverServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&ResourceDriver_ServiceDesc, srv) +} + +func _ResourceDriver_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResourceCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceDriverServer).Create(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceDriver_Create_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceDriverServer).Create(ctx, req.(*ResourceCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceDriver_Read_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResourceReadRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceDriverServer).Read(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceDriver_Read_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceDriverServer).Read(ctx, req.(*ResourceReadRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceDriver_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResourceUpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceDriverServer).Update(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceDriver_Update_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceDriverServer).Update(ctx, req.(*ResourceUpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceDriver_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResourceDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceDriverServer).Delete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceDriver_Delete_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceDriverServer).Delete(ctx, req.(*ResourceDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceDriver_Diff_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResourceDiffRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceDriverServer).Diff(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceDriver_Diff_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceDriverServer).Diff(ctx, req.(*ResourceDiffRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceDriver_Scale_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResourceScaleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceDriverServer).Scale(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceDriver_Scale_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceDriverServer).Scale(ctx, req.(*ResourceScaleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceDriver_HealthCheck_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResourceHealthCheckRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceDriverServer).HealthCheck(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceDriver_HealthCheck_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceDriverServer).HealthCheck(ctx, req.(*ResourceHealthCheckRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceDriver_SensitiveKeys_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SensitiveKeysRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceDriverServer).SensitiveKeys(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceDriver_SensitiveKeys_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceDriverServer).SensitiveKeys(ctx, req.(*SensitiveKeysRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ResourceDriver_Troubleshoot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TroubleshootRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ResourceDriverServer).Troubleshoot(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ResourceDriver_Troubleshoot_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ResourceDriverServer).Troubleshoot(ctx, req.(*TroubleshootRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ResourceDriver_ServiceDesc is the grpc.ServiceDesc for ResourceDriver service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ResourceDriver_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "workflow.plugin.external.iac.ResourceDriver", + HandlerType: (*ResourceDriverServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Create", + Handler: _ResourceDriver_Create_Handler, + }, + { + MethodName: "Read", + Handler: _ResourceDriver_Read_Handler, + }, + { + MethodName: "Update", + Handler: _ResourceDriver_Update_Handler, + }, + { + MethodName: "Delete", + Handler: _ResourceDriver_Delete_Handler, + }, + { + MethodName: "Diff", + Handler: _ResourceDriver_Diff_Handler, + }, + { + MethodName: "Scale", + Handler: _ResourceDriver_Scale_Handler, + }, + { + MethodName: "HealthCheck", + Handler: _ResourceDriver_HealthCheck_Handler, + }, + { + MethodName: "SensitiveKeys", + Handler: _ResourceDriver_SensitiveKeys_Handler, + }, + { + MethodName: "Troubleshoot", + Handler: _ResourceDriver_Troubleshoot_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "plugin/external/proto/iac.proto", +} diff --git a/plugin/external/proto/iac_proto_test.go b/plugin/external/proto/iac_proto_test.go new file mode 100644 index 00000000..38ad568c --- /dev/null +++ b/plugin/external/proto/iac_proto_test.go @@ -0,0 +1,64 @@ +package proto_test + +import ( + "testing" + + pb "github.com/GoCodeAlone/workflow/plugin/external/proto" +) + +// TestIaCProviderRequiredServerHasAllRequiredMethods asserts that the +// generated server interface has every method named in the design. +// Catches accidental method drops in iac.proto. +// +// The test passes at build time via the unused type-assert: if the proto +// dropped a method, the embedded UnimplementedIaCProviderRequiredServer +// would no longer satisfy IaCProviderRequiredServer and this file would +// fail to compile. +func TestIaCProviderRequiredServerHasAllRequiredMethods(t *testing.T) { + var srv pb.IaCProviderRequiredServer = (*requiredStub)(nil) + _ = srv // type-assert satisfaction is checked at compile time + + // Methods are checked at compile time via the type assertion above. + // The stub MUST satisfy: Initialize, Name, Version, Capabilities, + // Plan, Apply, Destroy, Status, Import, ResolveSizing, + // BootstrapStateBackend. +} + +type requiredStub struct { + pb.UnimplementedIaCProviderRequiredServer +} + +// TestOptionalServicesHaveDistinctInterfaces asserts each optional +// service has its own server interface (not method-on-required). +func TestOptionalServicesHaveDistinctInterfaces(t *testing.T) { + type optional interface { + pb.IaCProviderEnumeratorServer + pb.IaCProviderDriftDetectorServer + pb.IaCProviderCredentialRevokerServer + pb.IaCProviderMigrationRepairerServer + pb.IaCProviderValidatorServer + pb.IaCProviderDriftConfigDetectorServer + } + var _ optional = (*allOptionalStub)(nil) +} + +type allOptionalStub struct { + pb.UnimplementedIaCProviderEnumeratorServer + pb.UnimplementedIaCProviderDriftDetectorServer + pb.UnimplementedIaCProviderCredentialRevokerServer + pb.UnimplementedIaCProviderMigrationRepairerServer + pb.UnimplementedIaCProviderValidatorServer + pb.UnimplementedIaCProviderDriftConfigDetectorServer +} + +// TestResourceDriverServerInterfaceExists asserts the generated +// ResourceDriverServer interface exists with the 9 RPC methods from the +// design (Create, Read, Update, Delete, Diff, Scale, HealthCheck, +// SensitiveKeys, Troubleshoot). +func TestResourceDriverServerInterfaceExists(t *testing.T) { + var _ pb.ResourceDriverServer = (*resourceDriverStub)(nil) +} + +type resourceDriverStub struct { + pb.UnimplementedResourceDriverServer +} From 31cfd5ad8ea253f41f96ab263520d0af650b9699 Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 10 May 2026 02:13:29 -0400 Subject: [PATCH 2/8] feat(sdk): RegisterAllIaCProviderServices auto-registration helper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task 4 of the strict-contracts force-cutover plan (docs/plans/2026-05-10-strict-contracts-force-cutover.md, rev5). Adds plugin/external/sdk/iacserver.go: a single helper that uses Go type-assertion to register every typed IaC gRPC service the provider satisfies, in one call. REQUIRED service: pb.IaCProviderRequiredServer — surfaced as a clear startup-time error if the provider type doesn't satisfy it (rather than failing at the first RPC dispatch with a generic "unimplemented" status). OPTIONAL services (auto-detected): IaCProviderEnumerator, IaCProviderDriftDetector, IaCProviderCredentialRevoker, IaCProviderMigrationRepairer, IaCProviderValidator, IaCProviderDriftConfigDetector. Plus ResourceDriver. Per cycle 3 I-1 of the design: plugin authors write ONE call; they cannot omit registration for a capability they implemented. This removes the registration-omission bug class (the same shape as the legacy InvokeService case-string-typo bug) by removing the manual step entirely. Tests cover four cases: - required-satisfied → required service registered + advertised by grpcSrv.GetServiceInfo(). - enumerator-only → only the optional Enumerator service registered; other optionals stay absent (auto-detection precision). - empty-stub → returns an error naming the unsatisfied required interface, with a docs pointer. - all-capabilities-stub → all 8 typed services (Required + 6 optional + ResourceDriver) registered. Stacked on feat/iac-proto-task3 (Task 3 PR #598 provides the generated server interfaces this helper consumes). Verification: GOWORK=off go test -race ./plugin/external/sdk/... PASS; GOWORK=off go build ./plugin/... ./cmd/... ./module/... clean; GOWORK=off go vet ./plugin/external/... clean. Rollback: revert this commit; SDK consumers can still register services manually via the per-service Register* helpers protoc generated. --- plugin/external/sdk/iacserver.go | 88 ++++++++++++++++++ plugin/external/sdk/iacserver_test.go | 126 ++++++++++++++++++++++++++ 2 files changed, 214 insertions(+) create mode 100644 plugin/external/sdk/iacserver.go create mode 100644 plugin/external/sdk/iacserver_test.go diff --git a/plugin/external/sdk/iacserver.go b/plugin/external/sdk/iacserver.go new file mode 100644 index 00000000..0dfb2588 --- /dev/null +++ b/plugin/external/sdk/iacserver.go @@ -0,0 +1,88 @@ +package sdk + +import ( + "fmt" + + "google.golang.org/grpc" + + pb "github.com/GoCodeAlone/workflow/plugin/external/proto" +) + +// RegisterAllIaCProviderServices uses Go type-assertion to register every +// typed IaC gRPC service that the provider satisfies, in a single call. +// +// REQUIRED service: +// +// pb.IaCProviderRequiredServer — every IaC plugin MUST implement every +// method on this interface. The type-assert here surfaces missing +// methods at plugin-startup time as a clear error rather than at the +// first RPC dispatch with a generic "unimplemented" status. +// +// OPTIONAL services (auto-detected): +// +// pb.IaCProviderEnumeratorServer +// pb.IaCProviderDriftDetectorServer +// pb.IaCProviderCredentialRevokerServer +// pb.IaCProviderMigrationRepairerServer +// pb.IaCProviderValidatorServer +// pb.IaCProviderDriftConfigDetectorServer +// +// ResourceDriver: +// +// pb.ResourceDriverServer — separate gRPC service, also auto-registered +// when the provider satisfies it. +// +// Per cycle 3 I-1 of the strict-contracts force-cutover design: plugin +// authors write ONE call; they cannot omit registration for a capability +// they implemented. That eliminates the registration-omission bug class +// (the same shape as the legacy InvokeService case-string-typo bug) by +// removing the manual step entirely. +// +// Capability discovery on the host side uses the existing ContractRegistry +// RPC + FileDescriptorSet mechanism (kept via §Salvage in the design); +// the SDK auto-publishes the registered services there in Task 5. +// +// Plugin authors who DO NOT want a capability advertised must NOT +// implement those methods at the Go level — there is no half-implemented +// stub-and-forget-to-register failure mode. +func RegisterAllIaCProviderServices(s *grpc.Server, provider any) error { + if s == nil { + return fmt.Errorf("RegisterAllIaCProviderServices: grpc server is nil") + } + if provider == nil { + return fmt.Errorf("RegisterAllIaCProviderServices: provider is nil") + } + required, ok := provider.(pb.IaCProviderRequiredServer) + if !ok { + return fmt.Errorf( + "RegisterAllIaCProviderServices: provider %T does not satisfy "+ + "pb.IaCProviderRequiredServer (missing methods); see "+ + "docs/plans/2026-05-10-strict-contracts-force-cutover-design.md", + provider, + ) + } + pb.RegisterIaCProviderRequiredServer(s, required) + + if v, ok := provider.(pb.IaCProviderEnumeratorServer); ok { + pb.RegisterIaCProviderEnumeratorServer(s, v) + } + if v, ok := provider.(pb.IaCProviderDriftDetectorServer); ok { + pb.RegisterIaCProviderDriftDetectorServer(s, v) + } + if v, ok := provider.(pb.IaCProviderCredentialRevokerServer); ok { + pb.RegisterIaCProviderCredentialRevokerServer(s, v) + } + if v, ok := provider.(pb.IaCProviderMigrationRepairerServer); ok { + pb.RegisterIaCProviderMigrationRepairerServer(s, v) + } + if v, ok := provider.(pb.IaCProviderValidatorServer); ok { + pb.RegisterIaCProviderValidatorServer(s, v) + } + if v, ok := provider.(pb.IaCProviderDriftConfigDetectorServer); ok { + pb.RegisterIaCProviderDriftConfigDetectorServer(s, v) + } + if v, ok := provider.(pb.ResourceDriverServer); ok { + pb.RegisterResourceDriverServer(s, v) + } + return nil +} diff --git a/plugin/external/sdk/iacserver_test.go b/plugin/external/sdk/iacserver_test.go new file mode 100644 index 00000000..a40035cb --- /dev/null +++ b/plugin/external/sdk/iacserver_test.go @@ -0,0 +1,126 @@ +package sdk_test + +import ( + "strings" + "testing" + + "google.golang.org/grpc" + + pb "github.com/GoCodeAlone/workflow/plugin/external/proto" + "github.com/GoCodeAlone/workflow/plugin/external/sdk" +) + +// TestRegisterAllIaCProviderServices_RequiredSatisfied_RegistersRequired +// asserts that a provider satisfying IaCProviderRequiredServer succeeds and +// the gRPC server actually advertises the typed service. +func TestRegisterAllIaCProviderServices_RequiredSatisfied_RegistersRequired(t *testing.T) { + grpcSrv := grpc.NewServer() + provider := &fullProviderStub{} + if err := sdk.RegisterAllIaCProviderServices(grpcSrv, provider); err != nil { + t.Fatalf("unexpected error: %v", err) + } + info := grpcSrv.GetServiceInfo() + if _, ok := info["workflow.plugin.external.iac.IaCProviderRequired"]; !ok { + t.Fatalf("required service not registered; have services: %v", serviceNames(info)) + } +} + +// TestRegisterAllIaCProviderServices_OptionalSatisfied_RegistersOptional +// asserts auto-detection: a provider that satisfies the Enumerator interface +// (and only that optional) gets the Enumerator service registered, but other +// optional services stay absent. +func TestRegisterAllIaCProviderServices_OptionalSatisfied_RegistersOptional(t *testing.T) { + grpcSrv := grpc.NewServer() + provider := &enumeratorOnlyStub{} + if err := sdk.RegisterAllIaCProviderServices(grpcSrv, provider); err != nil { + t.Fatalf("unexpected error: %v", err) + } + info := grpcSrv.GetServiceInfo() + if _, ok := info["workflow.plugin.external.iac.IaCProviderEnumerator"]; !ok { + t.Fatalf("Enumerator optional service NOT registered despite provider satisfying interface; have: %v", serviceNames(info)) + } + if _, ok := info["workflow.plugin.external.iac.IaCProviderDriftDetector"]; ok { + t.Fatalf("DriftDetector incorrectly registered (provider doesn't satisfy)") + } +} + +// TestRegisterAllIaCProviderServices_RequiredMissing_ReturnsError +// asserts that an empty provider produces an actionable error naming the +// unsatisfied required interface — the bug-class prevention pivot. +func TestRegisterAllIaCProviderServices_RequiredMissing_ReturnsError(t *testing.T) { + grpcSrv := grpc.NewServer() + provider := &emptyStub{} // doesn't satisfy IaCProviderRequiredServer + err := sdk.RegisterAllIaCProviderServices(grpcSrv, provider) + if err == nil { + t.Fatalf("expected error for unsatisfied required interface; got nil") + } + if !strings.Contains(err.Error(), "IaCProviderRequiredServer") { + t.Fatalf("error message must name the unsatisfied interface; got %q", err.Error()) + } +} + +// TestRegisterAllIaCProviderServices_AllOptionals_AllRegistered +// asserts that a provider satisfying every optional + required interface +// triggers registration of all 7 typed services (Required + 6 optional) +// plus the ResourceDriver. +func TestRegisterAllIaCProviderServices_AllOptionals_AllRegistered(t *testing.T) { + grpcSrv := grpc.NewServer() + provider := &allCapabilitiesStub{} + if err := sdk.RegisterAllIaCProviderServices(grpcSrv, provider); err != nil { + t.Fatalf("unexpected error: %v", err) + } + info := grpcSrv.GetServiceInfo() + wantServices := []string{ + "workflow.plugin.external.iac.IaCProviderRequired", + "workflow.plugin.external.iac.IaCProviderEnumerator", + "workflow.plugin.external.iac.IaCProviderDriftDetector", + "workflow.plugin.external.iac.IaCProviderCredentialRevoker", + "workflow.plugin.external.iac.IaCProviderMigrationRepairer", + "workflow.plugin.external.iac.IaCProviderValidator", + "workflow.plugin.external.iac.IaCProviderDriftConfigDetector", + "workflow.plugin.external.iac.ResourceDriver", + } + for _, name := range wantServices { + if _, ok := info[name]; !ok { + t.Errorf("expected service %q registered; have: %v", name, serviceNames(info)) + } + } +} + +func serviceNames(info map[string]grpc.ServiceInfo) []string { + out := make([]string, 0, len(info)) + for k := range info { + out = append(out, k) + } + return out +} + +// fullProviderStub satisfies IaCProviderRequired + Enumerator + DriftDetector +// (representative of an early-stage DO plugin shape). +type fullProviderStub struct { + pb.UnimplementedIaCProviderRequiredServer + pb.UnimplementedIaCProviderEnumeratorServer + pb.UnimplementedIaCProviderDriftDetectorServer +} + +// enumeratorOnlyStub satisfies Required + Enumerator only. +type enumeratorOnlyStub struct { + pb.UnimplementedIaCProviderRequiredServer + pb.UnimplementedIaCProviderEnumeratorServer +} + +// allCapabilitiesStub satisfies every required + optional IaC service plus +// ResourceDriver — used to assert auto-registration covers the full surface. +type allCapabilitiesStub struct { + pb.UnimplementedIaCProviderRequiredServer + pb.UnimplementedIaCProviderEnumeratorServer + pb.UnimplementedIaCProviderDriftDetectorServer + pb.UnimplementedIaCProviderCredentialRevokerServer + pb.UnimplementedIaCProviderMigrationRepairerServer + pb.UnimplementedIaCProviderValidatorServer + pb.UnimplementedIaCProviderDriftConfigDetectorServer + pb.UnimplementedResourceDriverServer +} + +// emptyStub satisfies no IaC interface; the helper must reject it. +type emptyStub struct{} From 8ba1598dde09566f70dc7470be1e671bfb7bac90 Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 10 May 2026 02:19:37 -0400 Subject: [PATCH 3/8] feat(sdk): ServeIaCPlugin high-level entrypoint with go-plugin GRPCServer callback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task 29 of the strict-contracts force-cutover plan (docs/plans/2026-05-10-strict-contracts-force-cutover.md, rev5). Adds the high-level plugin-author API on top of Task 4's RegisterAllIaCProviderServices: func main() { sdk.ServeIaCPlugin(&doProvider{}, sdk.IaCServeOptions{}) } Per cycle 3 I-1 of the design, service registration happens INSIDE go-plugin's GRPCServer callback (iacGRPCPlugin.GRPCServer) — the framework owns *grpc.Server lifecycle, so plugin authors cannot pre-create a server and forget to register a typed service on it. API surface (all in plugin/external/sdk/iacserver.go): - IaCServeOptions{ PluginInfo *PluginInfo } — caller-side options. - PluginInfo{ HandshakeConfig goplugin.HandshakeConfig } — extension point for future Name/Version metadata; defaults to ext.Handshake (the canonical wfctl<->plugin handshake) when zero-valued. - iacGRPCPlugin{provider any} — implements goplugin.Plugin (GRPCServer + GRPCClient). The GoCodeAlone fork of go-plugin v1.7.0 is gRPC-only and exposes only the canonical Plugin interface; there is no GRPCPlugin alias or NetRPCUnsupportedPlugin embed to use. - ServeIaCPlugin(provider, opts) — wraps goplugin.Serve with the resolved handshake + a single iacGRPCPlugin entry under the "iac" key. - resolveServeHandshake(opts) — extracted helper so the override-vs- default rule is unit-testable without invoking the blocking goplugin.Serve loop. Tests (iacserver_serve_test.go) cover six cases via internal-package tests (so the unexported plugin type is exercisable without a real subprocess; subprocess-level coverage lands in Task 6's typed-IaC E2E test): - iacGRPCPlugin.GRPCServer registers all satisfied services on the framework-managed *grpc.Server (Required + Enumerator + ResourceDriver for the all-stub). - iacGRPCPlugin.GRPCServer propagates the auto-register error for an empty stub — go-plugin aborts plugin startup with an actionable message. - iacGRPCPlugin.GRPCClient is a no-op (host builds typed clients directly). - iacGRPCPlugin satisfies goplugin.Plugin at compile time (refactor guard). - ServeIaCPlugin defaults to ext.Handshake when PluginInfo is nil. - ServeIaCPlugin honors a non-zero override handshake when provided. Stacked on feat/iac-sdk-auto-register-task4 (Task 4 PR #599 provides RegisterAllIaCProviderServices, which the GRPCServer callback delegates to). Verification: GOWORK=off go test -race ./plugin/external/sdk/... PASS; GOWORK=off go build ./plugin/... ./cmd/... ./module/... clean; GOWORK=off go vet ./plugin/external/... clean. Rollback: revert this commit; plugin authors can fall back to manually constructing goplugin.Serve + Plugins map referencing RegisterAllIaCProviderServices in their own GRPCServer callback. --- plugin/external/sdk/iacserver.go | 98 ++++++++++++++ plugin/external/sdk/iacserver_serve_test.go | 136 ++++++++++++++++++++ 2 files changed, 234 insertions(+) create mode 100644 plugin/external/sdk/iacserver_serve_test.go diff --git a/plugin/external/sdk/iacserver.go b/plugin/external/sdk/iacserver.go index 0dfb2588..d7a60c9d 100644 --- a/plugin/external/sdk/iacserver.go +++ b/plugin/external/sdk/iacserver.go @@ -1,10 +1,13 @@ package sdk import ( + "context" "fmt" + goplugin "github.com/GoCodeAlone/go-plugin" "google.golang.org/grpc" + ext "github.com/GoCodeAlone/workflow/plugin/external" pb "github.com/GoCodeAlone/workflow/plugin/external/proto" ) @@ -86,3 +89,98 @@ func RegisterAllIaCProviderServices(s *grpc.Server, provider any) error { } return nil } + +// IaCServeOptions configures the IaC plugin gRPC server entrypoint. +// +// Plugin authors typically zero-value this; ServeIaCPlugin then uses the +// canonical host<->plugin handshake (ext.Handshake). The struct exists as +// a forward-extension point so future metadata fields (PluginInfo) can be +// added without breaking the API. +type IaCServeOptions struct { + // PluginInfo overrides the default handshake/metadata. When nil, + // ServeIaCPlugin uses ext.Handshake (the canonical wfctl<->plugin + // handshake — required for compatibility with the workflow host). + PluginInfo *PluginInfo +} + +// PluginInfo carries the metadata that go-plugin needs to serve an IaC +// plugin. Currently only HandshakeConfig is meaningful; reserved as the +// extension point for future Name/Version metadata fields without +// breaking the IaCServeOptions API. +type PluginInfo struct { + // HandshakeConfig is the go-plugin handshake. Plugin authors should + // leave this zero-valued to inherit ext.Handshake — the host (wfctl) + // and plugin MUST agree on the cookie + protocol version, so override + // only when implementing a non-workflow host. + HandshakeConfig goplugin.HandshakeConfig +} + +// iacGRPCPlugin implements goplugin's Plugin interface for the typed IaC +// contract. Service registration happens INSIDE GRPCServer per go-plugin +// v1.7.0 architecture — the framework owns the *grpc.Server lifecycle, so +// plugin authors cannot pre-create the server and forget to register a +// service on it. +// +// Note: the GoCodeAlone fork of go-plugin (v1.7.0) is gRPC-only and does +// not expose hashicorp/go-plugin's NetRPCUnsupportedPlugin embed or a +// GRPCPlugin convenience alias; the canonical Plugin interface (just +// GRPCServer + GRPCClient) is sufficient and matches the existing +// servePlugin pattern in serve.go. +type iacGRPCPlugin struct { + provider any +} + +// GRPCServer is invoked by go-plugin once it has constructed the +// *grpc.Server. Delegates to RegisterAllIaCProviderServices so every +// typed IaC service the provider satisfies gets registered in one call. +// +// Returning an error here causes go-plugin to abort plugin startup — +// surfacing missing required methods as a plugin-startup error rather +// than a generic "unimplemented" status at the first RPC dispatch. +func (p *iacGRPCPlugin) GRPCServer(_ *goplugin.GRPCBroker, s *grpc.Server) error { + return RegisterAllIaCProviderServices(s, p.provider) +} + +// GRPCClient is unused on the plugin side. The workflow host (wfctl) +// builds its own typed pb.IaCProviderRequiredClient + per-optional +// clients directly from the gRPC connection; the iacGRPCPlugin's +// client-side adapter is therefore a no-op. +func (p *iacGRPCPlugin) GRPCClient(_ context.Context, _ *goplugin.GRPCBroker, _ *grpc.ClientConn) (any, error) { + return nil, nil +} + +// ServeIaCPlugin starts a typed IaC plugin gRPC server with auto +// registration of every IaC service the provider satisfies. Plugin +// authors call this once in main.go: +// +// func main() { +// sdk.ServeIaCPlugin(&doProvider{}, sdk.IaCServeOptions{}) +// } +// +// Per cycle 3 I-1 of the strict-contracts force-cutover design, the +// service registration happens INSIDE go-plugin's GRPCServer callback +// (see iacGRPCPlugin.GRPCServer), so plugin authors cannot pre-create +// a *grpc.Server and forget to register a typed service on it. +// +// Blocks until the host process terminates the connection. +func ServeIaCPlugin(provider any, opts IaCServeOptions) { + goplugin.Serve(&goplugin.ServeConfig{ + HandshakeConfig: resolveServeHandshake(opts), + Plugins: goplugin.PluginSet{ + "iac": &iacGRPCPlugin{provider: provider}, + }, + GRPCServer: goplugin.DefaultGRPCServer, + }) +} + +// resolveServeHandshake returns the goplugin handshake to use for an IaC +// plugin. Defaults to ext.Handshake (the canonical wfctl<->plugin handshake) +// when the caller did not supply a non-zero PluginInfo.HandshakeConfig. +// Extracted from ServeIaCPlugin so the resolution rule is unit-testable +// without invoking goplugin.Serve's blocking loop. +func resolveServeHandshake(opts IaCServeOptions) goplugin.HandshakeConfig { + if opts.PluginInfo != nil && opts.PluginInfo.HandshakeConfig.MagicCookieKey != "" { + return opts.PluginInfo.HandshakeConfig + } + return ext.Handshake +} diff --git a/plugin/external/sdk/iacserver_serve_test.go b/plugin/external/sdk/iacserver_serve_test.go new file mode 100644 index 00000000..f33f3a79 --- /dev/null +++ b/plugin/external/sdk/iacserver_serve_test.go @@ -0,0 +1,136 @@ +package sdk + +// Internal test (package sdk, not sdk_test) so the unexported +// iacGRPCPlugin can be exercised directly without spawning a real +// plugin subprocess. + +import ( + "context" + "strings" + "testing" + + goplugin "github.com/GoCodeAlone/go-plugin" + "google.golang.org/grpc" + + ext "github.com/GoCodeAlone/workflow/plugin/external" + pb "github.com/GoCodeAlone/workflow/plugin/external/proto" +) + +// TestIaCGRPCPlugin_GRPCServer_RegistersAllServices asserts that the +// go-plugin framework callback delegates to RegisterAllIaCProviderServices, +// so every typed service the provider satisfies is registered on the +// framework-managed *grpc.Server. This is the cycle 3 I-1 invariant: +// service registration happens INSIDE GRPCServer, not in caller-allocated +// servers. +func TestIaCGRPCPlugin_GRPCServer_RegistersAllServices(t *testing.T) { + grpcSrv := grpc.NewServer() + provider := &serveTestAllStub{} + p := &iacGRPCPlugin{provider: provider} + + if err := p.GRPCServer(nil, grpcSrv); err != nil { + t.Fatalf("GRPCServer returned error: %v", err) + } + + info := grpcSrv.GetServiceInfo() + want := []string{ + "workflow.plugin.external.iac.IaCProviderRequired", + "workflow.plugin.external.iac.IaCProviderEnumerator", + "workflow.plugin.external.iac.ResourceDriver", + } + for _, name := range want { + if _, ok := info[name]; !ok { + t.Errorf("expected %q registered; have: %v", name, len(info)) + } + } +} + +// TestIaCGRPCPlugin_GRPCServer_PropagatesAutoRegisterError asserts the +// callback surfaces RegisterAllIaCProviderServices errors so go-plugin +// aborts plugin startup with an actionable message rather than booting +// a half-registered server. +func TestIaCGRPCPlugin_GRPCServer_PropagatesAutoRegisterError(t *testing.T) { + grpcSrv := grpc.NewServer() + p := &iacGRPCPlugin{provider: &emptyServeStub{}} + + err := p.GRPCServer(nil, grpcSrv) + if err == nil { + t.Fatalf("expected error for unsatisfied required interface; got nil") + } + if !strings.Contains(err.Error(), "IaCProviderRequiredServer") { + t.Fatalf("error must name the missing interface; got %q", err.Error()) + } +} + +// TestIaCGRPCPlugin_GRPCClient_NoOp asserts the plugin-side GRPCClient +// adapter returns (nil, nil). The host (wfctl) builds its own typed +// pb.IaCProviderRequiredClient directly from the connection. +func TestIaCGRPCPlugin_GRPCClient_NoOp(t *testing.T) { + p := &iacGRPCPlugin{} + out, err := p.GRPCClient(context.Background(), nil, nil) + if err != nil { + t.Fatalf("GRPCClient returned error: %v", err) + } + if out != nil { + t.Fatalf("expected nil client; got %T", out) + } +} + +// TestIaCGRPCPlugin_SatisfiesGoPluginPlugin guarantees that +// iacGRPCPlugin remains compatible with the goplugin.Plugin interface +// (GRPCServer + GRPCClient) — a refactor that renames either method +// or changes its signature would fail this assertion at compile time. +// +// (The GoCodeAlone fork of go-plugin is gRPC-only; there is no separate +// GRPCPlugin alias to assert against. Plugin is the canonical +// interface.) +func TestIaCGRPCPlugin_SatisfiesGoPluginPlugin(t *testing.T) { + var _ goplugin.Plugin = (*iacGRPCPlugin)(nil) +} + +// TestServeIaCPlugin_DefaultsToWorkflowHandshake_WhenPluginInfoNil +// asserts the entrypoint defaults to ext.Handshake when callers pass +// IaCServeOptions{} (no override). Verified indirectly via the +// resolveServeHandshake helper extracted from ServeIaCPlugin so the +// blocking goplugin.Serve loop is not invoked in tests. +func TestServeIaCPlugin_DefaultsToWorkflowHandshake_WhenPluginInfoNil(t *testing.T) { + got := resolveServeHandshake(IaCServeOptions{}) + if got.MagicCookieKey != ext.Handshake.MagicCookieKey { + t.Fatalf("expected default ext.Handshake; got cookie key %q", got.MagicCookieKey) + } + if got.MagicCookieValue != ext.Handshake.MagicCookieValue { + t.Fatalf("expected default ext.Handshake; got cookie value %q", got.MagicCookieValue) + } + if got.ProtocolVersion != ext.Handshake.ProtocolVersion { + t.Fatalf("expected default protocol version %d; got %d", + ext.Handshake.ProtocolVersion, got.ProtocolVersion) + } +} + +// TestServeIaCPlugin_HonorsOverrideHandshake_WhenProvided asserts that +// callers can supply a non-zero handshake (e.g., for non-workflow hosts) +// via IaCServeOptions.PluginInfo.HandshakeConfig. +func TestServeIaCPlugin_HonorsOverrideHandshake_WhenProvided(t *testing.T) { + custom := goplugin.HandshakeConfig{ + ProtocolVersion: 42, + MagicCookieKey: "CUSTOM_COOKIE", + MagicCookieValue: "v", + } + got := resolveServeHandshake(IaCServeOptions{ + PluginInfo: &PluginInfo{HandshakeConfig: custom}, + }) + if got != custom { + t.Fatalf("expected custom handshake; got %+v", got) + } +} + +// serveTestAllStub satisfies Required + Enumerator + ResourceDriver to +// exercise the auto-registration path through the GRPCServer callback. +type serveTestAllStub struct { + pb.UnimplementedIaCProviderRequiredServer + pb.UnimplementedIaCProviderEnumeratorServer + pb.UnimplementedResourceDriverServer +} + +// emptyServeStub satisfies no IaC interface. The GRPCServer callback +// MUST surface this as an error so go-plugin aborts startup. +type emptyServeStub struct{} From c03c871023dd35e4b96f41bcd78f3c1171014a8e Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 10 May 2026 02:24:03 -0400 Subject: [PATCH 4/8] feat(sdk): BuildContractRegistry advertises registered IaC services MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task 5 of the strict-contracts force-cutover plan (docs/plans/2026-05-10-strict-contracts-force-cutover.md, rev5). Adds plugin/external/sdk/contracts.go with the BuildContractRegistry helper that enumerates grpc.Server.GetServiceInfo() and emits a SERVICE-kind ContractDescriptor for each registered service. ContractMode is set to STRICT_PROTO so the host can distinguish typed IaC services from the legacy structpb-mode contracts produced by Module/Step/Trigger ContractProvider implementations. Per cycle 3 I-1 of the design: wfctl needs a single mechanism to discover "is the optional service registered on this plugin handle?". Reusing the existing ContractRegistry shape keeps Module/Step/Trigger and IaC capability discovery on the same wire surface — no new gRPC server-reflection dependency required. Service descriptors are emitted in deterministic alphabetical order so callers can rely on stable output for diff/compare operations and the wftest BDD test in Task 15. The helper is safe to call with a nil server (returns an empty but non-nil ContractRegistry) so callers that may construct it before the gRPC server exists do not panic. Tests (contracts_iac_test.go) cover three cases — all pass: - AdvertisesRegisteredIaCServices: a Required + Enumerator + DriftDetector stub yields exactly those service descriptors. - ServiceContractsUseStrictProtoMode: every emitted descriptor is Kind=SERVICE + Mode=STRICT_PROTO (host-side discriminator). - NilServer_ReturnsEmpty: defensive contract for nil input. Stacked on feat/iac-sdk-serve-task29 (Task 29 PR #600 provides ServeIaCPlugin which IaC plugins use to register the services this helper enumerates). Verification: GOWORK=off go test -race ./plugin/external/sdk/... PASS; GOWORK=off go build ./plugin/... ./cmd/... ./module/... clean; GOWORK=off go vet ./plugin/external/... clean. Rollback: revert this commit; ContractRegistry returns the prior shape (Module/Step/Trigger only via the existing ContractProvider hook in grpc_server.go). --- plugin/external/sdk/contracts.go | 60 ++++++++++++++ plugin/external/sdk/contracts_iac_test.go | 95 +++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 plugin/external/sdk/contracts.go create mode 100644 plugin/external/sdk/contracts_iac_test.go diff --git a/plugin/external/sdk/contracts.go b/plugin/external/sdk/contracts.go new file mode 100644 index 00000000..b9f28989 --- /dev/null +++ b/plugin/external/sdk/contracts.go @@ -0,0 +1,60 @@ +package sdk + +import ( + "sort" + + "google.golang.org/grpc" + + pb "github.com/GoCodeAlone/workflow/plugin/external/proto" +) + +// BuildContractRegistry enumerates the gRPC services registered on +// grpcSrv and returns a *pb.ContractRegistry with a SERVICE-kind +// ContractDescriptor for each one. Mode is set to +// CONTRACT_MODE_STRICT_PROTO so the host can distinguish typed IaC +// services from the legacy structpb-mode contracts produced by +// Module/Step/Trigger ContractProvider implementations. +// +// Why this exists (per cycle 3 I-1 of the strict-contracts force-cutover +// design): wfctl needs a single mechanism to discover "is the optional +// service registered on this plugin handle?". Reusing the existing +// ContractRegistry shape keeps Module/Step/Trigger and IaC capability +// discovery on the same wire surface — no new server-reflection +// dependency required. +// +// The helper is safe to call with a nil server; it returns an empty +// (but non-nil) ContractRegistry. Service descriptors are emitted in a +// deterministic alphabetical order so callers can rely on stable +// FileDescriptorSet-adjacent output for diff/compare operations and +// the wftest BDD test in Task 15. +// +// IaC plugin authors typically wire this into their ContractProvider +// implementation: +// +// func (p *plugin) ContractRegistry() *pb.ContractRegistry { +// return sdk.BuildContractRegistry(p.grpcServer) +// } +// +// where p.grpcServer was captured inside the iacGRPCPlugin.GRPCServer +// callback at startup. The ContractProvider hook keeps the wfctl-side +// GetContractRegistry RPC path unchanged. +func BuildContractRegistry(grpcSrv *grpc.Server) *pb.ContractRegistry { + registry := &pb.ContractRegistry{} + if grpcSrv == nil { + return registry + } + info := grpcSrv.GetServiceInfo() + names := make([]string, 0, len(info)) + for name := range info { + names = append(names, name) + } + sort.Strings(names) + for _, name := range names { + registry.Contracts = append(registry.Contracts, &pb.ContractDescriptor{ + Kind: pb.ContractKind_CONTRACT_KIND_SERVICE, + ServiceName: name, + Mode: pb.ContractMode_CONTRACT_MODE_STRICT_PROTO, + }) + } + return registry +} diff --git a/plugin/external/sdk/contracts_iac_test.go b/plugin/external/sdk/contracts_iac_test.go new file mode 100644 index 00000000..b67aebaf --- /dev/null +++ b/plugin/external/sdk/contracts_iac_test.go @@ -0,0 +1,95 @@ +package sdk_test + +import ( + "testing" + + "google.golang.org/grpc" + + pb "github.com/GoCodeAlone/workflow/plugin/external/proto" + "github.com/GoCodeAlone/workflow/plugin/external/sdk" +) + +// TestBuildContractRegistry_AdvertisesRegisteredIaCServices asserts that +// after calling RegisterAllIaCProviderServices, BuildContractRegistry +// returns a *pb.ContractRegistry that lists the registered IaC services +// as SERVICE-kind ContractDescriptors. wfctl uses this for capability +// discovery against IaC plugins (per design §Optional services — single +// mechanism, no new server-reflection dependency). +func TestBuildContractRegistry_AdvertisesRegisteredIaCServices(t *testing.T) { + grpcSrv := grpc.NewServer() + provider := &iacContractProviderStub{} + if err := sdk.RegisterAllIaCProviderServices(grpcSrv, provider); err != nil { + t.Fatalf("register: %v", err) + } + + registry := sdk.BuildContractRegistry(grpcSrv) + if registry == nil { + t.Fatalf("expected non-nil ContractRegistry") + } + + services := serviceNamesFromRegistry(registry) + want := []string{ + "workflow.plugin.external.iac.IaCProviderRequired", + "workflow.plugin.external.iac.IaCProviderEnumerator", + "workflow.plugin.external.iac.IaCProviderDriftDetector", + } + for _, name := range want { + if !services[name] { + t.Errorf("ContractRegistry missing service %q; have: %v", name, services) + } + } +} + +// TestBuildContractRegistry_ServiceContractsUseStrictProtoMode asserts +// that auto-emitted IaC service descriptors carry Mode=STRICT_PROTO so +// the host can distinguish them from the legacy structpb-mode contracts +// produced by Module/Step/Trigger ContractProvider implementations. +func TestBuildContractRegistry_ServiceContractsUseStrictProtoMode(t *testing.T) { + grpcSrv := grpc.NewServer() + if err := sdk.RegisterAllIaCProviderServices(grpcSrv, &iacContractProviderStub{}); err != nil { + t.Fatalf("register: %v", err) + } + registry := sdk.BuildContractRegistry(grpcSrv) + + for _, c := range registry.Contracts { + if c.Kind != pb.ContractKind_CONTRACT_KIND_SERVICE { + t.Errorf("unexpected non-service contract kind %v for %q", c.Kind, c.ServiceName) + continue + } + if c.Mode != pb.ContractMode_CONTRACT_MODE_STRICT_PROTO { + t.Errorf("service %q should be STRICT_PROTO mode; got %v", c.ServiceName, c.Mode) + } + } +} + +// TestBuildContractRegistry_NilServer_ReturnsEmpty asserts the helper is +// safe to call with a nil server (returns an empty registry rather than +// panicking) — defensive contract for callers that may construct the +// helper before the gRPC server exists. +func TestBuildContractRegistry_NilServer_ReturnsEmpty(t *testing.T) { + registry := sdk.BuildContractRegistry(nil) + if registry == nil { + t.Fatalf("expected non-nil empty ContractRegistry") + } + if len(registry.Contracts) != 0 { + t.Fatalf("expected empty contracts; got %d", len(registry.Contracts)) + } +} + +func serviceNamesFromRegistry(r *pb.ContractRegistry) map[string]bool { + out := make(map[string]bool, len(r.Contracts)) + for _, c := range r.Contracts { + if c.Kind == pb.ContractKind_CONTRACT_KIND_SERVICE { + out[c.ServiceName] = true + } + } + return out +} + +// iacContractProviderStub satisfies Required + Enumerator + DriftDetector +// to exercise the multi-service registration path. +type iacContractProviderStub struct { + pb.UnimplementedIaCProviderRequiredServer + pb.UnimplementedIaCProviderEnumeratorServer + pb.UnimplementedIaCProviderDriftDetectorServer +} From 092e49039ed0082687d30b7ef121725de410c2ac Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 10 May 2026 02:55:44 -0400 Subject: [PATCH 5/8] feat(wfctl): IaC plugin pre-flight gate building block + iac-typed-cutover runbook MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task 18 of the strict-contracts force-cutover plan (docs/plans/2026-05-10-strict-contracts-force-cutover.md, rev5). Adds two pieces: 1. cmd/wfctl/iac_loader_gate.go — the pre-flight gate building block. AssertIaCPluginAdvertisesRequiredService(name, version, registry) inspects a *pb.ContractRegistry response from GetContractRegistry and returns nil iff the plugin advertises workflow.plugin.external.iac.IaCProviderRequired as a CONTRACT_KIND_SERVICE descriptor. On failure: an actionable error naming the offending plugin + version, citing .wfctl-lock.yaml as the migration target, and pointing to docs/runbooks/iac-typed-cutover.md, wrapping errLegacyIaCPlugin for IsLegacyIaCPluginErr dispatch. The function is the load-bearing predicate the deploy / infra-plan / infra-apply call sites will invoke after their GetContractRegistry RPC succeeds (wiring left for the typed- client cutover already in progress in Task 16; this commit ships the testable predicate so the wiring is one-line drop-in). 2. docs/runbooks/iac-typed-cutover.md — operator-facing runbook for the cutover. Covers: - Compatibility matrix (wfctl × DO plugin version combinations, pre-flight expected outcomes). - Upgrade order: plugins first, then wfctl. Documents WHY this ordering matters (legacy wfctl + v1.0.0 plugin works; v1.0.0 wfctl + legacy plugin refuses). - .wfctl-lock.yaml migration (lockfile shape unchanged; only the version pin needs editing). - Troubleshooting: legacy-plugin pre-flight error, EnumeratorAll-style messages from pre-cutover wfctl, state-file decode regressions, advertised-but-buggy plugins. - Backout plan: re-pin legacy plugin + wfctl while in the rc1 window. Tests (cmd/wfctl/iac_loader_gate_test.go) — 7 cases, all PASS: - TypedRegistryAccepts: SERVICE-kind descriptor for IaCProviderRequired. - LegacyRegistryRejects: ContractRegistry without the required service → wrapped error names plugin + version + runbook. - NilRegistryRejects: defensive contract for nil registry input. - EmptyContractsRejects: no descriptors at all → still legacy. - WrongKindRejects: ServiceName matches but Kind != SERVICE. - EmptyMetadataDefaults: name/version absent → graceful "". - IsLegacyIaCPluginErr_NoFalsePositives: sentinel match is typed (not string-based) so dispatch sites can errors.Is cleanly. Stacked on feat/iac-sdk-contracts-task5 (Task 5 PR #602 provides BuildContractRegistry — the wfctl-side gate inspects what plugins emit via that helper, so this PR builds on it). Verification: GOWORK=off go test -race ./cmd/wfctl/... PASS; GOWORK=off go vet ./cmd/wfctl/ clean; gofmt clean. Rollback: revert this commit. The pre-flight gate is a standalone predicate function — no production code currently depends on it (dispatch wiring lands in the typed-client cutover Task 16). The runbook is documentation; no operational impact from removal. --- cmd/wfctl/iac_loader_gate.go | 91 +++++++++++++++ cmd/wfctl/iac_loader_gate_test.go | 145 ++++++++++++++++++++++++ docs/runbooks/iac-typed-cutover.md | 171 +++++++++++++++++++++++++++++ 3 files changed, 407 insertions(+) create mode 100644 cmd/wfctl/iac_loader_gate.go create mode 100644 cmd/wfctl/iac_loader_gate_test.go create mode 100644 docs/runbooks/iac-typed-cutover.md diff --git a/cmd/wfctl/iac_loader_gate.go b/cmd/wfctl/iac_loader_gate.go new file mode 100644 index 00000000..b08c403a --- /dev/null +++ b/cmd/wfctl/iac_loader_gate.go @@ -0,0 +1,91 @@ +package main + +import ( + "errors" + "fmt" + + pb "github.com/GoCodeAlone/workflow/plugin/external/proto" +) + +// iacRequiredServiceName is the fully-qualified name of the typed +// IaCProviderRequired gRPC service emitted by iac.proto. The pre-flight +// gate looks for exactly this string in the plugin's GetContractRegistry +// response. +const iacRequiredServiceName = "workflow.plugin.external.iac.IaCProviderRequired" + +// errLegacyIaCPlugin is the typed sentinel returned when a pinned IaC +// plugin does not advertise IaCProviderRequired in its +// ContractRegistry. Wrapped errors that errors.Is on this sentinel +// surface the install-time mitigation step. +// +// The dispatch sites (wfctl deploy, wfctl infra plan/apply) catch this +// and exit with the actionable message documented in +// docs/runbooks/iac-typed-cutover.md. +var errLegacyIaCPlugin = errors.New("iac: plugin uses legacy InvokeService dispatch removed in workflow v1.0.0") + +// AssertIaCPluginAdvertisesRequiredService inspects a *pb.ContractRegistry +// (the response from GetContractRegistry) and returns nil iff the plugin +// advertises a CONTRACT_KIND_SERVICE descriptor for +// workflow.plugin.external.iac.IaCProviderRequired. +// +// The error names the offending plugin (pluginName + pluginVersion) and +// points operators at docs/runbooks/iac-typed-cutover.md, plus wraps +// errLegacyIaCPlugin for errors.Is dispatch. +// +// Per Task 18 of the strict-contracts force-cutover plan: workflow +// v1.0.0 refuses to start a deploy if any pinned IaC plugin doesn't +// expose pb.IaCProviderServer registration. The check happens at the +// plugin-loader boundary (after GetContractRegistry succeeds) so the +// failure surfaces with a typed mitigation rather than as a generic +// "method not found" gRPC status at the first IaC RPC. +// +// pluginName + pluginVersion are forwarded to the error message; pass +// the values from the plugin's manifest (Manifest.Name + Version). +// They are advisory — the function still rejects a registry that +// lacks the typed service even when called with empty strings. +func AssertIaCPluginAdvertisesRequiredService(pluginName, pluginVersion string, registry *pb.ContractRegistry) error { + if !registryAdvertisesIaCRequired(registry) { + name := pluginName + if name == "" { + name = "" + } + version := pluginVersion + if version == "" { + version = "" + } + return fmt.Errorf( + "plugin %q v%s uses legacy InvokeService dispatch removed in workflow v1.0.0. "+ + "Migration: edit .wfctl-lock.yaml to pin v1.0.0+, then re-run "+ + "`wfctl plugin install`. See docs/runbooks/iac-typed-cutover.md: %w", + name, version, errLegacyIaCPlugin, + ) + } + return nil +} + +// registryAdvertisesIaCRequired returns true iff registry contains a +// CONTRACT_KIND_SERVICE descriptor naming +// workflow.plugin.external.iac.IaCProviderRequired. Treats nil +// registry / nil contracts slice as "not advertised." +func registryAdvertisesIaCRequired(registry *pb.ContractRegistry) bool { + if registry == nil { + return false + } + for _, c := range registry.Contracts { + if c == nil { + continue + } + if c.Kind == pb.ContractKind_CONTRACT_KIND_SERVICE && c.ServiceName == iacRequiredServiceName { + return true + } + } + return false +} + +// IsLegacyIaCPluginErr reports whether err signals a failed IaC +// plugin pre-flight gate. Dispatch sites can use this to attach +// runbook-specific exit codes / messages without inspecting the +// error message string. +func IsLegacyIaCPluginErr(err error) bool { + return errors.Is(err, errLegacyIaCPlugin) +} diff --git a/cmd/wfctl/iac_loader_gate_test.go b/cmd/wfctl/iac_loader_gate_test.go new file mode 100644 index 00000000..9d3f2020 --- /dev/null +++ b/cmd/wfctl/iac_loader_gate_test.go @@ -0,0 +1,145 @@ +package main + +import ( + "errors" + "strings" + "testing" + + pb "github.com/GoCodeAlone/workflow/plugin/external/proto" +) + +// TestAssertIaCPluginAdvertisesRequiredService_TypedRegistryAccepts asserts +// that a ContractRegistry containing a SERVICE-kind descriptor for +// IaCProviderRequired passes the gate silently. Mirrors the +// post-cutover happy path: DO plugin v1.0.0 registers +// IaCProviderRequired via sdk.RegisterAllIaCProviderServices, then +// GetContractRegistry returns the typed-service descriptor that this +// gate looks for. +func TestAssertIaCPluginAdvertisesRequiredService_TypedRegistryAccepts(t *testing.T) { + registry := &pb.ContractRegistry{ + Contracts: []*pb.ContractDescriptor{ + { + Kind: pb.ContractKind_CONTRACT_KIND_SERVICE, + ServiceName: iacRequiredServiceName, + Mode: pb.ContractMode_CONTRACT_MODE_STRICT_PROTO, + }, + }, + } + if err := AssertIaCPluginAdvertisesRequiredService("workflow-plugin-digitalocean", "v1.0.0", registry); err != nil { + t.Fatalf("expected nil for typed registry; got %v", err) + } +} + +// TestAssertIaCPluginAdvertisesRequiredService_LegacyRegistryRejects asserts +// the gate fires for a legacy plugin whose ContractRegistry advertises +// only Module/Step/Trigger contracts (no IaCProviderRequired service). +// The error MUST: name the plugin + version, include the migration +// instructions, point at the runbook, and wrap errLegacyIaCPlugin. +func TestAssertIaCPluginAdvertisesRequiredService_LegacyRegistryRejects(t *testing.T) { + registry := &pb.ContractRegistry{ + Contracts: []*pb.ContractDescriptor{ + { + Kind: pb.ContractKind_CONTRACT_KIND_MODULE, + ModuleType: "do.spaces_bucket", + Mode: pb.ContractMode_CONTRACT_MODE_STRICT_PROTO, + }, + }, + } + err := AssertIaCPluginAdvertisesRequiredService("workflow-plugin-digitalocean", "v0.14.2", registry) + if err == nil { + t.Fatalf("expected legacy-plugin error; got nil") + } + if !IsLegacyIaCPluginErr(err) { + t.Fatalf("error must wrap errLegacyIaCPlugin; got %v", err) + } + for _, want := range []string{ + "workflow-plugin-digitalocean", + "v0.14.2", + ".wfctl-lock.yaml", + "docs/runbooks/iac-typed-cutover.md", + } { + if !strings.Contains(err.Error(), want) { + t.Errorf("error missing %q; got %q", want, err.Error()) + } + } +} + +// TestAssertIaCPluginAdvertisesRequiredService_NilRegistryRejects asserts +// the gate treats a nil registry as legacy (defensive — a plugin that +// fails to return a registry at all is also pre-cutover). +func TestAssertIaCPluginAdvertisesRequiredService_NilRegistryRejects(t *testing.T) { + err := AssertIaCPluginAdvertisesRequiredService("plugin-x", "v0.0.1", nil) + if err == nil { + t.Fatalf("expected error for nil registry") + } + if !IsLegacyIaCPluginErr(err) { + t.Errorf("nil-registry error must wrap errLegacyIaCPlugin") + } +} + +// TestAssertIaCPluginAdvertisesRequiredService_EmptyContractsRejects +// asserts a registry with no contracts is treated as legacy. Catches +// the post-RPC path where GetContractRegistry returns successfully but +// empty (e.g., a plugin that built against typed proto but forgot to +// wire BuildContractRegistry into its ContractProvider hook). +func TestAssertIaCPluginAdvertisesRequiredService_EmptyContractsRejects(t *testing.T) { + registry := &pb.ContractRegistry{} + err := AssertIaCPluginAdvertisesRequiredService("plugin-y", "v1.0.0-rc0", registry) + if err == nil { + t.Fatalf("expected error for empty contracts slice") + } + if !IsLegacyIaCPluginErr(err) { + t.Errorf("empty-contracts error must wrap errLegacyIaCPlugin") + } +} + +// TestAssertIaCPluginAdvertisesRequiredService_WrongKindRejects asserts +// that a descriptor naming IaCProviderRequired but with the wrong +// CONTRACT_KIND (e.g., MODULE instead of SERVICE) does NOT satisfy the +// gate. Guards against a plugin author copy-pasting a service name +// into the wrong descriptor kind. +func TestAssertIaCPluginAdvertisesRequiredService_WrongKindRejects(t *testing.T) { + registry := &pb.ContractRegistry{ + Contracts: []*pb.ContractDescriptor{ + { + Kind: pb.ContractKind_CONTRACT_KIND_MODULE, + ServiceName: iacRequiredServiceName, // wrong kind + Mode: pb.ContractMode_CONTRACT_MODE_STRICT_PROTO, + }, + }, + } + err := AssertIaCPluginAdvertisesRequiredService("plugin-z", "v0.5.0", registry) + if err == nil { + t.Fatalf("expected error: SERVICE-kind required (CONTRACT_KIND_MODULE seen)") + } +} + +// TestAssertIaCPluginAdvertisesRequiredService_EmptyMetadataDefaults +// asserts the error formats unknown plugin metadata gracefully when +// the loader didn't populate name/version (defensive — the gate +// should still surface a reasonable message). +func TestAssertIaCPluginAdvertisesRequiredService_EmptyMetadataDefaults(t *testing.T) { + err := AssertIaCPluginAdvertisesRequiredService("", "", nil) + if err == nil { + t.Fatalf("expected error") + } + if !strings.Contains(err.Error(), "") { + t.Errorf("expected placeholder in error; got %q", err.Error()) + } +} + +// TestIsLegacyIaCPluginErr_NoFalsePositives asserts the sentinel does +// not match unrelated errors. Critical because dispatch sites use this +// to decide between "exit-with-runbook-message" and "exit with the +// generic plugin-load failure path." +func TestIsLegacyIaCPluginErr_NoFalsePositives(t *testing.T) { + if IsLegacyIaCPluginErr(nil) { + t.Errorf("nil should not match") + } + if IsLegacyIaCPluginErr(errors.New("some other error")) { + t.Errorf("unrelated error should not match") + } + if IsLegacyIaCPluginErr(errors.New("plugin uses legacy something")) { + t.Errorf("string-similar error should not match (we wrap a typed sentinel)") + } +} diff --git a/docs/runbooks/iac-typed-cutover.md b/docs/runbooks/iac-typed-cutover.md new file mode 100644 index 00000000..dab2d0e0 --- /dev/null +++ b/docs/runbooks/iac-typed-cutover.md @@ -0,0 +1,171 @@ +# IaC Typed-Contract Cutover Runbook + +This runbook walks operators through upgrading wfctl + IaC plugins across +the strict-contracts force-cutover (workflow `v1.0.0`, DO plugin `v1.0.0`). + +The cutover replaces the legacy `InvokeService` / `*structpb.Struct` +dispatch path for `IaCProvider` and `ResourceDriver` interfaces with +typed gRPC services (`pb.IaCProviderRequiredServer`, plus 6 optional +typed services + `pb.ResourceDriverServer`). See ADRs +[0024](../../decisions/0024-iac-typed-force-cutover.md), +[0025](../../decisions/0025-iac-optional-method-typed-services-not-bool.md), +and [0026](../../decisions/0026-iac-direct-grpc-client-no-wrapper.md) +for the design decisions. + +## Compatibility matrix + +| wfctl version | DO plugin version | Outcome | +|------------------|----------------------|------------------------------------------------------------| +| v0.27.x | v0.14.x | Legacy InvokeService dispatch (pre-cutover, supported) | +| v1.0.0-rc1 | v0.14.x | Pre-flight gate fails — wfctl refuses to start the deploy | +| v1.0.0-rc1 | v1.0.0 | Typed gRPC, advisory checks, cutover-ready | +| **v1.0.0** final | **v1.0.0** | Typed gRPC, strict; legacy paths deleted from wfctl | +| v1.0.0 | v0.14.x | wfctl refuses with actionable error pointing here | + +Operators MUST upgrade plugins before wfctl. The pre-flight gate +(`cmd/wfctl/iac_loader_gate.go`) reads `GetContractRegistry` from each +loaded IaC plugin and refuses to proceed when a plugin doesn't +advertise `workflow.plugin.external.iac.IaCProviderRequired`. The +error message names the offending plugin + version and points back to +this runbook. + +## Upgrade order + +The order is **plugins first, then wfctl** — never the other way +around. Upgrading wfctl while plugins are stale leaves the operator +with a wfctl that refuses to load the existing plugins. Upgrading +plugins while wfctl is stale is harmless: legacy wfctl can still +dispatch through the typed plugins because v1.0.0 plugins also expose +the legacy InvokeService surface during the rc1 window for backward +compatibility (the legacy surface is removed when wfctl ships +v1.0.0 final). + +### Step 1 — pin DO plugin v1.0.0 in `.wfctl-lock.yaml` + +```yaml +# .wfctl-lock.yaml (edit by hand, then re-resolve) +plugins: + digitalocean: + version: "v1.0.0" + # The checksum will be regenerated by `wfctl plugin install`. + checksum: "" +``` + +Re-resolve: + +```sh +wfctl plugin install +``` + +This downloads the v1.0.0 plugin binary, verifies the checksum, and +writes the resolved digest back into `.wfctl-lock.yaml`. + +### Step 2 — verify the typed contract surface is advertised + +```sh +wfctl plugin contracts --plugin digitalocean +``` + +The output MUST include: + +``` +workflow.plugin.external.iac.IaCProviderRequired +``` + +If `IaCProviderRequired` is missing, the plugin you installed is not a +v1.0.0 build (likely a stale cache). Clear `~/.wfctl/cache/plugins` +and re-run `wfctl plugin install`. + +### Step 3 — upgrade wfctl + +Once every IaC plugin in the lockfile advertises +`IaCProviderRequired`, upgrade wfctl itself. The pre-flight gate runs +on every IaC-touching command (`wfctl infra plan`, `wfctl infra +apply`, `wfctl deploy`) and surfaces an error at the boundary if any +pinned plugin is still legacy. + +```sh +brew upgrade wfctl # or your preferred installer +wfctl infra plan -c infra.yaml -e prod +``` + +A successful `infra plan` against your existing config confirms the +cutover landed. + +## `.wfctl-lock.yaml` migration + +The lockfile shape did NOT change in v1.0.0. The cutover is wire-format +only (gRPC envelope between wfctl and plugin); the on-disk lockfile + +state-file schemas are invariant. See PR #608's pre-flight test +(`cmd/wfctl/state_compat_test.go`) for the schema-stability guard. + +Existing lockfiles continue to work. The only required edit is the +plugin version pin (Step 1 above). + +## Troubleshooting + +### "plugin X uses legacy InvokeService dispatch removed in workflow v1.0.0" + +The pre-flight gate fired. The plugin pinned in `.wfctl-lock.yaml` is +older than the v1.0.0 release. Re-run Step 1. + +If the lockfile already pins v1.0.0+ but the error persists, the +plugin cache may have a stale binary: + +```sh +rm -rf ~/.wfctl/cache/plugins/digitalocean* +wfctl plugin install +``` + +### "no loaded provider implements EnumeratorAll" (or similar) + +Pre-cutover behavior. Indicates the legacy `*remoteIaCProvider` proxy +encountered a plugin that exposed only a subset of the optional +sub-interfaces. After the cutover, this message no longer appears — +each optional capability is advertised as a typed gRPC service in +`GetContractRegistry`. If you see this message after the upgrade, you +did NOT upgrade wfctl; verify with `wfctl --version`. + +### "decode v0.14.2 state failed: schema regression" + +The state-file format invariant has been violated. File a bug against +the workflow repo and include the affected state file (redact secrets). +Production state files written by v0.14.x MUST decode cleanly through +v1.0.0 — the pre-flight test +(`cmd/wfctl/state_compat_test.go::TestStateFileCompat_v0_14_2_to_v1_0_0`) +guards this. + +### Plugin advertises `IaCProviderRequired` but a deploy still fails with a typed-RPC error + +The plugin's typed implementation has a bug. Roll back to the previous +plugin version in `.wfctl-lock.yaml` (re-pin the older version, re-run +`wfctl plugin install`) and file a bug against the plugin repo. The +pre-flight gate only confirms the typed service is **advertised**; it +cannot validate that the implementation is correct. The +`AssertProviderCapabilitiesMatchRegistration` BDD helper +(`wftest/bdd/strict_iac.go`) is the development-time guard for that. + +## Backout plan + +If a regression surfaces after the cutover: + +1. Re-pin DO plugin to the latest v0.14.x in `.wfctl-lock.yaml`. +2. Re-pin wfctl to v0.27.x via your distribution's install path + (`brew install wfctl@0.27` or equivalent). +3. Re-run `wfctl plugin install` to refresh the lockfile. +4. File a bug against the workflow repo with the failing + `wfctl infra plan` output. + +The backout is **fully supported** through the rc1 window (workflow +v1.0.0-rc1 + DO plugin v1.0.0). After workflow v1.0.0 final ships and +the legacy InvokeService dispatch is deleted from wfctl, the backout +requires reverting to a v0.27.x wfctl binary — the v1.0.0 binary +cannot dispatch through legacy plugins. + +## See also + +- [ADR 0024 — IaC typed force-cutover](../../decisions/0024-iac-typed-force-cutover.md) +- [ADR 0025 — Optional methods are typed gRPC services](../../decisions/0025-iac-optional-method-typed-services-not-bool.md) +- [ADR 0026 — wfctl uses pb.IaCProviderClient directly](../../decisions/0026-iac-direct-grpc-client-no-wrapper.md) +- [Plan: 2026-05-10-strict-contracts-force-cutover.md](../plans/2026-05-10-strict-contracts-force-cutover.md) +- [Design: 2026-05-10-strict-contracts-force-cutover-design.md](../plans/2026-05-10-strict-contracts-force-cutover-design.md) From c1428557ff414d02ac6a1c1dbe997314ce908329 Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 10 May 2026 03:11:08 -0400 Subject: [PATCH 6/8] =?UTF-8?q?docs(runbook):=20correct=20cutover=20model?= =?UTF-8?q?=20=E2=80=94=20wfctl-side=20rc1=20adapter,=20not=20plugin=20com?= =?UTF-8?q?pat=20shim?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per spec-reviewer's PR 610 IMPORTANT-1 + team-lead's ruling on the correct cutover model (which I as ADR 0024 author should have known already): The runbook previously claimed "v1.0.0 plugins also expose the legacy InvokeService surface during the rc1 window for backward compatibility" and "backout fully supported through rc1 window (workflow v1.0.0-rc1 + DO plugin v1.0.0)". Both wrong. Contradicts ADR 0024 (force-cutover, no compat shim, no build-tag dual-path), Task 9 spec literal ("DELETE module_instance.go"), and workspace memory feedback_force_strict_contracts_no_compat. Corrected cutover model: - workflow v1.0.0-rc1 ships the wfctl-SIDE typed-client adapter alongside the existing wfctl remoteIaCProvider. Plugins are unchanged at v0.14.x; the typed adapter is exercised only when a typed-aware plugin is loaded. This is rc1's role: wfctl-side additive, not plugin-side compat shim. - DO plugin v1.0.0 ships typed-only (Task 9 deletes the legacy internal/module_instance.go switch dispatcher entirely; ResourceDriver Task 11 follows the same pattern). - workflow v1.0.0 final ships typed-only on the wfctl side too (Task 20 removes wfctl-side remoteIaCProvider). Both legacy paths are gone. Specific revisions applied: 1. Compatibility matrix: added the missing v0.27.x × v1.0.0 row marked "BROKEN by design" — operators MUST run wfctl rc1+ to consume DO v1.0.0 because the legacy wfctl binary cannot dispatch through a typed-only plugin. Added explicit Step 4 troubleshooting block for operators who skipped wfctl rc1. 2. Upgrade order rewrite: 5 steps (was 3). Order is wfctl rc1 first (test against v0.14.x plugin set), then DO plugin v1.0.0, then wfctl v1.0.0 final. Each step has its smoke-test command and rollback escape. 3. Backout plan rewrite: explicit "rollback BOTH wfctl AND plugin together" for the post-v1.0.0-final case. Single-side rollback is broken — wfctl v1.0.0 final binary cannot dispatch v0.14.x plugin (legacy adapter deleted in Task 20); legacy v0.27.x wfctl cannot dispatch typed-only DO v1.0.0 (no typed adapter on the legacy binary). Documents the partial-rollback option that exists during the rc1 window only. 4. Top-of-runbook callout: explicit statement that this is a hard cutover with no plugin-side compat shim, citing ADR 0024 and feedback_force_strict_contracts_no_compat. No code changes; documentation only. Verification: markdown rendered locally; cross-references to ADRs + plan + design + state_compat_test.go all resolve. Followups (per spec-reviewer + team-lead Finding 2): - PR description gets a "Wiring deferred to Task 16 (PR 609)" callout with predicate symbol + sentinel + call-site location - Coordination DM to implementer-2 with the wiring contract --- docs/runbooks/iac-typed-cutover.md | 165 ++++++++++++++++++++--------- 1 file changed, 114 insertions(+), 51 deletions(-) diff --git a/docs/runbooks/iac-typed-cutover.md b/docs/runbooks/iac-typed-cutover.md index dab2d0e0..2021deb4 100644 --- a/docs/runbooks/iac-typed-cutover.md +++ b/docs/runbooks/iac-typed-cutover.md @@ -1,7 +1,8 @@ # IaC Typed-Contract Cutover Runbook -This runbook walks operators through upgrading wfctl + IaC plugins across -the strict-contracts force-cutover (workflow `v1.0.0`, DO plugin `v1.0.0`). +This runbook walks operators through upgrading wfctl + IaC plugins +across the strict-contracts force-cutover (workflow `v1.0.0`, DO plugin +`v1.0.0`). The cutover replaces the legacy `InvokeService` / `*structpb.Struct` dispatch path for `IaCProvider` and `ResourceDriver` interfaces with @@ -12,35 +13,55 @@ typed services + `pb.ResourceDriverServer`). See ADRs and [0026](../../decisions/0026-iac-direct-grpc-client-no-wrapper.md) for the design decisions. +This is a **hard cutover**. There is no plugin-side compat shim and no +build-tag dual-path (per ADR 0024 and `feedback_force_strict_contracts_no_compat`). +The wfctl rc1 window is **wfctl-side additive only**: rc1 ships a +typed-client adapter alongside the existing `remoteIaCProvider` so an +operator can install rc1 against their existing `v0.14.x` plugin set +and exercise the new path before forcing a plugin cutover. The plugin +side is typed-only at `v1.0.0`. + ## Compatibility matrix -| wfctl version | DO plugin version | Outcome | -|------------------|----------------------|------------------------------------------------------------| -| v0.27.x | v0.14.x | Legacy InvokeService dispatch (pre-cutover, supported) | -| v1.0.0-rc1 | v0.14.x | Pre-flight gate fails — wfctl refuses to start the deploy | -| v1.0.0-rc1 | v1.0.0 | Typed gRPC, advisory checks, cutover-ready | -| **v1.0.0** final | **v1.0.0** | Typed gRPC, strict; legacy paths deleted from wfctl | -| v1.0.0 | v0.14.x | wfctl refuses with actionable error pointing here | - -Operators MUST upgrade plugins before wfctl. The pre-flight gate -(`cmd/wfctl/iac_loader_gate.go`) reads `GetContractRegistry` from each -loaded IaC plugin and refuses to proceed when a plugin doesn't -advertise `workflow.plugin.external.iac.IaCProviderRequired`. The -error message names the offending plugin + version and points back to -this runbook. +| wfctl version | DO plugin version | Outcome | +|------------------|-------------------|---------------------------------------------------------------------------| +| v0.27.x | v0.14.x | Legacy InvokeService dispatch (pre-cutover, supported) | +| **v1.0.0-rc1** | v0.14.x | wfctl-side legacy path (`remoteIaCProvider`) — supported transition state | +| v1.0.0-rc1 | v1.0.0 | Typed gRPC, advisory checks, cutover-ready | +| **v0.27.x** | **v1.0.0** | **BROKEN by design** — legacy wfctl cannot dispatch typed-only plugin | +| v1.0.0 final | v1.0.0 | Typed gRPC, strict; legacy paths deleted from wfctl | +| v1.0.0 final | v0.14.x | wfctl refuses with actionable error pointing here | + +The pre-flight gate (`cmd/wfctl/iac_loader_gate.go`) reads +`GetContractRegistry` from each loaded IaC plugin and refuses to +proceed when a plugin doesn't advertise +`workflow.plugin.external.iac.IaCProviderRequired`. The error message +names the offending plugin + version and points back to this runbook. ## Upgrade order -The order is **plugins first, then wfctl** — never the other way -around. Upgrading wfctl while plugins are stale leaves the operator -with a wfctl that refuses to load the existing plugins. Upgrading -plugins while wfctl is stale is harmless: legacy wfctl can still -dispatch through the typed plugins because v1.0.0 plugins also expose -the legacy InvokeService surface during the rc1 window for backward -compatibility (the legacy surface is removed when wfctl ships -v1.0.0 final). +The order is **wfctl rc1 first → plugin v1.0.0 second → wfctl v1.0.0 +final third**. Operators MUST run wfctl rc1+ to consume DO `v1.0.0` +because the legacy wfctl binary cannot dispatch through a typed-only +plugin. + +### Step 1 — install wfctl `v1.0.0-rc1` + +The rc1 binary keeps the wfctl-SIDE legacy `remoteIaCProvider` path +alongside the new typed-client adapter. Existing `v0.14.x` plugins +continue to work unchanged; the new typed adapter is exercised only +when a typed-aware plugin is loaded. + +```sh +brew install wfctl@1.0.0-rc1 # or your preferred installer +wfctl --version # verify +wfctl infra plan -c infra.yaml -e prod # smoke-test against current plugin set +``` + +A successful `infra plan` against the existing `v0.14.x` plugin set +confirms rc1 doesn't regress the legacy path. -### Step 1 — pin DO plugin v1.0.0 in `.wfctl-lock.yaml` +### Step 2 — pin DO plugin `v1.0.0` in `.wfctl-lock.yaml` ```yaml # .wfctl-lock.yaml (edit by hand, then re-resolve) @@ -58,9 +79,12 @@ wfctl plugin install ``` This downloads the v1.0.0 plugin binary, verifies the checksum, and -writes the resolved digest back into `.wfctl-lock.yaml`. +writes the resolved digest back into `.wfctl-lock.yaml`. The DO `v1.0.0` +plugin deletes its legacy `internal/module_instance.go` switch +dispatcher entirely (per Task 9 of the cutover plan); only the typed +gRPC services remain. -### Step 2 — verify the typed contract surface is advertised +### Step 3 — verify the typed contract surface is advertised ```sh wfctl plugin contracts --plugin digitalocean @@ -73,24 +97,31 @@ workflow.plugin.external.iac.IaCProviderRequired ``` If `IaCProviderRequired` is missing, the plugin you installed is not a -v1.0.0 build (likely a stale cache). Clear `~/.wfctl/cache/plugins` +`v1.0.0` build (likely a stale cache). Clear `~/.wfctl/cache/plugins` and re-run `wfctl plugin install`. -### Step 3 — upgrade wfctl +### Step 4 — exercise the typed path under wfctl rc1 -Once every IaC plugin in the lockfile advertises -`IaCProviderRequired`, upgrade wfctl itself. The pre-flight gate runs -on every IaC-touching command (`wfctl infra plan`, `wfctl infra -apply`, `wfctl deploy`) and surfaces an error at the boundary if any -pinned plugin is still legacy. +```sh +wfctl infra plan -c infra.yaml -e prod +wfctl infra apply -c infra.yaml -e prod --dry-run +``` + +A successful plan + dry-run apply confirms the typed adapter dispatches +the DO `v1.0.0` plugin correctly. If the pre-flight gate fires here, +the plugin install in Step 2 didn't pick up `v1.0.0` — re-check Step 3. + +### Step 5 — upgrade wfctl to `v1.0.0` final (deletes legacy path) ```sh -brew upgrade wfctl # or your preferred installer +brew upgrade wfctl # or your preferred installer; targets v1.0.0 wfctl infra plan -c infra.yaml -e prod ``` -A successful `infra plan` against your existing config confirms the -cutover landed. +Workflow `v1.0.0` final removes the wfctl-side legacy `remoteIaCProvider` +(Task 20 of the cutover plan). The typed adapter is the only IaC +dispatch path. A successful `infra plan` against the DO `v1.0.0` +plugin confirms the cutover landed. ## `.wfctl-lock.yaml` migration @@ -100,16 +131,16 @@ state-file schemas are invariant. See PR #608's pre-flight test (`cmd/wfctl/state_compat_test.go`) for the schema-stability guard. Existing lockfiles continue to work. The only required edit is the -plugin version pin (Step 1 above). +plugin version pin (Step 2 above). ## Troubleshooting ### "plugin X uses legacy InvokeService dispatch removed in workflow v1.0.0" The pre-flight gate fired. The plugin pinned in `.wfctl-lock.yaml` is -older than the v1.0.0 release. Re-run Step 1. +older than the `v1.0.0` release. Re-run Step 2. -If the lockfile already pins v1.0.0+ but the error persists, the +If the lockfile already pins `v1.0.0+` but the error persists, the plugin cache may have a stale binary: ```sh @@ -117,6 +148,22 @@ rm -rf ~/.wfctl/cache/plugins/digitalocean* wfctl plugin install ``` +### Operator skipped Step 1 (wfctl rc1) and went directly to plugin v1.0.0 + +The `v0.27.x × v1.0.0` matrix row is **broken by design**. The legacy +wfctl binary's `remoteIaCProvider` proxy issues `InvokeService` RPCs +against method names like `"IaCProvider.EnumerateAll"`; the typed-only +DO `v1.0.0` plugin returns `codes.Unimplemented` for every one of +those. Symptom: every IaC command fails with "method not found" or +"unimplemented" errors. + +Recover by: + +```sh +brew install wfctl@1.0.0-rc1 # back to a wfctl that has the typed adapter +wfctl infra plan -c infra.yaml -e prod # confirm the typed path works +``` + ### "no loaded provider implements EnumeratorAll" (or similar) Pre-cutover behavior. Indicates the legacy `*remoteIaCProvider` proxy @@ -147,20 +194,36 @@ cannot validate that the implementation is correct. The ## Backout plan -If a regression surfaces after the cutover: +The cutover is hard: there is no plugin-side compat shim. A regression +post-cutover requires rolling back BOTH the wfctl binary AND the DO +plugin to pre-cutover versions. Single-side rollback (only wfctl, only +plugin) is broken — the wfctl `v1.0.0` final binary cannot dispatch +through a `v0.14.x` plugin (legacy `remoteIaCProvider` was deleted in +Task 20), and the legacy `v0.27.x` wfctl cannot dispatch through a DO +`v1.0.0` plugin (typed-only). + +Steps: -1. Re-pin DO plugin to the latest v0.14.x in `.wfctl-lock.yaml`. -2. Re-pin wfctl to v0.27.x via your distribution's install path +1. Re-pin DO plugin to the latest `v0.14.x` in `.wfctl-lock.yaml`. +2. Re-install wfctl `v0.27.x` via your distribution's install path (`brew install wfctl@0.27` or equivalent). 3. Re-run `wfctl plugin install` to refresh the lockfile. -4. File a bug against the workflow repo with the failing - `wfctl infra plan` output. - -The backout is **fully supported** through the rc1 window (workflow -v1.0.0-rc1 + DO plugin v1.0.0). After workflow v1.0.0 final ships and -the legacy InvokeService dispatch is deleted from wfctl, the backout -requires reverting to a v0.27.x wfctl binary — the v1.0.0 binary -cannot dispatch through legacy plugins. +4. Verify rollback: + ```sh + wfctl --version # must show v0.27.x + wfctl infra plan -c infra.yaml -e prod + ``` +5. File a bug against the workflow repo with the failing `wfctl infra + plan` output from the cutover state. + +If rolled-back state holds for >24h, file the bug as `priority:high` +(operators are stuck on the pre-cutover line). + +The rc1 window provides a partial-rollback option: while wfctl is on +`v1.0.0-rc1`, falling back to `v0.14.x` plugin is supported (rc1 +retains the wfctl-side legacy adapter for exactly this purpose). After +wfctl `v1.0.0` final ships, the both-sides rollback is the only +supported recovery. ## See also From f7e1d358d32ac610b5504570cc291e68ad922ddf Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 10 May 2026 03:18:06 -0400 Subject: [PATCH 7/8] =?UTF-8?q?refactor(wfctl):=20rename=20iacRequiredServ?= =?UTF-8?q?iceName=20=E2=86=92=20iacServiceRequired?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cross-task naming coordination with PR #605/#609 (implementer-2, Tasks 30/16). Their iac_typed_adapter.go declares 8 sibling consts naming every typed IaC service: iacServiceRequired iacServiceEnumerator iacServiceDriftDetector iacServiceCredentialRevoker iacServiceMigrationRepairer iacServiceValidator iacServiceDriftConfigDetect iacServiceResourceDriver PR #610 originally introduced its own const iacRequiredServiceName for the same Required service FQN. Spec-reviewer flagged the inconsistency and asked us to coordinate. Implementer-2 + I agreed their convention wins (8 siblings establish the pattern; my single const matches). Pure rename; no behavior change. Tests still pass. Verification: GOWORK=off go test ./cmd/wfctl/ -run \ "TestAssertIaCPluginAdvertises|TestIsLegacyIaCPluginErr" \ -count=1 → PASS (7/7); gofmt clean. Once PR #610 merges, implementer-2's PR #609 rebase can drop their duplicate const and import iacServiceRequired from here. --- cmd/wfctl/iac_loader_gate.go | 10 +++++++--- cmd/wfctl/iac_loader_gate_test.go | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cmd/wfctl/iac_loader_gate.go b/cmd/wfctl/iac_loader_gate.go index b08c403a..41bba8d6 100644 --- a/cmd/wfctl/iac_loader_gate.go +++ b/cmd/wfctl/iac_loader_gate.go @@ -7,11 +7,15 @@ import ( pb "github.com/GoCodeAlone/workflow/plugin/external/proto" ) -// iacRequiredServiceName is the fully-qualified name of the typed +// iacServiceRequired is the fully-qualified name of the typed // IaCProviderRequired gRPC service emitted by iac.proto. The pre-flight // gate looks for exactly this string in the plugin's GetContractRegistry // response. -const iacRequiredServiceName = "workflow.plugin.external.iac.IaCProviderRequired" +// +// Naming convention matches the iac_typed_adapter.go const family +// (PR #605/#609 — iacServiceEnumerator, iacServiceDriftDetector, …) +// so the wfctl-side typed-client code shares a single naming style. +const iacServiceRequired = "workflow.plugin.external.iac.IaCProviderRequired" // errLegacyIaCPlugin is the typed sentinel returned when a pinned IaC // plugin does not advertise IaCProviderRequired in its @@ -75,7 +79,7 @@ func registryAdvertisesIaCRequired(registry *pb.ContractRegistry) bool { if c == nil { continue } - if c.Kind == pb.ContractKind_CONTRACT_KIND_SERVICE && c.ServiceName == iacRequiredServiceName { + if c.Kind == pb.ContractKind_CONTRACT_KIND_SERVICE && c.ServiceName == iacServiceRequired { return true } } diff --git a/cmd/wfctl/iac_loader_gate_test.go b/cmd/wfctl/iac_loader_gate_test.go index 9d3f2020..994db547 100644 --- a/cmd/wfctl/iac_loader_gate_test.go +++ b/cmd/wfctl/iac_loader_gate_test.go @@ -20,7 +20,7 @@ func TestAssertIaCPluginAdvertisesRequiredService_TypedRegistryAccepts(t *testin Contracts: []*pb.ContractDescriptor{ { Kind: pb.ContractKind_CONTRACT_KIND_SERVICE, - ServiceName: iacRequiredServiceName, + ServiceName: iacServiceRequired, Mode: pb.ContractMode_CONTRACT_MODE_STRICT_PROTO, }, }, @@ -103,7 +103,7 @@ func TestAssertIaCPluginAdvertisesRequiredService_WrongKindRejects(t *testing.T) Contracts: []*pb.ContractDescriptor{ { Kind: pb.ContractKind_CONTRACT_KIND_MODULE, - ServiceName: iacRequiredServiceName, // wrong kind + ServiceName: iacServiceRequired, // wrong kind Mode: pb.ContractMode_CONTRACT_MODE_STRICT_PROTO, }, }, From 318b7b001780617326f7dc5d7525e4cfcf107514 Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 10 May 2026 07:44:14 -0400 Subject: [PATCH 8/8] fix(wfctl): drop duplicate iacServiceRequired const (now lives in iac_typed_adapter.go on main) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #605 merged iac_typed_adapter.go to main with iacServiceRequired const. PR #610's iac_loader_gate.go declared it independently; collision after cascade-merge. Removed the duplicate; use canonical const from iac_typed_adapter.go directly. Build clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- cmd/wfctl/iac_loader_gate.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/cmd/wfctl/iac_loader_gate.go b/cmd/wfctl/iac_loader_gate.go index 41bba8d6..79380eee 100644 --- a/cmd/wfctl/iac_loader_gate.go +++ b/cmd/wfctl/iac_loader_gate.go @@ -7,15 +7,9 @@ import ( pb "github.com/GoCodeAlone/workflow/plugin/external/proto" ) -// iacServiceRequired is the fully-qualified name of the typed -// IaCProviderRequired gRPC service emitted by iac.proto. The pre-flight -// gate looks for exactly this string in the plugin's GetContractRegistry -// response. -// -// Naming convention matches the iac_typed_adapter.go const family -// (PR #605/#609 — iacServiceEnumerator, iacServiceDriftDetector, …) -// so the wfctl-side typed-client code shares a single naming style. -const iacServiceRequired = "workflow.plugin.external.iac.IaCProviderRequired" +// iacServiceRequired declared in iac_typed_adapter.go (PR #605, merged on +// main). This file uses the canonical const directly — the pre-flight gate +// looks for exactly that string in the plugin's GetContractRegistry response. // errLegacyIaCPlugin is the typed sentinel returned when a pinned IaC // plugin does not advertise IaCProviderRequired in its