Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Emit WorkflowNodeRunning Event #5531

Merged

Conversation

kennytrytek
Copy link
Contributor

@kennytrytek kennytrytek commented Mar 27, 2021

Signed-off-by: Kenny Trytek kenneth.g.trytek@gmail.com

Checklist

  • My organization is added to USERS.md.
  • I am committing on my own time.

Feature Request

This pull request adds a Running event to WorkflowNode execution, outlined in #5320.

Testing This Change

Besides the updated unit and functional tests, I ran this change locally with Argo Events installed and a sensor and trigger set up to deliver webhooks to another locally-running server.

Below is a running log of my testing steps as I iterated on this change. Discrete thoughts/iterations are separated by a horizontal line.


Running the hello-world example, I have so far not seen any WorkflowNodeRunning event anywhere. I'm not sure why this is the case, but I will continue to look and see what I am missing. I thought writing to woc.eventRecorder would be sufficient to create these events, but maybe there is another step that I am not aware of.


Running this example from the operator_test.go, I get a different result locally than in the test.

Workflow:

metadata:
  name: steps-events
spec:
  entrypoint: main
  templates:
    - name: main
      steps:
        - - name: a
            template: whalesay
    - name: whalesay
      container:
        image: docker/whalesay:latest

Test result in operator_test.go:

"Normal WorkflowRunning Workflow Running",
"Normal WorkflowNodeRunning Running node steps-events",
"Normal WorkflowNodeRunning Running node steps-events[0]",
"Normal WorkflowNodeRunning Running node steps-events[0].a",
"Normal WorkflowNodeSucceeded Succeeded node steps-events[0].a",
"Normal WorkflowNodeSucceeded Succeeded node steps-events[0]",
"Normal WorkflowNodeSucceeded Succeeded node steps-events",
"Normal WorkflowSucceeded Workflow completed",

Local result from argo submit of that workflow with an Argo Events sensor:

"Normal WorkflowRunning Workflow Running",
"Normal WorkflowNodeRunning Running node steps-events",
"Normal WorkflowNodeRunning Running node steps-events[0]",
"Normal WorkflowNodeSucceeded Succeeded node steps-events[0].a",
"Normal WorkflowNodeSucceeded Succeeded node steps-events[0]",
"Normal WorkflowNodeSucceeded Succeeded node steps-events",
"Normal WorkflowSucceeded Workflow completed",

Note that "Normal WorkflowNodeRunning Running node steps-events[0].a" is missing. I will continue to investigate why this occurs.


Simplifying this test, I see the same results.
Workflow:

metadata:
  name: no-dag-or-steps
spec:
  entrypoint: whalesay
  templates:
  - name: whalesay
    container:
      image: docker/whalesay:latest
      command: [cowsay]
      args: ["hello world"]

operator_test.go result:

"Normal WorkflowRunning Workflow Running",
"Normal WorkflowNodeRunning Running node no-dag-or-steps",
"Normal WorkflowNodeSucceeded Succeeded node no-dag-or-steps",
"Normal WorkflowSucceeded Workflow completed",

Local Argo result:

"Normal WorkflowRunning Workflow Running",
"Normal WorkflowNodeSucceeded Succeeded node no-dag-or-steps",
"Normal WorkflowSucceeded Workflow completed",

Okay, found it. It's this case where the node completes very quickly and is never registered as "running."

woc.log.Debugf("Node %s already completed", nodeName)

Now to decide how to handle it. Should Argo always emit a WorkflowNodeRunning event in the case the node ran to completion, even if the event is artificial? I think it should, so that the events emitted are predictable and not susceptible to race conditions.


Okay, force-pushed my changes since this PR is still in draft.

Latest results running this workflow:

metadata:
  name: no-dag-or-steps
spec:
  entrypoint: whalesay
  templates:
  - name: whalesay
    container:
      image: docker/whalesay:latest
      command: [cowsay]
      args: ["hello world"]

With an Argo event source configured to send events to a locally-running web server, I get these results:

