prox: pass prox_config_dict between Processes using queue 79/42379/5
authorRoss Brattain <ross.b.brattain@intel.com>
Tue, 19 Sep 2017 08:07:15 +0000 (01:07 -0700)
committerEdward MacGillivray <edward.s.macgillivray@intel.com>
Tue, 19 Sep 2017 21:36:12 +0000 (14:36 -0700)
we generate the prox_config_dict in the _run Process,
but we also need it in the _traffic_runner Process to
get core info.

use a queue to pass the config list between the processes

enable collect_kpi

Change-Id: Ibaf41d606e559a87addf43d6ddaed206dbd2d20c
Signed-off-by: Ross Brattain <ross.b.brattain@intel.com>
Signed-off-by: Edward MacGillivray <edward.s.macgillivray@intel.com>
tests/unit/network_services/traffic_profile/test_prox_binsearch.py
tests/unit/network_services/traffic_profile/test_prox_mpls.py
tests/unit/network_services/traffic_profile/test_prox_profile.py
tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py
tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py
tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py
yardstick/network_services/traffic_profile/prox_profile.py
yardstick/network_services/vnf_generic/vnf/prox_helpers.py
yardstick/network_services/vnf_generic/vnf/prox_vnf.py

index 0edce7a..f56a7fb 100644 (file)
@@ -56,7 +56,7 @@ class TestProxBinSearchProfile(unittest.TestCase):
         profile = ProxBinSearchProfile(tp_config)
         profile.init(mock.MagicMock())
 
-        profile.execute(traffic_generator)
+        profile.execute_traffic(traffic_generator)
         self.assertEqual(round(profile.current_lower, 2), 74.69)
         self.assertEqual(round(profile.current_upper, 2), 75.39)
         self.assertEqual(len(runs), 8)
@@ -87,7 +87,7 @@ class TestProxBinSearchProfile(unittest.TestCase):
         profile = ProxBinSearchProfile(tp_config)
         profile.init(mock.MagicMock())
 
-        profile.execute(traffic_generator)
+        profile.execute_traffic(traffic_generator)
         self.assertEqual(round(profile.current_lower, 2), 24.06)
         self.assertEqual(round(profile.current_upper, 2), 25.47)
         self.assertEqual(len(runs), 7)
index 77bca9c..642fecc 100644 (file)
@@ -56,7 +56,7 @@ class TestProxMplsTagUntagProfile(unittest.TestCase):
         profile = ProxMplsTagUntagProfile(tp_config)
         profile.init(mock.MagicMock())
 
-        profile.execute(traffic_generator)
+        profile.execute_traffic(traffic_generator)
         self.assertEqual(round(profile.current_lower, 2), 74.69)
         self.assertEqual(round(profile.current_upper, 2), 75.39)
         self.assertEqual(len(runs), 8)
@@ -87,7 +87,7 @@ class TestProxMplsTagUntagProfile(unittest.TestCase):
         profile = ProxMplsTagUntagProfile(tp_config)
         profile.init(mock.MagicMock())
 
-        profile.execute(traffic_generator)
+        profile.execute_traffic(traffic_generator)
         self.assertEqual(round(profile.current_lower, 2), 24.06)
         self.assertEqual(round(profile.current_upper, 2), 25.47)
         self.assertEqual(len(runs), 7)
index 14223da..9899d99 100644 (file)
@@ -65,7 +65,7 @@ class TestProxProfile(unittest.TestCase):
         profile.init(234)
         self.assertEqual(profile.queue, 234)
 
