From 5e32bf2cdc5de01f4c17fed12e020957ef6535ec Mon Sep 17 00:00:00 2001 From: Roniece Date: Wed, 18 Feb 2026 13:01:40 -0500 Subject: [PATCH] Add trigger information to action invocation status and progress Include the action trigger (lifecycle or invoke) in ActionInvocationStatus and ActionInvocationProgress messages to uniquely identify action invocations triggered by different events. Additional context: https://github.com/hashicorp/terraform/pull/38051#discussion_r2812460131 --- internal/rpcapi/stacks.go | 99 +++++++++++++++---- .../stackruntime/hooks/resource_instance.go | 2 + .../internal/stackeval/applying.go | 1 + .../internal/stackeval/terraform_hook.go | 3 + 4 files changed, 84 insertions(+), 21 deletions(-) diff --git a/internal/rpcapi/stacks.go b/internal/rpcapi/stacks.go index f7adf2291f..e39c71d103 100644 --- a/internal/rpcapi/stacks.go +++ b/internal/rpcapi/stacks.go @@ -1238,13 +1238,18 @@ func stackChangeHooks(send func(*stacks.StackChangeProgress) error, mainStackSou providerAddr = statusData.ProviderAddr.String() } + protoStatus := &stacks.StackChangeProgress_ActionInvocationStatus{ + Addr: stacks.NewActionInvocationInStackAddr(statusData.Addr), + Status: statusData.Status.ForProtobuf(), + ProviderAddr: providerAddr, + } + + // Set the action trigger oneof + setActionInvocationStatusTrigger(protoStatus, statusData.Addr.Component, statusData.Trigger) + send(&stacks.StackChangeProgress{ Event: &stacks.StackChangeProgress_ActionInvocationStatus_{ - ActionInvocationStatus: &stacks.StackChangeProgress_ActionInvocationStatus{ - Addr: stacks.NewActionInvocationInStackAddr(statusData.Addr), - Status: statusData.Status.ForProtobuf(), - ProviderAddr: providerAddr, - }, + ActionInvocationStatus: protoStatus, }, }) @@ -1263,13 +1268,18 @@ func stackChangeHooks(send func(*stacks.StackChangeProgress) error, mainStackSou providerAddr = progressData.ProviderAddr.String() } + protoProgress := &stacks.StackChangeProgress_ActionInvocationProgress{ + Addr: stacks.NewActionInvocationInStackAddr(progressData.Addr), + Message: progressData.Message, + ProviderAddr: providerAddr, + } + + // Set the action trigger oneof + setActionInvocationProgressTrigger(protoProgress, progressData.Addr.Component, progressData.Trigger) + send(&stacks.StackChangeProgress{ Event: &stacks.StackChangeProgress_ActionInvocationProgress_{ - ActionInvocationProgress: &stacks.StackChangeProgress_ActionInvocationProgress{ - Addr: stacks.NewActionInvocationInStackAddr(progressData.Addr), - Message: progressData.Message, - ProviderAddr: providerAddr, - }, + ActionInvocationProgress: protoProgress, }, }) @@ -1394,34 +1404,81 @@ func actionInvocationPlanned(ai *hooks.ActionInvocation) (*stacks.StackChangePro ProviderAddr: ai.ProviderAddr.String(), } - switch trig := ai.Trigger.(type) { + setActionInvocationPlannedTrigger(res, ai.Addr.Component, ai.Trigger) + + return res, nil +} + +// setActionInvocationStatusTrigger sets the ActionTrigger oneof field on an ActionInvocationStatus message. +func setActionInvocationStatusTrigger(msg *stacks.StackChangeProgress_ActionInvocationStatus, component stackaddrs.AbsComponentInstance, trigger plans.ActionTrigger) { + switch trig := trigger.(type) { case *plans.ResourceActionTrigger: - triggerEvent, err := stacks.ActionTriggerEventForStackChangeProgress(trig.TriggerEvent()) - if err != nil { - return nil, err + msg.ActionTrigger = &stacks.StackChangeProgress_ActionInvocationStatus_ResourceActionTrigger{ + ResourceActionTrigger: &stacks.StackChangeProgress_ResourceActionTrigger{ + TriggeringResourceAddress: stacks.NewResourceInstanceInStackAddr( + stackaddrs.AbsResourceInstance{ + Component: component, + Item: trig.TriggeringResourceAddr, + }, + ), + TriggerEvent: stacks.StackChangeProgress_ActionTriggerEvent(trig.TriggerEvent()), + ActionTriggerBlockIndex: int64(trig.ActionTriggerBlockIndex), + ActionsListIndex: int64(trig.ActionsListIndex), + }, } - res.ActionTrigger = &stacks.StackChangeProgress_ActionInvocationPlanned_ResourceActionTrigger{ + case *plans.InvokeActionTrigger: + msg.ActionTrigger = &stacks.StackChangeProgress_ActionInvocationStatus_InvokeActionTrigger{ + InvokeActionTrigger: &stacks.StackChangeProgress_InvokeActionTrigger{}, + } + } +} + +// setActionInvocationProgressTrigger sets the ActionTrigger oneof field on an ActionInvocationProgress message. +func setActionInvocationProgressTrigger(msg *stacks.StackChangeProgress_ActionInvocationProgress, component stackaddrs.AbsComponentInstance, trigger plans.ActionTrigger) { + switch trig := trigger.(type) { + case *plans.ResourceActionTrigger: + msg.ActionTrigger = &stacks.StackChangeProgress_ActionInvocationProgress_ResourceActionTrigger{ ResourceActionTrigger: &stacks.StackChangeProgress_ResourceActionTrigger{ TriggeringResourceAddress: stacks.NewResourceInstanceInStackAddr( stackaddrs.AbsResourceInstance{ - Component: ai.Addr.Component, + Component: component, Item: trig.TriggeringResourceAddr, }, ), - TriggerEvent: triggerEvent, + TriggerEvent: stacks.StackChangeProgress_ActionTriggerEvent(trig.TriggerEvent()), ActionTriggerBlockIndex: int64(trig.ActionTriggerBlockIndex), ActionsListIndex: int64(trig.ActionsListIndex), }, } case *plans.InvokeActionTrigger: - res.ActionTrigger = &stacks.StackChangeProgress_ActionInvocationPlanned_InvokeActionTrigger{ + msg.ActionTrigger = &stacks.StackChangeProgress_ActionInvocationProgress_InvokeActionTrigger{ InvokeActionTrigger: &stacks.StackChangeProgress_InvokeActionTrigger{}, } - default: - return nil, fmt.Errorf("unsupported action invocation trigger type") } +} - return res, nil +// setActionInvocationPlannedTrigger sets the ActionTrigger oneof field on an ActionInvocationPlanned message. +func setActionInvocationPlannedTrigger(msg *stacks.StackChangeProgress_ActionInvocationPlanned, component stackaddrs.AbsComponentInstance, trigger plans.ActionTrigger) { + switch trig := trigger.(type) { + case *plans.ResourceActionTrigger: + msg.ActionTrigger = &stacks.StackChangeProgress_ActionInvocationPlanned_ResourceActionTrigger{ + ResourceActionTrigger: &stacks.StackChangeProgress_ResourceActionTrigger{ + TriggeringResourceAddress: stacks.NewResourceInstanceInStackAddr( + stackaddrs.AbsResourceInstance{ + Component: component, + Item: trig.TriggeringResourceAddr, + }, + ), + TriggerEvent: stacks.StackChangeProgress_ActionTriggerEvent(trig.TriggerEvent()), + ActionTriggerBlockIndex: int64(trig.ActionTriggerBlockIndex), + ActionsListIndex: int64(trig.ActionsListIndex), + }, + } + case *plans.InvokeActionTrigger: + msg.ActionTrigger = &stacks.StackChangeProgress_ActionInvocationPlanned_InvokeActionTrigger{ + InvokeActionTrigger: &stacks.StackChangeProgress_InvokeActionTrigger{}, + } + } } func evtComponentInstanceStatus(ci stackaddrs.AbsComponentInstance, status hooks.ComponentInstanceStatus) *stacks.StackChangeProgress { diff --git a/internal/stacks/stackruntime/hooks/resource_instance.go b/internal/stacks/stackruntime/hooks/resource_instance.go index cf55e33314..c00a93e629 100644 --- a/internal/stacks/stackruntime/hooks/resource_instance.go +++ b/internal/stacks/stackruntime/hooks/resource_instance.go @@ -157,6 +157,7 @@ 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. @@ -171,6 +172,7 @@ 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. diff --git a/internal/stacks/stackruntime/internal/stackeval/applying.go b/internal/stacks/stackruntime/internal/stackeval/applying.go index 6db03af7f1..2ad1704610 100644 --- a/internal/stacks/stackruntime/internal/stackeval/applying.go +++ b/internal/stacks/stackruntime/internal/stackeval/applying.go @@ -140,6 +140,7 @@ func ApplyComponentPlan(ctx context.Context, main *Main, plan *plans.Plan, requi Addr: absActionAddr, ProviderAddr: action.ProviderAddr.Provider, Status: hooks.ActionInvocationPending, + Trigger: action.ActionTrigger, }) } } diff --git a/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go b/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go index 6848d1626f..71d279d04f 100644 --- a/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go +++ b/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go @@ -231,6 +231,7 @@ func (h *componentInstanceTerraformHook) StartAction(id terraform.HookActionIden Addr: ai.Addr, ProviderAddr: providerAddr, Status: hooks.ActionInvocationRunning, + Trigger: ai.Trigger, }) return terraform.HookActionContinue, nil } @@ -249,6 +250,7 @@ func (h *componentInstanceTerraformHook) ProgressAction(id terraform.HookActionI Addr: ai.Addr, ProviderAddr: providerAddr, Message: progress, + Trigger: ai.Trigger, }) return terraform.HookActionContinue, nil } @@ -273,6 +275,7 @@ func (h *componentInstanceTerraformHook) CompleteAction(id terraform.HookActionI Addr: ai.Addr, ProviderAddr: providerAddr, Status: status, + Trigger: ai.Trigger, }) return terraform.HookActionContinue, nil }