Клиент Netflix Conductor Python выдает ошибку при создании задачи

#python #python-3.x #netflix #conductor

#python #python-3.x #netflix #проводник

Вопрос:

Я пытался использовать клиентский код Python из Netflix Conductor для создания задачи, но я получаю ошибки независимо от того, как я ее вызываю:

 from conductor import conductor
import json

server_url = "http://localhost:8080/api"

task_def = '''[{
      "name": "verify_if_idents_are_added",
      "retryCount": 3,
      "retryLogic": "FIXED",
      "retryDelaySeconds": 10,
      "timeoutSeconds": 300,
      "timeoutPolicy": "TIME_OUT_WF",
      "responseTimeoutSeconds": 180,
      "ownerEmail": "a@a.com"
    }]'''

metadataClient = conductor.MetadataClient(server_url)
metadataClient.registerTaskDef(task_def)
  
 ERROR: {"status":400,"message":"Validation failed, check below errors for detail.","retryable":false,"validationErrors":[{"path":"updateTaskDef.arg0.ownerEmail","message":"ownerEmail cannot be empty"}]}
...

HTTPError: 400 Client Error: Bad Request for url: http://localhost:8080/api/metadata/taskdefs
  

Также:

 task_def_json = json.loads(task_def)
metadataClient.registerTaskDef(task_def_json)
  

Получает:

 ERROR: {"code":"INTERNAL_ERROR","message":"INTERNAL_ERROR - Cannot deserialize instance of `com.netflix.conductor.common.metadata.tasks.TaskDef` out of START_ARRAY tokenn at [Source: (org.eclipse.jetty.server.HttpInputOverHTTP); line: 1, column: 1]","retryable":false,"instance":"d4f36b3da428"}
...
HTTPError: 500 Server Error: Internal Server Error for url: http://localhost:8080/api/metadata/taskdefs
  

Как я могу создать задачу с помощью этого модуля Python?

Ответ №1:

Поскольку HTTP-запросы настолько просты, я бы рекомендовал использовать запросы для прямой публикации, а не этот устаревший клиент Python, который, вероятно, никто не использует. Вот сообщение об определении задачи своими руками:

 import requests

req_header={'Content-Type': 'application/json', 'Accept': 'application/json'}

task_def_endpoint='http://localhost:8080/api/metadata/taskdefs'
task_def = '''[{"name": "verify_if_idents_are_added", "retryCount": 3, "retryLogic": "FIXED", "retryDelaySeconds": 10, "timeoutSeconds": 300, "timeoutPolicy": "TIME_OUT_WF", "responseTimeoutSeconds": 180, "ownerEmail": "a@a.com"}]'''

response= requests.post(task_def_endpoint, data=task_def, headers=req_header)
print(response.status_code)
  

Теперь вы можете пропустить дополнительную информацию ниже и покончить с этим, но продолжайте читать, если вам интересно.

Если вам интересно, что происходит с пакетом conductor, который поставляется с клиентом Netflix python, посмотрите наhttps://github.com/Netflix/conductor/blob/master/client/python/conductor/conductor.py

Вы увидите, что оба MetadataClient registerTaskDef() и updateTaskDef() фактически вызывают конечную точку update или PUT, а не конечную точку create (POST). Предполагая, что вы verify_if_idents_are_added уже определили в conductor, например, через

 curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '[{"name": "verify_if_idents_are_added", "retryCount": 3, "retryLogic": "FIXED", "retryDelaySeconds": 10, "timeoutSeconds": 300, "timeoutPolicy": "TIME_OUT_WF", "responseTimeoutSeconds": 180, "ownerEmail": "a@a.com"}]' 'http://localhost:8080/api/metadata/taskdefs'
  

вы обнаружите, что следующий код работает (обратите внимание, что задача больше не находится в элементе списка, потому что это то, что ожидается конечной точкой PUT):

 task_def = '''{"name": "verify_if_idents_are_added", "retryCount": 3, "retryLogic": "FIXED", "retryDelaySeconds": 10, "timeoutSeconds": 300, "timeoutPolicy": "TIME_OUT_WF", "responseTimeoutSeconds": 180, "ownerEmail": "a@a.com"}'''

metadataClient.registerTaskDef(task_def)
  

Таким образом, registerTaskDef этого клиента, на мой взгляд, полностью искажен. Вы можете создать PR, чтобы исправить это, или просто использовать requests , чтобы делать то, что вам нужно.

Комментарии:

1. Спасибо! Отличный ответ! Вы показали обходной путь и объяснили причину ошибки. Я создал PR, просто чтобы посмотреть, что произойдет. Странно, что никто не сообщал об этой ошибке в течение 3 лет.