diff --git a/workflow/controller/hooks.go b/workflow/controller/hooks.go index 2035199d9e75..d7dd55e91b3c 100644 --- a/workflow/controller/hooks.go +++ b/workflow/controller/hooks.go @@ -24,11 +24,15 @@ func (woc *wfOperationCtx) executeWfLifeCycleHook(ctx context.Context, tmplCtx * if execute { hookNodeName := generateLifeHookNodeName(woc.wf.ObjectMeta.Name, string(hookName)) woc.log.WithField("lifeCycleHook", hookName).WithField("node", hookNodeName).Infof("Running workflow level hooks") - _, err := woc.executeTemplate(ctx, hookNodeName, &wfv1.WorkflowStep{Template: hook.Template, TemplateRef: hook.TemplateRef}, tmplCtx, hook.Arguments, &executeTemplateOpts{}) + hookNode, err := woc.executeTemplate(ctx, hookNodeName, &wfv1.WorkflowStep{Template: hook.Template, TemplateRef: hook.TemplateRef}, tmplCtx, hook.Arguments, &executeTemplateOpts{}) if err != nil { return err } woc.addChildNode(woc.wf.Name, hookNodeName) + // If the hookNode node is HTTP template, it requires HTTP reconciliation, do it here + if hookNode != nil && woc.nodeRequiresTaskSetReconciliation(hookNode.Name) { + woc.taskSetReconciliation(ctx) + } } } diff --git a/workflow/controller/hooks_test.go b/workflow/controller/hooks_test.go index d60b0e3bbc84..9b933c4d51ab 100644 --- a/workflow/controller/hooks_test.go +++ b/workflow/controller/hooks_test.go @@ -986,4 +986,12 @@ spec: woc.globalParams[common.GlobalVarWorkflowFailures], `[{\"displayName\":\"hook-failures\",\"message\":\"Pod failed\",\"templateName\":\"intentional-fail\",\"phase\":\"Failed\",\"podName\":\"hook-failures\"`, ) + assert.Equal(t, wfv1.NodePending, node.Phase) + makePodsPhase(ctx, woc, apiv1.PodFailed) + woc = newWorkflowOperationCtx(woc.wf, controller) + err := woc.podReconciliation(ctx) + assert.NoError(t, err) + node = woc.wf.Status.Nodes.FindByDisplayName("hook-failures.hooks.failure") + assert.NotNil(t, node) + assert.Equal(t, wfv1.NodeFailed, node.Phase) }