argo-workflow parameter json escape

# argo-workflow parameter 로 json 형태를 전달 받았을떄
# single quotation 으로 감싸지 않으면 " escape 가 되지 않는다.

# test 
# argo worfklow version: 3.4.4
# workflow
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: ysoftman-test
  namespace: ysoftman-workflow
spec:
  serviceAccountName: workflow-template
  entrypoint: ysoftman
  templates:
    - name: ysoftman
      steps:
        - - name: ysoftman
            template: print-data
            arguments:
              parameters:
                - name: data1
                  value: "{\"a\":\"apple     lemon\"}"
                - name: data2
                  value: '{"b":"banana"}'

    - name: print-data
      inputs:
        parameters:
          - name: data1
          - name: data2
      script:
        image: "alpine"
        command: [sh]
        source: |
          echo '{{inputs.parameters.data1}}'
          echo '{{inputs.parameters.data2}}'
          echo '{{inputs.parameters}}'
          # invalid JSON 
          echo "{{inputs.parameters.data1}}"
          echo "{{inputs.parameters.data2}}"
          echo "{{inputs.parameters}}"
          # invalid JSON 
          echo {{inputs.parameters.data1}}
          echo {{inputs.parameters.data2}}
          echo {{inputs.parameters}}
          sleep 1000

# workflow pod log 결과
{"a":"apple     lemon"}
{"b":"banana"}
[{"name":"data1","value":"{\"a\":\"apple     lemon\"}"},{"name":"data2","value":"{\"b\":\"banana\"}"}]
{a:apple lemon}
{b:banana}
[{name:data1,value:{"a":"apple lemon"}},{name:data2,value:{"b":"banana"}}]
{a:apple     lemon}
{b:banana}
[{name:data1,value:{"a":"apple     lemon"}},{name:data2,value:{"b":"banana"}}]

#####

# data3 의 값이 json 이고 필드값으로 yaml, xml 등이 escaped 로 된 복잡한 파라메터인 경우 다음과 같이 처리해도 올바른 JSON 으로 출력되지 않는다.
echo '{{inputs.parameters.data3}}' # /argo/staging/script 에러
echo {{inputs.parameters.data3}} # " 가 빠진 invalid JSON
echo -e {{inputs.parameters.data3}} # "가 빠지고 \n 등에서 /argo/staging/script 에러

# jq 가 포함된 이지미를 사용해 script 에 다음과 같이 환경변수를 파싱해서 사용했다.
echo "$ARGO_TEMPLATE" | jq -r '.inputs.parameters[] | select(.name=="data3").value' | jq -r .workflow_yaml > /tmp/data.yaml

comments:

댓글 쓰기