Open boiledfroginthewell opened 2 hours ago
I patched the workflow controller to always show error messages from expr and then ran the attached workflow again.
It seems .
is not supported in pipelines by expr:
failed to compile: unexpected token Operator(".") (1:28) | sprig.trim(" abc ") | sprig.upper() | ...........................^
If a function is assigned to a variable to avoid .
in a pipeline, the evaluation succeeds:
{{=
let sprig_upper = sprig.upper;
sprig.trim(" abc ") | sprig_upper()
}} # == ABC
I also found that usage of sprig functions is confusing in Argo Workflows. The Argo Workflows document just says
https://argo-workflows.readthedocs.io/en/stable/variables/
You can also use Sprig functions:
but examples in the Sprig document basically do not work in Argo Workflows:
1: Parentheses are required to call functions
# sprig document example: http://masterminds.github.io/sprig/strings.html#trim
{{=sprig.trim " hello "}}
expr error message:
failed to compile: unexpected token String(" hello ") (1:12) | sprig.trim " hello " | ...........^
# Correct syntax in Argo Workflows
{{=sprig.trim(" hello ")}} # == hello
2: The pipe operator (|
) passes a value to different argument positions
# In the sprig document, a left-hand side value is passed to the last argument of the function by the pipe operator
# sprig document example: http://masterminds.github.io/sprig/crypto.html#decryptaes
{{=
let decryptAES = sprig.decryptAES;
"30tEfhuJSVRhpG97XCuWgz2okj7L8vQ1s6V9zVUPeDQ=" | decryptAES("secretkey")
}}
expr error message:
illegal base64 data at input byte 8 (3:54) | "30tEfhuJSVRhpG97XCuWgz2okj7L8vQ1s6V9zVUPeDQ=" | sprig_decryptAES("secretkey") | .....................................................^
# In expr, a left-hand side value is passed to the first argument of the function by the pipe operator
# Correct syntax:
{{=
let decryptAES = sprig.decryptAES;
"secretkey" | decryptAES("30tEfhuJSVRhpG97XCuWgz2okj7L8vQ1s6V9zVUPeDQ=")
}} # == plaintext
The main reason is that Sprig document uses the template engine in the golang standard library while Argo Workflows uses expr.
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: test-workflow-
spec:
ttlStrategy:
secondsAfterCompletion: 1
entrypoint: main
templates:
- name: main
script:
image: busybox:1.37.0
command:
- ash
source: |-
echo '
If a function is assigned to a variable to avoid `.` in a pipeline, the evaluation succeeds:
{{=
let sprig_upper = sprig.upper;
sprig.trim(" abc ") | sprig_upper()
}} # == ABC
sprig document example: http://masterminds.github.io/sprig/strings.html#trim
{{=sprig.trim " hello "}} # fail
Correct syntax in Argo Workflows
{{=sprig.trim(" hello ")}} # == hello
In the sprig document, a left-hand side value is passed to the last argument of the function by the pipe operator
sprig document example: http://masterminds.github.io/sprig/crypto.html#decryptaes
{{=
let decryptAES = sprig.decryptAES;
"30tEfhuJSVRhpG97XCuWgz2okj7L8vQ1s6V9zVUPeDQ=" | decryptAES("secretkey")
}} # fail in Argo Workflows
In expr, a left-hand side value is passed to the first argument of the function by the pipe operator
Correct syntax:
{{=
let decryptAES = sprig.decryptAES;
"secretkey" | decryptAES("30tEfhuJSVRhpG97XCuWgz2okj7L8vQ1s6V9zVUPeDQ=")
}} # == plaintext
"
'
Pre-requisites
:latest
image tag (i.e.quay.io/argoproj/workflow-controller:latest
) and can confirm the issue still exists on:latest
. If not, I have explained why, in detail, in my description below.What happened? What did you expect to happen?
Expressions are not evaluated when sprig functions are used after a pipe (
|
) operator.Outputs of the attached workflow:
Version(s)
v3.4.17, v3.5.11, latest git main branch (0dfecd6e3a18c7bb884000e1e98d8305440d8d49)
Paste a minimal workflow that reproduces the issue. We must be able to run the workflow; don't enter a workflows that uses private images.
Logs from the workflow controller
Logs from in your workflow's wait container