Headers:
{
  "x-argo-event-id": "65316463366232612d613536632d346433362d393232632d633734356233333865663832",
  "x-argo-event-time": "2021-03-30T02:52:28Z",
  "x-argo-event-type": "ADD"
}
Body:
{
  "message": "Workflow Running",
  "reason": "WorkflowRunning",
  "workflow": {
    "api_version": "argoproj.io/v1alpha1",
    "kind": "Workflow",
    "name": "no-dag-or-steps-8ssqw",
    "namespace": "argo",
    "resource_version": "2605483",
    "uid": "140ccd92-5481-4c5d-846b-3177464e4aea"
  }
}
INFO:     97.125.239.208:0 - "POST /api/v1/webhooks/echo HTTP/1.1" 200 OK
Headers:
{
  "x-argo-event-id": "65353539303135612d326337312d343133352d626632322d306630653338373831326666",
  "x-argo-event-time": "2021-03-30T02:52:36Z",
  "x-argo-event-type": "ADD"
}
Body:
{
  "message": "Running node no-dag-or-steps-8ssqw",
  "reason": "WorkflowNodeRunning",
  "workflow": {
    "api_version": "argoproj.io/v1alpha1",
    "kind": "Workflow",
    "name": "no-dag-or-steps-8ssqw",
    "namespace": "argo",
    "resource_version": "2605505",
    "uid": "140ccd92-5481-4c5d-846b-3177464e4aea"
  }
}
INFO:     97.125.239.208:0 - "POST /api/v1/webhooks/echo HTTP/1.1" 200 OK
Headers:
{
  "x-argo-event-id": "65393466646131652d366330312d343532652d626539612d613063333232336439613030",
  "x-argo-event-time": "2021-03-30T02:52:36Z",
  "x-argo-event-type": "ADD"
}
Body:
{
  "message": "Succeeded node no-dag-or-steps-8ssqw",
  "reason": "WorkflowNodeSucceeded",
  "workflow": {
    "api_version": "argoproj.io/v1alpha1",
    "kind": "Workflow",
    "name": "no-dag-or-steps-8ssqw",
    "namespace": "argo",
    "resource_version": "2605505",
    "uid": "140ccd92-5481-4c5d-846b-3177464e4aea"
  }
}
INFO:     97.125.239.208:0 - "POST /api/v1/webhooks/echo HTTP/1.1" 200 OK
Headers:
{
  "x-argo-event-id": "31623137393064652d623162332d343633382d383332652d313735633330613464363062",
  "x-argo-event-time": "2021-03-30T02:52:36Z",
  "x-argo-event-type": "ADD"
}
Body:
{
  "message": "Workflow completed",
  "reason": "WorkflowSucceeded",
  "workflow": {
    "api_version": "argoproj.io/v1alpha1",
    "kind": "Workflow",
    "name": "no-dag-or-steps-8ssqw",
    "namespace": "argo",
    "resource_version": "2605505",
    "uid": "140ccd92-5481-4c5d-846b-3177464e4aea"
  }
}
INFO:     97.125.239.208:0 - "POST /api/v1/webhooks/echo HTTP/1.1" 200 OK

The results here are exactly what was expected: WorkflowRunning, WorkflowNodeRunning, WorkflowNodeSucceeded, WorkflowSucceeded.

@kennytrytek kennytrytek force-pushed the kgt/workflowrunning-event-issue-5320 branch from 1afc23a to 4d40abe Compare March 27, 2021 19:55
@codecov
Copy link

codecov bot commented Mar 27, 2021

Codecov Report

Merging #5531 (2b302e8) into master (91c08cd) will decrease coverage by 0.07%.
The diff coverage is 90.90%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master    #5531      +/-   ##
==========================================
- Coverage   46.91%   46.84%   -0.08%     
==========================================
  Files         244      244              
  Lines       15209    15286      +77     
