Commit 6fbe2e20642c352105436bea574befbfaf308081

Authored by Etienne Pallier
1 parent 69be5e68
Exists in dev

last minute.com modif de Agent : nombreuses petites ameliorations et petits bugfixes

privatedev/config/tnc/computer_XYZ_EP.yml
@@ -14,7 +14,7 @@ COMPUTER: @@ -14,7 +14,7 @@ COMPUTER:
14 intensity: 5 14 intensity: 5
15 socket: "IEC 60130-10 Type A: 5.5 mm OD, 2.5 mm ID" 15 socket: "IEC 60130-10 Type A: 5.5 mm OD, 2.5 mm ID"
16 16
17 - hostname: macp1219 17 + hostname: macp1219.local
18 #hostname: c32f49397c28 18 #hostname: c32f49397c28
19 virtual_machine: False 19 virtual_machine: False
20 os: Mac 20 os: Mac
@@ -56,31 +56,31 @@ _previous_dir = None @@ -56,31 +56,31 @@ _previous_dir = None
56 # List of all agents that pyros can start, with this format : 56 # List of all agents that pyros can start, with this format :
57 # agent-name : agent-folder-name 57 # agent-name : agent-folder-name
58 AGENTS = { 58 AGENTS = {
59 - "agentM": "monitoring",  
60 - "agentSP": "scientific_programs",  
61 - "agentScheduler": "scheduler",  
62 - "agentImagesProcessor": "observation_manager",  
63 - "agentSST": "agent",  
64 - "agent": "agent",  
65 - "agent2": "agent",  
66 - "agentX": "agent",  
67 - "agentA": "agent",  
68 - "agentB": "agent",  
69 - "agentC": "agent", 59 + "AgentM": "monitoring",
  60 + "AgentSP": "scientific_programs",
  61 + "AgentScheduler": "scheduler",
  62 + "AgentImagesProcessor": "observation_manager",
  63 + "AgentSST": "agent",
  64 + "Agent": "agent",
  65 + "Agent2": "agent",
  66 + "AgentX": "agent",
  67 + "AgentA": "agent",
  68 + "AgentB": "agent",
  69 + "AgentC": "agent",
70 # "agentDevice" : "AgentDevice", 70 # "agentDevice" : "AgentDevice",
71 # "agentDeviceTelescopeGemini" : "AgentDeviceTelescopeGemini", 71 # "agentDeviceTelescopeGemini" : "AgentDeviceTelescopeGemini",
72 - "agentDeviceGemini": "AgentDeviceGemini",  
73 - "agentDeviceSBIG": "AgentDeviceSBIG",  
74 - "agentTelescopeRequester": "AgentTelescopeRequester",  
75 - "agentMultiRequester": "AgentMultiRequester", 72 + "AgentDeviceGemini": "AgentDeviceGemini",
  73 + "AgentDeviceSBIG": "AgentDeviceSBIG",
  74 + "AgentTelescopeRequester": "AgentTelescopeRequester",
  75 + "AgentMultiRequester": "AgentMultiRequester",
76 "webserver": "webserver", 76 "webserver": "webserver",
77 "monitoring": "monitoring", 77 "monitoring": "monitoring",
78 "majordome": "majordome", 78 "majordome": "majordome",
79 #"scheduler": "scheduler", 79 #"scheduler": "scheduler",
80 "alert_manager": "alert_manager", 80 "alert_manager": "alert_manager",
81 - "agentImagesProcessor_tnc_up1": "../../../privatedev/plugin/agent", 81 + "AgentImagesProcessor_tnc_up1": "../../../privatedev/plugin/agent",
82 "agentBasic": "agent", 82 "agentBasic": "agent",
83 - "agentTriton": "agent", 83 + "AgentTriton": "agent",
84 } 84 }
85 # AGENTS = ["agentX", "webserver", "monitoring", "majordome", "scheduler", "alert_manager"] 85 # AGENTS = ["agentX", "webserver", "monitoring", "majordome", "scheduler", "alert_manager"]
86 # AGENTS = ["all", "webserver", "monitoring", "majordome", "scheduler", "alert"] 86 # AGENTS = ["all", "webserver", "monitoring", "majordome", "scheduler", "alert"]
src/core/pyros_django/agent/Agent.py
@@ -420,12 +420,12 @@ class Agent: @@ -420,12 +420,12 @@ class Agent:
420 # ------------------------------- 420 # -------------------------------
421 421
422 # This command has a validity of 0s and thus should be tagged as "expired" 422 # This command has a validity of 0s and thus should be tagged as "expired"
423 - ("self set_mode ATTENTIVE", 0, "MODE = ATTENTIVE", CMD_STATUS.CMD_EXPIRED), 423 + ("self set_mode ATTENTIVE", 0, "MODE is ATTENTIVE", CMD_STATUS.CMD_EXPIRED),
424 424
425 # Agent general command 425 # Agent general command
426 - ("self set_mode ATTENTIVE", 200, "MODE = ATTENTIVE", CMD_STATUS.CMD_EXECUTED), 426 + ("self set_mode ATTENTIVE", 200, "MODE is ATTENTIVE", CMD_STATUS.CMD_EXECUTED),
427 # => should get "ATTENTIVE" 427 # => should get "ATTENTIVE"
428 - ("self get_mode", 100, "MODE = ATTENTIVE", None), 428 + ("self get_mode", 100, "MODE is ATTENTIVE", None),
429 429
430 # => should get "7" 430 # => should get "7"
431 ("self do_eval 3+5-1", 200, '7', None), 431 ("self do_eval 3+5-1", 200, '7', None),
@@ -439,17 +439,17 @@ class Agent: @@ -439,17 +439,17 @@ class Agent:
439 ("self do_specific1 1 2 3.5 titi (3,'titi',5) [1,3,5,7,9]", 200, '15.5', None), 439 ("self do_specific1 1 2 3.5 titi (3,'titi',5) [1,3,5,7,9]", 200, '15.5', None),
440 440
441 441
442 - ("self set_mode ROUTINE", 200, "MODE = ROUTINE", None), 442 + ("self set_mode ROUTINE", 200, "MODE is ROUTINE", None),
443 # => should get "ROUTINE" 443 # => should get "ROUTINE"
444 - ("self get_mode", 200, "MODE = ROUTINE", None), 444 + ("self get_mode", 200, "MODE is ROUTINE", None),
445 # Agent specific command => should be skipped (because not ATTENTIVE) 445 # Agent specific command => should be skipped (because not ATTENTIVE)
446 ("self do_specific1 1 2 3.5 titi (3,'titi',5) [1,3,5,7,9]", 200, "SKIPPED", None), 446 ("self do_specific1 1 2 3.5 titi (3,'titi',5) [1,3,5,7,9]", 200, "SKIPPED", None),
447 447
448 # From now on, should not run anymore process_before/after 448 # From now on, should not run anymore process_before/after
449 # => and should skip next specific commands 449 # => and should skip next specific commands
450 - ("self set_mode IDLE", 200, "MODE = IDLE", None), 450 + ("self set_mode IDLE", 200, "MODE is IDLE", None),
451 # => should get "IDLE" 451 # => should get "IDLE"
452 - ("self get_mode", 200, "MODE = IDLE", None), 452 + ("self get_mode", 200, "MODE is IDLE", None),
453 # Agent specific command => should be skipped (because not ATTENTIVE) 453 # Agent specific command => should be skipped (because not ATTENTIVE)
454 ("self do_specific1 1 2 3.5 titi (3,'titi',5) [1,3,5,7,9]", 200, 'SKIPPED', None), 454 ("self do_specific1 1 2 3.5 titi (3,'titi',5) [1,3,5,7,9]", 200, 'SKIPPED', None),
455 455
@@ -537,34 +537,38 @@ class Agent: @@ -537,34 +537,38 @@ class Agent:
537 #COMMANDS_PEREMPTION_HOURS = 48 537 #COMMANDS_PEREMPTION_HOURS = 48
538 #COMMANDS_PEREMPTION_HOURS = 60/60 538 #COMMANDS_PEREMPTION_HOURS = 60/60
539 539
540 - name = "Generic Agent"  
541 - status = None  
542 - mode = None 540 + ##name = "Generic Agent"
  541 + ##status = None
  542 + ##mode = None
