From 8d7b81187071891317245a7e47a10dcfe70b3809 Mon Sep 17 00:00:00 2001
From: Deepak S <deepak.s@linux.intel.com>
Date: Fri, 30 Dec 2016 09:24:52 -0800
Subject: Adding trex trafficgen example.

This patch uses trex trafficgen example to define dynamic traffic profiles
and how it can be mapped to real world traffic.

JIRA: YARDSTICK-492
Change-Id: Ica24957ebf43315a8d81adabd4745c27d3c7c36a
Signed-off-by: Deepak S <deepak.s@linux.intel.com>
---
 .../scenarios/networking/test_vnf_generic.py       |   6 +-
 .../vnf_generic/vnf/test_tg_trex.py                | 302 +++++++++++++++++++++
 2 files changed, 305 insertions(+), 3 deletions(-)
 create mode 100644 tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py

(limited to 'tests')

diff --git a/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py b/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py
index 540d7f214..40b07b1ca 100644
--- a/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py
+++ b/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py
@@ -262,9 +262,9 @@ class TestNetworkServiceTestCase(unittest.TestCase):
             "ipv4_1flow_Packets_vpe.yaml1"
         self.assertEqual({}, self.s._get_traffic_flow(self.scenario_cfg))
 
-    def test_get_vnf_impl_invalid(self):
-        self.assertRaises(IncorrectConfig, self.s.get_vnf_impl,
-                          COMPLETE_TREX_VNFD['vnfd:vnfd-catalog']['vnfd'][0])
+    def test_get_vnf_imp(self):
+        vnfd = COMPLETE_TREX_VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+        self.assertIsNotNone(self.s.get_vnf_impl(vnfd))
 
     def test_load_vnf_models_invalid(self):
         self.context_cfg["nodes"]['trexgen__1']['VNF model'] = \
diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py
new file mode 100644
index 000000000..a7f4d8870
--- /dev/null
+++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py
@@ -0,0 +1,302 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# 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 __future__ import absolute_import
+import unittest
+import mock
+import multiprocessing
+from multiprocessing import Queue
+
+from stl.trex_stl_lib.trex_stl_client import STLClient
+from yardstick.network_services.vnf_generic.vnf.tg_trex import TrexTrafficGen
+from yardstick.network_services.traffic_profile.base import TrafficProfile
+
+
+class TestTrexTrafficGen(unittest.TestCase):
+    VNFD = {'vnfd:vnfd-catalog':
+            {'vnfd':
+             [{'short-name': 'VpeVnf',
+               'vdu':
+               [{'routing_table':
+                 [{'network': '152.16.100.20',
+                   'netmask': '255.255.255.0',
+                   'gateway': '152.16.100.20',
+                   'if': 'xe0'},
+                  {'network': '152.16.40.20',
+                   'netmask': '255.255.255.0',
+                   'gateway': '152.16.40.20',
+                   'if': 'xe1'}],
+                 'description': 'VPE approximation using DPDK',
+                 'name': 'vpevnf-baremetal',
+                 'nd_route_tbl':
+                 [{'network': '0064:ff9b:0:0:0:0:9810:6414',
+                   'netmask': '112',
+                   'gateway': '0064:ff9b:0:0:0:0:9810:6414',
+                   'if': 'xe0'},
+                  {'network': '0064:ff9b:0:0:0:0:9810:2814',
+                   'netmask': '112',
+                   'gateway': '0064:ff9b:0:0:0:0:9810:2814',
+                   'if': 'xe1'}],
+                 'id': 'vpevnf-baremetal',
+                 'external-interface':
+                 [{'virtual-interface':
+                   {'dst_mac': '00:00:00:00:00:04',
+                    'vpci': '0000:05:00.0',
+                    'local_ip': '152.16.100.19',
+                    'type': 'PCI-PASSTHROUGH',
+                    'netmask': '255.255.255.0',
+                    'dpdk_port_num': '0',
+                    'bandwidth': '10 Gbps',
+                    'driver': "i40e",
+                    'dst_ip': '152.16.100.20',
+                    'local_iface_name': 'xe0',
+                    'local_mac': '00:00:00:00:00:02'},
+                   'vnfd-connection-point-ref': 'xe0',
+                   'name': 'xe0'},
+                  {'virtual-interface':
+                   {'dst_mac': '00:00:00:00:00:03',
+                    'vpci': '0000:05:00.1',
+                    'local_ip': '152.16.40.19',
+                    'type': 'PCI-PASSTHROUGH',
+                    'driver': "i40e",
+                    'netmask': '255.255.255.0',
+                    'dpdk_port_num': '1',
+                    'bandwidth': '10 Gbps',
+                    'dst_ip': '152.16.40.20',
+                    'local_iface_name': 'xe1',
+                    'local_mac': '00:00:00:00:00:01'},
+                   'vnfd-connection-point-ref': 'xe1',
+                   'name': 'xe1'}]}],
+               'description': 'Vpe approximation using DPDK',
+               'mgmt-interface':
+                   {'vdu-id': 'vpevnf-baremetal',
+                    'host': '1.1.1.1',
+                    'password': 'r00t',
+                    'user': 'root',
+                    'ip': '1.1.1.1'},
+               'benchmark':
+                   {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
+               'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
+                                    {'type': 'VPORT', 'name': 'xe1'}],
+               'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
+
+    TRAFFIC_PROFILE = {
+        "schema": "isb:traffic_profile:0.1",
+        "name": "fixed",
+        "description": "Fixed traffic profile to run UDP traffic",
+        "traffic_profile": {
+            "traffic_type": "FixedTraffic",
+            "frame_rate": 100,  # pps
+            "flow_number": 10,
+            "frame_size": 64}}
+
+    def test___init__(self):
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            self.assertIsNotNone(trex_traffic_gen._terminated)
+
+    def test_collect_kpi(self):
+       with mock.patch("yardstick.ssh.SSH") as ssh:
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            trex_traffic_gen._queue.put({})
+            restult = trex_traffic_gen.collect_kpi()
+            self.assertEqual({}, restult)
+
+    def test_listen_traffic(self):
+       with mock.patch("yardstick.ssh.SSH") as ssh:
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            self.assertEqual(None, trex_traffic_gen.listen_traffic({}))
+
+    def test_instantiate(self):
+        mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
+        mock_traffic_profile.get_traffic_definition.return_value = "64"
+        mock_traffic_profile.params = self.TRAFFIC_PROFILE
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh_mock.run = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            self.assertEqual(0, trex_traffic_gen.instantiate({}, {}))
+
+    def test_instantiate_error(self):
+        mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
+        mock_traffic_profile.get_traffic_definition.return_value = "64"
+        mock_traffic_profile.params = self.TRAFFIC_PROFILE
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(1, "", ""))
+            ssh_mock.run = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            self.assertRaises(RuntimeError,
+                              trex_traffic_gen.instantiate, {}, {})
+
+    def test__start_server(self):
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh_mock.run = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            self.assertEqual(None, trex_traffic_gen._start_server())
+
+    def test__traffic_runner(self):
+        mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
+        mock_traffic_profile.get_traffic_definition.return_value = "64"
+        mock_traffic_profile.execute.return_value = "64"
+        mock_traffic_profile.params = self.TRAFFIC_PROFILE
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh_mock.run = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            self.sut = TrexTrafficGen(vnfd)
+            self.sut.connection = mock.Mock()
+            self.sut.connection.run = mock.Mock()
+            q = Queue()
+            client_started = multiprocessing.Value('i', 1)
+            self.sut._vpci_ascending = ["0000:05:00.0", "0000:05:00.1"]
+            self.sut._connect_client = mock.Mock(autospec=STLClient)
+            self.sut._connect_client.get_stats = mock.Mock(return_value="0")
+            self.sut._traffic_runner(mock_traffic_profile, q, client_started,
+                                     self.sut._terminated)
+
+    def test__generate_trex_cfg(self):
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh_mock.run = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            self.assertEqual(None, trex_traffic_gen._generate_trex_cfg(vnfd))
+
+    def test__split_mac_address_into_list(self):
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh_mock.run = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            result = ['0x00', '0x00', '0x00', '0x00', '0x00', '0x01']
+            self.assertEqual(
+                result, trex_traffic_gen._split_mac_address_into_list(
+                    "00:00:00:00:00:01"))
+
+    def test_run_traffic(self):
+        mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
+        mock_traffic_profile.get_traffic_definition.return_value = "64"
+        mock_traffic_profile.params = self.TRAFFIC_PROFILE
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh_mock.run = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            self.sut = TrexTrafficGen(vnfd)
+            self.sut.connection = mock.Mock()
+            self.sut.connection.run = mock.Mock()
+            self.sut._traffic_runner = mock.Mock(return_value=0)
+            self.sut.client_started.value = 1
+            result = self.sut.run_traffic(mock_traffic_profile)
+            self.sut._traffic_process.terminate()
+            self.assertEqual(True, result)
+
+    def test_scale(self):
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(1, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            flavor = ""
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            self.assertRaises(NotImplementedError,
+                              trex_traffic_gen.scale, flavor)
+
+    def test_setup_vnf_environment(self):
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(1, "", ""))
+            ssh.return_value = ssh_mock
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            self.assertEqual(
+                None, trex_traffic_gen.setup_vnf_environment(ssh_mock))
+
+    def test_terminate(self):
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            self.assertEqual(None, trex_traffic_gen.terminate())
+
+    def test__connect_client(self):
+        with mock.patch("yardstick.ssh.SSH") as ssh:
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            ssh_mock = mock.Mock(autospec=ssh.SSH)
+            ssh_mock.execute = \
+                mock.Mock(return_value=(0, "", ""))
+            ssh.return_value = ssh_mock
+            vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+            trex_traffic_gen = TrexTrafficGen(vnfd)
+            client = mock.Mock(autospec=STLClient)
+            client.connect = mock.Mock(return_value=0)
+            self.assertIsNotNone(trex_traffic_gen._connect_client(client))
-- 
cgit