vpe: convert DPKD_PORT to LINK ID
[yardstick.git] / yardstick / network_services / vnf_generic / vnf / sample_vnf.py
index ff81b5f..fbaaa0c 100644 (file)
 # limitations under the License.
 """ Base class implementation for generic vnf implementation """
 
-from __future__ import absolute_import
-
-import posixpath
-import time
+from collections import Mapping
 import logging
+from multiprocessing import Queue, Value, Process
 import os
+import posixpath
 import re
-import subprocess
-from collections import Mapping
-from multiprocessing import Queue, Value, Process
-
 from six.moves import cStringIO
+import subprocess
+import time
 
+from trex_stl_lib.trex_stl_client import LoggerApi
+from trex_stl_lib.trex_stl_client import STLClient
+from trex_stl_lib.trex_stl_exceptions import STLError
 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.dpdkbindnic_helper import DpdkBindHelper
 from yardstick.network_services.helpers.samplevnf_helper import PortPairs
 from yardstick.network_services.helpers.samplevnf_helper import MultiPortConfig
-from yardstick.network_services.helpers.dpdkbindnic_helper import DpdkBindHelper
 from yardstick.network_services.nfvi.resource import ResourceProfile
+from yardstick.network_services.utils import get_nsb_option
 from yardstick.network_services.vnf_generic.vnf.base import GenericVNF
-from yardstick.network_services.vnf_generic.vnf.base import QueueFileWrapper
 from yardstick.network_services.vnf_generic.vnf.base import GenericTrafficGen
-from yardstick.network_services.utils import get_nsb_option
-
-from trex_stl_lib.trex_stl_client import STLClient
-from trex_stl_lib.trex_stl_client import LoggerApi
-from trex_stl_lib.trex_stl_exceptions import STLError
-
+from yardstick.network_services.vnf_generic.vnf.base import QueueFileWrapper
 from yardstick.ssh import AutoConnectSSH
 
+
 DPDK_VERSION = "dpdk-16.07"
 
 LOG = logging.getLogger(__name__)
@@ -308,7 +305,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)
 
@@ -345,7 +342,7 @@ class ResourceHelper(object):
 
     def _collect_resource_kpi(self):
         result = {}
-        status = self.resource.check_if_sa_running("collectd")[0]
+        status = self.resource.check_if_system_agent_running("collectd")[0]
         if status == 0:
             result = self.resource.amqp_collect_nfvi_kpi()
 
@@ -472,6 +469,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 +482,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 +672,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 +753,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 +823,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
 
-        :return:
-           VNF statistics
+        This method could be overridden in children classes.
+
+        :return: VNF statistics
         """
         cmd = 'p {0} stats'.format(self.APP_WORD)
         out = self.vnf_execute(cmd)
@@ -849,6 +851,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 """
@@ -895,10 +902,6 @@ class SampleVNFTrafficGen(GenericTrafficGen):
         self._tg_process = Process(name=name, target=self._start_server)
         self._tg_process.start()
 
-    def wait_for_instantiate(self):
-        # overridden by subclasses
-        return self._wait_for_process()
-
     def _check_status(self):
         raise NotImplementedError
 
@@ -942,24 +945,6 @@ class SampleVNFTrafficGen(GenericTrafficGen):
 
         return self._traffic_process.is_alive()
 
-    def listen_traffic(self, traffic_profile):
-        """ Listen to traffic with the given parameters.
-        Method is non-blocking, returns immediately when traffic process
-        is running. Optional.
-
-        :param traffic_profile:
-        :return: True/False
-        """
-        pass
-
-    def verify_traffic(self, traffic_profile):
-        """ Verify captured traffic after it has ended. Optional.
-
-        :param traffic_profile:
-        :return: dict
-        """
-        pass
-
     def collect_kpi(self):
         # check if the tg processes have exited
         for proc in (self._tg_process, self._traffic_process):
@@ -986,3 +971,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')