From 391dcf76fefb747888a3411ae3b8df7b1ad26685 Mon Sep 17 00:00:00 2001 From: ahothan Date: Sun, 7 Oct 2018 15:55:25 -0700 Subject: 2.0 beta NFVBENCH-91 Allow multi-chaining with separate edge networks Includes complete refactoring of code Beta for NFVbench 2.0 Change-Id: I2997f0fb7722d5ac626cd11a68692ae458c7676e Signed-off-by: ahothan --- nfvbench/chain_managers.py | 256 --------------------------------------------- 1 file changed, 256 deletions(-) delete mode 100644 nfvbench/chain_managers.py (limited to 'nfvbench/chain_managers.py') diff --git a/nfvbench/chain_managers.py b/nfvbench/chain_managers.py deleted file mode 100644 index 5882913..0000000 --- a/nfvbench/chain_managers.py +++ /dev/null @@ -1,256 +0,0 @@ -#!/usr/bin/env python -# Copyright 2016 Cisco Systems, Inc. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# -import time - -from log import LOG -from network import Network -from packet_analyzer import PacketAnalyzer -from specs import ChainType -from stats_collector import IntervalCollector - - -class StageManager(object): - """A class to stage resources in the systenm under test.""" - - def __init__(self, config, cred, factory): - self.config = config - self.client = None - # conditions due to EXT chain special cases - if (config.vlan_tagging and not config.vlans) or not config.no_int_config: - VM_CLASS = factory.get_stage_class(config.service_chain) - self.client = VM_CLASS(config, cred) - self.client.setup() - - def get_vlans(self): - return self.client.get_vlans() if self.client else [] - - def get_host_ips(self): - return self.client.get_host_ips() - - def get_networks_uuids(self): - return self.client.get_networks_uuids() - - def disable_port_security(self): - self.client.disable_port_security() - - def get_vms(self): - return self.client.vms - - def get_nets(self): - return self.client.nets - - def get_ports(self): - return self.client.ports - - def get_compute_nodes(self): - return self.client.compute_nodes if self.client else {} - - def set_vm_macs(self): - if self.client and self.config.service_chain != ChainType.EXT: - self.config.generator_config.set_vm_mac_list(self.client.get_end_port_macs()) - - def close(self): - if not self.config.no_cleanup and self.client: - self.client.dispose() - - -class PVPStatsManager(object): - """A class to generate traffic and extract results for PVP chains.""" - - def __init__(self, config, clients, specs, factory, vlans, notifier=None): - self.config = config - self.clients = clients - self.specs = specs - self.notifier = notifier - self.interval_collector = None - self.vlans = vlans - self.factory = factory - self._setup() - - def set_vlan_tag(self, device, vlan): - if self.worker: - self.worker.set_vlan_tag(device, vlan) - else: - device.set_vlan_tag(vlan) - - def _setup(self): - WORKER_CLASS = self.factory.get_chain_worker(self.specs.openstack.encaps, - self.config.service_chain) - self.worker = WORKER_CLASS(self.config, self.clients, self.specs) - try: - self.worker.set_vlans(self.vlans) - self._config_interfaces() - except Exception: - # since the wrorker is up and running, we need to close it - # in case of exception - self.close() - raise - - def _get_data(self): - return self.worker.get_data() if self.worker else {} - - def _get_network(self, traffic_port, stats, reverse=False): - """Get the Network object corresponding to a given TG port. - - :param traffic_port: must be either 0 or 1 - :param stats: TG stats for given traffic port - :param reverse: specifies if the interface list for this network - should go from TG to loopback point (reverse=false) or - from loopback point to TG (reverse=true) - """ - # build the interface list in fwd direction (TG To loopback point) - interfaces = [self.clients['traffic'].get_interface(traffic_port, stats)] - if self.worker: - # if available, - # interfaces for workers must be aligned on the TG port number - interfaces.extend(self.worker.get_network_interfaces(traffic_port)) - # let Network reverse the interface order if needed - return Network(interfaces, reverse) - - def _config_interfaces(self): - if self.config.service_chain != ChainType.EXT: - self.clients['vm'].disable_port_security() - - self.worker.config_interfaces() - - def _generate_traffic(self): - if self.config.no_traffic: - return {} - - self.interval_collector = IntervalCollector(time.time()) - self.interval_collector.attach_notifier(self.notifier) - LOG.info('Starting to generate traffic...') - stats = {} - for stats in self.clients['traffic'].run_traffic(): - self.interval_collector.add(stats) - - LOG.info('...traffic generating ended.') - return stats - - def get_stats(self): - return self.interval_collector.get() if self.interval_collector else [] - - def get_version(self): - return self.worker.get_version() if self.worker else {} - - def run(self): - """Run analysis in both direction and return the analysis.""" - if self.worker: - self.worker.run() - - stats = self._generate_traffic() - result = { - 'raw_data': self._get_data(), - 'packet_analysis': {}, - 'stats': stats - } - - # fetch latest stats from traffic gen - stats = self.clients['traffic'].get_stats() - LOG.info('Requesting packet analysis on the forward direction...') - result['packet_analysis']['direction-forward'] = \ - self.get_analysis([self._get_network(0, stats), - self._get_network(1, stats, reverse=True)]) - LOG.info('Packet analysis on the forward direction completed') - - LOG.info('Requesting packet analysis on the reverse direction...') - result['packet_analysis']['direction-reverse'] = \ - self.get_analysis([self._get_network(1, stats), - self._get_network(0, stats, reverse=True)]) - - LOG.info('Packet analysis on the reverse direction completed') - return result - - def get_compute_nodes_bios(self): - return self.worker.get_compute_nodes_bios() if self.worker else {} - - @staticmethod - def get_analysis(nets): - LOG.info('Starting traffic analysis...') - - packet_analyzer = PacketAnalyzer() - # Traffic types are assumed to always alternate in every chain. Add a no stats interface in - # between if that is not the case. - tx = True - for network in nets: - for interface in network.get_interfaces(): - packet_analyzer.record(interface, 'tx' if tx else 'rx') - tx = not tx - - LOG.info('...traffic analysis completed') - return packet_analyzer.get_analysis() - - def close(self): - if self.worker: - self.worker.close() - - -class PVVPStatsManager(PVPStatsManager): - """A Class to generate traffic and extract results for PVVP chains.""" - - def __init__(self, config, clients, specs, factory, vlans, notifier=None): - PVPStatsManager.__init__(self, config, clients, specs, factory, vlans, notifier) - - def run(self): - """Run analysis in both direction and return the analysis.""" - fwd_v2v_net, rev_v2v_net = self.worker.run() - - stats = self._generate_traffic() - result = { - 'raw_data': self._get_data(), - 'packet_analysis': {}, - 'stats': stats - } - # fetch latest stats from traffic gen - stats = self.clients['traffic'].get_stats() - fwd_nets = [self._get_network(0, stats)] - if fwd_v2v_net: - fwd_nets.append(fwd_v2v_net) - fwd_nets.append(self._get_network(1, stats, reverse=True)) - - rev_nets = [self._get_network(1, stats)] - if rev_v2v_net: - rev_nets.append(rev_v2v_net) - rev_nets.append(self._get_network(0, stats, reverse=True)) - - LOG.info('Requesting packet analysis on the forward direction...') - result['packet_analysis']['direction-forward'] = self.get_analysis(fwd_nets) - LOG.info('Packet analysis on the forward direction completed') - - LOG.info('Requesting packet analysis on the reverse direction...') - result['packet_analysis']['direction-reverse'] = self.get_analysis(rev_nets) - - LOG.info('Packet analysis on the reverse direction completed') - return result - - -class EXTStatsManager(PVPStatsManager): - """A Class to generate traffic and extract results for EXT chains.""" - - def __init__(self, config, clients, specs, factory, vlans, notifier=None): - PVPStatsManager.__init__(self, config, clients, specs, factory, vlans, notifier) - - def _setup(self): - if self.specs.openstack: - WORKER_CLASS = self.factory.get_chain_worker(self.specs.openstack.encaps, - self.config.service_chain) - self.worker = WORKER_CLASS(self.config, self.clients, self.specs) - self.worker.set_vlans(self.vlans) - - if not self.config.no_int_config: - self._config_interfaces() - else: - self.worker = None -- cgit 1.2.3-korg