Merge "Adding scale up feature to prox MPLS Tagging OvS-DPDK & SRIOV"
[yardstick.git] / yardstick / tests / unit / network_services / vnf_generic / vnf / test_sample_vnf.py
index 603f05b..a1802aa 100644 (file)
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-#
 
 from copy import deepcopy
 
 import unittest
 import mock
-import six
 
-from yardstick.tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh
-from yardstick.tests import STL_MOCKS
-from yardstick.benchmark.contexts.base import Context
+import paramiko
+
 from yardstick.common import exceptions as y_exceptions
 from yardstick.common import utils
 from yardstick.network_services.nfvi.resource import ResourceProfile
 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
-
-
-class MockError(BaseException):
+from yardstick.network_services.vnf_generic.vnf import sample_vnf
+from yardstick.network_services.vnf_generic.vnf import vnf_ssh_helper
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFDeployHelper
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import ResourceHelper
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import Rfc2544ResourceHelper
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import SetupEnvHelper
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper
+from yardstick.tests.unit.network_services.vnf_generic.vnf import test_base
+from yardstick.benchmark.contexts import base as ctx_base
+from yardstick import ssh
+
+
+class MockError(Exception):
     pass
 
 
-STLClient = mock.MagicMock()
-stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
-stl_patch.start()
-
-if stl_patch:
-    from yardstick.network_services.vnf_generic.vnf import sample_vnf
-    from yardstick.network_services.vnf_generic.vnf.vnf_ssh_helper import VnfSshHelper
-    from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFDeployHelper
-    from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
-    from yardstick.network_services.vnf_generic.vnf.sample_vnf import ResourceHelper
-    from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper
-    from yardstick.network_services.vnf_generic.vnf.sample_vnf import Rfc2544ResourceHelper
-    from yardstick.network_services.vnf_generic.vnf.sample_vnf import SetupEnvHelper
-    from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF
-    from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen
-    from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper
-
-
 class TestVnfSshHelper(unittest.TestCase):
 
     VNFD_0 = {
@@ -92,10 +85,11 @@ class TestVnfSshHelper(unittest.TestCase):
                         'virtual-interface': {
                             'dst_mac': '00:00:00:00:00:03',
                             'vpci': '0000:05:00.0',
+                            'dpdk_port_num': 0,
+                            'driver': 'i40e',
                             'local_ip': '152.16.100.19',
                             'type': 'PCI-PASSTHROUGH',
                             'netmask': '255.255.255.0',
-                            'dpdk_port_num': 0,
                             'bandwidth': '10 Gbps',
                             'dst_ip': '152.16.100.20',
                             'local_mac': '00:00:00:00:00:01',
@@ -109,10 +103,11 @@ class TestVnfSshHelper(unittest.TestCase):
                         'virtual-interface': {
                             'dst_mac': '00:00:00:00:00:04',
                             'vpci': '0000:05:00.1',
+                            'dpdk_port_num': 1,
+                            'driver': 'ixgbe',
                             'local_ip': '152.16.40.19',
                             'type': 'PCI-PASSTHROUGH',
                             'netmask': '255.255.255.0',
-                            'dpdk_port_num': 1,
                             'bandwidth': '10 Gbps',
                             'dst_ip': '152.16.40.20',
                             'local_mac': '00:00:00:00:00:02',
@@ -161,90 +156,88 @@ class TestVnfSshHelper(unittest.TestCase):
         }
     }
 
+    def setUp(self):
+        self.ssh_helper = vnf_ssh_helper.VnfSshHelper(
+            self.VNFD_0['mgmt-interface'], 'my/bin/path')
+        self.ssh_helper._run = mock.Mock()
+
     def assertAll(self, iterable, message=None):
         self.assertTrue(all(iterable), message)
 
     def test_get_class(self):
-        self.assertIs(VnfSshHelper.get_class(), VnfSshHelper)
+        self.assertIs(vnf_ssh_helper.VnfSshHelper.get_class(),
+                      vnf_ssh_helper.VnfSshHelper)
 
-    @mock.patch('yardstick.ssh.paramiko')
+    @mock.patch.object(ssh, 'paramiko')
     def test_copy(self, _):
-        ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
-        ssh_helper._run = mock.Mock()
-
-        ssh_helper.execute('ls')
-        self.assertTrue(ssh_helper.is_connected)
-        result = ssh_helper.copy()
-        self.assertIsInstance(result, VnfSshHelper)
+        self.ssh_helper.execute('ls')
+        self.assertTrue(self.ssh_helper.is_connected)
+        result = self.ssh_helper.copy()
+        self.assertIsInstance(result, vnf_ssh_helper.VnfSshHelper)
         self.assertFalse(result.is_connected)
-        self.assertEqual(result.bin_path, ssh_helper.bin_path)
-        self.assertEqual(result.host, ssh_helper.host)
-        self.assertEqual(result.port, ssh_helper.port)
-        self.assertEqual(result.user, ssh_helper.user)
-        self.assertEqual(result.password, ssh_helper.password)
-        self.assertEqual(result.key_filename, ssh_helper.key_filename)
-
-    @mock.patch('yardstick.ssh.paramiko')
+        self.assertEqual(result.bin_path, self.ssh_helper.bin_path)
+        self.assertEqual(result.host, self.ssh_helper.host)
+        self.assertEqual(result.port, self.ssh_helper.port)
+        self.assertEqual(result.user, self.ssh_helper.user)
+        self.assertEqual(result.password, self.ssh_helper.password)
+        self.assertEqual(result.key_filename, self.ssh_helper.key_filename)
+
+    @mock.patch.object(paramiko, 'SSHClient')
     def test_upload_config_file(self, mock_paramiko):
-        ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
-        ssh_helper._run = mock.MagicMock()
+        self.assertFalse(self.ssh_helper.is_connected)
+        cfg_file = self.ssh_helper.upload_config_file('/my/prefix', 'my content')
+        self.assertTrue(self.ssh_helper.is_connected)
+        mock_paramiko.assert_called_once()
+        self.assertEqual(cfg_file, '/my/prefix')
 
-        self.assertFalse(ssh_helper.is_connected)
-        cfg_file = ssh_helper.upload_config_file('my/prefix', 'my content')
-        self.assertTrue(ssh_helper.is_connected)
-        mock_paramiko.SSHClient.assert_called_once()
+    @mock.patch.object(paramiko, 'SSHClient')
+    def test_upload_config_file_path_does_not_exist(self, mock_paramiko):
+        self.assertFalse(self.ssh_helper.is_connected)
+        cfg_file = self.ssh_helper.upload_config_file('my/prefix', 'my content')
+        self.assertTrue(self.ssh_helper.is_connected)
+        mock_paramiko.assert_called_once()
         self.assertTrue(cfg_file.startswith('/tmp'))
 
-        cfg_file = ssh_helper.upload_config_file('/my/prefix', 'my content')
-        self.assertTrue(ssh_helper.is_connected)
-        mock_paramiko.SSHClient.assert_called_once()
-        self.assertEqual(cfg_file, '/my/prefix')
-
     def test_join_bin_path(self):
-        ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
-
         expected_start = 'my'
         expected_middle_list = ['bin']
         expected_end = 'path'
-        result = ssh_helper.join_bin_path()
+        result = self.ssh_helper.join_bin_path()
         self.assertTrue(result.startswith(expected_start))
         self.assertAll(middle in result for middle in expected_middle_list)
         self.assertTrue(result.endswith(expected_end))
 
         expected_middle_list.append(expected_end)
         expected_end = 'some_file.sh'
-        result = ssh_helper.join_bin_path('some_file.sh')
+        result = self.ssh_helper.join_bin_path('some_file.sh')
         self.assertTrue(result.startswith(expected_start))
         self.assertAll(middle in result for middle in expected_middle_list)
         self.assertTrue(result.endswith(expected_end))
 
         expected_middle_list.append('some_dir')
         expected_end = 'some_file.sh'
-        result = ssh_helper.join_bin_path('some_dir', 'some_file.sh')
+        result = self.ssh_helper.join_bin_path('some_dir', 'some_file.sh')
         self.assertTrue(result.startswith(expected_start))
         self.assertAll(middle in result for middle in expected_middle_list)
         self.assertTrue(result.endswith(expected_end))
 
-    @mock.patch('yardstick.ssh.paramiko')
-    @mock.patch('yardstick.ssh.provision_tool')
+    @mock.patch.object(paramiko, 'SSHClient')
+    @mock.patch.object(ssh, 'provision_tool')
     def test_provision_tool(self, mock_provision_tool, mock_paramiko):
-        ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
-        ssh_helper._run = mock.MagicMock()
-
-        self.assertFalse(ssh_helper.is_connected)
-        ssh_helper.provision_tool()
-        self.assertTrue(ssh_helper.is_connected)
-        mock_paramiko.SSHClient.assert_called_once()
+        self.assertFalse(self.ssh_helper.is_connected)
+        self.ssh_helper.provision_tool()
+        self.assertTrue(self.ssh_helper.is_connected)
+        mock_paramiko.assert_called_once()
         mock_provision_tool.assert_called_once()
 
-        ssh_helper.provision_tool(tool_file='my_tool.sh')
-        self.assertTrue(ssh_helper.is_connected)
-        mock_paramiko.SSHClient.assert_called_once()
+        self.ssh_helper.provision_tool(tool_file='my_tool.sh')
+        self.assertTrue(self.ssh_helper.is_connected)
+        mock_paramiko.assert_called_once()
         self.assertEqual(mock_provision_tool.call_count, 2)
 
-        ssh_helper.provision_tool('tool_path', 'my_tool.sh')
-        self.assertTrue(ssh_helper.is_connected)
-        mock_paramiko.SSHClient.assert_called_once()
+        self.ssh_helper.provision_tool('tool_path', 'my_tool.sh')
+        self.assertTrue(self.ssh_helper.is_connected)
+        mock_paramiko.assert_called_once()
         self.assertEqual(mock_provision_tool.call_count, 3)
 
 
@@ -530,38 +523,6 @@ class TestDpdkVnfSetupEnvHelper(unittest.TestCase):
         result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options)
         self.assertEqual(result, expected)
 
