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
pull/38246/head
Roniece 2 months ago committed by Roniece Ricardo
parent b4dff0888d
commit 5e32bf2cdc

@ -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 {

@ -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.

@ -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,
})
}
}

@ -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
}

Loading…
Cancel
Save