Commit 9cd823945709f54db309ff9562f0242d305c8869
1 parent
f2843971
Exists in
dev
Add new option for agentSST : start a specific agent
Showing
3 changed files
with
42 additions
and
13 deletions
Show diff stats
pyros.py
... | ... | @@ -1016,8 +1016,9 @@ def start(agent: str, configfile: str, observatory: str, unit: str, computer_hos |
1016 | 1016 | @click.option('--observatory', '-o', help='the observatory name to be used') |
1017 | 1017 | @click.option('--unit', '-u', help='the unit name to be used') |
1018 | 1018 | @click.option("--computer_hostname","-cp", help="The name of simulated computer hostname") |
1019 | +@click.option("--agent","-a", help="The name of agent to be launched") | |
1019 | 1020 | @click.option("--foreground","-fg", is_flag=True, help="Print stdout and error in terminal") |
1020 | -def new_start(configfile: str, observatory: str, unit: str, computer_hostname: str,foreground:bool): | |
1021 | +def new_start(configfile: str, observatory: str, unit: str, computer_hostname: str,foreground:bool,agent:str): | |
1021 | 1022 | log.debug("Running start command") |
1022 | 1023 | try: |
1023 | 1024 | from config.pyros.config_pyros import ConfigPyros |
... | ... | @@ -1116,6 +1117,8 @@ def new_start(configfile: str, observatory: str, unit: str, computer_hostname: s |
1116 | 1117 | cmd += " -v" |
1117 | 1118 | if computer_hostname: |
1118 | 1119 | cmd += f" --computer {computer_hostname}" |
1120 | + if agent: | |
1121 | + cmd += f" --agent {agent}" | |
1119 | 1122 | |
1120 | 1123 | # if not test_mode(): current_processes.append( [execProcessFromVenvAsync(cmd), agent_name, -1] ) |
1121 | 1124 | # Append this process ( [process id, agent_name, result=failure] ) | ... | ... |
src/core/pyros_django/agent/Agent.py
... | ... | @@ -2721,7 +2721,7 @@ def extract_parameters(): |
2721 | 2721 | |
2722 | 2722 | #def build_agent(Agent_type:Agent, name="GenericAgent", RUN_IN_THREAD=True): |
2723 | 2723 | #def build_agent(Agent_type:Agent, RUN_IN_THREAD=True): |
2724 | -def build_agent(Agent_type:Agent) -> Agent : | |
2724 | +def build_agent(Agent_type:Agent,param_constr=None) -> Agent : | |
2725 | 2725 | #DEBUG_MODE, WITH_SIM, TEST_MODE, VERBOSE_MODE, configfile = extract_parameters() |
2726 | 2726 | DEBUG_MODE, TEST_MODE, VERBOSE_MODE = extract_parameters() |
2727 | 2727 | log.debug("debug mode is" + os.getenv("PYROS_DEBUG")) |
... | ... | @@ -2732,11 +2732,16 @@ def build_agent(Agent_type:Agent) -> Agent : |
2732 | 2732 | #agent = Agent("GenericAgent", configfile, RUN_IN_THREAD=True) |
2733 | 2733 | #agent = Agent_type(configfile, RUN_IN_THREAD, DEBUG_MODE=DEBUG_MODE) |
2734 | 2734 | #agent = Agent_type(RUN_IN_THREAD) |
2735 | - | |
2736 | - agent = Agent_type() | |
2735 | + if param_constr: | |
2736 | + if "AgentSST" in str(Agent_type): | |
2737 | + agent = Agent_type(agent=param_constr.get("agent")) | |
2738 | + else: | |
2739 | + agent = Agent_type() | |
2737 | 2740 | if agent.name == "AgentSST": |
2741 | + # args are passed two times: first in AgentSST script and then to build_agent function, we need to setup again argparse in order to argparse to allow arguments | |
2738 | 2742 | parser = argparse.ArgumentParser(description='Start a agentSST.') |
2739 | 2743 | parser.add_argument("--computer",dest="computer",help='Launch agent with simulated computer hostname',action="store") |
2744 | + parser.add_argument("--agent",dest="agent",help='Launch an specific agent ',action="store") | |
2740 | 2745 | parser.add_argument("-t", action="store_true" ) |
2741 | 2746 | |
2742 | 2747 | # parser.add_argument("-d", action="store_true" ) | ... | ... |
src/core/pyros_django/agent/AgentSST.py
... | ... | @@ -2,7 +2,8 @@ |
2 | 2 | |
3 | 3 | from pathlib import Path |
4 | 4 | import subprocess |
5 | -import sys, os | |
5 | +import sys, os, argparse | |
6 | + | |
6 | 7 | from datetime import datetime, timezone, timedelta |
7 | 8 | ##import utils.Logger as L |
8 | 9 | #import threading #, multiprocessing, os |
... | ... | @@ -33,7 +34,7 @@ class AgentSST(Agent): |
33 | 34 | TEST_COMMANDS_LIST = [ |
34 | 35 | ] |
35 | 36 | |
36 | - def __init__(self, name:str=None,sim_computer=None): | |
37 | + def __init__(self, name:str=None, sim_computer=None, agent=None): | |
37 | 38 | |
38 | 39 | super().__init__() |
39 | 40 | self.PROJECT_ROOT_PATH = os.environ["PROJECT_ROOT_PATH"] |
... | ... | @@ -59,13 +60,20 @@ class AgentSST(Agent): |
59 | 60 | + os.sep |
60 | 61 | ) |
61 | 62 | self.VENV_PYTHON = VENV_BIN + "python3" |
63 | + if agent: | |
64 | + self.init_agent = agent | |
65 | + else: | |
66 | + self.init_agent = None | |
62 | 67 | #log.info(f"PC hostname is {self.computer}") |
63 | 68 | #name_from_config = self.get_config().get_agent_sst_of_current_computer() |
64 | 69 | |
65 | 70 | def init(self): |
66 | 71 | super().init() |
67 | 72 | log.info(f"PC hostname is {self.computer}") |
68 | - self.start_agents() | |
73 | + if self.init_agent is None: | |
74 | + self.start_agents() | |
75 | + else: | |
76 | + self.start_agents(self.init_agent) | |
69 | 77 | self.TEST_MODE = False |
70 | 78 | time.sleep(10) |
71 | 79 | self.set_delay(3) |
... | ... | @@ -84,6 +92,11 @@ class AgentSST(Agent): |
84 | 92 | |
85 | 93 | if agent_name: |
86 | 94 | agent = agent_name |
95 | + agents = obs_config.get_agents_per_computer(obs_config.unit_name).get(self.computer) | |
96 | + if agent not in agents: | |
97 | + log.info(f"{agent} isn't associated to this computer : {self.computer}") | |
98 | + log.info(f"Agents associated to this computer : {agents}") | |
99 | + exit(1) | |
87 | 100 | # Start a specific agent of obs_config (restart) |
88 | 101 | agent_informations = obs_config.get_agent_information(obs_config.unit_name,agent) |
89 | 102 | protocol = agent_informations.get("protocol") |
... | ... | @@ -94,12 +107,13 @@ class AgentSST(Agent): |
94 | 107 | if os.path.exists(protocol_folder_abs_path + os.sep + protocol_script_name): |
95 | 108 | cmd = self.VENV_PYTHON +" "+ protocol_folder_abs_path + os.sep + protocol_script_name |
96 | 109 | if not agent in self.agent_in_mode_test: |
97 | - self.agent_in_mode_test = self.TEST_MODE | |
110 | + self.agent_in_mode_test[agent] = self.TEST_MODE | |
98 | 111 | if self.agent_in_mode_test[agent]: |
99 | 112 | cmd += test_mode |
100 | 113 | process = subprocess.Popen(f"{cmd}",shell=True) |
101 | 114 | process.poll() |
102 | - | |
115 | + if agent not in self.subprocess_dict: | |
116 | + self.subprocess_dict[agent] = {} | |
103 | 117 | self.subprocess_dict[agent]["process"] = process |
104 | 118 | nb_try_restart = self.subprocess_dict[agent].get("nb_try_restart",0) |
105 | 119 | nb_try_restart += 1 |
... | ... | @@ -158,7 +172,7 @@ class AgentSST(Agent): |
158 | 172 | # agent = args[0] |
159 | 173 | if agent in self.subprocess_dict.keys(): |
160 | 174 | cmd = self.send_cmd_to(agent,"do_exit") |
161 | - #cmd = self.send_cmd_to(agent,"do_exit","asap") | |
175 | + #cmd = self.send_cmd_to(agent,"do_stop","asap") | |
162 | 176 | return cmd |
163 | 177 | |
164 | 178 | def do_restart_agent(self, agent:str)->None: |
... | ... | @@ -217,7 +231,9 @@ class AgentSST(Agent): |
217 | 231 | agent = cmd.args[0] |
218 | 232 | self.force_kill_agent(agent) |
219 | 233 | |
220 | - # checking status of agent if they are timeout | |
234 | + # checking status of agent if they are timeout if in auto mode | |
235 | + # soft_mode = Majordome.objects.objects.last().soft_mode | |
236 | + # if soft_mode == "AUTO": | |
221 | 237 | for agent in self.subprocess_dict.keys(): |
222 | 238 | try: |
223 | 239 | agent_survey = AgentSurvey.objects.get(name=agent) |
... | ... | @@ -275,6 +291,11 @@ class AgentSST(Agent): |
275 | 291 | |
276 | 292 | |
277 | 293 | if __name__ == "__main__": |
278 | - | |
279 | - agent = build_agent(AgentSST) | |
294 | + parser = argparse.ArgumentParser(description='Start a agentSST.') | |
295 | + parser.add_argument("--computer",dest="computer",help='Launch agent with simulated computer hostname',action="store") | |
296 | + parser.add_argument("--agent",dest="agent",help='Launch an specific agent ',action="store") | |
297 | + parser.add_argument("-t", action="store_true" ) | |
298 | + args = vars(parser.parse_args()) | |
299 | + agent = build_agent(AgentSST,param_constr=args) | |
300 | + # agent = build_agent(AgentSST) | |
280 | 301 | agent.run() |
281 | 302 | \ No newline at end of file | ... | ... |