-    @mock.patch.object(six, 'BytesIO', return_value=six.BytesIO(b'100\n'))
-    @mock.patch.object(utils, 'read_meminfo',
-                       return_value={'Hugepagesize': '2048'})
-    def test__setup_hugepages_no_hugepages_defined(self, mock_meminfo, *args):
-        ssh_helper = mock.Mock()
-        scenario_helper = mock.Mock()
-        scenario_helper.all_options = {}
-        dpdk_setup_helper = DpdkVnfSetupEnvHelper(
-            mock.ANY, ssh_helper, scenario_helper)
-        with mock.patch.object(sample_vnf.LOG, 'info') as mock_info:
-            dpdk_setup_helper._setup_hugepages()
-            mock_info.assert_called_once_with(
-                'Hugepages size (kB): %s, number claimed: %s, number set: '
-                '%s', 2048, 8192, 100)
-        mock_meminfo.assert_called_once_with(ssh_helper)
-
-    @mock.patch.object(six, 'BytesIO', return_value=six.BytesIO(b'100\n'))
-    @mock.patch.object(utils, 'read_meminfo',
-                       return_value={'Hugepagesize': '1048576'})
-    def test__setup_hugepages_8gb_hugepages_defined(self, mock_meminfo, *args):
-        ssh_helper = mock.Mock()
-        scenario_helper = mock.Mock()
-        scenario_helper.all_options = {'hugepages_gb': 8}
-        dpdk_setup_helper = DpdkVnfSetupEnvHelper(
-            mock.ANY, ssh_helper, scenario_helper)
-        with mock.patch.object(sample_vnf.LOG, 'info') as mock_info:
-            dpdk_setup_helper._setup_hugepages()
-            mock_info.assert_called_once_with(
-                'Hugepages size (kB): %s, number claimed: %s, number set: '
-                '%s', 1048576, 8, 100)
-        mock_meminfo.assert_called_once_with(ssh_helper)
-
     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.open')
     @mock.patch.object(utils, 'find_relative_file')
     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig')
