问题描述
我尝试使用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]","instance":"d4f36b3da428"}
...
HTTPError: 500 Server Error: Internal Server Error for url: http://localhost:8080/api/metadata/taskdefs
如何使用此Python模块创建任务?
解决方法
因为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()实际上都在调用update或PUT端点,而不是create端点(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","ownerEmail": "a%40a.com"}]' 'http://localhost:8080/api/metadata/taskdefs'
您会发现以下代码有效(请注意,该任务不再位于List元素中,因为这正是PUT端点所期望的):
task_def = '''{"name": "verify_if_idents_are_added","ownerEmail": "a@a.com"}'''
metadataClient.registerTaskDef(task_def)
因此,我认为此客户端的registerTaskDef完全被抹黑了。您可以创建PR来对其进行修复,也可以仅使用requests
来完成所需的工作。