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 }