From 1998ea7835c8d65c3b0eefafef90168450a7ebf4 Mon Sep 17 00:00:00 2001 From: Roniece Date: Wed, 3 Dec 2025 09:09:17 -0500 Subject: [PATCH] Fire pending status during preApply --- .../internal/stackeval/applying.go | 20 +++++++++++++ .../internal/stackeval/terraform_hook.go | 28 ++++++------------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/applying.go b/internal/stacks/stackruntime/internal/stackeval/applying.go index a7474e2697..5d74581460 100644 --- a/internal/stacks/stackruntime/internal/stackeval/applying.go +++ b/internal/stacks/stackruntime/internal/stackeval/applying.go @@ -127,6 +127,26 @@ func ApplyComponentPlan(ctx context.Context, main *Main, plan *plans.Plan, requi hookSingle(ctx, hooksFromContext(ctx).PendingComponentInstanceApply, inst.Addr()) seq, ctx := hookBegin(ctx, h.BeginComponentInstanceApply, h.ContextAttach, inst.Addr()) + // Fire PENDING status for all planned action invocations + // These actions are queued and ready to execute during the apply phase + if stackPlan != nil && stackPlan.ActionInvocations.Len() > 0 { + for _, elem := range stackPlan.ActionInvocations.Elems { + actionAddr := elem.Key + action := elem.Value + + absActionAddr := stackaddrs.AbsActionInvocationInstance{ + Component: inst.Addr(), + Item: actionAddr, + } + + hookMore(ctx, seq, h.ReportActionInvocationStatus, &hooks.ActionInvocationStatusHookData{ + Addr: absActionAddr, + ProviderAddr: action.ProviderAddr.Provider, + Status: hooks.ActionInvocationPending, + }) + } + } + moduleTree := inst.ModuleTree(ctx) if moduleTree == nil { // We should not get here because if the configuration was statically diff --git a/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go b/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go index 157bd9a3fb..4f16600155 100644 --- a/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go +++ b/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go @@ -205,12 +205,13 @@ func (h *componentInstanceTerraformHook) ResourceInstanceObjectsSuccessfullyAppl return h.resourceInstanceObjectApplySuccess } -// StartAction forwards core action start events into the stacks hooks -// as a status notification reporting that the action is now running. +// StartAction fires when action execution begins func (h *componentInstanceTerraformHook) StartAction(id terraform.HookActionIdentity) (terraform.HookAction, error) { log.Printf("[DEBUG] terraform_hook.StartAction called for action: %s", id.Addr.String()) ai := h.actionInvocationFromHookActionIdentity(id) - log.Printf("[DEBUG] Reporting action invocation status RUNNING: %s", ai.Addr.String()) + + // Report status transition: RUNNING (action execution starts) + // Note: PENDING status should have been reported during component apply preparation hookMore(h.ctx, h.seq, h.hooks.ReportActionInvocationStatus, &hooks.ActionInvocationStatusHookData{ Addr: ai.Addr, ProviderAddr: id.ProviderAddr.Provider, @@ -219,11 +220,11 @@ func (h *componentInstanceTerraformHook) StartAction(id terraform.HookActionIden return terraform.HookActionContinue, nil } +// ProgressAction fires for intermediate diagnostic messages (NO status changes) func (h *componentInstanceTerraformHook) ProgressAction(id terraform.HookActionIdentity, progress string) (terraform.HookAction, error) { log.Printf("[DEBUG] terraform_hook.ProgressAction called for action: %s, progress=%s", id.Addr.String(), progress) ai := h.actionInvocationFromHookActionIdentity(id) - // Report the progress message log.Printf("[DEBUG] Reporting action invocation progress: %s", progress) hookMore(h.ctx, h.seq, h.hooks.ReportActionInvocationProgress, &hooks.ActionInvocationProgressHookData{ Addr: ai.Addr, @@ -231,28 +232,15 @@ func (h *componentInstanceTerraformHook) ProgressAction(id terraform.HookActionI Message: progress, }) - // Map progress string to appropriate status - status := hooks.ActionInvocationRunning - if progress == "pending" { - status = hooks.ActionInvocationPending - log.Printf("[DEBUG] Mapping progress 'pending' to ActionInvocationPending") - } else { - log.Printf("[DEBUG] Mapping progress '%s' to ActionInvocationRunning", progress) - } - - log.Printf("[DEBUG] Reporting action invocation status: %s", status.String()) - hookMore(h.ctx, h.seq, h.hooks.ReportActionInvocationStatus, &hooks.ActionInvocationStatusHookData{ - Addr: ai.Addr, - ProviderAddr: id.ProviderAddr.Provider, - Status: status, - }) return terraform.HookActionContinue, nil } +// CompleteAction fires when action finishes (success or error) func (h *componentInstanceTerraformHook) CompleteAction(id terraform.HookActionIdentity, err error) (terraform.HookAction, error) { log.Printf("[DEBUG] terraform_hook.CompleteAction called for action: %s, error=%v", id.Addr.String(), err) ai := h.actionInvocationFromHookActionIdentity(id) + // Report final status based on error status := hooks.ActionInvocationCompleted if err != nil { status = hooks.ActionInvocationErrored @@ -261,7 +249,7 @@ func (h *componentInstanceTerraformHook) CompleteAction(id terraform.HookActionI log.Printf("[DEBUG] Action completed successfully - reporting COMPLETED status") } - log.Printf("[DEBUG] Reporting action invocation status: %s", status.String()) + // Report status transition: RUNNING → COMPLETED or ERRORED (action finishes) hookMore(h.ctx, h.seq, h.hooks.ReportActionInvocationStatus, &hooks.ActionInvocationStatusHookData{ Addr: ai.Addr, ProviderAddr: id.ProviderAddr.Provider,