@@ -572,6 +533,7 @@ class TestDpdkVnfSetupEnvHelper(unittest.TestCase):
         ssh_helper = mock.Mock()
         scenario_helper = mock.Mock()
         scenario_helper.vnf_cfg = {}
+        scenario_helper.options = {}
         scenario_helper.all_options = {}
         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
 
@@ -583,6 +545,7 @@ class TestDpdkVnfSetupEnvHelper(unittest.TestCase):
         mock_multi_port_config.generate_config.assert_called()
         mock_multi_port_config.generate_script.assert_called()
 
+        scenario_helper.options = {'rules': 'fake_file'}
         scenario_helper.vnf_cfg = {'file': 'fake_file'}
         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
         mock_open_rf.side_effect = mock.mock_open(read_data='fake_data')
@@ -590,7 +553,7 @@ class TestDpdkVnfSetupEnvHelper(unittest.TestCase):
 
         result = dpdk_setup_helper.build_config()
 
-        mock_open_rf.assert_called_once()
+        mock_open_rf.assert_called()
         self.assertEqual(result, expected)
         self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2)
         mock_find.assert_called()
@@ -645,15 +608,17 @@ class TestDpdkVnfSetupEnvHelper(unittest.TestCase):
                 dpdk_vnf_setup_env_helper.setup_vnf_environment(),
                 ResourceProfile)
 
-    def test__setup_dpdk(self):
+    @mock.patch.object(utils, 'setup_hugepages')
+    def test__setup_dpdk(self, mock_setup_hugepages):
         ssh_helper = mock.Mock()
         ssh_helper.execute = mock.Mock()
         ssh_helper.execute.return_value = (0, 0, 0)
