def setUp(self):
        """
        Setup test environment
        """
        logging.basicConfig(level=logging.ERROR)
        metrics.reset_metrics()

        self.env = simpy.Environment()
        # Configure simulator parameters
        network, ing_nodes = reader.read_network(NETWORK_FILE,
                                                 node_cap=10,
                                                 link_cap=10)
        sfc_list = reader.get_sfc(SERVICE_FUNCTIONS_FILE)
        sf_list = reader.get_sf(SERVICE_FUNCTIONS_FILE, RESOURCE_FUNCTION_PATH)
        config = reader.get_config(CONFIG_FILE)

        sf_placement = dummy_data.triangle_placement
        schedule = dummy_data.triangle_schedule

        # Initialize Simulator and SimulatoParams objects
        self.simulator_params = SimulatorParams(network,
                                                ing_nodes,
                                                sfc_list,
                                                sf_list,
                                                config,
                                                sf_placement=sf_placement,
                                                schedule=schedule)
        self.flow_simulator = FlowSimulator(self.env, self.simulator_params)
        self.flow_simulator.start()
        self.env.run(until=SIMULATION_DURATION)
Exemplo n.º 2
0
def main():
    args = parse_args()
    metrics.reset_metrics()
    start_time = time.time()
    logging.basicConfig(level=logging.INFO)

    # Create a SimPy environment
    env = simpy.Environment()

    # Seed the random generator
    random.seed(args.seed)
    numpy.random.seed(args.seed)

    # Parse network and get NetworkX object and ingress network list
    network, ing_nodes = reader.read_network(args.network,
                                             node_cap=10,
                                             link_cap=10)

    # Getting current SFC list, and the SF list of each SFC, and config

    # use dummy placement and schedule for running simulator without algorithm
    # TODO: make configurable via CLI
    sf_placement = dummy_data.triangle_placement
    schedule = dummy_data.triangle_schedule

    # Getting current SFC list, and the SF list of each SFC, and config
    sfc_list = reader.get_sfc(args.sf)
    sf_list = reader.get_sf(args.sf, args.sfr)
    config = reader.get_config(args.config)

    # Create the simulator parameters object with the provided args
    params = SimulatorParams(network,
                             ing_nodes,
                             sfc_list,
                             sf_list,
                             config,
                             sf_placement=sf_placement,
                             schedule=schedule)
    log.info(params)

    if 'trace_path' in config:
        trace_path = os.path.join(os.getcwd(), config['trace_path'])
        trace = reader.get_trace(trace_path)
        TraceProcessor(params, env, trace)
        log.info("Using trace " + config['trace_path'])
    # Create a FlowSimulator object, pass the SimPy environment and params objects
    simulator = FlowSimulator(env, params)

    # Start the simulation
    simulator.start()

    # Run the simpy environment for the specified duration
    env.run(until=args.duration)

    # Record endtime and running_time metrics
    end_time = time.time()
    metrics.running_time(start_time, end_time)

    # dump all metrics
    log.info(metrics.metrics)
    def init(self, seed):

        # reset network caps and available SFs:
        reader.reset_cap(self.network)
        # Initialize metrics, record start time
        metrics.reset_metrics()
        self.run_times = int(1)
        self.start_time = time.time()

        # Parse network and SFC + SF file

        # Generate SimPy simulation environment
        self.env = simpy.Environment()

        self.params = SimulatorParams(self.network, self.ing_nodes,
                                      self.sfc_list, self.sf_list, self.config)

        # Instantiate the parameter object for the simulator.
        if self.params.use_states and 'trace_path' in self.config:
            logger.warning(
                'Two state model and traces are both activated, thi will cause unexpected behaviour!'
            )

        if self.params.use_states:
            if self.params.in_init_state:
                self.params.in_init_state = False
            else:
                self.params.update_state()

        self.duration = self.params.run_duration
        # Get and plant random seed
        self.seed = seed
        random.seed(self.seed)
        numpy.random.seed(self.seed)

        # Instantiate a simulator object, pass the environment and params
        self.simulator = FlowSimulator(self.env, self.params)

        # Start the simulator
        self.simulator.start()
        # Trace handling
        if 'trace_path' in self.config:
            trace_path = os.path.join(os.getcwd(), self.config['trace_path'])
            trace = reader.get_trace(trace_path)
            TraceProcessor(self.params, self.env, trace, self.simulator)

        # Run the environment for one step to get initial stats.
        self.env.step()

        # Parse the NetworkX object into a dict format specified in SimulatorState. This is done to account
        # for changing node remaining capacities.
        # Also, parse the network stats and prepare it in SimulatorState format.
        self.parse_network()
        self.network_metrics()

        # Record end time and running time metrics
        self.end_time = time.time()
        metrics.running_time(self.start_time, self.end_time)
        simulator_state = SimulatorState(self.network_dict,
                                         self.simulator.params.sf_placement,
                                         self.sfc_list, self.sf_list,
                                         self.traffic, self.network_stats)
        logger.debug(f"t={self.env.now}: {simulator_state}")

        return simulator_state