Merge "Testcase to find storage bottlenecks using Yardstick for Multistack"
[yardstick.git] / yardstick / network_services / vnf_generic / vnf / base.py
index 7781195..a776b09 100644 (file)
 # limitations under the License.
 """ Base class implementation for generic vnf implementation """
 
-from __future__ import absolute_import
+import abc
+
 import logging
+import six
 
 from yardstick.network_services.helpers.samplevnf_helper import PortPairs
 
+
 LOG = logging.getLogger(__name__)
 
 
@@ -135,78 +138,65 @@ 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)
 class GenericTrafficGen(GenericVNF):
     """ Class providing file-like API for generic traffic generator """
 
@@ -215,18 +205,29 @@ class GenericTrafficGen(GenericVNF):
         self.runs_traffic = True
         self.traffic_finished = False
 
+    @abc.abstractmethod
     def run_traffic(self, traffic_profile):
-        """ Generate traffic on the wire according to the given params.
-        Method is non-blocking, returns immediately when traffic process
+        """Generate traffic on the wire according to the given params.
+
+        This method is non-blocking, returns immediately when traffic process
         is running. Mandatory.
 
         :param traffic_profile:
         :return: True/False
         """
-        raise NotImplementedError()
+
+    @abc.abstractmethod
+    def terminate(self):
+        """After this method finishes, all traffic processes should stop.
+
+        Mandatory.
+
+        :return: True/False
+        """
 
     def listen_traffic(self, traffic_profile):
-        """ Listen to traffic with the given parameters.
+        """Listen to traffic with the given parameters.
+
         Method is non-blocking, returns immediately when traffic process
         is running. Optional.
 
@@ -236,16 +237,20 @@ class GenericTrafficGen(GenericVNF):
         pass
 
     def verify_traffic(self, traffic_profile):
-        """ Verify captured traffic after it has ended. Optional.
+        """Verify captured traffic after it has ended.
+
+        Optional.
 
         :param traffic_profile:
         :return: dict
         """
         pass
 
-    def terminate(self):
-        """ After this method finishes, all traffic processes should stop. Mandatory.
+    def wait_for_instantiate(self):
+        """Wait for an instance to load.
+
+        Optional.
 
         :return: True/False
         """
-        raise NotImplementedError()
+        pass