// Copyright IBM Corp. 2014, 2026 // SPDX-License-Identifier: BUSL-1.1 package hooks import ( "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/plans" "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/rpcapi/terraform1/stacks" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" ) // ResourceInstanceStatus is a UI-focused description of the overall status // for a given resource instance undergoing a Terraform plan or apply // operation. The "pending" and "errored" status are used for both operation // types, and the others will be used only for one of plan or apply. type ResourceInstanceStatus rune //go:generate go tool golang.org/x/tools/cmd/stringer -type=ResourceInstanceStatus resource_instance.go const ( ResourceInstanceStatusInvalid ResourceInstanceStatus = 0 ResourceInstancePending ResourceInstanceStatus = '.' ResourceInstanceRefreshing ResourceInstanceStatus = 'r' ResourceInstanceRefreshed ResourceInstanceStatus = 'R' ResourceInstancePlanning ResourceInstanceStatus = 'p' ResourceInstancePlanned ResourceInstanceStatus = 'P' ResourceInstanceApplying ResourceInstanceStatus = 'a' ResourceInstanceApplied ResourceInstanceStatus = 'A' ResourceInstanceErrored ResourceInstanceStatus = 'E' ) // TODO: move this into the rpcapi package somewhere func (s ResourceInstanceStatus) ForProtobuf() stacks.StackChangeProgress_ResourceInstanceStatus_Status { switch s { case ResourceInstancePending: return stacks.StackChangeProgress_ResourceInstanceStatus_PENDING case ResourceInstanceRefreshing: return stacks.StackChangeProgress_ResourceInstanceStatus_REFRESHING case ResourceInstanceRefreshed: return stacks.StackChangeProgress_ResourceInstanceStatus_REFRESHED case ResourceInstancePlanning: return stacks.StackChangeProgress_ResourceInstanceStatus_PLANNING case ResourceInstancePlanned: return stacks.StackChangeProgress_ResourceInstanceStatus_PLANNED case ResourceInstanceApplying: return stacks.StackChangeProgress_ResourceInstanceStatus_APPLYING case ResourceInstanceApplied: return stacks.StackChangeProgress_ResourceInstanceStatus_APPLIED case ResourceInstanceErrored: return stacks.StackChangeProgress_ResourceInstanceStatus_ERRORED default: return stacks.StackChangeProgress_ResourceInstanceStatus_INVALID } } // ProvisionerStatus is a UI-focused description of the progress of a given // resource instance's provisioner during a Terraform apply operation. Each // specified provisioner will start in "provisioning" state, and progress to // either "provisioned" or "errored". type ProvisionerStatus rune //go:generate go tool golang.org/x/tools/cmd/stringer -type=ProvisionerStatus resource_instance.go const ( ProvisionerStatusInvalid ProvisionerStatus = 0 ProvisionerProvisioning ProvisionerStatus = 'p' ProvisionerProvisioned ProvisionerStatus = 'P' ProvisionerErrored ProvisionerStatus = 'E' ) // TODO: move this into the rpcapi package somewhere func (s ProvisionerStatus) ForProtobuf() stacks.StackChangeProgress_ProvisionerStatus_Status { switch s { case ProvisionerProvisioning: return stacks.StackChangeProgress_ProvisionerStatus_PROVISIONING case ProvisionerProvisioned: return stacks.StackChangeProgress_ProvisionerStatus_PROVISIONING case ProvisionerErrored: return stacks.StackChangeProgress_ProvisionerStatus_ERRORED default: return stacks.StackChangeProgress_ProvisionerStatus_INVALID } } // ResourceInstanceStatusHookData is the argument type for hook callbacks which // signal a resource instance's status updates. type ResourceInstanceStatusHookData struct { Addr stackaddrs.AbsResourceInstanceObject ProviderAddr addrs.Provider Status ResourceInstanceStatus } // ResourceInstanceProvisionerHookData is the argument type for hook callbacks // which signal a resource instance's provisioner progress, including both // status updates and optional provisioner output data. type ResourceInstanceProvisionerHookData struct { Addr stackaddrs.AbsResourceInstanceObject Name string Status ProvisionerStatus Output *string } // ResourceInstanceChange is the argument type for hook callbacks which signal // a detected or planned change for a resource instance resulting from a plan // operation. type ResourceInstanceChange struct { Addr stackaddrs.AbsResourceInstanceObject Change *plans.ResourceInstanceChangeSrc } // DeferredResourceInstanceChange is the argument type for hook callbacks which // signal a deferred change for a resource instance resulting from a plan // operation. type DeferredResourceInstanceChange struct { Reason providers.DeferredReason Change *ResourceInstanceChange } type ActionInvocation struct { Addr stackaddrs.AbsActionInvocationInstance ProviderAddr addrs.Provider Trigger plans.ActionTrigger } // ActionInvocationStatus represents the lifecycle status of an action invocation. type ActionInvocationStatus rune //go:generate go tool golang.org/x/tools/cmd/stringer -type=ActionInvocationStatus resource_instance.go const ( ActionInvocationStatusInvalid ActionInvocationStatus = 0 ActionInvocationPending ActionInvocationStatus = 'p' ActionInvocationRunning ActionInvocationStatus = 'r' ActionInvocationCompleted ActionInvocationStatus = 'C' ActionInvocationErrored ActionInvocationStatus = 'E' ) // ForProtobuf converts the typed status to the protobuf enum value. func (s ActionInvocationStatus) ForProtobuf() stacks.StackChangeProgress_ActionInvocationStatus_Status { switch s { case ActionInvocationPending: return stacks.StackChangeProgress_ActionInvocationStatus_PENDING case ActionInvocationRunning: return stacks.StackChangeProgress_ActionInvocationStatus_RUNNING case ActionInvocationCompleted: return stacks.StackChangeProgress_ActionInvocationStatus_COMPLETED case ActionInvocationErrored: return stacks.StackChangeProgress_ActionInvocationStatus_ERRORED default: return stacks.StackChangeProgress_ActionInvocationStatus_INVALID } } type ActionInvocationStatusHookData struct { Addr stackaddrs.AbsActionInvocationInstance ProviderAddr addrs.Provider Status ActionInvocationStatus Trigger plans.ActionTrigger } // String returns a concise string representation of the action invocation status. func (a *ActionInvocationStatusHookData) String() string { if a == nil { return "" } return a.Addr.String() + " [" + a.Status.String() + "]" } type ActionInvocationProgressHookData struct { Addr stackaddrs.AbsActionInvocationInstance ProviderAddr addrs.Provider Message string Trigger plans.ActionTrigger } // String returns a concise string representation of the action invocation progress. func (a *ActionInvocationProgressHookData) String() string { if a == nil { return "" } return a.Addr.String() + ": " + a.Message }