==========================================
+ Hits         7135     7160      +25     
- Misses       7169     7218      +49     
- Partials      905      908       +3     
Impacted Files Coverage Δ
workflow/controller/operator.go 71.10% <90.90%> (+0.04%) ⬆️
workflow/metrics/server.go 12.50% <0.00%> (-4.17%) ⬇️
workflow/executor/executor.go 16.18% <0.00%> (-0.06%) ⬇️
...kg/apiclient/http1/cron-workflow-service-client.go 0.00% <0.00%> (ø)
...piclient/argo-kube-cron-workflow-service-client.go 0.00% <0.00%> (ø)
...lient/error-translating-workflow-service-client.go 0.00% <0.00%> (ø)
...ient/argo-kube-workflow-template-service-client.go 0.00% <0.00%> (ø)
.../error-translating-cron-workflow-service-client.go 0.00% <0.00%> (ø)
...or-translating-workflow-template-service-client.go 0.00% <0.00%> (ø)
... and 4 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 91c08cd...2b302e8. Read the comment docs.

@kennytrytek kennytrytek force-pushed the kgt/workflowrunning-event-issue-5320 branch from 4d40abe to b1ef536 Compare March 30, 2021 02:55
@kennytrytek kennytrytek reopened this Mar 30, 2021
@kennytrytek kennytrytek marked this pull request as ready for review March 30, 2021 03:28
@alexec alexec linked an issue Mar 30, 2021 that may be closed by this pull request
workflow/controller/operator.go Outdated Show resolved Hide resolved
workflow/controller/operator.go Outdated Show resolved Hide resolved
workflow/controller/operator.go Outdated Show resolved Hide resolved
Copy link
Contributor

@alexec alexec left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about comparing woc.orig to woc.wf at the end of persistUpdates?

@kennytrytek
Copy link
Contributor Author

kennytrytek commented Mar 31, 2021

@alexec:
What about comparing woc.orig to woc.wf at the end of persistUpdates?

Hmm, that does look like a potentially interesting approach. I'll take a look tonight and see if I can make that work. My initial thought is if it does work, then we won't need node event logic anywhere else, but I may be misunderstanding what persistUpdates does at first glance.

@alexec
Copy link
Contributor

alexec commented Mar 31, 2021

I have an unstated secondary goal here. The existing code is not robust. If we can fix it in this PR by a little redesign, that’s a win.

@kennytrytek
Copy link
Contributor Author

@alexec, I have updated the implementation to do all WorkflowNode* event creation from persistUpdates. This solution is much easier to reason about, but has a side-effect that event order is unpredictable for workflow nodes that succeed quickly. This is reflected in the unit test change from assert.Equal to assert.ElementsMatch.

I don't think this is a problem, as event consumers must assume that the order may not be totally deterministic (and Argo or Kubernetes don't make any guarantees along those lines).

@kennytrytek
Copy link
Contributor Author

Shoot, that functional test failure looks related to these changes. I'll have to take another look on Friday.

@kennytrytek
Copy link
Contributor Author

Running those tests locally succeeded. Closing/reopening to try again.

@kennytrytek kennytrytek closed this Apr 1, 2021
@kennytrytek kennytrytek reopened this Apr 1, 2021
@kennytrytek
Copy link
Contributor Author

Functional test failed in a timeout waiting for events, probably waiting for the WorkflowNode* events.

Copy link
Contributor

@alexec alexec left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we're making good progess here

workflow/controller/operator.go Outdated Show resolved Hide resolved
workflow/controller/operator.go Show resolved Hide resolved
workflow/controller/operator.go Outdated Show resolved Hide resolved
@kennytrytek
Copy link
Contributor Author

kennytrytek commented Apr 5, 2021

Implemented your suggestions in my local checkout, but it appears the functional test has revealed a real problem with these changes. This is what I see running locally:

 controller | E0404 22:14:20.698833   72079 event.go:329] Could not construct reference to:
'&v1alpha1.Workflow{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"hello-world-krr5q", GenerateName:"hello-world-",

<snip>

, ArtifactRepositoryRef:(*v1alpha1.ArtifactRepositoryRefStatus)(0xc0005df740)}}' due to: 'no kind is registered for the type v1alpha1.Workflow in scheme "pkg/runtime/scheme.go:101"'.
Will not report event: 'Normal' 'WorkflowNodeRunning' 'Running node hello-world-krr5q'

Still trying to find a solution to that issue...

UPDATE: There is a Slack conversation about this for anyone looking to provide assistance. :)

