diff options
author | Dino Simeon Madarang <dino.simeonx.madarang@intel.com> | 2015-07-15 09:22:07 +0100 |
---|---|---|
committer | Maryam Tahhan <maryam.tahhan@intel.com> | 2015-08-18 14:51:12 +0000 |
commit | 3af55a78fcd572f93b1a46178bffc4c8e90534f2 (patch) | |
tree | feece4539f8d62c4a261ff777723205b918bc32a /core | |
parent | c4541ffb52274b3917c76e32733c0257ca3bbb76 (diff) |
vnfs: Enable PVP using vhost-user
Enable booting of a VM with DPDK and run testpmd for
PVP testing.
* Added throughput and back2back tests with pvp deployment scenario in
01_testcases.conf
* PVP requires DPDK 2.0 with VHOST_USER enabled and QEMU 2.2.0
* Tested on CentOS7 and Fedora 20
* Fix conflict with change 1078
Recent Changes:
* Fix merge conflict (testcase.py and testcases.conf)
* Remove QEMU_DIR. User must set QEMU_BIN
* Set bidir traffic to True
* Add flow for bi-directional traffic
* Use working OVS_TAG ad2e649834be20dd01b1632799fe778106a96a2d
* Merge change 1096 (src: Add QEMU makefile)
* Set virtio-net-pci csum=off and other variables to off
* Move hardcoded values to conf/*
JIRA: VSPERF-56
Change-Id: I4ad184531064855493483d9833a7722c9f7d3576
Signed-off-by: Madarang, Dino Simeon <dino.simeonx.madarang@intel.com>
Signed-off-by: Meghan Halton <meghan.halton@intel.com>
Reviewed-by: Billy O Mahony <billy.o.mahony@intel.com>
Reviewed-by: Maryam Tahhan <maryam.tahhan@intel.com>
Reviewed-by: Martin Klozik <martinx.klozik@intel.com>
Diffstat (limited to 'core')
-rw-r--r-- | core/component_factory.py | 6 | ||||
-rwxr-xr-x | core/loader/loader.py | 39 | ||||
-rw-r--r-- | core/vnf_controller_p2p.py | 6 | ||||
-rw-r--r-- | core/vnf_controller_pvp.py | 21 | ||||
-rw-r--r-- | core/vswitch_controller.py | 5 | ||||
-rw-r--r-- | core/vswitch_controller_pvp.py | 60 |
6 files changed, 110 insertions, 27 deletions
diff --git a/core/component_factory.py b/core/component_factory.py index c101f5d2..1fe0964e 100644 --- a/core/component_factory.py +++ b/core/component_factory.py @@ -45,7 +45,7 @@ def create_traffic(traffic_type, trafficgen_class): return TrafficControllerRFC2544(trafficgen_class) -def create_vswitch(deployment_scenario, vswitch_class): +def create_vswitch(deployment_scenario, vswitch_class, bidir=True): """Return a new IVSwitchController for the deployment_scenario. The returned controller is configured with the given vSwitch class. @@ -62,7 +62,7 @@ def create_vswitch(deployment_scenario, vswitch_class): if deployment_scenario.find("p2p") >= 0: return VswitchControllerP2P(vswitch_class) elif deployment_scenario.find("pvp") >= 0: - return VswitchControllerPVP(vswitch_class) + return VswitchControllerPVP(vswitch_class, bidir) def create_vnf(deployment_scenario, vnf_class): """Return a new IVnfController for the deployment_scenario. @@ -79,7 +79,7 @@ def create_vnf(deployment_scenario, vnf_class): #correct controller class deployment_scenario = deployment_scenario.lower() if deployment_scenario.find("p2p") >= 0: - return VnfControllerP2P(vnf_class) + return VnfControllerP2P(None) elif deployment_scenario.find("pvp") >= 0: return VnfControllerPVP(vnf_class) diff --git a/core/loader/loader.py b/core/loader/loader.py index 57787751..39b50f09 100755 --- a/core/loader/loader.py +++ b/core/loader/loader.py @@ -20,6 +20,7 @@ from core.loader.loader_servant import LoaderServant from tools.pkt_gen.trafficgen import ITrafficGenerator from tools.collectors.collector import ICollector from vswitches.vswitch import IVSwitch +from vnfs.vnf.vnf import IVnf class Loader(object): """Loader class - main object context holder. @@ -27,6 +28,7 @@ class Loader(object): _trafficgen_loader = None _metrics_loader = None _vswitch_loader = None + _vnf_loader = None def __init__(self): """Loader ctor - initialization method. @@ -50,6 +52,11 @@ class Loader(object): settings.getValue('VSWITCH'), IVSwitch) + self._vnf_loader = LoaderServant( + settings.getValue('VNF_DIR'), + settings.getValue('VNF'), + IVnf) + def get_trafficgen(self): """Returns a new instance configured traffic generator. @@ -144,10 +151,34 @@ class Loader(object): """ return self._vswitch_loader.get_classes_printable() + def get_vnf(self): + """Returns instance of currently configured vnf implementation. + + :return: IVnf implementation if available, None otherwise. + """ + return self._vnf_loader.get_class()() + def get_vnf_class(self): - """Returns a new instance of the configured VNF + """Returns type of currently configured vnf implementation. + + :return: Type of IVnf implementation if available. + None otherwise. + """ + return self._vnf_loader.get_class() + + def get_vnfs(self): + """Returns dictionary of all available vnfs. + + :return: Dictionary of vnfs. + - key: name of the class which implements IVnf, + - value: Type of vnf which implements IVnf. + """ + return self._vnf_loader.get_classes() + + def get_vnfs_printable(self): + """Returns all available vnfs in printable format. - Currently always returns None + :return: String containing printable list of vnfs. """ - #TODO: Load the VNF class - return None + return self._vnf_loader.get_classes_printable() + diff --git a/core/vnf_controller_p2p.py b/core/vnf_controller_p2p.py index 60161480..a881d345 100644 --- a/core/vnf_controller_p2p.py +++ b/core/vnf_controller_p2p.py @@ -56,3 +56,9 @@ class VnfControllerP2P(IVnfController): """Stops nothing. """ self._logger.debug('stop with ' + str(self._vnf_class)) + + def __enter__(self): + self.start() + + def __exit__(self, type_, value, traceback): + self.stop() diff --git a/core/vnf_controller_pvp.py b/core/vnf_controller_pvp.py index 16c21869..1878db10 100644 --- a/core/vnf_controller_pvp.py +++ b/core/vnf_controller_pvp.py @@ -37,24 +37,33 @@ class VnfControllerPVP(IVnfController): :param vnf_class: The VNF class to be used. """ self._logger = logging.getLogger(__name__) - self._vnf_class = vnf_class + self._vnf_class = vnf_class() self._deployment_scenario = "PVP" - self._vnfs = [] - self._logger.debug('__init__ with ' + str(self._vnf_class)) + self._vnfs = [vnf_class(deployment=self._deployment_scenario)] + self._logger.debug('__init__ with ' + str(self._vnfs[0])) #TODO call vnf.xxx to carry out the required setup def get_vnfs(self): """See IVnfController for description """ - self._logger.debug('get_vnfs with ' + str(self._vnf_class)) + self._logger.debug('get_vnfs with ' + str(self._vnfs[0])) return self._vnfs def start(self): """See IVnfController for description """ - self._logger.debug('start with ' + str(self._vnf_class)) + self._logger.debug('start with ' + str(self._vnfs[0])) + for vnf in self._vnfs: + vnf.start() def stop(self): """See IVnfController for description """ - self._logger.debug('stop with ' + str(self._vnf_class)) + self._logger.debug('stop with ' + str(self._vnfs[0])) + self._vnfs[0].stop() + + def __enter__(self): + self.start() + + def __exit__(self, type_, value, traceback): + self.stop() diff --git a/core/vswitch_controller.py b/core/vswitch_controller.py index 1caf94fb..619e1d8b 100644 --- a/core/vswitch_controller.py +++ b/core/vswitch_controller.py @@ -20,12 +20,13 @@ class IVswitchController(object): This interface is used to setup and control a vSwitch provider for a particular deployment scenario. """ - def setup(self): + def __enter__(self): """Sets up the switch for the particular deployment scenario """ raise NotImplementedError( "The VswitchController does not implement the \"setup\" function.") - def stop(self): + + def __exit__(self, type_, value, traceback): """Tears down the switch created in setup() """ raise NotImplementedError( diff --git a/core/vswitch_controller_pvp.py b/core/vswitch_controller_pvp.py index c0286323..8c409dc2 100644 --- a/core/vswitch_controller_pvp.py +++ b/core/vswitch_controller_pvp.py @@ -18,6 +18,12 @@ import logging from core.vswitch_controller import IVswitchController +from vswitches.utils import add_ports_to_flow + +_FLOW_TEMPLATE = { + 'idle_timeout': '0' +} +BRIDGE_NAME = 'br0' class VswitchControllerPVP(IVswitchController): """VSwitch controller for PVP deployment scenario. @@ -28,7 +34,7 @@ class VswitchControllerPVP(IVswitchController): _deployment_scenario: A string describing the scenario to set-up in the constructor. """ - def __init__(self, vswitch_class): + def __init__(self, vswitch_class, bidir=False): """Initializes up the prerequisites for the PVP deployment scenario. :vswitch_class: the vSwitch class to be used. @@ -37,22 +43,55 @@ class VswitchControllerPVP(IVswitchController): self._vswitch_class = vswitch_class self._vswitch = vswitch_class() self._deployment_scenario = "PVP" + self._bidir = bidir self._logger.debug('Creation using ' + str(self._vswitch_class)) def setup(self): + """ Sets up the switch for pvp """ - Sets up the switch for the particular deployment scenario passed in to - the constructor. - """ - # TODO call IVSwitch methods to configure VSwitch for PVP scenario. self._logger.debug('Setup using ' + str(self._vswitch_class)) + try: + self._vswitch.start() + + self._vswitch.add_switch(BRIDGE_NAME) + + (_, phy1_number) = self._vswitch.add_phy_port(BRIDGE_NAME) + (_, phy2_number) = self._vswitch.add_phy_port(BRIDGE_NAME) + (_, vport1_number) = self._vswitch.add_vport(BRIDGE_NAME) + (_, vport2_number) = self._vswitch.add_vport(BRIDGE_NAME) + + self._vswitch.del_flow(BRIDGE_NAME) + flow1 = add_ports_to_flow(_FLOW_TEMPLATE, phy1_number, + vport1_number) + flow2 = add_ports_to_flow(_FLOW_TEMPLATE, vport2_number, + phy2_number) + self._vswitch.add_flow(BRIDGE_NAME, flow1) + self._vswitch.add_flow(BRIDGE_NAME, flow2) + + if self._bidir: + flow3 = add_ports_to_flow(_FLOW_TEMPLATE, phy2_number, + vport2_number) + flow4 = add_ports_to_flow(_FLOW_TEMPLATE, vport1_number, + phy1_number) + self._vswitch.add_flow(BRIDGE_NAME, flow3) + self._vswitch.add_flow(BRIDGE_NAME, flow4) + + except: + self._vswitch.stop() + raise + def stop(self): + """Tears down the switch created in setup(). """ - Tears down the switch created in setup(). - """ - # TODO call IVSwitch methods to stop VSwitch for PVP scenario. self._logger.debug('Stop using ' + str(self._vswitch_class)) + self._vswitch.stop() + + def __enter__(self): + self.setup() + + def __exit__(self, type_, value, traceback): + self.stop() def get_vswitch(self): """See IVswitchController for description @@ -63,7 +102,4 @@ class VswitchControllerPVP(IVswitchController): """See IVswitchController for description """ self._logger.debug('get_ports_info using ' + str(self._vswitch_class)) - return [] - - - + return self._vswitch.get_ports(BRIDGE_NAME) |