-    def test_execute(self):
+    def test_execute_traffic(self):
         packet_sizes = [
             10,
             100,
@@ -83,9 +83,9 @@ class TestProxProfile(unittest.TestCase):
         self.assertFalse(profile.done)
         for _ in packet_sizes:
             with self.assertRaises(NotImplementedError):
-                profile.execute(traffic_generator)
+                profile.execute_traffic(traffic_generator)
 
-        self.assertIsNone(profile.execute(traffic_generator))
+        self.assertIsNone(profile.execute_traffic(traffic_generator))
 
     def test_bounds_iterator(self):
         tp_config = {
index 8d21fbb..2202c11 100644 (file)
@@ -884,11 +884,11 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
         helper.upload_prox_config = mock.MagicMock(return_value='5')
 
         self.assertEqual(helper.additional_files, {})
-        self.assertNotEqual(helper.prox_config_dict, '4')
+        self.assertNotEqual(helper._prox_config_data, '4')
         self.assertNotEqual(helper.remote_path, '5')
         helper.build_config_file()
         self.assertEqual(helper.additional_files, {})
-        self.assertEqual(helper.prox_config_dict, '4')
+        self.assertEqual(helper._prox_config_data, '4')
         self.assertEqual(helper.remote_path, '5')
 
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
@@ -951,12 +951,12 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
         helper.upload_prox_config = mock.MagicMock(return_value='55')
 
         self.assertEqual(helper.additional_files, {})
-        self.assertNotEqual(helper.prox_config_dict, '44')
+        self.assertNotEqual(helper._prox_config_data, '44')
         self.assertNotEqual(helper.remote_path, '55')
         expected = {'h.i': '33', 'l': '34', 'm_n': '35'}
         helper.build_config_file()
         self.assertDictEqual(helper.additional_files, expected)
-        self.assertEqual(helper.prox_config_dict, '44')
+        self.assertEqual(helper._prox_config_data, '44')
         self.assertEqual(helper.remote_path, '55')
 
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
@@ -986,9 +986,10 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
 
         helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
         helper.remote_path = "/tmp/prox.cfg"
-        prox_cmd = helper.build_config()
         expected = "sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli -f  -f /tmp/prox.cfg '"
-        self.assertEqual(prox_cmd, expected)
+        with mock.patch.object(helper, "build_config_file") as mock_build_config:
+            prox_cmd = helper.build_config()
+            self.assertEqual(prox_cmd, expected)
 
     def test__insert_additional_file(self):
         vnfd_helper = mock.MagicMock()
@@ -1392,7 +1393,7 @@ class TestProxResourceHelper(unittest.TestCase):
 
     def test_test_cores(self):
         setup_helper = mock.MagicMock()
-        setup_helper.prox_config_dict = {}
+        setup_helper.prox_config_data = []
 
         helper = ProxResourceHelper(setup_helper)
         helper._cpu_topology = []
@@ -1401,7 +1402,7 @@ class TestProxResourceHelper(unittest.TestCase):
         result = helper.test_cores
         self.assertEqual(result, expected)
 
-        setup_helper.prox_config_dict = [
+        setup_helper.prox_config_data = [
             ('section1', []),
             ('section2', [
                 ('a', 'b'),
@@ -1449,10 +1450,9 @@ class TestProxResourceHelper(unittest.TestCase):
 
     def test_get_test_type(self):
         setup_helper = mock.MagicMock()
-        setup_helper.prox_config_dict = {}
-
         helper = ProxResourceHelper(setup_helper)
-        setup_helper.prox_config_dict = [
+
+        setup_helper.prox_config_data = [
             ('global', [
                 ('name', helper.PROX_CORE_MPLS_TEST)
             ]),
@@ -1479,27 +1479,7 @@ class TestProxResourceHelper(unittest.TestCase):
 
     def test_get_cores(self):
         setup_helper = mock.MagicMock()
-        setup_helper.prox_config_dict = {}
-
-        helper = ProxResourceHelper(setup_helper)
-        helper._cpu_topology = {
-            0: {
-                1: {
-                    5: (5, 1, 0)
-                },
-                2: {
-                    6: (6, 2, 0)
-                },
-                3: {
-                    7: (7, 3, 0)
-                },
-                4: {
-                    8: (8, 3, 0)
-                },
-            }
-        }
-
-        setup_helper.prox_config_dict = [
+        setup_helper.prox_config_data = [
             ('section1', []),
             ('section2', [
                 ('a', 'b'),
@@ -1520,14 +1500,6 @@ class TestProxResourceHelper(unittest.TestCase):
             ]),
         ]
 
-        expected = [7, 8]
-        result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
-        self.assertEqual(result, expected)
-
-    def test_get_cores_mpls(self):
-        setup_helper = mock.MagicMock()
-        setup_helper.prox_config_dict = {}
-
         helper = ProxResourceHelper(setup_helper)
         helper._cpu_topology = {
             0: {
@@ -1546,7 +1518,13 @@ class TestProxResourceHelper(unittest.TestCase):
             }
         }
 
-        setup_helper.prox_config_dict = [
+        expected = [7, 8]
+        result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
+        self.assertEqual(result, expected)
+
+    def test_get_cores_mpls(self):
+        setup_helper = mock.MagicMock()
+        setup_helper.prox_config_data = [
             ('section1', []),
             ('section2', [
                 ('a', 'b'),
@@ -1569,6 +1547,24 @@ class TestProxResourceHelper(unittest.TestCase):
             ]),
         ]
 
+        helper = ProxResourceHelper(setup_helper)
+        helper._cpu_topology = {
+            0: {
+                1: {
+                    5: (5, 1, 0)
+                },
+                2: {
+                    6: (6, 2, 0)
+                },
+                3: {
+                    7: (7, 3, 0)
+                },
+                4: {
+                    8: (8, 3, 0)
+                },
+            }
+        }
+
         expected_tagged = [7]
         expected_plain = [8]
         result_tagged, result_plain = helper.get_cores_mpls(helper.PROX_CORE_GEN_MODE)
@@ -1577,7 +1573,7 @@ class TestProxResourceHelper(unittest.TestCase):
 
     def test_latency_cores(self):
         setup_helper = mock.MagicMock()
-        setup_helper.prox_config_dict = {}
+        setup_helper.prox_config_data= []
 
         helper = ProxResourceHelper(setup_helper)
         helper._cpu_topology = []
@@ -1586,7 +1582,7 @@ class TestProxResourceHelper(unittest.TestCase):
         result = helper.latency_cores
         self.assertEqual(result, expected)
 
-        setup_helper.prox_config_dict = [
+        setup_helper.prox_config_data = [
             ('section1', []),
             ('section2', [
                 ('a', 'b'),
@@ -1649,7 +1645,9 @@ class TestProxResourceHelper(unittest.TestCase):
     def test_start_collect(self):
         setup_helper = mock.MagicMock()
         helper = ProxResourceHelper(setup_helper)
+        helper.resource = resource = mock.MagicMock()
         self.assertIsNone(helper.start_collect())
+        resource.start.assert_called_once()
 
     def test_terminate(self):
         setup_helper = mock.MagicMock()
@@ -1681,7 +1679,7 @@ class TestProxResourceHelper(unittest.TestCase):
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
     def test_traffic_context(self, mock_time):
         setup_helper = mock.MagicMock()
-        setup_helper.prox_config_dict = {}
+        setup_helper.vnfd_helper.interfaces = []
 
         helper = ProxResourceHelper(setup_helper)
         helper._cpu_topology = {
@@ -1701,7 +1699,7 @@ class TestProxResourceHelper(unittest.TestCase):
             }
         }
 
-        setup_helper.prox_config_dict = [
+        setup_helper.prox_config_data = [
             ('global', [
                 ('name', helper.PROX_CORE_MPLS_TEST)
             ]),
@@ -1727,8 +1725,6 @@ class TestProxResourceHelper(unittest.TestCase):
             ]),
         ]
 
-        setup_helper = mock.MagicMock()
-        setup_helper.vnfd_helper.interfaces = []
 
         client = mock.MagicMock()
         client.hz.return_value = 2
@@ -1823,20 +1819,6 @@ class TestProxResourceHelper(unittest.TestCase):
         result = helper.get_latency()
         self.assertIs(result, expected)
 
-    def test__get_logical_if_name(self):
-        setup_helper = mock.MagicMock()
-        setup_helper.vnfd_helper.interfaces = []
-
-        helper = ProxResourceHelper(setup_helper)
-        helper._vpci_to_if_name_map = {
-            'key1': 234,
-            'key2': 432,
-        }
-
-        expected = 234
-        result = helper._get_logical_if_name('key1')
-        self.assertEqual(result, expected)
-
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
     def test__connect(self, mock_socket_helper_type, mock_time):
index d1f7f05..f8b592d 100644 (file)
@@ -86,6 +86,7 @@ class TestProxApproxVnf(unittest.TestCase):
                             'local_ip': '152.16.100.19',
                             'type': 'PCI-PASSTHROUGH',
                             'vld_id': '',
+                            'ifname': 'xe1',
                             'netmask': '255.255.255.0',
                             'dpdk_port_num': 0,
                             'bandwidth': '10 Gbps',
@@ -104,6 +105,7 @@ class TestProxApproxVnf(unittest.TestCase):
                             'local_ip': '152.16.40.19',
                             'type': 'PCI-PASSTHROUGH',
                             'vld_id': '',
+                            'ifname': 'xe3',
                             'driver': "i40e",
                             'netmask': '255.255.255.0',
                             'dpdk_port_num': 1,
@@ -372,8 +374,10 @@ class TestProxApproxVnf(unittest.TestCase):
         file_path = os.path.join(curr_path, filename)
         return file_path
 
+    @mock.patch('yardstick.benchmark.scenarios.networking.vnf_generic.open', create=True)
+    @mock.patch('yardstick.network_services.vnf_generic.vnf.iniparser.open', create=True)
     @mock.patch(SSH_HELPER)
-    def test_run_prox(self, ssh, mock_time):
+    def test_run_prox(self, ssh, *_):
         mock_ssh(ssh)
 
         prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0)
@@ -382,7 +386,7 @@ class TestProxApproxVnf(unittest.TestCase):
         prox_approx_vnf.setup_helper.remote_path = 'configs/file56.cfg'
 
         expected = "sudo bash -c 'cd /tool_path12; " \
-                   "/tool_path12/tool_file34 -o cli -t  -f configs/file56.cfg '"
+                   "/tool_path12/tool_file34 -o cli -t  -f /tmp/l3-swap-2.cfg '"
 
         prox_approx_vnf._run()
         result = prox_approx_vnf.ssh_helper.run.call_args[0][0]
@@ -395,7 +399,7 @@ class TestProxApproxVnf(unittest.TestCase):
         prox_approx_vnf.setup_helper = mock.MagicMock()
         # we can't mock super
         prox_approx_vnf.instantiate(self.SCENARIO_CFG, self.CONTEXT_CFG)
-        prox_approx_vnf.setup_helper.build_config.assert_called_once
+        prox_approx_vnf.setup_helper.build_config.assert_called_once()
 
     @mock.patch(SSH_HELPER)
     def test_wait_for_instantiate_panic(self, ssh, mock_time):
index 73e1c72..4e82c0d 100644 (file)
@@ -331,9 +331,10 @@ class TestProxTrafficGen(unittest.TestCase):
         mock_ssh(ssh)
 
         prox_traffic_gen = ProxTrafficGen(NAME, self.VNFD0)
-        prox_traffic_gen._vnf_wrapper.resource = mock.Mock(autospec=ResourceProfile)
+        prox_traffic_gen._vnf_wrapper.resource_helper.resource = mock.MagicMock(
+            **{"check_if_sa_running.return_value": [False]})
         prox_traffic_gen._vnf_wrapper.vnf_execute = mock.Mock(return_value="")
-        self.assertEqual({}, prox_traffic_gen.collect_kpi())
+        self.assertEqual({"core": {}}, prox_traffic_gen.collect_kpi())
 
     @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.CpuSysCores')
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
@@ -391,10 +392,10 @@ class TestProxTrafficGen(unittest.TestCase):
 
         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
         sut = ProxTrafficGen(NAME, vnfd)
-        sut.prox_config_dict = {}
         sut._get_socket = mock.MagicMock()
         sut.ssh_helper = mock.Mock()
         sut.ssh_helper.run = mock.Mock()
+        sut.setup_helper.prox_config_dict = {}
         sut._vpci_ascending = ["0000:05:00.0", "0000:05:00.1"]
         sut._connect_client = mock.Mock(autospec=STLClient)
         sut._connect_client.get_stats = mock.Mock(return_value="0")
index daeaf42..0a9de9b 100644 (file)
@@ -88,7 +88,7 @@ class ProxProfile(TrafficProfile):
     def run_test_with_pkt_size(self, traffic_generator, pkt_size, duration):
         raise NotImplementedError
 
-    def execute(self, traffic_generator):
+    def execute_traffic(self, traffic_generator):
         try:
             pkt_size = next(self.pkt_size_iterator)
         except StopIteration:
index 00ab6c2..30524a1 100644 (file)
@@ -28,6 +28,7 @@ from contextlib import contextmanager
 from itertools import repeat, chain
 
 import six
+from multiprocessing import Queue
 from six.moves import zip, StringIO
 from six.moves import cStringIO
 
@@ -597,8 +598,9 @@ class ProxDpdkVnfSetupEnvHelper(DpdkVnfSetupEnvHelper):
         self.remote_path = None
         super(ProxDpdkVnfSetupEnvHelper, self).__init__(vnfd_helper, ssh_helper, scenario_helper)
         self.remote_prox_file_name = None
-        self.prox_config_dict = None
+        self._prox_config_data = None
         self.additional_files = {}
+        self.config_queue = Queue()
 
     def _build_pipeline_kwargs(self):
         tool_path = self.ssh_helper.provision_tool(tool_file=self.APP_NAME)
@@ -758,6 +760,15 @@ class ProxDpdkVnfSetupEnvHelper(DpdkVnfSetupEnvHelper):
 
         return remote_path
 
+    CONFIG_QUEUE_TIMEOUT = 120
+
+    @property
+    def prox_config_data(self):
+        if self._prox_config_data is None:
+            # this will block, but it needs too
+            self._prox_config_data = self.config_queue.get(True, self.CONFIG_QUEUE_TIMEOUT)
+        return self._prox_config_data
+
     def build_config_file(self):
         task_path = self.scenario_helper.task_path
         options = self.scenario_helper.options
@@ -774,10 +785,13 @@ class ProxDpdkVnfSetupEnvHelper(DpdkVnfSetupEnvHelper):
             remote_prox_file = self.copy_to_target(key_prox_file, base_prox_file)
             self.additional_files[base_prox_file] = remote_prox_file
 
-        self.prox_config_dict = self.generate_prox_config_file(config_path)
-        self.remote_path = self.upload_prox_config(config_file, self.prox_config_dict)
+        self._prox_config_data = self.generate_prox_config_file(config_path)
+        # copy config to queue so we can read it from traffic_runner process
+        self.config_queue.put(self._prox_config_data)
+        self.remote_path = self.upload_prox_config(config_file, self._prox_config_data)
 
     def build_config(self):
+        self.build_config_file()
 
         options = self.scenario_helper.options
 
@@ -793,6 +807,7 @@ class ProxDpdkVnfSetupEnvHelper(DpdkVnfSetupEnvHelper):
         return prox_cmd
 
 
+# this might be bad, sometimes we want regular ResourceHelper methods, like collect_kpi
 class ProxResourceHelper(ClientResourceHelper):
 
     RESOURCE_WORD = 'prox'
@@ -891,8 +906,9 @@ class ProxResourceHelper(ClientResourceHelper):
             LOG.debug("tg_prox done")
             self._terminated.value = 1
 
-    def start_collect(self):
-        pass
+    # use ResourceHelper method to collect KPIs directly.
+    def collect_kpi(self):
+        return self._collect_resource_kpi()
 
     def terminate(self):
         # should not be called, use VNF terminate
@@ -966,7 +982,7 @@ class ProxResourceHelper(ClientResourceHelper):
 
     def get_test_type(self):
         test_type = None
-        for section_name, section in self.setup_helper.prox_config_dict:
+        for section_name, section in self.setup_helper.prox_config_data:
             if section_name != "global":
                 continue
 
@@ -979,7 +995,7 @@ class ProxResourceHelper(ClientResourceHelper):
     def get_cores(self, mode):
         cores = []
 
-        for section_name, section in self.setup_helper.prox_config_dict:
+        for section_name, section in self.setup_helper.prox_config_data:
             if not section_name.startswith("core"):
                 continue
 
@@ -994,7 +1010,7 @@ class ProxResourceHelper(ClientResourceHelper):
     def get_cores_mpls(self, mode=PROX_CORE_GEN_MODE):
         cores_tagged = []
         cores_plain = []
-        for section_name, section in self.setup_helper.prox_config_dict:
+        for section_name, section in self.setup_helper.prox_config_data:
             if not section_name.startswith("core"):
                 continue
 
@@ -1023,9 +1039,6 @@ class ProxResourceHelper(ClientResourceHelper):
             return self.sut.lat_stats(self._latency_cores)
         return []
 
-    def _get_logical_if_name(self, vpci):
-        return self._vpci_to_if_name_map[vpci]
-
     def _connect(self, client=None):
         """Run and connect to prox on the remote system """
         # De-allocating a large amount of hugepages takes some time. If a new
index bef7c5a..e87d452 100644 (file)
@@ -102,10 +102,3 @@ class ProxApproxVnf(SampleVNF):
         self.setup_helper.kill_vnf()
         self._tear_down()
         self.resource_helper.stop_collect()
-
-    def instantiate(self, scenario_cfg, context_cfg):
-        # build config in parent process so we can access
-        # config from TG subprocesses
-        self.scenario_helper.scenario_cfg = scenario_cfg
-        self.setup_helper.build_config_file()
-        super(ProxApproxVnf, self).instantiate(scenario_cfg, context_cfg)