Commit 80d55816f2f2a464c0cf6506b836008df97d0365
1 parent
82400cb8
Exists in
dev
agent cleanup and comments
Showing
3 changed files
with
51 additions
and
53 deletions
Show diff stats
pyros.py
... | ... | @@ -721,8 +721,7 @@ def test(module, function): |
721 | 721 | if module is None: |
722 | 722 | # apps = ['obs_config','scp_mgmt','common', 'scheduling', 'seq_submit', 'user_mgmt', 'alert_mgmt.tests.TestStrategyChange'] |
723 | 723 | # Removing alert_mgmt, scheduler from tests |
724 | - apps = ['obs_config', "scp_mgmt", | |
725 | - 'dashboard', 'user_mgmt', 'seq_submit','api'] | |
724 | + apps = ['obs_config', "scp_mgmt", 'dashboard', 'user_mgmt', 'seq_submit', 'api'] | |
726 | 725 | else: |
727 | 726 | os.environ["PATH_TO_OBSCONF_FILE"] = os.path.join(os.path.abspath( |
728 | 727 | PYROS_DJANGO_BASE_DIR), "obs_config/fixtures/observatory_configuration_ok_simple.yml") |
... | ... | @@ -754,7 +753,7 @@ def test(module, function): |
754 | 753 | # execProcessFromVenv('manage.py test ' + app) or die() |
755 | 754 | # KEEP test_pyros database after tests |
756 | 755 | # execProcessFromVenv('manage.py test --keep ' + app) or die() |
757 | - execProcessFromVenv('manage.py test --keep --noinput ' + app,foreground=True) or die() | |
756 | + execProcessFromVenv('manage.py test --keep --noinput ' + app, foreground=True) or die() | |
758 | 757 | change_dir("PREVIOUS") |
759 | 758 | # execProcess("python install.py install") |
760 | 759 | return True | ... | ... |
src/core/pyros_django/majordome/agent/A_Basic.py
... | ... | @@ -43,13 +43,13 @@ from typing import List, Tuple, Union, Any |
43 | 43 | class A_Basic(Agent): |
44 | 44 | |
45 | 45 | # FOR TEST ONLY |
46 | - # Run this agent in simulator mode | |
46 | + # - Run this agent in simulator mode | |
47 | 47 | TEST_MODE = False |
48 | - # Run the assertion tests at the end | |
48 | + # - Run the assertion tests at the end | |
49 | 49 | TEST_WITH_FINAL_TEST = False |
50 | 50 | #TEST_MAX_DURATION_SEC = None |
51 | 51 | TEST_MAX_DURATION_SEC = 400 |
52 | - # Who should I send commands to ? | |
52 | + # - Who should I send commands to ? | |
53 | 53 | TEST_COMMANDS_DEST = "myself" |
54 | 54 | #TEST_COMMANDS_DEST = "AgentB" |
55 | 55 | # Scenario to be executed | ... | ... |
src/core/pyros_django/majordome/agent/Agent.py
... | ... | @@ -160,6 +160,7 @@ from vendor.guitastro.src.guitastro import Ephemeris |
160 | 160 | import pickle |
161 | 161 | |
162 | 162 | |
163 | +# Aliases for Cmd exceptions | |
163 | 164 | CmdException = AgentCmd.CmdException |
164 | 165 | CmdExceptionUnknown = AgentCmd.CmdExceptionUnknown |
165 | 166 | CmdExceptionUnimplemented = AgentCmd.CmdExceptionUnimplemented |
... | ... | @@ -218,7 +219,7 @@ class Colors: |
218 | 219 | BOLD = "\033[1m" |
219 | 220 | UNDERLINE = "\033[4m" |
220 | 221 | |
221 | -def printColor(color: Colors, message, file=sys.stdout, eol=os.linesep, forced=False): | |
222 | +def print_colored(color: Colors, message, file=sys.stdout, eol=os.linesep, forced=False): | |
222 | 223 | #system = platform.system() |
223 | 224 | """ |
224 | 225 | if (self.disp == False and forced == False): |
... | ... | @@ -237,10 +238,10 @@ def printFullTerm(color: Colors, string: str): |
237 | 238 | row = 1000 |
238 | 239 | disp = True |
239 | 240 | value = int(columns / 2 - len(string) / 2) |
240 | - printColor(color, "-" * value, eol="") | |
241 | - printColor(color, string, eol="") | |
241 | + print_colored(color, "-" * value, eol="") | |
242 | + print_colored(color, string, eol="") | |
242 | 243 | value += len(string) |
243 | - printColor(color, "-" * (columns - value)) | |
244 | + print_colored(color, "-" * (columns - value)) | |
244 | 245 | return 0 |
245 | 246 | |
246 | 247 | |
... | ... | @@ -301,23 +302,22 @@ class Agent: |
301 | 302 | # --- - INSTANCE attributes are accessible via agent.__dict__ |
302 | 303 | # --- |
303 | 304 | |
304 | - | |
305 | 305 | class EXEC_MODE(Enum): |
306 | 306 | SEQUENTIAL = 0 |
307 | 307 | THREAD = 1 |
308 | 308 | PROCESS = 2 |
309 | 309 | |
310 | 310 | # Default modes |
311 | - DEBUG_MODE:bool = False | |
311 | + DEBUG_MODE: bool = False | |
312 | 312 | #TEST_MODE = False |
313 | 313 | |
314 | 314 | # By default, a command is valid during 5s (and then perempted) |
315 | - DEFAULT_CMD_VALIDITY_DURATION:int = 5 | |
315 | + DEFAULT_CMD_VALIDITY_DURATION: int = 5 | |
316 | 316 | |
317 | 317 | # Wait a fixed number of seconds before each loop ? |
318 | 318 | #WITH_RANDOM_WAIT = False |
319 | 319 | # 1 sec by default |
320 | - __DELAY_NB_SEC:int = 1 | |
320 | + __DELAY_NB_SEC: int = 1 | |
321 | 321 | # - YES if TEST mode (in init()) |
322 | 322 | |
323 | 323 | # Default LOG level is INFO |
... | ... | @@ -332,7 +332,7 @@ class Agent: |
332 | 332 | - exec_mode (EXEC_MODE) : EXEC_MODE.SEQUENTIAL, EXEC_MODE.THREAD, or EXEC_MODE.PROCESS |
333 | 333 | - tooltip : description text (displayed on clic) |
334 | 334 | ''' |
335 | - _AGENT_SPECIFIC_COMMANDS: Dict [ str, Tuple[int, EXEC_MODE, str] ] = { | |
335 | + _AGENT_SPECIFIC_COMMANDS: Dict[str, Tuple[int, EXEC_MODE, str]] = { | |
336 | 336 | # Format : โcmd_nameโ : (timeout, exec_mode, tooltip) |
337 | 337 | |
338 | 338 | #"do_specific1" : (10, EXEC_MODE.SEQUENTIAL, ''), |
... | ... | @@ -352,14 +352,15 @@ class Agent: |
352 | 352 | # Maximum duration of this agent (only for SIMULATION mode) |
353 | 353 | # If set to 0, it will never exit except if asked (or CTRL-C) |
354 | 354 | # If set to 20, it will exit after 20s |
355 | - TEST_MAX_DURATION_SEC :int=0 | |
355 | + TEST_MAX_DURATION_SEC: int = 0 | |
356 | 356 | #TEST_MAX_DURATION_SEC = 30 |
357 | 357 | # Run this agent in simulator mode |
358 | 358 | #TEST_MODE = True |
359 | - WITH_SIMULATOR:bool = False | |
359 | + WITH_SIMULATOR: bool = False | |
360 | 360 | # Run the assertion tests at the end |
361 | - TEST_WITH_FINAL_TEST:bool = False | |
361 | + TEST_WITH_FINAL_TEST: bool = False | |
362 | 362 | |
363 | + # Aliases | |
363 | 364 | CMD_STATUS = AgentCmd.CMD_STATUS_CODES |
364 | 365 | AGT_STATUS = AgentSurvey.STATUS_CHOICES |
365 | 366 | |
... | ... | @@ -393,8 +394,8 @@ class Agent: |
393 | 394 | ##_TEST_COMMANDS_LIST: List[ Tuple[ bool, str, int, Optional[str], AgentCmd.CMD_STATUS_CODES ] ] = [ |
394 | 395 | |
395 | 396 | # Alias type for _TEST_COMMANDS_LIST (for more readability) |
396 | - TestCommand = Tuple[ bool, str, Optional[int], Optional[str], Optional[int]] | |
397 | - _TEST_COMMANDS_LIST: List[ TestCommand ] = [ | |
397 | + TestCommand = Tuple[bool, str, Optional[int], Optional[str], Optional[int]] | |
398 | + _TEST_COMMANDS_LIST: List[TestCommand] = [ | |
398 | 399 | # Format : (DO_IT, "self cmd_name cmd_args", validity, "expected_result", expected_status), |
399 | 400 | |
400 | 401 | #("self do_stop now", 200, '15.5', None), |
... | ... | @@ -591,8 +592,8 @@ class Agent: |
591 | 592 | ##_cmdts: AgentCmd = None |
592 | 593 | ##_next_cmdts = None |
593 | 594 | |
594 | - __agent_survey:AgentSurvey = None | |
595 | - __pending_commands:QuerySet = None # [] | |
595 | + __agent_survey: AgentSurvey = None | |
596 | + __pending_commands: QuerySet = None # [] | |
596 | 597 | |
597 | 598 | # List of agents I will send commands to |
598 | 599 | _my_client_agents_aliases = [] |
... | ... | @@ -610,28 +611,28 @@ class Agent: |
610 | 611 | |
611 | 612 | # new obsconfig init for agent: |
612 | 613 | ##def __init__(self, RUN_IN_THREAD=True): |
613 | - def __init__(self,simulated_computer=None): | |
614 | + def __init__(self, simulated_computer=None): | |
614 | 615 | |
615 | 616 | # Instance attributes declaration (with default values, or None) |
616 | - self.__UP_SINCE : Final = datetime.now(tz=timezone.utc) | |
617 | + self.__UP_SINCE: Final = datetime.now(tz=timezone.utc) | |
617 | 618 | #self.UP_SINCE = datetime.utcnow() |
618 | - self.__ROUTINE_ITER_START_IS_RUNNING:bool = False | |
619 | - self.__ROUTINE_ITER_END_IS_RUNNING:bool = False | |
620 | - self.__test_cmd_received_num:int = 0 # only for tests | |
619 | + self.__ROUTINE_ITER_START_IS_RUNNING: bool = False | |
620 | + self.__ROUTINE_ITER_END_IS_RUNNING: bool = False | |
621 | + self.__test_cmd_received_num: int = 0 # only for tests | |
621 | 622 | # Current Command running |
622 | - self.__CC :Optional[AgentCmd] #= None | |
623 | - self.__CC_thread :Union[StoppableThreadEvenWhenSleeping, multiprocessing.Process] #= None | |
623 | + self.__CC: Optional[AgentCmd] # = None | |
624 | + self.__CC_thread: Union[StoppableThreadEvenWhenSleeping, multiprocessing.Process] #= None | |
624 | 625 | # Previous Command running |
625 | 626 | ##self.__CC_prev :Optional[AgentCmd] = None |
626 | 627 | # Current Command exception (if occurs) |
627 | - self.__CCE :Optional[Exception] #= None | |
628 | + self.__CCE: Optional[Exception] #= None | |
628 | 629 | self.name = "Generic Agent" |
629 | - self.__status :str #= None | |
630 | - self.__mode :str #= None | |
631 | - self.unit :str #= None | |
630 | + self.__status: str # = None | |
631 | + self.__mode: str # = None | |
632 | + self.unit: str # = None | |
632 | 633 | #self.TEST_COMMANDS :List #= None |
633 | - self.TEST_COMMANDS :Iterable[Agent.TestCommand] #= None | |
634 | - self.__iter_num :int = 0 | |
634 | + self.TEST_COMMANDS: Iterable[Agent.TestCommand] # = None | |
635 | + self.__iter_num: int = 0 | |
635 | 636 | #print(AgentSurvey.MODE_CHOICES.IDLE) |
636 | 637 | #sys.exit() |
637 | 638 | |
... | ... | @@ -639,18 +640,21 @@ class Agent: |
639 | 640 | #self.__mode = self.MODE_ATTENTIVE |
640 | 641 | self.set_mode_attentive() |
641 | 642 | #self._set_mode(MODES.) |
643 | + | |
644 | + # Set Obs config | |
642 | 645 | obs_config_file_path = os.environ["PATH_TO_OBSCONF_FILE"] |
643 | 646 | path_to_obs_config_folder = os.environ["PATH_TO_OBSCONF_FOLDER"] |
644 | 647 | unit = os.environ["unit_name"] |
645 | - oc = OBSConfig(obs_config_file_path,unit) | |
648 | + oc = OBSConfig(obs_config_file_path, unit) | |
646 | 649 | pyros_yaml_path = os.environ["pyros_config_file"] |
647 | 650 | pyros_config = ConfigPyros(pyros_yaml_path) |
648 | 651 | self.set_config(oc, obs_config_file_path, path_to_obs_config_folder, unit, pyros_config, pyros_yaml_path) |
652 | + | |
653 | + # Agent name | |
649 | 654 | agent_name_from_config = self.get_config().get_agent_name_from_config(self.__class__.__name__,simulated_computer) |
650 | - if agent_name_from_config: | |
651 | - self.name = agent_name_from_config | |
652 | - else: | |
653 | - self.name = self.__class__.__name__ | |
655 | + self.name = agent_name_from_config if agent_name_from_config else self.__class__.__name__ | |
656 | + | |
657 | + # LOG | |
654 | 658 | log.addHandler(handler_filebyagent(logging.INFO, self.name)) |
655 | 659 | #log.addHandler(handler_filebyagent(logging.INFO, self.name)) |
656 | 660 | log.debug("start Agent init") |
... | ... | @@ -670,10 +674,11 @@ class Agent: |
670 | 674 | |
671 | 675 | self.TEST_COMMANDS = iter(self._TEST_COMMANDS_LIST) |
672 | 676 | ##self.RUN_IN_THREAD = RUN_IN_THREAD |
677 | + | |
673 | 678 | self.__set_status(self.AGT_STATUS.LAUNCHED) |
674 | 679 | ####self._set_idle() |
675 | 680 | |
676 | - # Create 1st survey if none | |
681 | + # Get survey or create 1st one if none | |
677 | 682 | #tmp = AgentSurvey.objects.filter(name=self.name) |
678 | 683 | #if len(tmp) == 0: |
679 | 684 | #nb_agents = AgentSurvey.objects.filter(name=self.name).count() |
... | ... | @@ -857,18 +862,16 @@ class Agent: |
857 | 862 | @property |
858 | 863 | def ROUTINE_ITER_START_IS_RUNNING(self): |
859 | 864 | return self.__ROUTINE_ITER_START_IS_RUNNING |
865 | + | |
860 | 866 | @property |
861 | 867 | def ROUTINE_ITER_END_IS_RUNNING(self): |
862 | 868 | return self.__ROUTINE_ITER_END_IS_RUNNING |
863 | 869 | |
864 | - | |
865 | - | |
866 | - | |
867 | 870 | def set_config(self, oc: OBSConfig, obs_config_file_path: str, path_to_obs_config_folder: str, unit: str, pyros_config: str, pyros_yaml_path: str): |
868 | 871 | self._oc = { |
869 | - 'config' : oc, | |
870 | - 'pyros_config' : pyros_config, | |
871 | - 'env' : [ | |
872 | + 'config': oc, | |
873 | + 'pyros_config': pyros_config, | |
874 | + 'env': [ | |
872 | 875 | obs_config_file_path, |
873 | 876 | path_to_obs_config_folder, |
874 | 877 | unit, |
... | ... | @@ -962,10 +965,6 @@ class Agent: |
962 | 965 | print("\n") |
963 | 966 | |
964 | 967 | |
965 | - | |
966 | - | |
967 | - | |
968 | - | |
969 | 968 | def get_config_filename(self, config_filename: str): |
970 | 969 | if not config_filename: |
971 | 970 | #config_filename = self.DEFAULT_CONFIG_FILE_NAME |
... | ... | @@ -1013,7 +1012,7 @@ class Agent: |
1013 | 1012 | |
1014 | 1013 | |
1015 | 1014 | |
1016 | - def _get_real_agent_name(self, agent_alias_name:str)->str: | |
1015 | + def _get_real_agent_name(self, agent_alias_name: str) -> str: | |
1017 | 1016 | #self.printd("key is", agent_alias_name) |
1018 | 1017 | ''' |
1019 | 1018 | if not self._my_client_agents: return agent_alias_name |
... | ... | @@ -1023,7 +1022,7 @@ class Agent: |
1023 | 1022 | |
1024 | 1023 | |
1025 | 1024 | |
1026 | - def run(self, nb_iter:int=None, FOR_REAL:bool=True): | |
1025 | + def run(self, nb_iter: int = None, FOR_REAL: bool = True): | |
1027 | 1026 | """ |
1028 | 1027 | FOR_REAL: set to False if you don't want Agent to send commands to devices but just print messages without really doing anything |
1029 | 1028 | """ | ... | ... |