-        dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY)
-        with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \
-                mock_setup_hp:
-            dpdk_setup_helper._setup_dpdk()
-        mock_setup_hp.assert_called_once()
+        scenario_helper = mock.Mock()
+        scenario_helper.all_options = {'hugepages_gb': 8}
+        dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper,
+                                                  scenario_helper)
+        dpdk_setup_helper._setup_dpdk()
+        mock_setup_hugepages.assert_called_once_with(ssh_helper, 8*1024*1024)
         ssh_helper.execute.assert_has_calls([
             mock.call('sudo modprobe uio && sudo modprobe igb_uio'),
             mock.call('lsmod | grep -i igb_uio')
@@ -1001,187 +966,52 @@ class TestClientResourceHelper(unittest.TestCase):
     }
 
     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
-    @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
-                new_callable=lambda: MockError)
-    def test_get_stats_not_connected(self, mock_state_error, *args):
+    @mock.patch.object(sample_vnf, 'STLError', new_callable=lambda: MockError)
+    def test_get_stats_not_connected(self, mock_stl_error, *args):
         vnfd_helper = VnfdHelper(self.VNFD_0)
         ssh_helper = mock.Mock()
         scenario_helper = mock.Mock()
-        dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
+        dpdk_setup_helper = DpdkVnfSetupEnvHelper(
+            vnfd_helper, ssh_helper, scenario_helper)
         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
-        client_resource_helper.client = mock.MagicMock()
-        client_resource_helper.client.get_stats.side_effect = mock_state_error
+        client_resource_helper.client = mock.Mock()
+        client_resource_helper.client.get_stats.side_effect = mock_stl_error
 
         self.assertEqual(client_resource_helper.get_stats(), {})
         client_resource_helper.client.get_stats.assert_called_once()
 
-    def test_generate_samples(self):
-        vnfd_helper = VnfdHelper(self.VNFD_0)
-        ssh_helper = mock.Mock()
-        scenario_helper = mock.Mock()
-        dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
-        client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
-        client_resource_helper.client = mock.MagicMock()
-        client_resource_helper.client.get_stats.return_value = {
-            0: {
-                'rx_pps': 5.5,
-                'tx_pps': 4.9,
-                'rx_bps': 234.78,
-                'tx_bps': 243.11,
-                'ipackets': 34251,
-                'opackets': 52342,
-            },
-            1: {
-                'tx_pps': 5.9,
-                'rx_bps': 434.78,
-                'opackets': 48791,
-            },
-        }
-
-        expected = {
-            'xe0': {
-                "rx_throughput_fps": 5.5,
-                "tx_throughput_fps": 4.9,
-                "rx_throughput_mbps": 234.78,
-                "tx_throughput_mbps": 243.11,
-                "in_packets": 34251,
-                "out_packets": 52342,
-            },
-            'xe1': {
-                "rx_throughput_fps": 0.0,
-                "tx_throughput_fps": 5.9,
-                "rx_throughput_mbps": 434.78,
-                "tx_throughput_mbps": 0.0,
-                "in_packets": 0,
-                "out_packets": 48791,
-            },
-        }
-        ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
-        result = client_resource_helper.generate_samples(ports)
-        self.assertDictEqual(result, expected)
-
-    def test_generate_samples_with_key(self):
-        vnfd_helper = VnfdHelper(self.VNFD_0)
-        ssh_helper = mock.Mock()
-        scenario_helper = mock.Mock()
-        dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
-        client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
-        client_resource_helper.client = mock.MagicMock()
-        client_resource_helper.client.get_stats.return_value = {
-            'key_name': 'key_value',
-            0: {
-                'rx_pps': 5.5,
-                'tx_pps': 4.9,
-                'rx_bps': 234.78,
-                'tx_bps': 243.11,
-                'ipackets': 34251,
-                'opackets': 52342,
-            },
-            1: {
-                'tx_pps': 5.9,
-                'rx_bps': 434.78,
-                'opackets': 48791,
-            },
-        }
-
-        expected = {
-            'xe0': {
-                'key_name': 'key_value',
-                "rx_throughput_fps": 5.5,
-                "tx_throughput_fps": 4.9,
-                "rx_throughput_mbps": 234.78,
-                "tx_throughput_mbps": 243.11,
-                "in_packets": 34251,
-                "out_packets": 52342,
-            },
-            'xe1': {
-                'key_name': 'key_value',
-                "rx_throughput_fps": 0.0,
-                "tx_throughput_fps": 5.9,
-                "rx_throughput_mbps": 434.78,
-                "tx_throughput_mbps": 0.0,
-                "in_packets": 0,
-                "out_packets": 48791,
-            },
-        }
-        ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
-        result = client_resource_helper.generate_samples(ports, 'key_name')
-        self.assertDictEqual(result, expected)
-
-    def test_generate_samples_with_key_and_default(self):
-        vnfd_helper = VnfdHelper(self.VNFD_0)
-        ssh_helper = mock.Mock()
-        scenario_helper = mock.Mock()
-        dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
-        client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
-        client_resource_helper.client = mock.MagicMock()
-        client_resource_helper.client.get_stats.return_value = {
-            0: {
-                'rx_pps': 5.5,
-                'tx_pps': 4.9,
-                'rx_bps': 234.78,
-                'tx_bps': 243.11,
-                'ipackets': 34251,
-                'opackets': 52342,
-            },
-            1: {
-                'tx_pps': 5.9,
-                'rx_bps': 434.78,
-                'opackets': 48791,
-            },
-        }
-
-        expected = {
-            'xe0': {
-                'key_name': 'default',
-                "rx_throughput_fps": 5.5,
-                "tx_throughput_fps": 4.9,
-                "rx_throughput_mbps": 234.78,
-                "tx_throughput_mbps": 243.11,
-                "in_packets": 34251,
-                "out_packets": 52342,
-            },
-            'xe1': {
-                'key_name': 'default',
-                "rx_throughput_fps": 0.0,
-                "tx_throughput_fps": 5.9,
-                "rx_throughput_mbps": 434.78,
-                "tx_throughput_mbps": 0.0,
-                "in_packets": 0,
-                "out_packets": 48791,
-            },
-        }
-        ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports)
-        result = client_resource_helper.generate_samples(ports, 'key_name', 'default')
-        self.assertDictEqual(result, expected)
-
     def test_clear_stats(self):
         vnfd_helper = VnfdHelper(self.VNFD_0)
         ssh_helper = mock.Mock()
         scenario_helper = mock.Mock()
