Add Storperf in CI [work in progress] 75/17875/13
authorJingLu5 <lvjing5@huawei.com>
Mon, 1 Aug 2016 08:13:01 +0000 (16:13 +0800)
committerJingLu5 <lvjing5@huawei.com>
Wed, 3 Aug 2016 00:30:28 +0000 (08:30 +0800)
Add task configration file for TC074_Storperf and update test suite file
Add test case description for TC074_Storperf
Update Dockerfile to add ubuntu image used by Storperf
Update yardstick-verify to load ubuntu image and install Storperf
Modify plugin.py to support local installation

Change-Id: I4de764c7924aac98de6e6a8664f9d5c0b58cf31b
Signed-off-by: JingLu5 <lvjing5@huawei.com>
docs/userguide/opnfv_yardstick_tc074.rst [new file with mode: 0644]
plugin/CI/storperf.yaml [new file with mode: 0644]
tests/ci/docker/yardstick-ci/Dockerfile
tests/ci/yardstick-verify
tests/opnfv/test_cases/opnfv_yardstick_tc074.yaml [new file with mode: 0644]
tests/opnfv/test_suites/opnfv_os-nosdn-nofeature-ha_daily.yaml
yardstick/cmd/commands/plugin.py

diff --git a/docs/userguide/opnfv_yardstick_tc074.rst b/docs/userguide/opnfv_yardstick_tc074.rst
new file mode 100644 (file)
index 0000000..c938f5d
--- /dev/null
@@ -0,0 +1,137 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, Huawei Technologies Co.,Ltd and others.
+
+*************************************
+Yardstick Test Case Description TC074
+*************************************
+
+.. Storperf: https://wiki.opnfv.org/display/storperf/Storperf
+
++-----------------------------------------------------------------------------+
+|Storperf                                                                     |
+|                                                                             |
++--------------+--------------------------------------------------------------+
+|test case id  | OPNFV_YARDSTICK_TC074_Storperf                               |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|metric        | Storage performance                                          |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|test purpose  | Storperf integration with yardstick. The purpose of StorPerf |
+|              | is to provide a tool to measure block and object storage     |
+|              | performance in an NFVI. When complemented with a             |
+|              | characterization of typical VF storage performance           |
+|              | requirements, it can provide pass/fail thresholds for test,  |
+|              | staging, and production NFVI environments.                   |
+|              |                                                              |
+|              | The benchmarks developed for block and object storage will   |
+|              | be sufficiently varied to provide a good preview of expected |
+|              | storage performance behavior for any type of VNF workload.   |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|configuration | file: opnfv_yardstick_tc074.yaml                             |
+|              |                                                              |
+|              | * agent_count: 1 - the number of VMs to be created           |
+|              | * agent_image: "Ubuntu-14.04" - image used for creating VMs  |
+|              | * public_network: "ext-net" - name of public network         |
+|              | * volume_size: 2 - cinder volume size                        |
+|              | * block_sizes: "4096" - data block size                      |
+|              | * queue_depths: "4"                                          |
+|              | * StorPerf_ip: "192.168.200.2"                               |
+|              | * query_interval: 10 - state query interval                  |
+|              | * timeout: 600 - maximum allowed job time                    |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|test tool     | Storperf                                                     |
+|              |                                                              |
+|              | StorPerf is a tool to measure block and object storage       |
+|              | performance in an NFVI.                                      |
+|              |                                                              |
+|              | StorPerf is delivered as a Docker container from             |
+|              | https://hub.docker.com/r/opnfv/storperf/tags/.               |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|references    | Storperf_                                                    |
+|              |                                                              |
+|              | ETSI-NFV-TST001                                              |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|applicability | Test can be configured with different:                       |
+|              |                                                              |
+|              | * agent_count                                                |
+|              | * volume_size                                                |
+|              | * block_sizes                                                |
+|              | * queue_depths                                               |
+|              | * query_interval                                             |
+|              | * timeout                                                    |
+|              | * target=[device or path]                                    |
+|              |   The path to either an attached storage device              |
+|              |   (/dev/vdb, etc) or a directory path  (/opt/storperf) that  |
+|              |   will be used to execute the performance test. In the case  |
+|              |   of a device, the entire device will be used. If not        |
+|              |   specified, the current directory will be used.             |
+|              | * workload=[workload module]                                 |
+|              |   If not specified, the default is to run all workloads. The |
+|              |   workload types are:                                        |
+|              |      - rs: 100% Read, sequential data                        |
+|              |      - ws: 100% Write, sequential data                       |
+|              |      - rr: 100% Read, random access                          |
+|              |      - wr: 100% Write, random access                         |
+|              |      - rw: 70% Read / 30% write, random access               |
+|              | * nossd: Do not perform SSD style preconditioning.           |
+|              | * nowarm:  Do not perform a warmup prior to                  |
+|              |   measurements.                                              |
+|              | * report= [job_id]                                           |
+|              |   Query the status of the supplied job_id and report on      |
+|              |   metrics. If a workload is supplied, will report on only    |
+|              |   that subset.                                               |
+|              |                                                              |
+|              |   There are default values for each above-mentioned option.  |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|pre-test      | If you do not have an Ubuntu 14.04 image in Glance, you will |
+|conditions    | need to add one. A key pair for launching agents is also     |
+|              | required.                                                    |
+|              |                                                              |
+|              | Storperf is required to be installed in the environment.     |
+|              | There are two possible methods for Storperf installation:    |
+|              |     Run container on Jump Host                               |
+|              |     Run container in a VM                                    |
+|              |                                                              |
+|              | Running StorPerf on Jump Host                                |
+|              | Requirements:                                                |
+|              |     - Docker must be installed                               |
+|              |     - Jump Host must have access to the OpenStack Controller |
+|              |       API                                                    |
+|              |     - Jump Host must have internet connectivity for          |
+|              |       downloading docker image                               |
+|              |     - Enough floating IPs must be available to match your    |
+|              |       agent count                                            |
+|              |                                                              |
+|              | Running StorPerf in a VM                                     |
+|              | Requirements:                                                |
+|              |     - VM has docker installed                                |
+|              |     - VM has OpenStack Controller credentials and can        |
+|              |       communicate with the Controller API                    |
+|              |     - VM has internet connectivity for downloading the       |
+|              |       docker image                                           |
+|              |     - Enough floating IPs must be available to match your    |
+|              |       agent count                                            |
+|              |                                                              |
+|              | No POD specific requirements have been identified.           |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|test sequence | description and expected result                              |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|step 1        | The Storperf is installed and Ubuntu 14.04 image is stored   |
+|              | in glance. TC is invoked and logs are produced and stored.   |
+|              |                                                              |
+|              | Result: Logs are stored.                                     |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|test verdict  | None. Storage performance results are fetched and stored.    |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
diff --git a/plugin/CI/storperf.yaml b/plugin/CI/storperf.yaml
new file mode 100644 (file)
index 0000000..4407ddf
--- /dev/null
@@ -0,0 +1,13 @@
+---
+# StorPerf plugin configration file for huawei-pod1
+# Used for integration StorPerf into Yardstick as a plugin
+
+schema: "yardstick:plugin:0.1"
+
+plugins:
+  name: storperf
+
+deployment:
+  ip: local
+  user: root
+  password: root
index cc23073..2d59fd6 100644 (file)
@@ -48,5 +48,6 @@ RUN cd ${YARDSTICK_REPO_DIR} && pip install -r tests/ci/requirements.txt
 RUN cd ${YARDSTICK_REPO_DIR} && pip install .
 
 ADD http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img /home/opnfv/images/