543 config = None 543 config = None
544 544
  545 + # MODE
  546 + #MODES = AgentSurvey.MODE_IDLE
  547 + # (('IDLE', 'IDLE'), ('ROUTINE', 'ROUTINE'), ('ATTENTIVE', 'ATTENTIVE'))
  548 + '''
  549 + MODE_IDLE = "IDLE"
  550 + MODE_ROUTINE = "ROUTINE"
  551 + MODE_ATTENTIVE = "ATTENTIVE"
  552 + '''
  553 +
545 # STATUS 554 # STATUS
  555 + #STATUSES = AgentSurvey.STATUS_CHOICES
  556 + # (('LAUNCHED', 'LAUNCHED'), ('INITIALIZING', 'INITIALIZING'), ('IN_MAIN_LOOP', 'IN_MAIN_LOOP'),
  557 + # ('IN_ROUTINE_BEFORE_PROCESS', 'IN_ROUTINE_BEFORE_PROCESS'), ('IN_GET_NEXT_COMMAND', 'IN_GET_NEXT_COMMAND'),
  558 + # ('IN_ROUTINE_AFTER_PROCESS', 'IN_ROUTINE_AFTER_PROCESS'), ('EXITING', 'EXITING')
  559 + '''
546 STATUS_LAUNCH = "LAUNCHED" 560 STATUS_LAUNCH = "LAUNCHED"
547 STATUS_INIT = "INITIALIZING" 561 STATUS_INIT = "INITIALIZING"
548 STATUS_MAIN_LOOP = "IN_MAIN_LOOP" 562 STATUS_MAIN_LOOP = "IN_MAIN_LOOP"
  563 + STATUS_ROUTINE_BEFORE_PROCESS = "IN_ROUTINE_BEFORE_PROCESS"
549 STATUS_GET_NEXT_COMMAND = "IN_GET_NEXT_COMMAND" 564 STATUS_GET_NEXT_COMMAND = "IN_GET_NEXT_COMMAND"
550 - STATUS_GENERAL_PROCESS = "IN_GENERAL_PROCESS"  
551 - STATUS_ROUTINE_PROCESS = "IN_ROUTINE_PROCESS" 565 + #STATUS_GENERAL_PROCESS = "IN_GENERAL_PROCESS"
  566 + STATUS_ROUTINE_AFTER_PROCESS = "IN_ROUTINE_AFTER_PROCESS"
552 ###STATUS_SPECIFIC_PROCESS = "IN_SPECIFIC_PROCESS" 567 ###STATUS_SPECIFIC_PROCESS = "IN_SPECIFIC_PROCESS"
553 STATUS_EXIT = "EXITING" 568 STATUS_EXIT = "EXITING"
  569 + '''
