Add vEPC infrastructure for Landslide TG 69/62269/4
authorOrest Voznyy <orestx.voznyy@intel.com>
Thu, 13 Sep 2018 10:30:08 +0000 (13:30 +0300)
committerOrest Voznyy <orestx.voznyy@intel.com>
Sat, 15 Sep 2018 00:40:08 +0000 (03:40 +0300)
1. Add yardstick topology and model for fully emulated environment.
2. Add support for black-box testing of real vEPC VNF vs Spirent Landslide
   traffic generator:
     - vEPC VNF pod file
     - topology and model files aware of vEPC VNF connection to Spirent
       Landslide TG
     - stub class for vEPC VNF, and related unit tests

JIRA: YARDSTICK-1424

Change-Id: If7b6d19919679347c4360f4a0f2e420716e7fd2d
Signed-off-by: Orest Voznyy <orestx.voznyy@intel.com>
etc/yardstick/nodes/standalone/pod_vepc_sut.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/vepc/landslide_tg_topology.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/vepc/vepc_vnf_topology_landslide.yaml [new file with mode: 0644]
samples/vnf_samples/vnf_descriptors/tg_landslide_tpl.yaml [new file with mode: 0644]
samples/vnf_samples/vnf_descriptors/vepc_vnf.yaml [new file with mode: 0644]
yardstick/network_services/vnf_generic/vnf/epc_vnf.py [new file with mode: 0644]
yardstick/tests/unit/network_services/vnf_generic/vnf/test_epc_vnf.py [new file with mode: 0644]

