Algoritmo de trabajo del marco de Python#
El script del marco de Python que se ejecuta mediante el Programador de Windows debe seguir el siguiente algoritmo:
- Realizar una solicitud HTTP POST al script
/api/robot/heartbeatdel Orquestador. Pasar como parámetros:- GUID de este Robot (RobotGUID),
- nombre de la computadora (Machine),
- dirección IP de la máquina (IP),
- dirección MAC de la máquina (MAC),
- estado actual del Robot (Status),
- GUID del Trabajo que se está ejecutando actualmente (JobGUID),
- nombre del Trabajo que se está ejecutando actualmente (JobName),
- tipo de Trabajo (JobType, siempre debe tener el tipo Orchestrated, valor 1).
Los datos de salida (en formato JSON):
- HeartbeatErrorCode,
- ErrorText,
- HasNewJob.
El script puede devolver en la respuesta otros parámetros que no se utilizan en el contexto de la Tarea actual.
Referencia de estados de los Robots:
Status_Disconnected = 0; # robot desconectado
Status_Unlicensed = 1; # robot no licenciado
Status_Ready = 2; # robot no está realizando trabajos y está listo para recibir nuevos trabajos
Status_Working = 3; # robot está realizando el trabajo actual
Referencia de valores de ErrorCode:
HeartbeatErrorCode_NoError = 0; # sin errores
HeartbeatErrorCode_RobotNotFound = 101; # robot con el GUID especificado no encontrado
HeartbeatErrorCode_JobAborting = 10; # el orquestador solicitó una detención forzada de este script (Abort)
HeartbeatErrorCode_JobStopping = 20; # el orquestador solicitó una detención suave de este script (Stop)
Referencia de valores de HasNewJob:
HasNewJob_NoJob = 0 # no hay nuevos trabajos para este robot
HasNewJob_JobFound = 1 # hay nuevos trabajos para este robot que deben ser obtenidos mediante la llamada ConsumeNextJob
En la primera ejecución del script, se debe pasar el valor Status = 2 (Status_Ready). También en la primera ejecución, cuando el nombre y el GUID del trabajo que se está ejecutando aún son desconocidos, estos campos pueden permanecer vacíos.
Ejemplo de llamada:
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' #host del orquestador
robot_guid = 'da8bc2f0-8065-4385-b867-405e66b8e151' #GUID del robot
headers = {
'Authorization': 'Basic ' + base64.b64encode(robot_guid.encode('utf-8')).decode('utf-8')
}
req = {
'RobotGUID': robot_guid, #GUID del robot
'Machine': robot_machine, #Nombre de la máquina
'IP': robot_ip, #Dirección IP del robot
'MAC': robot_mac, #Dirección MAC del robot
'Status': 2, #estado del robot
'JobGUID': '', #GUID del trabajo
'JobName': '', #nombre del script que se está ejecutando, es decir, python_script_name a continuación
'JobType': 1 #tipo de trabajo, siempre valor 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'])
En caso de recibir la respuesta
HasNewJob == 0, finalizar la ejecución del script del marco y cerrar la sesión de Windows mediante Log off.
En caso de recibir la respuestaHasNewJob == 1, realizar una solicitud HTTP POST al script/api/robot/consumeNextJobdel Orquestador.
Datos de entrada:- GUID del Robot (RobotGUID),
- estado actual del Robot (Status).
Datos de salida (en formato JSON):- ConsumeJobErrorCode,
- ErrorText,
- Job,
- ProcessVersion,
- Task.
Referencia de valores de ConsumeJobErrorCode:
ConsumeJobErrorCode = 0; # sin erroresConsumeJobErrorCode = 101; # robot con el GUID especificado no encontradoConsumeJobErrorCode = 102; # nuevo trabajo no encontrado
Ejemplo de llamada:import requestsimport base64import jsonfrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(InsecureRequestWarning)host = 'http://192.168.1.111:4500' #host del orquestadorrobot_guid = 'da8bc2f0-8065-4385-b867-405e66b8e151' #GUID del robotheaders = {
'Authorization': 'Basic ' + base64.b64encode(robot_guid.encode('utf-8')).decode('utf-8')}cnj = {
'RobotGUID': robot_guid #GUID del robot}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'] #Convenimos que el nombre del script del robot que debe ejecutarse se pasa en el nombre de la versión del procesotask = json.loads(consume_result[' Task '])En caso de recibir exitosamente un nuevo Trabajo del Orquestador, realizar una solicitud HTTP PUT al script
/api/job/updatedel Orquestador. Pasar como parámetros el GUID del Trabajo recibido (guid) y el nuevo estado del TrabajoStatus_In_Progress.
Referencia de valores de estados de los Trabajos:Status_Created = 0; #Trabajo creadoStatus_Pending = 1; #Trabajo pendiente, esperando que el robot lo tomeStatus_Aborting = 2; #Trabajo en proceso de detención forzada (interrupción)Status_Aborted = 3; #Trabajo interrumpido exitosamenteStatus_Success = 4; #Trabajo completado exitosamenteStatus_Failed = 5; #Trabajo no completado exitosamenteStatus_Stopping = 6; #Trabajo en proceso de detención suaveStatus_Stopped = 7; #Trabajo detenido exitosamente tras la solicitud de detención suaveStatus_In_Progress = 8; #Trabajo en ejecución
Ejemplo de llamada:import requestsimport base64import jsonfrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(InsecureRequestWarning)host = 'http://192.168.1.111:4500' #host del orquestadorrobot_guid = 'da8bc2f0-8065-4385-b867-405e66b8e151' #GUID del robotheaders = {
'Authorization': 'Basic ' + base64.b64encode(robot_guid.encode('utf-8')).decode('utf-8')}job = {
'guid': job_guid, #GUID del trabajo actual
'status': 8 #nuevo estado del trabajo}r = requests.put(host + '/api/job/update', data=job, headers=headers, verify=False)print(r.text)Proceder a ejecutar el script de Python del Robot con el nombre igual a
python_script_name. Siempre que sea posible, repetir periódicamente las solicitudes al script/api/robot/heartbeatcon el valor correcto deJobGUIDyStatus = 3 (Status_Working).
Se recomienda enviar esta solicitud no más de una vez cada 10 segundos. En caso de recibir en respuesta el estadoHeartbeatErrorCode == 10, se debe interrumpir inmediatamente la ejecución del script de Python del Robot.
En caso de recibir en respuesta el estadoHeartbeatErrorCode == 20, se debe realizar una finalización correcta del script de Python del Robot.Después de finalizar el script de Python del Robot, realizar una solicitud HTTP PUT al script
/api/job/updatedel Orquestador. Pasar como parámetros el GUID del Trabajo actual del Robot (guid) y el nuevo estado del Trabajo según el resultado de su finalización de acuerdo con la referencia proporcionada anteriormente.Luego, realizar una solicitud HTTP POST al script
/api/robot/heartbeatdel Orquestador con el estadoStatus = 2 (Status_Ready)y proceder al paso 2 del algoritmo del marco.