From 6a657d474d3436a2e602e77e88b3b13d28fd418f Mon Sep 17 00:00:00 2001 From: Roniece Date: Tue, 2 Dec 2025 20:58:53 -0500 Subject: [PATCH] Implement ProgressAction reporting without debug logging --- .../internal/stackeval/terraform_hook.go | 96 ++++++++++++++++--- 1 file changed, 84 insertions(+), 12 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go b/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go index b07b0beea0..157bd9a3fb 100644 --- a/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go +++ b/internal/stacks/stackruntime/internal/stackeval/terraform_hook.go @@ -5,6 +5,7 @@ package stackeval import ( "context" + "log" "sync" "github.com/hashicorp/terraform/internal/addrs" @@ -56,28 +57,20 @@ func (h *componentInstanceTerraformHook) resourceInstanceObjectAddr(riAddr addrs } } -func (h *componentInstanceTerraformHook) PreDiff(id terraform.HookResourceIdentity, dk addrs.DeposedKey, priorState, proposedNewState cty.Value, err error) (terraform.HookAction, error) { - status := hooks.ResourceInstancePlanning - if err != nil { - status = hooks.ResourceInstanceErrored - } +func (h *componentInstanceTerraformHook) PreDiff(id terraform.HookResourceIdentity, dk addrs.DeposedKey, priorState, proposedNewState cty.Value) (terraform.HookAction, error) { hookMore(h.ctx, h.seq, h.hooks.ReportResourceInstanceStatus, &hooks.ResourceInstanceStatusHookData{ Addr: h.resourceInstanceObjectAddr(id.Addr, dk), ProviderAddr: id.ProviderAddr, - Status: status, + Status: hooks.ResourceInstancePlanning, }) return terraform.HookActionContinue, nil } -func (h *componentInstanceTerraformHook) PostDiff(id terraform.HookResourceIdentity, dk addrs.DeposedKey, action plans.Action, priorState, plannedNewState cty.Value, err error) (terraform.HookAction, error) { - status := hooks.ResourceInstancePlanned - if err != nil { - status = hooks.ResourceInstanceErrored - } +func (h *componentInstanceTerraformHook) PostDiff(id terraform.HookResourceIdentity, dk addrs.DeposedKey, action plans.Action, priorState, plannedNewState cty.Value) (terraform.HookAction, error) { hookMore(h.ctx, h.seq, h.hooks.ReportResourceInstanceStatus, &hooks.ResourceInstanceStatusHookData{ Addr: h.resourceInstanceObjectAddr(id.Addr, dk), ProviderAddr: id.ProviderAddr, - Status: status, + Status: hooks.ResourceInstancePlanned, }) return terraform.HookActionContinue, nil } @@ -211,3 +204,82 @@ func (h *componentInstanceTerraformHook) ResourceInstanceObjectAppliedAction(add func (h *componentInstanceTerraformHook) ResourceInstanceObjectsSuccessfullyApplied() addrs.Set[addrs.AbsResourceInstanceObject] { return h.resourceInstanceObjectApplySuccess } + +// StartAction forwards core action start events into the stacks hooks +// as a status notification reporting that the action is now running. +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()) + hookMore(h.ctx, h.seq, h.hooks.ReportActionInvocationStatus, &hooks.ActionInvocationStatusHookData{ + Addr: ai.Addr, + ProviderAddr: id.ProviderAddr.Provider, + Status: hooks.ActionInvocationRunning, + }) + return terraform.HookActionContinue, nil +} + +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, + ProviderAddr: id.ProviderAddr.Provider, + 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 +} + +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) + + status := hooks.ActionInvocationCompleted + if err != nil { + status = hooks.ActionInvocationErrored + log.Printf("[DEBUG] Action failed with error: %v - reporting ERRORED status", err) + } else { + log.Printf("[DEBUG] Action completed successfully - reporting COMPLETED status") + } + + 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 +} + +// actionInvocationFromHookActionIdentity attempts to build a *hooks.ActionInvocation +// from a core terraform.HookActionIdentity. +func (h *componentInstanceTerraformHook) actionInvocationFromHookActionIdentity(id terraform.HookActionIdentity) *hooks.ActionInvocation { + ai := &hooks.ActionInvocation{ + Addr: stackaddrs.AbsActionInvocationInstance{ + Component: h.addr, + Item: id.Addr, + }, + ProviderAddr: id.ProviderAddr.Provider, + Trigger: id.ActionTrigger, + } + return ai +}