+ADD http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img /home/opnfv/images/
 
 COPY ./exec_tests.sh /usr/local/bin/
index c831935..649eb31 100755 (executable)
@@ -80,7 +80,7 @@ cleanup()
         return
     fi
 
-    for image in $(glance image-list | grep -e cirros-0.3.3 -e yardstick-trusty-server | awk '{print $2}'); do
+    for image in $(glance image-list | grep -e cirros-0.3.3 -e yardstick-trusty-server -e Ubuntu-14.04 | awk '{print $2}'); do
         echo "Deleting image $image..."
         glance image-delete $image || true
     done
@@ -121,6 +121,20 @@ install_yardstick()
     pip install .
 }
 
+install_storperf()
+{
+    # Install Storper on huawei-pod1
+    if [ "$NODE_NAME" == "huawei-pod1" ]; then
+        echo
+        echo "========== Installing storperf =========="
+
+        if ! yardstick plugin install plugin/CI/storperf.yaml; then
+            echo "Install storperf plugin FAILED";
+            exit 1
+        fi
+    fi
+}
+
 build_yardstick_image()
 {
     echo
@@ -174,6 +188,30 @@ load_cirros_image()
     echo "Cirros image id: $CIRROS_IMAGE_ID"
 }
 
+load_ubuntu_image()
+{
+    echo
+    echo "========== Loading ubuntu cloud image =========="
+
+    local ubuntu_image_file=/home/opnfv/images/trusty-server-cloudimg-amd64-disk1.img
+
+    output=$(glance image-create \
+        --name Ubuntu-14.04 \
+        --disk-format qcow2 \
+        --container-format bare \
+        --file $ubuntu_image_file)
+    echo "$output"
+
+    UBUNTU_IMAGE_ID=$(echo "$output" | grep " id " | awk '{print $(NF-1)}')
+
+    if [ -z "$UBUNTU_IMAGE_ID" ]; then
+        echo 'Failed uploading UBUNTU image to cloud'.
+        exit 1
+    fi
+
+    echo "Ubuntu image id: $UBUNTU_IMAGE_ID"
+}
+
 load_yardstick_image()
 {
     echo
@@ -361,8 +399,10 @@ main()
     build_yardstick_image
     load_yardstick_image
     load_cirros_image
+    load_ubuntu_image
     create_nova_flavor
 
+    install_storperf
     run_test
 }
 
diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc074.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc074.yaml
new file mode 100644 (file)
index 0000000..d506ccc
--- /dev/null
@@ -0,0 +1,27 @@
+---
+# Test case for TC074 StorPerf benchmark task config file
+# StorPerf is a tool to measure block and object storage performance in an NFVI
+
+schema: "yardstick:task:0.1"
+{% set public_network = public_network or "ext-net" %}
+{% set StorPerf_ip = StorPerf_ip or "192.168.200.2" %}
+scenarios:
+-
+  type: StorPerf
+  options:
+    agent_count: 1
+    agent_image: "Ubuntu-14.04"
+    public_network: {{public_network}}
+    volume_size: 4
+    block_sizes: "4096"
+    queue_depths: "4"
+    StorPerf_ip: {{StorPerf_ip}}
+    query_interval: 10
+    timeout: 300
+
+  runner:
+    type: Iteration
+    iterations: 1
+
+context:
+  type: Dummy
index 67d6535..c5b59a8 100644 (file)
@@ -64,3 +64,11 @@ test_cases:
     file_name: opnfv_yardstick_tc071.yaml
 -
     file_name: opnfv_yardstick_tc072.yaml
+-
+    file_name: opnfv_yardstick_tc074.yaml
+    constraint:
+        installer: compass
+        pod: huawei-pod1
+    task_args:
+        huawei-pod1: '{"public_network": "ext-net",
+        "StorPerf_ip": "192.168.200.2"}'
index 8e3ddb5..0ab24fc 100644 (file)
@@ -9,6 +9,7 @@
 
 """ Handler for yardstick command 'plugin' """
 
+import os
 import sys
 import yaml
 import time
@@ -80,12 +81,20 @@ class PluginCommands(object):
 
         deployment_user = deployment.get("user")
         deployment_ip = deployment.get("ip")
-
         deployment_password = deployment.get("password")
-        LOG.debug("user:%s, host:%s", deployment_user, deployment_ip)
-        self.client = ssh.SSH(deployment_user, deployment_ip,
-                              password=deployment_password)
-        self.client.wait(timeout=600)
+
+        if deployment_ip == "local":
+            installer_ip = os.environ.get("INSTALLER_IP", None)
+
+            LOG.debug("user:%s, host:%s", deployment_user, installer_ip)
+            self.client = ssh.SSH(deployment_user, installer_ip,
+                                  password=deployment_password)
+            self.client.wait(timeout=600)
+        else:
+            LOG.debug("user:%s, host:%s", deployment_user, deployment_ip)
+            self.client = ssh.SSH(deployment_user, deployment_ip,
+                                  password=deployment_password)
+            self.client.wait(timeout=600)
 
         # copy script to host
         cmd = "cat > ~/%s.sh" % plugin_name
@@ -99,12 +108,20 @@ class PluginCommands(object):
 
         deployment_user = deployment.get("user")
         deployment_ip = deployment.get("ip")
-
         deployment_password = deployment.get("password")
-        LOG.debug("user:%s, host:%s", deployment_user, deployment_ip)
-        self.client = ssh.SSH(deployment_user, deployment_ip,
-                              password=deployment_password)
-        self.client.wait(timeout=600)
+
+        if deployment_ip == "local":
+            installer_ip = os.environ.get("INSTALLER_IP", None)
+
+            LOG.debug("user:%s, host:%s", deployment_user, installer_ip)
+            self.client = ssh.SSH(deployment_user, installer_ip,
+                                  password=deployment_password)
+            self.client.wait(timeout=600)
+        else:
+            LOG.debug("user:%s, host:%s", deployment_user, deployment_ip)
+            self.client = ssh.SSH(deployment_user, deployment_ip,
+                                  password=deployment_password)
+            self.client.wait(timeout=600)
 
         # copy script to host
         cmd = "cat > ~/%s.sh" % plugin_name