554 570
555 571
556 - # MODE  
557 - #  
558 - # In all modes, the Agent listens to commands sent to him and executes Agent level GENERAL ones.  
559 - # - MODE_IDLE : "idle" mode, does nothing, only executes Agent level GENERAL commands (DO_RESTART, DO_EXIT, DO_ABORT, DO_FLUSH, SET_ACTIVE, ...)  
560 - # - MODE_ROUTINE : idem IDLE + executes routine process (before & after)  
561 - # - MODE_ATTENTIVE : idem ROUTINE + executes Agent level SPECIFIC commands (commands specific to this agent, that only this agent understands and can execute)  
562 - #  
563 - # Default mode is MODE_ATTENTIVE (most active mode)  
564 - MODE_IDLE = "IDLE"  
565 - MODE_ROUTINE = "ROUTINE"  
566 - MODE_ATTENTIVE = "ATTENTIVE"  
567 -  
568 ''' Moved to more central file : config.config_base 572 ''' Moved to more central file : config.config_base
569 PYROS_DJANGO_BASE_DIR = Path("src/core/pyros_django") # pathlib 573 PYROS_DJANGO_BASE_DIR = Path("src/core/pyros_django") # pathlib
570 DEFAULT_CONFIG_FILE_NAME = "config_unit_simulunit1.xml" 574 DEFAULT_CONFIG_FILE_NAME = "config_unit_simulunit1.xml"
@@ -608,8 +612,22 @@ class Agent: @@ -608,8 +612,22 @@ class Agent:
608 # new obsconfig init for agent: 612 # new obsconfig init for agent:
609 ##def __init__(self, RUN_IN_THREAD=True): 613 ##def __init__(self, RUN_IN_THREAD=True):
610 def __init__(self): 614 def __init__(self):
  615 +
  616 + # Declaration of Instance attributes, default values
  617 + self.name = "Generic Agent"
  618 + self.status = None
  619 + self.mode = None
  620 + self.unit = None
  621 + self.TEST_COMMANDS = None
  622 +
  623 + #print(AgentSurvey.MODE_IDLE)
  624 + #sys.exit()
  625 +
611 # Agent is by default in mode ATTENTIVE (most active mode) 626 # Agent is by default in mode ATTENTIVE (most active mode)
612 - self.mode = self.MODE_ATTENTIVE 627 + #self.mode = self.MODE_ATTENTIVE
  628 + self._set_mode_attentive()
  629 + #self._set_mode(MODES.)
  630 +
613 log.addHandler(handler_filebyagent(logging.INFO, self.__class__.__name__)) 631 log.addHandler(handler_filebyagent(logging.INFO, self.__class__.__name__))
614 log.debug("start Agent init") 632 log.debug("start Agent init")
615 obs_config_file_path = os.environ["PATH_TO_OBSCONF_FILE"] 633 obs_config_file_path = os.environ["PATH_TO_OBSCONF_FILE"]
@@ -637,7 +655,7 @@ class Agent: @@ -637,7 +655,7 @@ class Agent:
637 655
638 self.TEST_COMMANDS = iter(self.TEST_COMMANDS_LIST) 656 self.TEST_COMMANDS = iter(self.TEST_COMMANDS_LIST)
639 ##self.RUN_IN_THREAD = RUN_IN_THREAD 657 ##self.RUN_IN_THREAD = RUN_IN_THREAD
640 - self._set_status(self.STATUS_LAUNCH) 658 + self._set_status(AgentSurvey.STATUS_LAUNCH)
641 ####self._set_idle() 659 ####self._set_idle()
642 660
643 # Create 1st survey if none 661 # Create 1st survey if none
@@ -651,8 +669,10 @@ class Agent: @@ -651,8 +669,10 @@ class Agent:
651 self._agent_survey = AgentSurvey.objects.create( 669 self._agent_survey = AgentSurvey.objects.create(
652 name=self.name, 670 name=self.name,
653 validity_duration=60, 671 validity_duration=60,
654 - mode=self.mode,  
655 - status=self.status, 672 + #mode=self.mode,
  673 + mode = self.get_mode(),
  674 + #status=self.status,
  675 + status=self.get_status(),
656 iteration=-1 676 iteration=-1
657 ) 677 )
658 log.debug("Agent survey is" + str(self._agent_survey)) 678 log.debug("Agent survey is" + str(self._agent_survey))
@@ -1105,9 +1125,9 @@ class Agent: @@ -1105,9 +1125,9 @@ class Agent:
1105 1125
1106 for i in range(3): print() 1126 for i in range(3): print()
1107 #self.printd("-"*80) 1127 #self.printd("-"*80)
1108 - log.info("*"*73)  
1109 - log.info("*"*20 + f" MAIN LOOP ITERATION {self._iter_num} (START) " + "*"*20)  
1110 - log.info("*"*73 + '\n') 1128 + log.info("*"*90)
  1129 + log.info("*"*20 + f" {self.name} : MAIN LOOP ITERATION {self._iter_num} (START) " + "*"*20)
  1130 + log.info("*"*90 + '\n')
