Алгоритм работы Python-фреймворка#
Запускаемый с помощью Планировщика Windows скрипт Python-фреймворка должен следовать следующему алгоритму:
- Выполнить HTTP POST запрос к скрипту
/api/robot/heartbeatОркестратора. Передать в параметрах:- GUID данного Робота (RobotGUID),
- имя компьютера (Machine),
- IP адрес машины (IP),
- MAC адрес машины (MAC),
- текущий статус Робота (Status),
- GUID исполняемой в данный момент Работы (JobGUID),
- название исполняемой в данный момент Работы (JobName),
- тип Работы (JobType, всегда должен иметь тип Orchestrated, значение 1).
Выходные данные (в формате JSON):
- HeartbeatErrorCode,
- ErrorText,
- HasNewJob.
Скрипт может выдавать в ответе и другие параметры, которые не используются в контексте текущей Задачи.
Справочник статусов Роботов:
Status_Disconnected = 0; # робот отключен
Status_Unlicensed = 1; # робот не лицензирован
Status_Ready = 2; # робот не выполняет работы и готов к приему новых работ
Status_Working = 3; # робот выполняет текущую работу
Справочник значений ErrorCode:
HeartbeatErrorCode_NoError = 0; # нет ошибок
HeartbeatErrorCode_RobotNotFound = 101; # робот с указанным GUID не найден
HeartbeatErrorCode_JobAborting = 10; # оркестратор запросил жесткую остановку данного сценария (Abort)
HeartbeatErrorCode_JobStopping = 20; # оркестратор запросил мягкую остановку данного сценария (Stop)
Справочник значений HasNewJob:
HasNewJob_NoJob = 0 # для данного робота отсутствуют новые работы
HasNewJob_JobFound = 1 # для данного робота есть новые работы, которые необходимо получить с помощью вызова ConsumeNextJob
При первом запуске скрипта необходимо передать значение Status = 2 (Status_Ready). Также при первом запуске, когда название и GUID выполняемой работы ещё неизвестны, данные поля могут оставаться пустыми.
Пример вызова:
import requests
import base64
import json
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
host = 'http://192.168.1.111:4500' #хост оркестратора
robot_guid = 'da8bc2f0-8065-4385-b867-405e66b8e151' #GUID робота
headers = {
'Authorization': 'Basic ' + base64.b64encode(robot_guid.encode('utf-8')).decode('utf-8')
}
req = {
'RobotGUID': robot_guid #GUID робота
'Machine': robot_machine #Имя машины
'IP': robot_ip #IP адрес робота
'MAC': robot_mac #MAC адрес робота
'Status': 2 #статус робота
'JobGUID': '' #GUID работы
'JobName': '' #название выполняемого скрипта, т.е. python_script_name далее по тексту
'JobType': 1 #тип работы, всегда значение 1
}
r = requests.post(host + '/api/robot/heartbeat', data=req, headers=headers, verify=False)
heartbeat_results = json.loads(r.text)
print(heartbeat_results ['HeartbeatErrorCode'])
print(heartbeat_results ['ErrorText'])
print(heartbeat_results ['HasNewJob'])
В случае если получен ответ
HasNewJob == 0, завершить выполнение скрипта фреймворка и выйти из учетной записи Windows с помощью Log off.
В случае, если получен ответHasNewJob == 1, выполнить HTTP POST запрос к скрипту/api/robot/consumeNextJobОркестратора.
Входные данные:- GUID Робота (RobotGUID),
- текущий статус Робота (Status).
Выходные данные (в формате JSON):- ConsumeJobErrorCode,
- ErrorText,
- Job,
- ProcessVersion,
- Task.
Справочник значений ConsumeJobErrorCode:
ConsumeJobErrorCode = 0; # нет ошибокConsumeJobErrorCode = 101; # робот с указанным GUID не найденConsumeJobErrorCode = 102; # новая работа не найдена
Пример вызова:import requestsimport base64import jsonfrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(InsecureRequestWarning)host = 'http://192.168.1.111:4500' #хост оркестратораrobot_guid = 'da8bc2f0-8065-4385-b867-405e66b8e151' #GUID роботаheaders = {
'Authorization': 'Basic ' + base64.b64encode(robot_guid.encode('utf-8')).decode('utf-8')}cnj = {
'RobotGUID': robot_guid #GUID робота}r = requests.post(host + '/api/robot/consumeNextJob', data=cnj, headers=headers, verify=False)consume_result = json.loads(r.text)print(consume_result['ConsumeJobErrorCode'])print(consume_result['ErrorText'])new_job = json.loads(consume_result['Job'])job_guid = new_job['GUID']process_version = json.loads(consume_result['ProcessVersion'])python_script_name = process_version['Name'] #Условимся, что имя скрипта робота, который необходимо запустить, передаётся в названии версии процессаtask = json.loads(consume_result[' Task '])В случае успешного получения новой Работы из Оркестратора выполнить HTTP PUT запрос к скрипту
/api/job/updateОркестратора. Передать в параметрах GUID полученной Работы Робота (guid) и новый статус РаботыStatus_In_Progress.
Справочник значений статусов Работ:Status_Created = 0; #Работа созданаStatus_Pending = 1; #Работа ожидает, когда робот возьмет её в работуStatus_Aborting = 2; #Работа находится в стадии жесткой остановки (прерывания)Status_Aborted = 3; #Работа успешно прерванаStatus_Success = 4; #Работа успешно завершенаStatus_Failed = 5; #Работа неуспешно завершенаStatus_Stopping = 6; #Работа находится в стадии остановки мягкой остановкиStatus_Stopped = 7; #Работа успешно остановлена после запроса мягкой остановкиStatus_In_Progress = 8; #Работа в данный момент выполняется
Пример вызова:import requestsimport base64import jsonfrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(InsecureRequestWarning)host = 'http://192.168.1.111:4500' #хост оркестратораrobot_guid = 'da8bc2f0-8065-4385-b867-405e66b8e151' #GUID роботаheaders = {
'Authorization': 'Basic ' + base64.b64encode(robot_guid.encode('utf-8')).decode('utf-8')}job = {
'guid': job_guid, #GUID текущей работы
'status': 8 #новый статус работы}r = requests.put(host + '/api/job/update', data=job, headers=headers, verify=False)print(r.text)Приступить к выполнению Python-скрипта Робота с именем, равным
python_script_name. По возможности периодически повторять запросы к скрипту/api/robot/heartbeatс корректным значениемJobGUIDиStatus = 3 (Status_Working).
Рекомендуется отправлять этот запрос не чаще раза в 10 секунд. В случае получения в ответ статусаHeartbeatErrorCode == 10необходимо немедленно прекратить (прервать) выполнение Python-скрипта Робота.
В случае получения в ответ статусаHeartbeatErrorCode == 20необходимо выполнить корректное завершение Python-скрипта Робота.После завершения Python-скрипта Робота выполнить HTTP PUT запрос к скрипту
/api/job/updateОркестратора. Передать в параметрах GUID текущей Работы Робота (guid) и новый статус Работы в зависимости от результата её завершения согласно справочнику, приведенному выше.Затем выполнить HTTP POST запрос к скрипту
/api/robot/heartbeatОркестратора со статусомStatus = 2 (Status_Ready)и перейти к шагу 2 алгоритма фреймворка.