-        dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
+        dpdk_setup_helper = DpdkVnfSetupEnvHelper(
+            vnfd_helper, ssh_helper, scenario_helper)
         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
         client_resource_helper.client = mock.Mock()
 
         self.assertIsNone(client_resource_helper.clear_stats())
-        client_resource_helper.client.clear_stats.assert_called_once()
+        self.assertEqual(
+            client_resource_helper.client.clear_stats.call_count, 1)
 
     def test_clear_stats_of_ports(self):
         vnfd_helper = VnfdHelper(self.VNFD_0)
         ssh_helper = mock.Mock()
         scenario_helper = mock.Mock()
-        dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
+        dpdk_setup_helper = DpdkVnfSetupEnvHelper(
+            vnfd_helper, ssh_helper, scenario_helper)
         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
         client_resource_helper.client = mock.Mock()
 
         self.assertIsNone(client_resource_helper.clear_stats([3, 4]))
-        client_resource_helper.client.clear_stats.assert_called_once()
+        self.assertEqual(
+            client_resource_helper.client.clear_stats.call_count, 1)
 
     def test_start(self):
         vnfd_helper = VnfdHelper(self.VNFD_0)
         ssh_helper = mock.Mock()
         scenario_helper = mock.Mock()
-        dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
+        dpdk_setup_helper = DpdkVnfSetupEnvHelper(
+            vnfd_helper, ssh_helper, scenario_helper)
         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
         client_resource_helper.client = mock.Mock()
 
@@ -1192,7 +1022,8 @@ class TestClientResourceHelper(unittest.TestCase):
         vnfd_helper = VnfdHelper(self.VNFD_0)
         ssh_helper = mock.Mock()
         scenario_helper = mock.Mock()
-        dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
+        dpdk_setup_helper = DpdkVnfSetupEnvHelper(
+            vnfd_helper, ssh_helper, scenario_helper)
         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
         client_resource_helper.client = mock.Mock()
 
@@ -1219,20 +1050,70 @@ class TestClientResourceHelper(unittest.TestCase):
         self.assertDictEqual(result, expected)
 
     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time')
-    @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG')
-    @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError',
-                new_callable=lambda: MockError)
-    def test__connect_with_failures(self, mock_error, *args):
+    @mock.patch.object(sample_vnf, 'STLError')
+    def test__connect_with_failures(self, mock_stl_error, *args):
         vnfd_helper = VnfdHelper(self.VNFD_0)
         ssh_helper = mock.Mock()
         scenario_helper = mock.Mock()
         dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
         client_resource_helper = ClientResourceHelper(dpdk_setup_helper)
         client = mock.MagicMock()
-        client.connect.side_effect = mock_error
+        client.connect.side_effect = mock_stl_error(msg='msg')
 
         self.assertIs(client_resource_helper._connect(client), client)
 