1111 #self.print(f"Iteration {self._iter_num}") 1131 #self.print(f"Iteration {self._iter_num}")
1112 1132
1113 # EXIT because of nb of iterations ? 1133 # EXIT because of nb of iterations ?
@@ -1137,7 +1157,7 @@ class Agent: @@ -1137,7 +1157,7 @@ class Agent:
1137 self.DO_MAIN_LOOP = False 1157 self.DO_MAIN_LOOP = False
1138 return 1158 return
1139 1159
1140 - self._set_status(self.STATUS_MAIN_LOOP) 1160 + self._set_status(AgentSurvey.STATUS_MAIN_LOOP)
1141 self.show_mode_and_status() 1161 self.show_mode_and_status()
1142 1162
1143 self.main_loop_start() 1163 self.main_loop_start()
@@ -1236,6 +1256,7 @@ class Agent: @@ -1236,6 +1256,7 @@ class Agent:
1236 # cmd.args => ['arg1','arg2',...] 1256 # cmd.args => ['arg1','arg2',...]
1237 #print("nom", cmd.name) 1257 #print("nom", cmd.name)
1238 if cmd.name=="do_stop": 1258 if cmd.name=="do_stop":
  1259 + # by default = "asap"
1239 if cmd.args is None: cmd.full_name = "do_exit" 1260 if cmd.args is None: cmd.full_name = "do_exit"
1240 else: 1261 else:
1241 arg = cmd.args[0] 1262 arg = cmd.args[0]
@@ -1246,12 +1267,18 @@ class Agent: @@ -1246,12 +1267,18 @@ class Agent:
1246 #print(self.get_specific_cmds()) 1267 #print(self.get_specific_cmds())
1247 #exit(0) 1268 #exit(0)
1248 if cmd.name in ('do_restart_loop','do_exit','do_abort') : 1269 if cmd.name in ('do_restart_loop','do_exit','do_abort') :
  1270 + #print(cmd)
1249 self.DO_MAIN_LOOP = False 1271 self.DO_MAIN_LOOP = False
1250 if cmd.name == 'do_abort': 1272 if cmd.name == 'do_abort':
1251 self._abort_current_running_cmd_if_exists() 1273 self._abort_current_running_cmd_if_exists()
1252 self._cleanup_before_exit() 1274 self._cleanup_before_exit()
1253 if cmd.name != 'do_restart_loop': 1275 if cmd.name != 'do_restart_loop':
1254 self.DO_RESTART_LOOP = False 1276 self.DO_RESTART_LOOP = False
  1277 + self._set_status(AgentSurvey.STATUS_EXIT)
  1278 + # log last agent mode & status
  1279 + self._log_agent_state()
  1280 + #cmd.set_result('EXITING')
  1281 +
1255 return cmd 1282 return cmd
1256 1283
1257 # CASE 2 - AGENT SPECIFIC command 1284 # CASE 2 - AGENT SPECIFIC command
@@ -1308,7 +1335,7 @@ class Agent: @@ -1308,7 +1335,7 @@ class Agent:
1308 1335
1309 def _cleanup_before_exit(self, stopper_agent_name:str=None): 1336 def _cleanup_before_exit(self, stopper_agent_name:str=None):
1310 if not stopper_agent_name: stopper_agent_name = self.name 1337 if not stopper_agent_name: stopper_agent_name = self.name
1311 - self._set_status(self.STATUS_EXIT) 1338 + #self._set_status(self.STATUS_EXIT)
1312 self._log_agent_state() 1339 self._log_agent_state()
1313 1340
1314 log.info("Trying to stop cleanly") 1341 log.info("Trying to stop cleanly")
@@ -1355,7 +1382,7 @@ class Agent: @@ -1355,7 +1382,7 @@ class Agent:
1355 print() 1382 print()
1356 log.info("*"*10+ " ROUTINE PROCESSING BEFORE (START) "+ "*"*10+ '\n') 1383 log.info("*"*10+ " ROUTINE PROCESSING BEFORE (START) "+ "*"*10+ '\n')
1357 1384
1358 - self._set_status(self.STATUS_ROUTINE_PROCESS) 1385 + self._set_status(AgentSurvey.STATUS_ROUTINE_BEFORE_PROCESS)
1359 self.routine_process_before_body() 1386 self.routine_process_before_body()
1360 print() 1387 print()
1361 log.info("*"*10 + " ROUTINE PROCESSING BEFORE (END) "+ "*"*10) 1388 log.info("*"*10 + " ROUTINE PROCESSING BEFORE (END) "+ "*"*10)
@@ -1376,7 +1403,7 @@ class Agent: @@ -1376,7 +1403,7 @@ class Agent:
1376 print() 1403 print()
1377 log.info("*"*10+ " ROUTINE PROCESSING AFTER (START) "+ "*"*10+ '\n') 1404 log.info("*"*10+ " ROUTINE PROCESSING AFTER (START) "+ "*"*10+ '\n')
1378 1405
1379 - self._set_status(self.STATUS_ROUTINE_PROCESS) 1406 + self._set_status(AgentSurvey.STATUS_ROUTINE_AFTER_PROCESS)
1380 self.routine_process_after_body() 1407 self.routine_process_after_body()
1381 print() 1408 print()
1382 log.info("*"*10 + " ROUTINE PROCESSING AFTER (END) "+ "*"*10) 1409 log.info("*"*10 + " ROUTINE PROCESSING AFTER (END) "+ "*"*10)
@@ -1470,7 +1497,8 @@ class Agent: @@ -1470,7 +1497,8 @@ class Agent:
1470 # 1497 #
1471 1498
1472 def show_current_mode_and_status(self): 1499 def show_current_mode_and_status(self):
1473 - log.info(f"CURRENT MODE is {self.mode} (status is {self.status})") 1500 + #log.info(f"CURRENT MODE is {self.mode} (status is {self.status})")
  1501 + log.info(f"CURRENT MODE is {self.get_mode()} (status is {self.get_status()})")
