Issue #11131

뚜비·2023년 8월 28일
0

11131 Issue



배경 지식

Workflow Variable

Workflow Variables
workflow specification의 일부 fields는 Argo에 의해서 자동으로 대체되는 variable references가 가능하다.


해당 변수들은 {} 안에 포함시켜서 사용하면 된다.

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: hello-world-parameters-
spec:
  entrypoint: whalesay
  arguments:
    parameters:
      - name: message
        value: hello world
  templates:
    - name: whalesay
      inputs:
        parameters:
          - name: message
      container:
        image: docker/whalesay
        command: [ cowsay ]
        args: [ "{{inputs.parameters.message}}" ]

다음과 같은 두 종류의 template tag가 존재한다.

  • Simple
    : {{workflow.name}}
    : default 형식
    : 해당 태그와 동일한 이름을 가진 변수로 대체된다.

  • Expression
    : {{=workflow.name}}
    : {{ 바로 뒤에 =가 붙은 형식
    : 하나의 expression으로 실행한 결과로 대체된다.
    : -으로 연결된 parameter name 혹은 step name인 경우 인텍싱을 통해 참조해야 한다. e.g. inputs.parameters['my-param'] or steps['my-step'].outputs.result


어떤 이슈인가?

workflow.parameters.json

🤔 workflow.parameters.json
All input parameters to the workflow as a JSON string

  • 워크플로우에 대한 모든 input parameter를 JSON string으로 사용한다.
  • workflow variable 중 Global 변수에 해당

workflow.parameters.json 에서 제공되는 JSON은 parameter values 값에서 quotes를 이스케이프 처리하지 않고 잘못된 JSON을 생성할 수 있다고 한다.

기여자는 workflow.parameters.json이 항상 유효한 JSON 문자열을 제공하기 위해 workflow input parameter 안의 "가 이스케이프될 것으로 예상했다.

workflow는 error가 발생하고 argument-1's value의 "를 제거하면 에러가 사라진다고 한다.


에러가 발생하는 코드는 다음과 같다.

kind: Workflow
metadata:
  generateName: json-test-
spec:
  entrypoint: params-dumper
  arguments:
    parameters:
      - name: argument-1
        value: with " quote
  templates:
    - name: params-dumper
      container:
        image: python
        command:
          - python
          - -c
        args:
          - |
            from json import loads
            from json.decoder import JSONDecodeError
            try:
              loads("""{{workflow.parameters.json}}""")
            except JSONDecodeError as e:
              print(f"not ok: {e}")
              raise e
            else:
              print("ok")

  • 즉 위의 코드는 python 이미지를 생성하는 코드
  • loads()는 json 문자열을 python 객체로 변환하기 위한 함수
  • json_string을 생성할 떄 """{value}"""를 활용(?)

    json: [{"name":"argument-1","value":"with " quote"}] <<< 이렇게 json string이 생성

-> 해당 파라미터 값 중 value의 with " quote 부분에서 "가 escape 안 됨

What does it mean to escape a string?
quote 안에서 ambiguity(모호성)을 줄이기 위한 문자열

"Hello World"
"Hello "World""

따라서 "를 escape하기 위해

"Hello \"World\""


기존 Contributors의 제안

  • quote가 올바르게 이스케이프 될 수 있는 Marshaler interface를 만들어야 할 것 같다.
  • Argo Workflows의 문제가 아닌 Python step을 작성할 때 기술적 문제라고 생각한다.. -> 피해서 써라!

다른 팀원분들의 조언

  • 성락님 : argo-workflows 버전 업그레이드를 해보고 시도하기를 추천
  • 멘토님 : argo-workflows 환경의 문제가 아닌 파이썬 환경의 문제일 수도 있음..

Python 환경에서 test후...

해당 코드를 작성해보고 실행한 결과 python 환경에서도 비슷한 에러가 발생함을 확인하였고 Argo workflows와 무관하다 판단되어 다른 이슈를 탐색하기로 함

profile
SW Engineer 꿈나무 / 자의식이 있는 컴퓨터

0개의 댓글