@alexec
Copy link
Contributor

alexec commented Apr 13, 2021

I checkout out your code changes and found the failed unit tests passes locally. I would sync with master and retry.

@kennytrytek kennytrytek force-pushed the kgt/workflowrunning-event-issue-5320 branch from 1818a70 to b4f8f1d Compare April 13, 2021 19:14
@kennytrytek
Copy link
Contributor Author

kennytrytek commented Apr 13, 2021

Rebased onto latest master, but still see the same error running the functional test:

Will not report event: 'Warning' 'WorkflowNodeFailed' 'Failed node failed-step-event-d5v8q: Error (exit code 1)'

Full error output from the controller logs:

    controller | E0413 14:24:48.448861   45882 event.go:329] Could not construct reference to: '&v1alpha1.Workflow{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"failed-step-event-d5v8q", GenerateName:"failed-step-event-", Namespace:"argo", SelfLink:"/apis/argoproj.io/v1alpha1/namespaces/argo/workflows/failed-step-event-d5v8q", UID:"210a6616-076b-4a0e-b1e0-ec2a8206a18f", ResourceVersion:"2956085", Generation:5, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:63753938653, loc:(*time.Location)(0x3a31a60)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string{"workflows.argoproj.io/completed":"true", "workflows.argoproj.io/phase":"Failed", "workflows.argoproj.io/test":"true"}, Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[]string(nil), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry{v1.ManagedFieldsEntry{Manager:"___TestEventOnNodeFail_in_github_com_argoproj_argo_workflows_v3_test_e2e.test", Operation:"Update", APIVersion:"argoproj.io/v1alpha1", Time:(*v1.Time)(0xc000f137a0), FieldsType:"FieldsV1", FieldsV1:(*v1.FieldsV1)(0xc000f13780)}, v1.ManagedFieldsEntry{Manager:"workflow-controller", Operation:"Update", APIVersion:"argoproj.io/v1alpha1", Time:(*v1.Time)(0xc000f137e0), FieldsType:"FieldsV1", FieldsV1:(*v1.FieldsV1)(0xc000f137c0)}}}, Spec:v1alpha1.WorkflowSpec{Templates:[]v1alpha1.Template{v1alpha1.Template{Name:"exit", Inputs:v1alpha1.Inputs{Parameters:[]v1alpha1.Parameter(nil), Artifacts:v1alpha1.Artifacts(nil)}, Outputs:v1alpha1.Outputs{Parameters:[]v1alpha1.Parameter(nil), Artifacts:v1alpha1.Artifacts(nil), Result:(*string)(nil), ExitCode:(*string)(nil)}, NodeSelector:map[string]string(nil), Affinity:(*v1.Affinity)(nil), Metadata:v1alpha1.Metadata{Annotations:map[string]string(nil), Labels:map[string]string(nil)}, Daemon:(*bool)(nil), Steps:[]v1alpha1.ParallelSteps(nil), Container:(*v1.Container)(0xc000ffedc0), ContainerSet:(*v1alpha1.ContainerSetTemplate)(nil), Script:(*v1alpha1.ScriptTemplate)(nil), Resource:(*v1alpha1.ResourceTemplate)(nil), DAG:(*v1alpha1.DAGTemplate)(nil), Suspend:(*v1alpha1.SuspendTemplate)(nil), Data:(*v1alpha1.Data)(nil), Volumes:[]v1.Volume(nil), InitContainers:[]v1alpha1.UserContainer(nil), Sidecars:[]v1alpha1.UserContainer(nil), ArchiveLocation:(*v1alpha1.ArtifactLocation)(nil), ActiveDeadlineSeconds:(*intstr.IntOrString)(nil), RetryStrategy:(*v1alpha1.RetryStrategy)(nil), Parallelism:(*int64)(nil), FailFast:(*bool)(nil), Tolerations:[]v1.Toleration(nil), SchedulerName:"", PriorityClassName:"", Priority:(*int32)(nil), ServiceAccountName:"", AutomountServiceAccountToken:(*bool)(nil), Executor:(*v1alpha1.ExecutorConfig)(nil), HostAliases:[]v1.HostAlias(nil), SecurityContext:(*v1.PodSecurityContext)(nil), PodSpecPatch:"", Metrics:(*v1alpha1.Metrics)(nil), Synchronization:(*v1alpha1.Synchronization)(nil), Memoize:(*v1alpha1.Memoize)(nil), Timeout:""}}, Entrypoint:"exit", Arguments:v1alpha1.Arguments{Parameters:[]v1alpha1.Parameter(nil), Artifacts:v1alpha1.Artifacts(nil)}, ServiceAccountName:"", AutomountServiceAccountToken:(*bool)(nil), Executor:(*v1alpha1.ExecutorConfig)(nil), Volumes:[]v1.Volume(nil), VolumeClaimTemplates:[]v1.PersistentVolumeClaim(nil), Parallelism:(*int64)(nil), ArtifactRepositoryRef:(*v1alpha1.ArtifactRepositoryRef)(nil), Suspend:(*bool)(nil), NodeSelector:map[string]string(nil), Affinity:(*v1.Affinity)(nil), Tolerations:[]v1.Toleration(nil), ImagePullSecrets:[]v1.LocalObjectReference(nil), HostNetwork:(*bool)(nil), DNSPolicy:(*v1.DNSPolicy)(nil), DNSConfig:(*v1.PodDNSConfig)(nil), OnExit:"", TTLStrategy:(*v1alpha1.TTLStrategy)(0xc000f13840), ActiveDeadlineSeconds:(*int64)(0xc000ff2e80), Priority:(*int32)(nil), SchedulerName:"", PodGC:(*v1alpha1.PodGC)(nil), PodPriorityClassName:"", PodPriority:(*int32)(nil), HostAliases:[]v1.HostAlias(nil), SecurityContext:(*v1.PodSecurityContext)(nil), PodSpecPatch:"terminationGracePeriodSeconds: 3\n", PodDisruptionBudget:(*v1beta1.PodDisruptionBudgetSpec)(nil), Metrics:(*v1alpha1.Metrics)(nil), Shutdown:"", WorkflowTemplateRef:(*v1alpha1.WorkflowTemplateRef)(nil), Synchronization:(*v1alpha1.Synchronization)(nil), VolumeClaimGC:(*v1alpha1.VolumeClaimGC)(nil), RetryStrategy:(*v1alpha1.RetryStrategy)(nil), PodMetadata:(*v1alpha1.Metadata)(nil), TemplateDefaults:(*v1alpha1.Template)(nil)}, Status:v1alpha1.WorkflowStatus{Phase:"Failed", StartedAt:v1.Time{Time:time.Time{wall:0x0, ext:63753938653, loc:(*time.Location)(0x3a31a60)}}, FinishedAt:v1.Time{Time:time.Time{wall:0x0, ext:63753938688, loc:(*time.Location)(0x3a31a60)}}, EstimatedDuration:0, Progress:"1/1", Message:"Error (exit code 1)", CompressedNodes:"", Nodes:v1alpha1.Nodes{"failed-step-event-d5v8q":v1alpha1.NodeStatus{ID:"failed-step-event-d5v8q", Name:"failed-step-event-d5v8q", DisplayName:"failed-step-event-d5v8q", Type:"Pod", TemplateName:"exit", TemplateRef:(*v1alpha1.TemplateRef)(nil), TemplateScope:"local/failed-step-event-d5v8q", Phase:"Failed", BoundaryID:"", Message:"Error (exit code 1)", StartedAt:v1.Time{Time:time.Time{wall:0x0, ext:63753938653, loc:(*time.Location)(0x3a31a60)}}, FinishedAt:v1.Time{Time:time.Time{wall:0x0, ext:63753938687, loc:(*time.Location)(0x3a31a60)}}, EstimatedDuration:0, Progress:"1/1", ResourcesDuration:v1alpha1.ResourcesDuration{"cpu":33, "memory":21}, PodIP:"", Daemoned:(*bool)(nil), Inputs:(*v1alpha1.Inputs)(nil), Outputs:(*v1alpha1.Outputs)(0xc00091e8c0), Children:[]string(nil), OutboundNodes:[]string(nil), HostNodeName:"docker-desktop", MemoizationStatus:(*v1alpha1.MemoizationStatus)(nil), SynchronizationStatus:(*v1alpha1.NodeSynchronizationStatus)(nil)}}, OffloadNodeStatusVersion:"", StoredTemplates:map[string]v1alpha1.Template(nil), PersistentVolumeClaims:[]v1.Volume(nil), Outputs:(*v1alpha1.Outputs)(nil), Conditions:v1alpha1.Conditions{v1alpha1.Condition{Type:"PodRunning", Status:"False", Message:""}, v1alpha1.Condition{Type:"Completed", Status:"True", Message:""}}, ResourcesDuration:v1alpha1.ResourcesDuration{"cpu":33, "memory":21}, StoredWorkflowSpec:(*v1alpha1.WorkflowSpec)(nil), Synchronization:(*v1alpha1.SynchronizationStatus)(nil), ArtifactRepositoryRef:(*v1alpha1.ArtifactRepositoryRefStatus)(0xc00091f0c0)}}' due to: 'no kind is registered for the type v1alpha1.Workflow in scheme "pkg/runtime/scheme.go:101"'. Will not report event: 'Warning' 'WorkflowNodeFailed' 'Failed node failed-step-event-d5v8q: Error (exit code 1)'

 - Issue argoproj#5320