1474 # @deprecated 1502 # @deprecated
1475 def show_mode_and_status(self): 1503 def show_mode_and_status(self):
1476 self.show_current_mode_and_status() 1504 self.show_current_mode_and_status()
@@ -1479,36 +1507,30 @@ class Agent: @@ -1479,36 +1507,30 @@ class Agent:
1479 # - STATUS MANAGEMENT 1507 # - STATUS MANAGEMENT
1480 # 1508 #
1481 1509
1482 - def get_current_status(self): 1510 + def get_status(self):
1483 return self.status 1511 return self.status
1484 # @deprecated 1512 # @deprecated
1485 def get_state(self): 1513 def get_state(self):
1486 - return self.get_current_status() 1514 + return self.get_status()
1487 1515
1488 - def _set_current_status(self, status:str): 1516 + def _set_status(self, status:str):
1489 #self.printd(f"[{status}] (switching from status {self.status})") 1517 #self.printd(f"[{status}] (switching from status {self.status})")
1490 log.debug(f"[{status}]") 1518 log.debug(f"[{status}]")
1491 self.status = status 1519 self.status = status
1492 return False 1520 return False
1493 - # @deprecated  
1494 - def _set_status(self, status:str):  
1495 - self._set_current_status(status)  
1496 1521
1497 1522
1498 # 1523 #
1499 # - MODE MANAGEMENT 1524 # - MODE MANAGEMENT
1500 # 1525 #
1501 1526
1502 - def get_current_mode(self):  
1503 - return self.mode  
1504 - # @deprecated  
1505 def get_mode(self): 1527 def get_mode(self):
1506 - return self.get_current_mode() 1528 + return self.mode
1507 1529
1508 # Test mode 1530 # Test mode
1509 - def IS_MODE_IDLE(self): return self.mode == self.MODE_IDLE  
1510 - def IS_MODE_ROUTINE(self): return self.mode == self.MODE_ROUTINE  
1511 - def IS_MODE_ATTENTIVE(self): return self.mode == self.MODE_ATTENTIVE 1531 + def IS_MODE_IDLE(self): return self.get_mode() == AgentSurvey.MODE_IDLE
  1532 + def IS_MODE_ROUTINE(self): return self.get_mode() == AgentSurvey.MODE_ROUTINE
  1533 + def IS_MODE_ATTENTIVE(self): return self.get_mode() == AgentSurvey.MODE_ATTENTIVE
1512 # @deprecated 1534 # @deprecated
1513 def IS_IDLE(self): return self.IS_MODE_IDLE() 1535 def IS_IDLE(self): return self.IS_MODE_IDLE()
1514 # @deprecated 1536 # @deprecated
@@ -1516,35 +1538,33 @@ class Agent: @@ -1516,35 +1538,33 @@ class Agent:
1516 # @deprecated 1538 # @deprecated
1517 def IS_ATTENTIVE(self): return self.IS_MODE_ATTENTIVE() 1539 def IS_ATTENTIVE(self): return self.IS_MODE_ATTENTIVE()
1518 1540
1519 - def _set_current_mode(self, mode:str): 1541 + def _set_mode(self, mode:str):
1520 #self.printd(f"Switching from mode {self.mode} to mode {mode}") 1542 #self.printd(f"Switching from mode {self.mode} to mode {mode}")
1521 log.info(f"[NEW MODE {mode}]") 1543 log.info(f"[NEW MODE {mode}]")
1522 self.mode = mode 1544 self.mode = mode
1523 - # @deprecated  
1524 - def _set_mode(self, mode:str):  
1525 - self._set_current_mode(mode)  
1526 1545
1527 def _set_mode_idle(self): 1546 def _set_mode_idle(self):
1528 - self._set_mode(self.MODE_IDLE) 1547 + self._set_mode(AgentSurvey.MODE_IDLE)
1529 # @deprecated 1548 # @deprecated
1530 def set_idle(self): 1549 def set_idle(self):
1531 self._set_mode_idle() 1550 self._set_mode_idle()
1532 1551
1533 def _set_mode_routine(self): 1552 def _set_mode_routine(self):
1534 - self._set_current_mode(self.MODE_ROUTINE) 1553 + self._set_mode(AgentSurvey.MODE_ROUTINE)
1535 # @deprecated 1554 # @deprecated
1536 def set_routine(self): 1555 def set_routine(self):
1537 self._set_mode_routine() 1556 self._set_mode_routine()
1538 1557
1539 def _set_mode_attentive(self): 1558 def _set_mode_attentive(self):
1540 - self._set_current_mode(self.MODE_ATTENTIVE) 1559 + self._set_mode(AgentSurvey.MODE_ATTENTIVE)
1541 # @deprecated 1560 # @deprecated
1542 def set_attentive(self): 1561 def set_attentive(self):
1543 - self._set_mode_attentive  
1544 - 1562 + self._set_mode_attentive()
1545 1563
  1564 + '''
1546 def die(self): 1565 def die(self):
1547 - self._set_status(self.STATUS_EXIT) 1566 + self._set_status(AgentSurvey.STATUS_EXIT)
  1567 + '''
1548 1568
1549 """ 1569 """
1550 suspend/resume 1570 suspend/resume
@@ -1582,8 +1602,8 @@ class Agent: @@ -1582,8 +1602,8 @@ class Agent:
1582 # all agent are active ? 1602 # all agent are active ?
1583 1603
1584 #mode = self.MODE_ACTIVE 1604 #mode = self.MODE_ACTIVE
1585 - mode = self.MODE_ATTENTIVE  
1586 - self._set_mode(mode) 1605 + #mode = self.MODE_ATTENTIVE
  1606 + self._set_mode_attentive()