diff --git a/etc/yardstick/nodes/standalone/pod_vepc_sut.yaml b/etc/yardstick/nodes/standalone/pod_vepc_sut.yaml
new file mode 100644 (file)
index 0000000..8467303
--- /dev/null
@@ -0,0 +1,37 @@
+# Copyright (c) 2018 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.
+---
+# Sample config file for fully emulated EPC environment
+
+
+nodes:
+-
+    name: "vnf__0"
+    role: vnf__0
+    ip: 192.168.122.200
+    user: user
+    password: password
+    interfaces:  # dummy config
+        xe0:
+            vpci: "0000:05:00.0"
+            local_mac: "68:05:ca:30:3d:50"
+            driver: "i40e"
+            local_ip: "152.16.100.19"
+            netmask: "255.255.255.0"
+        xe1:
+            vpci: "0000:05:00.1"
+            local_mac: "68:05:ca:30:3d:51"
+            driver: "i40e"
+            local_ip: "152.16.40.19"
+            netmask: "255.255.255.0"
diff --git a/samples/vnf_samples/nsut/vepc/landslide_tg_topology.yaml b/samples/vnf_samples/nsut/vepc/landslide_tg_topology.yaml
new file mode 100644 (file)
index 0000000..ccf496b
--- /dev/null
@@ -0,0 +1,50 @@
+# Copyright (c) 2018 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.
+
+nsd:nsd-catalog:
+    nsd:
+    -   id: landslide-tg-topology
+        name: landslide-tg-topology
+        short-name: landslide-tg-topology
+        description: landslide-tg-topology
+        constituent-vnfd:
+        -   member-vnf-index: '1'
+            vnfd-id-ref: tg__0
+            VNF model: ../../vnf_descriptors/tg_landslide_tpl.yaml     #TG type
+        -   member-vnf-index: '2'
+            vnfd-id-ref: vnf__0
+            VNF model: ../../vnf_descriptors/tg_landslide_tpl.yaml     #VNF type: Emulated vEPC
+
+        vld:
+        -   id: uplink_0
+            name: tg__0 to vnf__0 link 1
+            type: ELAN
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: '1'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: tg__0
+            -   member-vnf-index-ref: '2'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: vnf__0
+
+        -   id: downlink_0
+            name: vnf__0 to tg__0 link 2
+            type: ELAN
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: '2'
+                vnfd-connection-point-ref: xe1
+                vnfd-id-ref: vnf__0
+            -   member-vnf-index-ref: '1'
+                vnfd-connection-point-ref: xe1
+                vnfd-id-ref: tg__0
diff --git a/samples/vnf_samples/nsut/vepc/vepc_vnf_topology_landslide.yaml b/samples/vnf_samples/nsut/vepc/vepc_vnf_topology_landslide.yaml
new file mode 100644 (file)
index 0000000..f54cdaf
--- /dev/null
@@ -0,0 +1,50 @@
+# Copyright (c) 2018 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.
+
+nsd:nsd-catalog:
+    nsd:
+    -   id: vEPC
+        name: vEPC
+        short-name: vEPC
+        description: vEPC VNF with Spirent landslide TG
+        constituent-vnfd:
+        -   member-vnf-index: '1'
+            vnfd-id-ref: tg__0
+            VNF model: ../../vnf_descriptors/tg_landslide_tpl.yaml      #TG type
+        -   member-vnf-index: '2'
+            vnfd-id-ref: vnf__0
+            VNF model: ../../vnf_descriptors/vepc_vnf.yaml              #VNF type
+
+        vld:
+        -   id: uplink_0
+            name: tg__0 to vnf__0 link 1
+            type: ELAN
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: '1'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: tg__0
+            -   member-vnf-index-ref: '2'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: vnf__0
+
+        -   id: downlink_0
+            name: vnf__0 to tg__0 link 2
+            type: ELAN
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: '2'
+                vnfd-connection-point-ref: xe1
+                vnfd-id-ref: vnf__0
+            -   member-vnf-index-ref: '1'
+                vnfd-connection-point-ref: xe1
+                vnfd-id-ref: tg__0
diff --git a/samples/vnf_samples/vnf_descriptors/tg_landslide_tpl.yaml b/samples/vnf_samples/vnf_descriptors/tg_landslide_tpl.yaml
new file mode 100644 (file)
index 0000000..48963f0
--- /dev/null
@@ -0,0 +1,38 @@
+# Copyright (c) 2018 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.
+
+vnfd:vnfd-catalog:
+    vnfd:
+    -   id: LandslideTrafficGen  # NSB python class mapping
+        name: LandslideTrafficGen
+        short-name: landslide
+        description: Spirent Landslide traffic generator
+        mgmt-interface:
+            vdu-id: landslide-tas
+            super-user: '{{tas_manager.super_user}}'
+            super-user-password: '{{tas_manager.super_user_password}}'
+            user: '{{tas_manager.test_user}}'
+            password: '{{tas_manager.test_user_password}}'
+            cfguser_password: '{{tas_manager.cfguser_password}}'
+            ip: '{{tas_manager.ip}}'
+            proto: '{{tas_manager.proto}}'  # protocol used for REST API- http
+            license: '{{tas_manager.license}}'  # Landslide license
+        config: {{config}}
+        vdu:
+        -   id: abclient-baremetal
+            name: abclient-baremetal
+            description: AB client interface details
+        benchmark:
+            kpi: []
+
diff --git a/samples/vnf_samples/vnf_descriptors/vepc_vnf.yaml b/samples/vnf_samples/vnf_descriptors/vepc_vnf.yaml
new file mode 100644 (file)
index 0000000..73d3468
--- /dev/null
@@ -0,0 +1,38 @@
+# Copyright (c) 2018 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.
+
+vnfd:vnfd-catalog:
+    vnfd:
+    -   id: EPCVnf  # NSB python class mapping
+        name: EPCVnf
+        short-name: EPCVnf
+        description: EPCVnf
+        mgmt-interface:
+            vdu-id: vepcvnf-baremetal
+            {% if user is defined %}
+            user: '{{user}}'  # Value filled by vnfdgen
+            {% endif %}
+            {% if password is defined %}
+            password: '{{password}}'  # Value filled by vnfdgen
+            {% endif %}
+            {% if ip is defined %}
+            ip: '{{ip}}'  # Value filled by vnfdgen
+            {% endif %}
+        vdu:
+        -   id: vepcvnf-baremetal
+            name: vepc-vnf-baremetal
+            description: vEPCVnf workload
+            external-interface: []
+        benchmark:
+            kpi: []
diff --git a/yardstick/network_services/vnf_generic/vnf/epc_vnf.py b/yardstick/network_services/vnf_generic/vnf/epc_vnf.py
new file mode 100644 (file)
index 0000000..66d16d0
--- /dev/null
@@ -0,0 +1,53 @@
+# Copyright (c) 2018 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.
+
+import logging
+
+from yardstick.network_services.vnf_generic.vnf import base
+
+LOG = logging.getLogger(__name__)
+
+
+class EPCVnf(base.GenericVNF):
+
+    def __init__(self, name, vnfd, task_id):
+        super(EPCVnf, self).__init__(name, vnfd, task_id)
+
+    def instantiate(self, scenario_cfg, context_cfg):
+        """Prepare VNF for operation and start the VNF process/VM
+
+        :param scenario_cfg: Scenario config
+        :param context_cfg: Context config
+        """
+        pass
+
+    def wait_for_instantiate(self):
+        """Wait for VNF to start"""
+        pass
+
+    def terminate(self):
+        """Kill all VNF processes"""
+        pass
+
+    def scale(self, flavor=""):
+        pass
+
+    def collect_kpi(self):
+        pass
+
+    def start_collect(self):
+        pass
+
+    def stop_collect(self):
+        pass
diff --git a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_epc_vnf.py b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_epc_vnf.py
new file mode 100644 (file)
index 0000000..6d14ddb
--- /dev/null
@@ -0,0 +1,94 @@
+# Copyright (c) 2018 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.
+
+import copy
+import unittest
+import uuid
+
+from yardstick.network_services.vnf_generic.vnf import epc_vnf
+
+NAME = 'vnf__0'
+
+VNFD = {
+    'vnfd:vnfd-catalog': {
+        'vnfd': [{
+            'id': 'EPCVnf',  # NSB python class mapping
+            'name': 'EPCVnf',
+            'short-name': 'EPCVnf',
+            'description': 'EPCVnf',
+            'mgmt-interface': {
+                'vdu-id': 'vepcvnf-baremetal',
+                'user': 'user',  # Value filled by vnfdgen
+                'password': 'password',  # Value filled by vnfdgen
+                'ip': 'ip'  # Value filled by vnfdgen
+            },
+            'vdu': [{
+                'id': 'vepcvnf-baremetal',
+                'name': 'vepc-vnf-baremetal',
+                'description': 'vEPCVnf workload',
+                'external-interface': []}],
+            'benchmark': {
+                'kpi': []}}]}}
+
+
+class TestEPCVnf(unittest.TestCase):
+
+    def setUp(self):
+        self._id = uuid.uuid1().int
+        self.vnfd = VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+        self.epc_vnf = epc_vnf.EPCVnf(NAME, self.vnfd, self._id)
+
+    def test___init__(self, *args):
+        _epc_vnf = epc_vnf.EPCVnf(NAME, self.vnfd, self._id)
+        for x in {'user', 'password', 'ip'}:
+            self.assertEqual(self.vnfd['mgmt-interface'][x],
+                             _epc_vnf.vnfd_helper.mgmt_interface[x])
+        self.assertEqual(NAME, _epc_vnf.name)
+        self.assertEqual([], _epc_vnf.kpi)
+        self.assertEqual({}, _epc_vnf.config)
+        self.assertFalse(_epc_vnf.runs_traffic)
+
+    def test___init__missing_ip(self, *args):
+        _vnfd = copy.deepcopy(self.vnfd)
+        _vnfd['mgmt-interface'].pop('ip')
+        _epc_vnf = epc_vnf.EPCVnf(NAME, _vnfd, self._id)
+        for x in {'user', 'password'}:
+            self.assertEqual(_vnfd['mgmt-interface'][x],
+                             _epc_vnf.vnfd_helper.mgmt_interface[x])
+        self.assertNotIn('ip', _epc_vnf.vnfd_helper.mgmt_interface)
+        self.assertEqual(NAME, _epc_vnf.name)
+        self.assertEqual([], _epc_vnf.kpi)
+        self.assertEqual({}, _epc_vnf.config)
+        self.assertFalse(_epc_vnf.runs_traffic)
+
+    def test_instantiate(self):
+        self.assertIsNone(self.epc_vnf.instantiate({}, {}))
+
+    def test_wait_for_instantiate(self):
+        self.assertIsNone(self.epc_vnf.wait_for_instantiate())
+
+    def test_terminate(self):
+        self.assertIsNone(self.epc_vnf.terminate())
+
+    def test_scale(self):
+        self.assertIsNone(self.epc_vnf.scale())
+
+    def test_collect_kpi(self):
+        self.assertIsNone(self.epc_vnf.collect_kpi())
+
+    def test_start_collect(self):
+        self.assertIsNone(self.epc_vnf.start_collect())
+
+    def test_stop_collect(self):
+        self.assertIsNone(self.epc_vnf.stop_collect())