+    @mock.patch.object(ClientResourceHelper, '_build_ports')
+    @mock.patch.object(ClientResourceHelper, '_run_traffic_once',
+                       return_value=(True, mock.ANY))
+    def test_run_traffic(self, mock_run_traffic_once, mock_build_ports):
+        client_resource_helper = ClientResourceHelper(mock.Mock())
+        client = mock.Mock()
+        traffic_profile = mock.Mock()
+        mq_producer = mock.Mock()
+        with mock.patch.object(client_resource_helper, '_connect') \
+                as mock_connect, \
+                mock.patch.object(client_resource_helper, '_terminated') \
+                as mock_terminated:
+            mock_connect.return_value = client
+            type(mock_terminated).value = mock.PropertyMock(
+                side_effect=[0, 1, 1, lambda x: x])
+            client_resource_helper.run_traffic(traffic_profile, mq_producer)
+
+        mock_build_ports.assert_called_once()
+        traffic_profile.register_generator.assert_called_once()
+        mq_producer.tg_method_started.assert_called_once()
+        mq_producer.tg_method_finished.assert_called_once()
+        mq_producer.tg_method_iteration.assert_called_once_with(1)
+        mock_run_traffic_once.assert_called_once_with(traffic_profile)
+
+    @mock.patch.object(ClientResourceHelper, '_build_ports')
+    @mock.patch.object(ClientResourceHelper, '_run_traffic_once',
+                       side_effect=Exception)
+    def test_run_traffic_exception(self, mock_run_traffic_once,
+                                   mock_build_ports):
+        client_resource_helper = ClientResourceHelper(mock.Mock())
+        client = mock.Mock()
+        traffic_profile = mock.Mock()
+        mq_producer = mock.Mock()
+        with mock.patch.object(client_resource_helper, '_connect') \
+                as mock_connect, \
+                mock.patch.object(client_resource_helper, '_terminated') \
+                as mock_terminated:
+            mock_connect.return_value = client
+            type(mock_terminated).value = mock.PropertyMock(return_value=0)
+            mq_producer.reset_mock()
+            # NOTE(ralonsoh): "trex_stl_exceptions.STLError" is mocked
+            with self.assertRaises(Exception):
+                client_resource_helper.run_traffic(traffic_profile,
+                                                   mq_producer)
+
+        mock_build_ports.assert_called_once()
+        traffic_profile.register_generator.assert_called_once()
+        mock_run_traffic_once.assert_called_once_with(traffic_profile)
+        mq_producer.tg_method_started.assert_called_once()
+        mq_producer.tg_method_finished.assert_not_called()
+        mq_producer.tg_method_iteration.assert_not_called()
+
 
 class TestRfc2544ResourceHelper(unittest.TestCase):
 
@@ -1297,6 +1178,7 @@ class TestRfc2544ResourceHelper(unittest.TestCase):
         self.assertIsNone(rfc2544_resource_helper._tolerance_high)
         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
         self.assertEqual(rfc2544_resource_helper._tolerance_high, 0.15)
+        self.assertEqual(rfc2544_resource_helper._tolerance_precision, 2)
         scenario_helper.scenario_cfg = {}  # ensure that resource_helper caches
         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15)
 
@@ -1331,6 +1213,7 @@ class TestRfc2544ResourceHelper(unittest.TestCase):
         rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper)
 
         self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.2)
+        self.assertEqual(rfc2544_resource_helper._tolerance_precision, 1)
 
     def test_property_tolerance_low_not_range(self):
         scenario_helper = ScenarioHelper('name1')
@@ -1635,7 +1518,7 @@ class TestSampleVnf(unittest.TestCase):
     }
 
     def test___init__(self):
-        sample_vnf = SampleVNF('vnf1', self.VNFD_0)
+        sample_vnf = SampleVNF('vnf1', self.VNFD_0, 'task_id')
 
         self.assertEqual(sample_vnf.name, 'vnf1')
         self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
@@ -1653,7 +1536,8 @@ class TestSampleVnf(unittest.TestCase):
         class MyResourceHelper(ResourceHelper):
             pass
 
-        sample_vnf = SampleVNF('vnf1', self.VNFD_0, MySetupEnvHelper, MyResourceHelper)
+        sample_vnf = SampleVNF('vnf1', self.VNFD_0, 'task_id',
+                               MySetupEnvHelper, MyResourceHelper)
 
         self.assertEqual(sample_vnf.name, 'vnf1')
         self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0)
@@ -1667,7 +1551,7 @@ class TestSampleVnf(unittest.TestCase):
     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process')
     def test__start_vnf(self, *args):
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf1', vnfd)
+        sample_vnf = SampleVNF('vnf1', vnfd, 'task_id')
         sample_vnf._run = mock.Mock()
 
         self.assertIsNone(sample_vnf.queue_wrapper)