1587 return True 1607 return True
1588 # old config 1608 # old config
1589 # def _set_mode_from_config(self, agent_name): 1609 # def _set_mode_from_config(self, agent_name):
@@ -1614,7 +1634,7 @@ class Agent: @@ -1614,7 +1634,7 @@ class Agent:
1614 def init(self): 1634 def init(self):
1615 #log.debug("*** Initializing... ***") 1635 #log.debug("*** Initializing... ***")
1616 log.info("*** INITIALIZING... ***") 1636 log.info("*** INITIALIZING... ***")
1617 - self._set_status(self.STATUS_INIT) 1637 + self._set_status(AgentSurvey.STATUS_INIT)
1618 if self.TEST_MODE: self.set_delay(2) 1638 if self.TEST_MODE: self.set_delay(2)
1619 1639
1620 1640
@@ -1732,8 +1752,8 @@ class Agent: @@ -1732,8 +1752,8 @@ class Agent:
1732 # only necessary when using process (not necessary with threads) 1752 # only necessary when using process (not necessary with threads)
1733 #with transaction.atomic(): 1753 #with transaction.atomic():
1734 #self._agent_survey = AgentSurvey.objects.get(name=self.name) 1754 #self._agent_survey = AgentSurvey.objects.get(name=self.name)
1735 - self._agent_survey.mode = self.mode  
1736 - self._agent_survey.status = self.status 1755 + self._agent_survey.mode = self.get_mode()
  1756 + self._agent_survey.status = self.get_status()
1737 self._agent_survey.iteration = self._iter_num 1757 self._agent_survey.iteration = self._iter_num
1738 self._agent_survey.save() 1758 self._agent_survey.save()
1739 #self._agent_survey.save(update_fields=["mode", "status"]) 1759 #self._agent_survey.save(update_fields=["mode", "status"])
@@ -1795,7 +1815,7 @@ class Agent: @@ -1795,7 +1815,7 @@ class Agent:
1795 which is relevant to this agent. 1815 which is relevant to this agent.
1796 Commands are read in chronological order 1816 Commands are read in chronological order
1797 """ 1817 """
1798 - self._set_status(self.STATUS_GET_NEXT_COMMAND) 1818 + self._set_status(AgentSurvey.STATUS_GET_NEXT_COMMAND)
1799 log.info("Looking for a new command to process (sent by another agent):") 1819 log.info("Looking for a new command to process (sent by another agent):")
1800 1820
1801 # 1) Get all pending commands for me (return if None) 1821 # 1) Get all pending commands for me (return if None)
@@ -1998,7 +2018,7 @@ class Agent: @@ -1998,7 +2018,7 @@ class Agent:
1998 result = None 2018 result = None
1999 2019
2000 #if cmd_name in ("do_abort", "do_exit", "do_restart_init"): 2020 #if cmd_name in ("do_abort", "do_exit", "do_restart_init"):
2001 - if cmd_name in ("do_abort", "do_exit", "do_restart_loop"): 2021 + if cmd_name in ("do_stop", "do_abort", "do_exit", "do_restart_loop"):
2002 #self.printd("Current pending commands are:") 2022 #self.printd("Current pending commands are:")
2003 #Command.show_commands(self._pending_commands) 2023 #Command.show_commands(self._pending_commands)
2004 log.info("Stopping/Aborting current executing command if exists:") 2024 log.info("Stopping/Aborting current executing command if exists:")
@@ -2018,7 +2038,7 @@ class Agent: @@ -2018,7 +2038,7 @@ class Agent:
2018 result = "I am now " + self.get_state() 2038 result = "I am now " + self.get_state()
2019 2039
2020 elif cmd_name == "get_mode": 2040 elif cmd_name == "get_mode":
2021 - result = "MODE = " + self.get_mode() 2041 + result = "MODE is " + self.get_mode()
2022 2042
2023 elif cmd_name == "set_mode": 2043 elif cmd_name == "set_mode":
2024 #if not cmd_args: raise ValueError() 2044 #if not cmd_args: raise ValueError()
@@ -2029,7 +2049,7 @@ class Agent: @@ -2029,7 +2049,7 @@ class Agent:
2029 elif mode == "ATTENTIVE": self.set_attentive() 2049 elif mode == "ATTENTIVE": self.set_attentive()
2030 else: raise AgentCmdBadArgsException(cmd) 2050 else: raise AgentCmdBadArgsException(cmd)
2031 #cmd.set_result("I am now " + state) 2051 #cmd.set_result("I am now " + state)
2032 - result = "MODE = " + mode 2052 + result = "MODE is " + mode
2033 #time.sleep(1) 2053 #time.sleep(1)
2034 #self.waitfor(1) 2054 #self.waitfor(1)
2035 2055
@@ -2271,9 +2291,9 @@ class Agent: @@ -2271,9 +2291,9 @@ class Agent:
2271 def do_stop(self, when:str): 2291 def do_stop(self, when:str):
2272 # PRIO 2292 # PRIO
2273 if when == "asap": 2293 if when == "asap":
2274 - pass 2294 + self.do_exit()
2275 if when == "now": 2295 if when == "now":
2276 - pass 2296 + self.do_abort()
2277 # NOT PRIO 2297 # NOT PRIO
2278 if when == "noprio": 2298 if when == "noprio":
2279 pass 2299 pass
@@ -2439,7 +2459,7 @@ class Agent: @@ -2439,7 +2459,7 @@ class Agent:
2439 #assert(cmd.state == self._cmdts.expected_status) 2459 #assert(cmd.state == self._cmdts.expected_status)
2440 actual=cmd.state 2460 actual=cmd.state
2441 expected=self._cmdts.expected_status 2461 expected=self._cmdts.expected_status
2442 - assert actual==expected, f"Cmd result (='{actual}') is not as expected (='{expected}')" 2462 + assert actual==expected, f"Cmd status (='{actual}') is not as expected (='{expected}')"
2443 2463
2444 2464
2445 def _TEST_test_routine_process(self): 2465 def _TEST_test_routine_process(self):
src/core/pyros_django/agent/AgentBasic.py
@@ -5,9 +5,10 @@ import sys @@ -5,9 +5,10 @@ import sys
5 ##import utils.Logger as L 5 ##import utils.Logger as L
6 6
7 ##from .Agent import Agent 7 ##from .Agent import Agent
8 -sys.path.append("..")  
9 -from agent.Agent import Agent, build_agent  
10 - 8 +##sys.path.append("..")
  9 +###from agent.Agent import Agent, build_agent
  10 +sys.path.append("../../../..")
  11 +from src.core.pyros_django.agent.Agent import Agent, build_agent
