aboutsummaryrefslogtreecommitdiffstats
path: root/yardstick/network_services/vnf_generic/vnf
diff options
context:
space:
mode:
Diffstat (limited to 'yardstick/network_services/vnf_generic/vnf')
-rw-r--r--yardstick/network_services/vnf_generic/vnf/acl_vnf.py3
-rw-r--r--yardstick/network_services/vnf_generic/vnf/base.py58
-rw-r--r--yardstick/network_services/vnf_generic/vnf/sample_vnf.py36
-rw-r--r--yardstick/network_services/vnf_generic/vnf/tg_ping.py4
-rw-r--r--yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py5
-rw-r--r--yardstick/network_services/vnf_generic/vnf/tg_trex.py8
6 files changed, 54 insertions, 60 deletions
diff --git a/yardstick/network_services/vnf_generic/vnf/acl_vnf.py b/yardstick/network_services/vnf_generic/vnf/acl_vnf.py
index 3ba38dec2..1390dd02e 100644
--- a/yardstick/network_services/vnf_generic/vnf/acl_vnf.py
+++ b/yardstick/network_services/vnf_generic/vnf/acl_vnf.py
@@ -61,9 +61,6 @@ class AclApproxVnf(SampleVNF):
super(AclApproxVnf, self).__init__(name, vnfd, setup_env_helper_type, resource_helper_type)
self.acl_rules = None
- def scale(self, flavor=""):
- raise NotImplementedError
-
def _start_vnf(self):
yang_model_path = find_relative_file(self.scenario_helper.options['rules'],
self.scenario_helper.task_path)
diff --git a/yardstick/network_services/vnf_generic/vnf/base.py b/yardstick/network_services/vnf_generic/vnf/base.py
index 8ed754dce..a776b0989 100644
--- a/yardstick/network_services/vnf_generic/vnf/base.py
+++ b/yardstick/network_services/vnf_generic/vnf/base.py
@@ -138,76 +138,62 @@ class VnfdHelper(dict):
yield port_name, port_num
-class VNFObject(object):
+@six.add_metaclass(abc.ABCMeta)
+class GenericVNF(object):
+ """Class providing file-like API for generic VNF implementation
+
+ Currently the only class implementing this interface is
+ yardstick/network_services/vnf_generic/vnf/sample_vnf:SampleVNF.
+ """
# centralize network naming convention
UPLINK = PortPairs.UPLINK
DOWNLINK = PortPairs.DOWNLINK
def __init__(self, name, vnfd):
- super(VNFObject, self).__init__()
self.name = name
- self.vnfd_helper = VnfdHelper(vnfd) # fixme: parse this into a structure
-
-
-class GenericVNF(VNFObject):
-
- """ Class providing file-like API for generic VNF implementation """
- def __init__(self, name, vnfd):
- super(GenericVNF, self).__init__(name, vnfd)
+ self.vnfd_helper = VnfdHelper(vnfd)
# List of statistics we can obtain from this VNF
# - ETSI MANO 6.3.1.1 monitoring_parameter
- self.kpi = self._get_kpi_definition()
+ self.kpi = self.vnfd_helper.kpi
# Standard dictionary containing params like thread no, buffer size etc
self.config = {}
self.runs_traffic = False
- def _get_kpi_definition(self):
- """ Get list of KPIs defined in VNFD
-
- :param vnfd:
- :return: list of KPIs, e.g. ['throughput', 'latency']
- """
- return self.vnfd_helper.kpi
-
+ @abc.abstractmethod
def instantiate(self, scenario_cfg, context_cfg):
- """ Prepare VNF for operation and start the VNF process/VM
+ """Prepare VNF for operation and start the VNF process/VM
- :param scenario_cfg:
- :param context_cfg:
+ :param scenario_cfg: Scenario config
+ :param context_cfg: Context config
:return: True/False
"""
- raise NotImplementedError()
+ @abc.abstractmethod
def wait_for_instantiate(self):
- """ Wait for VNF to start
+ """Wait for VNF to start
:return: True/False
"""
- raise NotImplementedError()
+ @abc.abstractmethod
def terminate(self):
- """ Kill all VNF processes
-
- :return:
- """
- raise NotImplementedError()
+ """Kill all VNF processes"""
+ @abc.abstractmethod
def scale(self, flavor=""):
- """
+ """rest
- :param flavor:
+ :param flavor: Name of the flavor.
:return:
"""
- raise NotImplementedError()
+ @abc.abstractmethod
def collect_kpi(self):
- """This method should return a dictionary containing the
- selected KPI at a given point of time.
+ """Return a dict containing the selected KPI at a given point of time
:return: {"kpi": value, "kpi2": value}
"""
- raise NotImplementedError()
@six.add_metaclass(abc.ABCMeta)
diff --git a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
index 20e5895ee..5eeb6c889 100644
--- a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
+++ b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
@@ -28,6 +28,7 @@ from six.moves import cStringIO
from yardstick.benchmark.contexts.base import Context
from yardstick.benchmark.scenarios.networking.vnf_generic import find_relative_file
+from yardstick.common import exceptions as y_exceptions
from yardstick.common.process import check_if_process_failed
from yardstick.network_services.helpers.samplevnf_helper import PortPairs
from yardstick.network_services.helpers.samplevnf_helper import MultiPortConfig
@@ -308,7 +309,7 @@ class DpdkVnfSetupEnvHelper(SetupEnvHelper):
if vpci == v['virtual-interface']['vpci'])
# force to int
intf['virtual-interface']['dpdk_port_num'] = int(dpdk_port_num)
- except:
+ except: # pylint: disable=bare-except
pass
time.sleep(2)
@@ -472,6 +473,11 @@ class ClientResourceHelper(ResourceHelper):
self.client.clear_stats(ports=ports)
def start(self, ports=None, *args, **kwargs):
+ # pylint: disable=keyword-arg-before-vararg
+ # NOTE(ralonsoh): defining keyworded arguments before variable
+ # positional arguments is a bug. This function definition doesn't work
+ # in Python 2, although it works in Python 3. Reference:
+ # https://www.python.org/dev/peps/pep-3102/
if ports is None:
ports = self.all_ports
self.client.start(ports=ports, *args, **kwargs)
@@ -480,8 +486,8 @@ class ClientResourceHelper(ResourceHelper):
if not self._queue.empty():
kpi = self._queue.get()
self._result.update(kpi)
- LOG.debug("Got KPIs from _queue for {0} {1}".format(
- self.scenario_helper.name, self.RESOURCE_WORD))
+ LOG.debug('Got KPIs from _queue for %s %s',
+ self.scenario_helper.name, self.RESOURCE_WORD)
return self._result
def _connect(self, client=None):
@@ -670,7 +676,7 @@ class SampleVNF(GenericVNF):
self.pipeline_kwargs = {}
self.uplink_ports = None
self.downlink_ports = None
- # TODO(esm): make QueueFileWrapper invert-able so that we
+ # NOTE(esm): make QueueFileWrapper invert-able so that we
# never have to manage the queues
self.q_in = Queue()
self.q_out = Queue()
@@ -751,7 +757,7 @@ class SampleVNF(GenericVNF):
if not self._vnf_process.is_alive():
raise RuntimeError("%s VNF process died." % self.APP_NAME)
- # TODO(esm): move to QueueFileWrapper
+ # NOTE(esm): move to QueueFileWrapper
while self.q_out.qsize() > 0:
buf.append(self.q_out.get())
message = ''.join(buf)
@@ -821,12 +827,12 @@ class SampleVNF(GenericVNF):
self._vnf_process.terminate()
# no terminate children here because we share processes with tg
- def get_stats(self, *args, **kwargs):
- """
- Method for checking the statistics
+ def get_stats(self, *args, **kwargs): # pylint: disable=unused-argument
+ """Method for checking the statistics
+
+ This method could be overridden in children classes.
- :return:
- VNF statistics
+ :return: VNF statistics
"""
cmd = 'p {0} stats'.format(self.APP_WORD)
out = self.vnf_execute(cmd)
@@ -849,6 +855,11 @@ class SampleVNF(GenericVNF):
LOG.debug("%s collect KPIs %s", self.APP_NAME, result)
return result
+ def scale(self, flavor=""):
+ """The SampleVNF base class doesn't provide the 'scale' feature"""
+ raise y_exceptions.FunctionNotImplemented(
+ function_name='scale', class_name='SampleVNFTrafficGen')
+
class SampleVNFTrafficGen(GenericTrafficGen):
""" Class providing file-like API for generic traffic generator """
@@ -964,3 +975,8 @@ class SampleVNFTrafficGen(GenericTrafficGen):
self._tg_process.join(PROCESS_JOIN_TIMEOUT)
self._tg_process.terminate()
# no terminate children here because we share processes with vnf
+
+ def scale(self, flavor=""):
+ """A traffic generator VFN doesn't provide the 'scale' feature"""
+ raise y_exceptions.FunctionNotImplemented(
+ function_name='scale', class_name='SampleVNFTrafficGen')
diff --git a/yardstick/network_services/vnf_generic/vnf/tg_ping.py b/yardstick/network_services/vnf_generic/vnf/tg_ping.py
index 5238a5f02..a989543f5 100644
--- a/yardstick/network_services/vnf_generic/vnf/tg_ping.py
+++ b/yardstick/network_services/vnf_generic/vnf/tg_ping.py
@@ -113,10 +113,6 @@ class PingTrafficGen(SampleVNFTrafficGen):
resource_helper_type)
self._result = {}
- def scale(self, flavor=""):
- """ scale vnf-based on flavor input """
- pass
-
def _check_status(self):
return self._tg_process.is_alive()
diff --git a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py
index a8b19cfba..630c8b9c0 100644
--- a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py
+++ b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py
@@ -174,7 +174,7 @@ class IxiaResourceHelper(ClientResourceHelper):
break
self.client.ix_stop_traffic()
- except Exception:
+ except Exception: # pylint: disable=broad-except
LOG.exception("Run Traffic terminated")
self._terminated.value = 1
@@ -201,9 +201,6 @@ class IxiaTrafficGen(SampleVNFTrafficGen):
def _check_status(self):
pass
- def scale(self, flavor=""):
- pass
-
def terminate(self):
self.resource_helper.stop_collect()
super(IxiaTrafficGen, self).terminate()
diff --git a/yardstick/network_services/vnf_generic/vnf/tg_trex.py b/yardstick/network_services/vnf_generic/vnf/tg_trex.py
index 4250cb7a6..0084a124c 100644
--- a/yardstick/network_services/vnf_generic/vnf/tg_trex.py
+++ b/yardstick/network_services/vnf_generic/vnf/tg_trex.py
@@ -126,6 +126,11 @@ class TrexResourceHelper(ClientResourceHelper):
self.ssh_helper.execute(self.MAKE_INSTALL.format(ko_src))
def start(self, ports=None, *args, **kwargs):
+ # pylint: disable=keyword-arg-before-vararg
+ # NOTE(ralonsoh): defining keyworded arguments before variable
+ # positional arguments is a bug. This function definition doesn't work
+ # in Python 2, although it works in Python 3. Reference:
+ # https://www.python.org/dev/peps/pep-3102/
cmd = "sudo fuser -n tcp {0.SYNC_PORT} {0.ASYNC_PORT} -k > /dev/null 2>&1"
self.ssh_helper.execute(cmd.format(self))
@@ -186,9 +191,6 @@ class TrexTrafficGen(SampleVNFTrafficGen):
super(TrexTrafficGen, self)._start_server()
self.resource_helper.start()
- def scale(self, flavor=""):
- pass
-
def terminate(self):
self.resource_helper.terminate()