Signed-off-by: Kenny Trytek <kenneth.g.trytek@gmail.com>
 - Remove redundant onNodeComplete function.
 - Separate recording event in assess_node_status to its own conditional statement.
 - Rename function for clarity.

Signed-off-by: Kenny Trytek <kenneth.g.trytek@gmail.com>
 - Consolidate all WorkflowNode* events to one code path.

Signed-off-by: Kenny Trytek <kenneth.g.trytek@gmail.com>
 - Remove extra loop in event-sending logic.
 - Move phase event recording to immediately after woc is updated.

Signed-off-by: Kenny Trytek <kenneth.g.trytek@gmail.com>
 - Reassign woc.wf.TypeMeta during persistUpdates, since the Workflow
   representation returned from the server does not add this field.

Signed-off-by: Kenny Trytek <kenneth.g.trytek@gmail.com>
@kennytrytek kennytrytek force-pushed the kgt/workflowrunning-event-issue-5320 branch from fafdef0 to 26ba3cd Compare April 18, 2021 23:10
@kennytrytek kennytrytek requested a review from alexec April 18, 2021 23:37
@kennytrytek
Copy link
Contributor Author

@alexec This is ready for review whenever you are available.

workflow/controller/operator.go Outdated Show resolved Hide resolved
workflow/controller/operator.go Outdated Show resolved Hide resolved
workflow/controller/operator.go Outdated Show resolved Hide resolved
 - Use DeepCopy for event reporting to avoid modifying the active node.

