Алгоритм работы Python-фреймворка

Запускаемый с помощью Планировщика Windows скрипт Python-фреймворка должен следовать следующему алгоритму:

  1. Выполнить HTTP POST запрос к скрипту /api/robot/heartbeat Оркестратора. Передать в параметрах:

    1. GUID данного Робота (RobotGUID),

    2. имя компьютера (Machine),

    3. IP адрес машины (IP),

    4. MAC адрес машины (MAC),

    5. текущий статус Робота (Status),

    6. GUID исполняемой в данный момент Работы (JobGUID),

    7. название исполняемой в данный момент Работы (JobName),

    8. тип Работы (JobType, всегда должен иметь тип Orchestrated, значение 1).

Выходные данные (в формате JSON):

  • HeartbeatErrorCode,

  • ErrorText,

  • HasNewJob.

Скрипт может выдавать в ответе и другие параметры, которые не используются в контексте текущей Задачи.

Справочник статусов Роботов:

Status_Disconnected = 0; # робот отключен
Status_Unlicensed     = 1; # робот не лицензирован
Status_Ready        = 2; # робот не выполняет работы и готов к приему новых работ
Status_Working    = 3; # робот выполняет текущую работу

Справочник значений ErrorCode:

Справочник значений HasNewJob:

При первом запуске скрипта необходимо передать значение Status = 2 (Status_Ready). Также при первом запуске, когда название и GUID выполняемой работы ещё неизвестны, данные поля могут оставаться пустыми.

Пример вызова:

  1. В случае если получен ответ HasNewJob == 0, завершить выполнение скрипта фреймворка и выйти из учетной записи Windows с помощью Log off. В случае, если получен ответ HasNewJob == 1, выполнить HTTP POST запрос к скрипту /api/robot/consumeNextJob Оркестратора. Входные данные:

    1. GUID Робота (RobotGUID),

    2. текущий статус Робота (Status).

    Выходные данные (в формате JSON):

    1. ConsumeJobErrorCode,

    2. ErrorText,

    3. Job,

    4. ProcessVersion,

    5. Task.

    Справочник значений ConsumeJobErrorCode: ConsumeJobErrorCode = 0; # нет ошибок ConsumeJobErrorCode = 101; # робот с указанным GUID не найден ConsumeJobErrorCode = 102; # новая работа не найдена Пример вызова: 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') } 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 '])

  2. В случае успешного получения новой Работы из Оркестратора выполнить 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 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') } job = { 'guid': job_guid, #GUID текущей работы 'status': 8 #новый статус работы } r = requests.put(host + '/api/job/update', data=job, headers=headers, verify=False) print(r.text)

  3. Приступить к выполнению Python-скрипта Робота с именем, равным python_script_name. По возможности периодически повторять запросы к скрипту /api/robot/heartbeat с корректным значением JobGUID и Status = 3 (Status_Working). Рекомендуется отправлять этот запрос не чаще раза в 10 секунд. В случае получения в ответ статуса HeartbeatErrorCode == 10 необходимо немедленно прекратить (прервать) выполнение Python-скрипта Робота. В случае получения в ответ статуса HeartbeatErrorCode == 20 необходимо выполнить корректное завершение Python-скрипта Робота.

  4. После завершения Python-скрипта Робота выполнить HTTP PUT запрос к скрипту /api/job/update Оркестратора. Передать в параметрах GUID текущей Работы Робота (guid) и новый статус Работы в зависимости от результата её завершения согласно справочнику, приведенному выше.

  5. Затем выполнить HTTP POST запрос к скрипту /api/robot/heartbeat Оркестратора со статусом Status = 2 (Status_Ready) и перейти к шагу 2 алгоритма фреймворка.

Last updated