summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorDino Simeon Madarang <dino.simeonx.madarang@intel.com>2015-07-15 09:22:07 +0100
committerMaryam Tahhan <maryam.tahhan@intel.com>2015-08-18 14:51:12 +0000
commit3af55a78fcd572f93b1a46178bffc4c8e90534f2 (patch)
treefeece4539f8d62c4a261ff777723205b918bc32a /core
parentc4541ffb52274b3917c76e32733c0257ca3bbb76 (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.py6
-rwxr-xr-xcore/loader/loader.py39
-rw-r--r--core/vnf_controller_p2p.py6
-rw-r--r--core/vnf_controller_pvp.py21
-rw-r--r--core/vswitch_controller.py5
-rw-r--r--core/vswitch_controller_pvp.py60
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)