Signed-off-by: Kenny Trytek <kenneth.g.trytek@gmail.com>
@kennytrytek kennytrytek requested a review from alexec April 28, 2021 01:11
 - Use objects instead of pointers in the method signature to simplify things.

Signed-off-by: Kenny Trytek <kenneth.g.trytek@gmail.com>
@kennytrytek kennytrytek requested a review from alexec April 28, 2021 14:20
Copy link
Contributor

@alexec alexec left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We’re there!

@alexec alexec merged commit 3cdb22a into argoproj:master May 3, 2021
@alexec alexec added this to the v3.1 milestone May 3, 2021
@sarabala1979 sarabala1979 mentioned this pull request May 4, 2021
33 tasks
@Sushant20
Copy link
Contributor

@kennytrytek I have installed Argo version 3.0.7 but I still don't see WorkflowNodeRunning event, is it expected?

@kennytrytek kennytrytek deleted the kgt/workflowrunning-event-issue-5320 branch July 12, 2021 00:17
@kennytrytek
Copy link
Contributor Author

kennytrytek commented Jul 12, 2021

@Sushant20, I believe it was released in Argo 3.1.0. I know it's mentioned in the v3.0.3 cherry-pick, but that does not accurately reflect the release version.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Emit WorkflowNodeRunning Event
3 participants