Merge pull request #38204 from hashicorp/mildwonkey/action-prep

simplifying actions prep - renaming action-related node types and some internal fields.
mildwonkey/action-expansion
Kristin Laemmert 3 months ago committed by GitHub
commit 0ce1ae7cd6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -127,7 +127,7 @@ func MarshalActionInvocation(action *plans.ActionInvocationInstanceSrc, schemas
}
switch at := action.ActionTrigger.(type) {
case *plans.LifecycleActionTrigger:
case *plans.ResourceActionTrigger:
ai.LifecycleActionTrigger = &LifecycleActionTrigger{
TriggeringResourceAddress: at.TriggeringResourceAddr.String(),
ActionTriggerEvent: at.TriggerEvent().String(),

@ -34,7 +34,7 @@ func testJSONHookResourceID(addr addrs.AbsResourceInstance) terraform.HookResour
func testJSONLifecycleHook(actionAddr addrs.AbsActionInstance, triggeringResourceAddr addrs.AbsResourceInstance, actionTriggerIndex int, actionsListIndex int) terraform.HookActionIdentity {
return terraform.HookActionIdentity{
Addr: actionAddr,
ActionTrigger: &plans.LifecycleActionTrigger{
ActionTrigger: &plans.ResourceActionTrigger{
TriggeringResourceAddr: triggeringResourceAddr,
ActionTriggerBlockIndex: actionTriggerIndex,
ActionsListIndex: actionsListIndex,

@ -65,7 +65,7 @@ func NewPlannedActionInvocation(aiSrc *plans.ActionInvocationInstanceSrc) *Actio
}
switch trigger := aiSrc.ActionTrigger.(type) {
case *plans.LifecycleActionTrigger:
case *plans.ResourceActionTrigger:
ai.LifecycleTrigger = &ActionInvocationLifecycleTrigger{
TriggeringResource: newResourceAddr(trigger.TriggeringResourceAddr),
TriggeringEvent: trigger.ActionTriggerEvent.String(),

@ -391,7 +391,7 @@ func NewActionStart(id terraform.HookActionIdentity) Hook {
}
switch trigger := id.ActionTrigger.(type) {
case *plans.LifecycleActionTrigger:
case *plans.ResourceActionTrigger:
action.LifecycleTrigger = &lifecycleActionTrigger{
TriggeringResource: newResourceAddr(trigger.TriggeringResourceAddr),
TriggerIndex: trigger.ActionTriggerBlockIndex,
@ -434,7 +434,7 @@ func NewActionProgress(id terraform.HookActionIdentity, message string) Hook {
}
switch trigger := id.ActionTrigger.(type) {
case *plans.LifecycleActionTrigger:
case *plans.ResourceActionTrigger:
action.LifecycleTrigger = &lifecycleActionTrigger{
TriggeringResource: newResourceAddr(trigger.TriggeringResourceAddr),
TriggerIndex: trigger.ActionTriggerBlockIndex,
@ -475,7 +475,7 @@ func NewActionComplete(id terraform.HookActionIdentity) Hook {
}
switch trigger := id.ActionTrigger.(type) {
case *plans.LifecycleActionTrigger:
case *plans.ResourceActionTrigger:
action.LifecycleTrigger = &lifecycleActionTrigger{
TriggeringResource: newResourceAddr(trigger.TriggeringResourceAddr),
TriggerIndex: trigger.ActionTriggerBlockIndex,
@ -518,7 +518,7 @@ func NewActionErrored(id terraform.HookActionIdentity, err error) Hook {
}
switch trigger := id.ActionTrigger.(type) {
case *plans.LifecycleActionTrigger:
case *plans.ResourceActionTrigger:
action.LifecycleTrigger = &lifecycleActionTrigger{
TriggeringResource: newResourceAddr(trigger.TriggeringResourceAddr),
TriggerIndex: trigger.ActionTriggerBlockIndex,

@ -573,7 +573,7 @@ func TestOperationJSON_plan_with_actions(t *testing.T) {
act1 := &plans.ActionInvocationInstanceSrc{
Addr: addrs.Action{Type: "test_action", Name: "hello"}.Instance(addrs.NoKey).Absolute(root),
ActionTrigger: &plans.LifecycleActionTrigger{
ActionTrigger: &plans.ResourceActionTrigger{
TriggeringResourceAddr: boop,
ActionTriggerEvent: configs.AfterCreate,
ActionTriggerBlockIndex: 0,
@ -582,7 +582,7 @@ func TestOperationJSON_plan_with_actions(t *testing.T) {
}
act2 := &plans.ActionInvocationInstanceSrc{
Addr: addrs.Action{Type: "test_other_action", Name: "world"}.Instance(addrs.NoKey).Absolute(root),
ActionTrigger: &plans.LifecycleActionTrigger{
ActionTrigger: &plans.ResourceActionTrigger{
TriggeringResourceAddr: boop,
ActionTriggerEvent: configs.AfterCreate,
ActionTriggerBlockIndex: 0,
@ -591,7 +591,7 @@ func TestOperationJSON_plan_with_actions(t *testing.T) {
}
act3 := &plans.ActionInvocationInstanceSrc{
Addr: addrs.Action{Type: "test_action", Name: "goodbye"}.Instance(addrs.IntKey(0)).Absolute(vpc),
ActionTrigger: &plans.LifecycleActionTrigger{
ActionTrigger: &plans.ResourceActionTrigger{
TriggeringResourceAddr: beep,
ActionTriggerEvent: configs.BeforeUpdate,
ActionTriggerBlockIndex: 1,

@ -46,11 +46,12 @@ type ActionTrigger interface {
}
var (
_ ActionTrigger = (*LifecycleActionTrigger)(nil)
_ ActionTrigger = (*ResourceActionTrigger)(nil)
_ ActionTrigger = (*InvokeActionTrigger)(nil)
)
type LifecycleActionTrigger struct {
// ResourceActionTrigger contains the action trigger configuration from the resource.
type ResourceActionTrigger struct {
TriggeringResourceAddr addrs.AbsResourceInstance
// Information about the trigger
// The event that triggered this action invocation.
@ -61,18 +62,18 @@ type LifecycleActionTrigger struct {
ActionsListIndex int
}
func (t *LifecycleActionTrigger) TriggerEvent() configs.ActionTriggerEvent {
func (t *ResourceActionTrigger) TriggerEvent() configs.ActionTriggerEvent {
return t.ActionTriggerEvent
}
func (t *LifecycleActionTrigger) actionTriggerSigil() {}
func (t *ResourceActionTrigger) actionTriggerSigil() {}
func (t *LifecycleActionTrigger) String() string {
func (t *ResourceActionTrigger) String() string {
return t.TriggeringResourceAddr.String()
}
func (t *LifecycleActionTrigger) Equals(other ActionTrigger) bool {
o, ok := other.(*LifecycleActionTrigger)
func (t *ResourceActionTrigger) Equals(other ActionTrigger) bool {
o, ok := other.(*ResourceActionTrigger)
if !ok {
return false
}
@ -83,8 +84,8 @@ func (t *LifecycleActionTrigger) Equals(other ActionTrigger) bool {
t.ActionTriggerEvent == o.ActionTriggerEvent
}
func (t *LifecycleActionTrigger) Less(other ActionTrigger) bool {
o, ok := other.(*LifecycleActionTrigger)
func (t *ResourceActionTrigger) Less(other ActionTrigger) bool {
o, ok := other.(*ResourceActionTrigger)
if !ok {
return false // We always want to show non-lifecycle actions first
}
@ -98,6 +99,8 @@ func (t *LifecycleActionTrigger) Less(other ActionTrigger) bool {
t.ActionTriggerEvent < o.ActionTriggerEvent)
}
// InvokeActionTrigger contains the configuration for an action triggered
// (invoked) directly via CLI command.
type InvokeActionTrigger struct{}
func (t *InvokeActionTrigger) actionTriggerSigil() {}

@ -622,11 +622,11 @@ func (acs *ActionInvocationInstanceSrc) Less(other *ActionInvocationInstanceSrc)
// of action invocations has already been filtered to invocations against the
// same resource as the current invocation.
func (acs *ActionInvocationInstanceSrc) FilterLaterActionInvocations(actionInvocations []*ActionInvocationInstanceSrc) []*ActionInvocationInstanceSrc {
needleLat := acs.ActionTrigger.(*LifecycleActionTrigger)
needleLat := acs.ActionTrigger.(*ResourceActionTrigger)
var laterInvocations []*ActionInvocationInstanceSrc
for _, invocation := range actionInvocations {
if lat, ok := invocation.ActionTrigger.(*LifecycleActionTrigger); ok {
if lat, ok := invocation.ActionTrigger.(*ResourceActionTrigger); ok {
if sameTriggerEvent(lat, needleLat) && triggersLater(lat, needleLat) {
laterInvocations = append(laterInvocations, invocation)
}
@ -635,10 +635,10 @@ func (acs *ActionInvocationInstanceSrc) FilterLaterActionInvocations(actionInvoc
return laterInvocations
}
func sameTriggerEvent(one, two *LifecycleActionTrigger) bool {
func sameTriggerEvent(one, two *ResourceActionTrigger) bool {
return one.ActionTriggerEvent == two.ActionTriggerEvent
}
func triggersLater(one, two *LifecycleActionTrigger) bool {
func triggersLater(one, two *ResourceActionTrigger) bool {
return one.ActionTriggerBlockIndex > two.ActionTriggerBlockIndex || (one.ActionTriggerBlockIndex == two.ActionTriggerBlockIndex && one.ActionsListIndex > two.ActionsListIndex)
}

@ -749,7 +749,7 @@ func (d *Deferred) ShouldDeferActionInvocation(ai plans.ActionInvocationInstance
var diags tfdiags.Diagnostics
// We only want to defer actions that are lifecycle triggered
at, ok := ai.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := ai.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
return false, diags
}

@ -1335,15 +1335,15 @@ func actionInvocationFromTfplan(rawAction *planproto.ActionInvocationInstance) (
ret.Addr = actionAddr
switch at := rawAction.ActionTrigger.(type) {
case *planproto.ActionInvocationInstance_LifecycleActionTrigger:
triggeringResourceAddrs, diags := addrs.ParseAbsResourceInstanceStr(at.LifecycleActionTrigger.TriggeringResourceAddr)
case *planproto.ActionInvocationInstance_ResourceActionTrigger:
triggeringResourceAddrs, diags := addrs.ParseAbsResourceInstanceStr(at.ResourceActionTrigger.TriggeringResourceAddr)
if diags.HasErrors() {
return nil, fmt.Errorf("invalid resource instance address %q: %w",
at.LifecycleActionTrigger.TriggeringResourceAddr, diags.Err())
at.ResourceActionTrigger.TriggeringResourceAddr, diags.Err())
}
var ate configs.ActionTriggerEvent
switch at.LifecycleActionTrigger.TriggerEvent {
switch at.ResourceActionTrigger.TriggerEvent {
case planproto.ActionTriggerEvent_BEFORE_CERATE:
ate = configs.BeforeCreate
case planproto.ActionTriggerEvent_AFTER_CREATE:
@ -1358,12 +1358,12 @@ func actionInvocationFromTfplan(rawAction *planproto.ActionInvocationInstance) (
ate = configs.AfterDestroy
default:
return nil, fmt.Errorf("invalid action trigger event %s", at.LifecycleActionTrigger.TriggerEvent)
return nil, fmt.Errorf("invalid action trigger event %s", at.ResourceActionTrigger.TriggerEvent)
}
ret.ActionTrigger = &plans.LifecycleActionTrigger{
ret.ActionTrigger = &plans.ResourceActionTrigger{
TriggeringResourceAddr: triggeringResourceAddrs,
ActionTriggerBlockIndex: int(at.LifecycleActionTrigger.ActionTriggerBlockIndex),
ActionsListIndex: int(at.LifecycleActionTrigger.ActionsListIndex),
ActionTriggerBlockIndex: int(at.ResourceActionTrigger.ActionTriggerBlockIndex),
ActionsListIndex: int(at.ResourceActionTrigger.ActionsListIndex),
ActionTriggerEvent: ate,
}
case *planproto.ActionInvocationInstance_InvokeActionTrigger:
@ -1406,7 +1406,7 @@ func actionInvocationToTfPlan(action *plans.ActionInvocationInstanceSrc) (*planp
}
switch at := action.ActionTrigger.(type) {
case *plans.LifecycleActionTrigger:
case *plans.ResourceActionTrigger:
triggerEvent := planproto.ActionTriggerEvent_INVALID_EVENT
switch at.ActionTriggerEvent {
case configs.BeforeCreate:
@ -1422,8 +1422,8 @@ func actionInvocationToTfPlan(action *plans.ActionInvocationInstanceSrc) (*planp
case configs.AfterDestroy:
triggerEvent = planproto.ActionTriggerEvent_AFTER_DESTROY
}
ret.ActionTrigger = &planproto.ActionInvocationInstance_LifecycleActionTrigger{
LifecycleActionTrigger: &planproto.LifecycleActionTrigger{
ret.ActionTrigger = &planproto.ActionInvocationInstance_ResourceActionTrigger{
ResourceActionTrigger: &planproto.ResourceActionTrigger{
TriggerEvent: triggerEvent,
TriggeringResourceAddr: at.TriggeringResourceAddr.String(),
ActionTriggerBlockIndex: int64(at.ActionTriggerBlockIndex),

@ -322,7 +322,7 @@ func examplePlanForTest(t *testing.T) *plans.Plan {
{
Addr: addrs.Action{Type: "example", Name: "foo"}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
ProviderAddr: provider,
ActionTrigger: &plans.LifecycleActionTrigger{
ActionTrigger: &plans.ResourceActionTrigger{
ActionTriggerEvent: configs.BeforeCreate,
ActionTriggerBlockIndex: 2,
ActionsListIndex: 0,
@ -336,7 +336,7 @@ func examplePlanForTest(t *testing.T) *plans.Plan {
{
Addr: addrs.Action{Type: "example", Name: "bar"}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
ProviderAddr: provider,
ActionTrigger: &plans.LifecycleActionTrigger{
ActionTrigger: &plans.ResourceActionTrigger{
ActionTriggerEvent: configs.BeforeCreate,
ActionTriggerBlockIndex: 2,
ActionsListIndex: 1,
@ -353,7 +353,7 @@ func examplePlanForTest(t *testing.T) *plans.Plan {
{
Addr: addrs.Action{Type: "example", Name: "baz"}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
ProviderAddr: provider,
ActionTrigger: &plans.LifecycleActionTrigger{
ActionTrigger: &plans.ResourceActionTrigger{
ActionTriggerEvent: configs.BeforeCreate,
ActionTriggerBlockIndex: 2,
ActionsListIndex: 1,
@ -458,7 +458,7 @@ func examplePlanForTest(t *testing.T) *plans.Plan {
DeferredReason: providers.DeferredReasonDeferredPrereq,
ActionInvocationInstanceSrc: &plans.ActionInvocationInstanceSrc{
Addr: addrs.Action{Type: "test_action", Name: "example"}.Absolute(addrs.RootModuleInstance).Instance(addrs.NoKey),
ActionTrigger: &plans.LifecycleActionTrigger{
ActionTrigger: &plans.ResourceActionTrigger{
TriggeringResourceAddr: addrs.Resource{
Mode: addrs.ManagedResourceMode,
Type: "test_thing",

@ -549,8 +549,8 @@ type Plan struct {
// configuration.
TargetAddrs []string `protobuf:"bytes,5,rep,name=target_addrs,json=targetAddrs,proto3" json:"target_addrs,omitempty"`
// An unordered set of action addresses that must be invoked when applying.
// If no actions are specified then only lifecycle actions should be
// executed.
// If no actions are specified then only resource-triggered actions should
// be executed.
ActionTargetAddrs []string `protobuf:"bytes,32,rep,name=action_target_addrs,json=actionTargetAddrs,proto3" json:"action_target_addrs,omitempty"`
// An unordered set of force-replace addresses to include when applying.
// This must match the set of addresses that was used when creating the
@ -1748,7 +1748,7 @@ type ActionInvocationInstance struct {
SensitiveConfigPaths []*Path `protobuf:"bytes,5,rep,name=sensitive_config_paths,json=sensitiveConfigPaths,proto3" json:"sensitive_config_paths,omitempty"`
// Types that are valid to be assigned to ActionTrigger:
//
// *ActionInvocationInstance_LifecycleActionTrigger
// *ActionInvocationInstance_ResourceActionTrigger
// *ActionInvocationInstance_InvokeActionTrigger
ActionTrigger isActionInvocationInstance_ActionTrigger `protobuf_oneof:"action_trigger"`
unknownFields protoimpl.UnknownFields
@ -1820,10 +1820,10 @@ func (x *ActionInvocationInstance) GetActionTrigger() isActionInvocationInstance
return nil
}
func (x *ActionInvocationInstance) GetLifecycleActionTrigger() *LifecycleActionTrigger {
func (x *ActionInvocationInstance) GetResourceActionTrigger() *ResourceActionTrigger {
if x != nil {
if x, ok := x.ActionTrigger.(*ActionInvocationInstance_LifecycleActionTrigger); ok {
return x.LifecycleActionTrigger
if x, ok := x.ActionTrigger.(*ActionInvocationInstance_ResourceActionTrigger); ok {
return x.ResourceActionTrigger
}
}
return nil
@ -1842,21 +1842,21 @@ type isActionInvocationInstance_ActionTrigger interface {
isActionInvocationInstance_ActionTrigger()
}
type ActionInvocationInstance_LifecycleActionTrigger struct {
LifecycleActionTrigger *LifecycleActionTrigger `protobuf:"bytes,6,opt,name=lifecycle_action_trigger,json=lifecycleActionTrigger,proto3,oneof"`
type ActionInvocationInstance_ResourceActionTrigger struct {
ResourceActionTrigger *ResourceActionTrigger `protobuf:"bytes,6,opt,name=resource_action_trigger,json=resourceActionTrigger,proto3,oneof"`
}
type ActionInvocationInstance_InvokeActionTrigger struct {
InvokeActionTrigger *InvokeActionTrigger `protobuf:"bytes,7,opt,name=invoke_action_trigger,json=invokeActionTrigger,proto3,oneof"`
}
func (*ActionInvocationInstance_LifecycleActionTrigger) isActionInvocationInstance_ActionTrigger() {}
func (*ActionInvocationInstance_ResourceActionTrigger) isActionInvocationInstance_ActionTrigger() {}
func (*ActionInvocationInstance_InvokeActionTrigger) isActionInvocationInstance_ActionTrigger() {}
// LifecycleActionTrigger contains details on the conditions that led to the
// ResourceActionTrigger contains details on the conditions that led to the
// triggering of an action.
type LifecycleActionTrigger struct {
type ResourceActionTrigger struct {
state protoimpl.MessageState `protogen:"open.v1"`
TriggeringResourceAddr string `protobuf:"bytes,1,opt,name=triggering_resource_addr,json=triggeringResourceAddr,proto3" json:"triggering_resource_addr,omitempty"`
TriggerEvent ActionTriggerEvent `protobuf:"varint,2,opt,name=trigger_event,json=triggerEvent,proto3,enum=tfplan.ActionTriggerEvent" json:"trigger_event,omitempty"`
@ -1866,20 +1866,20 @@ type LifecycleActionTrigger struct {
sizeCache protoimpl.SizeCache
}
func (x *LifecycleActionTrigger) Reset() {
*x = LifecycleActionTrigger{}
func (x *ResourceActionTrigger) Reset() {
*x = ResourceActionTrigger{}
mi := &file_planfile_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *LifecycleActionTrigger) String() string {
func (x *ResourceActionTrigger) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*LifecycleActionTrigger) ProtoMessage() {}
func (*ResourceActionTrigger) ProtoMessage() {}
func (x *LifecycleActionTrigger) ProtoReflect() protoreflect.Message {
func (x *ResourceActionTrigger) ProtoReflect() protoreflect.Message {
mi := &file_planfile_proto_msgTypes[16]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -1891,33 +1891,33 @@ func (x *LifecycleActionTrigger) ProtoReflect() protoreflect.Message {
return mi.MessageOf(x)
}
// Deprecated: Use LifecycleActionTrigger.ProtoReflect.Descriptor instead.
func (*LifecycleActionTrigger) Descriptor() ([]byte, []int) {
// Deprecated: Use ResourceActionTrigger.ProtoReflect.Descriptor instead.
func (*ResourceActionTrigger) Descriptor() ([]byte, []int) {
return file_planfile_proto_rawDescGZIP(), []int{16}
}
func (x *LifecycleActionTrigger) GetTriggeringResourceAddr() string {
func (x *ResourceActionTrigger) GetTriggeringResourceAddr() string {
if x != nil {
return x.TriggeringResourceAddr
}
return ""
}
func (x *LifecycleActionTrigger) GetTriggerEvent() ActionTriggerEvent {
func (x *ResourceActionTrigger) GetTriggerEvent() ActionTriggerEvent {
if x != nil {
return x.TriggerEvent
}
return ActionTriggerEvent_INVALID_EVENT
}
func (x *LifecycleActionTrigger) GetActionTriggerBlockIndex() int64 {
func (x *ResourceActionTrigger) GetActionTriggerBlockIndex() int64 {
if x != nil {
return x.ActionTriggerBlockIndex
}
return 0
}
func (x *LifecycleActionTrigger) GetActionsListIndex() int64 {
func (x *ResourceActionTrigger) GetActionsListIndex() int64 {
if x != nil {
return x.ActionsListIndex
}
@ -2349,16 +2349,16 @@ const file_planfile_proto_rawDesc = "" +
"\aunknown\x18\x02 \x01(\bR\aunknown\x120\n" +
"\bidentity\x18\x03 \x01(\v2\x14.tfplan.DynamicValueR\bidentity\":\n" +
"\bDeferred\x12.\n" +
"\x06reason\x18\x01 \x01(\x0e2\x16.tfplan.DeferredReasonR\x06reason\"\x88\x03\n" +
"\x06reason\x18\x01 \x01(\x0e2\x16.tfplan.DeferredReasonR\x06reason\"\x85\x03\n" +
"\x18ActionInvocationInstance\x12\x12\n" +
"\x04addr\x18\x01 \x01(\tR\x04addr\x12\x1a\n" +
"\bprovider\x18\x02 \x01(\tR\bprovider\x127\n" +
"\fconfig_value\x18\x04 \x01(\v2\x14.tfplan.DynamicValueR\vconfigValue\x12B\n" +
"\x16sensitive_config_paths\x18\x05 \x03(\v2\f.tfplan.PathR\x14sensitiveConfigPaths\x12Z\n" +
"\x18lifecycle_action_trigger\x18\x06 \x01(\v2\x1e.tfplan.LifecycleActionTriggerH\x00R\x16lifecycleActionTrigger\x12Q\n" +
"\x16sensitive_config_paths\x18\x05 \x03(\v2\f.tfplan.PathR\x14sensitiveConfigPaths\x12W\n" +
"\x17resource_action_trigger\x18\x06 \x01(\v2\x1d.tfplan.ResourceActionTriggerH\x00R\x15resourceActionTrigger\x12Q\n" +
"\x15invoke_action_trigger\x18\a \x01(\v2\x1b.tfplan.InvokeActionTriggerH\x00R\x13invokeActionTriggerB\x10\n" +
"\x0eaction_trigger\"\xfe\x01\n" +
"\x16LifecycleActionTrigger\x128\n" +
"\x0eaction_trigger\"\xfd\x01\n" +
"\x15ResourceActionTrigger\x128\n" +
"\x18triggering_resource_addr\x18\x01 \x01(\tR\x16triggeringResourceAddr\x12?\n" +
"\rtrigger_event\x18\x02 \x01(\x0e2\x1a.tfplan.ActionTriggerEventR\ftriggerEvent\x12;\n" +
"\x1aaction_trigger_block_index\x18\x03 \x01(\x03R\x17actionTriggerBlockIndex\x12,\n" +
@ -2460,7 +2460,7 @@ var file_planfile_proto_goTypes = []any{
(*Importing)(nil), // 20: tfplan.Importing
(*Deferred)(nil), // 21: tfplan.Deferred
(*ActionInvocationInstance)(nil), // 22: tfplan.ActionInvocationInstance
(*LifecycleActionTrigger)(nil), // 23: tfplan.LifecycleActionTrigger
(*ResourceActionTrigger)(nil), // 23: tfplan.ResourceActionTrigger
(*InvokeActionTrigger)(nil), // 24: tfplan.InvokeActionTrigger
(*ResourceInstanceActionChange)(nil), // 25: tfplan.ResourceInstanceActionChange
nil, // 26: tfplan.Plan.VariablesEntry
@ -2509,9 +2509,9 @@ var file_planfile_proto_depIdxs = []int32{
3, // 37: tfplan.Deferred.reason:type_name -> tfplan.DeferredReason
18, // 38: tfplan.ActionInvocationInstance.config_value:type_name -> tfplan.DynamicValue
19, // 39: tfplan.ActionInvocationInstance.sensitive_config_paths:type_name -> tfplan.Path
23, // 40: tfplan.ActionInvocationInstance.lifecycle_action_trigger:type_name -> tfplan.LifecycleActionTrigger
23, // 40: tfplan.ActionInvocationInstance.resource_action_trigger:type_name -> tfplan.ResourceActionTrigger
24, // 41: tfplan.ActionInvocationInstance.invoke_action_trigger:type_name -> tfplan.InvokeActionTrigger
4, // 42: tfplan.LifecycleActionTrigger.trigger_event:type_name -> tfplan.ActionTriggerEvent
4, // 42: tfplan.ResourceActionTrigger.trigger_event:type_name -> tfplan.ActionTriggerEvent
11, // 43: tfplan.ResourceInstanceActionChange.change:type_name -> tfplan.Change
18, // 44: tfplan.Plan.VariablesEntry.value:type_name -> tfplan.DynamicValue
19, // 45: tfplan.Plan.resource_attr.attr:type_name -> tfplan.Path
@ -2530,7 +2530,7 @@ func file_planfile_proto_init() {
return
}
file_planfile_proto_msgTypes[15].OneofWrappers = []any{
(*ActionInvocationInstance_LifecycleActionTrigger)(nil),
(*ActionInvocationInstance_ResourceActionTrigger)(nil),
(*ActionInvocationInstance_InvokeActionTrigger)(nil),
}
file_planfile_proto_msgTypes[22].OneofWrappers = []any{

@ -108,8 +108,8 @@ message Plan {
repeated string target_addrs = 5;
// An unordered set of action addresses that must be invoked when applying.
// If no actions are specified then only lifecycle actions should be
// executed.
// If no actions are specified then only resource-triggered actions should
// be executed.
repeated string action_target_addrs = 32;
// An unordered set of force-replace addresses to include when applying.
@ -478,14 +478,14 @@ message ActionInvocationInstance {
repeated Path sensitive_config_paths = 5;
oneof action_trigger {
LifecycleActionTrigger lifecycle_action_trigger = 6;
ResourceActionTrigger resource_action_trigger = 6;
InvokeActionTrigger invoke_action_trigger = 7;
}
}
// LifecycleActionTrigger contains details on the conditions that led to the
// ResourceActionTrigger contains details on the conditions that led to the
// triggering of an action.
message LifecycleActionTrigger {
message ResourceActionTrigger {
string triggering_resource_addr = 1;
ActionTriggerEvent trigger_event = 2;
int64 action_trigger_block_index = 3;

@ -102,7 +102,7 @@ resource "test_object" "a" {
}
evaluateHook := func(got HookActionIdentity, wantAddr string, wantEvent configs.ActionTriggerEvent) {
trigger := got.ActionTrigger.(*plans.LifecycleActionTrigger)
trigger := got.ActionTrigger.(*plans.ResourceActionTrigger)
if trigger.ActionTriggerEvent != wantEvent {
t.Errorf("wrong event, got %s, want %s", trigger.ActionTriggerEvent, wantEvent)

@ -368,7 +368,7 @@ resource "other_object" "a" {
if action.Addr.String() != "action.ecosystem.hello" {
t.Fatalf("expected action address to be 'action.ecosystem.hello', got '%s'", action.Addr)
}
at, ok := action.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := action.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", action.ActionTrigger)
}
@ -415,7 +415,7 @@ resource "test_object" "a" {
t.Fatalf("expected action address to be 'action.test_action.hello', got '%s'", action.Addr)
}
at, ok := action.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := action.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", action.ActionTrigger)
}
@ -769,7 +769,7 @@ resource "test_object" "a" {
triggeredEvents := []configs.ActionTriggerEvent{}
for _, action := range p.Changes.ActionInvocations {
at, ok := action.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := action.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", action.ActionTrigger)
}
@ -834,7 +834,7 @@ resource "test_object" "a" {
triggeredEvents := []configs.ActionTriggerEvent{}
for _, action := range p.Changes.ActionInvocations {
at, ok := action.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := action.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", action.ActionTrigger)
}
@ -894,7 +894,7 @@ resource "test_object" "a" {
}
for _, ai := range p.Changes.ActionInvocations {
at, ok := ai.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := ai.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", ai.ActionTrigger)
}
@ -948,7 +948,7 @@ resource "test_object" "a" {
}
for _, ai := range p.Changes.ActionInvocations {
at, ok := ai.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := ai.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", ai.ActionTrigger)
}
@ -1066,9 +1066,9 @@ resource "test_object" "a" {
t.Fatalf("expected action addresses to be 'action.test_action.hello' and 'action.test_action.hello', got %v", actionAddrs)
}
actionTriggers := []plans.LifecycleActionTrigger{}
actionTriggers := []plans.ResourceActionTrigger{}
for _, ai := range p.Changes.ActionInvocations {
at, ok := ai.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := ai.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", ai.ActionTrigger)
}
@ -1127,9 +1127,9 @@ resource "test_object" "a" {
t.Fatalf("expected action addresses to be 'action.test_action.hello[0]' and 'action.test_action.hello[1]', got %v", actionAddrs)
}
actionTriggers := []plans.LifecycleActionTrigger{}
actionTriggers := []plans.ResourceActionTrigger{}
for _, ai := range p.Changes.ActionInvocations {
at, ok := ai.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := ai.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", ai.ActionTrigger)
}
@ -1642,7 +1642,7 @@ resource "other_object" "a" {
t.Fatalf("expected action address to be 'module.mod.action.test_action.hello', got '%s'", action.Addr)
}
at, ok := action.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := action.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", action.ActionTrigger)
}
@ -1696,11 +1696,11 @@ resource "other_object" "a" {
// We know we are run within two child modules, so we can just sort by the triggering resource address
slices.SortFunc(p.Changes.ActionInvocations, func(a, b *plans.ActionInvocationInstanceSrc) int {
at, ok := a.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := a.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", a.ActionTrigger)
}
bt, ok := b.ActionTrigger.(*plans.LifecycleActionTrigger)
bt, ok := b.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", b.ActionTrigger)
}
@ -1716,7 +1716,7 @@ resource "other_object" "a" {
t.Fatalf("expected action address to be 'module.mod[0].action.test_action.hello', got '%s'", action.Addr)
}
at := action.ActionTrigger.(*plans.LifecycleActionTrigger)
at := action.ActionTrigger.(*plans.ResourceActionTrigger)
if !at.TriggeringResourceAddr.Equal(mustResourceInstanceAddr("module.mod[0].other_object.a")) {
t.Fatalf("expected action to have triggering resource address 'module.mod[0].other_object.a', but it is %s", at.TriggeringResourceAddr)
@ -1741,7 +1741,7 @@ resource "other_object" "a" {
t.Fatalf("expected action address to be 'module.mod[1].action.test_action.hello', got '%s'", action2.Addr)
}
a2t := action2.ActionTrigger.(*plans.LifecycleActionTrigger)
a2t := action2.ActionTrigger.(*plans.ResourceActionTrigger)
if !a2t.TriggeringResourceAddr.Equal(mustResourceInstanceAddr("module.mod[1].other_object.a")) {
t.Fatalf("expected action to have triggering resource address 'module.mod[1].other_object.a', but it is %s", a2t.TriggeringResourceAddr)
@ -1861,7 +1861,7 @@ resource "other_object" "a" {
t.Fatalf("expected action address to be 'module.mod.action.test_action.hello', got '%s'", action.Addr)
}
at, ok := action.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := action.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a lifecycle action trigger, got %T", action.ActionTrigger)
}
@ -1916,7 +1916,7 @@ resource "other_object" "a" {
t.Fatalf("expected action address to be 'action.test_action.hello', got '%s'", action.Addr)
}
at, ok := action.ActionTrigger.(*plans.LifecycleActionTrigger)
at, ok := action.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
t.Fatalf("expected action trigger to be a LifecycleActionTrigger, got %T", action.ActionTrigger)
}
@ -2173,8 +2173,8 @@ resource "test_object" "a" {
t.Fatalf("expected deferred action to be deferred due to deferred prereq, but got %s", firstDeferredActionInvocation.DeferredReason)
}
if firstDeferredActionInvocation.ActionInvocationInstanceSrc.ActionTrigger.(*plans.LifecycleActionTrigger).TriggeringResourceAddr.String() != "test_object.a" {
t.Fatalf("expected deferred action to be triggered by test_object.a, but got %s", firstDeferredActionInvocation.ActionInvocationInstanceSrc.ActionTrigger.(*plans.LifecycleActionTrigger).TriggeringResourceAddr.String())
if firstDeferredActionInvocation.ActionInvocationInstanceSrc.ActionTrigger.(*plans.ResourceActionTrigger).TriggeringResourceAddr.String() != "test_object.a" {
t.Fatalf("expected deferred action to be triggered by test_object.a, but got %s", firstDeferredActionInvocation.ActionInvocationInstanceSrc.ActionTrigger.(*plans.ResourceActionTrigger).TriggeringResourceAddr.String())
}
if firstDeferredActionInvocation.ActionInvocationInstanceSrc.Addr.String() != "action.test_action.hello" {
@ -2185,8 +2185,8 @@ resource "test_object" "a" {
if secondDeferredActionInvocation.DeferredReason != providers.DeferredReasonDeferredPrereq {
t.Fatalf("expected second deferred action to be deferred due to deferred prereq, but got %s", secondDeferredActionInvocation.DeferredReason)
}
if secondDeferredActionInvocation.ActionInvocationInstanceSrc.ActionTrigger.(*plans.LifecycleActionTrigger).TriggeringResourceAddr.String() != "test_object.a" {
t.Fatalf("expected second deferred action to be triggered by test_object.a, but got %s", secondDeferredActionInvocation.ActionInvocationInstanceSrc.ActionTrigger.(*plans.LifecycleActionTrigger).TriggeringResourceAddr.String())
if secondDeferredActionInvocation.ActionInvocationInstanceSrc.ActionTrigger.(*plans.ResourceActionTrigger).TriggeringResourceAddr.String() != "test_object.a" {
t.Fatalf("expected second deferred action to be triggered by test_object.a, but got %s", secondDeferredActionInvocation.ActionInvocationInstanceSrc.ActionTrigger.(*plans.ResourceActionTrigger).TriggeringResourceAddr.String())
}
if secondDeferredActionInvocation.ActionInvocationInstanceSrc.Addr.String() != "action.test_action.hello" {

@ -167,9 +167,9 @@ func (b *ApplyGraphBuilder) Steps() []GraphTransformer {
Operation: b.Operation,
ActionTargets: b.ActionTargets,
ConcreteActionTriggerNodeFunc: func(node *nodeAbstractActionTriggerExpand, timing RelativeActionTiming) dag.Vertex {
ConcreteActionTriggerNodeFunc: func(node *nodeAbstractActionTrigger, timing RelativeActionTiming) dag.Vertex {
return &nodeActionTriggerApplyExpand{
nodeAbstractActionTriggerExpand: node,
nodeAbstractActionTrigger: node,
relativeTiming: timing,
}

@ -178,9 +178,9 @@ func (b *PlanGraphBuilder) Steps() []GraphTransformer {
ActionTargets: b.ActionTargets,
queryPlanMode: b.queryPlan,
ConcreteActionTriggerNodeFunc: func(node *nodeAbstractActionTriggerExpand, _ RelativeActionTiming) dag.Vertex {
ConcreteActionTriggerNodeFunc: func(node *nodeAbstractActionTrigger, _ RelativeActionTiming) dag.Vertex {
return &nodeActionTriggerPlanExpand{
nodeAbstractActionTriggerExpand: node,
nodeAbstractActionTrigger: node,
}
},
},

@ -15,21 +15,21 @@ type GraphNodeConfigAction interface {
ActionAddr() addrs.ConfigAction
}
// nodeExpandActionDeclaration represents an action config block in a configuration module,
// which has not yet been expanded.
type nodeExpandActionDeclaration struct {
// nodeExpandAction represents an action config block in a module, which has not
// yet been expanded.
type nodeExpandAction struct {
*NodeAbstractAction
}
var (
_ GraphNodeDynamicExpandable = (*nodeExpandActionDeclaration)(nil)
_ GraphNodeDynamicExpandable = (*nodeExpandAction)(nil)
)
func (n *nodeExpandActionDeclaration) Name() string {
func (n *nodeExpandAction) Name() string {
return n.Addr.String() + " (expand)"
}
func (n *nodeExpandActionDeclaration) DynamicExpand(ctx EvalContext) (*Graph, tfdiags.Diagnostics) {
func (n *nodeExpandAction) DynamicExpand(ctx EvalContext) (*Graph, tfdiags.Diagnostics) {
var g Graph
var diags tfdiags.Diagnostics
expander := ctx.InstanceExpander()
@ -83,7 +83,7 @@ func (n *nodeExpandActionDeclaration) DynamicExpand(ctx EvalContext) (*Graph, tf
// Expand the action instances for this module.
for _, knownInstKey := range knownInstKeys {
node := NodeActionDeclarationInstance{
node := NodeAbstractActionInstance{
Addr: absActAddr.Instance(knownInstKey),
Config: &n.Config,
Schema: n.Schema,
@ -99,7 +99,7 @@ func (n *nodeExpandActionDeclaration) DynamicExpand(ctx EvalContext) (*Graph, tf
return &g, diags
}
func (n *nodeExpandActionDeclaration) recordActionData(ctx EvalContext, addr addrs.AbsAction) (diags tfdiags.Diagnostics) {
func (n *nodeExpandAction) recordActionData(ctx EvalContext, addr addrs.AbsAction) (diags tfdiags.Diagnostics) {
// We'll record our expansion decision in the shared "expander" object
// so that later operations (i.e. DynamicExpand and expression evaluation)

@ -47,7 +47,7 @@ type ConcreteActionNodeFunc func(*NodeAbstractAction) dag.Vertex
// DefaultConcreteActionNodeFunc is the default ConcreteActionNodeFunc used by
// everything except validate.
func DefaultConcreteActionNodeFunc(a *NodeAbstractAction) dag.Vertex {
return &nodeExpandActionDeclaration{
return &nodeExpandAction{
NodeAbstractAction: a,
}
}

@ -13,12 +13,12 @@ import (
"github.com/hashicorp/terraform/internal/tfdiags"
)
// NodeActionDeclarationInstance represents an action in a particular module.
// NodeAbstractActionInstance represents an action in a particular module.
//
// Action Declarations don't do anything by themselves, they are just
// Action configuration blocks don't do anything by themselves, they are just
// coming into effect when they are triggered. We expand them here so that
// when they are referenced we can get the configuration for the action directly.
type NodeActionDeclarationInstance struct {
type NodeAbstractActionInstance struct {
Addr addrs.AbsActionInstance
Config *configs.Action
Schema *providers.ActionSchema
@ -27,21 +27,21 @@ type NodeActionDeclarationInstance struct {
}
var (
_ GraphNodeModuleInstance = (*NodeActionDeclarationInstance)(nil)
_ GraphNodeExecutable = (*NodeActionDeclarationInstance)(nil)
_ GraphNodeReferencer = (*NodeActionDeclarationInstance)(nil)
_ GraphNodeReferenceable = (*NodeActionDeclarationInstance)(nil)
_ GraphNodeModuleInstance = (*NodeAbstractActionInstance)(nil)
_ GraphNodeExecutable = (*NodeAbstractActionInstance)(nil)
_ GraphNodeReferencer = (*NodeAbstractActionInstance)(nil)
_ GraphNodeReferenceable = (*NodeAbstractActionInstance)(nil)
)
func (n *NodeActionDeclarationInstance) Name() string {
func (n *NodeAbstractActionInstance) Name() string {
return n.Addr.String()
}
func (n *NodeActionDeclarationInstance) Path() addrs.ModuleInstance {
func (n *NodeAbstractActionInstance) Path() addrs.ModuleInstance {
return n.Addr.Module
}
func (n *NodeActionDeclarationInstance) Execute(ctx EvalContext, _ walkOperation) tfdiags.Diagnostics {
func (n *NodeAbstractActionInstance) Execute(ctx EvalContext, _ walkOperation) tfdiags.Diagnostics {
var diags tfdiags.Diagnostics
deferrals := ctx.Deferrals()
@ -85,12 +85,12 @@ func (n *NodeActionDeclarationInstance) Execute(ctx EvalContext, _ walkOperation
}
// GraphNodeReferenceable
func (n *NodeActionDeclarationInstance) ReferenceableAddrs() []addrs.Referenceable {
func (n *NodeAbstractActionInstance) ReferenceableAddrs() []addrs.Referenceable {
return []addrs.Referenceable{n.Addr.Action, n.Addr.Action.Action}
}
// GraphNodeReferencer
func (n *NodeActionDeclarationInstance) References() []*addrs.Reference {
func (n *NodeAbstractActionInstance) References() []*addrs.Reference {
var result []*addrs.Reference
c := n.Config
countRefs, _ := langrefs.ReferencesInExpr(addrs.ParseRef, c.Count)
@ -106,6 +106,6 @@ func (n *NodeActionDeclarationInstance) References() []*addrs.Reference {
return result
}
func (n *NodeActionDeclarationInstance) ModulePath() addrs.Module {
func (n *NodeAbstractActionInstance) ModulePath() addrs.Module {
return n.Addr.Module.Module()
}

@ -23,17 +23,17 @@ const (
// ConcreteActionTriggerNodeFunc is a callback type used to convert an
// abstract action trigger to a concrete one of some type.
type ConcreteActionTriggerNodeFunc func(*nodeAbstractActionTriggerExpand, RelativeActionTiming) dag.Vertex
type ConcreteActionTriggerNodeFunc func(*nodeAbstractActionTrigger, RelativeActionTiming) dag.Vertex
type nodeAbstractActionTriggerExpand struct {
type nodeAbstractActionTrigger struct {
Addr addrs.ConfigAction
resolvedProvider addrs.AbsProviderConfig
Config *configs.Action
lifecycleActionTrigger *lifecycleActionTrigger
triggerConfig *actionTriggerConfig
}
type lifecycleActionTrigger struct {
type actionTriggerConfig struct {
resourceAddress addrs.ConfigResource
events []configs.ActionTriggerEvent
actionTriggerBlockIndex int
@ -43,50 +43,43 @@ type lifecycleActionTrigger struct {
conditionExpr hcl.Expression
}
func (at *lifecycleActionTrigger) Name() string {
func (at *actionTriggerConfig) Name() string {
return fmt.Sprintf("%s.lifecycle.action_trigger[%d].actions[%d]", at.resourceAddress.String(), at.actionTriggerBlockIndex, at.actionListIndex)
}
var (
_ GraphNodeReferencer = (*nodeAbstractActionTriggerExpand)(nil)
_ GraphNodeProviderConsumer = (*nodeAbstractActionTriggerExpand)(nil)
_ GraphNodeModulePath = (*nodeAbstractActionTriggerExpand)(nil)
_ GraphNodeReferencer = (*nodeAbstractActionTrigger)(nil)
_ GraphNodeProviderConsumer = (*nodeAbstractActionTrigger)(nil)
_ GraphNodeModulePath = (*nodeAbstractActionTrigger)(nil)
)
func (n *nodeAbstractActionTriggerExpand) Name() string {
triggeredBy := "triggered by "
if n.lifecycleActionTrigger != nil {
triggeredBy += n.lifecycleActionTrigger.resourceAddress.String()
} else {
triggeredBy += "unknown"
}
return fmt.Sprintf("%s %s", n.Addr.String(), triggeredBy)
func (n *nodeAbstractActionTrigger) Name() string {
return fmt.Sprintf("%s triggered by %s", n.Addr.String(), n.triggerConfig.resourceAddress.String())
}
func (n *nodeAbstractActionTriggerExpand) ModulePath() addrs.Module {
func (n *nodeAbstractActionTrigger) ModulePath() addrs.Module {
return n.Addr.Module
}
func (n *nodeAbstractActionTriggerExpand) References() []*addrs.Reference {
func (n *nodeAbstractActionTrigger) References() []*addrs.Reference {
var refs []*addrs.Reference
refs = append(refs, &addrs.Reference{
Subject: n.Addr.Action,
})
if n.lifecycleActionTrigger != nil {
if n.triggerConfig != nil {
refs = append(refs, &addrs.Reference{
Subject: n.lifecycleActionTrigger.resourceAddress.Resource,
Subject: n.triggerConfig.resourceAddress.Resource,
})
conditionRefs, _ := langrefs.ReferencesInExpr(addrs.ParseRef, n.lifecycleActionTrigger.conditionExpr)
conditionRefs, _ := langrefs.ReferencesInExpr(addrs.ParseRef, n.triggerConfig.conditionExpr)
refs = append(refs, conditionRefs...)
}
return refs
}
func (n *nodeAbstractActionTriggerExpand) ProvidedBy() (addr addrs.ProviderConfig, exact bool) {
func (n *nodeAbstractActionTrigger) ProvidedBy() (addr addrs.ProviderConfig, exact bool) {
if n.resolvedProvider.Provider.Type != "" {
return n.resolvedProvider, true
}
@ -99,10 +92,10 @@ func (n *nodeAbstractActionTriggerExpand) ProvidedBy() (addr addrs.ProviderConfi
}, false
}
func (n *nodeAbstractActionTriggerExpand) Provider() (provider addrs.Provider) {
func (n *nodeAbstractActionTrigger) Provider() (provider addrs.Provider) {
return n.Config.Provider
}
func (n *nodeAbstractActionTriggerExpand) SetProvider(config addrs.AbsProviderConfig) {
func (n *nodeAbstractActionTrigger) SetProvider(config addrs.AbsProviderConfig) {
n.resolvedProvider = config
}

@ -14,7 +14,7 @@ import (
)
type nodeActionTriggerApplyExpand struct {
*nodeAbstractActionTriggerExpand
*nodeAbstractActionTrigger
actionInvocationInstances []*plans.ActionInvocationInstanceSrc
relativeTiming RelativeActionTiming
@ -28,14 +28,14 @@ var (
)
func (n *nodeActionTriggerApplyExpand) Name() string {
return fmt.Sprintf("%s (apply - %s)", n.nodeAbstractActionTriggerExpand.Name(), n.relativeTiming)
return fmt.Sprintf("%s (apply - %s)", n.nodeAbstractActionTrigger.Name(), n.relativeTiming)
}
func (n *nodeActionTriggerApplyExpand) DynamicExpand(ctx EvalContext) (*Graph, tfdiags.Diagnostics) {
var g Graph
var diags tfdiags.Diagnostics
if n.lifecycleActionTrigger == nil {
if n.triggerConfig == nil {
panic("Only actions triggered by plan and apply are supported")
}
@ -45,8 +45,8 @@ func (n *nodeActionTriggerApplyExpand) DynamicExpand(ctx EvalContext) (*Graph, t
node := &nodeActionTriggerApplyInstance{
ActionInvocation: ai,
resolvedProvider: n.resolvedProvider,
ActionTriggerRange: n.lifecycleActionTrigger.invokingSubject.Ptr(),
ConditionExpr: n.lifecycleActionTrigger.conditionExpr,
ActionTriggerRange: n.triggerConfig.invokingSubject.Ptr(),
ConditionExpr: n.triggerConfig.conditionExpr,
}
g.Add(node)
invocationMap[ai] = node
@ -75,8 +75,8 @@ func (n *nodeActionTriggerApplyExpand) References() []*addrs.Reference {
Subject: n.Addr.Action,
})
if n.lifecycleActionTrigger != nil {
conditionRefs, _ := langrefs.ReferencesInExpr(addrs.ParseRef, n.lifecycleActionTrigger.conditionExpr)
if n.triggerConfig != nil {
conditionRefs, _ := langrefs.ReferencesInExpr(addrs.ParseRef, n.triggerConfig.conditionExpr)
refs = append(refs, conditionRefs...)
}

@ -42,7 +42,7 @@ func (n *nodeActionTriggerApplyInstance) Execute(ctx EvalContext, wo walkOperati
if n.ConditionExpr != nil {
// We know this must be a lifecycle action, otherwise we would have no condition
at := actionInvocation.ActionTrigger.(*plans.LifecycleActionTrigger)
at := actionInvocation.ActionTrigger.(*plans.ResourceActionTrigger)
condition, conditionDiags := evaluateActionCondition(ctx, actionConditionContext{
// For applying the triggering event is sufficient, if the condition could not have
// been evaluated due to in invalid mix of events we would have caught it durin planning.

@ -46,8 +46,8 @@ func (at *lifecycleActionTriggerInstance) Name() string {
return fmt.Sprintf("%s.lifecycle.action_trigger[%d].actions[%d]", at.resourceAddress.String(), at.actionTriggerBlockIndex, at.actionListIndex)
}
func (at *lifecycleActionTriggerInstance) ActionTrigger(triggeringEvent configs.ActionTriggerEvent) *plans.LifecycleActionTrigger {
return &plans.LifecycleActionTrigger{
func (at *lifecycleActionTriggerInstance) ActionTrigger(triggeringEvent configs.ActionTriggerEvent) *plans.ResourceActionTrigger {
return &plans.ResourceActionTrigger{
TriggeringResourceAddr: at.resourceAddress,
ActionTriggerBlockIndex: at.actionTriggerBlockIndex,
ActionsListIndex: at.actionListIndex,

@ -7,6 +7,7 @@ import (
"fmt"
"github.com/hashicorp/hcl/v2"
"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/configs"
"github.com/hashicorp/terraform/internal/plans"
@ -118,7 +119,7 @@ func (n *NodeActionTriggerPartialExpanded) Execute(ctx EvalContext, op walkOpera
ctx.Deferrals().ReportActionInvocationDeferred(plans.ActionInvocationInstance{
Addr: n.addr.UnknownActionInstance(),
ProviderAddr: n.resolvedProvider,
ActionTrigger: &plans.LifecycleActionTrigger{
ActionTrigger: &plans.ResourceActionTrigger{
TriggeringResourceAddr: n.lifecycleActionTrigger.resourceAddress.UnknownResourceInstance(),
ActionTriggerEvent: triggeringEvent,
ActionTriggerBlockIndex: n.lifecycleActionTrigger.actionTriggerBlockIndex,

@ -14,7 +14,7 @@ import (
)
type nodeActionTriggerPlanExpand struct {
*nodeAbstractActionTriggerExpand
*nodeAbstractActionTrigger
resourceTargets []addrs.Targetable
}
@ -27,14 +27,14 @@ var (
)
func (n *nodeActionTriggerPlanExpand) Name() string {
return fmt.Sprintf("%s (plan)", n.nodeAbstractActionTriggerExpand.Name())
return fmt.Sprintf("%s (plan)", n.nodeAbstractActionTrigger.Name())
}
func (n *nodeActionTriggerPlanExpand) DynamicExpand(ctx EvalContext) (*Graph, tfdiags.Diagnostics) {
var g Graph
var diags tfdiags.Diagnostics
if n.lifecycleActionTrigger == nil {
if n.triggerConfig == nil {
panic("Only actions triggered by plan and apply are supported")
}
@ -51,7 +51,7 @@ func (n *nodeActionTriggerPlanExpand) DynamicExpand(ctx EvalContext) (*Graph, tf
for _, moduleAddr := range pem {
actionAddr := moduleAddr.Action(n.Addr.Action)
resourceAddr := moduleAddr.Resource(n.lifecycleActionTrigger.resourceAddress.Resource)
resourceAddr := moduleAddr.Resource(n.triggerConfig.resourceAddress.Resource)
// And add a node to the graph for this action.
g.Add(&NodeActionTriggerPartialExpanded{
@ -60,21 +60,21 @@ func (n *nodeActionTriggerPlanExpand) DynamicExpand(ctx EvalContext) (*Graph, tf
resolvedProvider: n.resolvedProvider,
lifecycleActionTrigger: &lifecycleActionTriggerPartialExpanded{
resourceAddress: resourceAddr,
events: n.lifecycleActionTrigger.events,
actionTriggerBlockIndex: n.lifecycleActionTrigger.actionTriggerBlockIndex,
actionListIndex: n.lifecycleActionTrigger.actionListIndex,
invokingSubject: n.lifecycleActionTrigger.invokingSubject,
events: n.triggerConfig.events,
actionTriggerBlockIndex: n.triggerConfig.actionTriggerBlockIndex,
actionListIndex: n.triggerConfig.actionListIndex,
invokingSubject: n.triggerConfig.invokingSubject,
},
})
}
}
// First we expand the module
moduleInstances := expander.ExpandModule(n.lifecycleActionTrigger.resourceAddress.Module, false)
moduleInstances := expander.ExpandModule(n.triggerConfig.resourceAddress.Module, false)
for _, module := range moduleInstances {
_, keys, _ := expander.ResourceInstanceKeys(n.lifecycleActionTrigger.resourceAddress.Absolute(module))
_, keys, _ := expander.ResourceInstanceKeys(n.triggerConfig.resourceAddress.Absolute(module))
for _, key := range keys {
absResourceInstanceAddr := n.lifecycleActionTrigger.resourceAddress.Absolute(module).Instance(key)
absResourceInstanceAddr := n.triggerConfig.resourceAddress.Absolute(module).Instance(key)
// If the triggering resource was targeted, make sure the instance
// that triggered this was targeted specifically.
@ -106,7 +106,7 @@ func (n *nodeActionTriggerPlanExpand) DynamicExpand(ctx EvalContext) (*Graph, tf
repData.EachValue = cty.DynamicVal
}
ref, evalActionDiags := evaluateActionExpression(n.lifecycleActionTrigger.actionExpr, repData)
ref, evalActionDiags := evaluateActionExpression(n.triggerConfig.actionExpr, repData)
diags = append(diags, evalActionDiags...)
if diags.HasErrors() {
continue
@ -127,11 +127,11 @@ func (n *nodeActionTriggerPlanExpand) DynamicExpand(ctx EvalContext) (*Graph, tf
actionConfig: n.Config,
lifecycleActionTrigger: &lifecycleActionTriggerInstance{
resourceAddress: absResourceInstanceAddr,
events: n.lifecycleActionTrigger.events,
actionTriggerBlockIndex: n.lifecycleActionTrigger.actionTriggerBlockIndex,
actionListIndex: n.lifecycleActionTrigger.actionListIndex,
invokingSubject: n.lifecycleActionTrigger.invokingSubject,
conditionExpr: n.lifecycleActionTrigger.conditionExpr,
events: n.triggerConfig.events,
actionTriggerBlockIndex: n.triggerConfig.actionTriggerBlockIndex,
actionListIndex: n.triggerConfig.actionListIndex,
invokingSubject: n.triggerConfig.invokingSubject,
conditionExpr: n.triggerConfig.conditionExpr,
},
}

@ -22,13 +22,13 @@ func (t *ActionDiffTransformer) Transform(g *Graph) error {
actionTriggerNodes := addrs.MakeMap[addrs.ConfigResource, []*nodeActionTriggerApplyExpand]()
for _, vs := range g.Vertices() {
if atn, ok := vs.(*nodeActionTriggerApplyExpand); ok {
configResource := actionTriggerNodes.Get(atn.lifecycleActionTrigger.resourceAddress)
actionTriggerNodes.Put(atn.lifecycleActionTrigger.resourceAddress, append(configResource, atn))
configResource := actionTriggerNodes.Get(atn.triggerConfig.resourceAddress)
actionTriggerNodes.Put(atn.triggerConfig.resourceAddress, append(configResource, atn))
}
}
for _, ai := range t.Changes.ActionInvocations {
lat, ok := ai.ActionTrigger.(*plans.LifecycleActionTrigger)
lat, ok := ai.ActionTrigger.(*plans.ResourceActionTrigger)
if !ok {
continue
}
@ -44,7 +44,7 @@ func (t *ActionDiffTransformer) Transform(g *Graph) error {
beforeMatches := atn.relativeTiming == RelativeActionTimingBefore && isBefore
afterMatches := atn.relativeTiming == RelativeActionTimingAfter && isAfter
if (beforeMatches || afterMatches) && atn.lifecycleActionTrigger.actionTriggerBlockIndex == lat.ActionTriggerBlockIndex && atn.lifecycleActionTrigger.actionListIndex == lat.ActionsListIndex {
if (beforeMatches || afterMatches) && atn.triggerConfig.actionTriggerBlockIndex == lat.ActionTriggerBlockIndex && atn.triggerConfig.actionListIndex == lat.ActionsListIndex {
atn.actionInvocationInstances = append(atn.actionInvocationInstances, ai)
}
}

@ -127,10 +127,10 @@ func (t *ActionTriggerConfigTransformer) transformSingle(g *Graph, config *confi
panic(fmt.Sprintf("Could not find node for %s", resourceAddr))
}
abstract := &nodeAbstractActionTriggerExpand{
abstract := &nodeAbstractActionTrigger{
Addr: configAction,
Config: actionConfig,
lifecycleActionTrigger: &lifecycleActionTrigger{
triggerConfig: &actionTriggerConfig{
events: at.Events,
resourceAddress: resourceAddr,
actionExpr: action.Expr,

@ -8,6 +8,7 @@ import (
"log"
"github.com/hashicorp/hcl/v2"
"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/configs"
"github.com/hashicorp/terraform/internal/dag"
@ -103,13 +104,13 @@ func (t *ProviderTransformer) Transform(g *Graph) error {
var diags tfdiags.Diagnostics
// To start, we'll collect the _requested_ provider addresses for each
// node, which we'll then resolve (handling provider inheritence, etc) in
// node, which we'll then resolve (handling provider inheritance, etc) in
// the next step.
// Our "requested" map is from graph vertices to string representations of
// provider config addresses (for deduping) to requests.
type ProviderRequest struct {
Addr addrs.AbsProviderConfig
Exact bool // If true, inheritence from parent modules is not attempted
Exact bool // If true, inheritance from parent modules is not attempted
}
requested := map[dag.Vertex]map[string]ProviderRequest{}
needConfigured := map[string]addrs.AbsProviderConfig{}
@ -286,7 +287,7 @@ func (t *CloseProviderTransformer) Transform(g *Graph) error {
// Now look for all provider consumers and connect them to the appropriate closers.
for _, v := range g.Vertices() {
if actionNode, ok := v.(*nodeExpandActionDeclaration); ok {
if actionNode, ok := v.(*nodeExpandAction); ok {
actionNodes.Put(actionNode.ActionAddr(), actionNode.ResolvedProvider)
}
pc, ok := v.(GraphNodeProviderConsumer)
@ -328,7 +329,7 @@ func (t *CloseProviderTransformer) Transform(g *Graph) error {
// This transformer may create extra nodes that are not needed in practice,
// due to overriding provider configurations in child modules.
// PruneProviderTransformer can then remove these once ProviderTransformer
// has resolved all of the inheritence, etc.
// has resolved all of the inheritance, etc.
type MissingProviderTransformer struct {
// MissingProviderTransformer needs the config to rule out _implied_ default providers
Config *configs.Config
@ -512,7 +513,7 @@ type ProviderConfigTransformer struct {
// each provider node is stored here so that the proxy nodes can look up
// their targets by name.
providers map[string]GraphNodeProvider
// record providers that can be overriden with a proxy
// record providers that can be overridden with a proxy
proxiable map[string]bool
// Config is the root node of the configuration tree to add providers from.

Loading…
Cancel
Save