Merge "Add traffic duration support in test case"
authorAbhijit Sinha <abhijit.sinha@intel.com>
Tue, 30 Oct 2018 10:12:42 +0000 (10:12 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Tue, 30 Oct 2018 10:12:42 +0000 (10:12 +0000)
12 files changed:
INFO
INFO.yaml
ansible/roles/configure_rabbitmq/tasks/main.yml
ansible/roles/configure_rabbitmq/templates/rabbitmq.config.j2 [new file with mode: 0644]
ansible/roles/configure_rabbitmq/templates/user_definitions.json.j2 [new file with mode: 0644]
docs/testing/developer/devguide/devguide.rst
docs/testing/user/userguide/glossary.rst
samples/vnf_samples/nsut/prox/prox_tg_bm.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_ovs-dpdk_l2fwd-2.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_sriov_l2fwd-2.yaml [new file with mode: 0644]
yardstick/benchmark/scenarios/storage/storperf.py
yardstick/network_services/libs/ixia_libs/ixnet/ixnet_api.py

diff --git a/INFO b/INFO
index 63450ce..8b3da27 100644 (file)
--- a/INFO
+++ b/INFO
@@ -22,6 +22,7 @@ chenjiankun1@huawei.com
 rodolfo.alonso.hernandez@intel.com
 emma.l.foley@intel.com
 abhijit.sinha@intel.com
+volodymyrx.mytnyk@intel.com
 
 Link to TSC approval: http://meetbot.opnfv.org/meetings/
 Link to approval of additional submitters:
index a3780da..8776e83 100644 (file)
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -74,6 +74,10 @@ committers:
       email: 'ross.b.brattain@intel.com'
       id: 'rbbratta'
       company: 'intel.com'
+    - name: 'Volodymyr Mytnyk'
+      email: 'volodymyrx.mytnyk@intel.com'
+      id: 'vmytnykx'
+      company: 'intel.com'
 tsc:
     # yamllint disable rule:line-length
     approval: 'http//meetbot.opnfv.org/meetings/'
index 3ad60c1..4ff4222 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ---
+- name: Create rabbitmq configuration
+  template:
+    src: rabbitmq.config.j2
+    dest: /etc/rabbitmq/rabbitmq.config
+
+- name: Define user definitions file
+  template:
+    src: user_definitions.json.j2
+    dest: /etc/rabbitmq/definitions.json
+
 - name: Restart rabbitmq
   service:
     name: rabbitmq-server
 - name: rabbitmqctl start_app
   shell: rabbitmqctl start_app
 
-- name: Configure rabbitmq
-  rabbitmq_user:
-    user: yardstick
-    password: yardstick
-    configure_priv: .*
-    read_priv: .*
-    write_priv: .*
-    state: present
+- name: Enable management plugin
+  shell: rabbitmq-plugins enable rabbitmq_management
diff --git a/ansible/roles/configure_rabbitmq/templates/rabbitmq.config.j2 b/ansible/roles/configure_rabbitmq/templates/rabbitmq.config.j2
new file mode 100644 (file)
index 0000000..8f07edf
--- /dev/null
@@ -0,0 +1,5 @@
+ [\r
+    {rabbitmq_management, [\r
+       {load_definitions, "/etc/rabbitmq/definitions.json"}\r
+    ]}\r
+].
\ No newline at end of file
diff --git a/ansible/roles/configure_rabbitmq/templates/user_definitions.json.j2 b/ansible/roles/configure_rabbitmq/templates/user_definitions.json.j2
new file mode 100644 (file)
index 0000000..831675f
--- /dev/null
@@ -0,0 +1,23 @@
+ {\r
+    "users": [{\r
+        "name": "yardstick",\r
+        "password_hash": "{{  }}",\r
+        "hashing_algorithm": "rabbit_password_hashing_sha256",\r
+        "tags": ""\r
+    }],\r
+    "vhosts": [{\r
+        "name": "/"\r
+    }],\r
+    "permissions": [{\r
+        "user": "yardstick",\r
+        "vhost": "/",\r
+        "configure": ".*",\r
+        "write": ".*",\r
+        "read": ".*"\r
+    }],\r
+    "parameters": [],\r
+    "policies": [],\r
+    "queues": [],\r
+    "exchanges": [],\r
+    "bindings": []\r
+}\r
index 91f2c21..4fe01c1 100755 (executable)
@@ -449,6 +449,10 @@ Verify your patch::
 
 It is used in CI but also by the CLI.
 
+For more details on ``tox`` and tests, please refer to the `Running tests`_
+and `working with tox`_ sections below, which describe the different available
+environments.
+
 Submit the code with Git
 ++++++++++++++++++++++++
 
@@ -566,6 +570,142 @@ The process for backporting is as follows:
 A backported change needs a ``+1`` and a ``+2`` from a committer who didn’t
 propose the change (i.e. minimum 3 people involved).
 
+Development guidelines
+----------------------
+This section provides guidelines and best practices for feature development
+and bug fixing in Yardstick.
+
+In general, bug fixes should be submitted as a single patch.
+
+When developing larger features, all commits on the local topic branch can be
+submitted together, by running ``git review`` on the tip of the branch. This
+creates a chain of related patches in gerrit.
+
+Each commit should contain one logical change and the author should aim for no
+more than 300 lines of code per commit. This helps to make the changes easier
+to review.
+
+Each feature should have the following:
+
+* Feature/bug fix code
+* Unit tests (both positive and negative)
+* Functional tests (optional)
+* Sample testcases (if applicable)
+* Documentation
+* Update to release notes
+
+Coding style
+~~~~~~~~~~~~
+.. _`OpenStack Style Guidelines`: https://docs.openstack.org/hacking/latest/user/hacking.html
+.. _`OPNFV coding guidelines`: https://wiki.opnfv.org/display/DEV/Contribution+Guidelines
+
+Please follow the `OpenStack Style Guidelines`_ for code contributions (the
+section on Internationalization (i18n) Strings is not applicable).
+
+When writing commit message, the `OPNFV coding guidelines`_ on git commit
+message style should also be used.
+
+Running tests
+~~~~~~~~~~~~~
+Once your patch has been submitted, a number of tests will be run by Jenkins
+CI to verify the patch. Before submitting your patch, you should run these
+tests locally. You can do this using ``tox``, which has a number of different
+test environments defined in ``tox.ini``.
+Calling ``tox`` without any additional arguments runs the default set of
+tests (unit tests, functional tests, coverage and pylint).
+
+If some tests are failing, you can save time and select test environments
+individually, by passing one or more of the following command-line options to
+``tox``:
+
+* ``-e py27``: Unit tests using Python 2.7
+* ``-e py3``: Unit tests using Python 3
+* ``-e pep8``: Linter and style checks on updated files
+* ``-e functional``: Functional tests using Python 2.7
+* ``-e functional-py3``: Functional tests using Python 3
+* ``-e coverage``: Code coverage checks
+
+.. note:: You need to stage your changes prior to running coverage for those
+   changes to be checked.
+
+In addition to the tests run by Jenkins (listed above), there are a number of
+other test environments defined.
+
+* ``-e pep8-full``: Linter and style checks are run on the whole repo (not
+  just on updated files)
+* ``-e os-requirements``: Check that the requirements are compatible with
+  OpenStack requirements.
+
+Working with tox
+++++++++++++++++
+.. _virtualenv: https://virtualenv.pypa.io/en/stable/
+
+``tox`` uses `virtualenv`_ to create isolated Python environments to run the
+tests in. The test environments are located at
+``.tox/<environment_name>`` e.g. ``.tox/py27``.
+
+If requirements are changed, you will need to recreate the tox test
+environment to make sure the new requirements are installed. This is done by
+passing the additional ``-r`` command-line option to ``tox``::
+
+    tox -r -e ...
+
+This can also be achieved by deleting the test environments manually before
+running ``tox``::
+
+   rm -rf .tox/<environment_name>
+   rm -rf .tox/py27
+
+Writing unit tests
+~~~~~~~~~~~~~~~~~~
+For each change submitted, a set of unit tests should be submitted, which
+should include both positive and negative testing.
+
+In order to help identify which tests are needed, follow the guidelines below.
+
+* In general, there should be a separate test for each branching point, return
+  value and input set.
+* Negative tests should be written to make sure exceptions are raised and/or
+  handled appropriately.
+
+The following convention should be used for naming tests::
+
+    test_<method_name>_<some_comment>
+
+The comment gives more information on the nature of the test, the side effect
+being checked, or the parameter being modified::
+
+    test_my_method_runtime_error
+    test_my_method_invalid_credentials
+    test_my_method_param1_none
+
+Mocking
++++++++
+The ``mock`` library is used for unit testing to stub out external libraries.
+
+The following conventions are used in Yardstick:
+
+* Use ``mock.patch.object`` instead of ``mock.patch``.
+
+* When naming mocked classes/functions, use ``mock_<class_and_function_name>``
+  e.g. ``mock_subprocess_call``
+
+* Avoid decorating classes with mocks. Apply the mocking in ``setUp()``::
+
+    @mock.patch.object(ssh, 'SSH')
+    class MyClassTestCase(unittest.TestCase):
+
+  should be::
+
+    class MyClassTestCase(unittest.TestCase):
+        def setUp(self):
+            self._mock_ssh = mock.patch.object(ssh, 'SSH')
+            self.mock_ssh = self._mock_ssh.start()
+
+            self.addCleanup(self._stop_mocks)
+
+        def _stop_mocks(self):
+            self._mock_ssh.stop()
 
 Plugins
 -------
index be98aa6..6a15394 100644 (file)
@@ -13,6 +13,11 @@ Glossary
    API
      Application Programming Interface
 
+   Docker
+     Docker provisions and manages containers. Yardstick and many other OPNFV
+     projects are deployed in containers. Docker is required to launch the
+     containerized versions of these projects.
+
    DPI
      Deep Packet Inspection
 
@@ -27,36 +32,80 @@ Glossary
 
    IOPS
      Input/Output Operations Per Second
+     A performance measurement used to benchmark storage devices.
+
+   KPI
+     Key Performance Indicator
+
+   Kubernetes
+     k8s
+     Kubernetes is an open-source container-orchestration system for automating
+     deployment, scaling and management of containerized applications.
+     It is one of the contexts supported in Yardstick.
+
+   NFV
+     Network Function Virtualization
+     NFV is an initiative to take network services which were traditionally run
+     on proprietary, dedicated hardware, and virtualize them to run on general
+     purpose hardware.
+
+   NFVI
+     Network Function Virtualization Infrastructure
+     The servers, routers, switches, etc on which the NFV system runs.
 
    NIC
      Network Interface Controller
 
+   OpenStack
+      OpenStack is a cloud operating system that controls pools of compute,
+      storage, and networking resources. OpenStack is an open source project
+      licensed under the Apache License 2.0.
+
    PBFS
      Packet Based per Flow State
 
+   PROX
+     Packet pROcessing eXecution engine
+
    QoS
      Quality of Service
+     The ability to guarantee certain network or storage requirements to
+     satisfy a Service Level Agreement (SLA) between an application provider
+     and end users.
+     Typically includes performance requirements like networking bandwidth,
+     latency, jitter correction, and reliability as well as storage
+     performance in Input/Output Operations Per Second (IOPS), throttling
+     agreements, and performance expectations at peak load
+
+   SLA
+     Service Level Agreement
+     An SLA is an agreement between a service provider and a customer to
+     provide a certain level of service/performance.
+
+   SR-IOV
+     Single Root IO Virtualization
+     A specification that, when implemented by a physical PCIe
+     device, enables it to appear as multiple separate PCIe devices. This
+     enables multiple virtualized guests to share direct access to the
+     physical device.
+
+   SUT
+     System Under Test
+
+   ToS
+     Type of Service
 
    VLAN
-     Virtual LAN
+     Virtual LAN (Local Area Network)
 
    VM
      Virtual Machine
+     An operating system instance that runs on top of a hypervisor.
+     Multiple VMs can run at the same time on the same physical
+     host.
 
    VNF
      Virtual Network Function
 
    VNFC
      Virtual Network Function Component
-
-   NFVI
-     Network Function Virtualization Infrastructure
-
-   SR-IOV
-     Single Root IO Virtualization
-
-   SUT
-     System Under Test
-
-   ToS
-     Type of Service
diff --git a/samples/vnf_samples/nsut/prox/prox_tg_bm.yaml b/samples/vnf_samples/nsut/prox/prox_tg_bm.yaml
new file mode 100644 (file)
index 0000000..d08cf06
--- /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.
+
+nodes:
+-
+    name: "tg_0"
+    role: TrafficGen
+    ip: 192.168.100.101
+    user: user
+    ssh_port: "22"
+    password: password
+    interfaces:
+        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"
+            dpdk_port_num: 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"
+            dpdk_port_num: 1
+
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_ovs-dpdk_l2fwd-2.yaml b/samples/vnf_samples/nsut/prox/tc_prox_ovs-dpdk_l2fwd-2.yaml
new file mode 100644 (file)
index 0000000..2f5e6ea
--- /dev/null
@@ -0,0 +1,97 @@
+# Copyright (c) 2016-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.
+
+---
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NSPerf
+  traffic_profile: ../../traffic_profiles/prox_binsearch.yaml
+  topology: prox-tg-topology-2.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    interface_speed_gbps: 10
+
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_l2fwd-2.cfg"
+      prox_args:
+        "-t": ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_l2fwd-2.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Duration
+    # we kill after duration, independent of test duration, so set this high
+    duration: 300
+
+contexts:
+   - name: yardstick
+     type: Node
+     file: prox_tg_bm.yaml
+   - name: yardstick
+     type: StandaloneOvsDpdk
+     file: /etc/yardstick/nodes/standalone/host_ovs.yaml
+     vm_deploy: True
+     ovs_properties:
+       version:
+         ovs: 2.8.0
+         dpdk: 17.05.2
+       pmd_threads: 2
+       ram:
+         socket_0: 2048
+         socket_1: 2048
+       queues: 4
+       vpath: "/usr/local"
+     flavor:
+       images: "/var/lib/libvirt/images/yardstick-nsb-image.img"
+       ram: 16384
+       extra_specs:
+         hw:cpu_sockets: 1
+         hw:cpu_cores: 10
+         hw:cpu_threads: 2
+       user: "root"
+       password: ""
+     servers:
+       vnf_0:
+         network_ports:
+           mgmt:
+             cidr: '172.20.2.7/24'
+           xe0:
+             - uplink_0
+           xe1:
+             - downlink_0
+     networks:
+       uplink_0:
+         port_num: 0
+         phy_port: "0000:af:00.0"
+         vpci: "0000:00:07.0"
+         cidr: '152.16.100.10/24'
+         gateway_ip: '152.16.100.20'
+       downlink_0:
+         port_num: 1
+         phy_port: "0000:af:00.1"
+         vpci: "0000:00:08.0"
+         cidr: '152.16.40.10/24'
+         gateway_ip: '152.16.100.20'
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_sriov_l2fwd-2.yaml b/samples/vnf_samples/nsut/prox/tc_prox_sriov_l2fwd-2.yaml
new file mode 100644 (file)
index 0000000..97a3d5a
--- /dev/null
@@ -0,0 +1,85 @@
+# 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.
+
+---
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+  type: NSPerf
+  traffic_profile: ../../traffic_profiles/prox_binsearch.yaml
+  topology: prox-tg-topology-2.yaml
+
+  nodes:
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
+
+  options:
+    interface_speed_gbps: 10
+
+    vnf__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_l2fwd-2.cfg"
+      prox_args:
+        "-t": ""
+
+    tg__0:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_l2fwd-2.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+
+  runner:
+    type: Duration
+    # we kill after duration, independent of test duration, so set this high
+    duration: 300
+
+contexts:
+   - name: yardstick
+     type: Node
+     file: prox_tg_bm.yaml
+   - name: yardstick
+     type: StandaloneSriov
+     file: /etc/yardstick/nodes/standalone/host_sriov.yaml
+     vm_deploy: True
+     flavor:
+       images: "/var/lib/libvirt/images/yardstick-nsb-image.img"
+       ram: 16384
+       extra_specs:
+         hw:cpu_sockets: 1
+         hw:cpu_cores: 10
+         hw:cpu_threads: 2
+       user: ""
+       password: ""
+     servers:
+       vnf_0:
+         network_ports:
+           mgmt:
+             cidr: '1.1.1.61/24'
+           xe0:
+             - uplink_0
+           xe1:
+             - downlink_0
+     networks:
+       uplink_0:
+         phy_port: "0000:05:00.0"
+         vpci: "0000:00:0a.0"
+         cidr: '152.16.100.10/24'
+         gateway_ip: '152.16.100.20'
+       downlink_0:
+         phy_port: "0000:05:00.1"
+         vpci: "0000:00:0b.0"
+         cidr: '152.16.40.10/24'
+         gateway_ip: '152.16.100.20'
index f2fcce6..e4c72dc 100644 (file)
@@ -215,11 +215,20 @@ class StorPerf(base.Scenario):
         #       else:
         #           time.sleep(int(esti_time)/2)
 
-            result_res = requests.get('http://%s:5000/api/v1.0/jobs?id=%s' %
-                                      (self.target, job_id))
+            result_res = requests.get('http://%s:5000/api/v1.0/jobs?type='
+                                      'metadata&id=%s' % (self.target, job_id))
+            result_res_content = jsonutils.loads(result_res.content)
+            if 'report' in result_res_content and \
+                    'steady_state' in result_res_content['report']['details']:
+                res = result_res_content['report']['details']['steady_state']
+                steady_state = res.values()[0]
+                LOG.info("Job %s completed with steady state %s",
+                         job_id, steady_state)
+
+            result_res = requests.get('http://%s:5000/api/v1.0/jobs?'
+                                      'type=status&id=%s' % (self.target, job_id))
             result_res_content = jsonutils.loads(
                 result_res.content)
-
             result.update(result_res_content)
 
     def initialize_disks(self):
index d4f75ba..87e9dbf 100644 (file)
@@ -41,9 +41,6 @@ C_VLAN = 1
 
 ETHER_TYPE_802_1ad = '0x88a8'
 
-IP_VERSION_4_MASK = 24
-IP_VERSION_6_MASK = 64
-
 TRAFFIC_STATUS_STARTED = 'started'
 TRAFFIC_STATUS_STOPPED = 'stopped'
 
@@ -526,9 +523,9 @@ class IxNextgen(object):  # pragma: no cover
                 srcseed = traffic_param['outer_l3']['srcseed']
                 dstseed = traffic_param['outer_l3']['dstseed']
                 srcmask = traffic_param['outer_l3']['srcmask'] \
-                          or IP_VERSION_4_MASK
+                          or ipaddress.IPV4LENGTH
                 dstmask = traffic_param['outer_l3']['dstmask'] \
-                          or IP_VERSION_4_MASK
+                          or ipaddress.IPV4LENGTH
                 if srcip:
                     self._update_ipv4_address(
                         self._get_stack_item(fg_id, PROTO_IPV4)[0],