From 5b835b38086e8ac1b066141ea4596889a28fbd7a Mon Sep 17 00:00:00 2001 From: Etienne Pallier Date: Tue, 26 Mar 2019 22:34:55 +0100 Subject: [PATCH] agentM --- README.md | 4 +++- pyros.py | 1 + src/agent/AgentM.py | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 179 insertions(+), 1 deletion(-) create mode 100755 src/agent/AgentM.py diff --git a/README.md b/README.md index 441793d..81ae98d 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,9 @@ Author: E. Pallier VERSION: 0.20.31 -Comment: routine_process() : envoi commande n'est plus bloquant +Comment: AgentM + + - routine_process() : envoi commande n'est plus bloquant - Scenario de test : - lancer agents A et B en mode simu (option -t): ./pyros.py -t start agentA,agentB diff --git a/pyros.py b/pyros.py index 819e0e5..e003569 100755 --- a/pyros.py +++ b/pyros.py @@ -28,6 +28,7 @@ AGENTS = { "agentX" : "AgentX", "agentA" : "AgentA", "agentB" : "AgentB", + "agentM" : "AgentM", "webserver" : "webserver", "monitoring" : "monitoring", "majordome" : "majordome", diff --git a/src/agent/AgentM.py b/src/agent/AgentM.py new file mode 100755 index 0000000..21e413f --- /dev/null +++ b/src/agent/AgentM.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 + +import sys +##import utils.Logger as L +#import threading #, multiprocessing, os +#import time + +#from django.db import transaction +#from common.models import Command + +sys.path.append("..") +from agent.Agent import Agent, extract_parameters + + + +##log = L.setupLogger("AgentXTaskLogger", "AgentX") + + + +class AgentM(Agent): + + + # FOR TEST ONLY + # Run this agent in simulator mode + SIMULATOR_MODE = False + # Run the assertion tests at the end + SIMULATOR_WITH_TEST = True + SIMULATOR_MAX_DURATION_SEC = None + #SIMULATOR_MAX_DURATION_SEC = 120 + ''' + # Who should I send commands to ? + #SIMULATOR_COMMANDS_DEST = "myself" + SIMULATOR_COMMANDS_DEST = "AgentA" + # Scenario to be executed + SIMULATOR_COMMANDS_LIST = [ + "go_active", + "go_idle", + "go_active", + "go_idle", + "go_active", + "go_idle", + "exit", + ] + ''' + + """ + ================================================================= + FUNCTIONS RUN INSIDE MAIN THREAD + ================================================================= + """ + + # @override + def __init__(self, name:str=None, config_filename=None, RUN_IN_THREAD=True): + if name is None: name = self.__class__.__name__ + super().__init__(name, config_filename, 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) + ''' + + +if __name__ == "__main__": + + # with thread + RUN_IN_THREAD=True + # with process + #RUN_IN_THREAD=False + + TEST_MODE, configfile = extract_parameters() + agent = AgentM("AgentM", configfile, RUN_IN_THREAD) + agent.setSimulatorMode(TEST_MODE) + print(agent) + agent.run() -- libgit2 0.21.2