def __setup_scenario(self, dic_payload):
        # Get the Base64 encoded ZIP file from payload
        click.secho(utils.logify('Unpacking scenario... '), nl=False)
        str_base64_zipped_scenario = dic_payload['scenarioBase64ZippedFolder']
        obj_zipped_scenario = StringIO(base64.b64decode(str_base64_zipped_scenario))
        obj_zipfile = ZipFile(obj_zipped_scenario, 'r')

        # Extract  ZIP file into temporary folder
        self.scenario_folder = tempfile.mkdtemp(prefix='woodpecker-')
        obj_zipfile.extractall(self.scenario_folder)
        click.secho('DONE', fg='green', bold=True)

        # Logging temp folder
        str_message = ' '.join(('Scenario temporary folder set to: ', self.scenario_folder))
        click.secho(utils.logify(str_message))

        # Fill all the object properties
        self.controller_port = dic_payload.get('controllerPort', '7878')
        self.spawn_quota = dic_payload.get('spawnQuota', 1)
        self.scenario_name = dic_payload.get('scenarioName', 'Scenario')
        self.scenario_file_path = utils.get_abs_path(dic_payload.get('scenarioFile', './scenario.py'),
                                                     self.scenario_folder)
        self.results_file_path = utils.get_abs_path(dic_payload.get('resultsFile', './results/results.sqlite'),
                                                    self.scenario_folder)

        # Create spawner
        click.secho(utils.logify('Setting up spawner... '))
        self.spawner = Spawner(self.controller_ip_address,
                               self.controller_port,
                               self.scenario_folder,
                               self.scenario_name,
                               self.scenario_file_path,
                               self.results_file_path,
                               self.spawn_quota)
        click.secho(utils.logify('Spawner created'), fg='green', bold=True)
Example #2
0
    def __initialize(self, str_scenario_name, **kwargs):
        # Self address
        self.ip_address = kwargs.get("ip_address", socket.gethostname())

        # Controller port
        self.port = kwargs.get("port", 7878)

        # Allocate an empty dict to collect spawners data
        self.spawners = {}
        list_spawners = kwargs.get("spawners", [self.ip_address])
        for str_spawner in list_spawners:
            self.spawners[str_spawner] = {}

            # Create a sender for each spawner
            self.spawners[str_spawner]["sender"] = Sender(str_spawner, self.port, "TCP")

        # Spawning mode (threads or subprocesses), defaults to threads
        self.spawn_mode = kwargs.get("spawn_mode", "thread")

        # Local flag to run everything on localhost (to be used in the future...), defaults to False
        self.local = kwargs.get("local", False)

        # Placeholder for scenario
        self.scenario = None

        # Scenario class name
        self.scenario_name = str_scenario_name

        # Scenario folder
        self.scenario_folder = utils.get_abs_path(kwargs.get("scenario_folder", os.getcwd()))

        # Scenario file, defaults to 'scenario.py'
        self.scenario_file = kwargs.get("scenario_file_path", "./scenario.py")

        # Scenario file path, defaults to standard scenario file
        self.scenario_file_path = utils.get_abs_path(self.scenario_file, self.scenario_folder)

        # Scenario duration, o be filled later
        self.scenario_duration = None

        # Result file, defaults to 'results/results.sqlite' file
        self.results_file = kwargs.get("results_file", "./results/results.sqlite")

        # Result file path
        self.results_file_path = utils.get_abs_path(self.results_file, self.scenario_folder)

        # Sysmonitor thread
        self.sysmonitor = Sysmonitor(self.ip_address, self.port, str_host_type="controller", bool_debug=False)

        # Log Collector thread
        self.logcollector = LogCollectorThread(self.results_file_path, self.ip_address, self.port)

        # Elapsed time since scenario duration
        self.scenario_elapsed_time = 0
Example #3
0
    def __initialize(self, **kwargs):
        # Controller and Log collector socket port
        self.port = kwargs.get('controller_port', 7878)

        #  Controller address, void at the beginning
        self.server_address = kwargs.get('controller_ip_address', None)

        # Scenario folder, defaults to current directory
        self.scenario_folder = kwargs.get('scenario_folder', os.getcwd())

        # Scenario file name, defaults to './scenario.py'
        self.scenario_file_path = utils.get_abs_path(kwargs.get('scenario_file', './scenario.py'),
                                                     self.scenario_folder)

        # Results file path, defaults to './results/results.sqlite'
        self.results_file_path = utils.get_abs_path(kwargs.get('results_file', './results/results.sqlite'),
                                                    self.scenario_folder)

        # Scenario name, defaults to 'Scenario'
        self.scenario_name = kwargs.get('scenario_name', 'Scenario')

        # Spawn quota for local spawner
        self.spawn_quota = kwargs.get('spawn_quota', 1)

        # Placeholder for scenario
        self.scenario = None

        # Armed flag, used to start and stop running
        self.armed = False

        # Elapsed time since scenario beginning
        self.elapsed_time = 0

        # Internal message sender placeholder
        self.sender = Sender(self.server_address, self.port, 'UDP') if self.server_address else None

        # Sender spawn message poll interval
        self.sender_spawn_polling_interval = kwargs.get('sender_spawn_polling_interval', 5)
        self.sender_spawn_elapsed_time = 0.0

        # Internal Sysmonitor object and related thread
        self.sysmonitor_polling_interval = kwargs.get('sysmonitor_polling_interval', 1.0)

        click.secho(utils.logify('Setting up Sysmonitor... ', 'Spawner'))
        self.sysmonitor = Sysmonitor(self.server_address, self.port, self.sysmonitor_polling_interval)
        click.secho(utils.logify('Sysmonitor started'), fg='green', bold=True)
Example #4
0
 def add_transaction(self, str_name, str_path):
     str_abspath = utils.get_abs_path(str_path, self.scenario_folder)
     obj_transaction = {
         'name': str_name,
         'path': str_abspath,
         'class': utils.import_from_path(str_abspath, str_name, {'navigation_name': self.name}),
         'server_address': self.server_address,
         'server_port': self.server_port
     }
     self.test_transactions.append(obj_transaction)
Example #5
0
 def add_navigation(self, str_navigationname, str_path):
     self.navigations[str_navigationname] = {}
     self.navigations[str_navigationname]["path"] = str_path
     self.navigations[str_navigationname]["class"] = utils.import_from_path(
         utils.get_abs_path(str_path, self.scenario_folder),
         str_navigationname,
         {"navigation_name": str_navigationname},
     )
     self.navigations[str_navigationname]["ramps"] = []
     self.navigations[str_navigationname]["iteration_limit"] = 0
     self.navigations[str_navigationname]["current_spawns"] = 0
     self.navigations[str_navigationname]["planned_spawns"] = 0
     self.navigations[str_navigationname]["iterations"] = 0
     self.navigations[str_navigationname]["start_time"] = None
     self.navigations[str_navigationname]["elapsed_time"] = 0
     self.navigations[str_navigationname]["threads"] = []