@@ -1676,33 +1560,20 @@ class TestSampleVnf(unittest.TestCase):
         self.assertIsNotNone(sample_vnf.queue_wrapper)
         self.assertIsNotNone(sample_vnf._vnf_process)
 
+    @mock.patch.object(ctx_base.Context, 'get_context_from_server', return_value='fake_context')
     @mock.patch("yardstick.ssh.SSH")
-    def test_instantiate(self, ssh):
-        mock_ssh(ssh)
-
+    def test_instantiate(self, ssh, *args):
+        test_base.mock_ssh(ssh)
         nodes = {
             'vnf1': 'name1',
             'vnf2': 'name2',
         }
 
-        context1 = mock.Mock()
-        context1._get_server.return_value = None
-        context2 = mock.Mock()
-        context2._get_server.return_value = context2
-
-        try:
-            Context.list.clear()
-        except AttributeError:
-            # clear() but works in Py2.7
-            Context.list[:] = []
-
-        Context.list.extend([
-            context1,
-            context2,
-        ])
-
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf1', vnfd)
+        sample_vnf = SampleVNF('vnf1', vnfd, 'task_id')
+        sample_vnf.scenario_helper.scenario_cfg = {
+            'nodes': {sample_vnf.name: 'mock'}
+        }
         sample_vnf.APP_NAME = 'sample1'
         sample_vnf._start_server = mock.Mock(return_value=0)
         sample_vnf._vnf_process = mock.MagicMock()
@@ -1715,7 +1586,6 @@ class TestSampleVnf(unittest.TestCase):
         }
 
         self.assertIsNone(sample_vnf.instantiate(scenario_cfg, {}))
-        self.assertEqual(sample_vnf.nfvi_context, context2)
 
     def test__update_collectd_options(self):
         scenario_cfg = {'options':
@@ -1744,7 +1614,7 @@ class TestSampleVnf(unittest.TestCase):
                          'plugin1': {'param': 1}}}
 
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf__0', vnfd)
+        sample_vnf = SampleVNF('vnf__0', vnfd, 'task_id')
         sample_vnf._update_collectd_options(scenario_cfg, context_cfg)
         self.assertEqual(sample_vnf.setup_helper.collectd_options, expected)
 
@@ -1771,14 +1641,14 @@ class TestSampleVnf(unittest.TestCase):
                          'plugin1': {'param': 1}}}
 
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf1', vnfd)
+        sample_vnf = SampleVNF('vnf1', vnfd, 'task_id')
         sample_vnf._update_options(options2, options1)
         self.assertEqual(options2, expected)
 
     @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
     @mock.patch("yardstick.ssh.SSH")
     def test_wait_for_instantiate_empty_queue(self, ssh, *args):
-        mock_ssh(ssh, exec_result=(1, "", ""))
+        test_base.mock_ssh(ssh, exec_result=(1, "", ""))
 
         queue_size_list = [
             0,
@@ -1793,7 +1663,7 @@ class TestSampleVnf(unittest.TestCase):
         ]
 
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf1', vnfd)
+        sample_vnf = SampleVNF('vnf1', vnfd, 'task_id')
         sample_vnf.APP_NAME = 'sample1'
         sample_vnf.WAIT_TIME_FOR_SCRIPT = 0
         sample_vnf._start_server = mock.Mock(return_value=0)
@@ -1824,7 +1694,7 @@ class TestSampleVnf(unittest.TestCase):
         ]
 
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf1', vnfd)
+        sample_vnf = SampleVNF('vnf1', vnfd, 'task_id')
         sample_vnf.APP_NAME = 'sample1'
         sample_vnf.q_out = mock.Mock()
         sample_vnf.q_out.qsize.side_effect = iter(queue_size_list)
@@ -1834,7 +1704,7 @@ class TestSampleVnf(unittest.TestCase):
 
     def test_terminate_without_vnf_process(self):
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf1', vnfd)
+        sample_vnf = SampleVNF('vnf1', vnfd, 'task_id')
         sample_vnf.APP_NAME = 'sample1'
         sample_vnf.vnf_execute = mock.Mock()
         sample_vnf.ssh_helper = mock.Mock()
@@ -1845,16 +1715,20 @@ class TestSampleVnf(unittest.TestCase):
 
     def test_get_stats(self):
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf1', vnfd)
+        sample_vnf = SampleVNF('vnf1', vnfd, 'task_id')
         sample_vnf.APP_NAME = 'sample1'
         sample_vnf.APP_WORD = 'sample1'
         sample_vnf.vnf_execute = mock.Mock(return_value='the stats')
 
         self.assertEqual(sample_vnf.get_stats(), 'the stats')
 
