From 997d4b8e33907fdaf5ba8c6f81c20c6936ea7846 Mon Sep 17 00:00:00 2001 From: Etienne Pallier Date: Thu, 14 Mar 2019 18:51:13 +0100 Subject: [PATCH] AgentA et AgentX peuvent s'executer en meme temps sans conflit --- pyros.py | 1 + src/agent/AgentA.py | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ start_agent.py | 12 ++++++++++-- 3 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 src/agent/AgentA.py diff --git a/pyros.py b/pyros.py index 28327fd..e1794cc 100755 --- a/pyros.py +++ b/pyros.py @@ -25,6 +25,7 @@ INIT_FIXTURE = "initial_fixture.json" AGENTS = { #"agentX" : "majordome", "agentX" : "agent", + "agentA" : "agent", "webserver" : "webserver", "monitoring" : "monitoring", "majordome" : "majordome", diff --git a/src/agent/AgentA.py b/src/agent/AgentA.py new file mode 100644 index 0000000..bb2c923 --- /dev/null +++ b/src/agent/AgentA.py @@ -0,0 +1,161 @@ + +import utils.Logger as L +import threading #, multiprocessing, os +import time + +from django.db import transaction +from common.models import Command + +from .Agent import Agent + + + +log = L.setupLogger("AgentXTaskLogger", "AgentX") + + + +class AgentA(Agent): + + """ + How to run this agent thread_exec_specific_cmd() method ? + - True = inside a Thread (cannot be killed, must be asked to stop, and inadequate for computation) + - False = inside a Process + If thread, displays : + >>>>> Thread: starting execution of command specific1 + >>>>> Thread: PID: 2695, Process Name: MainProcess, Thread Name: Thread-1 + ... + >>>>> Thread: starting execution of command specific2 + >>>>> Thread: PID: 2695, Process Name: MainProcess, Thread Name: Thread-2 + ... + >>>>> Thread: starting execution of command specific3 + >>>>> Thread: PID: 2695, Process Name: MainProcess, Thread Name: Thread-3 + If process, displays : + >>>>> Thread: starting execution of command specific1 + >>>>> Thread: PID: 2687, Process Name: Process-1, Thread Name: MainThread + ... + >>>>> Thread: starting execution of command specific2 + >>>>> Thread: PID: 2689, Process Name: Process-2, Thread Name: MainThread + ... + >>>>> Thread: starting execution of command specific3 + >>>>> Thread: PID: 2690, Process Name: Process-3, Thread Name: MainThread + """ + RUN_IN_THREAD = True + #RUN_IN_THREAD = False + + + """ + ================================================================= + FUNCTIONS RUN INSIDE MAIN THREAD + ================================================================= + """ + + # @override + def __init__(self, name:str=None, config_filename=None): + if name is None: name = self.__class__.__name__ + super().__init__(name, config_filename, self.RUN_IN_THREAD) + + # @override + def init(self): + super().init() + # --- Set the mode according the startmode value + ##agent_alias = self.__class__.__name__ + ##self.set_mode_from_config(agent_alias) + + ''' + # @override + def load_config(self): + super().load_config() + ''' + + ''' + # @override + def update_survey(self): + super().update_survey() + ''' + + ''' + # @override + def get_next_command(self): + return super().get_next_command() + ''' + + # @override + def do_log(self): + super().do_log() + + + + """ + ================================================================= + FUNCTIONS RUN INSIDE A SUB-THREAD (OR A PROCESS) (thread_*()) + ================================================================= + """ + + # Define your own command step(s) here + def cmd_step1(self, step:int): + cmd = self._current_specific_cmd + cmd.result = f"in step #{step}/{self._thread_total_steps_number}" + cmd.save() + """ + if self.RUN_IN_THREAD: + print("(save from thread)") + cmd.save() + else: + #@transaction.atomic + print("(save from process)") + with transaction.atomic(): + cmd.save() + #Command.objects.select_for_update() + """ + + def cmd_step2(self, step:int): + self.cmd_step1(step) + def cmd_step3(self, step:int): + self.cmd_step1(step) + def cmd_step4(self, step:int): + self.cmd_step1(step) + + """ + # @override + def thread_exec_specific_cmd_step(self, step:int, sleep_time:float=1.0): + self.thread_stop_if_asked() + cmd = self._current_specific_cmd + print(f">>>>> Thread (cmd {cmd.name}): step #{step}/5") + self.sleep(sleep_time) + """ + + ''' + # @override + def exec_specific_cmd_start(self, cmd:Command, from_thread=True): + super().exec_specific_cmd_start(cmd, from_thread) + ''' + + + # @override + def thread_exec_specific_cmd_main(self): + # This is optional + self.thread_set_total_steps_number(5) + + # HERE, write your own scenario + + # scenario OK + self.thread_exec_specific_cmd_step(1, self.cmd_step1, 1) + self.thread_exec_specific_cmd_step(2, self.cmd_step2, 3) + self.thread_exec_specific_cmd_step(3, self.cmd_step1, 5) + self.thread_exec_specific_cmd_step(4, self.cmd_step3, 10) + self.thread_exec_specific_cmd_step(5, self.cmd_step1, 4) + # ... as many as you need + + """ autre scenario + self.thread_exec_specific_cmd_step(1, self.cmd_step1, 1) + self.thread_exec_specific_cmd_step(2, self.cmd_step2, 2) + self.thread_exec_specific_cmd_step(3, self.cmd_step1, 2) + self.thread_exec_specific_cmd_step(4, self.cmd_step3, 2) + self.thread_exec_specific_cmd_step(5, self.cmd_step1, 3) + """ + + ''' + # @override + def exec_specific_cmd_end(self, cmd:Command, from_thread=True): + super().exec_specific_cmd_end(cmd, from_thread) + ''' diff --git a/start_agent.py b/start_agent.py index 060e7d2..9fca1f1 100755 --- a/start_agent.py +++ b/start_agent.py @@ -7,6 +7,7 @@ from django.conf import settings as djangosettings AGENTS = { "agentX" : "AgentX", + "agentA" : "AgentA", "webserver" : "webserver", "monitoring" : "monitoring", "majordome" : "majordome", @@ -92,11 +93,18 @@ if agent_name == "monitoring": Monitoring().run() sys.exit(0) +if agent_name == "agentA": + from src.agent.AgentA import AgentA + agentA = AgentA(name="agentA", config_filename=configfile) + # Run agent without actual commands sent to devices (FOR_REAL=False) + agentA.run(FOR_REAL=True) + sys.exit(0) + # Default agent is AgentX from src.agent.AgentX import AgentX # AgentX().run(FOR_REAL=False) -agentx = AgentX(name="agentX", config_filename=configfile) +agentX = AgentX(name="agentX", config_filename=configfile) # Run agent without actual commands sent to devices (FOR_REAL=False) -agentx.run(FOR_REAL=True) +agentX.run(FOR_REAL=True) -- libgit2 0.21.2