11 12
12 ##log = L.setupLogger("AgentXTaskLogger", "AgentX") 13 ##log = L.setupLogger("AgentXTaskLogger", "AgentX")
13 14
@@ -31,7 +32,7 @@ class AgentBasic(Agent): @@ -31,7 +32,7 @@ class AgentBasic(Agent):
31 TEST_COMMANDS_LIST = [ 32 TEST_COMMANDS_LIST = [
32 33
33 # Format : ("self cmd_name cmd_args", timeout, "expected_result", expected_status), 34 # Format : ("self cmd_name cmd_args", timeout, "expected_result", expected_status),
34 - ("self do_stop now", 200, '', Agent.CMD_STATUS.CMD_EXECUTED), 35 + #("self do_stop now", 200, '', Agent.CMD_STATUS.CMD_EXECUTED),
35 ("self do_specific1 2 2 3.5 titi (3,'titi',5) [1,3,5,7,9]", 200, '16.5', None), 36 ("self do_specific1 2 2 3.5 titi (3,'titi',5) [1,3,5,7,9]", 200, '16.5', None),
36 37
37 38
@@ -57,11 +58,17 @@ class AgentBasic(Agent): @@ -57,11 +58,17 @@ class AgentBasic(Agent):
57 # ------------------------------- 58 # -------------------------------
58 59
59 # This command has a validity of 0s and thus should be tagged as "expired" 60 # This command has a validity of 0s and thus should be tagged as "expired"
60 - ("self set_mode ATTENTIVE", 0, "MODE = ATTENTIVE", Agent.CMD_STATUS.CMD_EXPIRED), 61 + ("self set_mode ATTENTIVE", 0, "MODE is ATTENTIVE", Agent.CMD_STATUS.CMD_EXPIRED),
61 # ("self set_mode ATTENTIVE", 0, "MODE = ATTENTIVE", AgentCmd.CMD_STATUS_CODES), 62 # ("self set_mode ATTENTIVE", 0, "MODE = ATTENTIVE", AgentCmd.CMD_STATUS_CODES),
62 63
63 # Agent general command 64 # Agent general command
64 - ("self set_mode ATTENTIVE", 200, "MODE = ATTENTIVE", Agent.CMD_STATUS.CMD_EXECUTED), 65 + ("self set_mode ROUTINE", 200, "MODE is ROUTINE", Agent.CMD_STATUS.CMD_EXECUTED),
  66 + ("self get_mode", 200, "MODE is ROUTINE", Agent.CMD_STATUS.CMD_EXECUTED),
  67 + ("self set_mode ATTENTIVE", 200, "MODE is ATTENTIVE", Agent.CMD_STATUS.CMD_EXECUTED),
  68 + ("self get_mode", 200, "MODE is ATTENTIVE", Agent.CMD_STATUS.CMD_EXECUTED),
  69 +
  70 + # End test
  71 + ("self do_stop asap", 200, "STOPPING", Agent.CMD_STATUS.CMD_EXECUTED),
65 ] 72 ]
66 73
67 74
src/core/pyros_django/common/models.py
@@ -320,32 +320,69 @@ class AgentSurvey(models.Model): @@ -320,32 +320,69 @@ class AgentSurvey(models.Model):
320 | id | name | created | updated | validity_duration (default=1mn) | mode (active/idle) | status (launch/init/loop/exit/...) | 320 | id | name | created | updated | validity_duration (default=1mn) | mode (active/idle) | status (launch/init/loop/exit/...) |
321 """ 321 """
322 322
323 - # Statuses 323 + # --- MODES ---
  324 + '''
  325 + In all modes, the Agent listens to commands sent to him and executes Agent level GENERAL ones.
  326 + - MODE_IDLE : "idle" mode, does nothing, only executes Agent level GENERAL commands (DO_RESTART, DO_EXIT, DO_ABORT, DO_FLUSH, SET_ACTIVE, ...)
  327 + - MODE_ROUTINE : idem IDLE + executes routine process (before & after)
  328 + - MODE_ATTENTIVE : idem ROUTINE + executes Agent level SPECIFIC commands (commands specific to this agent, that only this agent understands and can execute)
  329 + Default mode is MODE_ATTENTIVE (most active mode)
  330 + '''
  331 + #MODE_ACTIVE = "ACTIVE"
  332 + MODE_IDLE = "IDLE"
  333 + MODE_ROUTINE = "ROUTINE"
  334 + MODE_ATTENTIVE = "ATTENTIVE"
  335 + '''
  336 + (MODE_ACTIVE, 'Active mode'),
  337 + (MODE_IDLE, 'Idle mode'),
  338 + '''
  339 + '''
  340 + (MODE_IDLE, 'IDLE'),
  341 + (MODE_ROUTINE, 'ROUTINE'),
  342 + (MODE_ATTENTIVE, 'ATTENTIVE'),
  343 + '''
  344 + MODE_CHOICES = (
  345 + (MODE_IDLE, MODE_IDLE),
  346 + (MODE_ROUTINE, MODE_ROUTINE),
  347 + (MODE_ATTENTIVE, MODE_ATTENTIVE),
  348 + )
  349 +
  350 +
  351 + # --- STATUSES ---
  352 +
