【问题标题】:Netflix Conductor Python client generates an error when creating a taskNetflix Conductor Python 客户端在创建任务时生成错误
【发布时间】:2020-12-23 14:03:52
【问题描述】:

我尝试使用来自 Netflix Conductor 的 Python 客户端代码来创建任务,但无论我如何称呼它都会出错:

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 token\n 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 模块创建任务?

【问题讨论】:

    标签: python python-3.x netflix conductor


    【解决方案1】:

    由于 HTTP 请求非常简单,我建议使用请求直接发布,而不是使用可能没人使用的过时 python 客户端。 这是一个 DIY 任务定义帖子:

    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)
    

    现在您可以跳过下面的额外信息并完成它,但如果您感到好奇,请继续阅读。

    如果您好奇 Netflix python 客户端附带的导体包发生了什么,请查看https://github.com/Netflix/conductor/blob/master/client/python/conductor/conductor.py

    您将看到 MetadataClient 的 registerTaskDef() 和 updateTaskDef() 实际上都在调用更新或 PUT 端点,而不是创建(POST 端点)。假设你有verify_if_idents_are_added已经在导体上定义,例如通过

    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%40a.com"}]' 'http://localhost:8080/api/metadata/taskdefs'
    

    您会发现以下代码有效(请注意,该任务不再位于 List 元素中,因为这是 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 完全是 smurf。你可以创建 PR 来修复它,或者只是使用requests 来做你需要的事情。

    【讨论】:

    • 谢谢!优秀的答案!您展示了一种解决方法并解释了错误的原因。我创建了一个 PR 只是为了看看会发生什么。奇怪了 3 年没有人报告这个错误。
    猜你喜欢
    • 2016-12-25
    • 2012-05-19
    • 2014-11-27
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多