-    def test_collect_kpi(self):
+    @mock.patch.object(ctx_base.Context, 'get_physical_node_from_server', return_value='mock_node')
+    def test_collect_kpi(self, *args):
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf1', vnfd)
+        sample_vnf = SampleVNF('vnf1', vnfd, 'task_id')
+        sample_vnf.scenario_helper.scenario_cfg = {
+            'nodes': {sample_vnf.name: "mock"}
+        }
         sample_vnf.APP_NAME = 'sample1'
         sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
         sample_vnf.COLLECT_MAP = {
@@ -1871,18 +1745,24 @@ class TestSampleVnf(unittest.TestCase):
             'k2': 34,
             'k3': 91,
             'collect_stats': {},
+            'physical_node': 'mock_node'
         }
         result = sample_vnf.collect_kpi()
         self.assertDictEqual(result, expected)
 
-    def test_collect_kpi_default(self):
+    @mock.patch.object(ctx_base.Context, 'get_physical_node_from_server', return_value='mock_node')
+    def test_collect_kpi_default(self, *args):
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf1', vnfd)
+        sample_vnf = SampleVNF('vnf1', vnfd, 'task_id')
+        sample_vnf.scenario_helper.scenario_cfg = {
+            'nodes': {sample_vnf.name: "mock"}
+        }
         sample_vnf.APP_NAME = 'sample1'
         sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)'
         sample_vnf.get_stats = mock.Mock(return_value='')
 
         expected = {
+            'physical_node': 'mock_node',
             'packets_in': 0,
             'packets_fwd': 0,
             'packets_dropped': 0,
@@ -1892,7 +1772,7 @@ class TestSampleVnf(unittest.TestCase):
 
     def test_scale(self):
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf1', vnfd)
+        sample_vnf = SampleVNF('vnf1', vnfd, 'task_id')
         self.assertRaises(y_exceptions.FunctionNotImplemented,
                           sample_vnf.scale)
 
@@ -1900,7 +1780,7 @@ class TestSampleVnf(unittest.TestCase):
         test_cmd = 'test cmd'
         run_kwargs = {'arg1': 'val1', 'arg2': 'val2'}
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
-        sample_vnf = SampleVNF('vnf1', vnfd)
+        sample_vnf = SampleVNF('vnf1', vnfd, 'task_id')
         sample_vnf.ssh_helper = mock.Mock()
         sample_vnf.setup_helper = mock.Mock()
         with mock.patch.object(sample_vnf, '_build_config',
@@ -2036,30 +1916,30 @@ class TestSampleVNFTrafficGen(unittest.TestCase):
     }
 
     def test__check_status(self):
-        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
+        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0, 'task_id')
 
         with self.assertRaises(NotImplementedError):
             sample_vnf_tg._check_status()
 
     def test_listen_traffic(self):
-        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
+        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0, 'task_id')
 
         sample_vnf_tg.listen_traffic(mock.Mock())
 
     def test_verify_traffic(self):
-        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
+        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0, 'task_id')
 
         sample_vnf_tg.verify_traffic(mock.Mock())
 
     def test_terminate(self):
-        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
+        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0, 'task_id')
         sample_vnf_tg._traffic_process = mock.Mock()
         sample_vnf_tg._tg_process = mock.Mock()
 
         sample_vnf_tg.terminate()
 
     def test__wait_for_process(self):
-        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
+        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0, 'task_id')
         with mock.patch.object(sample_vnf_tg, '_check_status',
                                return_value=0) as mock_status, \
                 mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
@@ -2070,14 +1950,14 @@ class TestSampleVNFTrafficGen(unittest.TestCase):
             mock_status.assert_called_once()
 
     def test__wait_for_process_not_alive(self):
-        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
+        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0, 'task_id')
         with mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc:
             mock_proc.is_alive.return_value = False
             self.assertRaises(RuntimeError, sample_vnf_tg._wait_for_process)
             mock_proc.is_alive.assert_called_once()
 
     def test__wait_for_process_delayed(self):
-        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
+        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0, 'task_id')
         with mock.patch.object(sample_vnf_tg, '_check_status',
                                side_effect=[1, 0]) as mock_status, \
                 mock.patch.object(sample_vnf_tg,
@@ -2089,6 +1969,6 @@ class TestSampleVNFTrafficGen(unittest.TestCase):
             mock_status.assert_has_calls([mock.call(), mock.call()])
 
     def test_scale(self):
-        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0)
+        sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0, 'task_id')
         self.assertRaises(y_exceptions.FunctionNotImplemented,
                           sample_vnf_tg.scale)