324 #STATUSES = Choices('new', 'verified', 'published') 353 #STATUSES = Choices('new', 'verified', 'published')
325 STATUS_LAUNCH = "LAUNCHED" 354 STATUS_LAUNCH = "LAUNCHED"
326 STATUS_INIT = "INITIALIZING" 355 STATUS_INIT = "INITIALIZING"
327 STATUS_MAIN_LOOP = "IN_MAIN_LOOP" 356 STATUS_MAIN_LOOP = "IN_MAIN_LOOP"
328 - STATUS_PROCESS_LOOP = "IN_PROCESS_LOOP" 357 + STATUS_ROUTINE_BEFORE_PROCESS = "IN_ROUTINE_BEF"
  358 + STATUS_GET_NEXT_COMMAND = "IN_GET_NEXT_CMD"
  359 + STATUS_ROUTINE_AFTER_PROCESS = "IN_ROUTINE_AFT"
329 STATUS_EXIT = "EXITING" 360 STATUS_EXIT = "EXITING"
330 # NEW 361 # NEW
331 ##STATUS_RESTART = "RESTARTING" 362 ##STATUS_RESTART = "RESTARTING"
332 -  
333 - # Modes  
334 - MODE_ACTIVE = "ACTIVE"  
335 - MODE_IDLE = "IDLE"  
336 -  
337 - MODE_CHOICES = (  
338 - (MODE_ACTIVE, 'Active mode'),  
339 - (MODE_IDLE, 'Idle mode'),  
340 - )  
341 - 363 + #STATUS_GENERAL_PROCESS = "IN_GENERAL_PROCESS"
  364 + ###STATUS_SPECIFIC_PROCESS = "IN_SPECIFIC_PROCESS"
  365 + '''
342 STATUS_CHOICES = ( 366 STATUS_CHOICES = (
343 (STATUS_LAUNCH, "LAUNCHED"), 367 (STATUS_LAUNCH, "LAUNCHED"),
344 (STATUS_INIT, "INITIALIZING"), 368 (STATUS_INIT, "INITIALIZING"),
345 (STATUS_MAIN_LOOP, "IN_MAIN_LOOP"), 369 (STATUS_MAIN_LOOP, "IN_MAIN_LOOP"),
346 - (STATUS_PROCESS_LOOP, "IN_PROCESS_LOOP"), 370 + (STATUS_ROUTINE_BEFORE_PROCESS, "IN_ROUTINE_BEF"),
  371 + (STATUS_GET_NEXT_COMMAND, "IN_GET_NEXT_CMD"),
  372 + (STATUS_ROUTINE_AFTER_PROCESS, "IN_ROUTINE_AFT"),
347 (STATUS_EXIT, "EXITING"), 373 (STATUS_EXIT, "EXITING"),
348 ) 374 )
  375 + '''
  376 + STATUS_CHOICES = (
  377 + #(STATUS_LAUNCH, "LAUNCHED"),
  378 + (STATUS_LAUNCH, STATUS_LAUNCH),
  379 + (STATUS_INIT, STATUS_INIT),
  380 + (STATUS_MAIN_LOOP, STATUS_MAIN_LOOP),
  381 + (STATUS_ROUTINE_BEFORE_PROCESS, STATUS_ROUTINE_BEFORE_PROCESS),
  382 + (STATUS_GET_NEXT_COMMAND, STATUS_GET_NEXT_COMMAND),
  383 + (STATUS_ROUTINE_AFTER_PROCESS, STATUS_ROUTINE_AFTER_PROCESS),
  384 + (STATUS_EXIT, STATUS_EXIT),
  385 + )
349 386
350 name = models.CharField(max_length=50, unique=True) 387 name = models.CharField(max_length=50, unique=True)
351 #name = models.CharField(max_length=50, blank=True, null=True, unique=True) 388 #name = models.CharField(max_length=50, blank=True, null=True, unique=True)
@@ -369,6 +406,7 @@ class AgentSurvey(models.Model): @@ -369,6 +406,7 @@ class AgentSurvey(models.Model):
369 406
370 def __str__(self): 407 def __str__(self):
371 return (f"Agent {self.name} at {self.updated} in mode {self.mode} and status {self.status}") 408 return (f"Agent {self.name} at {self.updated} in mode {self.mode} and status {self.status}")
  409 +
372 410
373 411
374 class Album(models.Model): 412 class Album(models.Model):