aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docker/Dockerfile24
-rw-r--r--docker/Dockerfile.aarch64.patch59
-rw-r--r--docker/features/testcases.yaml13
-rw-r--r--docker/smoke/testcases.yaml2
-rw-r--r--docker/thirdparty-requirements.txt1
-rw-r--r--docker/vnf/Dockerfile12
-rw-r--r--docker/vnf/hooks/post_checkout6
-rw-r--r--docker/vnf/testcases.yaml49
-rw-r--r--docs/release/release-notes/functest-release.rst2
-rw-r--r--docs/results/danube/3.0/apex.html1424
-rw-r--r--docs/results/danube/3.0/compass.html434
-rw-r--r--docs/results/danube/3.0/fuel.html1448
-rw-r--r--docs/results/danube/3.0/joid.html407
-rw-r--r--docs/results/danube/3.0/scenario_history.txt3855
-rw-r--r--docs/results/danube/3.0/validated_scenario_history.txt745
-rw-r--r--docs/testing/developer/devguide/index.rst976
-rw-r--r--docs/testing/user/configguide/ci.rst50
-rw-r--r--docs/testing/user/configguide/configguide.rst350
-rw-r--r--docs/testing/user/configguide/index.rst167
-rw-r--r--docs/testing/user/configguide/prerequisites.rst104
-rw-r--r--docs/testing/user/userguide/index.rst601
-rw-r--r--docs/testing/user/userguide/reporting.rst90
-rw-r--r--docs/testing/user/userguide/runfunctest.rst512
-rw-r--r--docs/testing/user/userguide/test_details.rst539
-rw-r--r--docs/testing/user/userguide/test_overview.rst (renamed from docs/testing/user/userguide/introduction.rst)19
-rw-r--r--docs/testing/user/userguide/test_results.rst50
-rw-r--r--functest/api/__init__.py (renamed from functest/opnfv_tests/vnf/aaa/__init__.py)0
-rw-r--r--functest/api/base.py66
-rw-r--r--functest/api/common/__init__.py0
-rw-r--r--functest/api/common/api_utils.py101
-rw-r--r--functest/api/common/thread.py52
-rw-r--r--functest/api/database/__init__.py0
-rw-r--r--functest/api/database/db.py26
-rw-r--r--functest/api/database/v1/__init__.py0
-rw-r--r--functest/api/database/v1/handlers.py43
-rw-r--r--functest/api/database/v1/models.py33
-rw-r--r--functest/api/resources/__init__.py0
-rw-r--r--functest/api/resources/v1/__init__.py0
-rw-r--r--functest/api/resources/v1/creds.py67
-rw-r--r--functest/api/resources/v1/envs.py40
-rw-r--r--functest/api/resources/v1/tasks.py58
-rw-r--r--functest/api/resources/v1/testcases.py115
-rw-r--r--functest/api/resources/v1/tiers.py67
-rw-r--r--functest/api/server.py103
-rw-r--r--functest/api/urls.py66
-rw-r--r--functest/ci/config_aarch64_patch.yaml8
-rw-r--r--functest/ci/config_functest.yaml52
-rw-r--r--functest/ci/config_patch.yaml3
-rw-r--r--functest/ci/download_images.sh79
-rw-r--r--functest/ci/logging.ini7
-rw-r--r--functest/ci/prepare_env.py2
-rw-r--r--functest/ci/run_tests.py26
-rw-r--r--functest/ci/testcases.yaml67
-rw-r--r--functest/cli/commands/cli_env.py37
-rw-r--r--functest/cli/commands/cli_os.py19
-rw-r--r--functest/cli/commands/cli_testcase.py27
-rw-r--r--functest/cli/commands/cli_tier.py44
-rw-r--r--functest/energy/energy.py11
-rw-r--r--functest/opnfv_tests/openstack/rally/blacklist.txt32
-rw-r--r--functest/opnfv_tests/openstack/rally/rally.py4
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml458
-rw-r--r--functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml247
-rw-r--r--functest/opnfv_tests/openstack/rally/task.yaml4
-rw-r--r--functest/opnfv_tests/openstack/refstack_client/refstack_client.py59
-rw-r--r--functest/opnfv_tests/openstack/refstack_client/tempest_conf.py20
-rw-r--r--functest/opnfv_tests/openstack/snaps/snaps_test_runner.py7
-rw-r--r--functest/opnfv_tests/openstack/tempest/conf_utils.py253
-rw-r--r--functest/opnfv_tests/openstack/tempest/tempest.py249
-rw-r--r--functest/opnfv_tests/openstack/vping/vping_base.py35
-rw-r--r--functest/opnfv_tests/vnf/aaa/aaa.py41
-rw-r--r--functest/opnfv_tests/vnf/ims/clearwater_ims_base.py22
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims.py8
-rw-r--r--functest/opnfv_tests/vnf/ims/cloudify_ims.yaml4
-rw-r--r--functest/opnfv_tests/vnf/ims/opera_ims.py131
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestra.yaml61
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py682
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestra_ims.yaml45
-rw-r--r--functest/opnfv_tests/vnf/ims/orchestra_openims.py (renamed from functest/opnfv_tests/vnf/ims/orchestra_ims.py)246
-rw-r--r--functest/tests/unit/openstack/refstack_client/test_refstack_client.py56
-rw-r--r--functest/tests/unit/openstack/tempest/test_conf_utils.py245
-rw-r--r--functest/tests/unit/openstack/tempest/test_tempest.py26
-rw-r--r--functest/tests/unit/openstack/vping/test_vping.py6
-rw-r--r--functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py227
-rw-r--r--functest/tests/unit/vnf/ims/test_orchestra_openims.py (renamed from functest/tests/unit/vnf/ims/test_orchestra_ims.py)61
-rw-r--r--functest/utils/env.py3
-rw-r--r--functest/utils/functest_utils.py8
-rw-r--r--functest/utils/openstack_utils.py68
-rw-r--r--requirements.txt3
-rw-r--r--setup.cfg1
-rw-r--r--tox.ini12
-rw-r--r--upper-constraints.txt2
91 files changed, 13334 insertions, 3150 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 910be8396..0e896d6d2 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -16,7 +16,6 @@ ARG BRANCH=master
ARG RALLY_TAG=0.8.1
ARG ODL_TAG=release/carbon
ARG OPENSTACK_TAG=stable/ocata
-ARG KINGBIRD_TAG=1.1.0
ARG VIMS_TAG=stable
ARG VROUTER_TAG=stable
ARG REPOS_DIR=/home/opnfv/repos
@@ -39,6 +38,7 @@ build-essential \
bundler \
crudini \
curl \
+dnsmasq \
gcc \
git \
libffi-dev \
@@ -52,7 +52,9 @@ python-dev \
python-mock \
python-pip \
postgresql \
-ruby1.9.1-dev \
+ruby \
+ruby-dev \
+ruby-bundler \
ssh \
sshpass \
wget \
@@ -90,13 +92,10 @@ RUN git clone --depth 1 -b $BRANCH https://gerrit.opnfv.org/gerrit/fds /src/fds
# other repositories
RUN git clone --depth 1 -b $ODL_TAG https://git.opendaylight.org/gerrit/p/integration/test.git /src/odl_test
-RUN git clone --depth 1 -b $VIMS_TAG https://github.com/boucherv-orange/clearwater-live-test ${REPOS_VNFS_DIR}/vims-test
+RUN git clone --depth 1 -b $VIMS_TAG https://github.com/boucherv-orange/clearwater-live-test /src/vims-test
RUN git clone --depth 1 -b $VROUTER_TAG https://github.com/oolorg/opnfv-functest-vrouter.git ${REPOS_VNFS_DIR}/vrouter
RUN git clone --depth 1 https://github.com/wuwenbin2/OnosSystemTest.git ${REPOS_DIR}/onos
-RUN gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
-RUN curl -L https://get.rvm.io | bash -s stable
-
# SFC integration
RUN /bin/bash -c ". /usr/local/lib/python2.7/dist-packages/sfc/tests/functest/setup_scripts/tacker_client_install.sh"
@@ -104,18 +103,7 @@ RUN /bin/bash -c ". /usr/local/lib/python2.7/dist-packages/sfc/tests/functest/se
RUN ln -s /src/tempest /src/refstack-client/.tempest \
&& virtualenv --system-site-packages /src/tempest/.venv
-RUN /bin/bash -c ". /etc/profile.d/rvm.sh \
- && cd ${REPOS_VNFS_DIR}/vims-test \
- && rvm autolibs enable"
-RUN /bin/bash -c ". /etc/profile.d/rvm.sh \
- && cd ${REPOS_VNFS_DIR}/vims-test \
- && rvm install 1.9.3"
-RUN /bin/bash -c ". /etc/profile.d/rvm.sh \
- && cd ${REPOS_VNFS_DIR}/vims-test \
- && rvm use 1.9.3"
-RUN /bin/bash -c ". /etc/profile.d/rvm.sh \
- && cd ${REPOS_VNFS_DIR}/vims-test \
- && bundle install"
+RUN cd /src/vims-test && bundle install
RUN sh -c 'curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -' \
&& sudo apt-get install -y nodejs \
diff --git a/docker/Dockerfile.aarch64.patch b/docker/Dockerfile.aarch64.patch
index 1b553b1c5..1257206d2 100644
--- a/docker/Dockerfile.aarch64.patch
+++ b/docker/Dockerfile.aarch64.patch
@@ -1,39 +1,25 @@
-From: Delia Popescu <delia.popescu@enea.com>
-Date: Thu, 20 Jul 2017 17:36:13 +0300
-Subject: [PATCH] Modified Dockerfile.aarch to a patch
-
-Docker image for functest on ARM was build using a different Dockerfile.
-Now the ARM Dockerfile is created with a patch,
-in order to avoid modifying both files.
-This Dockerfile.aarch64.patch is applied by opnfv-docker.sh from releng project.
-
-Signed-off-by: Delia Popescu <delia.popescu@enea.com>
----
- docker/Dockerfile | 15 +++++++++------
- 1 file changed, 9 insertions(+), 6 deletions(-)
-
diff --git a/docker/Dockerfile b/docker/Dockerfile
-index 924da68..dd87e6c 100644
+index 0e896d6d..2a8f2b66 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -1,5 +1,5 @@
########################################
-# Docker container for FUNCTEST
-+# Aarch64 Docker container for FUNCTEST
++# Aarch64 Docker container for FUNCTEST
########################################
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
@@ -7,9 +7,9 @@
# http://www.apache.org/licenses/LICENSE-2.0
#
-
+
-FROM ubuntu:14.04
-MAINTAINER Jose Lausuch <jose.lausuch@ericsson.com>
-LABEL version="0.1" description="OPNFV Functest Docker container"
+FROM aarch64/ubuntu:14.04
+MAINTAINER Armband team <armband@enea.com>
+LABEL version="0.1" description="OPNFV Functest Aarch64 Docker container"
-
+
# Environment variables
ARG BRANCH=master
@@ -43,6 +43,7 @@ gcc \
@@ -44,18 +30,33 @@ index 924da68..dd87e6c 100644
libpq-dev \
libssl-dev \
libxml2-dev \
-@@ -117,11 +118,13 @@ RUN /bin/bash -c ". /etc/profile.d/rvm.sh \
- && cd ${REPOS_VNFS_DIR}/vims-test \
- && rvm use 1.9.3"
- RUN /bin/bash -c ". /etc/profile.d/rvm.sh \
-+ && gem install bundler \
- && cd ${REPOS_VNFS_DIR}/vims-test \
-+ && bundle config build.nokogiri --use-system-libraries \
- && bundle install"
-
+@@ -103,10 +104,26 @@ RUN /bin/bash -c ". /usr/local/lib/python2.7/dist-packages/sfc/tests/functest/se
+ RUN ln -s /src/tempest /src/refstack-client/.tempest \
+ && virtualenv --system-site-packages /src/tempest/.venv
+
+-RUN cd /src/vims-test && bundle install
++RUN gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
++RUN curl -L https://get.rvm.io | bash -s stable
+
-RUN sh -c 'curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -' \
- && sudo apt-get install -y nodejs \
++RUN /bin/bash -c ". /etc/profile.d/rvm.sh \
++ && cd /src/vims-test \
++ && rvm autolibs enable"
++RUN /bin/bash -c ". /etc/profile.d/rvm.sh \
++ && cd /src/vims-test \
++ && rvm install 1.9.3"
++RUN /bin/bash -c ". /etc/profile.d/rvm.sh \
++ && cd /src/vims-test \
++ && rvm use 1.9.3"
++RUN /bin/bash -c ". /etc/profile.d/rvm.sh \
++ && gem install bundler \
++ && cd /src/vims-test \
++ && bundle config build.nokogiri --use-system-libraries \
++ && bundle install"
++
+RUN sh -c 'wget -qO- https://nodejs.org/dist/v4.7.2/node-v4.7.2-linux-arm64.tar.gz | \
+ tar -xz -C /usr/local --exclude=CHANGELOG.md --exclude=LICENSE --exclude=README.md --strip-components 1 '\
- && cd ${REPOS_DIR}/promise && sudo npm -g install npm@latest \
- && cd ${REPOS_DIR}/promise/source && npm install
+ && cd /src/promise && sudo npm -g install npm@latest \
+ && cd /src/promise/source && npm install
+
diff --git a/docker/features/testcases.yaml b/docker/features/testcases.yaml
index 052bd47f3..69da9350e 100644
--- a/docker/features/testcases.yaml
+++ b/docker/features/testcases.yaml
@@ -92,18 +92,17 @@ tiers:
-
case_name: barometercollectd
- enabled: false
+ enabled: true
project_name: barometer
criteria: 100
blocking: false
description: >-
- Test suite for the Barometer project. Separate tests verify the
- proper configuration and functionality of the following
- collectd plugins Ceilometer, Hugepages, Memory RAS (mcelog),
- and OVS Events
+ Test suite for the Barometer project. Separate tests verify
+ the proper configuration and basic functionality of all the
+ collectd plugins as described in the Project Release Plan
dependencies:
- installer: 'fuel'
- scenario: 'kvm_ovs_dpdk_bar'
+ installer: 'apex'
+ scenario: 'bar'
run:
module: 'baro_tests.barometer'
class: 'BarometerCollectd'
diff --git a/docker/smoke/testcases.yaml b/docker/smoke/testcases.yaml
index 772196a00..b3d4f3b96 100644
--- a/docker/smoke/testcases.yaml
+++ b/docker/smoke/testcases.yaml
@@ -88,7 +88,7 @@ tiers:
case_name: odl
project_name: functest
criteria: 100
- blocking: true
+ blocking: false
description: >-
Test Suite for the OpenDaylight SDN Controller. It
integrates some test suites from upstream using
diff --git a/docker/thirdparty-requirements.txt b/docker/thirdparty-requirements.txt
index 84521f233..773af7588 100644
--- a/docker/thirdparty-requirements.txt
+++ b/docker/thirdparty-requirements.txt
@@ -1,6 +1,5 @@
baro_tests
sdnvpn
-opera
securityscanning
sfc
promise
diff --git a/docker/vnf/Dockerfile b/docker/vnf/Dockerfile
new file mode 100644
index 000000000..d4f18c476
--- /dev/null
+++ b/docker/vnf/Dockerfile
@@ -0,0 +1,12 @@
+FROM opnfv/functest-core
+
+ARG VIMS_TAG=stable
+
+RUN apk --no-cache add --update \
+ ruby ruby-dev ruby-bundler ruby-irb ruby-rdoc dnsmasq \
+ procps git g++ make libxslt-dev libxml2-dev zlib-dev libffi-dev && \
+ git clone --depth 1 -b $VIMS_TAG https://github.com/boucherv-orange/clearwater-live-test /src/vims-test && \
+ rm -r /src/vims-test/.git && \
+ cd /src/vims-test && bundle config build.nokogiri --use-system-libraries && bundle install --system
+COPY testcases.yaml /usr/lib/python2.7/site-packages/functest/ci/testcases.yaml
+CMD ["bash","-c","prepare_env start && run_tests -t all"]
diff --git a/docker/vnf/hooks/post_checkout b/docker/vnf/hooks/post_checkout
new file mode 100644
index 000000000..20a6d4b95
--- /dev/null
+++ b/docker/vnf/hooks/post_checkout
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+from="${DOCKER_REPO%/*}/functest-core"
+sed -i "s|^FROM.*$|FROM ${from}|" Dockerfile
+
+exit $?
diff --git a/docker/vnf/testcases.yaml b/docker/vnf/testcases.yaml
new file mode 100644
index 000000000..9f6533930
--- /dev/null
+++ b/docker/vnf/testcases.yaml
@@ -0,0 +1,49 @@
+tiers:
+ -
+ name: vnf
+ order: 4
+ ci_loop: '(daily)|(weekly)'
+ description : >-
+ Collection of VNF test cases.
+ testcases:
+ -
+ case_name: cloudify_ims
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ This test case deploys an OpenSource vIMS solution from Clearwater
+ using the Cloudify orchestrator. It also runs some signaling traffic.
+ dependencies:
+ installer: ''
+ scenario: 'os-nosdn-nofeature-ha'
+ run:
+ module: 'functest.opnfv_tests.vnf.ims.cloudify_ims'
+ class: 'CloudifyIms'
+ -
+ case_name: orchestra_openims
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ OpenIMS VNF deployment with Open Baton (Orchestra)
+ dependencies:
+ installer: ''
+ scenario: 'os-nosdn-nofeature-ha'
+ run:
+ module: 'functest.opnfv_tests.vnf.ims.orchestra_openims'
+ class: 'OpenImsVnf'
+
+ -
+ case_name: orchestra_clearwaterims
+ project_name: functest
+ criteria: 100
+ blocking: false
+ description: >-
+ ClearwaterIMS VNF deployment with Open Baton (Orchestra)
+ dependencies:
+ installer: ''
+ scenario: 'os-nosdn-nofeature-ha'
+ run:
+ module: 'functest.opnfv_tests.vnf.ims.orchestra_clearwaterims'
+ class: 'ClearwaterImsVnf'
diff --git a/docs/release/release-notes/functest-release.rst b/docs/release/release-notes/functest-release.rst
index 02d99c96d..602861579 100644
--- a/docs/release/release-notes/functest-release.rst
+++ b/docs/release/release-notes/functest-release.rst
@@ -551,4 +551,4 @@ Useful links
.. _`joid-res-4`: http://testresults.opnfv.org/test/api/v1/results?build_tag=jenkins-functest-joid-baremetal-daily-danube-301
-.. _`joid-res-5`: http://testresults.opnfv.org/test/api/v1/results?build_tag=jenkins-functest-joid-baremetal-daily-danube-291
+.. _`joid-res-5`: http://testresults.opnfv.org/test/api/v1/results?build_tag=jenkins-functest-joid-baremetal-daily-danube-291
diff --git a/docs/results/danube/3.0/apex.html b/docs/results/danube/3.0/apex.html
new file mode 100644
index 000000000..2a906b691
--- /dev/null
+++ b/docs/results/danube/3.0/apex.html
@@ -0,0 +1,1424 @@
+ <html>
+ <head>
+ <meta charset="utf-8">
+
+ <!-- Bootstrap core CSS -->
+ <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
+ <link href="../../js/default.css" rel="stylesheet">
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+ <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
+ <script type="text/javascript" src="http://d3js.org/d3.v2.min.js"></script>
+ <script type="text/javascript" src="../../js/gauge.js"></script>
+ <script type="text/javascript" src="../../js/trend.js"></script>
+ <script>
+ function onDocumentReady() {
+ // Gauge management
+ var gaugeScenario1 = gauge('#gaugeScenario1');var gaugeScenario2 = gauge('#gaugeScenario2');var gaugeScenario3 = gauge('#gaugeScenario3');var gaugeScenario4 = gauge('#gaugeScenario4');var gaugeScenario5 = gauge('#gaugeScenario5');var gaugeScenario6 = gauge('#gaugeScenario6');var gaugeScenario7 = gauge('#gaugeScenario7');var gaugeScenario8 = gauge('#gaugeScenario8');var gaugeScenario9 = gauge('#gaugeScenario9');var gaugeScenario10 = gauge('#gaugeScenario10');var gaugeScenario11 = gauge('#gaugeScenario11');var gaugeScenario12 = gauge('#gaugeScenario12');var gaugeScenario13 = gauge('#gaugeScenario13');var gaugeScenario14 = gauge('#gaugeScenario14');var gaugeScenario15 = gauge('#gaugeScenario15');var gaugeScenario16 = gauge('#gaugeScenario16');var gaugeScenario17 = gauge('#gaugeScenario17');var gaugeScenario18 = gauge('#gaugeScenario18');var gaugeScenario19 = gauge('#gaugeScenario19');var gaugeScenario20 = gauge('#gaugeScenario20');
+
+ // assign success rate to the gauge
+ function updateReadings() {
+ gaugeScenario1.update(33.3333333333);gaugeScenario2.update(96.2962962963);gaugeScenario3.update(60.6060606061);gaugeScenario4.update(33.3333333333);gaugeScenario5.update(13.3333333333);gaugeScenario6.update(66.6666666667);gaugeScenario7.update(30.0);gaugeScenario8.update(72.7272727273);gaugeScenario9.update(66.6666666667);gaugeScenario10.update(53.3333333333);gaugeScenario11.update(75.7575757576);gaugeScenario12.update(53.3333333333);gaugeScenario13.update(92.5925925926);gaugeScenario14.update(54.5454545455);gaugeScenario15.update(13.3333333333);gaugeScenario16.update(13.3333333333);gaugeScenario17.update(20.0);gaugeScenario18.update(66.6666666667);gaugeScenario19.update(66.6666666667);gaugeScenario20.update(60.0);
+ }
+ updateReadings();
+ }
+
+ // trend line management
+ d3.csv("./scenario_history.txt", function(data) {
+ // ***************************************
+ // Create the trend line
+ // for scenario os-nosdn-kvm-noha
+ // Filter results
+ var trend1 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-kvm-noha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend1.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg1",trend1)
+ // ****************************************// for scenario os-nosdn-fdio-noha
+ // Filter results
+ var trend2 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-fdio-noha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend2.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg2",trend2)
+ // ****************************************// for scenario os-odl-gluon-noha
+ // Filter results
+ var trend3 = data.filter(function(row) {
+ return row["scenario"]=="os-odl-gluon-noha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend3.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg3",trend3)
+ // ****************************************// for scenario os-odl_l3-fdio_dvr-noha
+ // Filter results
+ var trend4 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l3-fdio_dvr-noha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend4.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg4",trend4)
+ // ****************************************// for scenario os-nosdn-ovs-noha
+ // Filter results
+ var trend5 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-ovs-noha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend5.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg5",trend5)
+ // ****************************************// for scenario os-nosdn-nofeature-noha
+ // Filter results
+ var trend6 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-nofeature-noha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend6.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg6",trend6)
+ // ****************************************// for scenario os-ovn-nofeature-noha
+ // Filter results
+ var trend7 = data.filter(function(row) {
+ return row["scenario"]=="os-ovn-nofeature-noha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend7.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg7",trend7)
+ // ****************************************// for scenario os-odl_l2-fdio-noha
+ // Filter results
+ var trend8 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l2-fdio-noha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend8.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg8",trend8)
+ // ****************************************// for scenario os-odl_l3-fdio-noha
+ // Filter results
+ var trend9 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l3-fdio-noha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend9.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg9",trend9)
+ // ****************************************// for scenario os-odl_l3-nofeature-ha
+ // Filter results
+ var trend10 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l3-nofeature-ha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend10.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg10",trend10)
+ // ****************************************// for scenario os-odl_l2-fdio-ha
+ // Filter results
+ var trend11 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l2-fdio-ha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend11.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg11",trend11)
+ // ****************************************// for scenario os-odl_l3-nofeature-noha
+ // Filter results
+ var trend12 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l3-nofeature-noha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend12.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg12",trend12)
+ // ****************************************// for scenario os-nosdn-fdio-ha
+ // Filter results
+ var trend13 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-fdio-ha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend13.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg13",trend13)
+ // ****************************************// for scenario os-odl-bgpvpn-ha
+ // Filter results
+ var trend14 = data.filter(function(row) {
+ return row["scenario"]=="os-odl-bgpvpn-ha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend14.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg14",trend14)
+ // ****************************************// for scenario os-odl_l3-ovs-ha
+ // Filter results
+ var trend15 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l3-ovs-ha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend15.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg15",trend15)
+ // ****************************************// for scenario os-nosdn-ovs-ha
+ // Filter results
+ var trend16 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-ovs-ha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend16.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg16",trend16)
+ // ****************************************// for scenario os-odl_l3-ovs-noha
+ // Filter results
+ var trend17 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l3-ovs-noha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend17.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg17",trend17)
+ // ****************************************// for scenario os-nosdn-kvm-ha
+ // Filter results
+ var trend18 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-kvm-ha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend18.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg18",trend18)
+ // ****************************************// for scenario os-nosdn-nofeature-ha
+ // Filter results
+ var trend19 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-nofeature-ha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend19.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg19",trend19)
+ // ****************************************// for scenario os-odl_l3-fdio-ha
+ // Filter results
+ var trend20 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l3-fdio-ha" && row["installer"]=="apex";
+ })
+ // Parse the date
+ trend20.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg20",trend20)
+ // ****************************************
+ });
+ if ( !window.isLoaded ) {
+ window.addEventListener("load", function() {
+ onDocumentReady();
+ }, false);
+ } else {
+ onDocumentReady();
+ }
+</script>
+<script type="text/javascript">
+$(document).ready(function (){
+ $(".btn-more").click(function() {
+ $(this).hide();
+ $(this).parent().find(".panel-default").show();
+ });
+})
+</script>
+
+ </head>
+ <body>
+ <div class="container">
+ <div class="masthead">
+ <h3 class="text-muted">Functest status page (danube 3.0, 2017-07-13 01:45)</h3>
+ <nav>
+ <ul class="nav nav-justified">
+ <li class="active"><a href="http://testresults.opnfv.org/reporting/index.html">Home</a></li>
+ <li><a href="apex.html">Apex</a></li>
+ <li><a href="compass.html">Compass</a></li>
+ <li><a href="fuel.html">Fuel</a></li>
+ <li><a href="joid.html">Joid</a></li>
+ </ul>
+ </nav>
+ </div>
+<div class="row">
+ <div class="col-md-1"></div>
+ <div class="col-md-10">
+ <div class="page-header">
+ <h2>apex</h2>
+ </div>
+
+ <div class="scenario-overview">
+ <div class="panel-heading"><h4><b>List of Danube 3.0 scenarios (4-14/7/2017) </b></h4></div>
+ <table class="table">
+ <tr>
+ <th width="40%">Scenario</th>
+ <th width="20%">Status</th>
+ <th width="20%">Trend</th>
+ <th width="10%">Score</th>
+ <th width="10%">Iteration</th>
+ </tr>
+ <tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/434/console>os-nosdn-kvm-noha</a></td>
+ <td><div id="gaugeScenario1"></div></td>
+ <td><div id="trend_svg1"></div></td>
+ <td>10/30</td>
+ <td>1</td>
+ </tr><tr class="tr-ok">
+ <td><a href=http://testresultS.opnfv.org/reporting>os-nosdn-fdio-noha</a></td>
+ <td><div id="gaugeScenario2"></div></td>
+ <td><div id="trend_svg2"></div></td>
+ <td>26/27</td>
+ <td>13</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/450/console>os-odl-gluon-noha</a></td>
+ <td><div id="gaugeScenario3"></div></td>
+ <td><div id="trend_svg3"></div></td>
+ <td>20/33</td>
+ <td>3</td>
+ </tr><tr class="tr-ok">
+ <td><a href=http://testresultS.opnfv.org/reporting>os-odl_l3-fdio_dvr-noha</a></td>
+ <td><div id="gaugeScenario4"></div></td>
+ <td><div id="trend_svg4"></div></td>
+ <td>10/30</td>
+ <td>3</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/457/console>os-nosdn-ovs-noha</a></td>
+ <td><div id="gaugeScenario5"></div></td>
+ <td><div id="trend_svg5"></div></td>
+ <td>4/30</td>
+ <td>3</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/428/console>os-nosdn-nofeature-noha</a></td>
+ <td><div id="gaugeScenario6"></div></td>
+ <td><div id="trend_svg6"></div></td>
+ <td>20/30</td>
+ <td>3</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/453/console>os-ovn-nofeature-noha</a></td>
+ <td><div id="gaugeScenario7"></div></td>
+ <td><div id="trend_svg7"></div></td>
+ <td>9/30</td>
+ <td>4</td>
+ </tr><tr class="tr-ok">
+ <td><a href=http://testresultS.opnfv.org/reporting>os-odl_l2-fdio-noha</a></td>
+ <td><div id="gaugeScenario8"></div></td>
+ <td><div id="trend_svg8"></div></td>
+ <td>24/33</td>
+ <td>5</td>
+ </tr><tr class="tr-ok">
+ <td><a href=http://testresultS.opnfv.org/reporting>os-odl_l3-fdio-noha</a></td>
+ <td><div id="gaugeScenario9"></div></td>
+ <td><div id="trend_svg9"></div></td>
+ <td>20/30</td>
+ <td>6</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/466/console>os-odl_l3-nofeature-ha</a></td>
+ <td><div id="gaugeScenario10"></div></td>
+ <td><div id="trend_svg10"></div></td>
+ <td>16/30</td>
+ <td>3</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/485/console>os-odl_l2-fdio-ha</a></td>
+ <td><div id="gaugeScenario11"></div></td>
+ <td><div id="trend_svg11"></div></td>
+ <td>25/33</td>
+ <td>9</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/494/console>os-odl_l3-nofeature-noha</a></td>
+ <td><div id="gaugeScenario12"></div></td>
+ <td><div id="trend_svg12"></div></td>
+ <td>16/30</td>
+ <td>3</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/491/console>os-nosdn-fdio-ha</a></td>
+ <td><div id="gaugeScenario13"></div></td>
+ <td><div id="trend_svg13"></div></td>
+ <td>25/27</td>
+ <td>14</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/449/console>os-odl-bgpvpn-ha</a></td>
+ <td><div id="gaugeScenario14"></div></td>
+ <td><div id="trend_svg14"></div></td>
+ <td>18/33</td>
+ <td>2</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/468/console>os-odl_l3-ovs-ha</a></td>
+ <td><div id="gaugeScenario15"></div></td>
+ <td><div id="trend_svg15"></div></td>
+ <td>4/30</td>
+ <td>2</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/484/console>os-nosdn-ovs-ha</a></td>
+ <td><div id="gaugeScenario16"></div></td>
+ <td><div id="trend_svg16"></div></td>
+ <td>4/30</td>
+ <td>3</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/486/console>os-odl_l3-ovs-noha</a></td>
+ <td><div id="gaugeScenario17"></div></td>
+ <td><div id="trend_svg17"></div></td>
+ <td>6/30</td>
+ <td>4</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/461/console>os-nosdn-kvm-ha</a></td>
+ <td><div id="gaugeScenario18"></div></td>
+ <td><div id="trend_svg18"></div></td>
+ <td>20/30</td>
+ <td>2</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-apex-baremetal-daily-danube/455/console>os-nosdn-nofeature-ha</a></td>
+ <td><div id="gaugeScenario19"></div></td>
+ <td><div id="trend_svg19"></div></td>
+ <td>20/30</td>
+ <td>3</td>
+ </tr><tr class="tr-ok">
+ <td><a href=http://testresultS.opnfv.org/reporting>os-odl_l3-fdio-ha</a></td>
+ <td><div id="gaugeScenario20"></div></td>
+ <td><div id="trend_svg20"></div></td>
+ <td>18/30</td>
+ <td>3</td>
+ </tr>
+ </table>
+ </div>
+
+
+ <div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-kvm-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-fdio-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl-gluon-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Netready
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l3-fdio_dvr-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ FDS
+
+ </th><th>
+ SNAPS
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-ovs-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-nofeature-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-ovn-nofeature-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l2-fdio-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ FDS
+
+ </th><th>
+ SNAPS
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l3-fdio-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ FDS
+
+ </th><th>
+ SNAPS
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l3-nofeature-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l2-fdio-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ FDS
+
+ </th><th>
+ SNAPS
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-few-clouds.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l3-nofeature-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-fdio-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Tempest (full)
+ *
+ </th><th>
+ Rally (full)
+ *
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl-bgpvpn-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ bgpvpn
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l3-ovs-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-ovs-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l3-ovs-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-kvm-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-nofeature-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Doctor
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l3-fdio-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ FDS
+
+ </th><th>
+ SNAPS
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ see <a href="https://wiki.opnfv.org/pages/viewpage.action?pageId=6828617">Functest scoring wiki page</a> for details on scenario scoring
+ <div> <br>
+ <a href="./status-apex.pdf" class="myButtonPdf">Export to PDF</a> <a href="./scenario_history_apex.txt" class="myButtonCSV">Export to CSV</a>
+ </div>
+ </div>
+ <div class="col-md-1"></div>
+</div>
diff --git a/docs/results/danube/3.0/compass.html b/docs/results/danube/3.0/compass.html
new file mode 100644
index 000000000..4f3c5c547
--- /dev/null
+++ b/docs/results/danube/3.0/compass.html
@@ -0,0 +1,434 @@
+ <html>
+ <head>
+ <meta charset="utf-8">
+
+ <!-- Bootstrap core CSS -->
+ <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
+ <link href="../../js/default.css" rel="stylesheet">
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+ <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
+ <script type="text/javascript" src="http://d3js.org/d3.v2.min.js"></script>
+ <script type="text/javascript" src="../../js/gauge.js"></script>
+ <script type="text/javascript" src="../../js/trend.js"></script>
+ <script>
+ function onDocumentReady() {
+ // Gauge management
+ var gaugeScenario1 = gauge('#gaugeScenario1');var gaugeScenario2 = gauge('#gaugeScenario2');var gaugeScenario3 = gauge('#gaugeScenario3');var gaugeScenario4 = gauge('#gaugeScenario4');var gaugeScenario5 = gauge('#gaugeScenario5');
+
+ // assign success rate to the gauge
+ function updateReadings() {
+ gaugeScenario1.update(87.8787878788);gaugeScenario2.update(84.8484848485);gaugeScenario3.update(76.6666666667);gaugeScenario4.update(96.6666666667);gaugeScenario5.update(55.5555555556);
+ }
+ updateReadings();
+ }
+
+ // trend line management
+ d3.csv("./scenario_history.txt", function(data) {
+ // ***************************************
+ // Create the trend line
+ // for scenario os-odl_l2-nofeature-ha
+ // Filter results
+ var trend1 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l2-nofeature-ha" && row["installer"]=="compass";
+ })
+ // Parse the date
+ trend1.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg1",trend1)
+ // ****************************************// for scenario os-onos-nofeature-ha
+ // Filter results
+ var trend2 = data.filter(function(row) {
+ return row["scenario"]=="os-onos-nofeature-ha" && row["installer"]=="compass";
+ })
+ // Parse the date
+ trend2.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg2",trend2)
+ // ****************************************// for scenario os-odl_l3-nofeature-ha
+ // Filter results
+ var trend3 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l3-nofeature-ha" && row["installer"]=="compass";
+ })
+ // Parse the date
+ trend3.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg3",trend3)
+ // ****************************************// for scenario os-nosdn-nofeature-ha
+ // Filter results
+ var trend4 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-nofeature-ha" && row["installer"]=="compass";
+ })
+ // Parse the date
+ trend4.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg4",trend4)
+ // ****************************************// for scenario os-onos-sfc-ha
+ // Filter results
+ var trend5 = data.filter(function(row) {
+ return row["scenario"]=="os-onos-sfc-ha" && row["installer"]=="compass";
+ })
+ // Parse the date
+ trend5.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg5",trend5)
+ // ****************************************
+ });
+ if ( !window.isLoaded ) {
+ window.addEventListener("load", function() {
+ onDocumentReady();
+ }, false);
+ } else {
+ onDocumentReady();
+ }
+</script>
+<script type="text/javascript">
+$(document).ready(function (){
+ $(".btn-more").click(function() {
+ $(this).hide();
+ $(this).parent().find(".panel-default").show();
+ });
+})
+</script>
+
+ </head>
+ <body>
+ <div class="container">
+ <div class="masthead">
+ <h3 class="text-muted">Functest status page (danube 3.0, 2017-07-13 01:45)</h3>
+ <nav>
+ <ul class="nav nav-justified">
+ <li class="active"><a href="http://testresults.opnfv.org/reporting/index.html">Home</a></li>
+ <li><a href="apex.html">Apex</a></li>
+ <li><a href="compass.html">Compass</a></li>
+ <li><a href="fuel.html">Fuel</a></li>
+ <li><a href="joid.html">Joid</a></li>
+ </ul>
+ </nav>
+ </div>
+<div class="row">
+ <div class="col-md-1"></div>
+ <div class="col-md-10">
+ <div class="page-header">
+ <h2>compass</h2>
+ </div>
+
+ <div class="scenario-overview">
+ <div class="panel-heading"><h4><b>List of Danube 3.0 scenarios (4-14/7/2017) </b></h4></div>
+ <table class="table">
+ <tr>
+ <th width="40%">Scenario</th>
+ <th width="20%">Status</th>
+ <th width="20%">Trend</th>
+ <th width="10%">Score</th>
+ <th width="10%">Iteration</th>
+ </tr>
+ <tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-compass-baremetal-daily-danube/454/console>os-odl_l2-nofeature-ha</a></td>
+ <td><div id="gaugeScenario1"></div></td>
+ <td><div id="trend_svg1"></div></td>
+ <td>29/33</td>
+ <td>11</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-compass-virtual-daily-danube/481/console>os-onos-nofeature-ha</a></td>
+ <td><div id="gaugeScenario2"></div></td>
+ <td><div id="trend_svg2"></div></td>
+ <td>28/33</td>
+ <td>11</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-compass-virtual-daily-danube/482/console>os-odl_l3-nofeature-ha</a></td>
+ <td><div id="gaugeScenario3"></div></td>
+ <td><div id="trend_svg3"></div></td>
+ <td>23/30</td>
+ <td>7</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-compass-virtual-daily-danube/484/console>os-nosdn-nofeature-ha</a></td>
+ <td><div id="gaugeScenario4"></div></td>
+ <td><div id="trend_svg4"></div></td>
+ <td>29/30</td>
+ <td>12</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-compass-baremetal-daily-danube/453/console>os-onos-sfc-ha</a></td>
+ <td><div id="gaugeScenario5"></div></td>
+ <td><div id="trend_svg5"></div></td>
+ <td>20/36</td>
+ <td>10</td>
+ </tr>
+ </table>
+ </div>
+
+
+ <div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l2-nofeature-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-onos-nofeature-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ONOS
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l3-nofeature-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-nofeature-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-onos-sfc-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ONOS
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ SFC
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ see <a href="https://wiki.opnfv.org/pages/viewpage.action?pageId=6828617">Functest scoring wiki page</a> for details on scenario scoring
+ <div> <br>
+ <a href="./status-compass.pdf" class="myButtonPdf">Export to PDF</a> <a href="./scenario_history_compass.txt" class="myButtonCSV">Export to CSV</a>
+ </div>
+ </div>
+ <div class="col-md-1"></div>
+</div>
diff --git a/docs/results/danube/3.0/fuel.html b/docs/results/danube/3.0/fuel.html
new file mode 100644
index 000000000..d4c3a8776
--- /dev/null
+++ b/docs/results/danube/3.0/fuel.html
@@ -0,0 +1,1448 @@
+ <html>
+ <head>
+ <meta charset="utf-8">
+
+ <!-- Bootstrap core CSS -->
+ <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
+ <link href="../../js/default.css" rel="stylesheet">
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+ <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
+ <script type="text/javascript" src="http://d3js.org/d3.v2.min.js"></script>
+ <script type="text/javascript" src="../../js/gauge.js"></script>
+ <script type="text/javascript" src="../../js/trend.js"></script>
+ <script>
+ function onDocumentReady() {
+ // Gauge management
+ var gaugeScenario1 = gauge('#gaugeScenario1');var gaugeScenario2 = gauge('#gaugeScenario2');var gaugeScenario3 = gauge('#gaugeScenario3');var gaugeScenario4 = gauge('#gaugeScenario4');var gaugeScenario5 = gauge('#gaugeScenario5');var gaugeScenario6 = gauge('#gaugeScenario6');var gaugeScenario7 = gauge('#gaugeScenario7');var gaugeScenario8 = gauge('#gaugeScenario8');var gaugeScenario9 = gauge('#gaugeScenario9');var gaugeScenario10 = gauge('#gaugeScenario10');var gaugeScenario11 = gauge('#gaugeScenario11');var gaugeScenario12 = gauge('#gaugeScenario12');var gaugeScenario13 = gauge('#gaugeScenario13');var gaugeScenario14 = gauge('#gaugeScenario14');var gaugeScenario15 = gauge('#gaugeScenario15');var gaugeScenario16 = gauge('#gaugeScenario16');var gaugeScenario17 = gauge('#gaugeScenario17');var gaugeScenario18 = gauge('#gaugeScenario18');
+
+ // assign success rate to the gauge
+ function updateReadings() {
+ gaugeScenario1.update(100.0);gaugeScenario2.update(100.0);gaugeScenario3.update(97.2222222222);gaugeScenario4.update(100.0);gaugeScenario5.update(100.0);gaugeScenario6.update(83.3333333333);gaugeScenario7.update(92.3076923077);gaugeScenario8.update(100.0);gaugeScenario9.update(100.0);gaugeScenario10.update(100.0);gaugeScenario11.update(100.0);gaugeScenario12.update(97.619047619);gaugeScenario13.update(100.0);gaugeScenario14.update(92.3076923077);gaugeScenario15.update(97.619047619);gaugeScenario16.update(100.0);gaugeScenario17.update(100.0);gaugeScenario18.update(100.0);
+ }
+ updateReadings();
+ }
+
+ // trend line management
+ d3.csv("./scenario_history.txt", function(data) {
+ // ***************************************
+ // Create the trend line
+ // for scenario os-nosdn-kvm-noha
+ // Filter results
+ var trend1 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-kvm-noha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend1.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg1",trend1)
+ // ****************************************// for scenario os-nosdn-kvm_ovs_dpdk_bar-ha
+ // Filter results
+ var trend2 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-kvm_ovs_dpdk_bar-ha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend2.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg2",trend2)
+ // ****************************************// for scenario os-nosdn-kvm_ovs_dpdk-noha
+ // Filter results
+ var trend3 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-kvm_ovs_dpdk-noha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend3.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg3",trend3)
+ // ****************************************// for scenario os-nosdn-ovs-noha
+ // Filter results
+ var trend4 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-ovs-noha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend4.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg4",trend4)
+ // ****************************************// for scenario os-nosdn-kvm_ovs_dpdk-ha
+ // Filter results
+ var trend5 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-kvm_ovs_dpdk-ha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend5.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg5",trend5)
+ // ****************************************// for scenario os-odl_l2-sfc-noha
+ // Filter results
+ var trend6 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l2-sfc-noha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend6.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg6",trend6)
+ // ****************************************// for scenario os-odl_l3-nofeature-ha
+ // Filter results
+ var trend7 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l3-nofeature-ha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend7.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg7",trend7)
+ // ****************************************// for scenario os-nosdn-kvm-ha
+ // Filter results
+ var trend8 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-kvm-ha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend8.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg8",trend8)
+ // ****************************************// for scenario os-odl_l2-nofeature-ha
+ // Filter results
+ var trend9 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l2-nofeature-ha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend9.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg9",trend9)
+ // ****************************************// for scenario os-nosdn-nofeature-noha
+ // Filter results
+ var trend10 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-nofeature-noha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend10.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg10",trend10)
+ // ****************************************// for scenario os-odl_l2-nofeature-noha
+ // Filter results
+ var trend11 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l2-nofeature-noha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend11.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg11",trend11)
+ // ****************************************// for scenario os-odl_l2-bgpvpn-ha
+ // Filter results
+ var trend12 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l2-bgpvpn-ha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend12.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg12",trend12)
+ // ****************************************// for scenario os-odl_l3-nofeature-noha
+ // Filter results
+ var trend13 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l3-nofeature-noha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend13.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg13",trend13)
+ // ****************************************// for scenario os-nosdn-kvm_ovs_dpdk_bar-noha
+ // Filter results
+ var trend14 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-kvm_ovs_dpdk_bar-noha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend14.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg14",trend14)
+ // ****************************************// for scenario os-odl_l2-bgpvpn-noha
+ // Filter results
+ var trend15 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l2-bgpvpn-noha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend15.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg15",trend15)
+ // ****************************************// for scenario os-odl_l2-sfc-ha
+ // Filter results
+ var trend16 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l2-sfc-ha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend16.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg16",trend16)
+ // ****************************************// for scenario os-nosdn-ovs-ha
+ // Filter results
+ var trend17 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-ovs-ha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend17.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg17",trend17)
+ // ****************************************// for scenario os-nosdn-nofeature-ha
+ // Filter results
+ var trend18 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-nofeature-ha" && row["installer"]=="fuel";
+ })
+ // Parse the date
+ trend18.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg18",trend18)
+ // ****************************************
+ });
+ if ( !window.isLoaded ) {
+ window.addEventListener("load", function() {
+ onDocumentReady();
+ }, false);
+ } else {
+ onDocumentReady();
+ }
+</script>
+<script type="text/javascript">
+$(document).ready(function (){
+ $(".btn-more").click(function() {
+ $(this).hide();
+ $(this).parent().find(".panel-default").show();
+ });
+})
+</script>
+
+ </head>
+ <body>
+ <div class="container">
+ <div class="masthead">
+ <h3 class="text-muted">Functest status page (danube 3.0, 2017-07-13 01:45)</h3>
+ <nav>
+ <ul class="nav nav-justified">
+ <li class="active"><a href="http://testresults.opnfv.org/reporting/index.html">Home</a></li>
+ <li><a href="apex.html">Apex</a></li>
+ <li><a href="compass.html">Compass</a></li>
+ <li><a href="fuel.html">Fuel</a></li>
+ <li><a href="joid.html">Joid</a></li>
+ </ul>
+ </nav>
+ </div>
+<div class="row">
+ <div class="col-md-1"></div>
+ <div class="col-md-10">
+ <div class="page-header">
+ <h2>fuel</h2>
+ </div>
+
+ <div class="scenario-overview">
+ <div class="panel-heading"><h4><b>List of Danube 3.0 scenarios (4-14/7/2017) </b></h4></div>
+ <table class="table">
+ <tr>
+ <th width="40%">Scenario</th>
+ <th width="20%">Status</th>
+ <th width="20%">Trend</th>
+ <th width="10%">Score</th>
+ <th width="10%">Iteration</th>
+ </tr>
+ <tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-virtual-daily-danube/935/console>os-nosdn-kvm-noha</a></td>
+ <td><div id="gaugeScenario1"></div></td>
+ <td><div id="trend_svg1"></div></td>
+ <td>36/36</td>
+ <td>9</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-baremetal-daily-danube/869/console>os-nosdn-kvm_ovs_dpdk_bar-ha</a></td>
+ <td><div id="gaugeScenario2"></div></td>
+ <td><div id="trend_svg2"></div></td>
+ <td>42/42</td>
+ <td>8</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-virtual-daily-danube/938/console>os-nosdn-kvm_ovs_dpdk-noha</a></td>
+ <td><div id="gaugeScenario3"></div></td>
+ <td><div id="trend_svg3"></div></td>
+ <td>35/36</td>
+ <td>8</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-virtual-daily-danube/936/console>os-nosdn-ovs-noha</a></td>
+ <td><div id="gaugeScenario4"></div></td>
+ <td><div id="trend_svg4"></div></td>
+ <td>36/36</td>
+ <td>8</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-baremetal-daily-danube/871/console>os-nosdn-kvm_ovs_dpdk-ha</a></td>
+ <td><div id="gaugeScenario5"></div></td>
+ <td><div id="trend_svg5"></div></td>
+ <td>39/39</td>
+ <td>8</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-virtual-daily-danube/933/console>os-odl_l2-sfc-noha</a></td>
+ <td><div id="gaugeScenario6"></div></td>
+ <td><div id="trend_svg6"></div></td>
+ <td>35/42</td>
+ <td>7</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-baremetal-daily-danube/868/console>os-odl_l3-nofeature-ha</a></td>
+ <td><div id="gaugeScenario7"></div></td>
+ <td><div id="trend_svg7"></div></td>
+ <td>36/39</td>
+ <td>9</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-baremetal-daily-danube/873/console>os-nosdn-kvm-ha</a></td>
+ <td><div id="gaugeScenario8"></div></td>
+ <td><div id="trend_svg8"></div></td>
+ <td>39/39</td>
+ <td>7</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-baremetal-daily-danube/867/console>os-odl_l2-nofeature-ha</a></td>
+ <td><div id="gaugeScenario9"></div></td>
+ <td><div id="trend_svg9"></div></td>
+ <td>42/42</td>
+ <td>15</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-virtual-daily-danube/937/console>os-nosdn-nofeature-noha</a></td>
+ <td><div id="gaugeScenario10"></div></td>
+ <td><div id="trend_svg10"></div></td>
+ <td>36/36</td>
+ <td>8</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-virtual-daily-danube/939/console>os-odl_l2-nofeature-noha</a></td>
+ <td><div id="gaugeScenario11"></div></td>
+ <td><div id="trend_svg11"></div></td>
+ <td>39/39</td>
+ <td>4</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-baremetal-daily-danube/872/console>os-odl_l2-bgpvpn-ha</a></td>
+ <td><div id="gaugeScenario12"></div></td>
+ <td><div id="trend_svg12"></div></td>
+ <td>41/42</td>
+ <td>7</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-virtual-daily-danube/940/console>os-odl_l3-nofeature-noha</a></td>
+ <td><div id="gaugeScenario13"></div></td>
+ <td><div id="trend_svg13"></div></td>
+ <td>36/36</td>
+ <td>7</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-virtual-daily-danube/941/console>os-nosdn-kvm_ovs_dpdk_bar-noha</a></td>
+ <td><div id="gaugeScenario14"></div></td>
+ <td><div id="trend_svg14"></div></td>
+ <td>36/39</td>
+ <td>5</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-virtual-daily-danube/934/console>os-odl_l2-bgpvpn-noha</a></td>
+ <td><div id="gaugeScenario15"></div></td>
+ <td><div id="trend_svg15"></div></td>
+ <td>41/42</td>
+ <td>7</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-baremetal-daily-danube/870/console>os-odl_l2-sfc-ha</a></td>
+ <td><div id="gaugeScenario16"></div></td>
+ <td><div id="trend_svg16"></div></td>
+ <td>45/45</td>
+ <td>5</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-baremetal-daily-danube/875/console>os-nosdn-ovs-ha</a></td>
+ <td><div id="gaugeScenario17"></div></td>
+ <td><div id="trend_svg17"></div></td>
+ <td>39/39</td>
+ <td>8</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-fuel-baremetal-daily-danube/874/console>os-nosdn-nofeature-ha</a></td>
+ <td><div id="gaugeScenario18"></div></td>
+ <td><div id="trend_svg18"></div></td>
+ <td>39/39</td>
+ <td>7</td>
+ </tr>
+ </table>
+ </div>
+
+
+ <div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-kvm-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-kvm_ovs_dpdk_bar-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Parser
+
+ </th><th>
+ Domino
+
+ </th><th>
+ Barometer
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-kvm_ovs_dpdk-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-ovs-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-kvm_ovs_dpdk-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Parser
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l2-sfc-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ SFC
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l3-nofeature-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Parser
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-kvm-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Parser
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l2-nofeature-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Parser
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-nofeature-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l2-nofeature-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l2-bgpvpn-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ bgpvpn
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l3-nofeature-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-kvm_ovs_dpdk_bar-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Domino
+
+ </th><th>
+ Barometer
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l2-bgpvpn-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ bgpvpn
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l2-sfc-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ SFC
+
+ </th><th>
+ Parser
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-ovs-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Parser
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-nofeature-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th><th>
+ Doctor
+
+ </th><th>
+ Parser
+
+ </th><th>
+ Domino
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ see <a href="https://wiki.opnfv.org/pages/viewpage.action?pageId=6828617">Functest scoring wiki page</a> for details on scenario scoring
+ <div> <br>
+ <a href="./status-fuel.pdf" class="myButtonPdf">Export to PDF</a> <a href="./scenario_history_fuel.txt" class="myButtonCSV">Export to CSV</a>
+ </div>
+ </div>
+ <div class="col-md-1"></div>
+</div>
diff --git a/docs/results/danube/3.0/joid.html b/docs/results/danube/3.0/joid.html
new file mode 100644
index 000000000..b9e7eccee
--- /dev/null
+++ b/docs/results/danube/3.0/joid.html
@@ -0,0 +1,407 @@
+ <html>
+ <head>
+ <meta charset="utf-8">
+
+ <!-- Bootstrap core CSS -->
+ <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
+ <link href="../../js/default.css" rel="stylesheet">
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+ <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
+ <script type="text/javascript" src="http://d3js.org/d3.v2.min.js"></script>
+ <script type="text/javascript" src="../../js/gauge.js"></script>
+ <script type="text/javascript" src="../../js/trend.js"></script>
+ <script>
+ function onDocumentReady() {
+ // Gauge management
+ var gaugeScenario1 = gauge('#gaugeScenario1');var gaugeScenario2 = gauge('#gaugeScenario2');var gaugeScenario3 = gauge('#gaugeScenario3');var gaugeScenario4 = gauge('#gaugeScenario4');var gaugeScenario5 = gauge('#gaugeScenario5');
+
+ // assign success rate to the gauge
+ function updateReadings() {
+ gaugeScenario1.update(71.4285714286);gaugeScenario2.update(33.3333333333);gaugeScenario3.update(47.619047619);gaugeScenario4.update(100.0);gaugeScenario5.update(18.1818181818);
+ }
+ updateReadings();
+ }
+
+ // trend line management
+ d3.csv("./scenario_history.txt", function(data) {
+ // ***************************************
+ // Create the trend line
+ // for scenario os-nosdn-lxd-noha
+ // Filter results
+ var trend1 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-lxd-noha" && row["installer"]=="joid";
+ })
+ // Parse the date
+ trend1.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg1",trend1)
+ // ****************************************// for scenario os-nosdn-nofeature-noha
+ // Filter results
+ var trend2 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-nofeature-noha" && row["installer"]=="joid";
+ })
+ // Parse the date
+ trend2.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg2",trend2)
+ // ****************************************// for scenario os-nosdn-lxd-ha
+ // Filter results
+ var trend3 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-lxd-ha" && row["installer"]=="joid";
+ })
+ // Parse the date
+ trend3.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg3",trend3)
+ // ****************************************// for scenario os-nosdn-nofeature-ha
+ // Filter results
+ var trend4 = data.filter(function(row) {
+ return row["scenario"]=="os-nosdn-nofeature-ha" && row["installer"]=="joid";
+ })
+ // Parse the date
+ trend4.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg4",trend4)
+ // ****************************************// for scenario os-odl_l2-nofeature-ha
+ // Filter results
+ var trend5 = data.filter(function(row) {
+ return row["scenario"]=="os-odl_l2-nofeature-ha" && row["installer"]=="joid";
+ })
+ // Parse the date
+ trend5.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg5",trend5)
+ // ****************************************
+ });
+ if ( !window.isLoaded ) {
+ window.addEventListener("load", function() {
+ onDocumentReady();
+ }, false);
+ } else {
+ onDocumentReady();
+ }
+</script>
+<script type="text/javascript">
+$(document).ready(function (){
+ $(".btn-more").click(function() {
+ $(this).hide();
+ $(this).parent().find(".panel-default").show();
+ });
+})
+</script>
+
+ </head>
+ <body>
+ <div class="container">
+ <div class="masthead">
+ <h3 class="text-muted">Functest status page (danube 3.0, 2017-07-13 01:45)</h3>
+ <nav>
+ <ul class="nav nav-justified">
+ <li class="active"><a href="http://testresults.opnfv.org/reporting/index.html">Home</a></li>
+ <li><a href="apex.html">Apex</a></li>
+ <li><a href="compass.html">Compass</a></li>
+ <li><a href="fuel.html">Fuel</a></li>
+ <li><a href="joid.html">Joid</a></li>
+ </ul>
+ </nav>
+ </div>
+<div class="row">
+ <div class="col-md-1"></div>
+ <div class="col-md-10">
+ <div class="page-header">
+ <h2>joid</h2>
+ </div>
+
+ <div class="scenario-overview">
+ <div class="panel-heading"><h4><b>List of Danube 3.0 scenarios (4-14/7/2017) </b></h4></div>
+ <table class="table">
+ <tr>
+ <th width="40%">Scenario</th>
+ <th width="20%">Status</th>
+ <th width="20%">Trend</th>
+ <th width="10%">Score</th>
+ <th width="10%">Iteration</th>
+ </tr>
+ <tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-joid-baremetal-daily-danube/301/console>os-nosdn-lxd-noha</a></td>
+ <td><div id="gaugeScenario1"></div></td>
+ <td><div id="trend_svg1"></div></td>
+ <td>15/21</td>
+ <td>6</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-joid-baremetal-daily-danube/260/console>os-nosdn-nofeature-noha</a></td>
+ <td><div id="gaugeScenario2"></div></td>
+ <td><div id="trend_svg2"></div></td>
+ <td>10/30</td>
+ <td>1</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-joid-baremetal-daily-danube/281/console>os-nosdn-lxd-ha</a></td>
+ <td><div id="gaugeScenario3"></div></td>
+ <td><div id="trend_svg3"></div></td>
+ <td>10/21</td>
+ <td>3</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-joid-baremetal-daily-danube/298/console>os-nosdn-nofeature-ha</a></td>
+ <td><div id="gaugeScenario4"></div></td>
+ <td><div id="trend_svg4"></div></td>
+ <td>30/30</td>
+ <td>6</td>
+ </tr><tr class="tr-ok">
+ <td><a href=https://build.opnfv.org/ci/view/functest/job/functest-joid-baremetal-daily-danube/291/console>os-odl_l2-nofeature-ha</a></td>
+ <td><div id="gaugeScenario5"></div></td>
+ <td><div id="trend_svg5"></div></td>
+ <td>6/33</td>
+ <td>2</td>
+ </tr>
+ </table>
+ </div>
+
+
+ <div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-lxd-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ Promise
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-nofeature-noha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td><td><img src="../../img/weather-overcast.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-lxd-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ Promise
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-few-clouds.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-nosdn-nofeature-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td><td><img src="../../img/weather-clear.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div><div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>os-odl_l2-nofeature-ha</b></h3>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <span class="panel-header-item">
+ </span>
+ </div>
+ <table class="table">
+ <tr>
+ <th>
+ Health (connection)
+
+ </th><th>
+ Health (api)
+
+ </th><th>
+ Health (dhcp)
+
+ </th><th>
+ vPing (ssh)
+
+ </th><th>
+ vPing (userdata)
+
+ </th><th>
+ Tempest (smoke)
+
+ </th><th>
+ Rally (smoke)
+
+ </th><th>
+ Refstack
+
+ </th><th>
+ ODL
+
+ </th><th>
+ SNAPS
+
+ </th><th>
+ Promise
+
+ </th>
+ </tr>
+ <tr class="tr-weather-weather">
+ <td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-few-clouds.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td><td><img src="../../img/weather-storm.png"></td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ see <a href="https://wiki.opnfv.org/pages/viewpage.action?pageId=6828617">Functest scoring wiki page</a> for details on scenario scoring
+ <div> <br>
+ <a href="./status-joid.pdf" class="myButtonPdf">Export to PDF</a> <a href="./scenario_history_joid.txt" class="myButtonCSV">Export to CSV</a>
+ </div>
+ </div>
+ <div class="col-md-1"></div>
+</div>
diff --git a/docs/results/danube/3.0/scenario_history.txt b/docs/results/danube/3.0/scenario_history.txt
new file mode 100644
index 000000000..20d0d51c8
--- /dev/null
+++ b/docs/results/danube/3.0/scenario_history.txt
@@ -0,0 +1,3855 @@
+date,scenario,installer,detail,score
+2017-03-13 10:00,os-odl_l2-fdio-noha,apex,5/33,15.0
+2017-03-13 10:00,os-odl_l2-fdio-ha,apex,1/33,3.0
+2017-03-14 01:45,os-odl_l2-fdio-noha,apex,12/33,36.0
+2017-03-14 01:45,os-odl_l2-fdio-ha,apex,1/33,3.0
+2017-03-15 01:45,os-odl_l2-fdio-noha,apex,29/33,88.0
+2017-03-15 01:45,os-odl_l2-fdio-ha,apex,4/33,12.0
+2017-03-16 01:45,os-odl_l2-fdio-noha,apex,29/36,81.0
+2017-03-16 01:45,os-odl_l2-fdio-ha,apex,13/36,36.0
+2017-03-16 10:23,os-odl_l2-fdio-noha,apex,33/36,92.0
+2017-03-16 10:23,os-odl_l2-fdio-ha,apex,13/36,36.0
+2017-03-17 01:45,os-odl_l2-fdio-noha,apex,33/36,92.0
+2017-03-17 01:45,os-odl_l2-fdio-ha,apex,20/36,56.0
+2017-03-17 07:33,os-odl_l2-fdio-noha,apex,33/36,92.0
+2017-03-17 07:33,os-odl_l2-fdio-ha,apex,20/36,56.0
+2017-03-17 08:49,os-odl_l2-fdio-noha,apex,33/36,92.0
+2017-03-17 08:49,os-nosdn-nofeature-ha,apex,9/33,27.0
+2017-03-17 08:49,os-odl_l2-fdio-ha,apex,20/36,56.0
+2017-03-18 01:45,os-odl-gluon-noha,apex,12/39,31.0
+2017-03-18 01:45,os-odl_l2-fdio-noha,apex,33/36,92.0
+2017-03-18 01:45,os-odl_l3-fdio-noha,apex,15/30,50.0
+2017-03-18 01:45,os-odl_l3-nofeature-ha,apex,8/33,24.0
+2017-03-18 01:45,os-odl_l2-fdio-ha,apex,19/36,53.0
+2017-03-18 01:45,os-odl-bgpvpn-ha,apex,11/39,28.0
+2017-03-18 01:45,os-nosdn-nofeature-ha,apex,11/33,33.0
+2017-03-19 01:45,os-odl_l2-fdio-noha,apex,33/36,92.0
+2017-03-19 01:45,os-odl_l3-fdio-noha,apex,21/30,70.0
+2017-03-19 01:45,os-odl_l3-nofeature-ha,apex,15/33,45.0
+2017-03-19 01:45,os-odl_l2-fdio-ha,apex,19/36,53.0
+2017-03-19 01:45,os-odl-bgpvpn-ha,apex,14/39,36.0
+2017-03-19 01:45,os-nosdn-kvm-ha,apex,11/33,33.0
+2017-03-19 01:45,os-nosdn-nofeature-ha,apex,22/33,67.0
+2017-03-19 01:45,os-odl-gluon-noha,apex,22/39,56.0
+2017-03-19 01:45,os-odl_l2-fdio-noha,apex,33/36,92.0
+2017-03-19 01:45,os-odl_l3-fdio-noha,apex,21/30,70.0
+2017-03-19 01:45,os-odl_l3-nofeature-ha,apex,15/33,45.0
+2017-03-19 01:45,os-odl_l2-fdio-ha,apex,19/36,53.0
+2017-03-19 01:45,os-odl-bgpvpn-ha,apex,14/39,36.0
+2017-03-19 01:45,os-nosdn-kvm-ha,apex,11/33,33.0
+2017-03-19 01:45,os-nosdn-nofeature-ha,apex,22/33,67.0
+2017-03-20 01:45,os-odl-gluon-noha,apex,23/39,59.0
+2017-03-20 01:45,os-odl_l2-fdio-noha,apex,33/36,92.0
+2017-03-20 01:45,os-odl_l3-fdio-noha,apex,21/30,70.0
+2017-03-20 01:45,os-odl_l3-nofeature-ha,apex,15/33,45.0
+2017-03-20 01:45,os-odl_l2-fdio-ha,apex,19/36,53.0
+2017-03-20 01:45,os-nosdn-fdio-ha,apex,2/30,7.0
+2017-03-20 01:45,os-odl-bgpvpn-ha,apex,14/39,36.0
+2017-03-20 01:45,os-nosdn-kvm-ha,apex,12/33,36.0
+2017-03-20 01:45,os-nosdn-nofeature-ha,apex,22/33,67.0
+2017-03-17 01:45,os-nosdn-nofeature-ha,compass,10/30,33.0
+2017-03-17 07:33,os-ocl-nofeature-ha,compass,1/30,3.0
+2017-03-17 07:33,os-nosdn-nofeature-ha,compass,10/30,33.0
+2017-03-17 08:49,os-ocl-nofeature-ha,compass,1/30,3.0
+2017-03-17 08:49,os-nosdn-nofeature-ha,compass,10/30,33.0
+2017-03-18 01:45,os-ocl-nofeature-ha,compass,1/30,3.0
+2017-03-18 01:45,os-odl_l2-nofeature-ha,compass,20/33,61.0
+2017-03-18 01:45,os-nosdn-openo-ha,compass,10/30,33.0
+2017-03-18 01:45,os-odl_l3-nofeature-ha,compass,16/30,53.0
+2017-03-18 01:45,os-nosdn-nofeature-ha,compass,20/30,67.0
+2017-03-19 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-03-19 01:45,os-ocl-nofeature-ha,compass,4/30,13.0
+2017-03-19 01:45,os-onos-nofeature-ha,compass,11/33,33.0
+2017-03-19 01:45,os-odl_l2-nofeature-ha,compass,26/33,79.0
+2017-03-19 01:45,os-nosdn-openo-ha,compass,10/30,33.0
+2017-03-19 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-03-20 01:45,os-odl_l3-nofeature-ha,compass,27/30,90.0
+2017-03-20 01:45,os-ocl-nofeature-ha,compass,4/30,13.0
+2017-03-20 01:45,os-onos-nofeature-ha,compass,22/33,67.0
+2017-03-20 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-20 01:45,os-nosdn-openo-ha,compass,10/30,33.0
+2017-03-20 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-03-19 01:45,os-odl_l2-nofeature-ha,fuel,13/42,31.0
+2017-03-19 01:45,os-odl_l2-nofeature-ha,fuel,13/42,31.0
+2017-03-20 01:45,os-odl_l2-nofeature-ha,fuel,13/42,31.0
+2017-03-20 01:45,os-odl_l2-bgpvpn-ha,fuel,3/42,7.0
+2017-03-16 10:23,os-nosdn-nofeature-ha,joid,10/33,30.0
+2017-03-17 01:45,os-nosdn-lxd-noha,joid,13/24,54.0
+2017-03-17 01:45,os-odl_l2-nofeature-ha,joid,2/36,6.0
+2017-03-17 01:45,os-nosdn-nofeature-ha,joid,10/33,30.0
+2017-03-17 07:33,os-nosdn-lxd-noha,joid,13/24,54.0
+2017-03-17 07:33,os-odl_l2-nofeature-ha,joid,2/36,6.0
+2017-03-17 07:33,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-03-17 07:33,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-03-17 08:49,os-nosdn-lxd-noha,joid,13/24,54.0
+2017-03-17 08:49,os-odl_l2-nofeature-ha,joid,2/36,6.0
+2017-03-17 08:49,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-03-17 08:49,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-03-18 01:45,os-nosdn-lxd-noha,joid,13/24,54.0
+2017-03-18 01:45,os-odl_l2-nofeature-ha,joid,2/36,6.0
+2017-03-18 01:45,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-03-18 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-03-19 01:45,os-nosdn-lxd-noha,joid,13/24,54.0
+2017-03-19 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-03-19 01:45,os-nosdn-lxd-ha,joid,1/24,4.0
+2017-03-19 01:45,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-03-19 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-03-20 01:45,os-nosdn-lxd-noha,joid,13/24,54.0
+2017-03-20 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-03-20 01:45,os-nosdn-lxd-ha,joid,1/24,4.0
+2017-03-20 01:45,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-03-20 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-03-21 01:45,os-odl-gluon-noha,apex,23/39,59.0
+2017-03-21 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-03-21 01:45,os-odl_l3-fdio-noha,apex,27/30,90.0
+2017-03-21 01:45,os-odl_l3-nofeature-ha,apex,15/33,45.0
+2017-03-21 01:45,os-odl_l2-fdio-ha,apex,28/36,78.0
+2017-03-21 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-03-21 01:45,os-odl-bgpvpn-ha,apex,22/39,56.0
+2017-03-21 01:45,os-nosdn-kvm-ha,apex,22/33,67.0
+2017-03-21 01:45,os-nosdn-nofeature-ha,apex,27/33,82.0
+2017-03-21 01:45,os-odl_l3-nofeature-ha,compass,27/30,90.0
+2017-03-21 01:45,os-ocl-nofeature-ha,compass,7/30,23.0
+2017-03-21 01:45,os-onos-nofeature-ha,compass,31/33,94.0
+2017-03-21 01:45,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-03-21 01:45,os-nosdn-openo-ha,compass,20/30,67.0
+2017-03-21 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-03-21 01:45,os-odl_l3-nofeature-noha,fuel,11/36,31.0
+2017-03-21 01:45,os-nosdn-nofeature-noha,fuel,12/36,33.0
+2017-03-21 01:45,os-odl_l2-nofeature-noha,fuel,12/39,31.0
+2017-03-21 01:45,os-odl_l2-bgpvpn-ha,fuel,15/42,36.0
+2017-03-21 01:45,os-nosdn-ovs-ha,fuel,26/39,67.0
+2017-03-21 01:45,os-odl_l2-nofeature-ha,fuel,13/42,31.0
+2017-03-21 01:45,os-nosdn-nofeature-ha,fuel,26/39,67.0
+2017-03-21 01:45,os-nosdn-lxd-noha,joid,13/24,54.0
+2017-03-21 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-03-21 01:45,os-nosdn-lxd-ha,joid,1/24,4.0
+2017-03-21 01:45,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-03-21 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+
+2017-03-22 01:45,os-odl-gluon-noha,apex,34/39,87.0
+2017-03-22 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-03-22 01:45,os-odl_l3-fdio-noha,apex,27/30,90.0
+2017-03-22 01:45,os-odl_l3-nofeature-ha,apex,22/33,67.0
+2017-03-22 01:45,os-odl_l2-fdio-ha,apex,28/36,78.0
+2017-03-22 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-03-22 01:45,os-odl-bgpvpn-ha,apex,25/39,64.0
+2017-03-22 01:45,os-nosdn-kvm-ha,apex,23/33,70.0
+2017-03-22 01:45,os-nosdn-nofeature-ha,apex,33/33,100.0
+2017-03-22 01:45,os-odl_l3-nofeature-ha,compass,27/30,90.0
+2017-03-22 01:45,os-ocl-nofeature-ha,compass,7/30,23.0
+2017-03-22 01:45,os-onos-nofeature-ha,compass,31/33,94.0
+2017-03-22 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-03-22 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-03-22 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-03-22 01:45,os-nosdn-ovs-noha,fuel,12/36,33.0
+2017-03-22 01:45,os-odl_l3-nofeature-noha,fuel,11/36,31.0
+2017-03-22 01:45,os-odl_l2-bgpvpn-noha,fuel,12/42,29.0
+2017-03-22 01:45,os-odl_l2-sfc-noha,fuel,2/42,5.0
+2017-03-22 01:45,os-odl_l3-nofeature-ha,fuel,19/39,49.0
+2017-03-22 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-03-22 01:45,os-odl_l2-nofeature-noha,fuel,14/39,36.0
+2017-03-22 01:45,os-odl_l2-bgpvpn-ha,fuel,22/42,52.0
+2017-03-22 01:45,os-odl_l2-sfc-ha,fuel,13/45,29.0
+2017-03-22 01:45,os-nosdn-ovs-ha,fuel,26/39,67.0
+2017-03-22 01:45,os-odl_l2-nofeature-ha,fuel,26/42,62.0
+2017-03-22 01:45,os-nosdn-nofeature-ha,fuel,26/39,67.0
+2017-03-22 01:45,os-nosdn-lxd-noha,joid,14/24,58.0
+2017-03-22 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-03-22 01:45,os-nosdn-lxd-ha,joid,2/24,8.0
+2017-03-22 01:45,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-03-22 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-03-23 01:45,os-odl-gluon-noha,apex,34/39,87.0
+2017-03-23 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-03-23 01:45,os-odl_l3-fdio-noha,apex,27/30,90.0
+2017-03-23 01:45,os-odl_l3-nofeature-ha,apex,21/33,64.0
+2017-03-23 01:45,os-odl_l2-fdio-ha,apex,28/36,78.0
+2017-03-23 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-03-23 01:45,os-odl-bgpvpn-ha,apex,25/39,64.0
+2017-03-23 01:45,os-nosdn-kvm-ha,apex,23/33,70.0
+2017-03-23 01:45,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-03-23 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-03-23 01:45,os-ocl-nofeature-ha,compass,7/30,23.0
+2017-03-23 01:45,os-onos-nofeature-ha,compass,30/33,91.0
+2017-03-23 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-23 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-03-23 01:45,os-nosdn-nofeature-ha,compass,28/30,93.0
+2017-03-23 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,12/36,33.0
+2017-03-23 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,2/42,5.0
+2017-03-23 01:45,os-nosdn-kvm-noha,fuel,12/36,33.0
+2017-03-23 01:45,os-nosdn-ovs-noha,fuel,24/36,67.0
+2017-03-23 01:45,os-odl_l3-nofeature-noha,fuel,22/36,61.0
+2017-03-23 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,2/39,5.0
+2017-03-23 01:45,os-odl_l2-bgpvpn-noha,fuel,24/42,57.0
+2017-03-23 01:45,os-odl_l2-sfc-noha,fuel,2/42,5.0
+2017-03-23 01:45,os-odl_l3-nofeature-ha,fuel,19/39,49.0
+2017-03-23 01:45,os-nosdn-kvm-ha,fuel,25/39,64.0
+2017-03-23 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-03-23 01:45,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-03-23 01:45,os-odl_l2-bgpvpn-ha,fuel,25/42,60.0
+2017-03-23 01:45,os-odl_l2-sfc-ha,fuel,13/45,29.0
+2017-03-23 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,24/39,62.0
+2017-03-23 01:45,os-nosdn-ovs-ha,fuel,26/39,67.0
+2017-03-23 01:45,os-odl_l2-nofeature-ha,fuel,26/42,62.0
+2017-03-23 01:45,os-nosdn-nofeature-ha,fuel,37/39,95.0
+2017-03-23 01:45,os-nosdn-lxd-noha,joid,20/24,83.0
+2017-03-23 01:45,os-odl_l2-nofeature-ha,joid,7/36,19.0
+2017-03-23 01:45,os-nosdn-lxd-ha,joid,7/24,29.0
+2017-03-23 01:45,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-03-23 01:45,os-nosdn-nofeature-noha,joid,33/33,100.0
+2017-03-24 01:45,os-odl-gluon-noha,apex,34/39,87.0
+2017-03-24 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-03-24 01:45,os-odl_l3-fdio-noha,apex,27/30,90.0
+2017-03-24 01:45,os-odl_l3-nofeature-ha,apex,21/33,64.0
+2017-03-24 01:45,os-odl_l2-fdio-ha,apex,28/36,78.0
+2017-03-24 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-03-24 01:45,os-odl-bgpvpn-ha,apex,25/39,64.0
+2017-03-24 01:45,os-nosdn-kvm-ha,apex,31/33,94.0
+2017-03-24 01:45,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-03-24 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-03-24 01:45,os-ocl-nofeature-ha,compass,6/30,20.0
+2017-03-24 01:45,os-onos-nofeature-ha,compass,31/33,94.0
+2017-03-24 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-24 01:45,os-nosdn-openo-ha,compass,25/30,83.0
+2017-03-24 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-03-24 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-03-24 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,4/42,10.0
+2017-03-24 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-03-24 01:45,os-nosdn-ovs-noha,fuel,24/36,67.0
+2017-03-24 01:45,os-odl_l3-nofeature-noha,fuel,23/36,64.0
+2017-03-24 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,4/39,10.0
+2017-03-24 01:45,os-odl_l2-bgpvpn-noha,fuel,24/42,57.0
+2017-03-24 01:45,os-odl_l2-sfc-noha,fuel,14/42,33.0
+2017-03-24 01:45,os-odl_l3-nofeature-ha,fuel,24/39,62.0
+2017-03-24 01:45,os-nosdn-kvm-ha,fuel,25/39,64.0
+2017-03-24 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-03-24 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-03-24 01:45,os-odl_l2-bgpvpn-ha,fuel,27/42,64.0
+2017-03-24 01:45,os-odl_l2-sfc-ha,fuel,24/45,53.0
+2017-03-24 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,24/39,62.0
+2017-03-24 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-03-24 01:45,os-odl_l2-nofeature-ha,fuel,26/42,62.0
+2017-03-24 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-03-24 01:45,os-nosdn-lxd-noha,joid,20/24,83.0
+2017-03-24 01:45,os-odl_l2-nofeature-ha,joid,7/36,19.0
+2017-03-24 01:45,os-nosdn-lxd-ha,joid,13/24,54.0
+2017-03-24 01:45,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-03-24 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-03-25 01:45,os-odl-gluon-noha,apex,34/39,87.0
+2017-03-25 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-03-25 01:45,os-odl_l3-fdio-noha,apex,27/30,90.0
+2017-03-25 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-03-25 01:45,os-odl_l2-fdio-ha,apex,28/36,78.0
+2017-03-25 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-03-25 01:45,os-odl-bgpvpn-ha,apex,25/39,64.0
+2017-03-25 01:45,os-nosdn-kvm-ha,apex,31/33,94.0
+2017-03-25 01:45,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-03-25 01:45,os-odl_l3-nofeature-ha,compass,27/30,90.0
+2017-03-25 01:45,os-ocl-nofeature-ha,compass,6/30,20.0
+2017-03-25 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-03-25 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-25 01:45,os-nosdn-openo-ha,compass,25/30,83.0
+2017-03-25 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-03-25 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-03-25 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,4/42,10.0
+2017-03-25 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-03-25 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-03-25 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-03-25 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,4/39,10.0
+2017-03-25 01:45,os-odl_l2-bgpvpn-noha,fuel,26/42,62.0
+2017-03-25 01:45,os-odl_l2-sfc-noha,fuel,24/42,57.0
+2017-03-25 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-03-25 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-03-25 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-03-25 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-03-25 01:45,os-odl_l2-bgpvpn-ha,fuel,35/42,83.0
+2017-03-25 01:45,os-odl_l2-sfc-ha,fuel,25/45,56.0
+2017-03-25 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,24/39,62.0
+2017-03-25 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-03-25 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-03-25 01:45,os-nosdn-nofeature-ha,fuel,35/39,90.0
+2017-03-25 01:45,os-nosdn-lxd-noha,joid,19/24,79.0
+2017-03-25 01:45,os-odl_l2-nofeature-ha,joid,7/36,19.0
+2017-03-25 01:45,os-nosdn-lxd-ha,joid,13/24,54.0
+2017-03-25 01:45,os-nosdn-nofeature-ha,joid,21/33,64.0
+2017-03-25 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-03-26 01:45,os-odl-gluon-noha,apex,34/39,87.0
+2017-03-26 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-03-26 01:45,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-03-26 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-03-26 01:45,os-odl_l2-fdio-ha,apex,22/36,61.0
+2017-03-26 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-03-26 01:45,os-odl-bgpvpn-ha,apex,25/39,64.0
+2017-03-26 01:45,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-03-26 01:45,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-03-26 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-03-26 01:45,os-ocl-nofeature-ha,compass,6/30,20.0
+2017-03-26 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-03-26 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-26 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-03-26 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-03-26 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-03-26 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,4/42,10.0
+2017-03-26 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-03-26 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-03-26 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-03-26 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,4/39,10.0
+2017-03-26 01:45,os-odl_l2-bgpvpn-noha,fuel,26/42,62.0
+2017-03-26 01:45,os-odl_l2-sfc-noha,fuel,24/42,57.0
+2017-03-26 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-03-26 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-03-26 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-03-26 01:45,os-odl_l2-nofeature-noha,fuel,36/39,92.0
+2017-03-26 01:45,os-odl_l2-bgpvpn-ha,fuel,35/42,83.0
+2017-03-26 01:45,os-odl_l2-sfc-ha,fuel,25/45,56.0
+2017-03-26 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,24/39,62.0
+2017-03-26 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-03-26 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-03-26 01:45,os-nosdn-nofeature-ha,fuel,35/39,90.0
+2017-03-26 01:45,os-nosdn-lxd-noha,joid,19/24,79.0
+2017-03-26 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-03-26 01:45,os-nosdn-lxd-ha,joid,13/24,54.0
+2017-03-26 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-03-26 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-03-27 01:45,os-odl-gluon-noha,apex,34/39,87.0
+2017-03-27 01:45,os-odl_l2-fdio-noha,apex,18/36,50.0
+2017-03-27 01:45,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-03-27 01:45,os-odl_l3-nofeature-ha,apex,26/33,79.0
+2017-03-27 01:45,os-odl_l2-fdio-ha,apex,21/36,58.0
+2017-03-27 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-03-27 01:45,os-odl-bgpvpn-ha,apex,25/39,64.0
+2017-03-27 01:45,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-03-27 01:45,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-03-27 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-03-27 01:45,os-ocl-nofeature-ha,compass,5/30,17.0
+2017-03-27 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-03-27 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-03-27 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-03-27 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-03-27 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-03-27 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,4/42,10.0
+2017-03-27 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-03-27 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-03-27 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-03-27 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,4/39,10.0
+2017-03-27 01:45,os-odl_l2-bgpvpn-noha,fuel,26/42,62.0
+2017-03-27 01:45,os-odl_l2-sfc-noha,fuel,24/42,57.0
+2017-03-27 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-03-27 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-03-27 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-03-27 01:45,os-odl_l2-nofeature-noha,fuel,36/39,92.0
+2017-03-27 01:45,os-odl_l2-bgpvpn-ha,fuel,35/42,83.0
+2017-03-27 01:45,os-odl_l2-sfc-ha,fuel,25/45,56.0
+2017-03-27 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,24/39,62.0
+2017-03-27 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-03-27 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-03-27 01:45,os-nosdn-nofeature-ha,fuel,35/39,90.0
+2017-03-27 01:45,os-nosdn-lxd-noha,joid,13/24,54.0
+2017-03-27 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-03-27 01:45,os-nosdn-lxd-ha,joid,13/24,54.0
+2017-03-27 01:45,os-nosdn-nofeature-ha,joid,21/33,64.0
+2017-03-27 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-03-28 01:45,os-odl-gluon-noha,apex,33/39,85.0
+2017-03-28 01:45,os-odl_l2-fdio-noha,apex,28/36,78.0
+2017-03-28 01:45,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-03-28 01:45,os-odl_l3-nofeature-ha,apex,26/33,79.0
+2017-03-28 01:45,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-03-28 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-03-28 01:45,os-odl-bgpvpn-ha,apex,24/39,62.0
+2017-03-28 01:45,os-odl_l2-fdio-ha,apex,20/36,56.0
+2017-03-28 01:45,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-03-28 01:45,os-odl_l3-nofeature-ha,compass,21/30,70.0
+2017-03-28 01:45,os-ocl-nofeature-ha,compass,5/30,17.0
+2017-03-28 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-03-28 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-28 01:45,os-nosdn-openo-ha,compass,30/30,100.0
+2017-03-28 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-03-28 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-03-28 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-03-28 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-03-28 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-03-28 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-03-28 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-03-28 01:45,os-odl_l2-bgpvpn-noha,fuel,36/42,86.0
+2017-03-28 01:45,os-odl_l2-sfc-noha,fuel,27/42,64.0
+2017-03-28 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-03-28 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-03-28 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-03-28 01:45,os-odl_l2-nofeature-noha,fuel,37/39,95.0
+2017-03-28 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-03-28 01:45,os-odl_l2-sfc-ha,fuel,37/45,82.0
+2017-03-28 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,37/39,95.0
+2017-03-28 01:45,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-03-28 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-03-28 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-03-28 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-03-28 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-03-28 01:45,os-nosdn-lxd-ha,joid,13/24,54.0
+2017-03-28 01:45,os-nosdn-nofeature-ha,joid,21/33,64.0
+2017-03-28 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-03-28 13:20,os-odl-gluon-noha,apex,30/36,83.0
+2017-03-28 13:20,os-odl_l2-fdio-noha,apex,28/36,78.0
+2017-03-28 13:20,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-03-28 13:20,os-odl-bgpvpn-ha,apex,22/36,61.0
+2017-03-28 13:20,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-03-28 13:20,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-03-28 13:20,os-odl_l3-nofeature-ha,apex,26/33,79.0
+2017-03-28 13:20,os-odl_l2-fdio-ha,apex,25/36,69.0
+2017-03-28 13:20,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-03-28 13:20,os-odl_l3-nofeature-ha,compass,21/30,70.0
+2017-03-28 13:20,os-ocl-nofeature-ha,compass,4/30,13.0
+2017-03-28 13:20,os-onos-nofeature-ha,compass,27/33,82.0
+2017-03-28 13:20,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-28 13:20,os-nosdn-openo-ha,compass,30/30,100.0
+2017-03-28 13:20,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-03-28 13:20,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-03-28 13:20,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-03-28 13:20,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-03-28 13:20,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-03-28 13:20,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-03-28 13:20,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-03-28 13:20,os-odl_l2-bgpvpn-noha,fuel,36/42,86.0
+2017-03-28 13:20,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-03-28 13:20,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-03-28 13:20,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-03-28 13:20,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-03-28 13:20,os-odl_l2-nofeature-noha,fuel,37/39,95.0
+2017-03-28 13:20,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-03-28 13:20,os-odl_l2-sfc-ha,fuel,37/45,82.0
+2017-03-28 13:20,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,37/39,95.0
+2017-03-28 13:20,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-03-28 13:20,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-03-28 13:20,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-03-28 13:20,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-03-28 13:20,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-03-28 13:20,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-03-28 13:20,os-nosdn-nofeature-ha,joid,21/33,64.0
+2017-03-28 13:20,os-nosdn-lxd-ha,joid,13/24,54.0
+2017-03-28 13:56,os-odl-gluon-noha,apex,30/36,83.0
+2017-03-28 13:56,os-odl_l2-fdio-noha,apex,30/36,83.0
+2017-03-28 13:56,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-03-28 13:56,os-odl-bgpvpn-ha,apex,22/36,61.0
+2017-03-28 13:56,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-03-28 13:56,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-03-28 13:56,os-odl_l3-nofeature-ha,apex,26/33,79.0
+2017-03-28 13:56,os-odl_l2-fdio-ha,apex,28/36,78.0
+2017-03-28 13:56,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-03-28 13:56,os-odl_l3-nofeature-ha,compass,21/30,70.0
+2017-03-28 13:56,os-ocl-nofeature-ha,compass,4/30,13.0
+2017-03-28 13:56,os-onos-nofeature-ha,compass,27/33,82.0
+2017-03-28 13:56,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-28 13:56,os-nosdn-openo-ha,compass,30/30,100.0
+2017-03-28 13:56,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-03-28 13:56,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-03-28 13:56,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-03-28 13:56,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-03-28 13:56,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-03-28 13:56,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-03-28 13:56,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-03-28 13:56,os-odl_l2-bgpvpn-noha,fuel,36/42,86.0
+2017-03-28 13:56,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-03-28 13:56,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-03-28 13:56,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-03-28 13:56,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-03-28 13:56,os-odl_l2-nofeature-noha,fuel,37/39,95.0
+2017-03-28 13:56,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-03-28 13:56,os-odl_l2-sfc-ha,fuel,37/45,82.0
+2017-03-28 13:56,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,37/39,95.0
+2017-03-28 13:56,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-03-28 13:56,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-03-28 13:56,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-03-28 13:56,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-03-28 13:56,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-03-28 13:56,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-03-28 13:56,os-nosdn-nofeature-ha,joid,21/33,64.0
+2017-03-28 13:56,os-nosdn-lxd-ha,joid,13/24,54.0
+2017-03-28 16:16,os-odl-gluon-noha,apex,30/36,83.0
+2017-03-28 16:16,os-odl_l2-fdio-noha,apex,30/36,83.0
+2017-03-28 16:16,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-03-28 16:16,os-odl-bgpvpn-ha,apex,22/36,61.0
+2017-03-28 16:16,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-03-28 16:16,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-03-28 16:16,os-odl_l3-nofeature-ha,apex,26/33,79.0
+2017-03-28 16:16,os-odl_l2-fdio-ha,apex,28/36,78.0
+2017-03-28 16:16,os-nosdn-nofeature-ha,apex,33/33,100.0
+2017-03-28 16:16,os-odl_l3-nofeature-ha,compass,21/30,70.0
+2017-03-28 16:16,os-ocl-nofeature-ha,compass,4/30,13.0
+2017-03-28 16:16,os-onos-nofeature-ha,compass,27/33,82.0
+2017-03-28 16:16,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-28 16:16,os-nosdn-openo-ha,compass,29/30,97.0
+2017-03-28 16:16,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-03-28 16:16,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-03-28 16:16,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-03-28 16:16,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-03-28 16:16,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-03-28 16:16,os-odl_l3-nofeature-noha,fuel,34/36,94.0
+2017-03-28 16:16,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-03-28 16:16,os-odl_l2-bgpvpn-noha,fuel,36/42,86.0
+2017-03-28 16:16,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-03-28 16:16,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-03-28 16:16,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-03-28 16:16,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-03-28 16:16,os-odl_l2-nofeature-noha,fuel,37/39,95.0
+2017-03-28 16:16,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-03-28 16:16,os-odl_l2-sfc-ha,fuel,40/45,89.0
+2017-03-28 16:16,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,37/39,95.0
+2017-03-28 16:16,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-03-28 16:16,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-03-28 16:16,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-03-28 16:16,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-03-28 16:16,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-03-28 16:16,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-03-28 16:16,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-03-28 16:16,os-nosdn-lxd-ha,joid,13/24,54.0
+2017-03-29 01:45,os-odl-gluon-noha,apex,30/36,83.0
+2017-03-29 01:45,os-odl_l2-fdio-noha,apex,30/36,83.0
+2017-03-29 01:45,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-03-29 01:45,os-odl-bgpvpn-ha,apex,22/36,61.0
+2017-03-29 01:45,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-03-29 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-03-29 01:45,os-odl_l3-nofeature-ha,apex,27/33,82.0
+2017-03-29 01:45,os-odl_l2-fdio-ha,apex,28/36,78.0
+2017-03-29 01:45,os-nosdn-nofeature-ha,apex,33/33,100.0
+2017-03-29 01:45,os-odl_l3-nofeature-ha,compass,21/30,70.0
+2017-03-29 01:45,os-ocl-nofeature-ha,compass,4/30,13.0
+2017-03-29 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-03-29 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-29 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-03-29 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-03-29 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-03-29 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-03-29 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-03-29 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-03-29 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-03-29 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-03-29 01:45,os-odl_l2-bgpvpn-noha,fuel,36/42,86.0
+2017-03-29 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-03-29 01:45,os-odl_l3-nofeature-ha,fuel,34/39,87.0
+2017-03-29 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-03-29 01:45,os-odl_l3-nofeature-noha,fuel,34/36,94.0
+2017-03-29 01:45,os-odl_l2-nofeature-noha,fuel,36/39,92.0
+2017-03-29 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-03-29 01:45,os-odl_l2-sfc-ha,fuel,40/45,89.0
+2017-03-29 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-03-29 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-03-29 01:45,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-03-29 01:45,os-nosdn-nofeature-ha,fuel,37/39,95.0
+2017-03-29 01:45,os-nosdn-lxd-noha,joid,17/24,71.0
+2017-03-29 01:45,os-nosdn-nofeature-noha,joid,31/33,94.0
+2017-03-29 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-03-29 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-03-29 01:45,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-03-30 01:45,os-nosdn-fdio-noha,apex,15/30,50.0
+2017-03-30 01:45,os-odl-gluon-noha,apex,31/36,86.0
+2017-03-30 01:45,os-odl_l2-fdio-noha,apex,30/36,83.0
+2017-03-30 01:45,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-03-30 01:45,os-odl-bgpvpn-ha,apex,22/36,61.0
+2017-03-30 01:45,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-03-30 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-03-30 01:45,os-odl_l3-nofeature-ha,apex,27/33,82.0
+2017-03-30 01:45,os-nosdn-ovs-ha,apex,2/33,6.0
+2017-03-30 01:45,os-odl_l2-fdio-ha,apex,29/36,81.0
+2017-03-30 01:45,os-nosdn-nofeature-ha,apex,33/33,100.0
+2017-03-30 01:45,os-odl_l3-nofeature-ha,compass,21/30,70.0
+2017-03-30 01:45,os-ocl-nofeature-ha,compass,4/30,13.0
+2017-03-30 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-03-30 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-30 01:45,os-nosdn-openo-ha,compass,28/30,93.0
+2017-03-30 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-03-30 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-03-30 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-03-30 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-03-30 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-03-30 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-03-30 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-03-30 01:45,os-odl_l2-bgpvpn-noha,fuel,36/42,86.0
+2017-03-30 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-03-30 01:45,os-odl_l3-nofeature-ha,fuel,34/39,87.0
+2017-03-30 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-03-30 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-03-30 01:45,os-odl_l2-nofeature-noha,fuel,36/39,92.0
+2017-03-30 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-03-30 01:45,os-odl_l2-sfc-ha,fuel,42/45,93.0
+2017-03-30 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-03-30 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-03-30 01:45,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-03-30 01:45,os-nosdn-nofeature-ha,fuel,37/39,95.0
+2017-03-30 01:45,os-nosdn-lxd-noha,joid,17/24,71.0
+2017-03-30 01:45,os-nosdn-nofeature-noha,joid,31/33,94.0
+2017-03-30 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-03-30 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-03-30 01:45,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-03-31 01:45,os-nosdn-fdio-noha,apex,15/30,50.0
+2017-03-31 01:45,os-odl-gluon-noha,apex,30/36,83.0
+2017-03-31 01:45,os-odl_l2-fdio-noha,apex,30/36,83.0
+2017-03-31 01:45,os-odl_l3-fdio-noha,apex,20/30,67.0
+2017-03-31 01:45,os-odl-bgpvpn-ha,apex,21/36,58.0
+2017-03-31 01:45,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-03-31 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-03-31 01:45,os-odl_l3-nofeature-ha,apex,27/33,82.0
+2017-03-31 01:45,os-odl_l3-ovs-ha,apex,2/33,6.0
+2017-03-31 01:45,os-nosdn-ovs-ha,apex,2/33,6.0
+2017-03-31 01:45,os-odl_l2-fdio-ha,apex,29/36,81.0
+2017-03-31 01:45,os-nosdn-nofeature-ha,apex,33/33,100.0
+2017-03-31 01:45,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-03-31 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-03-31 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-03-31 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-03-31 01:45,os-nosdn-openo-ha,compass,28/30,93.0
+2017-03-31 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-03-31 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-03-31 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-03-31 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-03-31 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-03-31 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-03-31 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-03-31 01:45,os-odl_l3-nofeature-ha,fuel,31/39,79.0
+2017-03-31 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-03-31 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-03-31 01:45,os-odl_l2-nofeature-noha,fuel,36/39,92.0
+2017-03-31 01:45,os-odl_l2-bgpvpn-ha,fuel,37/42,88.0
+2017-03-31 01:45,os-odl_l2-sfc-ha,fuel,43/45,96.0
+2017-03-31 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-03-31 01:45,os-odl_l2-bgpvpn-noha,fuel,37/42,88.0
+2017-03-31 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-03-31 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-03-31 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-03-31 01:45,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-03-31 01:45,os-nosdn-lxd-noha,joid,17/24,71.0
+2017-03-31 01:45,os-nosdn-nofeature-noha,joid,31/33,94.0
+2017-03-31 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-03-31 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-03-31 01:45,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-04-01 01:45,os-nosdn-fdio-noha,apex,15/30,50.0
+2017-04-01 01:45,os-odl-gluon-noha,apex,24/36,67.0
+2017-04-01 01:45,os-odl_l2-fdio-noha,apex,30/36,83.0
+2017-04-01 01:45,os-odl_l3-fdio-noha,apex,20/30,67.0
+2017-04-01 01:45,os-odl_l3-nofeature-ha,apex,27/33,82.0
+2017-04-01 01:45,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-04-01 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-04-01 01:45,os-odl-bgpvpn-ha,apex,21/36,58.0
+2017-04-01 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-04-01 01:45,os-nosdn-ovs-ha,apex,2/33,6.0
+2017-04-01 01:45,os-odl_l2-fdio-ha,apex,29/36,81.0
+2017-04-01 01:45,os-nosdn-nofeature-ha,apex,33/33,100.0
+2017-04-01 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-04-01 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-01 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-04-01 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-04-01 01:45,os-nosdn-openo-ha,compass,28/30,93.0
+2017-04-01 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-04-01 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-01 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-01 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-04-01 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-01 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-01 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-04-01 01:45,os-odl_l3-nofeature-ha,fuel,32/39,82.0
+2017-04-01 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-04-01 01:45,os-odl_l2-nofeature-ha,fuel,39/42,93.0
+2017-04-01 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-04-01 01:45,os-odl_l2-nofeature-noha,fuel,36/39,92.0
+2017-04-01 01:45,os-odl_l2-bgpvpn-ha,fuel,34/42,81.0
+2017-04-01 01:45,os-odl_l3-nofeature-noha,fuel,34/36,94.0
+2017-04-01 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-01 01:45,os-odl_l2-bgpvpn-noha,fuel,38/42,90.0
+2017-04-01 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-04-01 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-01 01:45,os-nosdn-nofeature-ha,fuel,37/39,95.0
+2017-04-01 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-04-01 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-04-01 01:45,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-04-01 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-04-01 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-04-02 01:45,os-nosdn-fdio-noha,apex,15/30,50.0
+2017-04-02 01:45,os-odl-gluon-noha,apex,24/36,67.0
+2017-04-02 01:45,os-odl_l2-fdio-noha,apex,30/36,83.0
+2017-04-02 01:45,os-odl_l3-fdio-noha,apex,13/30,43.0
+2017-04-02 01:45,os-odl-bgpvpn-ha,apex,21/36,58.0
+2017-04-02 01:45,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-04-02 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-04-02 01:45,os-odl_l3-nofeature-ha,apex,27/33,82.0
+2017-04-02 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-04-02 01:45,os-nosdn-ovs-ha,apex,2/33,6.0
+2017-04-02 01:45,os-odl_l2-fdio-ha,apex,29/36,81.0
+2017-04-02 01:45,os-nosdn-nofeature-ha,apex,33/33,100.0
+2017-04-02 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-04-02 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-02 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-04-02 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-04-02 01:45,os-nosdn-openo-ha,compass,28/30,93.0
+2017-04-02 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-04-02 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-04-02 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-02 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-02 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-02 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-02 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-02 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-04-02 01:45,os-odl_l3-nofeature-ha,fuel,32/39,82.0
+2017-04-02 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-04-02 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-04-02 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-04-02 01:45,os-odl_l2-bgpvpn-ha,fuel,34/42,81.0
+2017-04-02 01:45,os-odl_l2-sfc-ha,fuel,40/45,89.0
+2017-04-02 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-02 01:45,os-odl_l2-bgpvpn-noha,fuel,38/42,90.0
+2017-04-02 01:45,os-odl_l2-nofeature-ha,fuel,37/42,88.0
+2017-04-02 01:45,os-odl_l3-nofeature-noha,fuel,34/36,94.0
+2017-04-02 01:45,os-nosdn-nofeature-ha,fuel,37/39,95.0
+2017-04-02 01:45,os-odl_l2-nofeature-ha,joid,6/36,17.0
+2017-04-02 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-04-02 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-04-02 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-04-02 01:45,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-04-03 01:45,os-nosdn-fdio-noha,apex,15/30,50.0
+2017-04-03 01:45,os-odl-gluon-noha,apex,29/36,81.0
+2017-04-03 01:45,os-odl_l2-fdio-noha,apex,29/36,81.0
+2017-04-03 01:45,os-odl_l3-fdio-noha,apex,13/30,43.0
+2017-04-03 01:45,os-odl_l3-nofeature-ha,apex,27/33,82.0
+2017-04-03 01:45,os-odl_l2-fdio-ha,apex,26/36,72.0
+2017-04-03 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-04-03 01:45,os-odl-bgpvpn-ha,apex,21/36,58.0
+2017-04-03 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-04-03 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-04-03 01:45,os-nosdn-kvm-ha,apex,33/33,100.0
+2017-04-03 01:45,os-nosdn-nofeature-ha,apex,33/33,100.0
+2017-04-03 01:45,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-04-03 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-03 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-04-03 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-04-03 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-04-03 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-04-03 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-04-03 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-03 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-03 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-03 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-03 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-03 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-04-03 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-04-03 01:45,os-odl_l3-nofeature-ha,fuel,32/39,82.0
+2017-04-03 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-04-03 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-04-03 01:45,os-odl_l3-nofeature-noha,fuel,34/36,94.0
+2017-04-03 01:45,os-odl_l2-bgpvpn-ha,fuel,35/42,83.0
+2017-04-03 01:45,os-odl_l2-sfc-ha,fuel,39/45,87.0
+2017-04-03 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-03 01:45,os-odl_l2-bgpvpn-noha,fuel,39/42,93.0
+2017-04-03 01:45,os-odl_l2-nofeature-ha,fuel,38/42,90.0
+2017-04-03 01:45,os-nosdn-nofeature-ha,fuel,36/39,92.0
+2017-04-03 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-04-03 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-04-03 01:45,os-nosdn-lxd-ha,joid,12/24,50.0
+2017-04-03 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-04-03 01:45,os-odl_l2-nofeature-ha,joid,6/36,17.0
+2017-04-04 01:45,os-nosdn-fdio-noha,apex,15/30,50.0
+2017-04-04 01:45,os-odl-gluon-noha,apex,30/36,83.0
+2017-04-04 01:45,os-ovn-nofeature-noha,apex,3/33,9.0
+2017-04-04 01:45,os-odl_l2-fdio-noha,apex,29/36,81.0
+2017-04-04 01:45,os-odl_l3-fdio-noha,apex,6/30,20.0
+2017-04-04 01:45,os-odl_l3-nofeature-ha,apex,26/33,79.0
+2017-04-04 01:45,os-nosdn-kvm-ha,apex,33/33,100.0
+2017-04-04 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-04-04 01:45,os-odl-bgpvpn-ha,apex,22/36,61.0
+2017-04-04 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-04-04 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-04-04 01:45,os-odl_l2-fdio-ha,apex,26/36,72.0
+2017-04-04 01:45,os-nosdn-nofeature-ha,apex,33/33,100.0
+2017-04-04 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-04-04 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-04 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-04-04 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-04-04 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-04-04 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-04-04 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-04-04 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-04 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-04 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-04 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-04 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-04 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-04-04 01:45,os-odl_l2-sfc-ha,fuel,39/45,87.0
+2017-04-04 01:45,os-nosdn-kvm-ha,fuel,36/39,92.0
+2017-04-04 01:45,os-nosdn-nofeature-noha,fuel,35/36,97.0
+2017-04-04 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-04-04 01:45,os-odl_l2-bgpvpn-ha,fuel,36/42,86.0
+2017-04-04 01:45,os-odl_l3-nofeature-ha,fuel,34/39,87.0
+2017-04-04 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-04 01:45,os-odl_l2-bgpvpn-noha,fuel,39/42,93.0
+2017-04-04 01:45,os-odl_l2-nofeature-ha,fuel,38/42,90.0
+2017-04-04 01:45,os-odl_l3-nofeature-noha,fuel,34/36,94.0
+2017-04-04 01:45,os-nosdn-nofeature-ha,fuel,37/39,95.0
+2017-04-04 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-04-04 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-04-04 01:45,os-nosdn-lxd-ha,joid,12/24,50.0
+2017-04-04 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-04-04 01:45,os-odl_l2-nofeature-ha,joid,6/36,17.0
+2017-04-05 01:45,os-nosdn-fdio-noha,apex,15/30,50.0
+2017-04-05 01:45,os-odl-gluon-noha,apex,29/36,81.0
+2017-04-05 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-04-05 01:45,os-odl_l2-fdio-noha,apex,29/36,81.0
+2017-04-05 01:45,os-odl_l3-fdio-noha,apex,6/30,20.0
+2017-04-05 01:45,os-odl-bgpvpn-ha,apex,21/36,58.0
+2017-04-05 01:45,os-nosdn-kvm-ha,apex,33/33,100.0
+2017-04-05 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-04-05 01:45,os-odl_l3-nofeature-ha,apex,26/33,79.0
+2017-04-05 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-04-05 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-04-05 01:45,os-odl_l2-fdio-ha,apex,28/36,78.0
+2017-04-05 01:45,os-nosdn-nofeature-ha,apex,33/33,100.0
+2017-04-05 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-04-05 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-05 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-04-05 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-04-05 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-04-05 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-04-05 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-04-05 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-05 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-05 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-05 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-05 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-05 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-04-05 01:45,os-odl_l2-sfc-ha,fuel,39/45,87.0
+2017-04-05 01:45,os-nosdn-kvm-ha,fuel,36/39,92.0
+2017-04-05 01:45,os-nosdn-nofeature-noha,fuel,35/36,97.0
+2017-04-05 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-04-05 01:45,os-odl_l2-bgpvpn-ha,fuel,36/42,86.0
+2017-04-05 01:45,os-odl_l3-nofeature-ha,fuel,35/39,90.0
+2017-04-05 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-05 01:45,os-odl_l2-bgpvpn-noha,fuel,39/42,93.0
+2017-04-05 01:45,os-odl_l2-nofeature-ha,fuel,37/42,88.0
+2017-04-05 01:45,os-odl_l3-nofeature-noha,fuel,33/36,92.0
+2017-04-05 01:45,os-nosdn-nofeature-ha,fuel,36/39,92.0
+2017-04-05 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-04-05 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-04-05 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-04-05 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-04-05 01:45,os-nosdn-lxd-ha,joid,12/24,50.0
+2017-04-06 01:45,os-nosdn-fdio-noha,apex,15/30,50.0
+2017-04-06 01:45,os-odl-gluon-noha,apex,29/36,81.0
+2017-04-06 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-04-06 01:45,os-odl_l2-fdio-noha,apex,29/36,81.0
+2017-04-06 01:45,os-odl_l3-fdio-noha,apex,4/30,13.0
+2017-04-06 01:45,os-odl-bgpvpn-ha,apex,27/36,75.0
+2017-04-06 01:45,os-odl_l2-fdio-ha,apex,28/36,78.0
+2017-04-06 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-04-06 01:45,os-odl_l3-nofeature-ha,apex,25/33,76.0
+2017-04-06 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-04-06 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-04-06 01:45,os-nosdn-kvm-ha,apex,22/33,67.0
+2017-04-06 01:45,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-04-06 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-04-06 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-06 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-04-06 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-04-06 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-04-06 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-04-06 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-04-06 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-06 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-06 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-06 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-06 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-06 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-04-06 01:45,os-odl_l2-sfc-ha,fuel,39/45,87.0
+2017-04-06 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-04-06 01:45,os-nosdn-nofeature-noha,fuel,35/36,97.0
+2017-04-06 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-04-06 01:45,os-odl_l2-bgpvpn-ha,fuel,36/42,86.0
+2017-04-06 01:45,os-odl_l3-nofeature-ha,fuel,35/39,90.0
+2017-04-06 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-06 01:45,os-odl_l2-bgpvpn-noha,fuel,39/42,93.0
+2017-04-06 01:45,os-odl_l2-nofeature-ha,fuel,38/42,90.0
+2017-04-06 01:45,os-odl_l3-nofeature-noha,fuel,32/36,89.0
+2017-04-06 01:45,os-nosdn-nofeature-ha,fuel,35/39,90.0
+2017-04-06 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-04-06 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-04-06 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-04-06 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-04-06 01:45,os-nosdn-lxd-ha,joid,12/24,50.0
+2017-04-07 01:45,os-nosdn-fdio-noha,apex,15/30,50.0
+2017-04-07 01:45,os-odl-gluon-noha,apex,27/36,75.0
+2017-04-07 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-04-07 01:45,os-odl_l2-fdio-noha,apex,30/36,83.0
+2017-04-07 01:45,os-odl_l3-fdio-noha,apex,6/30,20.0
+2017-04-07 01:45,os-odl-bgpvpn-ha,apex,27/36,75.0
+2017-04-07 01:45,os-odl_l2-fdio-ha,apex,28/36,78.0
+2017-04-07 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-04-07 01:45,os-odl_l3-nofeature-ha,apex,25/33,76.0
+2017-04-07 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-04-07 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-04-07 01:45,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-04-07 01:45,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-04-07 01:45,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-04-07 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-07 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-04-07 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-04-07 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-04-07 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-04-07 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-04-07 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-07 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-07 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-07 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-07 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-07 01:45,os-odl_l2-nofeature-noha,fuel,33/39,85.0
+2017-04-07 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-04-07 01:45,os-odl_l3-nofeature-ha,fuel,34/39,87.0
+2017-04-07 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-04-07 01:45,os-nosdn-nofeature-noha,fuel,35/36,97.0
+2017-04-07 01:45,os-odl_l3-nofeature-noha,fuel,32/36,89.0
+2017-04-07 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-04-07 01:45,os-odl_l2-sfc-ha,fuel,42/45,93.0
+2017-04-07 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-07 01:45,os-odl_l2-bgpvpn-noha,fuel,39/42,93.0
+2017-04-07 01:45,os-odl_l2-nofeature-ha,fuel,37/42,88.0
+2017-04-07 01:45,os-nosdn-nofeature-ha,fuel,36/39,92.0
+2017-04-07 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-04-07 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-04-07 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-04-07 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-04-07 01:45,os-nosdn-lxd-ha,joid,12/24,50.0
+2017-04-08 01:45,os-nosdn-fdio-noha,apex,15/30,50.0
+2017-04-08 01:45,os-odl-gluon-noha,apex,27/36,75.0
+2017-04-08 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-04-08 01:45,os-odl_l2-fdio-noha,apex,30/36,83.0
+2017-04-08 01:45,os-odl_l3-fdio-noha,apex,6/30,20.0
+2017-04-08 01:45,os-odl_l3-nofeature-ha,apex,18/33,55.0
+2017-04-08 01:45,os-nosdn-kvm-ha,apex,32/33,97.0
+2017-04-08 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-04-08 01:45,os-odl-bgpvpn-ha,apex,19/36,53.0
+2017-04-08 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-04-08 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-04-08 01:45,os-odl_l2-fdio-ha,apex,27/36,75.0
+2017-04-08 01:45,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-04-08 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-04-08 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-08 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-04-08 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-04-08 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-04-08 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-04-08 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-04-08 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-08 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-08 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-08 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-08 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-08 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-04-08 01:45,os-odl_l3-nofeature-ha,fuel,35/39,90.0
+2017-04-08 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-04-08 01:45,os-nosdn-nofeature-noha,fuel,35/36,97.0
+2017-04-08 01:45,os-odl_l2-nofeature-noha,fuel,33/39,85.0
+2017-04-08 01:45,os-odl_l2-bgpvpn-ha,fuel,37/42,88.0
+2017-04-08 01:45,os-odl_l2-sfc-ha,fuel,42/45,93.0
+2017-04-08 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-08 01:45,os-odl_l2-bgpvpn-noha,fuel,39/42,93.0
+2017-04-08 01:45,os-odl_l2-nofeature-ha,fuel,37/42,88.0
+2017-04-08 01:45,os-odl_l3-nofeature-noha,fuel,32/36,89.0
+2017-04-08 01:45,os-nosdn-nofeature-ha,fuel,35/39,90.0
+2017-04-08 01:45,os-nosdn-lxd-noha,joid,12/24,50.0
+2017-04-08 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-04-08 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-04-08 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-04-08 01:45,os-nosdn-lxd-ha,joid,12/24,50.0
+2017-04-09 01:45,os-odl-gluon-noha,apex,18/36,50.0
+2017-04-09 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-04-09 01:45,os-odl_l2-fdio-noha,apex,22/36,61.0
+2017-04-09 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-04-09 01:45,os-odl-bgpvpn-ha,apex,19/36,53.0
+2017-04-09 01:45,os-odl_l2-fdio-ha,apex,27/36,75.0
+2017-04-09 01:45,os-odl_l3-fdio-noha,apex,4/30,13.0
+2017-04-09 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-04-09 01:45,os-odl_l3-nofeature-ha,apex,18/33,55.0
+2017-04-09 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-04-09 01:45,os-nosdn-kvm-ha,apex,22/33,67.0
+2017-04-09 01:45,os-nosdn-nofeature-ha,apex,32/33,97.0
+2017-04-09 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-04-09 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-09 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-04-09 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-04-09 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-04-09 01:45,os-nosdn-nofeature-ha,compass,28/30,93.0
+2017-04-09 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-04-09 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-09 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-09 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-09 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-09 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-09 01:45,os-odl_l2-nofeature-noha,fuel,33/39,85.0
+2017-04-09 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-04-09 01:45,os-odl_l3-nofeature-ha,fuel,34/39,87.0
+2017-04-09 01:45,os-nosdn-kvm-ha,fuel,38/39,97.0
+2017-04-09 01:45,os-nosdn-nofeature-noha,fuel,35/36,97.0
+2017-04-09 01:45,os-odl_l3-nofeature-noha,fuel,33/36,92.0
+2017-04-09 01:45,os-odl_l2-bgpvpn-ha,fuel,37/42,88.0
+2017-04-09 01:45,os-odl_l2-sfc-ha,fuel,40/45,89.0
+2017-04-09 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-09 01:45,os-odl_l2-bgpvpn-noha,fuel,39/42,93.0
+2017-04-09 01:45,os-odl_l2-nofeature-ha,fuel,39/42,93.0
+2017-04-09 01:45,os-nosdn-nofeature-ha,fuel,36/39,92.0
+2017-04-09 01:45,os-nosdn-lxd-noha,joid,12/24,50.0
+2017-04-09 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-04-09 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-04-09 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-04-09 01:45,os-nosdn-lxd-ha,joid,12/24,50.0
+2017-04-10 01:45,os-odl-gluon-noha,apex,18/36,50.0
+2017-04-10 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-04-10 01:45,os-odl_l2-fdio-noha,apex,22/36,61.0
+2017-04-10 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-04-10 01:45,os-odl-bgpvpn-ha,apex,19/36,53.0
+2017-04-10 01:45,os-odl_l2-fdio-ha,apex,21/36,58.0
+2017-04-10 01:45,os-odl_l3-fdio-noha,apex,4/30,13.0
+2017-04-10 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-04-10 01:45,os-odl_l3-nofeature-ha,apex,18/33,55.0
+2017-04-10 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-04-10 01:45,os-nosdn-kvm-ha,apex,22/33,67.0
+2017-04-10 01:45,os-nosdn-nofeature-ha,apex,22/33,67.0
+2017-04-10 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-04-10 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-10 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-04-10 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-04-10 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-04-10 01:45,os-nosdn-nofeature-ha,compass,28/30,93.0
+2017-04-10 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-04-10 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-10 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-10 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-10 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-10 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-10 01:45,os-odl_l2-sfc-noha,fuel,32/42,76.0
+2017-04-10 01:45,os-odl_l3-nofeature-ha,fuel,35/39,90.0
+2017-04-10 01:45,os-nosdn-kvm-ha,fuel,38/39,97.0
+2017-04-10 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-04-10 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-04-10 01:45,os-odl_l2-bgpvpn-ha,fuel,37/42,88.0
+2017-04-10 01:45,os-odl_l2-sfc-ha,fuel,39/45,87.0
+2017-04-10 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-10 01:45,os-odl_l2-bgpvpn-noha,fuel,39/42,93.0
+2017-04-10 01:45,os-odl_l2-nofeature-ha,fuel,39/42,93.0
+2017-04-10 01:45,os-odl_l3-nofeature-noha,fuel,33/36,92.0
+2017-04-10 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-04-10 01:45,os-nosdn-lxd-noha,joid,12/24,50.0
+2017-04-10 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-04-10 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-04-10 01:45,os-nosdn-nofeature-ha,joid,21/33,64.0
+2017-04-10 01:45,os-nosdn-lxd-ha,joid,12/24,50.0
+2017-04-11 01:45,os-odl-gluon-noha,apex,18/36,50.0
+2017-04-11 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-04-11 01:45,os-odl_l2-fdio-noha,apex,22/36,61.0
+2017-04-11 01:45,os-odl_l3-fdio-noha,apex,4/30,13.0
+2017-04-11 01:45,os-odl-bgpvpn-ha,apex,19/36,53.0
+2017-04-11 01:45,os-odl_l2-fdio-ha,apex,21/36,58.0
+2017-04-11 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-04-11 01:45,os-odl_l3-nofeature-ha,apex,18/33,55.0
+2017-04-11 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-04-11 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-04-11 01:45,os-nosdn-kvm-ha,apex,22/33,67.0
+2017-04-11 01:45,os-nosdn-nofeature-ha,apex,22/33,67.0
+2017-04-11 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-04-11 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-11 01:45,os-onos-nofeature-ha,compass,29/33,88.0
+2017-04-11 01:45,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-04-11 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-04-11 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-04-11 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-04-11 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-11 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-11 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-11 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-11 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-11 01:45,os-odl_l2-sfc-noha,fuel,32/42,76.0
+2017-04-11 01:45,os-odl_l3-nofeature-ha,fuel,34/39,87.0
+2017-04-11 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-04-11 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-04-11 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-04-11 01:45,os-odl_l2-bgpvpn-ha,fuel,36/42,86.0
+2017-04-11 01:45,os-odl_l2-sfc-ha,fuel,39/45,87.0
+2017-04-11 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-11 01:45,os-odl_l2-bgpvpn-noha,fuel,39/42,93.0
+2017-04-11 01:45,os-odl_l2-nofeature-ha,fuel,38/42,90.0
+2017-04-11 01:45,os-odl_l3-nofeature-noha,fuel,33/36,92.0
+2017-04-11 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-04-11 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-04-11 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-04-11 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-04-11 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-04-11 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-04-12 01:45,os-odl-gluon-noha,apex,18/36,50.0
+2017-04-12 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-04-12 01:45,os-odl_l2-fdio-noha,apex,22/36,61.0
+2017-04-12 01:45,os-odl_l3-fdio-noha,apex,4/30,13.0
+2017-04-12 01:45,os-odl_l3-nofeature-ha,apex,17/33,52.0
+2017-04-12 01:45,os-nosdn-kvm-ha,apex,22/33,67.0
+2017-04-12 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-04-12 01:45,os-odl-bgpvpn-ha,apex,19/36,53.0
+2017-04-12 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-04-12 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-04-12 01:45,os-odl_l2-fdio-ha,apex,21/36,58.0
+2017-04-12 01:45,os-nosdn-nofeature-ha,apex,21/33,64.0
+2017-04-12 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-04-12 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-12 01:45,os-onos-nofeature-ha,compass,29/33,88.0
+2017-04-12 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-04-12 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-04-12 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-04-12 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-04-12 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-12 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-12 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-12 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-12 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-12 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-04-12 01:45,os-odl_l2-sfc-noha,fuel,34/42,81.0
+2017-04-12 01:45,os-odl_l3-nofeature-ha,fuel,34/39,87.0
+2017-04-12 01:45,os-nosdn-kvm-ha,fuel,37/39,95.0
+2017-04-12 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-04-12 01:45,os-odl_l3-nofeature-noha,fuel,33/36,92.0
+2017-04-12 01:45,os-odl_l2-bgpvpn-ha,fuel,36/42,86.0
+2017-04-12 01:45,os-odl_l2-sfc-ha,fuel,39/45,87.0
+2017-04-12 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-12 01:45,os-odl_l2-bgpvpn-noha,fuel,39/42,93.0
+2017-04-12 01:45,os-odl_l2-nofeature-ha,fuel,38/42,90.0
+2017-04-12 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-04-12 01:45,os-nosdn-lxd-noha,joid,12/24,50.0
+2017-04-12 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-04-12 01:45,os-odl_l2-nofeature-ha,joid,1/36,3.0
+2017-04-12 01:45,os-nosdn-nofeature-ha,joid,12/33,36.0
+2017-04-12 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-04-28 20:23,os-nosdn-fdio-noha,apex,28/30,93.0
+2017-04-28 20:23,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-04-28 20:23,os-odl_l2-fdio-noha,apex,19/36,53.0
+2017-04-28 20:23,os-odl_l3-fdio-noha,apex,24/30,80.0
+2017-04-28 20:23,os-odl_l3-nofeature-ha,apex,16/33,48.0
+2017-04-28 20:23,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-04-28 20:23,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-04-28 20:23,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-04-28 20:23,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-04-28 20:23,os-odl_l2-fdio-ha,apex,26/36,72.0
+2017-04-28 20:23,os-nosdn-nofeature-ha,apex,20/33,61.0
+2017-04-28 20:23,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-04-28 20:23,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-28 20:23,os-onos-nofeature-ha,compass,29/33,88.0
+2017-04-28 20:23,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-04-28 20:23,os-nosdn-openo-ha,compass,30/30,100.0
+2017-04-28 20:23,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-04-28 20:23,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-04-28 20:23,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-28 20:23,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-28 20:23,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-28 20:23,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-28 20:23,os-odl_l2-bgpvpn-noha,fuel,40/42,95.0
+2017-04-28 20:23,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-04-28 20:23,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-04-28 20:23,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-04-28 20:23,os-odl_l3-nofeature-noha,fuel,33/36,92.0
+2017-04-28 20:23,os-odl_l2-nofeature-noha,fuel,34/39,87.0
+2017-04-28 20:23,os-odl_l2-bgpvpn-ha,fuel,37/42,88.0
+2017-04-28 20:23,os-odl_l2-sfc-ha,fuel,41/45,91.0
+2017-04-28 20:23,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-28 20:23,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-28 20:23,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-04-28 20:23,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-04-28 20:23,os-nosdn-nofeature-ha,fuel,37/39,95.0
+2017-04-28 20:23,os-nosdn-lxd-noha,joid,11/24,46.0
+2017-04-28 20:23,os-odl_l2-nofeature-ha,joid,8/36,22.0
+2017-04-28 20:23,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-04-28 20:23,os-nosdn-nofeature-ha,joid,29/33,88.0
+2017-04-28 20:23,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-04-29 01:45,os-nosdn-fdio-noha,apex,28/30,93.0
+2017-04-29 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-04-29 01:45,os-odl_l2-fdio-noha,apex,19/36,53.0
+2017-04-29 01:45,os-odl_l3-fdio-noha,apex,24/30,80.0
+2017-04-29 01:45,os-odl_l3-nofeature-ha,apex,16/33,48.0
+2017-04-29 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-04-29 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-04-29 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-04-29 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-04-29 01:45,os-odl_l2-fdio-ha,apex,30/36,83.0
+2017-04-29 01:45,os-nosdn-nofeature-ha,apex,20/33,61.0
+2017-04-29 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-04-29 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-29 01:45,os-onos-nofeature-ha,compass,29/33,88.0
+2017-04-29 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-04-29 01:45,os-nosdn-openo-ha,compass,30/30,100.0
+2017-04-29 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-04-29 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-04-29 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-29 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-29 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-29 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-29 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-29 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-04-29 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-04-29 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-04-29 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-04-29 01:45,os-odl_l2-nofeature-noha,fuel,34/39,87.0
+2017-04-29 01:45,os-odl_l2-bgpvpn-ha,fuel,37/42,88.0
+2017-04-29 01:45,os-odl_l2-sfc-ha,fuel,41/45,91.0
+2017-04-29 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-29 01:45,os-odl_l2-bgpvpn-noha,fuel,40/42,95.0
+2017-04-29 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-04-29 01:45,os-odl_l3-nofeature-noha,fuel,33/36,92.0
+2017-04-29 01:45,os-nosdn-nofeature-ha,fuel,37/39,95.0
+2017-04-29 01:45,os-nosdn-lxd-noha,joid,11/24,46.0
+2017-04-29 01:45,os-odl_l2-nofeature-ha,joid,8/36,22.0
+2017-04-29 01:45,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-04-29 01:45,os-nosdn-nofeature-ha,joid,29/33,88.0
+2017-04-29 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-04-30 01:45,os-nosdn-fdio-noha,apex,28/30,93.0
+2017-04-30 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-04-30 01:45,os-odl_l2-fdio-noha,apex,19/36,53.0
+2017-04-30 01:45,os-odl_l3-fdio-noha,apex,24/30,80.0
+2017-04-30 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-04-30 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-04-30 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-04-30 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-04-30 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-04-30 01:45,os-odl_l2-fdio-ha,apex,30/36,83.0
+2017-04-30 01:45,os-nosdn-nofeature-ha,apex,20/33,61.0
+2017-04-30 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-04-30 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-04-30 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-04-30 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-04-30 01:45,os-nosdn-openo-ha,compass,30/30,100.0
+2017-04-30 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-04-30 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-04-30 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-04-30 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-04-30 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-04-30 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-04-30 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-04-30 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-04-30 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-04-30 01:45,os-nosdn-kvm-ha,fuel,38/39,97.0
+2017-04-30 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-04-30 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-04-30 01:45,os-odl_l2-bgpvpn-ha,fuel,37/42,88.0
+2017-04-30 01:45,os-odl_l2-sfc-ha,fuel,42/45,93.0
+2017-04-30 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-04-30 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-04-30 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-04-30 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-04-30 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-04-30 01:45,os-nosdn-lxd-noha,joid,12/24,50.0
+2017-04-30 01:45,os-nosdn-nofeature-noha,joid,33/33,100.0
+2017-04-30 01:45,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-04-30 01:45,os-nosdn-nofeature-ha,joid,21/33,64.0
+2017-04-30 01:45,os-odl_l2-nofeature-ha,joid,8/36,22.0
+2017-05-01 01:45,os-nosdn-fdio-noha,apex,28/30,93.0
+2017-05-01 01:45,os-odl-gluon-noha,apex,9/36,25.0
+2017-05-01 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-05-01 01:45,os-odl-bgpvpn-ha,apex,8/36,22.0
+2017-05-01 01:45,os-odl_l2-fdio-noha,apex,28/36,78.0
+2017-05-01 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-05-01 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-05-01 01:45,os-nosdn-kvm-ha,apex,30/33,91.0
+2017-05-01 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-05-01 01:45,os-odl_l3-fdio-noha,apex,23/30,77.0
+2017-05-01 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-05-01 01:45,os-odl_l2-fdio-ha,apex,29/36,81.0
+2017-05-01 01:45,os-nosdn-nofeature-ha,apex,20/33,61.0
+2017-05-01 01:45,os-odl_l3-fdio-ha,apex,24/30,80.0
+2017-05-01 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-05-01 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-05-01 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-01 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-05-01 01:45,os-nosdn-openo-ha,compass,30/30,100.0
+2017-05-01 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-05-01 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-01 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-01 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-01 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-01 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-05-01 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-05-01 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-05-01 01:45,os-nosdn-kvm-ha,fuel,38/39,97.0
+2017-05-01 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-05-01 01:45,os-odl_l2-nofeature-noha,fuel,36/39,92.0
+2017-05-01 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-05-01 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-05-01 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-01 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-05-01 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-05-01 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-01 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-01 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-01 01:45,os-nosdn-lxd-noha,joid,17/24,71.0
+2017-05-01 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-05-01 01:45,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-05-01 01:45,os-nosdn-nofeature-ha,joid,17/33,52.0
+2017-05-01 01:45,os-nosdn-nofeature-noha,joid,33/33,100.0
+2017-05-02 01:45,os-nosdn-fdio-noha,apex,28/30,93.0
+2017-05-02 01:45,os-odl-gluon-noha,apex,18/36,50.0
+2017-05-02 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-05-02 01:45,os-odl-bgpvpn-ha,apex,16/36,44.0
+2017-05-02 01:45,os-odl_l2-fdio-noha,apex,28/36,78.0
+2017-05-02 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-05-02 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-05-02 01:45,os-nosdn-kvm-ha,apex,30/33,91.0
+2017-05-02 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-05-02 01:45,os-odl_l3-fdio-noha,apex,23/30,77.0
+2017-05-02 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-05-02 01:45,os-odl_l2-fdio-ha,apex,29/36,81.0
+2017-05-02 01:45,os-nosdn-nofeature-ha,apex,30/33,91.0
+2017-05-02 01:45,os-odl_l3-fdio-ha,apex,24/30,80.0
+2017-05-02 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-05-02 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-05-02 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-02 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-05-02 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-05-02 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-05-02 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-02 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-05-02 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-02 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-02 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-02 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-05-02 01:45,os-odl_l2-sfc-noha,fuel,38/42,90.0
+2017-05-02 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-05-02 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-02 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-02 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-05-02 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-05-02 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-05-02 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-02 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-02 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-02 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-02 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-05-02 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-05-02 01:45,os-nosdn-nofeature-noha,joid,33/33,100.0
+2017-05-02 01:45,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-05-02 01:45,os-nosdn-nofeature-ha,joid,18/33,55.0
+2017-05-02 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-05-03 01:45,os-nosdn-fdio-noha,apex,28/30,93.0
+2017-05-03 01:45,os-odl-gluon-noha,apex,18/36,50.0
+2017-05-03 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-05-03 01:45,os-odl-bgpvpn-ha,apex,16/36,44.0
+2017-05-03 01:45,os-odl_l2-fdio-noha,apex,29/36,81.0
+2017-05-03 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-05-03 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-05-03 01:45,os-nosdn-kvm-ha,apex,30/33,91.0
+2017-05-03 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-05-03 01:45,os-odl_l3-fdio-noha,apex,23/30,77.0
+2017-05-03 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-05-03 01:45,os-odl_l2-fdio-ha,apex,30/36,83.0
+2017-05-03 01:45,os-nosdn-nofeature-ha,apex,30/33,91.0
+2017-05-03 01:45,os-odl_l3-fdio-ha,apex,24/30,80.0
+2017-05-03 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-05-03 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-05-03 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-05-03 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-05-03 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-05-03 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-03 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-03 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-05-03 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-03 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-03 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-05-03 01:45,os-odl_l2-sfc-noha,fuel,39/42,93.0
+2017-05-03 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-05-03 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-03 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-03 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-05-03 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-05-03 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-03 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-03 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-03 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-03 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-03 01:45,os-nosdn-nofeature-ha,fuel,37/39,95.0
+2017-05-03 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-03 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-05-03 01:45,os-nosdn-nofeature-noha,joid,33/33,100.0
+2017-05-03 01:45,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-05-03 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-05-03 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-05-04 01:45,os-nosdn-fdio-noha,apex,28/30,93.0
+2017-05-04 01:45,os-odl-gluon-noha,apex,18/36,50.0
+2017-05-04 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-05-04 01:45,os-odl-bgpvpn-ha,apex,16/36,44.0
+2017-05-04 01:45,os-odl_l2-fdio-noha,apex,29/36,81.0
+2017-05-04 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-05-04 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-05-04 01:45,os-nosdn-kvm-ha,apex,30/33,91.0
+2017-05-04 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-05-04 01:45,os-odl_l3-fdio-noha,apex,23/30,77.0
+2017-05-04 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-05-04 01:45,os-odl_l2-fdio-ha,apex,30/36,83.0
+2017-05-04 01:45,os-nosdn-nofeature-ha,apex,30/33,91.0
+2017-05-04 01:45,os-odl_l3-fdio-ha,apex,24/30,80.0
+2017-05-04 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-05-04 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-05-04 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-05-04 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-05-04 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-05-04 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-05-04 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-04 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,6/42,14.0
+2017-05-04 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-04 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-04 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-05-04 01:45,os-odl_l2-sfc-noha,fuel,39/42,93.0
+2017-05-04 01:45,os-odl_l3-nofeature-ha,fuel,38/39,97.0
+2017-05-04 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-04 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-04 01:45,os-odl_l2-nofeature-noha,fuel,37/39,95.0
+2017-05-04 01:45,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-05-04 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-04 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-05-04 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-04 01:45,os-odl_l2-nofeature-ha,fuel,40/42,95.0
+2017-05-04 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-04 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-04 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-05-04 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-05-04 01:45,os-nosdn-nofeature-noha,joid,33/33,100.0
+2017-05-04 01:45,os-nosdn-lxd-ha,joid,18/24,75.0
+2017-05-04 01:45,os-nosdn-nofeature-ha,joid,29/33,88.0
+2017-05-04 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-05-05 01:45,os-nosdn-fdio-noha,apex,28/30,93.0
+2017-05-05 01:45,os-odl-gluon-noha,apex,18/36,50.0
+2017-05-05 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-05-05 01:45,os-odl-bgpvpn-ha,apex,16/36,44.0
+2017-05-05 01:45,os-odl_l2-fdio-noha,apex,28/36,78.0
+2017-05-05 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-05-05 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-05-05 01:45,os-nosdn-kvm-ha,apex,30/33,91.0
+2017-05-05 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-05-05 01:45,os-odl_l3-fdio-noha,apex,23/30,77.0
+2017-05-05 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-05-05 01:45,os-odl_l2-fdio-ha,apex,29/36,81.0
+2017-05-05 01:45,os-nosdn-nofeature-ha,apex,30/33,91.0
+2017-05-05 01:45,os-odl_l3-fdio-ha,apex,23/30,77.0
+2017-05-05 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-05-05 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-05-05 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-05-05 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-05-05 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-05-05 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-05-05 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-05 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,12/42,29.0
+2017-05-05 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-05 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-05 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-05 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,6/39,15.0
+2017-05-05 01:45,os-odl_l2-sfc-noha,fuel,40/42,95.0
+2017-05-05 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-05-05 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-05 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-05 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-05-05 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-05-05 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-05 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-05-05 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-05 01:45,os-odl_l2-nofeature-ha,fuel,40/42,95.0
+2017-05-05 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-05 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-05 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-05-05 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-05-05 01:45,os-nosdn-lxd-ha,joid,17/24,71.0
+2017-05-05 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-05-05 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-05-06 01:45,os-nosdn-fdio-noha,apex,28/30,93.0
+2017-05-06 01:45,os-odl-gluon-noha,apex,23/36,64.0
+2017-05-06 01:45,os-odl_l2-fdio-noha,apex,28/36,78.0
+2017-05-06 01:45,os-odl-bgpvpn-ha,apex,24/36,67.0
+2017-05-06 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-05-06 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-05-06 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-05-06 01:45,os-nosdn-kvm-ha,apex,30/33,91.0
+2017-05-06 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-05-06 01:45,os-odl_l3-fdio-noha,apex,23/30,77.0
+2017-05-06 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-05-06 01:45,os-odl_l2-fdio-ha,apex,29/36,81.0
+2017-05-06 01:45,os-nosdn-nofeature-ha,apex,30/33,91.0
+2017-05-06 01:45,os-odl_l3-fdio-ha,apex,23/30,77.0
+2017-05-06 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-05-06 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-05-06 01:45,os-onos-nofeature-ha,compass,26/33,79.0
+2017-05-06 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-05-06 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-05-06 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-06 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-06 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,18/42,43.0
+2017-05-06 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-06 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-06 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-06 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,17/39,44.0
+2017-05-06 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-06 01:45,os-odl_l2-sfc-noha,fuel,40/42,95.0
+2017-05-06 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-05-06 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-06 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-06 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-05-06 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-05-06 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-06 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-05-06 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-06 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-06 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-06 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-05-06 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-05-06 01:45,os-nosdn-lxd-ha,joid,17/24,71.0
+2017-05-06 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-05-06 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-05-07 01:45,os-odl-gluon-noha,apex,28/36,78.0
+2017-05-07 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-05-07 01:45,os-odl-bgpvpn-ha,apex,24/36,67.0
+2017-05-07 01:45,os-odl_l2-fdio-noha,apex,28/36,78.0
+2017-05-07 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-05-07 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-05-07 01:45,os-nosdn-kvm-ha,apex,30/33,91.0
+2017-05-07 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-05-07 01:45,os-odl_l3-fdio-noha,apex,23/30,77.0
+2017-05-07 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-05-07 01:45,os-odl_l2-fdio-ha,apex,29/36,81.0
+2017-05-07 01:45,os-nosdn-nofeature-ha,apex,30/33,91.0
+2017-05-07 01:45,os-odl_l3-fdio-ha,apex,22/30,73.0
+2017-05-07 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-05-07 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-05-07 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-05-07 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-05-07 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-05-07 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-07 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-07 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,30/42,71.0
+2017-05-07 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-07 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-07 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-07 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,28/39,72.0
+2017-05-07 01:45,os-odl_l2-sfc-noha,fuel,40/42,95.0
+2017-05-07 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-05-07 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-07 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-07 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-05-07 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-05-07 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-07 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-07 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-07 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-05-07 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-07 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-07 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-05-07 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-05-07 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-05-07 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-05-07 01:45,os-nosdn-lxd-ha,joid,17/24,71.0
+2017-05-08 01:45,os-odl-gluon-noha,apex,28/36,78.0
+2017-05-08 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-05-08 01:45,os-odl_l2-fdio-noha,apex,28/36,78.0
+2017-05-08 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-05-08 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-05-08 01:45,os-odl_l3-fdio-noha,apex,23/30,77.0
+2017-05-08 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-05-08 01:45,os-nosdn-kvm-ha,apex,30/33,91.0
+2017-05-08 01:45,os-odl-bgpvpn-ha,apex,24/36,67.0
+2017-05-08 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-05-08 01:45,os-odl_l2-fdio-ha,apex,29/36,81.0
+2017-05-08 01:45,os-nosdn-nofeature-ha,apex,30/33,91.0
+2017-05-08 01:45,os-odl_l3-fdio-ha,apex,22/30,73.0
+2017-05-08 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-05-08 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-05-08 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-08 01:45,os-odl_l2-nofeature-ha,compass,26/33,79.0
+2017-05-08 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-05-08 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-08 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-08 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-08 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-08 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-08 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,28/39,72.0
+2017-05-08 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-05-08 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-05-08 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-08 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-08 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-08 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-05-08 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-05-08 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,30/42,71.0
+2017-05-08 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-08 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-08 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-08 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-08 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-08 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-05-08 01:45,os-nosdn-nofeature-noha,joid,32/33,97.0
+2017-05-08 01:45,os-nosdn-lxd-ha,joid,17/24,71.0
+2017-05-08 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-05-08 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-05-09 01:45,os-odl-gluon-noha,apex,28/36,78.0
+2017-05-09 01:45,os-odl_l2-fdio-noha,apex,28/36,78.0
+2017-05-09 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-05-09 01:45,os-odl_l3-fdio-noha,apex,23/30,77.0
+2017-05-09 01:45,os-odl_l3-nofeature-ha,apex,23/33,70.0
+2017-05-09 01:45,os-odl_l2-fdio-ha,apex,29/36,81.0
+2017-05-09 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-05-09 01:45,os-odl-bgpvpn-ha,apex,24/36,67.0
+2017-05-09 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-05-09 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-05-09 01:45,os-nosdn-kvm-ha,apex,30/33,91.0
+2017-05-09 01:45,os-nosdn-nofeature-ha,apex,30/33,91.0
+2017-05-09 01:45,os-odl_l3-fdio-ha,apex,22/30,73.0
+2017-05-09 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-05-09 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-05-09 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-09 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-05-09 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-05-09 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-09 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-09 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,30/42,71.0
+2017-05-09 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-09 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-09 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,28/39,72.0
+2017-05-09 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-05-09 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-09 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-09 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-09 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-09 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-05-09 01:45,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-05-09 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-05-09 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-09 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-09 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-09 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-09 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-09 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-05-09 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-05-09 01:45,os-nosdn-lxd-ha,joid,17/24,71.0
+2017-05-09 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-05-09 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-05-10 01:45,os-odl-gluon-noha,apex,28/36,78.0
+2017-05-10 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-05-10 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-05-10 01:45,os-odl_l2-fdio-noha,apex,28/36,78.0
+2017-05-10 01:45,os-odl_l3-fdio-noha,apex,18/30,60.0
+2017-05-10 01:45,os-odl-bgpvpn-ha,apex,24/36,67.0
+2017-05-10 01:45,os-nosdn-kvm-ha,apex,30/33,91.0
+2017-05-10 01:45,os-odl_l3-fdio-ha,apex,22/30,73.0
+2017-05-10 01:45,os-odl_l3-nofeature-ha,apex,16/33,48.0
+2017-05-10 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-05-10 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-05-10 01:45,os-odl_l2-fdio-ha,apex,27/36,75.0
+2017-05-10 01:45,os-nosdn-nofeature-ha,apex,30/33,91.0
+2017-05-10 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-05-10 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-05-10 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-10 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-05-10 01:45,os-nosdn-openo-ha,compass,29/30,97.0
+2017-05-10 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-10 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-10 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-05-10 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-10 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-10 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-10 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,28/39,72.0
+2017-05-10 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-05-10 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-05-10 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-10 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-10 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-05-10 01:45,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-05-10 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-10 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-10 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-10 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-10 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-10 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-10 01:45,os-nosdn-lxd-noha,joid,18/24,75.0
+2017-05-10 01:45,os-nosdn-nofeature-noha,joid,21/33,64.0
+2017-05-10 01:45,os-nosdn-lxd-ha,joid,13/24,54.0
+2017-05-10 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-05-10 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-05-11 01:45,os-odl-gluon-noha,apex,19/36,53.0
+2017-05-11 01:45,os-odl_l2-fdio-noha,apex,21/36,58.0
+2017-05-11 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-05-11 01:45,os-odl_l3-fdio-noha,apex,10/30,33.0
+2017-05-11 01:45,os-odl-bgpvpn-ha,apex,16/36,44.0
+2017-05-11 01:45,os-odl_l2-fdio-ha,apex,20/36,56.0
+2017-05-11 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-05-11 01:45,os-odl_l3-nofeature-ha,apex,16/33,48.0
+2017-05-11 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-05-11 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-05-11 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-05-11 01:45,os-nosdn-nofeature-ha,apex,30/33,91.0
+2017-05-11 01:45,os-odl_l3-fdio-ha,apex,15/30,50.0
+2017-05-11 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-05-11 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-05-11 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-11 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-05-11 01:45,os-nosdn-openo-ha,compass,20/30,67.0
+2017-05-11 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-11 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-11 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-11 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-11 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-11 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-11 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,28/39,72.0
+2017-05-11 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-05-11 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-05-11 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-11 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-11 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-05-11 01:45,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-05-11 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-11 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-11 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-11 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-05-11 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-11 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-11 01:45,os-nosdn-lxd-noha,joid,12/24,50.0
+2017-05-11 01:45,os-odl_l2-nofeature-ha,joid,9/36,25.0
+2017-05-11 01:45,os-nosdn-nofeature-noha,joid,10/33,30.0
+2017-05-11 01:45,os-nosdn-nofeature-ha,joid,32/33,97.0
+2017-05-11 01:45,os-nosdn-lxd-ha,joid,12/24,50.0
+2017-05-12 01:45,os-odl-gluon-noha,apex,19/36,53.0
+2017-05-12 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-05-12 01:45,os-odl_l2-fdio-noha,apex,21/36,58.0
+2017-05-12 01:45,os-odl_l3-fdio-noha,apex,2/30,7.0
+2017-05-12 01:45,os-odl-bgpvpn-ha,apex,16/36,44.0
+2017-05-12 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-05-12 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-05-12 01:45,os-odl_l3-nofeature-ha,apex,16/33,48.0
+2017-05-12 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-05-12 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-05-12 01:45,os-odl_l2-fdio-ha,apex,20/36,56.0
+2017-05-12 01:45,os-nosdn-nofeature-ha,apex,20/33,61.0
+2017-05-12 01:45,os-odl_l3-fdio-ha,apex,15/30,50.0
+2017-05-12 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-05-12 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-05-12 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-12 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-05-12 01:45,os-nosdn-openo-ha,compass,20/30,67.0
+2017-05-12 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-12 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-12 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-12 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-12 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-12 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,28/39,72.0
+2017-05-12 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-05-12 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-12 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-12 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-12 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-12 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-05-12 01:45,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-05-12 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-05-12 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-12 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-12 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-05-12 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-12 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-12 01:45,os-nosdn-lxd-noha,joid,12/24,50.0
+2017-05-12 01:45,os-odl_l2-nofeature-ha,joid,6/36,17.0
+2017-05-12 01:45,os-nosdn-nofeature-noha,joid,10/33,30.0
+2017-05-12 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-05-12 01:45,os-nosdn-lxd-ha,joid,7/24,29.0
+2017-05-13 01:45,os-odl-gluon-noha,apex,19/36,53.0
+2017-05-13 01:45,os-ovn-nofeature-noha,apex,3/33,9.0
+2017-05-13 01:45,os-odl_l2-fdio-noha,apex,19/36,53.0
+2017-05-13 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-05-13 01:45,os-odl-bgpvpn-ha,apex,16/36,44.0
+2017-05-13 01:45,os-odl_l2-fdio-ha,apex,20/36,56.0
+2017-05-13 01:45,os-odl_l3-fdio-ha,apex,15/30,50.0
+2017-05-13 01:45,os-odl_l3-nofeature-ha,apex,16/33,48.0
+2017-05-13 01:45,os-odl_l3-ovs-ha,apex,2/33,6.0
+2017-05-13 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-05-13 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-05-13 01:45,os-nosdn-nofeature-ha,apex,20/33,61.0
+2017-05-13 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-05-13 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-05-13 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-13 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-05-13 01:45,os-nosdn-openo-ha,compass,10/30,33.0
+2017-05-13 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-13 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-13 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-05-13 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-13 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-13 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,28/39,72.0
+2017-05-13 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-05-13 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-05-13 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-13 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-13 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-13 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-05-13 01:45,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-05-13 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-13 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-13 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-13 01:45,os-nosdn-ovs-ha,fuel,26/39,67.0
+2017-05-13 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-13 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-13 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-05-13 01:45,os-odl_l2-nofeature-ha,joid,6/36,17.0
+2017-05-13 01:45,os-nosdn-lxd-ha,joid,1/24,4.0
+2017-05-13 01:45,os-nosdn-nofeature-ha,joid,21/33,64.0
+2017-05-13 01:45,os-nosdn-nofeature-noha,joid,10/33,30.0
+2017-05-14 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-05-14 01:45,os-ovn-nofeature-noha,apex,3/33,9.0
+2017-05-14 01:45,os-odl_l2-fdio-noha,apex,19/36,53.0
+2017-05-14 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-05-14 01:45,os-odl_l3-nofeature-ha,apex,16/33,48.0
+2017-05-14 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-05-14 01:45,os-odl_l3-fdio-ha,apex,9/30,30.0
+2017-05-14 01:45,os-odl-bgpvpn-ha,apex,8/36,22.0
+2017-05-14 01:45,os-odl_l3-ovs-ha,apex,2/33,6.0
+2017-05-14 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-05-14 01:45,os-odl_l2-fdio-ha,apex,20/36,56.0
+2017-05-14 01:45,os-nosdn-nofeature-ha,apex,20/33,61.0
+2017-05-14 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-05-14 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-05-14 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-14 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-14 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-05-14 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-14 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-14 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-14 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-14 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,26/39,67.0
+2017-05-14 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-05-14 01:45,os-odl_l3-nofeature-ha,fuel,35/39,90.0
+2017-05-14 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-14 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-14 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-14 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-05-14 01:45,os-odl_l2-bgpvpn-ha,fuel,33/42,79.0
+2017-05-14 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-05-14 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-14 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-14 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-14 01:45,os-nosdn-ovs-ha,fuel,26/39,67.0
+2017-05-14 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-14 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-05-14 01:45,os-nosdn-lxd-ha,joid,1/24,4.0
+2017-05-14 01:45,os-nosdn-nofeature-ha,joid,10/33,30.0
+2017-05-14 01:45,os-nosdn-nofeature-noha,joid,10/33,30.0
+2017-05-15 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-05-15 01:45,os-ovn-nofeature-noha,apex,3/33,9.0
+2017-05-15 01:45,os-odl_l2-fdio-noha,apex,10/36,28.0
+2017-05-15 01:45,os-nosdn-fdio-ha,apex,2/30,7.0
+2017-05-15 01:45,os-odl-bgpvpn-ha,apex,8/36,22.0
+2017-05-15 01:45,os-odl_l2-fdio-ha,apex,11/36,31.0
+2017-05-15 01:45,os-odl_l3-fdio-ha,apex,7/30,23.0
+2017-05-15 01:45,os-odl_l3-nofeature-ha,apex,16/33,48.0
+2017-05-15 01:45,os-odl_l3-ovs-ha,apex,2/33,6.0
+2017-05-15 01:45,os-nosdn-ovs-ha,apex,2/33,6.0
+2017-05-15 01:45,os-nosdn-kvm-ha,apex,10/33,30.0
+2017-05-15 01:45,os-nosdn-nofeature-ha,apex,20/33,61.0
+2017-05-15 01:45,os-ocl-nofeature-ha,compass,1/30,3.0
+2017-05-15 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-05-15 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-15 01:45,os-odl_l3-nofeature-ha,compass,19/30,63.0
+2017-05-15 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-15 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-15 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-15 01:45,os-nosdn-ovs-ha,fuel,26/39,67.0
+2017-05-15 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-15 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,26/39,67.0
+2017-05-15 01:45,os-odl_l3-nofeature-ha,fuel,24/39,62.0
+2017-05-15 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-05-15 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-05-15 01:45,os-nosdn-kvm-ha,fuel,26/39,67.0
+2017-05-15 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-15 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-05-15 01:45,os-odl_l2-bgpvpn-ha,fuel,28/42,67.0
+2017-05-15 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-15 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-15 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-15 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,34/42,81.0
+2017-05-15 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-15 01:45,os-nosdn-nofeature-ha,fuel,26/39,67.0
+2017-05-16 01:45,os-ovn-nofeature-noha,apex,3/33,9.0
+2017-05-16 01:45,os-odl_l2-fdio-noha,apex,10/36,28.0
+2017-05-16 01:45,os-nosdn-fdio-ha,apex,2/30,7.0
+2017-05-16 01:45,os-odl_l3-nofeature-ha,apex,8/33,24.0
+2017-05-16 01:45,os-nosdn-kvm-ha,apex,10/33,30.0
+2017-05-16 01:45,os-odl_l3-fdio-ha,apex,7/30,23.0
+2017-05-16 01:45,os-odl_l3-ovs-ha,apex,2/33,6.0
+2017-05-16 01:45,os-nosdn-ovs-ha,apex,2/33,6.0
+2017-05-16 01:45,os-odl_l2-fdio-ha,apex,11/36,31.0
+2017-05-16 01:45,os-nosdn-nofeature-ha,apex,10/33,30.0
+2017-05-16 01:45,os-odl_l2-nofeature-ha,compass,18/33,55.0
+2017-05-16 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-16 01:45,os-nosdn-nofeature-ha,compass,20/30,67.0
+2017-05-16 01:45,os-odl_l3-nofeature-ha,compass,19/30,63.0
+2017-05-16 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-16 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,28/42,67.0
+2017-05-16 01:45,os-nosdn-ovs-ha,fuel,13/39,33.0
+2017-05-16 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-16 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-05-16 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,26/39,67.0
+2017-05-16 01:45,os-odl_l2-sfc-noha,fuel,32/42,76.0
+2017-05-16 01:45,os-odl_l3-nofeature-ha,fuel,24/39,62.0
+2017-05-16 01:45,os-nosdn-kvm-ha,fuel,26/39,67.0
+2017-05-16 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-05-16 01:45,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-05-16 01:45,os-odl_l2-bgpvpn-ha,fuel,27/42,64.0
+2017-05-16 01:45,os-odl_l2-sfc-ha,fuel,30/45,67.0
+2017-05-16 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,26/39,67.0
+2017-05-16 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-05-16 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-16 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-05-16 01:45,os-nosdn-nofeature-ha,fuel,26/39,67.0
+2017-05-17 01:45,os-odl_l3-nofeature-ha,apex,8/33,24.0
+2017-05-17 01:45,os-odl_l2-nofeature-ha,compass,15/33,45.0
+2017-05-17 01:45,os-onos-nofeature-ha,compass,18/33,55.0
+2017-05-17 01:45,os-odl_l3-nofeature-ha,compass,18/30,60.0
+2017-05-17 01:45,os-nosdn-nofeature-ha,compass,20/30,67.0
+2017-05-17 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-05-17 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,28/42,67.0
+2017-05-17 01:45,os-nosdn-ovs-ha,fuel,13/39,33.0
+2017-05-17 01:45,os-nosdn-ovs-noha,fuel,24/36,67.0
+2017-05-17 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-05-17 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,13/39,33.0
+2017-05-17 01:45,os-odl_l2-sfc-noha,fuel,32/42,76.0
+2017-05-17 01:45,os-odl_l3-nofeature-ha,fuel,24/39,62.0
+2017-05-17 01:45,os-nosdn-kvm-ha,fuel,26/39,67.0
+2017-05-17 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-05-17 01:45,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-05-17 01:45,os-odl_l2-bgpvpn-ha,fuel,27/42,64.0
+2017-05-17 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-05-17 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,26/39,67.0
+2017-05-17 01:45,os-odl_l2-bgpvpn-noha,fuel,28/42,67.0
+2017-05-17 01:45,os-odl_l2-sfc-ha,fuel,30/45,67.0
+2017-05-17 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-17 01:45,os-nosdn-nofeature-ha,fuel,26/39,67.0
+2017-05-18 01:45,os-odl_l2-nofeature-ha,compass,18/33,55.0
+2017-05-18 01:45,os-onos-nofeature-ha,compass,18/33,55.0
+2017-05-18 01:45,os-odl_l3-nofeature-ha,compass,16/30,53.0
+2017-05-18 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-05-18 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-05-18 01:45,os-odl_l2-sfc-ha,fuel,30/45,67.0
+2017-05-18 01:45,os-nosdn-ovs-ha,fuel,13/39,33.0
+2017-05-18 01:45,os-nosdn-ovs-noha,fuel,24/36,67.0
+2017-05-18 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,26/39,67.0
+2017-05-18 01:45,os-odl_l2-sfc-noha,fuel,27/42,64.0
+2017-05-18 01:45,os-odl_l3-nofeature-ha,fuel,11/39,28.0
+2017-05-18 01:45,os-nosdn-kvm-ha,fuel,13/39,33.0
+2017-05-18 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-05-18 01:45,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-05-18 01:45,os-odl_l2-bgpvpn-ha,fuel,14/42,33.0
+2017-05-18 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-05-18 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,26/39,67.0
+2017-05-18 01:45,os-odl_l2-bgpvpn-noha,fuel,28/42,67.0
+2017-05-18 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,28/42,67.0
+2017-05-18 01:45,os-odl_l2-nofeature-ha,fuel,28/42,67.0
+2017-05-18 01:45,os-nosdn-nofeature-ha,fuel,13/39,33.0
+2017-05-19 01:45,os-odl_l2-nofeature-ha,compass,16/33,48.0
+2017-05-19 01:45,os-onos-nofeature-ha,compass,18/33,55.0
+2017-05-19 01:45,os-nosdn-nofeature-ha,compass,10/30,33.0
+2017-05-19 01:45,os-odl_l3-nofeature-ha,compass,17/30,57.0
+2017-05-19 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-05-19 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,28/42,67.0
+2017-05-19 01:45,os-nosdn-ovs-ha,fuel,13/39,33.0
+2017-05-19 01:45,os-nosdn-ovs-noha,fuel,13/36,36.0
+2017-05-19 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-05-19 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,13/39,33.0
+2017-05-19 01:45,os-odl_l2-sfc-noha,fuel,27/42,64.0
+2017-05-19 01:45,os-odl_l3-nofeature-ha,fuel,14/39,36.0
+2017-05-19 01:45,os-nosdn-kvm-ha,fuel,13/39,33.0
+2017-05-19 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-05-19 01:45,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-05-19 01:45,os-odl_l2-bgpvpn-ha,fuel,12/42,29.0
+2017-05-19 01:45,os-odl_l2-sfc-ha,fuel,30/45,67.0
+2017-05-19 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,26/39,67.0
+2017-05-19 01:45,os-odl_l2-bgpvpn-noha,fuel,27/42,64.0
+2017-05-19 01:45,os-odl_l2-nofeature-ha,fuel,28/42,67.0
+2017-05-19 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-05-19 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-05-20 01:45,os-ocl-nofeature-ha,compass,1/30,3.0
+2017-05-20 01:45,os-odl_l2-nofeature-ha,compass,16/33,48.0
+2017-05-20 01:45,os-onos-nofeature-ha,compass,18/33,55.0
+2017-05-20 01:45,os-nosdn-nofeature-ha,compass,10/30,33.0
+2017-05-20 01:45,os-odl_l3-nofeature-ha,compass,17/30,57.0
+2017-05-20 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-05-20 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,28/42,67.0
+2017-05-20 01:45,os-nosdn-ovs-noha,fuel,1/36,3.0
+2017-05-20 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-05-20 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,13/39,33.0
+2017-05-20 01:45,os-odl_l2-sfc-noha,fuel,26/42,62.0
+2017-05-20 01:45,os-odl_l2-sfc-ha,fuel,15/45,33.0
+2017-05-20 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-05-20 01:45,os-odl_l2-nofeature-ha,fuel,28/42,67.0
+2017-05-20 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-05-20 01:45,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-05-20 01:45,os-odl_l2-bgpvpn-ha,fuel,12/42,29.0
+2017-05-20 01:45,os-odl_l3-nofeature-ha,fuel,13/39,33.0
+2017-05-20 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,26/39,67.0
+2017-05-20 01:45,os-odl_l2-bgpvpn-noha,fuel,27/42,64.0
+2017-05-20 01:45,os-nosdn-ovs-ha,fuel,13/39,33.0
+2017-05-20 01:45,os-nosdn-kvm-ha,fuel,13/39,33.0
+2017-05-20 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-05-20 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-05-20 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-05-21 01:45,os-ocl-nofeature-ha,compass,1/30,3.0
+2017-05-21 01:45,os-odl_l2-nofeature-ha,compass,16/33,48.0
+2017-05-21 01:45,os-onos-nofeature-ha,compass,18/33,55.0
+2017-05-21 01:45,os-nosdn-nofeature-ha,compass,10/30,33.0
+2017-05-21 01:45,os-odl_l3-nofeature-ha,compass,17/30,57.0
+2017-05-21 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-05-21 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,28/42,67.0
+2017-05-21 01:45,os-nosdn-ovs-noha,fuel,1/36,3.0
+2017-05-21 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-05-21 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,13/39,33.0
+2017-05-21 01:45,os-odl_l2-sfc-noha,fuel,26/42,62.0
+2017-05-21 01:45,os-odl_l2-sfc-ha,fuel,15/45,33.0
+2017-05-21 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-05-21 01:45,os-odl_l2-nofeature-ha,fuel,28/42,67.0
+2017-05-21 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-05-21 01:45,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-05-21 01:45,os-odl_l2-bgpvpn-ha,fuel,12/42,29.0
+2017-05-21 01:45,os-odl_l3-nofeature-ha,fuel,13/39,33.0
+2017-05-21 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,26/39,67.0
+2017-05-21 01:45,os-odl_l2-bgpvpn-noha,fuel,27/42,64.0
+2017-05-21 01:45,os-nosdn-ovs-ha,fuel,13/39,33.0
+2017-05-21 01:45,os-nosdn-kvm-ha,fuel,13/39,33.0
+2017-05-21 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-05-21 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-05-21 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-05-22 01:45,os-ocl-nofeature-ha,compass,1/30,3.0
+2017-05-22 01:45,os-odl_l2-nofeature-ha,compass,16/33,48.0
+2017-05-22 01:45,os-onos-nofeature-ha,compass,18/33,55.0
+2017-05-22 01:45,os-nosdn-nofeature-ha,compass,10/30,33.0
+2017-05-22 01:45,os-odl_l3-nofeature-ha,compass,17/30,57.0
+2017-05-22 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-05-22 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,28/42,67.0
+2017-05-22 01:45,os-nosdn-ovs-noha,fuel,1/36,3.0
+2017-05-22 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-05-22 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,13/39,33.0
+2017-05-22 01:45,os-odl_l2-sfc-noha,fuel,26/42,62.0
+2017-05-22 01:45,os-odl_l2-sfc-ha,fuel,15/45,33.0
+2017-05-22 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-05-22 01:45,os-odl_l2-nofeature-ha,fuel,28/42,67.0
+2017-05-22 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-05-22 01:45,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-05-22 01:45,os-odl_l2-bgpvpn-ha,fuel,12/42,29.0
+2017-05-22 01:45,os-odl_l3-nofeature-ha,fuel,13/39,33.0
+2017-05-22 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,26/39,67.0
+2017-05-22 01:45,os-odl_l2-bgpvpn-noha,fuel,27/42,64.0
+2017-05-22 01:45,os-nosdn-ovs-ha,fuel,13/39,33.0
+2017-05-22 01:45,os-nosdn-kvm-ha,fuel,13/39,33.0
+2017-05-22 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-05-22 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-05-22 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-05-23 01:45,os-ocl-nofeature-ha,compass,1/30,3.0
+2017-05-23 01:45,os-odl_l2-nofeature-ha,compass,16/33,48.0
+2017-05-23 01:45,os-onos-nofeature-ha,compass,18/33,55.0
+2017-05-23 01:45,os-nosdn-nofeature-ha,compass,10/30,33.0
+2017-05-23 01:45,os-odl_l3-nofeature-ha,compass,17/30,57.0
+2017-05-23 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-05-23 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,28/42,67.0
+2017-05-23 01:45,os-nosdn-ovs-noha,fuel,1/36,3.0
+2017-05-23 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-05-23 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,13/39,33.0
+2017-05-23 01:45,os-odl_l2-sfc-noha,fuel,26/42,62.0
+2017-05-23 01:45,os-odl_l2-sfc-ha,fuel,15/45,33.0
+2017-05-23 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-05-23 01:45,os-odl_l2-nofeature-ha,fuel,28/42,67.0
+2017-05-23 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-05-23 01:45,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-05-23 01:45,os-odl_l2-bgpvpn-ha,fuel,12/42,29.0
+2017-05-23 01:45,os-odl_l3-nofeature-ha,fuel,13/39,33.0
+2017-05-23 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,26/39,67.0
+2017-05-23 01:45,os-odl_l2-bgpvpn-noha,fuel,27/42,64.0
+2017-05-23 01:45,os-nosdn-ovs-ha,fuel,13/39,33.0
+2017-05-23 01:45,os-nosdn-kvm-ha,fuel,13/39,33.0
+2017-05-23 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-05-23 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-05-23 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-05-24 01:45,os-ocl-nofeature-ha,compass,1/30,3.0
+2017-05-24 01:45,os-odl_l2-nofeature-ha,compass,16/33,48.0
+2017-05-24 01:45,os-onos-nofeature-ha,compass,18/33,55.0
+2017-05-24 01:45,os-nosdn-nofeature-ha,compass,10/30,33.0
+2017-05-24 01:45,os-odl_l3-nofeature-ha,compass,17/30,57.0
+2017-05-24 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-05-24 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,28/42,67.0
+2017-05-24 01:45,os-nosdn-ovs-noha,fuel,1/36,3.0
+2017-05-24 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-05-24 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,13/39,33.0
+2017-05-24 01:45,os-odl_l2-sfc-noha,fuel,26/42,62.0
+2017-05-24 01:45,os-odl_l2-sfc-ha,fuel,15/45,33.0
+2017-05-24 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-05-24 01:45,os-odl_l2-nofeature-ha,fuel,28/42,67.0
+2017-05-24 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-05-24 01:45,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-05-24 01:45,os-odl_l2-bgpvpn-ha,fuel,12/42,29.0
+2017-05-24 01:45,os-odl_l3-nofeature-ha,fuel,13/39,33.0
+2017-05-24 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,26/39,67.0
+2017-05-24 01:45,os-odl_l2-bgpvpn-noha,fuel,27/42,64.0
+2017-05-24 01:45,os-nosdn-ovs-ha,fuel,13/39,33.0
+2017-05-24 01:45,os-nosdn-kvm-ha,fuel,13/39,33.0
+2017-05-24 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-05-24 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-05-24 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-05-25 01:45,os-ocl-nofeature-ha,compass,1/30,3.0
+2017-05-25 01:45,os-odl_l2-nofeature-ha,compass,22/33,67.0
+2017-05-25 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-25 01:45,os-nosdn-nofeature-ha,compass,20/30,67.0
+2017-05-25 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-05-25 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,24/36,67.0
+2017-05-25 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,28/42,67.0
+2017-05-25 01:45,os-nosdn-ovs-noha,fuel,13/36,36.0
+2017-05-25 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-05-25 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,13/39,33.0
+2017-05-25 01:45,os-odl_l2-sfc-noha,fuel,26/42,62.0
+2017-05-25 01:45,os-odl_l2-sfc-ha,fuel,22/45,49.0
+2017-05-25 01:45,os-nosdn-kvm-noha,fuel,24/36,67.0
+2017-05-25 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-05-25 01:45,os-nosdn-nofeature-noha,fuel,24/36,67.0
+2017-05-25 01:45,os-odl_l2-nofeature-noha,fuel,29/39,74.0
+2017-05-25 01:45,os-odl_l2-bgpvpn-ha,fuel,12/42,29.0
+2017-05-25 01:45,os-odl_l3-nofeature-ha,fuel,25/39,64.0
+2017-05-25 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,26/39,67.0
+2017-05-25 01:45,os-odl_l2-bgpvpn-noha,fuel,28/42,67.0
+2017-05-25 01:45,os-nosdn-ovs-ha,fuel,26/39,67.0
+2017-05-25 01:45,os-nosdn-kvm-ha,fuel,13/39,33.0
+2017-05-25 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-05-25 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-05-25 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-05-26 01:45,os-ocl-nofeature-ha,compass,1/30,3.0
+2017-05-26 01:45,os-odl_l2-nofeature-ha,compass,22/33,67.0
+2017-05-26 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-26 01:45,os-nosdn-nofeature-ha,compass,20/30,67.0
+2017-05-26 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-05-26 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-26 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-05-26 01:45,os-nosdn-ovs-noha,fuel,24/36,67.0
+2017-05-26 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-05-26 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,26/39,67.0
+2017-05-26 01:45,os-odl_l2-sfc-noha,fuel,26/42,62.0
+2017-05-26 01:45,os-odl_l2-sfc-ha,fuel,30/45,67.0
+2017-05-26 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-26 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-05-26 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-26 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-05-26 01:45,os-odl_l2-bgpvpn-ha,fuel,26/42,62.0
+2017-05-26 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-05-26 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-26 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-05-26 01:45,os-nosdn-ovs-ha,fuel,26/39,67.0
+2017-05-26 01:45,os-nosdn-kvm-ha,fuel,26/39,67.0
+2017-05-26 01:45,os-nosdn-nofeature-ha,fuel,18/39,46.0
+2017-05-26 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-05-26 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-05-26 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-05-27 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-05-27 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-05-27 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-05-27 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-05-27 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-05-27 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-27 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-05-27 01:45,os-nosdn-ovs-noha,fuel,25/36,69.0
+2017-05-27 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-27 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-05-27 01:45,os-odl_l2-sfc-noha,fuel,39/42,93.0
+2017-05-27 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-05-27 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-27 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-27 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-27 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-05-27 01:45,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-05-27 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-05-27 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-27 01:45,os-odl_l2-bgpvpn-noha,fuel,40/42,95.0
+2017-05-27 01:45,os-nosdn-ovs-ha,fuel,26/39,67.0
+2017-05-27 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-27 01:45,os-nosdn-nofeature-ha,fuel,31/39,79.0
+2017-05-27 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-05-27 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-05-27 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-05-28 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-05-28 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-05-28 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-05-28 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-05-28 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-05-28 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-28 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-28 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-28 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-28 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-05-28 01:45,os-odl_l2-sfc-noha,fuel,39/42,93.0
+2017-05-28 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-05-28 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-28 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-05-28 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-28 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-05-28 01:45,os-odl_l2-bgpvpn-ha,fuel,41/42,98.0
+2017-05-28 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-05-28 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-28 01:45,os-odl_l2-bgpvpn-noha,fuel,40/42,95.0
+2017-05-28 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-05-28 01:45,os-nosdn-ovs-ha,fuel,26/39,67.0
+2017-05-28 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-28 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-05-28 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-05-28 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-05-29 01:45,os-nosdn-nofeature-noha,apex,6/33,18.0
+2017-05-29 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-05-29 01:45,os-odl_l2-nofeature-ha,compass,26/33,79.0
+2017-05-29 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-05-29 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-05-29 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-05-29 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-29 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-05-29 01:45,os-nosdn-ovs-ha,fuel,26/39,67.0
+2017-05-29 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-29 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-29 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-05-29 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-05-29 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-05-29 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-29 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-29 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-05-29 01:45,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-05-29 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-05-29 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-29 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-05-29 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-05-29 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-29 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-29 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-05-29 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-05-30 01:45,os-nosdn-kvm-noha,apex,10/33,30.0
+2017-05-30 01:45,os-nosdn-fdio-noha,apex,2/30,7.0
+2017-05-30 01:45,os-nosdn-kvm-ha,apex,10/33,30.0
+2017-05-30 01:45,os-nosdn-nofeature-noha,apex,8/33,24.0
+2017-05-30 01:45,os-nosdn-fdio-ha,apex,2/30,7.0
+2017-05-30 01:45,os-nosdn-ovs-ha,apex,2/33,6.0
+2017-05-30 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-05-30 01:45,os-odl_l2-nofeature-ha,compass,26/33,79.0
+2017-05-30 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-05-30 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-05-30 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-05-30 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-30 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-30 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-30 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-05-30 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-05-30 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-05-30 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-05-30 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-05-30 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-30 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-30 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-05-30 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-05-30 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-05-30 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-30 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-30 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-05-30 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-05-30 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-31 01:45,os-nosdn-kvm-noha,apex,10/33,30.0
+2017-05-31 01:45,os-nosdn-fdio-noha,apex,2/30,7.0
+2017-05-31 01:45,os-nosdn-kvm-ha,apex,10/33,30.0
+2017-05-31 01:45,os-nosdn-nofeature-noha,apex,16/33,48.0
+2017-05-31 01:45,os-nosdn-fdio-ha,apex,2/30,7.0
+2017-05-31 01:45,os-nosdn-ovs-ha,apex,2/33,6.0
+2017-05-31 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-05-31 01:45,os-odl_l2-nofeature-ha,compass,26/33,79.0
+2017-05-31 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-05-31 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-05-31 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-05-31 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-05-31 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-05-31 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-05-31 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-05-31 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-05-31 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-05-31 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-05-31 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-05-31 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-05-31 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-05-31 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-05-31 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-05-31 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-05-31 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-05-31 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-05-31 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-05-31 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-05-31 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-05-31 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-06-01 01:45,os-nosdn-kvm-noha,apex,10/33,30.0
+2017-06-01 01:45,os-nosdn-fdio-noha,apex,2/30,7.0
+2017-06-01 01:45,os-nosdn-kvm-ha,apex,10/33,30.0
+2017-06-01 01:45,os-nosdn-nofeature-noha,apex,16/33,48.0
+2017-06-01 01:45,os-nosdn-fdio-ha,apex,2/30,7.0
+2017-06-01 01:45,os-nosdn-ovs-ha,apex,2/33,6.0
+2017-06-01 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-06-01 01:45,os-odl_l2-nofeature-ha,compass,26/33,79.0
+2017-06-01 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-01 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-06-01 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-06-01 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-01 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-01 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-01 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-01 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-01 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-01 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-01 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-01 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-01 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-01 01:45,os-odl_l2-nofeature-noha,fuel,37/39,95.0
+2017-06-01 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-01 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-01 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-06-01 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-01 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-01 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-01 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-01 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-06-01 01:45,os-nosdn-nofeature-noha,joid,17/33,52.0
+2017-06-01 01:45,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-06-02 01:45,os-nosdn-kvm-noha,apex,10/33,30.0
+2017-06-02 01:45,os-nosdn-fdio-noha,apex,2/30,7.0
+2017-06-02 01:45,os-nosdn-kvm-ha,apex,10/33,30.0
+2017-06-02 01:45,os-nosdn-nofeature-noha,apex,16/33,48.0
+2017-06-02 01:45,os-nosdn-fdio-ha,apex,2/30,7.0
+2017-06-02 01:45,os-nosdn-ovs-ha,apex,2/33,6.0
+2017-06-02 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-06-02 01:45,os-odl_l2-nofeature-ha,compass,26/33,79.0
+2017-06-02 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-02 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-06-02 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-06-02 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-02 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-02 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-02 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-02 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,38/39,97.0
+2017-06-02 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-02 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-02 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-06-02 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-02 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-02 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-06-02 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-02 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-02 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-06-02 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-02 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-02 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-02 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-06-02 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-06-02 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-06-02 01:45,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-06-02 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-06-03 01:45,os-nosdn-kvm-noha,apex,18/33,55.0
+2017-06-03 01:45,os-nosdn-fdio-noha,apex,2/30,7.0
+2017-06-03 01:45,os-nosdn-ovs-noha,apex,2/33,6.0
+2017-06-03 01:45,os-odl_l3-nofeature-noha,apex,2/33,6.0
+2017-06-03 01:45,os-odl_l2-fdio-noha,apex,3/36,8.0
+2017-06-03 01:45,os-nosdn-kvm-ha,apex,18/33,55.0
+2017-06-03 01:45,os-nosdn-nofeature-noha,apex,24/33,73.0
+2017-06-03 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-06-03 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-03 01:45,os-nosdn-nofeature-ha,apex,8/33,24.0
+2017-06-03 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-06-03 01:45,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-06-03 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-06-03 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-06-03 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-06-03 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-03 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-03 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-03 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-03 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,38/39,97.0
+2017-06-03 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-03 01:45,os-odl_l2-sfc-noha,fuel,39/42,93.0
+2017-06-03 01:45,os-odl_l3-nofeature-ha,fuel,38/39,97.0
+2017-06-03 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-03 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-03 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-06-03 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-03 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-03 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-06-03 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-03 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-03 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-03 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-06-03 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-06-03 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-06-03 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-06-03 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-06-03 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-06-04 01:45,os-nosdn-kvm-noha,apex,18/33,55.0
+2017-06-04 01:45,os-nosdn-fdio-noha,apex,2/30,7.0
+2017-06-04 01:45,os-odl-gluon-noha,apex,5/36,14.0
+2017-06-04 01:45,os-nosdn-ovs-noha,apex,2/33,6.0
+2017-06-04 01:45,os-odl_l3-nofeature-noha,apex,2/33,6.0
+2017-06-04 01:45,os-ovn-nofeature-noha,apex,3/33,9.0
+2017-06-04 01:45,os-odl_l2-fdio-noha,apex,6/36,17.0
+2017-06-04 01:45,os-odl_l3-ovs-ha,apex,2/33,6.0
+2017-06-04 01:45,os-odl_l3-nofeature-ha,apex,5/33,15.0
+2017-06-04 01:45,os-nosdn-kvm-ha,apex,18/33,55.0
+2017-06-04 01:45,os-odl_l3-fdio-noha,apex,5/30,17.0
+2017-06-04 01:45,os-nosdn-nofeature-noha,apex,26/33,79.0
+2017-06-04 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-06-04 01:45,os-odl-bgpvpn-ha,apex,5/36,14.0
+2017-06-04 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-04 01:45,os-odl_l3-ovs-noha,apex,2/33,6.0
+2017-06-04 01:45,os-nosdn-nofeature-ha,apex,18/33,55.0
+2017-06-04 01:45,os-odl_l3-fdio-ha,apex,25/30,83.0
+2017-06-04 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-06-04 01:45,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-06-04 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-06-04 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-06-04 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-06-04 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-04 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-04 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-04 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-04 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,38/39,97.0
+2017-06-04 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-04 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-04 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-04 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-04 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-06-04 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-04 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-04 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-06-04 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-04 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-04 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-04 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-04 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-04 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-06-04 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-06-04 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-06-04 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-06-04 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-06-05 01:45,os-nosdn-kvm-noha,apex,18/33,55.0
+2017-06-05 01:45,os-nosdn-fdio-noha,apex,4/30,13.0
+2017-06-05 01:45,os-odl-gluon-noha,apex,5/36,14.0
+2017-06-05 01:45,os-nosdn-ovs-noha,apex,2/33,6.0
+2017-06-05 01:45,os-odl_l3-nofeature-noha,apex,7/33,21.0
+2017-06-05 01:45,os-ovn-nofeature-noha,apex,3/33,9.0
+2017-06-05 01:45,os-odl_l2-fdio-noha,apex,6/36,17.0
+2017-06-05 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-05 01:45,os-odl_l3-nofeature-ha,apex,10/33,30.0
+2017-06-05 01:45,os-nosdn-kvm-ha,apex,18/33,55.0
+2017-06-05 01:45,os-odl_l3-fdio-noha,apex,28/30,93.0
+2017-06-05 01:45,os-nosdn-nofeature-noha,apex,26/33,79.0
+2017-06-05 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-06-05 01:45,os-odl-bgpvpn-ha,apex,5/36,14.0
+2017-06-05 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-05 01:45,os-odl_l3-ovs-noha,apex,3/33,9.0
+2017-06-05 01:45,os-odl_l2-fdio-ha,apex,9/36,25.0
+2017-06-05 01:45,os-nosdn-nofeature-ha,apex,18/33,55.0
+2017-06-05 01:45,os-odl_l3-fdio-ha,apex,25/30,83.0
+2017-06-05 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-05 01:45,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-06-05 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-05 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-06-05 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-05 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-05 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-05 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-05 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-05 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-05 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-06-05 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,38/39,97.0
+2017-06-05 01:45,os-odl_l2-sfc-noha,fuel,34/42,81.0
+2017-06-05 01:45,os-odl_l2-sfc-ha,fuel,43/45,96.0
+2017-06-05 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-05 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-05 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-06-05 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-05 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-05 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-05 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-05 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-05 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-05 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-06-05 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-06-05 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-06-05 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-06-05 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-06-06 01:45,os-nosdn-kvm-noha,apex,18/33,55.0
+2017-06-06 01:45,os-nosdn-fdio-noha,apex,4/30,13.0
+2017-06-06 01:45,os-odl-gluon-noha,apex,5/36,14.0
+2017-06-06 01:45,os-nosdn-ovs-noha,apex,2/33,6.0
+2017-06-06 01:45,os-odl_l3-nofeature-noha,apex,7/33,21.0
+2017-06-06 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-06 01:45,os-odl_l2-fdio-noha,apex,19/36,53.0
+2017-06-06 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-06 01:45,os-odl_l3-nofeature-ha,apex,10/33,30.0
+2017-06-06 01:45,os-nosdn-kvm-ha,apex,18/33,55.0
+2017-06-06 01:45,os-odl_l3-fdio-noha,apex,28/30,93.0
+2017-06-06 01:45,os-nosdn-nofeature-noha,apex,26/33,79.0
+2017-06-06 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-06-06 01:45,os-odl-bgpvpn-ha,apex,10/36,28.0
+2017-06-06 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-06 01:45,os-odl_l3-ovs-noha,apex,3/33,9.0
+2017-06-06 01:45,os-odl_l2-fdio-ha,apex,9/36,25.0
+2017-06-06 01:45,os-nosdn-nofeature-ha,apex,18/33,55.0
+2017-06-06 01:45,os-odl_l3-fdio-ha,apex,25/30,83.0
+2017-06-06 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-06-06 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-06-06 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-06 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-06 01:45,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-06-06 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,33/36,92.0
+2017-06-06 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-06 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-06 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-06 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,38/39,97.0
+2017-06-06 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-06 01:45,os-odl_l2-sfc-noha,fuel,34/42,81.0
+2017-06-06 01:45,os-odl_l3-nofeature-ha,fuel,34/39,87.0
+2017-06-06 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-06 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-06 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-06-06 01:45,os-odl_l2-bgpvpn-ha,fuel,41/42,98.0
+2017-06-06 01:45,os-odl_l2-sfc-ha,fuel,43/45,96.0
+2017-06-06 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-06 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-06 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-06-06 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-06 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-06 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-06-06 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-06-06 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-06-06 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-06-06 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-06-07 01:45,os-nosdn-kvm-noha,apex,18/33,55.0
+2017-06-07 01:45,os-nosdn-fdio-noha,apex,4/30,13.0
+2017-06-07 01:45,os-odl-gluon-noha,apex,5/36,14.0
+2017-06-07 01:45,os-nosdn-ovs-noha,apex,2/33,6.0
+2017-06-07 01:45,os-odl_l3-nofeature-noha,apex,7/33,21.0
+2017-06-07 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-07 01:45,os-odl_l2-fdio-noha,apex,24/36,67.0
+2017-06-07 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-07 01:45,os-odl_l3-nofeature-ha,apex,10/33,30.0
+2017-06-07 01:45,os-nosdn-kvm-ha,apex,18/33,55.0
+2017-06-07 01:45,os-odl_l3-fdio-noha,apex,28/30,93.0
+2017-06-07 01:45,os-nosdn-nofeature-noha,apex,26/33,79.0
+2017-06-07 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-07 01:45,os-odl-bgpvpn-ha,apex,10/36,28.0
+2017-06-07 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-07 01:45,os-odl_l3-ovs-noha,apex,3/33,9.0
+2017-06-07 01:45,os-odl_l2-fdio-ha,apex,33/36,92.0
+2017-06-07 01:45,os-nosdn-nofeature-ha,apex,18/33,55.0
+2017-06-07 01:45,os-odl_l3-fdio-ha,apex,25/30,83.0
+2017-06-07 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-06-07 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-06-07 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-07 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-06-07 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-07 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-07 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-07 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-07 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-07 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,32/36,89.0
+2017-06-07 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-07 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-06-07 01:45,os-odl_l3-nofeature-ha,fuel,34/39,87.0
+2017-06-07 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-07 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-07 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-06-07 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-07 01:45,os-odl_l2-sfc-ha,fuel,43/45,96.0
+2017-06-07 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-07 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-07 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-06-07 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-07 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-07 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-06-07 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-06-07 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-06-07 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-06-07 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-06-08 01:45,os-nosdn-kvm-noha,apex,18/33,55.0
+2017-06-08 01:45,os-nosdn-fdio-noha,apex,4/30,13.0
+2017-06-08 01:45,os-odl-gluon-noha,apex,5/36,14.0
+2017-06-08 01:45,os-nosdn-ovs-noha,apex,2/33,6.0
+2017-06-08 01:45,os-odl_l3-nofeature-noha,apex,10/33,30.0
+2017-06-08 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-08 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-06-08 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-08 01:45,os-odl_l3-nofeature-ha,apex,10/33,30.0
+2017-06-08 01:45,os-nosdn-kvm-ha,apex,27/33,82.0
+2017-06-08 01:45,os-odl_l3-fdio-noha,apex,28/30,93.0
+2017-06-08 01:45,os-nosdn-nofeature-noha,apex,26/33,79.0
+2017-06-08 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-08 01:45,os-odl-bgpvpn-ha,apex,10/36,28.0
+2017-06-08 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-08 01:45,os-odl_l3-ovs-noha,apex,3/33,9.0
+2017-06-08 01:45,os-odl_l2-fdio-ha,apex,33/36,92.0
+2017-06-08 01:45,os-nosdn-nofeature-ha,apex,18/33,55.0
+2017-06-08 01:45,os-odl_l3-fdio-ha,apex,26/30,87.0
+2017-06-08 01:45,os-ocl-nofeature-ha,compass,2/30,7.0
+2017-06-08 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-06-08 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-08 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-06-08 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-08 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-08 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-08 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,32/36,89.0
+2017-06-08 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-08 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-08 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-08 01:45,os-odl_l2-sfc-noha,fuel,34/42,81.0
+2017-06-08 01:45,os-odl_l3-nofeature-ha,fuel,35/39,90.0
+2017-06-08 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-08 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-06-08 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-08 01:45,os-odl_l2-nofeature-noha,fuel,37/39,95.0
+2017-06-08 01:45,os-odl_l2-bgpvpn-ha,fuel,37/42,88.0
+2017-06-08 01:45,os-odl_l2-sfc-ha,fuel,43/45,96.0
+2017-06-08 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-08 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-08 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-08 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-08 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-06-08 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-06-08 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-06-08 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-06-08 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-06-09 01:45,os-nosdn-kvm-noha,apex,16/33,48.0
+2017-06-09 01:45,os-nosdn-fdio-noha,apex,2/30,7.0
+2017-06-09 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-09 01:45,os-nosdn-ovs-noha,apex,2/33,6.0
+2017-06-09 01:45,os-odl_l3-nofeature-noha,apex,10/33,30.0
+2017-06-09 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-09 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-06-09 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-09 01:45,os-odl_l3-nofeature-ha,apex,10/33,30.0
+2017-06-09 01:45,os-nosdn-kvm-ha,apex,18/33,55.0
+2017-06-09 01:45,os-odl_l3-fdio-noha,apex,27/30,90.0
+2017-06-09 01:45,os-nosdn-nofeature-noha,apex,26/33,79.0
+2017-06-09 01:45,os-nosdn-fdio-ha,apex,4/30,13.0
+2017-06-09 01:45,os-odl-bgpvpn-ha,apex,10/36,28.0
+2017-06-09 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-09 01:45,os-odl_l3-ovs-noha,apex,3/33,9.0
+2017-06-09 01:45,os-odl_l2-fdio-ha,apex,33/36,92.0
+2017-06-09 01:45,os-nosdn-nofeature-ha,apex,23/33,70.0
+2017-06-09 01:45,os-odl_l3-fdio-ha,apex,26/30,87.0
+2017-06-09 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-09 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-06-09 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-09 01:45,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-06-09 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-09 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-09 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-09 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,32/36,89.0
+2017-06-09 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-09 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-09 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-09 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-06-09 01:45,os-odl_l2-sfc-noha,fuel,34/42,81.0
+2017-06-09 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-09 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-09 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-09 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-09 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-06-09 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-09 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-06-09 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-09 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-06-09 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-09 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-06-09 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-06-09 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-06-09 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-06-09 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-06-10 01:45,os-nosdn-kvm-noha,apex,18/33,55.0
+2017-06-10 01:45,os-nosdn-fdio-noha,apex,4/30,13.0
+2017-06-10 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-10 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-10 01:45,os-odl_l3-nofeature-noha,apex,12/33,36.0
+2017-06-10 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-10 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-06-10 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-10 01:45,os-odl_l3-nofeature-ha,apex,15/33,45.0
+2017-06-10 01:45,os-nosdn-kvm-ha,apex,27/33,82.0
+2017-06-10 01:45,os-odl_l3-fdio-noha,apex,27/30,90.0
+2017-06-10 01:45,os-nosdn-nofeature-noha,apex,26/33,79.0
+2017-06-10 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-10 01:45,os-odl-bgpvpn-ha,apex,10/36,28.0
+2017-06-10 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-10 01:45,os-odl_l3-ovs-noha,apex,3/33,9.0
+2017-06-10 01:45,os-odl_l2-fdio-ha,apex,32/36,89.0
+2017-06-10 01:45,os-nosdn-nofeature-ha,apex,25/33,76.0
+2017-06-10 01:45,os-odl_l3-fdio-ha,apex,26/30,87.0
+2017-06-10 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-10 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-06-10 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-10 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-06-10 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-10 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-10 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-10 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-10 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-10 01:45,os-nosdn-ovs-noha,fuel,35/36,97.0
+2017-06-10 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-10 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-10 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-10 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-10 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-10 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-06-10 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-06-10 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-10 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,32/36,89.0
+2017-06-10 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-10 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-06-10 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-10 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-10 01:45,os-nosdn-lxd-noha,joid,6/24,25.0
+2017-06-10 01:45,os-nosdn-nofeature-noha,joid,22/33,67.0
+2017-06-10 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-06-10 01:45,os-nosdn-nofeature-ha,joid,22/33,67.0
+2017-06-10 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-06-11 01:45,os-nosdn-kvm-noha,apex,18/33,55.0
+2017-06-11 01:45,os-nosdn-fdio-noha,apex,4/30,13.0
+2017-06-11 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-11 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-11 01:45,os-odl_l3-nofeature-noha,apex,12/33,36.0
+2017-06-11 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-06-11 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-06-11 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-06-11 01:45,os-odl_l3-nofeature-ha,apex,15/33,45.0
+2017-06-11 01:45,os-nosdn-kvm-ha,apex,27/33,82.0
+2017-06-11 01:45,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-06-11 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-11 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-11 01:45,os-odl-bgpvpn-ha,apex,15/36,42.0
+2017-06-11 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-11 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-11 01:45,os-odl_l2-fdio-ha,apex,32/36,89.0
+2017-06-11 01:45,os-nosdn-nofeature-ha,apex,27/33,82.0
+2017-06-11 01:45,os-odl_l3-fdio-ha,apex,25/30,83.0
+2017-06-11 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-11 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-06-11 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-11 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-06-11 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-11 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-11 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-11 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-11 01:45,os-nosdn-ovs-noha,fuel,35/36,97.0
+2017-06-11 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,32/36,89.0
+2017-06-11 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-11 01:45,os-odl_l2-sfc-noha,fuel,39/42,93.0
+2017-06-11 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-06-11 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-11 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-11 01:45,os-odl_l2-nofeature-noha,fuel,34/39,87.0
+2017-06-11 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-06-11 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-06-11 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-11 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-11 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-11 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-11 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-11 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-06-11 01:45,os-nosdn-nofeature-noha,joid,14/33,42.0
+2017-06-11 01:45,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-06-11 01:45,os-nosdn-lxd-ha,joid,6/24,25.0
+2017-06-12 01:45,os-nosdn-kvm-noha,apex,26/33,79.0
+2017-06-12 01:45,os-nosdn-fdio-noha,apex,4/30,13.0
+2017-06-12 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-12 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-12 01:45,os-odl_l3-nofeature-noha,apex,15/33,45.0
+2017-06-12 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-06-12 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-06-12 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-06-12 01:45,os-odl_l3-nofeature-ha,apex,14/33,42.0
+2017-06-12 01:45,os-nosdn-kvm-ha,apex,27/33,82.0
+2017-06-12 01:45,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-06-12 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-12 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-12 01:45,os-odl-bgpvpn-ha,apex,16/36,44.0
+2017-06-12 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-12 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-12 01:45,os-odl_l2-fdio-ha,apex,30/36,83.0
+2017-06-12 01:45,os-nosdn-nofeature-ha,apex,27/33,82.0
+2017-06-12 01:45,os-odl_l3-fdio-ha,apex,25/30,83.0
+2017-06-12 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-12 01:45,os-odl_l2-nofeature-ha,compass,26/33,79.0
+2017-06-12 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-12 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-06-12 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-12 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-12 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-12 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-12 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-12 01:45,os-nosdn-ovs-noha,fuel,35/36,97.0
+2017-06-12 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-12 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-06-12 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-06-12 01:45,os-odl_l3-nofeature-ha,fuel,35/39,90.0
+2017-06-12 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-12 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-12 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-12 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-06-12 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-06-12 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,33/36,92.0
+2017-06-12 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-06-12 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-12 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-06-12 01:45,os-nosdn-nofeature-noha,joid,11/33,33.0
+2017-06-12 01:45,os-nosdn-nofeature-ha,joid,11/33,33.0
+2017-06-12 01:45,os-odl_l2-nofeature-ha,joid,3/36,8.0
+2017-06-13 01:45,os-nosdn-kvm-noha,apex,18/33,55.0
+2017-06-13 01:45,os-nosdn-fdio-noha,apex,4/30,13.0
+2017-06-13 01:45,os-odl-gluon-noha,apex,15/36,42.0
+2017-06-13 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-13 01:45,os-odl_l3-nofeature-noha,apex,15/33,45.0
+2017-06-13 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-13 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-06-13 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-06-13 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-06-13 01:45,os-odl-bgpvpn-ha,apex,16/36,44.0
+2017-06-13 01:45,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-06-13 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-13 01:45,os-odl_l3-fdio-ha,apex,25/30,83.0
+2017-06-13 01:45,os-nosdn-kvm-ha,apex,19/33,58.0
+2017-06-13 01:45,os-odl_l3-nofeature-ha,apex,14/33,42.0
+2017-06-13 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-13 01:45,os-odl_l3-ovs-noha,apex,5/33,15.0
+2017-06-13 01:45,os-odl_l2-fdio-ha,apex,30/36,83.0
+2017-06-13 01:45,os-nosdn-nofeature-ha,apex,27/33,82.0
+2017-06-13 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-13 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-06-13 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-13 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-06-13 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-06-13 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-13 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-13 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-13 01:45,os-nosdn-ovs-noha,fuel,35/36,97.0
+2017-06-13 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,33/36,92.0
+2017-06-13 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-13 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-13 01:45,os-odl_l3-nofeature-ha,fuel,34/39,87.0
+2017-06-13 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-13 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-13 01:45,os-odl_l2-nofeature-noha,fuel,34/39,87.0
+2017-06-13 01:45,os-odl_l2-bgpvpn-ha,fuel,37/42,88.0
+2017-06-13 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-06-13 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-13 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-06-13 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-06-13 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-13 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-06-14 01:45,os-nosdn-kvm-noha,apex,26/33,79.0
+2017-06-14 01:45,os-nosdn-fdio-noha,apex,4/30,13.0
+2017-06-14 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-14 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-14 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-14 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-06-14 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-06-14 01:45,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-06-14 01:45,os-odl_l3-nofeature-ha,apex,13/33,39.0
+2017-06-14 01:45,os-odl_l2-fdio-ha,apex,30/36,83.0
+2017-06-14 01:45,os-odl_l3-nofeature-noha,apex,15/33,45.0
+2017-06-14 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-14 01:45,os-odl-bgpvpn-ha,apex,16/36,44.0
+2017-06-14 01:45,os-odl_l3-ovs-ha,apex,6/33,18.0
+2017-06-14 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-14 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-14 01:45,os-nosdn-kvm-ha,apex,19/33,58.0
+2017-06-14 01:45,os-nosdn-nofeature-ha,apex,26/33,79.0
+2017-06-14 01:45,os-odl_l3-fdio-ha,apex,25/30,83.0
+2017-06-14 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-14 01:45,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-06-14 01:45,os-onos-nofeature-ha,compass,29/33,88.0
+2017-06-14 01:45,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-06-14 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-06-14 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-06-14 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-14 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-14 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-14 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,33/36,92.0
+2017-06-14 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-14 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-14 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-14 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-14 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-14 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-06-14 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-06-14 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-06-14 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-14 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-06-14 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-06-14 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-14 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-06-15 01:45,os-nosdn-kvm-noha,apex,26/33,79.0
+2017-06-15 01:45,os-nosdn-fdio-noha,apex,4/30,13.0
+2017-06-15 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-15 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-15 01:45,os-odl_l3-nofeature-noha,apex,10/33,30.0
+2017-06-15 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-06-15 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-06-15 01:45,os-odl_l3-fdio-ha,apex,25/30,83.0
+2017-06-15 01:45,os-odl-bgpvpn-ha,apex,16/36,44.0
+2017-06-15 01:45,os-odl_l2-fdio-ha,apex,30/36,83.0
+2017-06-15 01:45,os-odl_l3-fdio-noha,apex,27/30,90.0
+2017-06-15 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-15 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-15 01:45,os-odl_l3-nofeature-ha,apex,10/33,30.0
+2017-06-15 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-15 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-15 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-15 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-06-15 01:45,os-nosdn-nofeature-ha,apex,26/33,79.0
+2017-06-15 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-15 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-06-15 01:45,os-onos-nofeature-ha,compass,29/33,88.0
+2017-06-15 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-15 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-06-15 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-06-15 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,33/36,92.0
+2017-06-15 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-15 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-15 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-15 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-15 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-15 01:45,os-odl_l3-nofeature-ha,fuel,35/39,90.0
+2017-06-15 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-15 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-15 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-06-15 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-15 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,41/42,98.0
+2017-06-15 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,35/39,90.0
+2017-06-15 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-06-15 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-15 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-06-15 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-16 01:45,os-nosdn-kvm-noha,apex,26/33,79.0
+2017-06-16 01:45,os-nosdn-fdio-noha,apex,4/30,13.0
+2017-06-16 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-16 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-16 01:45,os-odl_l3-nofeature-noha,apex,10/33,30.0
+2017-06-16 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-16 01:45,os-odl_l2-fdio-noha,apex,32/36,89.0
+2017-06-16 01:45,os-odl_l3-fdio-ha,apex,25/30,83.0
+2017-06-16 01:45,os-odl_l3-nofeature-ha,apex,10/33,30.0
+2017-06-16 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-06-16 01:45,os-odl_l3-fdio-noha,apex,26/30,87.0
+2017-06-16 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-16 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-16 01:45,os-odl-bgpvpn-ha,apex,11/36,31.0
+2017-06-16 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-16 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-16 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-16 01:45,os-odl_l2-fdio-ha,apex,30/36,83.0
+2017-06-16 01:45,os-nosdn-nofeature-ha,apex,26/33,79.0
+2017-06-16 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-16 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-06-16 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-16 01:45,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-06-16 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-16 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-06-16 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,41/42,98.0
+2017-06-16 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-16 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,35/39,90.0
+2017-06-16 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-16 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-16 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-06-16 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-16 01:45,os-nosdn-kvm-ha,fuel,38/39,97.0
+2017-06-16 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-16 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-06-16 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-16 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-16 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-16 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-06-16 01:45,os-odl_l2-nofeature-ha,fuel,40/42,95.0
+2017-06-16 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-16 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-17 01:45,os-nosdn-kvm-noha,apex,25/33,76.0
+2017-06-17 01:45,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-17 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-17 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-17 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-17 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-17 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-06-17 01:45,os-odl_l2-fdio-noha,apex,31/36,86.0
+2017-06-17 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-17 01:45,os-odl_l3-nofeature-ha,apex,10/33,30.0
+2017-06-17 01:45,os-odl_l2-fdio-ha,apex,16/36,44.0
+2017-06-17 01:45,os-odl_l3-fdio-noha,apex,25/30,83.0
+2017-06-17 01:45,os-odl_l3-nofeature-noha,apex,10/33,30.0
+2017-06-17 01:45,os-odl_l3-fdio-ha,apex,26/30,87.0
+2017-06-17 01:45,os-odl-bgpvpn-ha,apex,11/36,31.0
+2017-06-17 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-17 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-17 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-06-17 01:45,os-nosdn-nofeature-ha,apex,28/33,85.0
+2017-06-17 01:45,os-onos-sfc-ha,compass,1/36,3.0
+2017-06-17 01:45,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-06-17 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-17 01:45,os-onos-nofeature-ha,compass,29/33,88.0
+2017-06-17 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-06-17 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-06-17 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-06-17 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,41/42,98.0
+2017-06-17 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-17 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,35/39,90.0
+2017-06-17 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-17 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-17 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-06-17 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-17 01:45,os-nosdn-kvm-ha,fuel,38/39,97.0
+2017-06-17 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-17 01:45,os-odl_l2-nofeature-noha,fuel,36/39,92.0
+2017-06-17 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-06-17 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-17 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-17 01:45,os-odl_l2-bgpvpn-noha,fuel,42/42,100.0
+2017-06-17 01:45,os-odl_l2-nofeature-ha,fuel,40/42,95.0
+2017-06-17 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-17 01:45,os-nosdn-nofeature-ha,fuel,36/39,92.0
+2017-06-18 01:45,os-nosdn-kvm-noha,apex,19/33,58.0
+2017-06-18 01:45,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-18 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-18 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-18 01:45,os-odl_l3-nofeature-noha,apex,10/33,30.0
+2017-06-18 01:45,os-odl_l2-fdio-noha,apex,10/36,28.0
+2017-06-18 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-06-18 01:45,os-odl_l3-fdio-noha,apex,24/30,80.0
+2017-06-18 01:45,os-odl_l3-nofeature-ha,apex,8/33,24.0
+2017-06-18 01:45,os-nosdn-kvm-ha,apex,17/33,52.0
+2017-06-18 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-18 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-18 01:45,os-odl-bgpvpn-ha,apex,11/36,31.0
+2017-06-18 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-18 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-18 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-18 01:45,os-odl_l2-fdio-ha,apex,18/36,50.0
+2017-06-18 01:45,os-nosdn-nofeature-ha,apex,28/33,85.0
+2017-06-18 01:45,os-odl_l3-fdio-ha,apex,20/30,67.0
+2017-06-18 01:45,os-onos-sfc-ha,compass,9/36,25.0
+2017-06-18 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-06-18 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-18 01:45,os-onos-nofeature-ha,compass,29/33,88.0
+2017-06-18 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-06-18 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-06-18 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-06-18 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,41/42,98.0
+2017-06-18 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-18 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,35/39,90.0
+2017-06-18 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-18 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-18 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-18 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-18 01:45,os-nosdn-kvm-ha,fuel,38/39,97.0
+2017-06-18 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-18 01:45,os-odl_l2-nofeature-noha,fuel,36/39,92.0
+2017-06-18 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-06-18 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-18 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-18 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-18 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-18 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-18 01:45,os-nosdn-nofeature-ha,fuel,36/39,92.0
+2017-06-19 01:45,os-nosdn-kvm-noha,apex,25/33,76.0
+2017-06-19 01:45,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-19 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-19 01:45,os-nosdn-ovs-noha,apex,6/33,18.0
+2017-06-19 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-19 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-06-19 01:45,os-odl_l2-fdio-noha,apex,10/36,28.0
+2017-06-19 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-19 01:45,os-odl_l3-nofeature-ha,apex,8/33,24.0
+2017-06-19 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-06-19 01:45,os-odl_l3-fdio-noha,apex,24/30,80.0
+2017-06-19 01:45,os-odl_l3-nofeature-noha,apex,10/33,30.0
+2017-06-19 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-19 01:45,os-odl-bgpvpn-ha,apex,11/36,31.0
+2017-06-19 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-19 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-19 01:45,os-odl_l2-fdio-ha,apex,18/36,50.0
+2017-06-19 01:45,os-nosdn-nofeature-ha,apex,28/33,85.0
+2017-06-19 01:45,os-odl_l3-fdio-ha,apex,20/30,67.0
+2017-06-19 01:45,os-onos-sfc-ha,compass,15/36,42.0
+2017-06-19 01:45,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-06-19 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-19 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-19 01:45,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-06-19 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-19 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-06-19 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-19 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-19 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-19 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-19 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-19 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-19 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-19 01:45,os-nosdn-kvm-ha,fuel,38/39,97.0
+2017-06-19 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-19 01:45,os-odl_l2-nofeature-noha,fuel,37/39,95.0
+2017-06-19 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-06-19 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-19 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-06-19 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-19 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-19 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-19 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-06-20 01:45,os-nosdn-kvm-noha,apex,17/33,52.0
+2017-06-20 01:45,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-20 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-20 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-20 01:45,os-odl_l3-nofeature-noha,apex,7/33,21.0
+2017-06-20 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-20 01:45,os-odl_l2-fdio-noha,apex,8/36,22.0
+2017-06-20 01:45,os-ovn-nofeature-noha,apex,9/33,27.0
+2017-06-20 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-20 01:45,os-odl-bgpvpn-ha,apex,11/36,31.0
+2017-06-20 01:45,os-odl_l3-fdio-noha,apex,24/30,80.0
+2017-06-20 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-20 01:45,os-odl_l3-fdio-ha,apex,20/30,67.0
+2017-06-20 01:45,os-nosdn-kvm-ha,apex,18/33,55.0
+2017-06-20 01:45,os-odl_l3-nofeature-ha,apex,8/33,24.0
+2017-06-20 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-20 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-20 01:45,os-odl_l2-fdio-ha,apex,16/36,44.0
+2017-06-20 01:45,os-nosdn-nofeature-ha,apex,28/33,85.0
+2017-06-20 01:45,os-onos-sfc-ha,compass,22/36,61.0
+2017-06-20 01:45,os-odl_l3-nofeature-ha,compass,22/30,73.0
+2017-06-20 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-20 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-20 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-06-20 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-20 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-06-20 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-20 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-20 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,39/39,100.0
+2017-06-20 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-20 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-20 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-20 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-20 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-20 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-20 01:45,os-odl_l2-nofeature-noha,fuel,37/39,95.0
+2017-06-20 01:45,os-odl_l2-bgpvpn-ha,fuel,37/42,88.0
+2017-06-20 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-20 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-20 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-20 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-20 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-20 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-06-21 01:45,os-nosdn-kvm-noha,apex,17/33,52.0
+2017-06-21 01:45,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-21 01:45,os-odl-gluon-noha,apex,10/36,28.0
+2017-06-21 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-21 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-21 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-21 01:45,os-odl_l2-fdio-noha,apex,8/36,22.0
+2017-06-21 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-21 01:45,os-odl_l3-nofeature-ha,apex,8/33,24.0
+2017-06-21 01:45,os-odl_l2-fdio-ha,apex,16/36,44.0
+2017-06-21 01:45,os-odl_l3-fdio-noha,apex,24/30,80.0
+2017-06-21 01:45,os-odl_l3-nofeature-noha,apex,7/33,21.0
+2017-06-21 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-21 01:45,os-odl-bgpvpn-ha,apex,11/36,31.0
+2017-06-21 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-21 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-21 01:45,os-nosdn-kvm-ha,apex,18/33,55.0
+2017-06-21 01:45,os-nosdn-nofeature-ha,apex,26/33,79.0
+2017-06-21 01:45,os-odl_l3-fdio-ha,apex,20/30,67.0
+2017-06-21 01:45,os-onos-sfc-ha,compass,22/36,61.0
+2017-06-21 01:45,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-06-21 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-21 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-21 01:45,os-odl_l2-nofeature-ha,compass,26/33,79.0
+2017-06-21 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-21 01:45,os-nosdn-kvm-noha,fuel,35/36,97.0
+2017-06-21 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-21 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-21 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-06-21 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-21 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-21 01:45,os-odl_l2-sfc-noha,fuel,38/42,90.0
+2017-06-21 01:45,os-odl_l3-nofeature-ha,fuel,38/39,97.0
+2017-06-21 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-21 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-21 01:45,os-odl_l2-nofeature-noha,fuel,37/39,95.0
+2017-06-21 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-06-21 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-21 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-21 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-21 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-06-21 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-21 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-22 01:45,os-nosdn-kvm-noha,apex,16/33,48.0
+2017-06-22 01:45,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-22 01:45,os-odl-gluon-noha,apex,14/36,39.0
+2017-06-22 01:45,os-nosdn-ovs-noha,apex,4/33,12.0
+2017-06-22 01:45,os-odl_l3-nofeature-noha,apex,2/33,6.0
+2017-06-22 01:45,os-odl_l2-fdio-noha,apex,8/36,22.0
+2017-06-22 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-22 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-22 01:45,os-odl-bgpvpn-ha,apex,6/36,17.0
+2017-06-22 01:45,os-nosdn-kvm-ha,apex,18/33,55.0
+2017-06-22 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-22 01:45,os-odl_l3-fdio-ha,apex,20/30,67.0
+2017-06-22 01:45,os-odl_l3-fdio-noha,apex,24/30,80.0
+2017-06-22 01:45,os-odl_l3-ovs-ha,apex,2/33,6.0
+2017-06-22 01:45,os-nosdn-ovs-ha,apex,4/33,12.0
+2017-06-22 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-22 01:45,os-odl_l2-fdio-ha,apex,17/36,47.0
+2017-06-22 01:45,os-odl_l3-nofeature-ha,apex,5/33,15.0
+2017-06-22 01:45,os-nosdn-nofeature-ha,apex,26/33,79.0
+2017-06-22 01:45,os-onos-sfc-ha,compass,23/36,64.0
+2017-06-22 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-06-22 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-22 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-22 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-06-22 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-22 01:45,os-nosdn-kvm-noha,fuel,32/36,89.0
+2017-06-22 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-22 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-22 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-22 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-22 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-06-22 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-22 01:45,os-odl_l3-nofeature-ha,fuel,38/39,97.0
+2017-06-22 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-22 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-22 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-06-22 01:45,os-odl_l2-bgpvpn-ha,fuel,38/42,90.0
+2017-06-22 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-22 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-22 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-06-22 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-06-22 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-22 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-23 01:45,os-nosdn-kvm-noha,apex,19/33,58.0
+2017-06-23 01:45,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-23 01:45,os-odl-gluon-noha,apex,14/36,39.0
+2017-06-23 01:45,os-nosdn-ovs-noha,apex,6/33,18.0
+2017-06-23 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-23 01:45,os-odl_l2-fdio-noha,apex,16/36,44.0
+2017-06-23 01:45,os-odl_l3-fdio-noha,apex,25/30,83.0
+2017-06-23 01:45,os-odl_l2-fdio-ha,apex,17/36,47.0
+2017-06-23 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-23 01:45,os-odl_l3-fdio-ha,apex,15/30,50.0
+2017-06-23 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-23 01:45,os-nosdn-kvm-ha,apex,18/33,55.0
+2017-06-23 01:45,os-nosdn-nofeature-ha,apex,28/33,85.0
+2017-06-23 01:45,os-onos-sfc-ha,compass,23/36,64.0
+2017-06-23 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-06-23 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-23 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-23 01:45,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-06-23 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-06-23 01:45,os-nosdn-kvm-noha,fuel,32/36,89.0
+2017-06-23 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-23 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-23 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-23 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-23 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-06-23 01:45,os-odl_l3-nofeature-ha,fuel,38/39,97.0
+2017-06-23 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-23 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-06-23 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-06-23 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-23 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-06-23 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-23 01:45,os-odl_l2-nofeature-ha,fuel,40/42,95.0
+2017-06-23 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-23 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-24 01:45,os-nosdn-kvm-noha,apex,21/33,64.0
+2017-06-24 01:45,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-24 01:45,os-nosdn-ovs-noha,apex,6/33,18.0
+2017-06-24 01:45,os-odl_l2-fdio-noha,apex,16/36,44.0
+2017-06-24 01:45,os-nosdn-kvm-ha,apex,18/33,55.0
+2017-06-24 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-24 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-24 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-24 01:45,os-odl_l2-fdio-ha,apex,18/36,50.0
+2017-06-24 01:45,os-nosdn-nofeature-ha,apex,28/33,85.0
+2017-06-24 01:45,os-onos-sfc-ha,compass,23/36,64.0
+2017-06-24 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-06-24 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-24 01:45,os-onos-nofeature-ha,compass,29/33,88.0
+2017-06-24 01:45,os-odl_l2-nofeature-ha,compass,31/33,94.0
+2017-06-24 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-06-24 01:45,os-nosdn-kvm-noha,fuel,32/36,89.0
+2017-06-24 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-24 01:45,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-06-24 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-24 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-24 01:45,os-odl_l2-sfc-noha,fuel,36/42,86.0
+2017-06-24 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-24 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-24 01:45,os-nosdn-nofeature-noha,fuel,35/36,97.0
+2017-06-24 01:45,os-odl_l2-nofeature-noha,fuel,35/39,90.0
+2017-06-24 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-24 01:45,os-odl_l3-nofeature-noha,fuel,35/36,97.0
+2017-06-24 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-06-24 01:45,os-odl_l2-bgpvpn-noha,fuel,40/42,95.0
+2017-06-24 01:45,os-odl_l2-nofeature-ha,fuel,41/42,98.0
+2017-06-24 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-06-25 01:45,os-nosdn-kvm-noha,apex,21/33,64.0
+2017-06-25 01:45,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-25 01:45,os-odl-gluon-noha,apex,18/36,50.0
+2017-06-25 01:45,os-nosdn-ovs-noha,apex,6/33,18.0
+2017-06-25 01:45,os-odl_l3-nofeature-noha,apex,10/33,30.0
+2017-06-25 01:45,os-odl_l2-fdio-noha,apex,16/36,44.0
+2017-06-25 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-25 01:45,os-odl_l3-nofeature-ha,apex,7/33,21.0
+2017-06-25 01:45,os-odl_l2-fdio-ha,apex,17/36,47.0
+2017-06-25 01:45,os-odl_l3-fdio-noha,apex,23/30,77.0
+2017-06-25 01:45,os-nosdn-nofeature-noha,apex,28/33,85.0
+2017-06-25 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-25 01:45,os-odl-bgpvpn-ha,apex,14/36,39.0
+2017-06-25 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-25 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-25 01:45,os-nosdn-nofeature-ha,apex,28/33,85.0
+2017-06-25 01:45,os-odl_l3-fdio-ha,apex,20/30,67.0
+2017-06-25 01:45,os-onos-sfc-ha,compass,23/36,64.0
+2017-06-25 01:45,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-06-25 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-25 01:45,os-onos-nofeature-ha,compass,29/33,88.0
+2017-06-25 01:45,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-06-25 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-06-25 01:45,os-nosdn-kvm-noha,fuel,32/36,89.0
+2017-06-25 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-25 01:45,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-06-25 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,35/39,90.0
+2017-06-25 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-25 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-25 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-06-25 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-25 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-25 01:45,os-nosdn-nofeature-noha,fuel,35/36,97.0
+2017-06-25 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-06-25 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-25 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-06-25 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,36/36,100.0
+2017-06-25 01:45,os-odl_l2-bgpvpn-noha,fuel,40/42,95.0
+2017-06-25 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-25 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-25 01:45,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-06-26 01:45,os-nosdn-kvm-noha,apex,28/33,85.0
+2017-06-26 01:45,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-26 01:45,os-odl-gluon-noha,apex,18/36,50.0
+2017-06-26 01:45,os-nosdn-ovs-noha,apex,6/33,18.0
+2017-06-26 01:45,os-nosdn-nofeature-noha,apex,30/33,91.0
+2017-06-26 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-26 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-26 01:45,os-odl_l3-nofeature-ha,apex,7/33,21.0
+2017-06-26 01:45,os-odl_l2-fdio-ha,apex,17/36,47.0
+2017-06-26 01:45,os-odl_l3-fdio-noha,apex,17/30,57.0
+2017-06-26 01:45,os-odl_l3-nofeature-noha,apex,10/33,30.0
+2017-06-26 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-26 01:45,os-odl-bgpvpn-ha,apex,14/36,39.0
+2017-06-26 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-26 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-26 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-06-26 01:45,os-nosdn-nofeature-ha,apex,28/33,85.0
+2017-06-26 01:45,os-odl_l3-fdio-ha,apex,20/30,67.0
+2017-06-26 01:45,os-onos-sfc-ha,compass,24/36,67.0
+2017-06-26 01:45,os-odl_l3-nofeature-ha,compass,25/30,83.0
+2017-06-26 01:45,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-26 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-26 01:45,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-06-26 01:45,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-26 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-26 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-26 01:45,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-06-26 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-06-26 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-26 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-06-26 01:45,os-odl_l2-sfc-noha,fuel,34/42,81.0
+2017-06-26 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-06-26 01:45,os-nosdn-nofeature-noha,fuel,35/36,97.0
+2017-06-26 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-06-26 01:45,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-26 01:45,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-06-26 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,33/36,92.0
+2017-06-26 01:45,os-odl_l2-bgpvpn-noha,fuel,40/42,95.0
+2017-06-26 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-26 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-26 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-06-26 10:05,os-nosdn-kvm-noha,apex,28/33,85.0
+2017-06-26 10:05,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-26 10:05,os-odl-gluon-noha,apex,18/36,50.0
+2017-06-26 10:05,os-nosdn-ovs-noha,apex,6/33,18.0
+2017-06-26 10:05,os-nosdn-nofeature-noha,apex,30/33,91.0
+2017-06-26 10:05,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-26 10:05,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-26 10:05,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-26 10:05,os-odl-bgpvpn-ha,apex,14/36,39.0
+2017-06-26 10:05,os-odl_l2-fdio-ha,apex,17/36,47.0
+2017-06-26 10:05,os-odl_l3-fdio-noha,apex,17/30,57.0
+2017-06-26 10:05,os-odl_l3-nofeature-noha,apex,16/33,48.0
+2017-06-26 10:05,os-odl_l3-fdio-ha,apex,20/30,67.0
+2017-06-26 10:05,os-odl_l3-nofeature-ha,apex,12/33,36.0
+2017-06-26 10:05,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-26 10:05,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-26 10:05,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-06-26 10:05,os-nosdn-nofeature-ha,apex,28/33,85.0
+2017-06-26 12:31,os-nosdn-kvm-noha,apex,12/12,100.0
+2017-06-26 12:32,os-nosdn-kvm-noha,apex,0/3,0.0
+2017-06-26 12:32,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-27 01:45,os-nosdn-kvm-noha,apex,28/33,85.0
+2017-06-27 01:45,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-27 01:45,os-odl-gluon-noha,apex,24/36,67.0
+2017-06-27 01:45,os-nosdn-ovs-noha,apex,6/33,18.0
+2017-06-27 01:45,os-odl_l3-nofeature-noha,apex,16/33,48.0
+2017-06-27 01:45,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-27 01:45,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-27 01:45,os-odl_l3-ovs-ha,apex,4/33,12.0
+2017-06-27 01:45,os-odl-bgpvpn-ha,apex,17/36,47.0
+2017-06-27 01:45,os-odl_l3-fdio-noha,apex,14/30,47.0
+2017-06-27 01:45,os-nosdn-nofeature-noha,apex,30/33,91.0
+2017-06-27 01:45,os-odl_l3-fdio-ha,apex,11/30,37.0
+2017-06-27 01:45,os-odl_l3-nofeature-ha,apex,12/33,36.0
+2017-06-27 01:45,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-27 01:45,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-27 01:45,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-06-27 01:45,os-nosdn-nofeature-ha,apex,28/33,85.0
+2017-06-27 06:56,os-nosdn-kvm-noha,apex,28/33,85.0
+2017-06-27 06:56,os-nosdn-fdio-noha,apex,6/30,20.0
+2017-06-27 06:56,os-odl-gluon-noha,apex,24/36,67.0
+2017-06-27 06:56,os-nosdn-ovs-noha,apex,6/33,18.0
+2017-06-27 06:56,os-odl_l3-nofeature-noha,apex,16/33,48.0
+2017-06-27 06:56,os-nosdn-fdio-ha,apex,6/30,20.0
+2017-06-27 06:56,os-ovn-nofeature-noha,apex,6/33,18.0
+2017-06-27 06:56,os-odl_l3-fdio-noha,apex,14/30,47.0
+2017-06-27 06:56,os-odl-bgpvpn-ha,apex,17/36,47.0
+2017-06-27 06:56,os-nosdn-kvm-ha,apex,20/33,61.0
+2017-06-27 06:56,os-nosdn-nofeature-noha,apex,30/33,91.0
+2017-06-27 06:56,os-odl_l3-fdio-ha,apex,11/30,37.0
+2017-06-27 06:56,os-odl_l3-nofeature-ha,apex,12/33,36.0
+2017-06-27 06:56,os-nosdn-ovs-ha,apex,6/33,18.0
+2017-06-27 06:56,os-odl_l3-ovs-noha,apex,4/33,12.0
+2017-06-27 06:56,os-nosdn-nofeature-ha,apex,28/33,85.0
+2017-06-27 06:56,os-onos-sfc-ha,compass,24/36,67.0
+2017-06-27 06:56,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-06-27 06:56,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-27 06:56,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-27 06:56,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-06-27 06:56,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-27 06:56,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-27 06:56,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-27 06:56,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-06-27 06:56,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-27 06:56,os-nosdn-kvm_ovs_dpdk-ha,fuel,38/39,97.0
+2017-06-27 06:56,os-odl_l2-bgpvpn-noha,fuel,40/42,95.0
+2017-06-27 06:56,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-06-27 06:56,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-06-27 06:56,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-27 06:56,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-27 06:56,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-06-27 06:56,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-27 06:56,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-06-27 06:56,os-nosdn-kvm_ovs_dpdk-noha,fuel,33/36,92.0
+2017-06-27 06:56,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-06-27 06:56,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-27 06:56,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-06-27 07:48,os-nosdn-kvm-noha,apex,28/30,93.0
+2017-06-27 07:48,os-nosdn-fdio-noha,apex,6/27,22.0
+2017-06-27 07:48,os-odl-gluon-noha,apex,24/33,73.0
+2017-06-27 07:48,os-nosdn-ovs-noha,apex,6/30,20.0
+2017-06-27 07:48,os-odl_l3-nofeature-noha,apex,16/30,53.0
+2017-06-27 07:48,os-nosdn-fdio-ha,apex,6/27,22.0
+2017-06-27 07:48,os-ovn-nofeature-noha,apex,6/30,20.0
+2017-06-27 07:48,os-odl_l3-fdio-noha,apex,14/27,52.0
+2017-06-27 07:48,os-odl-bgpvpn-ha,apex,17/33,52.0
+2017-06-27 07:48,os-nosdn-kvm-ha,apex,20/30,67.0
+2017-06-27 07:48,os-nosdn-nofeature-noha,apex,30/30,100.0
+2017-06-27 07:48,os-odl_l3-fdio-ha,apex,11/27,41.0
+2017-06-27 07:48,os-odl_l3-nofeature-ha,apex,12/30,40.0
+2017-06-27 07:48,os-nosdn-ovs-ha,apex,6/30,20.0
+2017-06-27 07:48,os-odl_l3-ovs-noha,apex,4/30,13.0
+2017-06-27 07:48,os-nosdn-nofeature-ha,apex,28/30,93.0
+2017-06-27 07:48,os-onos-sfc-ha,compass,24/36,67.0
+2017-06-27 07:48,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-06-27 07:48,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-27 07:48,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-27 07:48,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-06-27 07:48,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-27 07:48,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-27 07:48,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-27 07:48,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-06-27 07:48,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-27 07:48,os-nosdn-kvm_ovs_dpdk-ha,fuel,38/39,97.0
+2017-06-27 07:48,os-odl_l2-bgpvpn-noha,fuel,40/42,95.0
+2017-06-27 07:48,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-06-27 07:48,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-06-27 07:48,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-27 07:48,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-27 07:48,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-06-27 07:48,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-27 07:48,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-06-27 07:48,os-nosdn-kvm_ovs_dpdk-noha,fuel,33/36,92.0
+2017-06-27 07:48,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-06-27 07:48,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-27 07:48,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-06-27 08:20,os-nosdn-kvm-noha,apex,28/30,93.0
+2017-06-27 08:20,os-nosdn-fdio-noha,apex,6/27,22.0
+2017-06-27 08:20,os-odl-gluon-noha,apex,24/33,73.0
+2017-06-27 08:20,os-nosdn-ovs-noha,apex,6/30,20.0
+2017-06-27 08:20,os-odl_l3-nofeature-noha,apex,16/30,53.0
+2017-06-27 08:20,os-nosdn-fdio-ha,apex,6/27,22.0
+2017-06-27 08:20,os-odl_l2-fdio-noha,apex,10/33,30.0
+2017-06-27 08:20,os-ovn-nofeature-noha,apex,6/30,20.0
+2017-06-27 08:20,os-odl_l3-fdio-noha,apex,14/27,52.0
+2017-06-27 08:20,os-odl-bgpvpn-ha,apex,17/33,52.0
+2017-06-27 08:20,os-nosdn-kvm-ha,apex,20/30,67.0
+2017-06-27 08:20,os-nosdn-nofeature-noha,apex,30/30,100.0
+2017-06-27 08:20,os-odl_l3-fdio-ha,apex,11/27,41.0
+2017-06-27 08:20,os-odl_l3-nofeature-ha,apex,12/30,40.0
+2017-06-27 08:20,os-odl_l3-ovs-ha,apex,4/30,13.0
+2017-06-27 08:20,os-nosdn-ovs-ha,apex,6/30,20.0
+2017-06-27 08:20,os-odl_l3-ovs-noha,apex,4/30,13.0
+2017-06-27 08:20,os-odl_l2-fdio-ha,apex,17/33,52.0
+2017-06-27 08:20,os-nosdn-nofeature-ha,apex,29/30,97.0
+2017-06-27 08:20,os-onos-sfc-ha,compass,24/36,67.0
+2017-06-27 08:20,os-odl_l3-nofeature-ha,compass,26/30,87.0
+2017-06-27 08:20,os-ocl-nofeature-ha,compass,3/30,10.0
+2017-06-27 08:20,os-onos-nofeature-ha,compass,28/33,85.0
+2017-06-27 08:20,os-odl_l2-nofeature-ha,compass,30/33,91.0
+2017-06-27 08:20,os-nosdn-nofeature-ha,compass,30/30,100.0
+2017-06-27 08:20,os-nosdn-kvm_ovs_dpdk-noha,fuel,33/36,92.0
+2017-06-27 08:20,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-06-27 08:20,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-06-27 08:20,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-06-27 08:20,os-nosdn-kvm_ovs_dpdk-ha,fuel,38/39,97.0
+2017-06-27 08:20,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-06-27 08:20,os-odl_l2-bgpvpn-noha,fuel,40/42,95.0
+2017-06-27 08:20,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-06-27 08:20,os-odl_l2-sfc-ha,fuel,44/45,98.0
+2017-06-27 08:20,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-06-27 08:20,os-nosdn-nofeature-noha,fuel,35/36,97.0
+2017-06-27 08:20,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-06-27 08:20,os-odl_l2-bgpvpn-ha,fuel,39/42,93.0
+2017-06-27 08:20,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-06-27 08:20,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-06-27 08:20,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-06-27 08:20,os-nosdn-ovs-ha,fuel,38/39,97.0
+2017-06-27 08:20,os-nosdn-nofeature-ha,fuel,38/39,97.0
+2017-07-07 14:52,os-nosdn-kvm-noha,apex,10/30,33.0
+2017-07-07 14:52,os-nosdn-fdio-noha,apex,2/27,7.0
+2017-07-07 14:52,os-odl-gluon-noha,apex,21/33,64.0
+2017-07-07 14:52,os-nosdn-ovs-noha,apex,2/30,7.0
+2017-07-07 14:52,os-nosdn-nofeature-noha,apex,21/30,70.0
+2017-07-07 14:52,os-ovn-nofeature-noha,apex,9/30,30.0
+2017-07-07 14:52,os-odl_l2-fdio-noha,apex,29/33,88.0
+2017-07-07 14:52,os-odl_l3-fdio-noha,apex,24/30,80.0
+2017-07-07 14:52,os-odl_l3-nofeature-ha,apex,16/30,53.0
+2017-07-07 14:52,os-nosdn-kvm-ha,apex,15/30,50.0
+2017-07-07 14:52,os-odl_l3-nofeature-noha,apex,9/30,30.0
+2017-07-07 14:52,os-nosdn-fdio-ha,apex,4/27,15.0
+2017-07-07 14:52,os-odl-bgpvpn-ha,apex,17/33,52.0
+2017-07-07 14:52,os-nosdn-ovs-ha,apex,2/30,7.0
+2017-07-07 14:52,os-odl_l3-ovs-noha,apex,4/30,13.0
+2017-07-07 14:52,os-odl_l2-fdio-ha,apex,12/33,36.0
+2017-07-07 14:52,os-nosdn-nofeature-ha,apex,20/30,67.0
+2017-07-07 14:52,os-odl_l3-fdio-ha,apex,14/30,47.0
+2017-07-07 14:52,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-07-07 14:52,os-onos-nofeature-ha,compass,28/33,85.0
+2017-07-07 14:52,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-07-07 14:52,os-odl_l3-nofeature-ha,compass,22/30,73.0
+2017-07-07 14:52,os-onos-sfc-ha,compass,21/36,58.0
+2017-07-07 14:52,os-nosdn-kvm_ovs_dpdk-noha,fuel,33/36,92.0
+2017-07-07 14:52,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-07-07 14:52,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-07-07 14:52,os-nosdn-kvm_ovs_dpdk-ha,fuel,35/39,90.0
+2017-07-07 14:52,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-07-07 14:52,os-odl_l2-sfc-noha,fuel,38/42,90.0
+2017-07-07 14:52,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-07-07 14:52,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-07-07 14:52,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-07-07 14:52,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-07-07 14:52,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-07-07 14:52,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,41/42,98.0
+2017-07-07 14:52,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,37/39,95.0
+2017-07-07 14:52,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-07-07 14:52,os-odl_l2-sfc-ha,fuel,39/45,87.0
+2017-07-07 14:52,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-07-07 14:52,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-07-07 14:52,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-07-07 14:52,os-nosdn-lxd-noha,joid,5/21,24.0
+2017-07-07 14:52,os-nosdn-nofeature-noha,joid,20/30,67.0
+2017-07-07 14:52,os-odl_l2-nofeature-ha,joid,3/33,9.0
+2017-07-07 14:52,os-nosdn-nofeature-ha,joid,19/30,63.0
+2017-07-07 14:52,os-nosdn-lxd-ha,joid,10/21,48.0
+2017-07-08 01:45,os-nosdn-fdio-noha,apex,2/27,7.0
+2017-07-08 01:45,os-odl-gluon-noha,apex,21/33,64.0
+2017-07-08 01:45,os-nosdn-ovs-noha,apex,4/30,13.0
+2017-07-08 01:45,os-nosdn-nofeature-noha,apex,29/30,97.0
+2017-07-08 01:45,os-ovn-nofeature-noha,apex,9/30,30.0
+2017-07-08 01:45,os-odl_l2-fdio-noha,apex,27/33,82.0
+2017-07-08 01:45,os-nosdn-fdio-ha,apex,2/27,7.0
+2017-07-08 01:45,os-odl-bgpvpn-ha,apex,17/33,52.0
+2017-07-08 01:45,os-odl_l3-fdio-noha,apex,14/30,47.0
+2017-07-08 01:45,os-odl_l3-nofeature-noha,apex,5/30,17.0
+2017-07-08 01:45,os-odl_l3-fdio-ha,apex,14/30,47.0
+2017-07-08 01:45,os-odl_l3-nofeature-ha,apex,16/30,53.0
+2017-07-08 01:45,os-nosdn-ovs-ha,apex,4/30,13.0
+2017-07-08 01:45,os-odl_l3-ovs-noha,apex,4/30,13.0
+2017-07-08 01:45,os-odl_l2-fdio-ha,apex,12/33,36.0
+2017-07-08 01:45,os-nosdn-nofeature-ha,apex,30/30,100.0
+2017-07-08 01:45,os-odl_l2-nofeature-ha,compass,28/33,85.0
+2017-07-08 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-07-08 01:45,os-nosdn-nofeature-ha,compass,28/30,93.0
+2017-07-08 01:45,os-odl_l3-nofeature-ha,compass,21/30,70.0
+2017-07-08 01:45,os-onos-sfc-ha,compass,21/36,58.0
+2017-07-08 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-07-08 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,41/42,98.0
+2017-07-08 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-07-08 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-07-08 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-07-08 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,35/39,90.0
+2017-07-08 01:45,os-odl_l2-sfc-noha,fuel,38/42,90.0
+2017-07-08 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-07-08 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-07-08 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-07-08 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-07-08 01:45,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-07-08 01:45,os-odl_l2-sfc-ha,fuel,39/45,87.0
+2017-07-08 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,34/36,94.0
+2017-07-08 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-07-08 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-07-08 01:45,os-odl_l3-nofeature-noha,fuel,24/36,67.0
+2017-07-08 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-07-08 01:45,os-nosdn-lxd-noha,joid,9/21,43.0
+2017-07-08 01:45,os-nosdn-nofeature-noha,joid,20/30,67.0
+2017-07-08 01:45,os-odl_l2-nofeature-ha,joid,3/33,9.0
+2017-07-08 01:45,os-nosdn-nofeature-ha,joid,19/30,63.0
+2017-07-08 01:45,os-nosdn-lxd-ha,joid,10/21,48.0
+2017-07-09 01:45,os-nosdn-kvm-noha,apex,10/30,33.0
+2017-07-09 01:45,os-nosdn-fdio-noha,apex,2/27,7.0
+2017-07-09 01:45,os-odl-gluon-noha,apex,21/33,64.0
+2017-07-09 01:45,os-nosdn-ovs-noha,apex,4/30,13.0
+2017-07-09 01:45,os-odl_l3-nofeature-noha,apex,8/30,27.0
+2017-07-09 01:45,os-odl_l2-fdio-noha,apex,24/33,73.0
+2017-07-09 01:45,os-ovn-nofeature-noha,apex,9/30,30.0
+2017-07-09 01:45,os-odl_l3-fdio-noha,apex,14/30,47.0
+2017-07-09 01:45,os-odl_l3-nofeature-ha,apex,16/30,53.0
+2017-07-09 01:45,os-odl_l2-fdio-ha,apex,26/33,79.0
+2017-07-09 01:45,os-nosdn-nofeature-noha,apex,21/30,70.0
+2017-07-09 01:45,os-nosdn-fdio-ha,apex,4/27,15.0
+2017-07-09 01:45,os-odl-bgpvpn-ha,apex,9/33,27.0
+2017-07-09 01:45,os-odl_l3-ovs-ha,apex,2/30,7.0
+2017-07-09 01:45,os-nosdn-ovs-ha,apex,4/30,13.0
+2017-07-09 01:45,os-odl_l3-ovs-noha,apex,4/30,13.0
+2017-07-09 01:45,os-nosdn-kvm-ha,apex,15/30,50.0
+2017-07-09 01:45,os-nosdn-nofeature-ha,apex,30/30,100.0
+2017-07-09 01:45,os-odl_l3-fdio-ha,apex,15/30,50.0
+2017-07-09 01:45,os-odl_l2-nofeature-ha,compass,25/33,76.0
+2017-07-09 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-07-09 01:45,os-nosdn-nofeature-ha,compass,28/30,93.0
+2017-07-09 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-07-09 01:45,os-onos-sfc-ha,compass,21/36,58.0
+2017-07-09 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-07-09 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,41/42,98.0
+2017-07-09 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,37/39,95.0
+2017-07-09 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-07-09 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-07-09 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-07-09 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-07-09 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-07-09 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-07-09 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-07-09 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-07-09 01:45,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-07-09 01:45,os-odl_l2-sfc-ha,fuel,39/45,87.0
+2017-07-09 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,34/36,94.0
+2017-07-09 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-07-09 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-07-09 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-07-09 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-07-09 01:45,os-nosdn-lxd-noha,joid,10/21,48.0
+2017-07-09 01:45,os-nosdn-nofeature-noha,joid,20/30,67.0
+2017-07-09 01:45,os-odl_l2-nofeature-ha,joid,3/33,9.0
+2017-07-09 01:45,os-nosdn-nofeature-ha,joid,20/30,67.0
+2017-07-09 01:45,os-nosdn-lxd-ha,joid,10/21,48.0
+2017-07-10 01:45,os-nosdn-kvm-noha,apex,10/30,33.0
+2017-07-10 01:45,os-odl-gluon-noha,apex,29/33,88.0
+2017-07-10 01:45,os-nosdn-ovs-noha,apex,4/30,13.0
+2017-07-10 01:45,os-odl_l3-nofeature-noha,apex,8/30,27.0
+2017-07-10 01:45,os-nosdn-fdio-ha,apex,4/27,15.0
+2017-07-10 01:45,os-odl_l2-fdio-noha,apex,24/33,73.0
+2017-07-10 01:45,os-ovn-nofeature-noha,apex,9/30,30.0
+2017-07-10 01:45,os-odl_l3-fdio-noha,apex,20/30,67.0
+2017-07-10 01:45,os-odl_l3-nofeature-ha,apex,16/30,53.0
+2017-07-10 01:45,os-odl_l2-fdio-ha,apex,26/33,79.0
+2017-07-10 01:45,os-nosdn-nofeature-noha,apex,21/30,70.0
+2017-07-10 01:45,os-odl_l3-fdio-ha,apex,15/30,50.0
+2017-07-10 01:45,os-odl-bgpvpn-ha,apex,18/33,55.0
+2017-07-10 01:45,os-odl_l3-ovs-ha,apex,2/30,7.0
+2017-07-10 01:45,os-nosdn-ovs-ha,apex,4/30,13.0
+2017-07-10 01:45,os-odl_l3-ovs-noha,apex,4/30,13.0
+2017-07-10 01:45,os-nosdn-kvm-ha,apex,15/30,50.0
+2017-07-10 01:45,os-nosdn-nofeature-ha,apex,30/30,100.0
+2017-07-10 01:45,os-odl_l2-nofeature-ha,compass,26/33,79.0
+2017-07-10 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-07-10 01:45,os-nosdn-nofeature-ha,compass,28/30,93.0
+2017-07-10 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-07-10 01:45,os-onos-sfc-ha,compass,21/36,58.0
+2017-07-10 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-07-10 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,41/42,98.0
+2017-07-10 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,38/39,97.0
+2017-07-10 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-07-10 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-07-10 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-07-10 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-07-10 01:45,os-odl_l2-sfc-ha,fuel,42/45,93.0
+2017-07-10 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-07-10 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-07-10 01:45,os-odl_l2-nofeature-noha,fuel,38/39,97.0
+2017-07-10 01:45,os-odl_l2-bgpvpn-ha,fuel,40/42,95.0
+2017-07-10 01:45,os-odl_l3-nofeature-ha,fuel,39/39,100.0
+2017-07-10 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,34/36,94.0
+2017-07-10 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-07-10 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-07-10 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-07-10 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-07-10 01:45,os-nosdn-lxd-noha,joid,14/21,67.0
+2017-07-10 01:45,os-nosdn-nofeature-noha,joid,20/30,67.0
+2017-07-10 01:45,os-odl_l2-nofeature-ha,joid,3/33,9.0
+2017-07-10 01:45,os-nosdn-nofeature-ha,joid,29/30,97.0
+2017-07-10 01:45,os-nosdn-lxd-ha,joid,10/21,48.0
+2017-07-12 01:45,os-nosdn-kvm-noha,apex,10/30,33.0
+2017-07-12 01:45,os-odl-gluon-noha,apex,23/33,70.0
+2017-07-12 01:45,os-nosdn-ovs-noha,apex,4/30,13.0
+2017-07-12 01:45,os-odl_l3-nofeature-noha,apex,16/30,53.0
+2017-07-12 01:45,os-nosdn-fdio-ha,apex,11/27,41.0
+2017-07-12 01:45,os-odl_l2-fdio-noha,apex,24/33,73.0
+2017-07-12 01:45,os-ovn-nofeature-noha,apex,9/30,30.0
+2017-07-12 01:45,os-odl_l3-fdio-noha,apex,20/30,67.0
+2017-07-12 01:45,os-odl_l3-nofeature-ha,apex,16/30,53.0
+2017-07-12 01:45,os-odl_l2-fdio-ha,apex,25/33,76.0
+2017-07-12 01:45,os-nosdn-nofeature-noha,apex,20/30,67.0
+2017-07-12 01:45,os-odl_l3-fdio-ha,apex,18/30,60.0
+2017-07-12 01:45,os-odl-bgpvpn-ha,apex,18/33,55.0
+2017-07-12 01:45,os-odl_l3-ovs-ha,apex,4/30,13.0
+2017-07-12 01:45,os-nosdn-ovs-ha,apex,4/30,13.0
+2017-07-12 01:45,os-odl_l3-ovs-noha,apex,4/30,13.0
+2017-07-12 01:45,os-nosdn-kvm-ha,apex,20/30,67.0
+2017-07-12 01:45,os-nosdn-nofeature-ha,apex,20/30,67.0
+2017-07-12 01:45,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-07-12 01:45,os-onos-nofeature-ha,compass,27/33,82.0
+2017-07-12 01:45,os-odl_l3-nofeature-ha,compass,24/30,80.0
+2017-07-12 01:45,os-nosdn-nofeature-ha,compass,28/30,93.0
+2017-07-12 01:45,os-onos-sfc-ha,compass,20/36,56.0
+2017-07-12 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-07-12 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-07-12 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-07-12 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,37/39,95.0
+2017-07-12 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-07-12 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-07-12 01:45,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-07-12 01:45,os-odl_l3-nofeature-ha,fuel,37/39,95.0
+2017-07-12 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-07-12 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-07-12 01:45,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-07-12 01:45,os-odl_l2-bgpvpn-ha,fuel,41/42,98.0
+2017-07-12 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-07-12 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,34/36,94.0
+2017-07-12 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-07-12 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-07-12 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-07-12 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-07-12 01:45,os-nosdn-lxd-noha,joid,14/21,67.0
+2017-07-12 01:45,os-nosdn-nofeature-noha,joid,20/30,67.0
+2017-07-12 01:45,os-odl_l2-nofeature-ha,joid,6/33,18.0
+2017-07-12 01:45,os-nosdn-nofeature-ha,joid,30/30,100.0
+2017-07-12 01:45,os-nosdn-lxd-ha,joid,10/21,48.0
+2017-07-12 12:10,os-nosdn-kvm-noha,apex,10/30,33.0
+2017-07-12 12:10,os-odl-gluon-noha,apex,23/33,70.0
+2017-07-12 12:10,os-odl_l3-fdio_dvr-noha,apex,10/30,33.0
+2017-07-12 12:10,os-nosdn-ovs-noha,apex,4/30,13.0
+2017-07-12 12:10,os-odl_l3-nofeature-noha,apex,16/30,53.0
+2017-07-12 12:10,os-nosdn-fdio-ha,apex,27/27,100.0
+2017-07-12 12:10,os-odl_l2-fdio-noha,apex,24/33,73.0
+2017-07-12 12:10,os-ovn-nofeature-noha,apex,9/30,30.0
+2017-07-12 12:10,os-odl_l3-fdio-noha,apex,20/30,67.0
+2017-07-12 12:10,os-odl_l3-nofeature-ha,apex,16/30,53.0
+2017-07-12 12:10,os-odl_l2-fdio-ha,apex,25/33,76.0
+2017-07-12 12:10,os-nosdn-nofeature-noha,apex,20/30,67.0
+2017-07-12 12:10,os-odl_l3-fdio-ha,apex,18/30,60.0
+2017-07-12 12:10,os-odl-bgpvpn-ha,apex,18/33,55.0
+2017-07-12 12:10,os-odl_l3-ovs-ha,apex,4/30,13.0
+2017-07-12 12:10,os-nosdn-ovs-ha,apex,4/30,13.0
+2017-07-12 12:10,os-odl_l3-ovs-noha,apex,4/30,13.0
+2017-07-12 12:10,os-nosdn-kvm-ha,apex,20/30,67.0
+2017-07-12 12:10,os-nosdn-nofeature-ha,apex,20/30,67.0
+2017-07-12 12:10,os-odl_l2-nofeature-ha,compass,27/33,82.0
+2017-07-12 12:10,os-onos-nofeature-ha,compass,28/33,85.0
+2017-07-12 12:10,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-07-12 12:10,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-07-12 12:10,os-onos-sfc-ha,compass,20/36,56.0
+2017-07-12 12:10,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-07-12 12:10,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-07-12 12:10,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-07-12 12:10,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,37/39,95.0
+2017-07-12 12:10,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-07-12 12:10,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-07-12 12:10,os-odl_l2-sfc-noha,fuel,37/42,88.0
+2017-07-12 12:10,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-07-12 12:10,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-07-12 12:10,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-07-12 12:10,os-odl_l2-nofeature-noha,fuel,26/39,67.0
+2017-07-12 12:10,os-odl_l2-bgpvpn-ha,fuel,41/42,98.0
+2017-07-12 12:10,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-07-12 12:10,os-nosdn-kvm_ovs_dpdk-noha,fuel,34/36,94.0
+2017-07-12 12:10,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-07-12 12:10,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-07-12 12:10,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-07-12 12:10,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-07-12 12:10,os-nosdn-lxd-noha,joid,14/21,67.0
+2017-07-12 12:10,os-nosdn-nofeature-noha,joid,20/30,67.0
+2017-07-12 12:10,os-odl_l2-nofeature-ha,joid,6/33,18.0
+2017-07-12 12:10,os-nosdn-nofeature-ha,joid,30/30,100.0
+2017-07-12 12:10,os-nosdn-lxd-ha,joid,10/21,48.0
+2017-07-13 01:45,os-nosdn-kvm-noha,apex,10/30,33.0
+2017-07-13 01:45,os-nosdn-fdio-noha,apex,26/27,96.0
+2017-07-13 01:45,os-odl-gluon-noha,apex,20/33,61.0
+2017-07-13 01:45,os-odl_l3-fdio_dvr-noha,apex,10/30,33.0
+2017-07-13 01:45,os-nosdn-ovs-noha,apex,4/30,13.0
+2017-07-13 01:45,os-odl_l3-nofeature-noha,apex,16/30,53.0
+2017-07-13 01:45,os-nosdn-fdio-ha,apex,25/27,93.0
+2017-07-13 01:45,os-odl_l2-fdio-noha,apex,24/33,73.0
+2017-07-13 01:45,os-ovn-nofeature-noha,apex,9/30,30.0
+2017-07-13 01:45,os-odl_l3-fdio-noha,apex,20/30,67.0
+2017-07-13 01:45,os-odl_l3-nofeature-ha,apex,16/30,53.0
+2017-07-13 01:45,os-odl_l2-fdio-ha,apex,25/33,76.0
+2017-07-13 01:45,os-nosdn-nofeature-noha,apex,20/30,67.0
+2017-07-13 01:45,os-odl_l3-fdio-ha,apex,18/30,60.0
+2017-07-13 01:45,os-odl-bgpvpn-ha,apex,18/33,55.0
+2017-07-13 01:45,os-odl_l3-ovs-ha,apex,4/30,13.0
+2017-07-13 01:45,os-nosdn-ovs-ha,apex,4/30,13.0
+2017-07-13 01:45,os-odl_l3-ovs-noha,apex,6/30,20.0
+2017-07-13 01:45,os-nosdn-kvm-ha,apex,20/30,67.0
+2017-07-13 01:45,os-nosdn-nofeature-ha,apex,20/30,67.0
+2017-07-13 01:45,os-odl_l2-nofeature-ha,compass,29/33,88.0
+2017-07-13 01:45,os-onos-nofeature-ha,compass,28/33,85.0
+2017-07-13 01:45,os-nosdn-nofeature-ha,compass,29/30,97.0
+2017-07-13 01:45,os-odl_l3-nofeature-ha,compass,23/30,77.0
+2017-07-13 01:45,os-onos-sfc-ha,compass,20/36,56.0
+2017-07-13 01:45,os-nosdn-kvm-noha,fuel,36/36,100.0
+2017-07-13 01:45,os-nosdn-kvm_ovs_dpdk_bar-ha,fuel,42/42,100.0
+2017-07-13 01:45,os-nosdn-ovs-ha,fuel,39/39,100.0
+2017-07-13 01:45,os-nosdn-kvm_ovs_dpdk_bar-noha,fuel,36/39,92.0
+2017-07-13 01:45,os-nosdn-ovs-noha,fuel,36/36,100.0
+2017-07-13 01:45,os-nosdn-kvm_ovs_dpdk-ha,fuel,39/39,100.0
+2017-07-13 01:45,os-odl_l2-sfc-noha,fuel,35/42,83.0
+2017-07-13 01:45,os-odl_l3-nofeature-ha,fuel,36/39,92.0
+2017-07-13 01:45,os-nosdn-kvm-ha,fuel,39/39,100.0
+2017-07-13 01:45,os-nosdn-nofeature-noha,fuel,36/36,100.0
+2017-07-13 01:45,os-odl_l2-nofeature-noha,fuel,39/39,100.0
+2017-07-13 01:45,os-odl_l2-bgpvpn-ha,fuel,41/42,98.0
+2017-07-13 01:45,os-odl_l3-nofeature-noha,fuel,36/36,100.0
+2017-07-13 01:45,os-nosdn-kvm_ovs_dpdk-noha,fuel,35/36,97.0
+2017-07-13 01:45,os-odl_l2-bgpvpn-noha,fuel,41/42,98.0
+2017-07-13 01:45,os-odl_l2-sfc-ha,fuel,45/45,100.0
+2017-07-13 01:45,os-odl_l2-nofeature-ha,fuel,42/42,100.0
+2017-07-13 01:45,os-nosdn-nofeature-ha,fuel,39/39,100.0
+2017-07-13 01:45,os-nosdn-lxd-noha,joid,15/21,71.0
+2017-07-13 01:45,os-nosdn-nofeature-noha,joid,10/30,33.0
+2017-07-13 01:45,os-odl_l2-nofeature-ha,joid,6/33,18.0
+2017-07-13 01:45,os-nosdn-nofeature-ha,joid,30/30,100.0
+2017-07-13 01:45,os-nosdn-lxd-ha,joid,10/21,48.0
diff --git a/docs/results/danube/3.0/validated_scenario_history.txt b/docs/results/danube/3.0/validated_scenario_history.txt
new file mode 100644
index 000000000..92d676776
--- /dev/null
+++ b/docs/results/danube/3.0/validated_scenario_history.txt
@@ -0,0 +1,745 @@
+2017-03-19 02:03;compass;os-nosdn-nofeature-ha
+2017-03-20 02:04;compass;os-nosdn-nofeature-ha
+2017-03-21 02:03;compass;os-nosdn-nofeature-ha
+2017-03-22 02:01;apex;os-nosdn-nofeature-ha
+2017-03-23 02:14;joid;os-nosdn-nofeature-noha
+2017-03-24 02:09;fuel;os-nosdn-nofeature-noha
+2017-03-24 02:11;fuel;os-nosdn-ovs-ha
+2017-03-25 02:06;fuel;os-nosdn-ovs-noha
+2017-03-25 02:09;fuel;os-nosdn-nofeature-noha
+2017-03-25 02:11;fuel;os-nosdn-ovs-ha
+2017-03-26 02:06;fuel;os-nosdn-ovs-noha
+2017-03-26 02:09;fuel;os-nosdn-nofeature-noha
+2017-03-26 02:11;fuel;os-nosdn-ovs-ha
+2017-03-27 02:06;fuel;os-nosdn-ovs-noha
+2017-03-27 02:09;fuel;os-nosdn-nofeature-noha
+2017-03-27 02:11;fuel;os-nosdn-ovs-ha
+2017-03-28 02:04;compass;os-nosdn-openo-ha
+2017-03-28 02:04;compass;os-nosdn-nofeature-ha
+2017-03-28 02:04;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-03-28 02:05;fuel;os-nosdn-kvm-noha
+2017-03-28 02:06;fuel;os-nosdn-ovs-noha
+2017-03-28 02:09;fuel;os-nosdn-nofeature-noha
+2017-03-28 13:40;compass;os-nosdn-openo-ha
+2017-03-28 13:41;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-03-28 13:42;fuel;os-nosdn-kvm-noha
+2017-03-28 13:42;fuel;os-nosdn-ovs-noha
+2017-03-28 13:45;fuel;os-nosdn-nofeature-noha
+2017-03-28 13:48;fuel;os-odl_l2-nofeature-ha
+2017-03-28 14:15;compass;os-nosdn-openo-ha
+2017-03-28 14:16;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-03-28 14:17;fuel;os-nosdn-kvm-noha
+2017-03-28 14:18;fuel;os-nosdn-ovs-noha
+2017-03-28 14:21;fuel;os-nosdn-nofeature-noha
+2017-03-28 14:23;fuel;os-odl_l2-nofeature-ha
+2017-03-28 16:33;apex;os-nosdn-nofeature-ha
+2017-03-28 16:36;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-03-28 16:37;fuel;os-nosdn-kvm-noha
+2017-03-28 16:38;fuel;os-nosdn-ovs-noha
+2017-03-28 16:41;fuel;os-nosdn-nofeature-noha
+2017-03-28 16:43;fuel;os-odl_l2-nofeature-ha
+2017-03-29 02:02;apex;os-nosdn-nofeature-ha
+2017-03-29 02:05;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-03-29 02:05;fuel;os-nosdn-kvm-noha
+2017-03-29 02:06;fuel;os-nosdn-ovs-noha
+2017-03-29 02:06;fuel;os-nosdn-nofeature-noha
+2017-03-29 02:11;fuel;os-odl_l2-nofeature-ha
+2017-03-30 02:02;apex;os-nosdn-nofeature-ha
+2017-03-30 02:05;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-03-30 02:06;fuel;os-nosdn-kvm-noha
+2017-03-30 02:06;fuel;os-nosdn-ovs-noha
+2017-03-30 02:07;fuel;os-nosdn-nofeature-noha
+2017-03-30 02:11;fuel;os-odl_l2-nofeature-ha
+2017-03-31 02:04;apex;os-nosdn-nofeature-ha
+2017-03-31 02:07;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-03-31 02:08;fuel;os-nosdn-kvm-noha
+2017-03-31 02:09;fuel;os-nosdn-ovs-noha
+2017-03-31 02:11;fuel;os-nosdn-nofeature-noha
+2017-03-31 02:13;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-03-31 02:14;fuel;os-odl_l2-nofeature-ha
+2017-04-01 02:04;apex;os-nosdn-nofeature-ha
+2017-04-01 02:07;compass;os-nosdn-nofeature-ha
+2017-04-01 02:07;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-01 02:08;fuel;os-nosdn-kvm-noha
+2017-04-01 02:09;fuel;os-nosdn-ovs-noha
+2017-04-01 02:11;fuel;os-nosdn-nofeature-noha
+2017-04-01 02:13;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-01 02:15;fuel;os-nosdn-ovs-ha
+2017-04-02 02:04;apex;os-nosdn-nofeature-ha
+2017-04-02 02:07;compass;os-nosdn-nofeature-ha
+2017-04-02 02:07;fuel;os-nosdn-kvm-noha
+2017-04-02 02:08;fuel;os-nosdn-ovs-ha
+2017-04-02 02:09;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-02 02:09;fuel;os-nosdn-ovs-noha
+2017-04-02 02:11;fuel;os-nosdn-nofeature-noha
+2017-04-02 02:13;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-03 02:04;apex;os-nosdn-kvm-ha
+2017-04-03 02:04;apex;os-nosdn-nofeature-ha
+2017-04-03 02:07;compass;os-nosdn-nofeature-ha
+2017-04-03 02:07;fuel;os-nosdn-kvm-noha
+2017-04-03 02:08;fuel;os-nosdn-ovs-ha
+2017-04-03 02:09;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-03 02:09;fuel;os-nosdn-ovs-noha
+2017-04-03 02:12;fuel;os-nosdn-nofeature-noha
+2017-04-03 02:14;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-04 02:02;apex;os-nosdn-kvm-ha
+2017-04-04 02:05;apex;os-nosdn-nofeature-ha
+2017-04-04 02:07;compass;os-nosdn-nofeature-ha
+2017-04-04 02:09;fuel;os-nosdn-ovs-ha
+2017-04-04 02:09;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-04 02:10;fuel;os-nosdn-ovs-noha
+2017-04-04 02:14;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-05 02:00;apex;os-nosdn-kvm-ha
+2017-04-05 02:03;apex;os-nosdn-nofeature-ha
+2017-04-05 02:06;compass;os-nosdn-nofeature-ha
+2017-04-05 02:07;fuel;os-nosdn-ovs-ha
+2017-04-05 02:08;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-05 02:08;fuel;os-nosdn-ovs-noha
+2017-04-05 02:13;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-06 02:07;compass;os-nosdn-nofeature-ha
+2017-04-06 02:08;fuel;os-nosdn-ovs-ha
+2017-04-06 02:09;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-06 02:09;fuel;os-nosdn-ovs-noha
+2017-04-06 02:14;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-07 02:08;fuel;os-nosdn-ovs-ha
+2017-04-07 02:09;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-07 02:09;fuel;os-nosdn-ovs-noha
+2017-04-07 02:14;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-08 02:08;fuel;os-nosdn-ovs-ha
+2017-04-08 02:09;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-08 02:09;fuel;os-nosdn-ovs-noha
+2017-04-08 02:14;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-09 02:07;fuel;os-nosdn-kvm-noha
+2017-04-09 02:08;fuel;os-nosdn-ovs-ha
+2017-04-09 02:08;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-09 02:09;fuel;os-nosdn-ovs-noha
+2017-04-09 02:14;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-10 02:07;fuel;os-nosdn-kvm-noha
+2017-04-10 02:08;fuel;os-nosdn-ovs-ha
+2017-04-10 02:08;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-10 02:09;fuel;os-nosdn-ovs-noha
+2017-04-10 02:11;fuel;os-nosdn-nofeature-noha
+2017-04-10 02:13;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-11 02:06;compass;os-nosdn-nofeature-ha
+2017-04-11 02:06;fuel;os-nosdn-kvm-noha
+2017-04-11 02:07;fuel;os-nosdn-ovs-ha
+2017-04-11 02:08;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-11 02:08;fuel;os-nosdn-ovs-noha
+2017-04-11 02:11;fuel;os-nosdn-nofeature-noha
+2017-04-11 02:13;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-11 02:15;fuel;os-nosdn-nofeature-ha
+2017-04-12 02:07;fuel;os-nosdn-ovs-ha
+2017-04-12 02:07;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-12 02:08;fuel;os-nosdn-ovs-noha
+2017-04-12 02:11;fuel;os-nosdn-nofeature-noha
+2017-04-12 02:13;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-12 02:14;fuel;os-nosdn-nofeature-ha
+2017-04-28 20:46;compass;os-nosdn-openo-ha
+2017-04-28 20:48;fuel;os-nosdn-kvm-noha
+2017-04-28 20:49;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-28 20:49;fuel;os-nosdn-ovs-noha
+2017-04-28 20:52;fuel;os-nosdn-kvm-ha
+2017-04-28 20:54;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-28 20:55;fuel;os-nosdn-ovs-ha
+2017-04-28 20:56;fuel;os-nosdn-nofeature-noha
+2017-04-29 02:07;compass;os-nosdn-openo-ha
+2017-04-29 02:08;fuel;os-nosdn-kvm-noha
+2017-04-29 02:09;fuel;os-nosdn-ovs-ha
+2017-04-29 02:10;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-29 02:10;fuel;os-nosdn-ovs-noha
+2017-04-29 02:12;fuel;os-nosdn-kvm-ha
+2017-04-29 02:13;fuel;os-nosdn-nofeature-noha
+2017-04-29 02:15;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-30 02:07;compass;os-nosdn-openo-ha
+2017-04-30 02:08;fuel;os-nosdn-kvm-noha
+2017-04-30 02:09;fuel;os-nosdn-ovs-ha
+2017-04-30 02:10;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-04-30 02:10;fuel;os-nosdn-ovs-noha
+2017-04-30 02:13;fuel;os-nosdn-nofeature-noha
+2017-04-30 02:15;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-04-30 02:17;fuel;os-nosdn-nofeature-ha
+2017-04-30 02:18;joid;os-nosdn-nofeature-noha
+2017-05-01 02:09;compass;os-nosdn-openo-ha
+2017-05-01 02:10;fuel;os-nosdn-kvm-noha
+2017-05-01 02:10;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-01 02:11;fuel;os-nosdn-ovs-ha
+2017-05-01 02:11;fuel;os-nosdn-ovs-noha
+2017-05-01 02:16;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-01 02:18;fuel;os-nosdn-nofeature-noha
+2017-05-01 02:18;fuel;os-nosdn-nofeature-ha
+2017-05-01 02:21;joid;os-nosdn-nofeature-noha
+2017-05-02 02:10;fuel;os-nosdn-kvm-noha
+2017-05-02 02:11;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-02 02:11;fuel;os-nosdn-ovs-ha
+2017-05-02 02:12;fuel;os-nosdn-ovs-noha
+2017-05-02 02:14;fuel;os-nosdn-kvm-ha
+2017-05-02 02:14;fuel;os-odl_l3-nofeature-noha
+2017-05-02 02:16;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-02 02:17;fuel;os-odl_l2-bgpvpn-noha
+2017-05-02 02:18;fuel;os-nosdn-nofeature-noha
+2017-05-02 02:19;joid;os-nosdn-nofeature-noha
+2017-05-03 02:09;compass;os-nosdn-nofeature-ha
+2017-05-03 02:10;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-03 02:11;fuel;os-nosdn-kvm-noha
+2017-05-03 02:11;fuel;os-nosdn-ovs-noha
+2017-05-03 02:13;fuel;os-nosdn-kvm-ha
+2017-05-03 02:14;fuel;os-odl_l3-nofeature-noha
+2017-05-03 02:15;fuel;os-odl_l2-sfc-ha
+2017-05-03 02:16;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-03 02:16;fuel;os-odl_l2-bgpvpn-noha
+2017-05-03 02:17;fuel;os-nosdn-nofeature-noha
+2017-05-03 02:18;fuel;os-nosdn-ovs-ha
+2017-05-03 02:19;joid;os-nosdn-nofeature-noha
+2017-05-04 02:10;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-04 02:11;fuel;os-nosdn-ovs-ha
+2017-05-04 02:11;fuel;os-nosdn-ovs-noha
+2017-05-04 02:13;fuel;os-nosdn-kvm-ha
+2017-05-04 02:14;fuel;os-odl_l3-nofeature-noha
+2017-05-04 02:15;fuel;os-odl_l2-sfc-ha
+2017-05-04 02:16;fuel;os-odl_l2-bgpvpn-noha
+2017-05-04 02:17;fuel;os-nosdn-nofeature-noha
+2017-05-04 02:18;fuel;os-nosdn-kvm-noha
+2017-05-04 02:19;joid;os-nosdn-nofeature-noha
+2017-05-05 02:10;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-05 02:11;fuel;os-nosdn-kvm-noha
+2017-05-05 02:11;fuel;os-nosdn-ovs-noha
+2017-05-05 02:12;fuel;os-odl_l3-nofeature-noha
+2017-05-05 02:14;fuel;os-nosdn-kvm-ha
+2017-05-05 02:14;fuel;os-nosdn-nofeature-noha
+2017-05-05 02:16;fuel;os-odl_l2-sfc-ha
+2017-05-05 02:17;fuel;os-odl_l2-bgpvpn-noha
+2017-05-05 02:18;fuel;os-nosdn-nofeature-ha
+2017-05-05 02:18;fuel;os-nosdn-ovs-ha
+2017-05-06 02:09;compass;os-nosdn-nofeature-ha
+2017-05-06 02:10;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-06 02:11;fuel;os-nosdn-kvm-noha
+2017-05-06 02:11;fuel;os-nosdn-ovs-noha
+2017-05-06 02:12;fuel;os-odl_l3-nofeature-noha
+2017-05-06 02:13;fuel;os-odl_l2-bgpvpn-noha
+2017-05-06 02:14;fuel;os-nosdn-kvm-ha
+2017-05-06 02:15;fuel;os-nosdn-nofeature-noha
+2017-05-06 02:16;fuel;os-odl_l2-sfc-ha
+2017-05-06 02:18;fuel;os-nosdn-ovs-ha
+2017-05-06 02:18;fuel;os-nosdn-nofeature-ha
+2017-05-07 02:09;compass;os-nosdn-nofeature-ha
+2017-05-07 02:09;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-07 02:10;fuel;os-nosdn-kvm-noha
+2017-05-07 02:11;fuel;os-nosdn-ovs-noha
+2017-05-07 02:11;fuel;os-odl_l3-nofeature-noha
+2017-05-07 02:13;fuel;os-nosdn-kvm-ha
+2017-05-07 02:14;fuel;os-nosdn-nofeature-noha
+2017-05-07 02:15;fuel;os-odl_l2-sfc-ha
+2017-05-07 02:16;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-07 02:16;fuel;os-odl_l2-bgpvpn-noha
+2017-05-07 02:17;fuel;os-odl_l2-nofeature-ha
+2017-05-07 02:17;fuel;os-nosdn-nofeature-ha
+2017-05-07 02:18;fuel;os-nosdn-ovs-ha
+2017-05-08 02:09;compass;os-nosdn-nofeature-ha
+2017-05-08 02:09;fuel;os-nosdn-kvm-noha
+2017-05-08 02:10;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-08 02:10;fuel;os-nosdn-ovs-noha
+2017-05-08 02:11;fuel;os-odl_l3-nofeature-noha
+2017-05-08 02:13;fuel;os-nosdn-kvm-ha
+2017-05-08 02:14;fuel;os-nosdn-nofeature-noha
+2017-05-08 02:14;fuel;os-odl_l2-nofeature-noha
+2017-05-08 02:16;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-08 02:16;fuel;os-odl_l2-bgpvpn-noha
+2017-05-08 02:17;fuel;os-odl_l2-sfc-ha
+2017-05-08 02:17;fuel;os-nosdn-ovs-ha
+2017-05-08 02:18;fuel;os-nosdn-nofeature-ha
+2017-05-09 02:09;compass;os-nosdn-nofeature-ha
+2017-05-09 02:09;fuel;os-nosdn-kvm-noha
+2017-05-09 02:10;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-09 02:11;fuel;os-nosdn-ovs-noha
+2017-05-09 02:12;fuel;os-odl_l2-sfc-ha
+2017-05-09 02:13;fuel;os-nosdn-kvm-ha
+2017-05-09 02:14;fuel;os-odl_l3-nofeature-noha
+2017-05-09 02:14;fuel;os-odl_l2-nofeature-noha
+2017-05-09 02:16;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-09 02:16;fuel;os-odl_l2-bgpvpn-noha
+2017-05-09 02:17;fuel;os-nosdn-ovs-ha
+2017-05-09 02:17;fuel;os-nosdn-nofeature-noha
+2017-05-09 02:18;fuel;os-nosdn-nofeature-ha
+2017-05-10 02:07;compass;os-nosdn-nofeature-ha
+2017-05-10 02:08;fuel;os-nosdn-kvm-noha
+2017-05-10 02:08;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-05-10 02:09;fuel;os-nosdn-ovs-ha
+2017-05-10 02:09;fuel;os-nosdn-ovs-noha
+2017-05-10 02:10;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-10 02:12;fuel;os-nosdn-kvm-ha
+2017-05-10 02:12;fuel;os-nosdn-nofeature-noha
+2017-05-10 02:13;fuel;os-odl_l2-nofeature-noha
+2017-05-10 02:14;fuel;os-odl_l2-sfc-ha
+2017-05-10 02:14;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-10 02:15;fuel;os-odl_l2-bgpvpn-noha
+2017-05-10 02:16;fuel;os-odl_l3-nofeature-noha
+2017-05-10 02:16;fuel;os-nosdn-nofeature-ha
+2017-05-11 02:06;compass;os-nosdn-nofeature-ha
+2017-05-11 02:07;fuel;os-nosdn-kvm-noha
+2017-05-11 02:07;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-11 02:08;fuel;os-nosdn-ovs-ha
+2017-05-11 02:08;fuel;os-nosdn-ovs-noha
+2017-05-11 02:09;fuel;os-odl_l3-nofeature-noha
+2017-05-11 02:11;fuel;os-nosdn-kvm-ha
+2017-05-11 02:11;fuel;os-nosdn-nofeature-noha
+2017-05-11 02:12;fuel;os-odl_l2-nofeature-noha
+2017-05-11 02:13;fuel;os-odl_l2-sfc-ha
+2017-05-11 02:13;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-11 02:14;fuel;os-odl_l2-bgpvpn-noha
+2017-05-11 02:15;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-05-11 02:16;fuel;os-nosdn-nofeature-ha
+2017-05-12 02:06;compass;os-nosdn-nofeature-ha
+2017-05-12 02:07;fuel;os-nosdn-kvm-noha
+2017-05-12 02:07;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-12 02:08;fuel;os-nosdn-ovs-noha
+2017-05-12 02:08;fuel;os-odl_l3-nofeature-noha
+2017-05-12 02:10;fuel;os-odl_l2-sfc-ha
+2017-05-12 02:10;fuel;os-nosdn-kvm-ha
+2017-05-12 02:11;fuel;os-nosdn-nofeature-noha
+2017-05-12 02:12;fuel;os-odl_l2-nofeature-noha
+2017-05-12 02:13;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-12 02:14;fuel;os-odl_l2-bgpvpn-noha
+2017-05-12 02:14;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-05-12 02:15;fuel;os-nosdn-ovs-ha
+2017-05-12 02:15;fuel;os-nosdn-nofeature-ha
+2017-05-13 02:05;compass;os-nosdn-nofeature-ha
+2017-05-13 02:06;fuel;os-nosdn-kvm-noha
+2017-05-13 02:06;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-05-13 02:07;fuel;os-nosdn-ovs-noha
+2017-05-13 02:07;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-13 02:09;fuel;os-nosdn-kvm-ha
+2017-05-13 02:10;fuel;os-nosdn-nofeature-noha
+2017-05-13 02:11;fuel;os-odl_l2-nofeature-noha
+2017-05-13 02:12;fuel;os-odl_l2-sfc-ha
+2017-05-13 02:13;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-13 02:13;fuel;os-odl_l2-bgpvpn-noha
+2017-05-13 02:14;fuel;os-odl_l3-nofeature-noha
+2017-05-13 02:15;fuel;os-nosdn-nofeature-ha
+2017-05-14 02:03;compass;os-nosdn-nofeature-ha
+2017-05-14 02:04;fuel;os-nosdn-kvm-noha
+2017-05-14 02:04;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-14 02:05;fuel;os-nosdn-ovs-noha
+2017-05-14 02:05;fuel;os-odl_l3-nofeature-noha
+2017-05-14 02:07;fuel;os-nosdn-kvm-ha
+2017-05-14 02:08;fuel;os-nosdn-nofeature-noha
+2017-05-14 02:09;fuel;os-odl_l2-nofeature-noha
+2017-05-14 02:10;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-05-14 02:10;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-14 02:11;fuel;os-odl_l2-bgpvpn-noha
+2017-05-14 02:12;fuel;os-odl_l2-sfc-ha
+2017-05-14 02:12;fuel;os-nosdn-nofeature-ha
+2017-05-15 01:56;compass;os-nosdn-nofeature-ha
+2017-05-15 01:57;fuel;os-nosdn-kvm-noha
+2017-05-15 01:57;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-15 01:58;fuel;os-nosdn-ovs-noha
+2017-05-15 02:00;fuel;os-odl_l2-sfc-ha
+2017-05-15 02:01;fuel;os-nosdn-nofeature-noha
+2017-05-15 02:02;fuel;os-odl_l2-nofeature-noha
+2017-05-15 02:03;fuel;os-odl_l3-nofeature-noha
+2017-05-15 02:03;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-15 02:04;fuel;os-odl_l2-bgpvpn-noha
+2017-05-16 01:52;fuel;os-nosdn-kvm-noha
+2017-05-16 01:54;fuel;os-nosdn-ovs-noha
+2017-05-16 02:00;fuel;os-odl_l2-bgpvpn-noha
+2017-05-25 02:04;fuel;os-odl_l2-nofeature-ha
+2017-05-26 02:00;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-26 02:00;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-05-26 02:03;fuel;os-nosdn-kvm-noha
+2017-05-26 02:04;fuel;os-odl_l2-nofeature-ha
+2017-05-26 02:04;fuel;os-nosdn-nofeature-noha
+2017-05-26 02:05;fuel;os-odl_l2-nofeature-noha
+2017-05-26 02:06;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-27 01:59;compass;os-nosdn-nofeature-ha
+2017-05-27 02:00;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-27 02:00;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-05-27 02:01;fuel;os-odl_l3-nofeature-noha
+2017-05-27 02:02;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-05-27 02:03;fuel;os-nosdn-kvm-noha
+2017-05-27 02:04;fuel;os-nosdn-nofeature-noha
+2017-05-27 02:05;fuel;os-odl_l2-nofeature-noha
+2017-05-27 02:06;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-27 02:08;fuel;os-nosdn-kvm-ha
+2017-05-28 02:00;fuel;os-nosdn-kvm-noha
+2017-05-28 02:00;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-28 02:01;fuel;os-nosdn-ovs-noha
+2017-05-28 02:01;fuel;os-odl_l3-nofeature-noha
+2017-05-28 02:02;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-05-28 02:03;fuel;os-nosdn-kvm-ha
+2017-05-28 02:04;fuel;os-nosdn-nofeature-noha
+2017-05-28 02:06;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-05-28 02:06;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-28 02:08;fuel;os-nosdn-nofeature-ha
+2017-05-29 02:00;fuel;os-nosdn-kvm-noha
+2017-05-29 02:01;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-05-29 02:02;fuel;os-nosdn-ovs-noha
+2017-05-29 02:02;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-29 02:03;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-05-29 02:04;fuel;os-nosdn-kvm-ha
+2017-05-29 02:05;fuel;os-nosdn-nofeature-noha
+2017-05-29 02:07;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-29 02:08;fuel;os-odl_l2-nofeature-ha
+2017-05-29 02:08;fuel;os-odl_l3-nofeature-noha
+2017-05-29 02:09;fuel;os-nosdn-nofeature-ha
+2017-05-30 02:02;fuel;os-nosdn-kvm-noha
+2017-05-30 02:03;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-30 02:03;fuel;os-nosdn-ovs-noha
+2017-05-30 02:04;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-05-30 02:04;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-05-30 02:06;fuel;os-nosdn-kvm-ha
+2017-05-30 02:07;fuel;os-nosdn-nofeature-noha
+2017-05-30 02:09;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-30 02:10;fuel;os-nosdn-ovs-ha
+2017-05-30 02:10;fuel;os-odl_l2-nofeature-ha
+2017-05-30 02:11;fuel;os-odl_l3-nofeature-noha
+2017-05-30 02:11;fuel;os-nosdn-nofeature-ha
+2017-05-31 02:03;fuel;os-nosdn-kvm-noha
+2017-05-31 02:04;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-05-31 02:04;fuel;os-nosdn-ovs-noha
+2017-05-31 02:05;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-05-31 02:05;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-05-31 02:07;fuel;os-nosdn-kvm-ha
+2017-05-31 02:08;fuel;os-nosdn-nofeature-noha
+2017-05-31 02:10;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-05-31 02:11;fuel;os-nosdn-ovs-ha
+2017-05-31 02:11;fuel;os-odl_l2-nofeature-ha
+2017-05-31 02:12;fuel;os-nosdn-nofeature-ha
+2017-06-01 02:04;fuel;os-nosdn-kvm-noha
+2017-06-01 02:05;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-01 02:05;fuel;os-nosdn-ovs-noha
+2017-06-01 02:06;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-01 02:06;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-01 02:08;fuel;os-nosdn-kvm-ha
+2017-06-01 02:09;fuel;os-nosdn-nofeature-noha
+2017-06-01 02:10;fuel;os-odl_l2-sfc-ha
+2017-06-01 02:11;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-06-01 02:11;fuel;os-nosdn-ovs-ha
+2017-06-01 02:12;fuel;os-odl_l2-nofeature-ha
+2017-06-01 02:13;fuel;os-nosdn-nofeature-ha
+2017-06-02 02:04;fuel;os-nosdn-kvm-noha
+2017-06-02 02:05;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-02 02:05;fuel;os-nosdn-ovs-noha
+2017-06-02 02:06;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-02 02:08;fuel;os-nosdn-kvm-ha
+2017-06-02 02:09;fuel;os-nosdn-nofeature-noha
+2017-06-02 02:10;fuel;os-odl_l2-sfc-ha
+2017-06-02 02:11;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-06-02 02:11;fuel;os-nosdn-ovs-ha
+2017-06-02 02:12;fuel;os-odl_l2-nofeature-ha
+2017-06-03 02:06;fuel;os-nosdn-kvm-noha
+2017-06-03 02:06;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-03 02:07;fuel;os-nosdn-ovs-noha
+2017-06-03 02:07;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-03 02:10;fuel;os-nosdn-kvm-ha
+2017-06-03 02:10;fuel;os-nosdn-nofeature-noha
+2017-06-03 02:12;fuel;os-odl_l2-sfc-ha
+2017-06-03 02:12;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-06-03 02:13;fuel;os-nosdn-ovs-ha
+2017-06-03 02:13;fuel;os-odl_l2-nofeature-ha
+2017-06-04 02:10;fuel;os-nosdn-kvm-noha
+2017-06-04 02:11;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-04 02:11;fuel;os-nosdn-ovs-ha
+2017-06-04 02:12;fuel;os-nosdn-ovs-noha
+2017-06-04 02:14;fuel;os-nosdn-kvm-ha
+2017-06-04 02:14;fuel;os-nosdn-nofeature-noha
+2017-06-04 02:16;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-04 02:16;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-06-04 02:17;fuel;os-odl_l2-sfc-ha
+2017-06-04 02:18;fuel;os-odl_l2-nofeature-ha
+2017-06-04 02:18;fuel;os-odl_l3-nofeature-noha
+2017-06-04 02:19;fuel;os-nosdn-nofeature-ha
+2017-06-05 02:10;compass;os-nosdn-nofeature-ha
+2017-06-05 02:10;fuel;os-nosdn-kvm-noha
+2017-06-05 02:11;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-05 02:12;fuel;os-nosdn-ovs-ha
+2017-06-05 02:12;fuel;os-nosdn-ovs-noha
+2017-06-05 02:13;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-05 02:15;fuel;os-nosdn-kvm-ha
+2017-06-05 02:16;fuel;os-nosdn-nofeature-noha
+2017-06-05 02:19;fuel;os-odl_l2-nofeature-ha
+2017-06-05 02:19;fuel;os-nosdn-nofeature-ha
+2017-06-06 02:10;compass;os-nosdn-nofeature-ha
+2017-06-06 02:11;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-06 02:12;fuel;os-nosdn-kvm-noha
+2017-06-06 02:12;fuel;os-nosdn-ovs-noha
+2017-06-06 02:15;fuel;os-nosdn-kvm-ha
+2017-06-06 02:15;fuel;os-nosdn-nofeature-noha
+2017-06-06 02:18;fuel;os-nosdn-ovs-ha
+2017-06-06 02:19;fuel;os-nosdn-nofeature-ha
+2017-06-07 02:10;compass;os-nosdn-nofeature-ha
+2017-06-07 02:11;fuel;os-nosdn-kvm-noha
+2017-06-07 02:11;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-07 02:12;fuel;os-nosdn-ovs-ha
+2017-06-07 02:12;fuel;os-nosdn-ovs-noha
+2017-06-07 02:13;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-07 02:15;fuel;os-nosdn-kvm-ha
+2017-06-07 02:15;fuel;os-nosdn-nofeature-noha
+2017-06-07 02:20;fuel;os-nosdn-nofeature-ha
+2017-06-08 02:10;compass;os-nosdn-nofeature-ha
+2017-06-08 02:11;fuel;os-nosdn-kvm-noha
+2017-06-08 02:11;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-08 02:12;fuel;os-nosdn-ovs-noha
+2017-06-08 02:13;fuel;os-nosdn-nofeature-noha
+2017-06-08 02:13;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-08 02:15;fuel;os-nosdn-kvm-ha
+2017-06-08 02:19;fuel;os-nosdn-ovs-ha
+2017-06-08 02:19;fuel;os-nosdn-nofeature-ha
+2017-06-09 02:12;compass;os-nosdn-nofeature-ha
+2017-06-09 02:12;fuel;os-nosdn-kvm-noha
+2017-06-09 02:13;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-09 02:14;fuel;os-nosdn-ovs-ha
+2017-06-09 02:14;fuel;os-nosdn-ovs-noha
+2017-06-09 02:15;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-09 02:17;fuel;os-nosdn-kvm-ha
+2017-06-09 02:17;fuel;os-nosdn-nofeature-noha
+2017-06-09 02:18;fuel;os-odl_l3-nofeature-noha
+2017-06-09 02:19;fuel;os-odl_l2-sfc-ha
+2017-06-09 02:19;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-06-09 02:21;fuel;os-nosdn-nofeature-ha
+2017-06-10 02:11;compass;os-nosdn-nofeature-ha
+2017-06-10 02:11;fuel;os-nosdn-kvm-noha
+2017-06-10 02:12;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-10 02:12;fuel;os-nosdn-ovs-ha
+2017-06-10 02:14;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-10 02:15;fuel;os-nosdn-kvm-ha
+2017-06-10 02:16;fuel;os-nosdn-nofeature-noha
+2017-06-10 02:17;fuel;os-odl_l2-sfc-ha
+2017-06-10 02:19;fuel;os-odl_l3-nofeature-noha
+2017-06-10 02:20;fuel;os-nosdn-nofeature-ha
+2017-06-11 02:11;compass;os-nosdn-nofeature-ha
+2017-06-11 02:11;fuel;os-nosdn-kvm-noha
+2017-06-11 02:12;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-11 02:12;fuel;os-nosdn-ovs-ha
+2017-06-11 02:14;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-11 02:15;fuel;os-nosdn-kvm-ha
+2017-06-11 02:16;fuel;os-nosdn-nofeature-noha
+2017-06-11 02:19;fuel;os-odl_l2-nofeature-ha
+2017-06-11 02:19;fuel;os-odl_l3-nofeature-noha
+2017-06-11 02:20;fuel;os-nosdn-nofeature-ha
+2017-06-12 02:11;compass;os-nosdn-nofeature-ha
+2017-06-12 02:11;fuel;os-nosdn-kvm-noha
+2017-06-12 02:12;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-12 02:12;fuel;os-nosdn-ovs-ha
+2017-06-12 02:14;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-12 02:16;fuel;os-nosdn-kvm-ha
+2017-06-12 02:16;fuel;os-nosdn-nofeature-noha
+2017-06-12 02:17;fuel;os-odl_l3-nofeature-noha
+2017-06-12 02:19;fuel;os-odl_l2-bgpvpn-noha
+2017-06-12 02:19;fuel;os-odl_l2-nofeature-ha
+2017-06-13 02:10;fuel;os-nosdn-kvm-noha
+2017-06-13 02:10;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-13 02:11;fuel;os-nosdn-ovs-ha
+2017-06-13 02:12;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-13 02:14;fuel;os-nosdn-kvm-ha
+2017-06-13 02:14;fuel;os-nosdn-nofeature-noha
+2017-06-13 02:17;fuel;os-odl_l2-bgpvpn-noha
+2017-06-13 02:18;fuel;os-odl_l3-nofeature-noha
+2017-06-14 02:05;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-14 02:06;fuel;os-nosdn-ovs-ha
+2017-06-14 02:06;fuel;os-nosdn-ovs-noha
+2017-06-14 02:07;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-14 02:08;fuel;os-odl_l2-sfc-ha
+2017-06-14 02:09;fuel;os-nosdn-kvm-ha
+2017-06-14 02:09;fuel;os-nosdn-nofeature-noha
+2017-06-14 02:12;fuel;os-odl_l2-bgpvpn-noha
+2017-06-14 02:13;fuel;os-odl_l3-nofeature-noha
+2017-06-15 02:04;compass;os-nosdn-nofeature-ha
+2017-06-15 02:06;fuel;os-nosdn-ovs-ha
+2017-06-15 02:06;fuel;os-nosdn-ovs-noha
+2017-06-15 02:07;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-15 02:09;fuel;os-nosdn-kvm-ha
+2017-06-15 02:09;fuel;os-nosdn-nofeature-noha
+2017-06-15 02:12;fuel;os-odl_l2-bgpvpn-noha
+2017-06-15 02:12;fuel;os-odl_l2-sfc-ha
+2017-06-15 02:13;fuel;os-nosdn-nofeature-ha
+2017-06-16 02:02;compass;os-nosdn-nofeature-ha
+2017-06-16 02:03;fuel;os-nosdn-ovs-ha
+2017-06-16 02:04;fuel;os-nosdn-ovs-noha
+2017-06-16 02:05;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-16 02:07;fuel;os-nosdn-nofeature-noha
+2017-06-16 02:08;fuel;os-odl_l2-sfc-ha
+2017-06-16 02:09;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-16 02:09;fuel;os-odl_l2-bgpvpn-noha
+2017-06-16 02:11;fuel;os-nosdn-nofeature-ha
+2017-06-17 02:02;fuel;os-nosdn-ovs-ha
+2017-06-17 02:03;fuel;os-nosdn-ovs-noha
+2017-06-17 02:04;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-17 02:08;fuel;os-odl_l2-sfc-ha
+2017-06-17 02:08;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-17 02:09;fuel;os-odl_l2-bgpvpn-noha
+2017-06-17 02:10;fuel;os-nosdn-nofeature-noha
+2017-06-18 02:02;fuel;os-nosdn-ovs-ha
+2017-06-18 02:03;fuel;os-nosdn-ovs-noha
+2017-06-18 02:04;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-18 02:06;fuel;os-nosdn-nofeature-noha
+2017-06-18 02:07;fuel;os-odl_l2-sfc-ha
+2017-06-18 02:08;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-18 02:09;fuel;os-odl_l2-nofeature-ha
+2017-06-19 02:01;compass;os-nosdn-nofeature-ha
+2017-06-19 02:02;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-19 02:02;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-19 02:03;fuel;os-nosdn-ovs-ha
+2017-06-19 02:03;fuel;os-nosdn-ovs-noha
+2017-06-19 02:04;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-19 02:06;fuel;os-nosdn-nofeature-noha
+2017-06-19 02:08;fuel;os-odl_l2-sfc-ha
+2017-06-19 02:09;fuel;os-odl_l2-nofeature-ha
+2017-06-19 02:10;fuel;os-odl_l3-nofeature-noha
+2017-06-20 02:01;compass;os-nosdn-nofeature-ha
+2017-06-20 02:02;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-20 02:02;fuel;os-nosdn-ovs-ha
+2017-06-20 02:03;fuel;os-nosdn-kvm_ovs_dpdk_bar-noha
+2017-06-20 02:03;fuel;os-nosdn-ovs-noha
+2017-06-20 02:04;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-20 02:05;fuel;os-nosdn-kvm-ha
+2017-06-20 02:06;fuel;os-nosdn-nofeature-noha
+2017-06-20 02:07;fuel;os-odl_l2-sfc-ha
+2017-06-20 02:08;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-20 02:09;fuel;os-odl_l2-nofeature-ha
+2017-06-20 02:10;fuel;os-odl_l3-nofeature-noha
+2017-06-21 02:01;compass;os-nosdn-nofeature-ha
+2017-06-21 02:02;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-21 02:02;fuel;os-nosdn-ovs-ha
+2017-06-21 02:03;fuel;os-nosdn-ovs-noha
+2017-06-21 02:04;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-21 02:05;fuel;os-nosdn-kvm-ha
+2017-06-21 02:06;fuel;os-nosdn-nofeature-noha
+2017-06-21 02:07;fuel;os-odl_l2-sfc-ha
+2017-06-21 02:08;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-21 02:09;fuel;os-odl_l3-nofeature-noha
+2017-06-21 02:10;fuel;os-nosdn-nofeature-ha
+2017-06-22 02:02;compass;os-nosdn-nofeature-ha
+2017-06-22 02:02;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-22 02:03;fuel;os-nosdn-ovs-noha
+2017-06-22 02:04;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-22 02:06;fuel;os-nosdn-kvm-ha
+2017-06-22 02:08;fuel;os-odl_l2-sfc-ha
+2017-06-22 02:08;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-22 02:09;fuel;os-nosdn-ovs-ha
+2017-06-22 02:10;fuel;os-nosdn-nofeature-noha
+2017-06-22 02:10;fuel;os-nosdn-nofeature-ha
+2017-06-23 02:01;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-23 02:02;fuel;os-nosdn-ovs-noha
+2017-06-23 02:03;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-23 02:05;fuel;os-nosdn-kvm-ha
+2017-06-23 02:05;fuel;os-nosdn-nofeature-noha
+2017-06-23 02:07;fuel;os-odl_l2-sfc-ha
+2017-06-23 02:07;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-23 02:09;fuel;os-nosdn-nofeature-ha
+2017-06-24 02:00;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-24 02:01;fuel;os-nosdn-ovs-noha
+2017-06-24 02:01;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-24 02:03;fuel;os-nosdn-kvm-ha
+2017-06-25 02:04;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-25 02:05;fuel;os-nosdn-ovs-noha
+2017-06-25 02:06;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-25 02:07;fuel;os-nosdn-kvm-ha
+2017-06-25 02:08;fuel;os-odl_l2-nofeature-noha
+2017-06-25 02:10;fuel;os-nosdn-kvm_ovs_dpdk-noha
+2017-06-25 02:11;fuel;os-odl_l2-nofeature-ha
+2017-06-25 02:11;fuel;os-odl_l3-nofeature-noha
+2017-06-26 02:02;compass;os-nosdn-nofeature-ha
+2017-06-26 02:03;fuel;os-nosdn-kvm-noha
+2017-06-26 02:04;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-26 02:05;fuel;os-nosdn-ovs-noha
+2017-06-26 02:06;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-06-26 02:10;fuel;os-odl_l2-nofeature-ha
+2017-06-26 02:11;fuel;os-odl_l3-nofeature-noha
+2017-06-26 02:11;fuel;os-nosdn-nofeature-ha
+2017-06-26 12:31;apex;os-nosdn-kvm-noha
+2017-06-27 07:13;compass;os-nosdn-nofeature-ha
+2017-06-27 07:13;fuel;os-nosdn-kvm-noha
+2017-06-27 07:14;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-27 07:15;fuel;os-nosdn-ovs-noha
+2017-06-27 07:18;fuel;os-nosdn-kvm-ha
+2017-06-27 07:18;fuel;os-odl_l3-nofeature-noha
+2017-06-27 07:21;fuel;os-odl_l2-nofeature-ha
+2017-06-27 07:59;apex;os-nosdn-nofeature-noha
+2017-06-27 08:05;compass;os-nosdn-nofeature-ha
+2017-06-27 08:05;fuel;os-nosdn-kvm-noha
+2017-06-27 08:06;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-27 08:07;fuel;os-nosdn-ovs-noha
+2017-06-27 08:09;fuel;os-nosdn-kvm-ha
+2017-06-27 08:10;fuel;os-odl_l3-nofeature-noha
+2017-06-27 08:13;fuel;os-odl_l2-nofeature-ha
+2017-06-27 08:31;apex;os-nosdn-nofeature-noha
+2017-06-27 08:38;compass;os-nosdn-nofeature-ha
+2017-06-27 08:39;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-06-27 08:40;fuel;os-nosdn-kvm-noha
+2017-06-27 08:40;fuel;os-nosdn-ovs-noha
+2017-06-27 08:44;fuel;os-nosdn-kvm-ha
+2017-06-27 08:45;fuel;os-odl_l3-nofeature-noha
+2017-06-27 08:47;fuel;os-odl_l2-nofeature-ha
+2017-07-07 15:15;fuel;os-nosdn-kvm-noha
+2017-07-07 15:16;fuel;os-nosdn-ovs-noha
+2017-07-07 15:19;fuel;os-nosdn-kvm-ha
+2017-07-07 15:23;fuel;os-odl_l2-nofeature-ha
+2017-07-07 15:25;fuel;os-nosdn-ovs-ha
+2017-07-07 15:26;fuel;os-nosdn-nofeature-noha
+2017-07-07 15:26;fuel;os-nosdn-nofeature-ha
+2017-07-08 01:59;apex;os-nosdn-nofeature-ha
+2017-07-08 02:03;fuel;os-nosdn-kvm-noha
+2017-07-08 02:04;fuel;os-nosdn-ovs-ha
+2017-07-08 02:05;fuel;os-nosdn-ovs-noha
+2017-07-08 02:08;fuel;os-nosdn-kvm-ha
+2017-07-08 02:08;fuel;os-nosdn-nofeature-noha
+2017-07-08 02:12;fuel;os-odl_l2-nofeature-ha
+2017-07-08 02:13;fuel;os-nosdn-nofeature-ha
+2017-07-09 02:01;apex;os-nosdn-nofeature-ha
+2017-07-09 02:05;fuel;os-nosdn-kvm-noha
+2017-07-09 02:06;fuel;os-nosdn-ovs-noha
+2017-07-09 02:07;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-07-09 02:09;fuel;os-nosdn-kvm-ha
+2017-07-09 02:09;fuel;os-odl_l2-nofeature-ha
+2017-07-09 02:10;fuel;os-nosdn-nofeature-noha
+2017-07-09 02:13;fuel;os-nosdn-ovs-ha
+2017-07-09 02:14;fuel;os-odl_l3-nofeature-noha
+2017-07-09 02:14;fuel;os-nosdn-nofeature-ha
+2017-07-10 02:01;apex;os-nosdn-nofeature-ha
+2017-07-10 02:04;fuel;os-nosdn-kvm-noha
+2017-07-10 02:06;fuel;os-nosdn-ovs-noha
+2017-07-10 02:06;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-07-10 02:09;fuel;os-nosdn-kvm-ha
+2017-07-10 02:09;fuel;os-nosdn-nofeature-noha
+2017-07-10 02:11;fuel;os-odl_l3-nofeature-ha
+2017-07-10 02:12;fuel;os-odl_l2-nofeature-ha
+2017-07-10 02:13;fuel;os-nosdn-ovs-ha
+2017-07-10 02:13;fuel;os-odl_l3-nofeature-noha
+2017-07-10 02:14;fuel;os-nosdn-nofeature-ha
+2017-07-12 02:04;fuel;os-nosdn-kvm-noha
+2017-07-12 02:04;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-07-12 02:05;fuel;os-nosdn-ovs-ha
+2017-07-12 02:06;fuel;os-nosdn-ovs-noha
+2017-07-12 02:06;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-07-12 02:08;fuel;os-nosdn-kvm-ha
+2017-07-12 02:09;fuel;os-nosdn-nofeature-noha
+2017-07-12 02:10;fuel;os-odl_l3-nofeature-noha
+2017-07-12 02:12;fuel;os-odl_l2-sfc-ha
+2017-07-12 02:13;fuel;os-odl_l2-nofeature-ha
+2017-07-12 02:13;fuel;os-nosdn-nofeature-ha
+2017-07-12 02:15;joid;os-nosdn-nofeature-ha
+2017-07-12 12:20;apex;os-nosdn-fdio-ha
+2017-07-12 12:30;fuel;os-nosdn-kvm-noha
+2017-07-12 12:31;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-07-12 12:31;fuel;os-nosdn-ovs-ha
+2017-07-12 12:32;fuel;os-nosdn-ovs-noha
+2017-07-12 12:33;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-07-12 12:35;fuel;os-nosdn-kvm-ha
+2017-07-12 12:35;fuel;os-nosdn-nofeature-noha
+2017-07-12 12:37;fuel;os-odl_l3-nofeature-noha
+2017-07-12 12:39;fuel;os-odl_l2-sfc-ha
+2017-07-12 12:39;fuel;os-odl_l2-nofeature-ha
+2017-07-12 12:40;fuel;os-nosdn-nofeature-ha
+2017-07-12 12:42;joid;os-nosdn-nofeature-ha
+2017-07-13 02:05;fuel;os-nosdn-kvm-noha
+2017-07-13 02:06;fuel;os-nosdn-kvm_ovs_dpdk_bar-ha
+2017-07-13 02:06;fuel;os-nosdn-ovs-ha
+2017-07-13 02:08;fuel;os-nosdn-ovs-noha
+2017-07-13 02:08;fuel;os-nosdn-kvm_ovs_dpdk-ha
+2017-07-13 02:10;fuel;os-nosdn-kvm-ha
+2017-07-13 02:10;fuel;os-nosdn-nofeature-noha
+2017-07-13 02:11;fuel;os-odl_l2-nofeature-noha
+2017-07-13 02:12;fuel;os-odl_l3-nofeature-noha
+2017-07-13 02:14;fuel;os-odl_l2-sfc-ha
+2017-07-13 02:14;fuel;os-odl_l2-nofeature-ha
+2017-07-13 02:15;fuel;os-nosdn-nofeature-ha
+2017-07-13 02:17;joid;os-nosdn-nofeature-ha
diff --git a/docs/testing/developer/devguide/index.rst b/docs/testing/developer/devguide/index.rst
index 1e794aa03..6bc46081f 100644
--- a/docs/testing/developer/devguide/index.rst
+++ b/docs/testing/developer/devguide/index.rst
@@ -9,6 +9,23 @@ OPNFV FUNCTEST developer guide
:numbered:
:maxdepth: 2
+Version history
+===============
++------------+----------+------------------+----------------------------------+
+| **Date** | **Ver.** | **Author** | **Comment** |
+| | | | |
++------------+----------+------------------+----------------------------------+
+| 2017-01-23 | 1.0.0 | Morgan Richomme | Creation for Danube |
++------------+----------+------------------+----------------------------------+
+| 2017-08-16 | 1.0.1 | Morgan Richomme | Adaptations for Euphrates |
+| | | | - move generic part to Testing |
+| | | | developer guide |
+| | | | - move reporting part to functest|
+| | | | user guide |
+| | | | - update test case list |
+| | | | - include auto generated core |
+| | | | documentation |
++------------+----------+------------------+----------------------------------+
============
Introduction
@@ -17,16 +34,18 @@ Introduction
Functest is a project dealing with functional testing.
Functest produces its own internal test cases but can also be considered
as a framework to support feature and VNF onboarding project testing.
-Functest developed a TestAPI and defined a test collection framework
-that can be used by any OPNFV project.
Therefore there are many ways to contribute to Functest. You can:
* Develop new internal test cases
* Integrate the tests from your feature project
* Develop the framework to ease the integration of external test cases
- * Develop the API / Test collection framework
- * Develop dashboards or automatic reporting portals
+
+Additional tasks involving Functest but addressing all the test projects
+may also be mentioned:
+
+ * Develop the API / Test collection framework
+ * Develop dashboards or automatic reporting portals
This document describes how, as a developer, you may interact with the
Functest project. The first section details the main working areas of
@@ -42,8 +61,23 @@ Functest developer areas
Functest High level architecture
================================
-Functest is project delivering a test container dedicated to OPNFV.
+Functest is a project delivering test containers dedicated to OPNFV.
It includes the tools, the scripts and the test scenarios.
+Until Danube, Functest produced 2 docker files based on Ubuntu 14.04:
+
+ * x86 Functest: https://hub.docker.com/r/opnfv/functest/
+ * aarch64 Functest: https://hub.docker.com/r/opnfv/functest_aarch64/
+
+In Euphrates Alpine containers have been introduced in order to lighten the
+container and manage testing slicing, the new containers are created according
+to the different tiers:
+
+ * functest-core: https://hub.docker.com/r/opnfv/functest-core/
+ * functest-healthcheck: https://hub.docker.com/r/opnfv/functest-healthcheck/
+ * functest-smoke: https://hub.docker.com/r/opnfv/functest-smoke/
+ * functest-features: TODO
+ * functest-components: TODO
+ * functest-vnf: TODO
Functest can be described as follow::
@@ -63,7 +97,7 @@ Functest can be described as follow::
Functest internal test cases
============================
-The internal test cases in Danube are:
+The internal test cases in Euphrates are:
* api_check
@@ -72,33 +106,37 @@ The internal test cases in Danube are:
* vping_ssh
* vping_userdata
* odl
+ * odl-netvirt
+ * odl-fds
* rally_full
* rally_sanity
* snaps_health_check
* tempest_full_parallel
* tempest_smoke_serial
+ * cloudify_ims
-By internal, we mean that this particular test cases have been
-developped and/or integrated by functest contributors and the associated
-code is hosted in the Functest repository.
+By internal, we mean that this particular test cases have been developed and/or
+integrated by functest contributors and the associated code is hosted in the
+Functest repository.
An internal case can be fully developed or a simple integration of
-upstream suites (e.g. Tempest/Rally developped in OpenStack are just
-integrated in Functest).
+upstream suites (e.g. Tempest/Rally developed in OpenStack, or odl suites are
+just integrated in Functest).
+
The structure of this repository is detailed in `[1]`_.
The main internal test cases are in the opnfv_tests subfolder of the
repository, the internal test cases are:
- * sdn: odl, onos
- * openstack: api_check, connection_check, snaps_health_check, vping_ssh, vping_userdata, tempest_*, rally_*, snaps_smoke
+ * sdn: odl, odl_netvirt, odl_fds, onos
+ * openstack: api_check, connection_check, snaps_health_check, vping_ssh, vping_userdata, tempest_*, rally_*
* vnf: cloudify_ims
-If you want to create a new test case you will have to create a new
-folder under the testcases directory.
+If you want to create a new test case you will have to create a new folder under
+the testcases directory (See next section for details).
Functest external test cases
============================
-The external test cases are inherited from other OPNFV projects,
-especially the feature projects.
+The external test cases are inherited from other OPNFV projects, especially the
+feature projects.
The external test cases are:
@@ -106,33 +144,36 @@ The external test cases are:
* bgpvpn
* doctor
* domino
- * odl-netvirt
* onos
* fds
- * multisite
* orchestra_ims
* parser
* promise
* refstack_defcore
- * security_scan
* snaps_smoke
- * sfc-odl
+ * functest-odl-sfc
* vyos_vrouter
+External test cases integrated in previous versions but not released in
+Euphrates:
+
+ * copper
+ * netready
+ * security_scan
+
+
+The code to run these test cases is hosted in the repository of the project.
-The code to run these test cases may be directly in the repository of
-the project. We have also a **features** sub directory under opnfv_tests
-directory that may be used (it can be useful if you want to reuse
-Functest library).
Functest framework
==================
-Functest can be considered as a framework.
-Functest is release as a docker file, including tools, scripts and a CLI
-to prepare the environment and run tests.
-It simplifies the integration of external test suites in CI pipeline
-and provide commodity tools to collect and display results.
+Functest is a framework.
+
+Historically Functest is released as a docker file, including tools, scripts and
+a CLI to prepare the environment and run tests.
+It simplifies the integration of external test suites in CI pipeline and provide
+commodity tools to collect and display results.
Since Colorado, test categories also known as tiers have been created to
group similar tests, provide consistent sub-lists and at the end optimize
@@ -149,19 +190,23 @@ The tiers are:
* vnf
* stress
+Note Functest deals with healthcheck, smoke, features, components and vnf tiers.
+Performance and stress tiers are out of scope.
+
Functest abstraction classes
============================
-In order to harmonize test integration, 3 abstraction classes have been
-introduced in Danube:
+In order to harmonize test integration, abstraction classes have been
+introduced:
* testcase: base for any test case
+ * unit: run unit tests as test case
* feature: abstraction for feature project
- * vnf_base: abstraction for vnf onboarding
+ * vnf: abstraction for vnf onboarding
-The goal is to unify the way to run test from Functest.
+The goal is to unify the way to run tests in Functest.
-feature and vnf_base inherit from testcase::
+Feature, unit and vnf_base inherit from testcase::
+-----------------------------------------+
| |
@@ -173,785 +218,94 @@ feature and vnf_base inherit from testcase::
| - check_criteria() |
| |
+-----------------------------------------+
- | |
- V V
- +--------------------+ +--------------------------+
- | | | |
- | feature | | vnf_base |
- | | | |
- | - prepare() | | - prepare() |
- | - execute() | | - deploy_orchestrator() |
- | - post() | | - deploy_vnf() |
- | - parse_results() | | - test_vnf() |
- | | | - clean() |
- | | | - execute() |
- | | | |
- +--------------------+ +--------------------------+
+ | |
+ V V
+ +--------------------+ +--------------+ +--------------------------+
+ | | | | | |
+ | feature | | unit | | vnf |
+ | | | | | |
+ | | | | | - prepare() |
+ | - execute() | | | | - deploy_orchestrator() |
+ | BashFeature class | | | | - deploy_vnf() |
+ | | | | | - test_vnf() |
+ | | | | | - clean() |
+ +--------------------+ +--------------+ +--------------------------+
+
+
+Testcase
+========
+.. raw:: html
+ :url: http://artifacts.opnfv.org/functest/docs/apidoc/functest.core.testcase.html
+
+Feature
+=======
+.. raw:: html
+ :url: http://artifacts.opnfv.org/functest/docs/apidoc/functest.core.feature.html
+
+Unit
+====
+.. raw:: html
+ :url: http://artifacts.opnfv.org/functest/docs/apidoc/functest.core.unit.html
+
+VNF
+===
+.. raw:: html
+ :url: http://artifacts.opnfv.org/functest/docs/apidoc/functest.core.vnf.html
+
+
+see `Functest framework overview`_ to get code samples
Functest util classes
=====================
-In order to simplify the creation of test cases, Functest develops some
+In order to simplify the creation of test cases, Functest develops also some
functions that can be used by any feature or internal test cases.
Several features are supported such as logger, configuration management and
Openstack capabilities (snapshot, clean, tacker,..).
These functions can be found under <repo>/functest/utils and can be described as
-follows:
-
-functest/utils/
-|-- config.py
-|-- constants.py
-|-- env.py
-|-- functest_logger.py
-|-- functest_utils.py
-|-- openstack_clean.py
-|-- openstack_snapshot.py
-|-- openstack_tacker.py
-`-- openstack_utils.py
-
-Note that for Openstack, keystone v3 is now deployed by default by compass,
-fuel and joid in Danube. All installers still support keystone v2 (deprecated in
-next version).
-
-Test collection framework
-=========================
-
-The OPNFV testing group created a test collection database to collect
-the test results from CI:
-
-
- http://testresults.opnfv.org/test/swagger/spec.html
-
- Authentication: opnfv/api@opnfv
-
-Any test project running on any lab integrated in CI can push the
-results to this database.
-This database can be used to see the evolution of the tests and compare
-the results versus the installers, the scenarios or the labs.
-
-
-Overall Architecture
---------------------
-The Test result management can be summarized as follows::
-
- +-------------+ +-------------+ +-------------+
- | | | | | |
- | Test | | Test | | Test |
- | Project #1 | | Project #2 | | Project #N |
- | | | | | |
- +-------------+ +-------------+ +-------------+
- | | |
- V V V
- +-----------------------------------------+
- | |
- | Test Rest API front end |
- | http://testresults.opnfv.org/test |
- | |
- +-----------------------------------------+
- A |
- | V
- | +-------------------------+
- | | |
- | | Test Results DB |
- | | Mongo DB |
- | | |
- | +-------------------------+
- |
- |
- +----------------------+
- | |
- | test Dashboard |
- | |
- +----------------------+
-
-TestAPI description
--------------------
-The TestAPI is used to declare pods, projects, test cases and test
-results. Pods are the pods used to run the tests.
-The results pushed in the database are related to pods, projects and
-cases. If you try to push results of test done on non referenced pod,
-the API will return an error message.
-
-An additional method dashboard has been added to post-process
-the raw results in release Brahmaputra (deprecated in Colorado).
-
-The data model is very basic, 5 objects are created:
-
- * Pods
- * Projects
- * Testcases
- * Results
- * Scenarios
-
-The code of the API is hosted in the releng repository `[6]`_.
-The static documentation of the API can be found at `[17]`_.
-The TestAPI has been dockerized and may be installed locally in your
-lab. See `[15]`_ for details.
-
-The deployment of the TestAPI has been automated.
-A jenkins job manages:
- * the unit tests of the TestAPI
- * the creation of a new docker file
- * the deployment of the new TestAPI
- * the archive of the old TestAPI
- * the backup of the Mongo DB
-
-TestAPI Authorization
-~~~~~~~~~~~~~~~~~~~~~
-
-PUT/DELETE/POST operations of the TestAPI now require token based authorization. The token needs
-to be added in the request using a header 'X-Auth-Token' for access to the database.
-
-e.g::
- headers['X-Auth-Token']
-
-The value of the header i.e the token can be accessed in the jenkins environment variable
-*TestApiToken*. The token value is added as a masked password.
-
-.. code-block:: python
-
- headers['X-Auth-Token'] = os.environ.get('TestApiToken')
-
-The above example is in Python. Token based authentication has been added so that only ci pods
-jenkins job can have access to the database.
-
-Please note that currently token authorization is implemented but is not yet enabled.
-
- Automatic reporting
- ===================
-
- An automatic reporting page has been created in order to provide a
- consistent view of the scenarios.
- In this page, each scenario is evaluated according to test criteria.
- The code for the automatic reporting is available at `[8]`_.
-
- The results are collected from the centralized database every day and,
- per scenario. A score is calculated based on the results from the last
- 10 days. This score is the addition of single test scores. Each test
- case has a success criteria reflected in the criteria field from the
- results.
-
- Considering an instance of a scenario os-odl_l2-nofeature-ha, the
- scoring is the addition of the scores of all the runnable tests from the
- categories (tiers healthcheck, smoke and features)
- corresponding to this scenario.
-
-
- +---------------------+---------+---------+---------+---------+
- | Test | Apex | Compass | Fuel | Joid |
- +=====================+=========+=========+=========+=========+
- | vPing_ssh | X | X | X | X |
- +---------------------+---------+---------+---------+---------+
- | vPing_userdata | X | X | X | X |
- +---------------------+---------+---------+---------+---------+
- | tempest_smoke_serial| X | X | X | X |
- +---------------------+---------+---------+---------+---------+
- | rally_sanity | X | X | X | X |
- +---------------------+---------+---------+---------+---------+
- | odl | X | X | X | X |
- +---------------------+---------+---------+---------+---------+
- | promise | | | X | X |
- +---------------------+---------+---------+---------+---------+
- | doctor | X | | X | |
- +---------------------+---------+---------+---------+---------+
- | security_scan | X | | | |
- +---------------------+---------+---------+---------+---------+
- | parser | | | X | |
- +---------------------+---------+---------+---------+---------+
- src: colorado (see release note for the last matrix version)
-
- All the testcases listed in the table are runnable on
- os-odl_l2-nofeature scenarios.
- If no result is available or if all the results are failed, the test
- case get 0 point.
- If it was successful at least once but not anymore during the 4 runs,
- the case get 1 point (it worked once).
- If at least 3 of the last 4 runs were successful, the case get 2 points.
- If the last 4 runs of the test are successful, the test get 3 points.
-
- In the example above, the target score for fuel/os-odl_l2-nofeature-ha
- is 3x6 = 18 points.
-
- The scenario is validated per installer when we got 3 points for all
- individual test cases (e.g 18/18).
- Please note that complex or long duration tests are not considered for
- the scoring. The success criteria are not always easy to define and may
- require specific hardware configuration. These results however provide
- a good level of trust on the scenario.
-
- A web page is automatically generated every day to display the status.
- This page can be found at `[9]`_. For the status, click on Status menu,
- you may also get feedback for vims and tempest_smoke_serial test cases.
-
- Any validated scenario is stored in a local file on the web server. In
- fact as we are using a sliding windows to get results, it may happen
- that a successful scenarios is no more run (because considered as
- stable) and then the number of iterations (4 needed) would not be
- sufficient to get the green status.
-
- Please note that other test cases (e.g. sfc_odl, bgpvpn) need also
- ODL configuration addons and as a consequence specific scenario.
- There are not considered as runnable on the generic odl_l2 scenario.
-
-Dashboard
-=========
-
-Dashboard is used to provide a consistent view of the results collected
-in CI.
-The results showed on the dashboard are post processed from the Database,
-which only contains raw results.
-
-In Brahmaputra, we created a basic dashboard.
-Since Colorado, it was decided to adopt ELK framework. Mongo DB results
-are extracted to feed Elasticsearch database (`[7]`_).
+follows::
-A script was developed to build elasticsearch data set. This
-script can be found in `[16]`_.
+ functest/utils/
+ |-- config.py
+ |-- constants.py
+ |-- decoratos.py
+ |-- env.py
+ |-- functest_utils.py
+ |-- openstack_clean.py
+ |-- openstack_snapshot.py
+ |-- openstack_tacker.py
+ `-- openstack_utils.py
-For next versions, it was decided to integrated bitergia dashboard.
-Bitergia already provides a dashboard for code and infrastructure.
-A new Test tab will be added. The dataset will be built by consuming
-the TestAPI.
+Please note that it is possible to use snaps utils. SNAPS `[4]`_ is an OPNFV
+project providing OpenStack utils.
+TestAPI
=======
-How TOs
-=======
-
-How Functest works?
-===================
-
-The installation and configuration of the Functest docker image is
-described in `[1]`_.
-
-The procedure to start tests is described in `[2]`_
-
-
-How can I contribute to Functest?
-=================================
-
-If you are already a contributor of any OPNFV project, you can
-contribute to functest. If you are totally new to OPNFV, you must first
-create your Linux Foundation account, then contact us in order to
-declare you in the repository database.
-
-We distinguish 2 levels of contributors:
-
- * the standard contributor can push patch and vote +1/0/-1 on any Functest patch
- * The commitor can vote -2/-1/0/+1/+2 and merge
-
-Functest commitors are promoted by the Functest contributors.
-
-
-Where can I find some help to start?
-====================================
-
-This guide is made for you. You can also have a look at the project wiki
-page `[10]`_.
-There are references on documentation, video tutorials, tips...
-
-You can also directly contact us by mail with [Functest] prefix in the
-title at opnfv-tech-discuss@lists.opnfv.org or on the IRC chan
-#opnfv-functest.
-
-
-What kind of testing do you do in Functest?
-===========================================
-
-Functest is focusing on Functional testing. The results must be PASS or
-FAIL. We do not deal with performance and/or qualification tests.
-We consider OPNFV as a black box and execute our tests from the jumphost
-according to Pharos reference technical architecture.
-
-Upstream test suites are integrated (Rally/Tempest/ODL/ONOS,...).
-If needed Functest may bootstrap temporarily testing activities if they
-are identified but not covered yet by an existing testing project (e.g
-security_scan before the creation of the security repository)
-
-
-How are test constraints defined?
-=================================
-
-Test constraints are defined according to 2 parameters:
-
- * The scenario (DEPLOY_SCENARIO env variable)
- * The installer (INSTALLER_TYPE env variable)
-
-A scenario is a formal description of the system under test.
-The rules to define a scenario are described in `[4]`_
-
-These 2 constraints are considered to determinate if the test is runnable
-or not (e.g. no need to run onos suite on odl scenario).
-
-In the test declaration for CI, the test owner shall indicate these 2
-constraints. The file testcases.yaml `[5]`_ must be patched in git to
-include new test cases. A more elaborated system based on template is
-planned for next releases
-
-For each dependency, it is possible to define a regex::
-
- name: promise
- criteria: 'success_rate == 100%'
- description: >-
- Test suite from Promise project.
- dependencies:
- installer: '(fuel)|(joid)'
- scenario: ''
-
-In the example above, it means that promise test will be runnable only
-with joid or fuel installers on any scenario.
-
-The vims criteria means any installer and exclude onos and odl with
-bgpvpn scenarios::
-
- name: vims
- criteria: 'status == "PASS"'
- description: >-
- This test case deploys an OpenSource vIMS solution from Clearwater
- using the Cloudify orchestrator. It also runs some signaling traffic.
- dependencies:
- installer: ''
- scenario: '(ocl)|(nosdn)|^(os-odl)((?!bgpvpn).)*$'
-
-
-How to write and check constraint regex?
-=======================================
-
-Regex are standard regex. You can have a look at `[11]`_
-
-You can also easily test your regex via an online regex checker such as `[12]`_.
-Put your scenario in the TEST STRING window (e.g. os-odl_l3-ovs-ha), put
-your regex in the REGULAR EXPRESSION window, then you can test your rule.
-
-
-How to know which test I can run?
-=================================
-
-You can use the API `[13]`_. The static declaration is in git `[5]`_
-
-If you are in a Functest docker container (assuming that the
-environment has been prepared): just use the CLI.
-
-You can get the list per Test cases or by Tier::
-
- # functest testcase list
- healthcheck
- vping_ssh
- vping_userdata
- tempest_smoke_serial
- rally_sanity
- odl
- doctor
- security_scan
- tempest_full_parallel
- rally_full
- vims
- # functest tier list
- - 0. healthcheck:
- ['healthcheck']
- - 1. smoke:
- ['vping_ssh', 'vping_userdata', 'tempest_smoke_serial', 'rally_sanity']
- - 2. sdn_suites:
- ['odl']
- - 3. features:
- ['doctor', 'security_scan']
- - 4. openstack:
- ['tempest_full_parallel', 'rally_full']
- - 5. vnf:
- ['vims']
-
-
-How to manually start Functest tests?
-=====================================
-
-Assuming that you are connected on the jumphost and that the system is
-"Pharos compliant", i.e the technical architecture is compatible with
-the one defined in the Pharos project::
-
- # docker pull opnfv/functest:latest
- # envs="-e INSTALLER_TYPE=fuel -e INSTALLER_IP=10.20.0.2 -e DEPLOY_SCENARIO=os-odl_l2-nofeature-ha -e CI_DEBUG=true"
- # sudo docker run --privileged=true -id ${envs} opnfv/functest:latest /bin/bash
-
-
-Then you must connect to the docker container and source the
-credentials::
-
- # docker ps (copy the id)
- # docker exec -ti <container_id> bash
- # source $creds
-
-
-You must first check if the environment is ready::
-
- # functest env status
- Functest environment ready to run tests.
-
-
-If not ready, prepare the env by launching::
-
- # functest env prepare
- Functest environment ready to run tests.
-
-Once the Functest env is ready, you can use the CLI to start tests.
-
-You can run test cases per test case or per tier:
- # functest testcase run <case name> or # functest tier run <tier name>
-
-
-e.g::
-
- # functest testcase run tempest_smoke_serial
- # functest tier run features
-
-
-If you want to run all the tests you can type::
-
- # functest testcase run all
-
-
-If you want to run all the tiers (same at the end that running all the
-test cases) you can type::
-
- # functest tier run all
-
-
-How to declare my tests in Functest?
-====================================
-
-If you want to add new internal test cases, you can submit patch under
-the testcases directory of Functest repository.
-
-For feature test integration, the code can be kept into your own
-repository. The Functest files to be modified are:
-
- * functest/docker/Dockerfile: get your code in Functest container
- * functest/ci/testcases.yaml: reference your test and its associated constraints
-
-
-Dockerfile
-----------
-
-This file lists the repositories (internal or external) to be cloned in
-the Functest container. You can also add external packages::
-
- RUN git clone https://gerrit.opnfv.org/gerrit/<your project> ${REPOS_DIR}/<your project>
-
-testcases.yaml
---------------
-
-All the test cases that must be run from CI / CLI must be declared in
-ci/testcases.yaml.
+Functest is using the Test collection framework and the TestAPI developed by
+the OPNFV community. See `OPNFV Test collection framework`_ for details.
-This file is used to get the constraints related to the test::
- name: <my_super_test_case>
- criteria: <not used yet in Colorado, could be > 'PASS', 'rate > 90%'
- description: >-
- <the description of your super test suite>
- dependencies:
- installer: regex related to installer e.g. 'fuel', '(apex)||(joid)'
- scenario: regex related to the scenario e.g. 'ovs*no-ha'
-
-
-You must declare your test case in one of the category (tier).
-
-If you are integrating test suites from a feature project, the default
-category is **features**.
-
-
-How to select my list of tests for CI?
-======================================
-
-Functest can be run automatically from CI, a jenkins job is usually
-called after an OPNFV fresh installation.
-By default we try to run all the possible tests (see `[14]` called from
-Functest jenkins job)::
-
- cmd="python ${FUNCTEST_REPO_DIR}/ci/run_tests.py -t all ${flags}"
-
-
-Each case can be configured as daily and/or weekly task.
-Weekly tasks are used for long duration or experimental tests.
-Daily tasks correspond to the minimum set of test suites to validate a scenario.
-
-When executing run_tests.py, a check based on the jenkins build tag will
-be considered to detect whether it is a daily and/or a weekly test.
-
-in your CI you can customize the list of test you want to run by case or
-by tier, just change the line::
-
- cmd="python ${FUNCTEST_REPO_DIR}/ci/run_tests.py -t <whatever you want> ${flags}"
-
-e.g.::
-
- cmd="python ${FUNCTEST_REPO_DIR}/ci/run_tests.py -t healthcheck,smoke ${flags}"
-
-This command will run all the test cases of the first 2 tiers, i.e.
-healthcheck, connection_check, api_check, vping_ssh, vping_userdata,
-snaps_smoke, tempest_smoke_serial and rally_sanity.
-
-
-How to push your results into the Test Database
-===============================================
-
-The test database is used to collect test results. By default it is
-enabled only for CI tests from Production CI pods.
-
-The architecture and associated API is described in previous chapter.
-If you want to push your results from CI, you just have to call the API
-at the end of your script.
-
-You can also reuse a python function defined in functest_utils.py::
-
- def push_results_to_db(db_url, case_name, logger, pod_name,version, payload):
- """
- POST results to the Result target DB
- """
- url = db_url + "/results"
- installer = get_installer_type(logger)
- params = {"project_name": "functest", "case_name": case_name,
- "pod_name": pod_name, "installer": installer,
- "version": version, "details": payload}
-
- headers = {'Content-Type': 'application/json'}
- try:
- r = requests.post(url, data=json.dumps(params), headers=headers)
- if logger:
- logger.debug(r)
- return True
- except Exception, e:
- print "Error [push_results_to_db('%s', '%s', '%s', '%s', '%s')]:" \
- % (db_url, case_name, pod_name, version, payload), e
- return False
-
-
-Where can I find the documentation on the test API?
-===================================================
-
-http://artifacts.opnfv.org/releng/docs/testapi.html
-
-
-How to exclude Tempest case from default Tempest smoke suite?
-=============================================================
-
-Tempest default smoke suite deals with 165 test cases.
-Since Colorado the success criteria is 100%, i.e. if 1 test is failed the
-success criteria is not matched for the scenario.
-
-It is necessary to exclude some test cases that are expected to fail due to
-known upstream bugs (see release notes).
-
-A file has been created for such operation: https://git.opnfv.org/cgit/functest/tree/functest/opnfv_tests/openstack/tempest/custom_tests/blacklist.txt.
-
-It can be described as follows::
-
- -
- scenarios:
- - os-odl_l2-bgpvpn-ha
- - os-odl_l2-bgpvpn-noha
- installers:
- - fuel
- - apex
- tests:
- - tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers
- - tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_server_details
- - tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers
- - tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details
- - tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_reboot_server_hard
- - tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_network_basic_ops
- - tempest.scenario.test_server_basic_ops.TestServerBasicOps.test_server_basic_ops
- - tempest.scenario.test_volume_boot_pattern.TestVolumeBootPattern.test_volume_boot_pattern
- - tempest.scenario.test_volume_boot_pattern.TestVolumeBootPatternV2.test_volume_boot_pattern
-
-Please note that each exclusion must be justified. the goal is not to exclude
-test cases because they do not pass. Several scenarios reached the 100% criteria.
-So it is expected in the patch submitted to exclude the cases to indicate the
-reasons of the exclusion.
-
-
-How do I know the Functest status of a scenario?
-================================================
-
-A Functest automatic reporting page is generated daily.
-This page is dynamically created through a cron job and is based on the results
-stored in the Test DB.
-You can access this reporting page: http://testresults.opnfv.org/reporting
-
-See https://wiki.opnfv.org/pages/viewpage.action?pageId=6828617 for details.
-
-
-I have tests, to which category should I declare them?
-======================================================
-
-CATEGORIES/TIERS description:
-
-+----------------+-------------------------------------------------------------+
-| healthcheck | Simple OpenStack healthcheck tests case that validates the |
-| | basic operations in OpenStack |
-+----------------+-------------------------------------------------------------+
-| Smoke | Set of smoke test cases/suites to validate the most common |
-| | OpenStack and SDN Controller operations |
-+----------------+-------------------------------------------------------------+
-| Features | Test cases that validate a specific feature on top of OPNFV.|
-| | Those come from Feature projects and need a bit of support |
-| | for integration |
-+----------------+-------------------------------------------------------------+
-| Components | Advanced OpenStack tests: Full Tempest, Full Rally |
-+----------------+-------------------------------------------------------------+
-| Performance | Out of Functest Scope |
-+----------------+-------------------------------------------------------------+
-| VNF | Test cases related to deploy an open source VNF including |
-| | an orchestrator |
-+----------------+-------------------------------------------------------------+
-
-The main ambiguity could be between features and VNF.
-In fact sometimes you have to spawn VMs to demonstrate the capabilities of the
-feature you introduced.
-We recommend to declare your test in the feature category.
-
-VNF category is really dedicated to test including:
-
- * creation of resources
- * deployment of an orchestrator/VNFM
- * deployment of the VNF
- * test of the VNFM
- * free resources
-
-The goal is not to study a particular feature on the infrastructure but to have
-a whole end to end test of a VNF automatically deployed in CI.
-Moreover VNF are run in weekly jobs (one a week), feature tests are in daily
-jobs and use to get a scenario score.
-
-Where are the logs?
-===================
-
-Functest deals with internal and external testcases. Each testcase can generate
-logs.
-
-Since Colorado we introduce the possibility to push the logs to the artifact.
-A new script (https://git.opnfv.org/releng/tree/utils/push-test-logs.sh) has
-been created for CI.
-
-When called, and assuming that the POD is authorized to push the logs to
-artifacts, the script will push all the results or logs locally stored under
-/home/opnfv/functest/results/.
-
-If the POD is not connected to CI, logs are not pushed.
-But in both cases, logs are stored in /home/opnfv/functest/results in the
-container.
-Projects are encouraged to push their logs here.
-
-Since Colorado it is also easy for feature project to integrate this feature by
-adding the log file as output_file parameter when calling execute_command from
-functest_utils library
-
- ret_val = functest_utils.execute_command(cmd, output_file=log_file)
-
-
-How does Functest deal with VNF onboarding?
-===========================================
-
-VNF onboarding has been introduced in Brahmaputra through the automation of a
-clearwater vIMS deployed thanks to cloudify orchestrator.
-
-This automation has been described at OpenStack summit Barcelona:
-https://youtu.be/Jr4nG74glmY
-
-The goal of Functest consists in testing OPNFV from a functional perspective:
-the NFVI and/or the features developed in OPNFV. Feature test suites are
-provided by the feature project. Functest just simplifies the integration of
-the suite into the CI and gives a consolidated view of the tests per scenario.
-
-Functest does not develop VNFs.
-
-Functest does not test any MANO stack.
-
-OPNFV projects dealing with VNF onboarding
-------------------------------------------
-
-Testing VNF is not the main goal however it gives interesting and realistic
-feedback on OPNFV as a Telco cloud.
-
-Onboarding VNF also allows to test a full stack: orchestrator + VNF.
-
-Functest is VNF and MANO stack agnostic.
-
-An internship has been initiated to reference the Open Source VNF: Intern
-Project Open Source VNF catalog
-
-New projects dealing with orchestrators or VNFs are candidate for Danube.
-
-The 2 projects dealing with orchestration are:
-
- * orchestra (Openbaton)
- * opera (Open-O)
-
-The Models project address various goals for promoting availability and
-convergence of information and/or data models related to NFV service/VNF
-management, as being defined in standards (SDOs) and as developed in open
-source projects.
-
-Functest VNF onboarding
------------------------
-
-In order to simplify VNF onboarding a new abstraction class has been developed
-in Functest.
-
-This class is based on vnf_base and can be described as follow:
-
- +------------+ +--------------+
- | test_base |------------>| vnf_base |
- +------------+ +--------------+
- |_ prepare
- |_ deploy_orchestrator (optional)
- |_ deploy_vnf
- |_ test_vnf
- |_ clean
-
-
-Several methods are declared in vnf_base:
-
- * prepare
- * deploy_orchestrator
- * deploy_vnf
- * test_vnf
- * clean
-
-deploy_vnf and test_vnf are mandatory.
-
-prepare will create a user and a project.
-
-How to declare your orchestrator/VNF?
--------------------------------------
-1) test declaration
-
-You must declare your testcase in the file <Functest repo>/functest/ci/testcases.yaml
-
-2) configuration
-
-You can precise some configuration parameters in config_functest.yaml
-
-3) implement your test
+Reporting
+=========
+A web page is automatically generated every day to display the status based on
+jinja2 templates `[3]`_.
-Create your own VnfOnboarding file
-you must create your entry point through a python class as referenced in the
-configuration file
+Dashboard
+=========
-e.g. aaa => creation of the file <Functest repo>/functest/opnfv_tests/vnf/aaa/aaa.py
+Additional dashboarding is managed at the testing group level, see
+`OPNFV Testing dashboard`_
-the class shall inherit vnf_base.
-You must implement the methods deploy_vnf() and test_vnf() and may implement
-deploy_orchestrator()
-you can call the code from your repo (but need to add the repo in Functest if
-it is not the case)
+=======
+How TOs
+=======
-4) success criteria
+See `How to section`_ on Functest wiki
-So far we considered the test as PASS if vnf_deploy and test_vnf is PASS
-(see example in aaa).
==========
References
@@ -961,44 +315,16 @@ _`[1]`: http://artifacts.opnfv.org/functest/docs/configguide/index.html Functest
_`[2]`: http://artifacts.opnfv.org/functest/docs/userguide/index.html functest user guide
-_`[3]`: https://wiki.opnfv.org/opnfv_test_dashboard Brahmaputra dashboard
-
-_`[4]`: https://wiki.opnfv.org/display/INF/CI+Scenario+Naming
-
-_`[5]`: https://git.opnfv.org/cgit/functest/tree/ci/testcases.yaml
+_`[3]`: https://git.opnfv.org/cgit/releng/tree/utils/test/reporting
-_`[6]`: https://git.opnfv.org/cgit/releng/tree/utils/test/result_collection_api
+_`[4]`: https://git.opnfv.org/snaps/
-_`[7]`: https://git.opnfv.org/cgit/releng/tree/utils/test/scripts
+_`Functest framework overview` : http://testresults.opnfv.org/functest/framework/index.html
-_`[8]`: https://git.opnfv.org/cgit/releng/tree/utils/test/reporting/functest
+_`OPNFV Test collection framework`: TODO
-_`[9]`: http://testresults.opnfv.org/reporting/
+_`OPNFV Testing dashboard`: https://opnfv.biterg.io/goto/283dba93ca18e95964f852c63af1d1ba
-_`[10]`: https://wiki.opnfv.org/opnfv_functional_testing
-
-_`[11]`: https://docs.python.org/2/howto/regex.html
-
-_`[12]`: https://regex101.com/
-
-_`[13]`: http://testresults.opnfv.org/test/api/v1/projects/functest/cases
-
-_`[14]`: https://git.opnfv.org/cgit/releng/tree/jjb/functest/functest-daily.sh
-
-_`[15]`: https://git.opnfv.org/cgit/releng/tree/utils/test/result_collection_api/README.rst
-
-_`[16]`: https://git.opnfv.org/cgit/releng/tree/utils/test/scripts/mongo_to_elasticsearch.py
-
-_`[17]`: http://artifacts.opnfv.org/releng/docs/testapi.html
-
-OPNFV main site: http://www.opnfv.org
-
-OPNFV functional test page: https://wiki.opnfv.org/opnfv_functional_testing
+_`How to section`: https://wiki.opnfv.org/pages/viewpage.action?pageId=7768932
IRC support chan: #opnfv-functest
-
-_`OpenRC`: http://docs.openstack.org/user-guide/common/cli_set_environment_variables_using_openstack_rc.html
-
-_`Rally installation procedure`: https://rally.readthedocs.org/en/latest/tutorial/step_0_installation.html
-
-_`config_functest.yaml` : https://git.opnfv.org/cgit/functest/tree/functest/ci/config_functest.yaml
diff --git a/docs/testing/user/configguide/ci.rst b/docs/testing/user/configguide/ci.rst
new file mode 100644
index 000000000..384bc34e5
--- /dev/null
+++ b/docs/testing/user/configguide/ci.rst
@@ -0,0 +1,50 @@
+Integration in CI
+=================
+In CI we use the Docker image and execute the appropriate commands within the
+container from Jenkins.
+
+Docker creation in set-functest-env builder `[3]`_::
+
+ envs="-e INSTALLER_TYPE=${INSTALLER_TYPE} -e INSTALLER_IP=${INSTALLER_IP} -e NODE_NAME=${NODE_NAME}"
+ [...]
+ docker pull opnfv/functest:$DOCKER_TAG >/dev/null
+ cmd="sudo docker run -id ${envs} ${volumes} ${custom_params} ${TESTCASE_OPTIONS} opnfv/functest:${DOCKER_TAG} /bin/bash"
+ echo "Functest: Running docker run command: ${cmd}"
+ ${cmd} >${redirect}
+ sleep 5
+ container_id=$(docker ps | grep "opnfv/functest:${DOCKER_TAG}" | awk '{print $1}' | head -1)
+ echo "Container ID=${container_id}"
+ if [ -z ${container_id} ]; then
+ echo "Cannot find opnfv/functest container ID ${container_id}. Please check if it is existing."
+ docker ps -a
+ exit 1
+ fi
+ echo "Starting the container: docker start ${container_id}"
+ docker start ${container_id}
+ sleep 5
+ docker ps >${redirect}
+ if [ $(docker ps | grep "opnfv/functest:${DOCKER_TAG}" | wc -l) == 0 ]; then
+ echo "The container opnfv/functest with ID=${container_id} has not been properly started. Exiting..."
+ exit 1
+ fi
+
+ cmd="python ${FUNCTEST_REPO_DIR}/functest/ci/prepare_env.py start"
+ echo "Executing command inside the docker: ${cmd}"
+ docker exec ${container_id} ${cmd}
+
+
+Test execution in functest-all builder `[3]`_::
+
+ branch=${GIT_BRANCH##*/}
+ echo "Functest: run $FUNCTEST_SUITE_NAME on branch ${branch}"
+ cmd="functest testcase run $FUNCTEST_SUITE_NAME"
+ fi
+ container_id=$(docker ps -a | grep opnfv/functest | awk '{print $1}' | head -1)
+ docker exec $container_id $cmd
+ ret_value=$?
+ exit $ret_value
+
+Docker clean in functest-cleanup builder `[3]`_ calling docker rm and docker rmi
+
+
+.. _`[3]`: https://git.opnfv.org/releng/tree/jjb/functest/functest-daily-jobs.yml
diff --git a/docs/testing/user/configguide/configguide.rst b/docs/testing/user/configguide/configguide.rst
index a72055ca9..716c8a135 100644
--- a/docs/testing/user/configguide/configguide.rst
+++ b/docs/testing/user/configguide/configguide.rst
@@ -1,11 +1,16 @@
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. SPDX-License-Identifier: CC-BY-4.0
+Installation and configuration (Ubuntu)
+=======================================
+
+The historical docker file is based on Ubuntu. It has been maintained for
+Euphrates.
Pulling the Docker image
------------------------
Pull the Functest Docker image ('opnfv/functest') from the public
-dockerhub registry under the OPNFV account: [dockerhub_], with the
+dockerhub registry under the OPNFV account: [Ì€`dockerhub`_], with the
following docker command::
docker pull opnfv/functest:<TagIdentifier>
@@ -40,6 +45,9 @@ used with non-OPNFV official installers (e.g. 'devstack'), with the
**disclaimer** that support for such environments is outside of the
scope and responsibility of the OPNFV project.
+Please note that alpine dockers have been introduced in Euphrates. See alpine
+section for details.
+
Accessing the Openstack credentials
-----------------------------------
OpenStack credentials are mandatory and must be provided to Functest.
@@ -185,8 +193,11 @@ when performing manual test scenarios::
text can be sent to the test results file / log files
and also to the standard console output.
+Installer Tips
+--------------
+
Apex Installer Tips
--------------------
+^^^^^^^^^^^^^^^^^^^
Some specific tips are useful for the Apex Installer case. If not using
Apex Installer; ignore this section.
@@ -232,7 +243,7 @@ illustration purposes::
opnfv/functest /bin/bash
Compass installer local development env usage Tips
---------------------------------------------------
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
In the compass-functest local test case check and development environment,
in order to get openstack service inside the functest container, some
parameters should be configured during container creation, which are
@@ -254,15 +265,22 @@ Tag omitted means the latest docker image::
To make a file used for the environment, such as 'functest-docker-env'::
- OS_AUTH_URL=http://172.16.1.222:35357/v2.0
+ CINDER_ENDPOINT_TYPE=publicURL
+ NOVA_ENDPOINT_TYPE=publicURL
+ OS_ENDPOINT_TYPE=publicURL
+ OS_INTERFACE=publicURL
OS_USERNAME=admin
- OS_PASSWORD=console
- OS_TENANT_NAME=admin
- OS_VOLUME_API_VERSION=2
+ OS_PASSWORD='990232e0885da343ac805523322d'
OS_PROJECT_NAME=admin
- INSTALLER_TYPE=compass
- INSTALLER_IP=192.168.200.2
- EXTERNAL_NETWORK=ext-net
+ OS_TENANT_NAME=admin
+ OS_AUTH_URL=https://192.16.1.222:5000/v3
+ OS_NO_CACHE=1
+ OS_USER_DOMAIN_NAME=Default
+ OS_PROJECT_DOMAIN_NAME=Default
+ OS_REGION_NAME=RegionOne
+ OS_IDENTITY_API_VERSION=3
+ OS_AUTH_VERSION=3
+
Note: please adjust the content according to the environment, such as
'TENANT_ID' maybe used for some special cases.
@@ -294,30 +312,21 @@ Inside the Functest docker container, the following directory structure
should now be in place::
`-- home
- `-- opnfv
- |-- functest
- | |-- conf
- | |-- data
- | `-- results
- `-- repos
- |-- bgpvpn
- |-- doctor
- |-- domino
- |-- functest
- |-- kingbird
- |-- odl_test
- |-- onos
- |-- parser
- |-- promise
- |-- rally
- |-- refstack-client
- |-- releng
- |-- sdnvpn
- |-- securityscanning
- |-- sfc
- |-- tempest
- |-- vims_test
- `-- vnfs
+ | `-- opnfv
+ | |-- functest
+ | | |-- conf
+ | | |-- data
+ | | |-- images
+ | | `-- results
+ | `-- repos
+ | |-- onos
+ | |-- doctor
+ | `-- vnfs
+ -- src
+ |-- tempest
+ |-- vims-test
+ |-- odl_test
+ `-- fds
Underneath the '/home/opnfv/' directory, the Functest docker container
includes two main directories:
@@ -334,83 +343,132 @@ includes two main directories:
The structure under the **functest** repository can be described as
follows::
- . |-- INFO
- |-- LICENSE
- |-- requirements.txt
- |-- run_unit_tests.sh
- |-- setup.py
- |-- test-requirements.txt
- |-- commons
- | |-- ims
- | |-- mobile
- | `--traffic-profile-guidelines.rst
- |-- docker
- | |-- Dockerfile
- | |-- config_install_env.sh
- | `-- docker_remote_api
- |-- docs
- | |-- com
- | |-- configguide
- | |-- devguide
- | |-- images
- | |-- internship
- | |-- release-notes
- | |-- results
- | `--userguide
- |-- functest
- |-- __init__.py
- |-- ci
- | |-- __init__.py
- | |-- check_deployment.py
- | |-- config_functest.yaml
- | |-- config_patch.yaml
- | |-- generate_report.py
- | |-- prepare_env.py
- | |-- run_tests.py
- | |-- testcases.yaml
- | |-- tier_builder.py
- | `-- tier_handler.py
- |-- cli
- | |-- __init__.py
- | |-- cli_base.py
- | |-- commands
- | |-- functest-complete.sh
- | `-- setup.py
- |-- core
- | |-- __init__.py
- | |-- feature.py
- | |-- pytest_suite_runner.py
- | |-- testcase.py
- | |-- vnf_base.py
- |-- opnfv_tests
- | |-- __init__.py
- | |-- features
- | |-- mano
- | |-- openstack
- | |-- sdn
- | |-- security_scan
- | `-- vnf
- |-- tests
- | |-- __init__.py
- | `-- unit
- `-- utils
- |-- __init__.py
- |-- config.py
- |-- constants.py
- |-- env.py
- |-- functest_logger.py
- |-- functest_utils.py
- |-- openstack
- |-- openstack_clean.py
- |-- openstack_snapshot.py
- |-- openstack_tacker.py
- `-- openstack_utils.py
-
-
- (Note: All *.pyc files removed from above list for brevity...)
-
-We may distinguish several directories, the first level has 4 directories:
-
+ |-- INFO
+ |-- LICENSE
+ |-- api
+ | `-- apidoc
+ |-- build.sh
+ |-- commons
+ | |-- docker
+ | |-- Dockerfile
+ | |-- Dockerfile.aarch64.patch
+ | |-- components
+ | |-- config_install_env.sh
+ | |-- core
+ | |-- docker_remote_api
+ | |-- features
+ | |-- healthcheck
+ | |-- smoke
+ | |-- vnf
+ | `-- thirdparty-requirements.txt
+ |-- docs
+ | |-- com
+ | |-- images
+ | |-- release
+ | | `-- release-notes
+ | |-- results
+ | | testing
+ | | |-- developer
+ | | `-- user
+ | | |-- configguide
+ | | `-- userguide
+ `-- functest
+ |-- api
+ | |-- base.py
+ | |-- server.py
+ | |-- urls.py
+ | |-- common
+ | | |-- api_utils.py
+ | | `-- error.py
+ | `-- resources
+ | `-- v1
+ | |-- creds.py
+ | |-- envs.py
+ | |-- testcases.py
+ | `-- tiers.py
+ |-- ci
+ │   |-- check_deployment.py
+ │   |-- config_aarch64_patch.yaml
+ │   |-- config_functest.yaml
+ │   |-- config_patch.yaml
+ │   |-- download_images.sh
+ │   |-- installer_params.yaml
+ │   |-- logging.ini
+ │   |-- prepare_env.py
+ │   |-- rally_aarch64_patch.conf
+ │   |-- run_tests.py
+ │   |-- testcases.yaml
+ │   |-- tier_builder.py
+ │   `-- tier_handler.py
+ |-- cli
+ │   |-- cli_base.py
+ │   |-- commands
+ │   │   |-- cli_env.py
+ │   │   |-- cli_os.py
+ │   │   |-- cli_testcase.py
+ │   │   `-- cli_tier.py
+ │   |-- functest-complete.sh
+ |-- core
+ │   |-- feature.py
+ │   |-- testcase.py
+ │   |-- unit.py
+ │   `-- vnf.py
+ |-- energy
+ │   |-- energy.py
+ │   `-- energy.pyc
+ |-- opnfv_tests
+ │   |-- mano
+ │   │   |-- orchestra.py
+ │   |-- openstack
+ │   │   |-- rally
+ │   │   |-- refstack_client
+ │   │   |-- snaps
+ │   │   |-- tempest
+ │   │   `-- vping
+ │   |-- sdn
+ │   │   |-- odl
+ │   │   `-- onos
+ │   `-- vnf
+ │   |-- aaa
+ │   |-- ims
+ │   `-- router
+ |-- tests
+ │   `-- unit
+ │   |-- ci
+ │   |-- cli
+ │   |-- core
+ │   |-- energy
+ │   |-- features
+ │   |-- odl
+ │   |-- openstack
+ │   |-- opnfv_tests
+ │   |-- test_utils.py
+ │   |-- utils
+ │   `-- vnf
+ |-- utils
+ | |-- config.py
+ | |-- constants.py
+ | |-- decorators.py
+ | |-- env.py
+ | |-- functest_utils.py
+ | |-- functest_vacation.py
+ | |-- openstack_clean.py
+ | |-- openstack_snapshot.py
+ | |-- openstack_tacker.py
+ | `-- openstack_utils.py
+ |-- requirements.txt
+ |-- setup.cfg
+ |-- setup.py
+ |-- test-requirements.txt
+ |-- tox.ini
+ |-- upper-constraints.txt
+
+ (Note: All *.pyc files removed from above list for brevity...)
+
+We may distinguish several directories, the first level has 5 directories:
+
+* **api**: This directory is dedicated for the internal Functest API and the API
+ (framework) documentations.
* **commons**: This directory is dedicated for storage of traffic
profile or any other test inputs that could be reused by any test
project.
@@ -480,7 +538,7 @@ destroy it::
docker rm -f <CONTAINER_ID>
-Check the Docker documentation dockerdocs_ for more information.
+Check the Docker documentation [`dockerdocs`_] for more information.
Preparing the Functest environment
----------------------------------
@@ -490,7 +548,7 @@ CLI utility is available to perform the needed environment preparation
action. Once the environment is prepared, the **functest** CLI utility
can be used to run different functional tests. The usage of the
**functest** CLI utility to run tests is described further in the
-Functest User Guide `OPNFV_FuncTestUserGuide`_
+`Functest User Guide`_
Prior to commencing the Functest environment preparation, we can check
the initial status of the environment. Issue the **functest env status**
@@ -782,9 +840,63 @@ and install the **docker-engine**. The instructions conclude with a
"test pull" of a sample "Hello World" docker container. This should now
work with the above pre-requisite actions.
-.. _dockerdocs: https://docs.docker.com/
-.. _dockerhub: https://hub.docker.com/r/opnfv/functest/
-.. _Proxy: https://docs.docker.com/engine/admin/systemd/#http-proxy
-.. _FunctestDockerTags: https://hub.docker.com/r/opnfv/functest/tags/
-.. _InstallDockerCentOS: https://docs.docker.com/engine/installation/linux/centos/
-.. _OPNFV_FuncTestUserGuide: http://artifacts.opnfv.org/functest/docs/userguide/index.html
+
+Installation and Configuration (Alpine)
+=======================================
+
+Introduction to Alpine
+----------------------
+Alpine container have been introduced in Euphrates and released as experimental.
+Alpine allows Functest testing in several very light container and thanks to
+the refactoring on dependency management shoudl allow the creation of light and
+fully customized docker files
+
+Functest Alpine
+---------------
+Docker files are available on the the dockerhub:
+
+ * opnfv/functest-core
+ * opnfv/functest-healthcheck
+ * opnfv/functest-smoke
+ * opnfv/functest-features
+ * opnfv/functest-components
+ * opnfv/functest-vnf
+
+
+Preparing your environment
+--------------------------
+
+cat env::
+
+ INSTALLER_TYPE=XXX
+ INSTALLER_IP=XXX
+ EXTERNAL_NETWORK=XXX
+
+cat openstack.creds::
+
+ export OS_AUTH_URL=XXX
+ export OS_USER_DOMAIN_NAME=XXX
+ export OS_PROJECT_DOMAIN_NAME=XXX
+ export OS_USERNAME=XXX
+ export OS_TENANT_NAME=XXX
+ export OS_PROJECT_NAME=XXX
+ export OS_PASSWORD=XXX
+ export OS_VOLUME_API_VERSION=XXX
+ export OS_IDENTITY_API_VERSION=XXX
+ export OS_IMAGE_API_VERSION=XXX
+
+md5sum images/*md5sum images/*::
+
+ c03e55c22b6fb2127e7de391b488d8d6 `images/CentOS-7-x86_64-GenericCloud.qcow2`_
+ f8ab98ff5e73ebab884d80c9dc9c7290 `images/cirros-0.3.5-x86_64-disk.img`_
+ 845c9b0221469f9e0f4d7ea0039ab5f2 `images/ubuntu-14.04-server-cloudimg-amd64-disk1.img`_
+
+.. _`dockerdocs`: https://docs.docker.com/
+.. _`dockerhub`: https://hub.docker.com/r/opnfv/functest/
+.. _`Proxy`: https://docs.docker.com/engine/admin/systemd/#http-proxy
+.. _`FunctestDockerTags`: https://hub.docker.com/r/opnfv/functest/tags/
+.. _`InstallDockerCentOS`: https://docs.docker.com/engine/installation/linux/centos/
+.. _`Functest User Guide`: http://docs.opnfv.org/en/stable-danube/submodules/functest/docs/testing/user/userguide/index.html
+:: _`images/CentOS-7-x86_64-GenericCloud.qcow2` http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img
+:: _`images/cirros-0.3.5-x86_64-disk.img` https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-amd64-disk1.img
+:: _`images/ubuntu-14.04-server-cloudimg-amd64-disk1.img` https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2
diff --git a/docs/testing/user/configguide/index.rst b/docs/testing/user/configguide/index.rst
index 737f0ba7c..69c41660a 100644
--- a/docs/testing/user/configguide/index.rst
+++ b/docs/testing/user/configguide/index.rst
@@ -113,170 +113,23 @@ upstream communities.
The functional test cases are described in the Functest User Guide `[2]`_
-
-Prerequisites
-=============
-The OPNFV deployment is out of the scope of this document but it can be
-found in http://docs.opnfv.org.
-The OPNFV platform is considered as the SUT in this document.
-
-Several prerequisites are needed for Functest:
-
- #. A Jumphost to run Functest on
- #. A Docker daemon shall be installed on the Jumphost
- #. A public/external network created on the SUT
- #. An admin/management network created on the SUT
- #. Connectivity from the Jumphost to the SUT public/external network
- #. Connectivity from the Jumphost to the SUT admin/management network
-
-WARNING: Connectivity from Jumphost is essential and it is of paramount
-importance to make sure it is working before even considering to install
-and run Functest. Make also sure you understand how your networking is
-designed to work.
-
-NOTE: **Jumphost** refers to any server which meets the previous
-requirements. Normally it is the same server from where the OPNFV
-deployment has been triggered previously.
-
-NOTE: If your Jumphost is operating behind a company http proxy and/or
-firewall, please consult first the section `Proxy Support`_, towards
-the end of this document. The section details some tips/tricks which
-*may* be of help in a proxified environment.
-
-Docker installation
--------------------
-Docker installation and configuration is only needed to be done once
-through the life cycle of Jumphost.
-
-If your Jumphost is based on Ubuntu, SUSE, RHEL or CentOS linux, please
-consult the references below for more detailed instructions. The
-commands below are offered as a short reference.
-
-*Tip:* For running docker containers behind the proxy, you need first
-some extra configuration which is described in section
-`Docker Installation on CentOS behind http proxy`_. You should follow
-that section before installing the docker engine.
-
-Docker installation needs to be done as root user. You may use other
-userid's to create and run the actual containers later if so desired.
-Log on to your Jumphost as root user and install the Docker Engine
-(e.g. for CentOS family)::
-
- curl -sSL https://get.docker.com/ | sh
- systemctl start docker
-
- *Tip:* If you are working through proxy, please set the https_proxy
- environment variable first before executing the curl command.
-
-Add your user to docker group to be able to run commands without sudo::
-
- sudo usermod -aG docker <your_user>
-
-A reconnection is needed. There are 2 ways for this:
- #. Re-login to your account
- #. su - <username>
-
-References - Installing Docker Engine on different Linux Operating Systems:
- * Ubuntu_
- * RHEL_
- * CentOS_
- * SUSE_
-
-.. _Ubuntu: https://docs.docker.com/engine/installation/linux/ubuntulinux/
-.. _RHEL: https://docs.docker.com/engine/installation/linux/rhel/
-.. _CentOS: https://docs.docker.com/engine/installation/linux/centos/
-.. _SUSE: https://docs.docker.com/engine/installation/linux/suse/
-
-Public/External network on SUT
-------------------------------
-Some of the tests against the VIM (Virtual Infrastructure Manager) need
-connectivity through an existing public/external network in order to
-succeed. This is needed, for example, to create floating IPs to access
-VM instances through the public/external network (i.e. from the Docker
-container).
-
-By default, the four OPNFV installers provide a fresh installation with
-a public/external network created along with a router. Make sure that
-the public/external subnet is reachable from the Jumphost.
-
-*Hint:* For the given OPNFV Installer in use, the IP sub-net address
-used for the public/external network is usually a planning item and
-should thus be known. Consult the OPNFV Configuration guide `[4]`_, and
-ensure you can reach each node in the SUT, from the Jumphost using the
-'ping' command using the respective IP address on the public/external
-network for each node in the SUT. The details of how to determine the
-needed IP addresses for each node in the SUT may vary according to the
-used installer and are therefore ommitted here.
-
-Connectivity to Admin/Management network on SUT
------------------------------------------------
-Some of the Functest tools need to have access to the OpenStack
-admin/management network of the controllers `[1]`_.
-
-For this reason, check the connectivity from the Jumphost to all the
-controllers in cluster in the OpenStack admin/management network range.
-
-Installation and configuration
-==============================
+.. include:: ./prerequisites.rst
.. include:: ./configguide.rst
-Integration in CI
-=================
-In CI we use the Docker image and execute the appropriate commands within the
-container from Jenkins.
-
-Docker creation in set-functest-env builder `[3]`_::
-
- envs="-e INSTALLER_TYPE=${INSTALLER_TYPE} -e INSTALLER_IP=${INSTALLER_IP} -e NODE_NAME=${NODE_NAME}"
- [...]
- docker pull opnfv/functest:$DOCKER_TAG >/dev/null
- cmd="sudo docker run -id ${envs} ${volumes} ${custom_params} ${TESTCASE_OPTIONS} opnfv/functest:${DOCKER_TAG} /bin/bash"
- echo "Functest: Running docker run command: ${cmd}"
- ${cmd} >${redirect}
- sleep 5
- container_id=$(docker ps | grep "opnfv/functest:${DOCKER_TAG}" | awk '{print $1}' | head -1)
- echo "Container ID=${container_id}"
- if [ -z ${container_id} ]; then
- echo "Cannot find opnfv/functest container ID ${container_id}. Please check if it is existing."
- docker ps -a
- exit 1
- fi
- echo "Starting the container: docker start ${container_id}"
- docker start ${container_id}
- sleep 5
- docker ps >${redirect}
- if [ $(docker ps | grep "opnfv/functest:${DOCKER_TAG}" | wc -l) == 0 ]; then
- echo "The container opnfv/functest with ID=${container_id} has not been properly started. Exiting..."
- exit 1
- fi
-
- cmd="python ${FUNCTEST_REPO_DIR}/functest/ci/prepare_env.py start"
- echo "Executing command inside the docker: ${cmd}"
- docker exec ${container_id} ${cmd}
-
+.. include:: ./ci.rst
-Test execution in functest-all builder `[3]`_::
- branch=${GIT_BRANCH##*/}
- echo "Functest: run $FUNCTEST_SUITE_NAME on branch ${branch}"
- cmd="functest testcase run $FUNCTEST_SUITE_NAME"
- fi
- container_id=$(docker ps -a | grep opnfv/functest | awk '{print $1}' | head -1)
- docker exec $container_id $cmd
- ret_value=$?
- exit $ret_value
+References
+==========
-Docker clean in functest-cleanup builder `[3]`_ calling docker rm and docker rmi
+`[1]`_ : Keystone and public end point constraint
+`[2]`_ : Functest User guide
-References
-==========
-.. _`[1]`: https://ask.openstack.org/en/question/68144/keystone-unable-to-use-the-public-endpoint/
-.. _`[2]`: http://artifacts.opnfv.org/functest/docs/userguide/index.html
-.. _`[3]`: https://git.opnfv.org/cgit/releng/tree/jjb/functest/functest-ci-jobs.yml
-.. _`[4]`: http://artifacts.opnfv.org/functest/danube/docs/configguide/index.html
+`[3]`_ : Functest Jenkins jobs
+`[4]`_ : Functest Configuration guide
`OPNFV main site`_
@@ -284,5 +137,9 @@ References
IRC support channel: #opnfv-functest
+.. _`[1]`: https://ask.openstack.org/en/question/68144/keystone-unable-to-use-the-public-endpoint/
+.. _`[2]`: http://docs.opnfv.org/en/stable-danube/submodules/functest/docs/testing/user/userguide/index.html
+.. _`[3]`: https://git.opnfv.org/cgit/releng/tree/jjb/functest/functest-ci-jobs.yml
+.. _`[4]`: http://docs.opnfv.org/en/stable-danube/submodules/functest/docs/testing/user/configguide/index.html
.. _`OPNFV main site`: http://www.opnfv.org
.. _`Functest page`: https://wiki.opnfv.org/functest
diff --git a/docs/testing/user/configguide/prerequisites.rst b/docs/testing/user/configguide/prerequisites.rst
new file mode 100644
index 000000000..94f676008
--- /dev/null
+++ b/docs/testing/user/configguide/prerequisites.rst
@@ -0,0 +1,104 @@
+Prerequisites
+=============
+The OPNFV deployment is out of the scope of this document but it can be
+found in http://docs.opnfv.org.
+The OPNFV platform is considered as the SUT in this document.
+
+Several prerequisites are needed for Functest:
+
+ #. A Jumphost to run Functest on
+ #. A Docker daemon shall be installed on the Jumphost
+ #. A public/external network created on the SUT
+ #. An admin/management network created on the SUT
+ #. Connectivity from the Jumphost to the SUT public/external network
+ #. Connectivity from the Jumphost to the SUT admin/management network
+
+WARNING: Connectivity from Jumphost is essential and it is of paramount
+importance to make sure it is working before even considering to install
+and run Functest. Make also sure you understand how your networking is
+designed to work.
+
+NOTE: **Jumphost** refers to any server which meets the previous
+requirements. Normally it is the same server from where the OPNFV
+deployment has been triggered previously.
+
+NOTE: If your Jumphost is operating behind a company http proxy and/or
+firewall, please consult first the section `Proxy Support`_, towards
+the end of this document. The section details some tips/tricks which
+*may* be of help in a proxified environment.
+
+Docker installation
+-------------------
+Docker installation and configuration is only needed to be done once
+through the life cycle of Jumphost.
+
+If your Jumphost is based on Ubuntu, SUSE, RHEL or CentOS linux, please
+consult the references below for more detailed instructions. The
+commands below are offered as a short reference.
+
+*Tip:* For running docker containers behind the proxy, you need first
+some extra configuration which is described in section
+`Docker Installation on CentOS behind http proxy`_. You should follow
+that section before installing the docker engine.
+
+Docker installation needs to be done as root user. You may use other
+userid's to create and run the actual containers later if so desired.
+Log on to your Jumphost as root user and install the Docker Engine
+(e.g. for CentOS family)::
+
+ curl -sSL https://get.docker.com/ | sh
+ systemctl start docker
+
+ *Tip:* If you are working through proxy, please set the https_proxy
+ environment variable first before executing the curl command.
+
+Add your user to docker group to be able to run commands without sudo::
+
+ sudo usermod -aG docker <your_user>
+
+A reconnection is needed. There are 2 ways for this:
+ #. Re-login to your account
+ #. su - <username>
+
+References - Installing Docker Engine on different Linux Operating Systems:
+ * Ubuntu_
+ * RHEL_
+ * CentOS_
+ * SUSE_
+
+.. _Ubuntu: https://docs.docker.com/engine/installation/linux/ubuntulinux/
+.. _RHEL: https://docs.docker.com/engine/installation/linux/rhel/
+.. _CentOS: https://docs.docker.com/engine/installation/linux/centos/
+.. _SUSE: https://docs.docker.com/engine/installation/linux/suse/
+
+Public/External network on SUT
+------------------------------
+Some of the tests against the VIM (Virtual Infrastructure Manager) need
+connectivity through an existing public/external network in order to
+succeed. This is needed, for example, to create floating IPs to access
+VM instances through the public/external network (i.e. from the Docker
+container).
+
+By default, the four OPNFV installers provide a fresh installation with
+a public/external network created along with a router. Make sure that
+the public/external subnet is reachable from the Jumphost.
+
+*Hint:* For the given OPNFV Installer in use, the IP sub-net address
+used for the public/external network is usually a planning item and
+should thus be known. Consult the OPNFV Configuration guide `[4]`_, and
+ensure you can reach each node in the SUT, from the Jumphost using the
+'ping' command using the respective IP address on the public/external
+network for each node in the SUT. The details of how to determine the
+needed IP addresses for each node in the SUT may vary according to the
+used installer and are therefore ommitted here.
+
+Connectivity to Admin/Management network on SUT
+-----------------------------------------------
+Some of the Functest tools need to have access to the OpenStack
+admin/management network of the controllers `[1]`_.
+
+For this reason, check the connectivity from the Jumphost to all the
+controllers in cluster in the OpenStack admin/management network range.
+
+.. _`[1]`: https://ask.openstack.org/en/question/68144/keystone-unable-to-use-the-public-endpoint/
+.. _`[4]`: http://artifacts.opnfv.org/functest/danube/docs/configguide/index.html
diff --git a/docs/testing/user/userguide/index.rst b/docs/testing/user/userguide/index.rst
index 62e0c076c..4b66eacd2 100644
--- a/docs/testing/user/userguide/index.rst
+++ b/docs/testing/user/userguide/index.rst
@@ -20,8 +20,8 @@ Version history
| | | Column Gaynor | |
+------------+----------+------------------+----------------------------------+
| 2017-01-23 | 1.0.1 | Morgan Richomme | Adaptations for Danube |
-| | | | |
-| | | | |
++------------+----------+------------------+----------------------------------+
+| 2017-08-16 | 1.0.2 | Morgan Richomme | Adaptations for Euphrates |
+------------+----------+------------------+----------------------------------+
@@ -36,591 +36,63 @@ a Functest CLI utility is introduced for an easier execution of test procedures.
properly deployed and that all instructions described in this guide are to be
performed from *inside* the deployed Functest Docker container.
-.. include:: ./introduction.rst
-
-The different test cases are described in the remaining sections of this document.
-
-VIM (Virtualized Infrastructure Manager)
-----------------------------------------
-
-Healthcheck tests
-^^^^^^^^^^^^^^^^^
-In Danube, healthcheck tests have been refactored and rely on SNAPS, a
-OPNFV middleware project.
-
-SNAPS stands for "SDN/NFV Application development Platform and Stack".
-SNAPS is an object-oriented OpenStack library packaged with tests that exercise
-OpenStack.
-More information on SNAPS can be found in  `[13]`_
-
-Three tests are declared as healthcheck tests and can be used for gating by the
-installer, they cover functionally the tests previously done by healthcheck
-test case.
-
-The tests are:
-
-
- * *connection_check*
- * *api_check*
- * *snaps_health_check*
-
-Connection_check consists in 9 test cases (test duration < 5s) checking the
-connectivity with Glance, Keystone, Neutron, Nova and the external network.
-
-Api_check verifies the retrieval of OpenStack clients: Keystone, Glance,
-Neutron and Nova and may perform some simple queries. When the config value of
-snaps.use_keystone is True, functest must have access to the cloud's private
-network. This suite consists in 49 tests (test duration < 2 minutes).
-
-snaps_health_check creates instance, allocate floating IP, connect to the VM.
-This test replaced the previous Colorado healthcheck test.
-
-Self-obviously, successful completion of the 'healthcheck' testcase is a
-necessary pre-requisite for the execution of all other test Tiers.
-
-
-vPing_ssh
-^^^^^^^^^
-
-Given the script **ping.sh**::
-
- #!/bin/sh
- while true; do
- ping -c 1 $1 2>&1 >/dev/null
- RES=$?
- if [ "Z$RES" = "Z0" ] ; then
- echo 'vPing OK'
- break
- else
- echo 'vPing KO'
- fi
- sleep 1
- done
-
-
-The goal of this test is to establish an SSH connection using a floating IP
-on the Public/External network and verify that 2 instances can talk over a Private
-Tenant network::
-
- vPing_ssh test case
- +-------------+ +-------------+
- | | | |
- | | Boot VM1 with IP1 | |
- | +------------------->| |
- | Tester | | System |
- | | Boot VM2 | Under |
- | +------------------->| Test |
- | | | |
- | | Create floating IP | |
- | +------------------->| |
- | | | |
- | | Assign floating IP | |
- | | to VM2 | |
- | +------------------->| |
- | | | |
- | | Establish SSH | |
- | | connection to VM2 | |
- | | through floating IP| |
- | +------------------->| |
- | | | |
- | | SCP ping.sh to VM2 | |
- | +------------------->| |
- | | | |
- | | VM2 executes | |
- | | ping.sh to VM1 | |
- | +------------------->| |
- | | | |
- | | If ping: | |
- | | exit OK | |
- | | else (timeout): | |
- | | exit Failed | |
- | | | |
- +-------------+ +-------------+
-
-This test can be considered as an "Hello World" example.
-It is the first basic use case which **must** work on any deployment.
-
-vPing_userdata
-^^^^^^^^^^^^^^
-
-This test case is similar to vPing_ssh but without the use of Floating IPs
-and the Public/External network to transfer the ping script.
-Instead, it uses Nova metadata service to pass it to the instance at booting time.
-As vPing_ssh, it checks that 2 instances can talk to
-each other on a Private Tenant network::
-
- vPing_userdata test case
- +-------------+ +-------------+
- | | | |
- | | Boot VM1 with IP1 | |
- | +------------------->| |
- | | | |
- | | Boot VM2 with | |
- | | ping.sh as userdata| |
- | | with IP1 as $1. | |
- | +------------------->| |
- | Tester | | System |
- | | VM2 exeutes ping.sh| Under |
- | | (ping IP1) | Test |
- | +------------------->| |
- | | | |
- | | Monitor nova | |
- | | console-log VM 2 | |
- | | If ping: | |
- | | exit OK | |
- | | else (timeout) | |
- | | exit Failed | |
- | | | |
- +-------------+ +-------------+
-
-When the second VM boots it will execute the script passed as userdata
-automatically. The ping will be detected by periodically capturing the output
-in the console-log of the second VM.
-
-
-Tempest
-^^^^^^^
-
-Tempest `[2]`_ is the reference OpenStack Integration test suite.
-It is a set of integration tests to be run against a live OpenStack cluster.
-Tempest has suites of tests for:
-
- * OpenStack API validation
- * Scenarios
- * Other specific tests useful in validating an OpenStack deployment
-
-Functest uses Rally `[3]`_ to run the Tempest suite.
-Rally generates automatically the Tempest configuration file **tempest.conf**.
-Before running the actual test cases,
-Functest creates the needed resources (user, tenant) and
-updates the appropriate parameters into the configuration file.
-
-When the Tempest suite is executed, each test duration is measured and the full
-console output is stored to a *log* file for further analysis.
-
-The Tempest testcases are distributed across two
-Tiers:
-
- * Smoke Tier - Test Case 'tempest_smoke_serial'
- * Components Tier - Test case 'tempest_full_parallel'
-
-NOTE: Test case 'tempest_smoke_serial' executes a defined set of tempest smoke
-tests with a single thread (i.e. serial mode). Test case 'tempest_full_parallel'
-executes all defined Tempest tests using several concurrent threads
-(i.e. parallel mode). The number of threads activated corresponds to the number
-of available logical CPUs.
-
-The goal of the Tempest test suite is to check the basic functionalities of the
-different OpenStack components on an OPNFV fresh installation, using the
-corresponding REST API interfaces.
-
-
-Rally bench test suites
-^^^^^^^^^^^^^^^^^^^^^^^
-
-Rally `[3]`_ is a benchmarking tool that answers the question:
-
-*How does OpenStack work at scale?*
-
-The goal of this test suite is to benchmark all the different OpenStack modules and
-get significant figures that could help to define Telco Cloud KPIs.
-
-The OPNFV Rally scenarios are based on the collection of the actual Rally scenarios:
-
- * authenticate
- * cinder
- * glance
- * heat
- * keystone
- * neutron
- * nova
- * quotas
- * requests
-
-A basic SLA (stop test on errors) has been implemented.
-
-The Rally testcases are distributed across two Tiers:
-
- * Smoke Tier - Test Case 'rally_sanity'
- * Components Tier - Test case 'rally_full'
-
-NOTE: Test case 'rally_sanity' executes a limited number of Rally smoke test
-cases. Test case 'rally_full' executes the full defined set of Rally tests.
-
-
-Refstack-client to run Defcore testcases
------------------------------------------
-
-Refstack-client `[8]`_ is a command line utility that allows you to
-execute Tempest test runs based on configurations you specify.
-It is the official tool to run Defcore `[9]`_ testcases,
-which focuses on testing interoperability between OpenStack clouds.
-
-Refstack-client is integrated in Functest, consumed by Dovetail, which
-intends to define and provide a set of OPNFV related validation criteria
-that will provide input for the evaluation of the use of OPNFV trademarks.
-This progress is under the guideline of Compliance Verification Program(CVP).
-
-Defcore testcases
-^^^^^^^^^^^^^^^^^^
-
-*Danube Release*
-
-Set of DefCore tempest test cases not flagged and required.
-According to `[10]`_, some tests are still flagged due to outstanding bugs
-in the Tempest library, particularly tests that require SSH. Refstack developers
-are working on correcting these bugs upstream. Please note that although some tests
-are flagged because of bugs, there is still an expectation that the capabilities
-covered by the tests are available. It only contains Openstack core compute
-(no object storage). The approved guidelines (2016.08) are valid for Kilo,
-Liberty, Mitaka and Newton releases of OpenStack.
-The list can be generated using the Rest API from RefStack project:
-https://refstack.openstack.org/api/v1/guidelines/2016.08/tests?target=compute&type=required&alias=true&flag=false
-
-Running methods
-^^^^^^^^^^^^^^^
-
-Two running methods are provided after refstack-client integrated into
-Functest, Functest command line and manually, respectively.
-
-By default, for Defcore test cases run by Functest command line,
-are run followed with automatically generated
-configuration file, i.e., refstack_tempest.conf. In some circumstances,
-the automatic configuration file may not quite satisfied with the SUT,
-Functest also inherits the refstack-client command line and provides a way
-for users to set its configuration file according to its own SUT manually.
-
-*command line*
-
-Inside the Functest container, first to prepare Functest environment:
-
-::
-
- functest env prepare
-
-then to run default defcore testcases by using refstack-client:
-
-::
-
- functest testcase run refstack_defcore
-
-In OPNFV Continuous Integration(CI) system, the command line method is used.
-
-*manually*
-
-Inside the Functest container, first to prepare the refstack virtualenv:
-
-::
-
- cd /home/opnfv/repos/refstack-client
- source .venv/bin/activate
-
-then prepare the tempest configuration file and the testcases want to run with the SUT,
-run the testcases with:
-
-::
-
- ./refstack-client test -c <Path of the tempest configuration file to use> -v --test-list <Path or URL of test list>
-
-using help for more information:
-
-::
-
- ./refstack-client --help
- ./refstack-client test --help
-
-Reference tempest configuration
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-*command line method*
-
-When command line method is used, the default tempest configuration file
-is generated by Rally.
-
-*manually*
-
-When running manually is used, recommended way to generate tempest configuration
-file is:
-
-::
-
- cd /usr/lib/python2.7/site-packages/functest/opnfv_tests/openstack/refstack_client
- python tempest_conf.py
+.. include:: ./test_overview.rst
-a file called tempest.conf is stored in the current path by default, users can do
-some adjustment according to the SUT:
+.. include:: ./test_details.rst
-::
-
- vim refstack_tempest.conf
-
-a reference article can be used `[15]`_.
-
-
-snaps_smoke
-------------
-
-This test case contains tests that setup and destroy environments with VMs with
-and without Floating IPs with a newly created user and project. Set the config
-value snaps.use_floating_ips (True|False) to toggle this functionality. When
-the config value of snaps.use_keystone is True, Functest must have access
-the cloud's private network.
-This suite consists in 38 tests (test duration < 10 minutes)
-
-
-SDN Controllers
----------------
-
-There are currently 3 available controllers:
-
- * OpenDaylight (ODL)
- * ONOS
- * OpenContrail (OCL)
-
-OpenDaylight
-^^^^^^^^^^^^
-
-The OpenDaylight (ODL) test suite consists of a set of basic tests inherited
-from the ODL project using the Robot `[11]`_ framework.
-The suite verifies creation and deletion of networks, subnets and ports with
-OpenDaylight and Neutron.
-
-The list of tests can be described as follows:
-
- * Basic Restconf test cases
- * Connect to Restconf URL
- * Check the HTTP code status
-
- * Neutron Reachability test cases
- * Get the complete list of neutron resources (networks, subnets, ports)
-
- * Neutron Network test cases
- * Check OpenStack networks
- * Check OpenDaylight networks
- * Create a new network via OpenStack and check the HTTP status code returned by Neutron
- * Check that the network has also been successfully created in OpenDaylight
-
- * Neutron Subnet test cases
- * Check OpenStack subnets
- * Check OpenDaylight subnets
- * Create a new subnet via OpenStack and check the HTTP status code returned by Neutron
- * Check that the subnet has also been successfully created in OpenDaylight
-
- * Neutron Port test cases
- * Check OpenStack Neutron for known ports
- * Check OpenDaylight ports
- * Create a new port via OpenStack and check the HTTP status code returned by Neutron
- * Check that the new port has also been successfully created in OpenDaylight
-
- * Delete operations
- * Delete the port previously created via OpenStack
- * Check that the port has been also successfully deleted in OpenDaylight
- * Delete previously subnet created via OpenStack
- * Check that the subnet has also been successfully deleted in OpenDaylight
- * Delete the network created via OpenStack
- * Check that the network has also been successfully deleted in OpenDaylight
-
-Note: the checks in OpenDaylight are based on the returned HTTP status
-code returned by OpenDaylight.
-
-
-ONOS
-^^^^
-
-TestON Framework is used to test the ONOS SDN controller functions.
-The test cases deal with L2 and L3 functions.
-The ONOS test suite can be run on any ONOS compliant scenario.
-
-The test cases are described as follows:
-
- * onosfunctest: The main executable file contains the initialization of
- the docker environment and functions called by FUNCvirNetNB and
- FUNCvirNetNBL3
+.. include:: ./runfunctest.rst
- * FUNCvirNetNB
+.. include:: ./test_results.rst
- * Create Network: Post Network data and check it in ONOS
- * Update Network: Update the Network and compare it in ONOS
- * Delete Network: Delete the Network and check if it's NULL in ONOS or
- not
- * Create Subnet: Post Subnet data and check it in ONOS
- * Update Subnet: Update the Subnet and compare it in ONOS
- * Delete Subnet: Delete the Subnet and check if it's NULL in ONOS or not
- * Create Port: Post Port data and check it in ONOS
- * Update Port: Update the Port and compare it in ONOS
- * Delete Port: Delete the Port and check if it's NULL in ONOS or not
+.. include:: ./reporting.rst
- * FUNCvirNetNBL3
+.. figure:: ../../../images/functest-reporting-status.png
+ :align: center
+ :alt: Functest reporting portal Fuel status page
- * Create Router: Post data for create Router and check it in ONOS
- * Update Router: Update the Router and compare it in ONOS
- * Delete Router: Delete the Router data and check it in ONOS
- * Create RouterInterface: Post Router Interface data to an existing Router
- and check it in ONOS
- * Delete RouterInterface: Delete the RouterInterface and check the Router
- * Create FloatingIp: Post data for create FloatingIp and check it in ONOS
- * Update FloatingIp: Update the FloatingIp and compare it in ONOS
- * Delete FloatingIp: Delete the FloatingIp and check that it is 'NULL' in
- ONOS
- * Create External Gateway: Post data to create an External Gateway for an
- existing Router and check it in ONOS
- * Update External Gateway: Update the External Gateway and compare the change
- * Delete External Gateway: Delete the External Gateway and check that it is
- 'NULL' in ONOS
+.. include:: ./troubleshooting.rst
-Features
---------
-
-In Danube, Functest supports the integration of:
-
- * barometer
- * bgpvpn
- * doctor
- * domino
- * fds
- * multisite
- * odl-sfc
- * promise
- * security_scan
-
-Please refer to the dedicated feature user guides for details.
-
-
-VNF
----
-
-
-cloudify_ims
-^^^^^^^^^^^^
-The IP Multimedia Subsystem or IP Multimedia Core Network Subsystem (IMS) is an
-architectural framework for delivering IP multimedia services.
-
-vIMS has been integrated in Functest to demonstrate the capability to deploy a
-relatively complex NFV scenario on the OPNFV platform. The deployment of a complete
-functional VNF allows the test of most of the essential functions needed for a
-NFV platform.
-
-The goal of this test suite consists of:
-
- * deploy a VNF orchestrator (Cloudify)
- * deploy a Clearwater vIMS (IP Multimedia Subsystem) VNF from this
- orchestrator based on a TOSCA blueprint defined in `[5]`_
- * run suite of signaling tests on top of this VNF
-
-The Clearwater architecture is described as follows:
+References
+==========
-.. figure:: ../../../images/clearwater-architecture.png
- :align: center
- :alt: vIMS architecture
+`[1]`_: Functest configuration guide
-orchestra_ims
-^^^^^^^^^^^^^
-Orchestra test case deals with the deployment of OpenIMS with OpenBaton
-orchestrator.
+`[2]`_: OpenStack Tempest documentation
-parser
-^^^^^^
+`[3]`_: Rally documentation
-See parser user guide for details: `[12]`_
+`[4]`_: Functest in depth (Danube)
+`[5]`_: Clearwater vIMS blueprint
-vyos-vrouter
-^^^^^^^^^^^^
+`[6]`_: NIST web site
-This test case deals with the deployment and the test of vyos vrouter with
-Cloudify orchestrator. The test case can do testing for interchangeability of
-BGP Protocol using vyos.
+`[7]`_: OpenSCAP web site
-The Workflow is as follows:
- * Deploy
- Deploy VNF Testing topology by Cloudify using blueprint.
- * Configuration
- Setting configuration to Target VNF and reference VNF using ssh
- * Run
- Execution of test command for test item written YAML format file.
- Check VNF status and behavior.
- * Reporting
- Output of report based on result using JSON format.
+`[8]`_: Refstack client
-The vyos-vrouter architecture is described in `[14]`_
+`[9]`_: Defcore
+`[10]`_: OpenStack interoperability procedure
+`[11]`_: Robot Framework web site
-.. include:: ./runfunctest.rst
+`[12]`_: Functest User guide
+`[13]`_: SNAPS wiki
-Test results
-============
+`[14]`_: vRouter
-Manual testing
---------------
-
-In manual mode test results are displayed in the console and result files
-are put in /home/opnfv/functest/results.
-
-Automated testing
---------------
-
-In automated mode, test results are displayed in jenkins logs, a summary is provided
-at the end of the job and can be described as follow::
-
- +==================================================================================================================================================+
- | FUNCTEST REPORT |
- +==================================================================================================================================================+
- | |
- | Deployment description: |
- | INSTALLER: fuel |
- | SCENARIO: os-odl_l2-nofeature-ha |
- | BUILD TAG: jenkins-functest-fuel-baremetal-daily-master-324 |
- | CI LOOP: daily |
- | |
- +=========================+===============+============+===============+===========================================================================+
- | TEST CASE | TIER | DURATION | RESULT | URL |
- +=========================+===============+============+===============+===========================================================================+
- | connection_check | healthcheck | 00:02 | PASS | http://testresults.opnfv.org/test/api/v1/results/58cb62b34079ac000a42e3fe |
- +-------------------------+---------------+------------+---------------+---------------------------------------------------------------------------+
- | api_check | healthcheck | 01:15 | PASS | http://testresults.opnfv.org/test/api/v1/results/58cb62fe4079ac000a42e3ff |
- +-------------------------+---------------+------------+---------------+---------------------------------------------------------------------------+
- | snaps_health_check | healthcheck | 00:50 | PASS | http://testresults.opnfv.org/test/api/v1/results/58cb63314079ac000a42e400 |
- +-------------------------+---------------+------------+---------------+---------------------------------------------------------------------------+
- | vping_ssh | smoke | 01:10 | PASS | http://testresults.opnfv.org/test/api/v1/results/58cb63654079ac000a42e401 |
- +-------------------------+---------------+------------+---------------+---------------------------------------------------------------------------+
- | vping_userdata | smoke | 00:59 | PASS | http://testresults.opnfv.org/test/api/v1/results/58cb63a14079ac000a42e403 |
- +-------------------------+---------------+------------+---------------+---------------------------------------------------------------------------+
- | tempest_smoke_serial | smoke | 12:57 | PASS | http://testresults.opnfv.org/test/api/v1/results/58cb66bd4079ac000a42e408 |
- +-------------------------+---------------+------------+---------------+---------------------------------------------------------------------------+
- | rally_sanity | smoke | 10:22 | PASS | http://testresults.opnfv.org/test/api/v1/results/58cb692b4079ac000a42e40a |
- +-------------------------+---------------+------------+---------------+---------------------------------------------------------------------------+
- | refstack_defcore | smoke | 12:28 | PASS | http://testresults.opnfv.org/test/api/v1/results/58cb6c184079ac000a42e40c |
- +-------------------------+---------------+------------+---------------+---------------------------------------------------------------------------+
- | snaps_smoke | smoke | 12:04 | PASS | http://testresults.opnfv.org/test/api/v1/results/58cb6eec4079ac000a42e40e |
- +-------------------------+---------------+------------+---------------+---------------------------------------------------------------------------+
- | domino | features | 00:29 | PASS | http://testresults.opnfv.org/test/api/v1/results/58cb6f044079ac000a42e40f |
- +-------------------------+---------------+------------+---------------+---------------------------------------------------------------------------+
-
-
-Results are automatically pushed to the test results database, some additional
-result files are pushed to OPNFV artifact web sites.
-
-Based on the results stored in the result database, a `Functest reporting`_
-portal is also automatically updated. This portal provides information on:
-
- * The overall status per scenario and per installer
- * Tempest: Tempest test case including reported errors per scenario and installer
- * vIMS: vIMS details per scenario and installer
+`[15]`_: Testing OpenStack Tempest part 1
-.. figure:: ../../../images/functest-reporting-status.png
- :align: center
- :alt: Functest reporting portal Fuel status page
-
-.. include:: ./troubleshooting.rst
+`OPNFV main site`_: OPNFV official web site
+`Functest page`_: Functest wiki page
-References
-==========
+IRC support chan: #opnfv-functest
-.. _`[1]`: http://artifacts.opnfv.org/functest/colorado/docs/configguide/#
+.. _`[1]`: http://docs.opnfv.org/en/stable-danube/submodules/functest/docs/testing/user/configguide/index.html
.. _`[2]`: http://docs.openstack.org/developer/tempest/overview.html
.. _`[3]`: https://rally.readthedocs.org/en/latest/index.html
.. _`[4]`: http://events.linuxfoundation.org/sites/events/files/slides/Functest%20in%20Depth_0.pdf
@@ -631,17 +103,10 @@ References
.. _`[9]`: https://github.com/openstack/defcore
.. _`[10]`: https://github.com/openstack/interop/blob/master/2016.08/procedure.rst
.. _`[11]`: http://robotframework.org/
-.. _`[12]`: http://artifacts.opnfv.org/parser/colorado/docs/userguide/index.html
+.. _`[12]`: http://docs.opnfv.org/en/stable-danube/submodules/functest/docs/testing/user/userguide/index.html
.. _`[13]`: https://wiki.opnfv.org/display/PROJ/SNAPS-OO
.. _`[14]`: https://github.com/oolorg/opnfv-functest-vrouter
.. _`[15]`: https://aptira.com/testing-openstack-tempest-part-1/
-
-`OPNFV main site`_
-
-`Functest page`_
-
-IRC support chan: #opnfv-functest
-
.. _`OPNFV main site`: http://www.opnfv.org
.. _`Functest page`: https://wiki.opnfv.org/functest
.. _`OpenRC`: http://docs.openstack.org/user-guide/common/cli_set_environment_variables_using_openstack_rc.html
diff --git a/docs/testing/user/userguide/reporting.rst b/docs/testing/user/userguide/reporting.rst
new file mode 100644
index 000000000..14d22f230
--- /dev/null
+++ b/docs/testing/user/userguide/reporting.rst
@@ -0,0 +1,90 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+
+Test reporting
+==============
+
+An automatic reporting page has been created in order to provide a consistent
+view of the Functest tests on the different scenarios.
+
+In this page, each scenario is evaluated according to test criteria.
+
+The results are collected from the centralized database every day and, per
+scenario. A score is calculated based on the results from the last 10 days.
+This score is the addition of single test scores. Each test case has a success
+criteria reflected in the criteria field from the results.
+
+As an illustration, let's consider the scenario
+os-odl_l2-nofeature-ha scenario, the scenario scoring is the addition of the
+scores of all the runnable tests from the categories (tiers, healthcheck, smoke
+and features) corresponding to this scenario.
+
+ +---------------------+---------+---------+---------+---------+
+ | Test | Apex | Compass | Fuel | Joid |
+ +=====================+=========+=========+=========+=========+
+ | vPing_ssh | X | X | X | X |
+ +---------------------+---------+---------+---------+---------+
+ | vPing_userdata | X | X | X | X |
+ +---------------------+---------+---------+---------+---------+
+ | tempest_smoke_serial| X | X | X | X |
+ +---------------------+---------+---------+---------+---------+
+ | rally_sanity | X | X | X | X |
+ +---------------------+---------+---------+---------+---------+
+ | odl | X | X | X | X |
+ +---------------------+---------+---------+---------+---------+
+ | promise | | | X | X |
+ +---------------------+---------+---------+---------+---------+
+ | doctor | X | | X | |
+ +---------------------+---------+---------+---------+---------+
+ | security_scan | X | | | |
+ +---------------------+---------+---------+---------+---------+
+ | parser | | | X | |
+ +---------------------+---------+---------+---------+---------+
+ | copper | X | | | X |
+ +---------------------+---------+---------+---------+---------+
+ src: os-odl_l2-nofeature-ha Colorado (see release note for the last matrix version)
+
+All the testcases (X) listed in the table are runnable on os-odl_l2-nofeature
+scenarios.
+Please note that other test cases (e.g. sfc_odl, bgpvpn) need ODL configuration
+addons and, as a consequence, specific scenario.
+There are not considered as runnable on the generic odl_l2 scenario.
+
+
+If no result is available or if all the results are failed, the test case get 0
+point.
+If it was successful at least once but not anymore during the 4 runs, the case
+get 1 point (it worked once).
+If at least 3 of the last 4 runs were successful, the case get 2 points.
+If the last 4 runs of the test are successful, the test get 3 points.
+
+In the example above, the target score for fuel/os-odl_l2-nofeature-ha is
+3 x 8 = 24 points and for compass it is 3 x 5 = 15 points .
+
+The scenario is validated per installer when we got 3 points for all individual
+test cases (e.g 24/24 for fuel, 15/15 for compass).
+
+Please note that complex or long duration tests are not considered yet for the
+scoring. In fact the success criteria are not always easy to define and may
+require specific hardware configuration.
+
+Please also note that all the test cases have the same "weight" for the score
+calculation whatever the complexity of the test case. Concretely a vping has the
+same weith than the 200 tempst tests.
+Moreover some installers support more features than others. The more cases your
+scenario is dealing with, the most difficult to rich a good scoring.
+
+Therefore the scoring provides 3 types of indicators:
+
+ * the richness of the scenario: if the target scoring is high, it means that the scenario includes lots of features
+ * the maturity: if the percentage (scoring/target scoring * 100) is high, it means that all the tests are PASS
+ * the stability: as the number of iteration is included in the calculation, the pecentage can be high only if the scenario is run regularly (at least more than 4 iterations over the last 10 days in CI)
+
+In any case, the scoring is used to give feedback to the other projects and
+does not represent an absolute value of the scenario.
+
+See `reporting page`_ for details. For the status, click on the version,
+Functest then the Status menu.
+
+
+_`reporting page`: http://testresults.opnfv.org/reporting/
diff --git a/docs/testing/user/userguide/runfunctest.rst b/docs/testing/user/userguide/runfunctest.rst
index 58a3e4b92..c8db6ff19 100644
--- a/docs/testing/user/userguide/runfunctest.rst
+++ b/docs/testing/user/userguide/runfunctest.rst
@@ -1,8 +1,8 @@
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
-Executing the functest suites
-=============================
+Executing the functest suites (Ubuntu)
+======================================
Manual testing
--------------
@@ -118,410 +118,57 @@ More specific details on specific Tiers or Test Cases can be seen wih the
To execute a Test Tier or Test Case, the 'run' command is used::
root@22e436918db0:~/repos/functest/ci# functest tier run healthcheck
- 2017-03-30 05:36:19,752 - run_tests - INFO - ############################################
- 2017-03-30 05:36:19,752 - run_tests - INFO - Running tier 'healthcheck'
- 2017-03-30 05:36:19,753 - run_tests - INFO - ############################################
- 2017-03-30 05:36:19,753 - run_tests - INFO -
-
- 2017-03-30 05:36:19,753 - run_tests - INFO - ============================================
- 2017-03-30 05:36:19,753 - run_tests - INFO - Running test case 'connection_check'...
- 2017-03-30 05:36:19,753 - run_tests - INFO - ============================================
- 2017-03-30 05:36:20,046 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:20,046 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:20,775 - functest - INFO - Using flavor metatdata '{'hw:mem_page_size': 'any'}'
- 2017-03-30 05:36:20,777 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:20,777 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:20,777 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:20,778 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:20,778 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:20,779 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:20,779 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:20,779 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:20,780 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:20,780 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:20,781 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:20,781 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:20,781 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:20,782 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:20,782 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:20,783 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:20,783 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:20,784 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- test_glance_connect_fail (snaps.openstack.utils.tests.glance_utils_tests.GlanceSmokeTests) ... ok
- test_glance_connect_success (snaps.openstack.utils.tests.glance_utils_tests.GlanceSmokeTests) ... ok
- test_keystone_connect_fail (snaps.openstack.utils.tests.keystone_utils_tests.KeystoneSmokeTests) ... ok
- test_keystone_connect_success (snaps.openstack.utils.tests.keystone_utils_tests.KeystoneSmokeTests) ... ok
- test_neutron_connect_fail (snaps.openstack.utils.tests.neutron_utils_tests.NeutronSmokeTests) ... ok
- test_neutron_connect_success (snaps.openstack.utils.tests.neutron_utils_tests.NeutronSmokeTests) ... ok
- test_retrieve_ext_network_name (snaps.openstack.utils.tests.neutron_utils_tests.NeutronSmokeTests) ... ok
- test_nova_connect_fail (snaps.openstack.utils.tests.nova_utils_tests.NovaSmokeTests) ... ok
- test_nova_connect_success (snaps.openstack.utils.tests.nova_utils_tests.NovaSmokeTests) ... ok
-
- ----------------------------------------------------------------------
- Ran 9 tests in 1.332s
-
- OK
- 2017-03-30 05:36:22,116 - functest - INFO - connection_check OK
- 2017-03-30 05:36:22,483 - functest - INFO - The results were successfully pushed to DB
- 2017-03-30 05:36:22,483 - run_tests - INFO - Test execution time: 00:02
- 2017-03-30 05:36:22,484 - run_tests - INFO -
-
- 2017-03-30 05:36:22,484 - run_tests - INFO - ============================================
- 2017-03-30 05:36:22,484 - run_tests - INFO - Running test case 'api_check'...
- 2017-03-30 05:36:22,484 - run_tests - INFO - ============================================
- 2017-03-30 05:36:22,590 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:22,591 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,361 - functest - INFO - Using flavor metatdata '{'hw:mem_page_size': 'any'}'
- 2017-03-30 05:36:23,362 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,362 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,363 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,364 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,364 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,365 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,365 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,365 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,366 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,366 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,367 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,367 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,368 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,368 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,368 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,369 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,370 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,370 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,370 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,371 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,372 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,372 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,372 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,373 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,373 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,374 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,374 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,374 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,375 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,376 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,376 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,376 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,376 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,377 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,377 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,377 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,377 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,377 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,378 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,378 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,378 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,378 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,379 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,379 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,379 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,380 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,380 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,380 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,380 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,380 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,381 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,381 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,381 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,381 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,381 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,382 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,382 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,382 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,382 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,382 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,383 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,383 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,383 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,384 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,384 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,384 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,384 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,384 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,385 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,385 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,385 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,385 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,386 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,386 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,386 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,386 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,387 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,387 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,387 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,388 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,388 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,388 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,388 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,388 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,420 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,420 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,420 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,420 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,421 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,421 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,421 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,421 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,422 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,422 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:36:23,422 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:36:23,422 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- test_create_project_minimal (snaps.openstack.utils.tests.keystone_utils_tests.KeystoneUtilsTests) ... ok
- test_create_user_minimal (snaps.openstack.utils.tests.keystone_utils_tests.KeystoneUtilsTests) ... ok
- test_create_delete_user (snaps.openstack.tests.create_user_tests.CreateUserSuccessTests) ... ok
- test_create_user (snaps.openstack.tests.create_user_tests.CreateUserSuccessTests) ... ok
- test_create_user_2x (snaps.openstack.tests.create_user_tests.CreateUserSuccessTests) ... 2017-03-30 05:36:27,257 - create_user - INFO - Found user with name - CreateUserSuccessTests-5ff765c1-56bd-4c4-name
- ok
- test_create_delete_project (snaps.openstack.tests.create_project_tests.CreateProjectSuccessTests) ... ok
- test_create_project (snaps.openstack.tests.create_project_tests.CreateProjectSuccessTests) ... ok
- test_create_project_2x (snaps.openstack.tests.create_project_tests.CreateProjectSuccessTests) ... 2017-03-30 05:36:29,798 - create_image - INFO - Found project with name - CreateProjectSuccessTests-1b2fce89-dd5e-471-name
- ok
- test_create_project_sec_grp_one_user (snaps.openstack.tests.create_project_tests.CreateProjectUserTests) ... 2017-03-30 05:36:31,327 - OpenStackSecurityGroup - INFO - Creating security group CreateProjectUserTests-34aa7d96-f19c-4db-name...
- 2017-03-30 05:36:31,327 - neutron_utils - INFO - Retrieving security group with name - CreateProjectUserTests-34aa7d96-f19c-4db-name
- 2017-03-30 05:36:31,705 - neutron_utils - INFO - Creating security group with name - CreateProjectUserTests-34aa7d96-f19c-4db-name
- 2017-03-30 05:36:31,878 - neutron_utils - INFO - Retrieving security group rules associate with the security group - CreateProjectUserTests-34aa7d96-f19c-4db-name
- 2017-03-30 05:36:31,915 - neutron_utils - INFO - Retrieving security group with ID - 4dc3e8e4-3dc8-4dda-9c7e-03d08171e17a
- 2017-03-30 05:36:31,980 - neutron_utils - INFO - Retrieving security group with ID - 4dc3e8e4-3dc8-4dda-9c7e-03d08171e17a
- 2017-03-30 05:36:32,048 - neutron_utils - INFO - Retrieving security group with name - CreateProjectUserTests-34aa7d96-f19c-4db-name
- 2017-03-30 05:36:32,108 - neutron_utils - INFO - Deleting security group rule with ID - 81cca252-45fe-4052-adb9-819191693618
- 2017-03-30 05:36:32,257 - neutron_utils - INFO - Deleting security group rule with ID - 8900647f-1587-4068-bd2e-7b77677d12ed
- 2017-03-30 05:36:32,367 - neutron_utils - INFO - Deleting security group with name - CreateProjectUserTests-34aa7d96-f19c-4db-name
- ok
- test_create_project_sec_grp_two_users (snaps.openstack.tests.create_project_tests.CreateProjectUserTests) ... 2017-03-30 05:36:34,950 - OpenStackSecurityGroup - INFO - Creating security group CreateProjectUserTests-6664b595-4657-4f9-name...
- 2017-03-30 05:36:34,950 - neutron_utils - INFO - Retrieving security group with name - CreateProjectUserTests-6664b595-4657-4f9-name
- 2017-03-30 05:36:35,337 - neutron_utils - INFO - Creating security group with name - CreateProjectUserTests-6664b595-4657-4f9-name
- 2017-03-30 05:36:35,528 - neutron_utils - INFO - Retrieving security group rules associate with the security group - CreateProjectUserTests-6664b595-4657-4f9-name
- 2017-03-30 05:36:35,566 - neutron_utils - INFO - Retrieving security group with ID - ea8b1da3-0e3d-45aa-b63f-68d2e7b57e48
- 2017-03-30 05:36:35,831 - neutron_utils - INFO - Retrieving security group with ID - ea8b1da3-0e3d-45aa-b63f-68d2e7b57e48
- 2017-03-30 05:36:36,118 - neutron_utils - INFO - Retrieving security group with name - CreateProjectUserTests-6664b595-4657-4f9-name
- 2017-03-30 05:36:36,474 - OpenStackSecurityGroup - INFO - Creating security group CreateProjectUserTests-6664b595-4657-4f9-name...
- 2017-03-30 05:36:36,475 - neutron_utils - INFO - Retrieving security group with name - CreateProjectUserTests-6664b595-4657-4f9-name
- 2017-03-30 05:36:36,717 - neutron_utils - INFO - Retrieving security group rules associate with the security group - CreateProjectUserTests-6664b595-4657-4f9-name
- 2017-03-30 05:36:36,768 - neutron_utils - INFO - Retrieving security group with ID - ea8b1da3-0e3d-45aa-b63f-68d2e7b57e48
- 2017-03-30 05:36:36,831 - neutron_utils - INFO - Retrieving security group with ID - ea8b1da3-0e3d-45aa-b63f-68d2e7b57e48
- 2017-03-30 05:36:36,902 - neutron_utils - INFO - Deleting security group rule with ID - f6e50aea-e6d2-4ba9-ab78-0674cdcd5415
- 2017-03-30 05:36:37,054 - neutron_utils - INFO - Deleting security group rule with ID - a32d9c1d-7ae0-4fe9-b4c9-8b039008f836
- 2017-03-30 05:36:37,204 - neutron_utils - INFO - Deleting security group with name - CreateProjectUserTests-6664b595-4657-4f9-name
- 2017-03-30 05:36:37,350 - neutron_utils - INFO - Deleting security group rule with ID - f6e50aea-e6d2-4ba9-ab78-0674cdcd5415
- 2017-03-30 05:36:37,387 - OpenStackSecurityGroup - WARNING - Rule not found, cannot delete - Security group rule f6e50aea-e6d2-4ba9-ab78-0674cdcd5415 does not exist
- Neutron server returns request_ids: ['req-e740871d-34c4-4b95-a76c-6b84028954e6']
- 2017-03-30 05:36:37,387 - neutron_utils - INFO - Deleting security group rule with ID - a32d9c1d-7ae0-4fe9-b4c9-8b039008f836
- 2017-03-30 05:36:37,426 - OpenStackSecurityGroup - WARNING - Rule not found, cannot delete - Security group rule a32d9c1d-7ae0-4fe9-b4c9-8b039008f836 does not exist
- Neutron server returns request_ids: ['req-8121308e-d7d3-4ccc-961f-5fa794fccc83']
- 2017-03-30 05:36:37,427 - neutron_utils - INFO - Deleting security group with name - CreateProjectUserTests-6664b595-4657-4f9-name
- 2017-03-30 05:36:37,470 - OpenStackSecurityGroup - WARNING - Security Group not found, cannot delete - Security group ea8b1da3-0e3d-45aa-b63f-68d2e7b57e48 does not exist
- Neutron server returns request_ids: ['req-09424914-a32d-4bcb-9d90-0ad307ec4c56']
- ok
- test_create_image_minimal_file (snaps.openstack.utils.tests.glance_utils_tests.GlanceUtilsTests) ... ok
- test_create_image_minimal_url (snaps.openstack.utils.tests.glance_utils_tests.GlanceUtilsTests) ... ok
- test_create_network (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsNetworkTests) ... 2017-03-30 05:37:02,330 - neutron_utils - INFO - Creating network with name NeutronUtilsNetworkTests-9dc31d5e-be87-480d-af6e-d89f0608e459-pub-net
- 2017-03-30 05:37:04,307 - neutron_utils - INFO - Deleting network with name NeutronUtilsNetworkTests-9dc31d5e-be87-480d-af6e-d89f0608e459-pub-net
- ok
- test_create_network_empty_name (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsNetworkTests) ... ok
- test_create_network_null_name (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsNetworkTests) ... ok
- test_create_subnet (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsSubnetTests) ... 2017-03-30 05:37:04,953 - neutron_utils - INFO - Creating network with name NeutronUtilsSubnetTests-127e135b-f050-4e85-8c9f-b4f72fb1b028-pub-net
- 2017-03-30 05:37:06,108 - neutron_utils - INFO - Creating subnet with name NeutronUtilsSubnetTests-127e135b-f050-4e85-8c9f-b4f72fb1b028-pub-subnet
- 2017-03-30 05:37:07,544 - neutron_utils - INFO - Deleting subnet with name NeutronUtilsSubnetTests-127e135b-f050-4e85-8c9f-b4f72fb1b028-pub-subnet
- 2017-03-30 05:37:07,944 - neutron_utils - INFO - Deleting network with name NeutronUtilsSubnetTests-127e135b-f050-4e85-8c9f-b4f72fb1b028-pub-net
- ok
- test_create_subnet_empty_cidr (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsSubnetTests) ... 2017-03-30 05:37:08,594 - neutron_utils - INFO - Creating network with name NeutronUtilsSubnetTests-4edb48fe-2532-409b-8dc7-dcb344068a20-pub-net
- 2017-03-30 05:37:09,862 - neutron_utils - INFO - Deleting network with name NeutronUtilsSubnetTests-4edb48fe-2532-409b-8dc7-dcb344068a20-pub-net
- ok
- test_create_subnet_empty_name (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsSubnetTests) ... 2017-03-30 05:37:10,962 - neutron_utils - INFO - Creating network with name NeutronUtilsSubnetTests-bb15908a-a475-45e9-9777-8b5d3faaaea8-pub-net
- 2017-03-30 05:37:11,973 - neutron_utils - INFO - Creating subnet with name NeutronUtilsSubnetTests-bb15908a-a475-45e9-9777-8b5d3faaaea8-pub-subnet
- 2017-03-30 05:37:13,088 - neutron_utils - INFO - Deleting network with name NeutronUtilsSubnetTests-bb15908a-a475-45e9-9777-8b5d3faaaea8-pub-net
- ok
- test_create_subnet_null_cidr (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsSubnetTests) ... 2017-03-30 05:37:14,032 - neutron_utils - INFO - Creating network with name NeutronUtilsSubnetTests-701278ff-f4b6-478f-b16f-1d3fdfb43ed7-pub-net
- 2017-03-30 05:37:15,100 - neutron_utils - INFO - Deleting network with name NeutronUtilsSubnetTests-701278ff-f4b6-478f-b16f-1d3fdfb43ed7-pub-net
- ok
- test_create_subnet_null_name (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsSubnetTests) ... 2017-03-30 05:37:15,658 - neutron_utils - INFO - Creating network with name NeutronUtilsSubnetTests-2dad9c37-c892-494b-a8dc-51963ce11cd8-pub-net
- 2017-03-30 05:37:16,184 - neutron_utils - INFO - Deleting network with name NeutronUtilsSubnetTests-2dad9c37-c892-494b-a8dc-51963ce11cd8-pub-net
- ok
- test_add_interface_router (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:37:17,438 - neutron_utils - INFO - Creating network with name NeutronUtilsRouterTests-5f1f0b29-1148-4628-8626-f2aa63b17914-pub-net
- 2017-03-30 05:37:18,624 - neutron_utils - INFO - Creating subnet with name NeutronUtilsRouterTests-5f1f0b29-1148-4628-8626-f2aa63b17914-pub-subnet
- 2017-03-30 05:37:20,041 - neutron_utils - INFO - Creating router with name - NeutronUtilsRouterTests-5f1f0b29-1148-4628-8626-f2aa63b17914-pub-router
- 2017-03-30 05:37:22,518 - neutron_utils - INFO - Adding interface to router with name NeutronUtilsRouterTests-5f1f0b29-1148-4628-8626-f2aa63b17914-pub-router
- 2017-03-30 05:37:23,883 - neutron_utils - INFO - Removing router interface from router named NeutronUtilsRouterTests-5f1f0b29-1148-4628-8626-f2aa63b17914-pub-router
- 2017-03-30 05:37:25,345 - neutron_utils - INFO - Deleting router with name - NeutronUtilsRouterTests-5f1f0b29-1148-4628-8626-f2aa63b17914-pub-router
- 2017-03-30 05:37:27,019 - neutron_utils - INFO - Deleting subnet with name NeutronUtilsRouterTests-5f1f0b29-1148-4628-8626-f2aa63b17914-pub-subnet
- 2017-03-30 05:37:28,570 - neutron_utils - INFO - Deleting network with name NeutronUtilsRouterTests-5f1f0b29-1148-4628-8626-f2aa63b17914-pub-net
- ok
- test_add_interface_router_null_router (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:37:29,583 - neutron_utils - INFO - Creating network with name NeutronUtilsRouterTests-021a41c7-e2b2-45df-bb6d-630ddba2b776-pub-net
- 2017-03-30 05:37:30,234 - neutron_utils - INFO - Creating subnet with name NeutronUtilsRouterTests-021a41c7-e2b2-45df-bb6d-630ddba2b776-pub-subnet
- 2017-03-30 05:37:30,724 - neutron_utils - INFO - Deleting subnet with name NeutronUtilsRouterTests-021a41c7-e2b2-45df-bb6d-630ddba2b776-pub-subnet
- 2017-03-30 05:37:31,128 - neutron_utils - INFO - Deleting network with name NeutronUtilsRouterTests-021a41c7-e2b2-45df-bb6d-630ddba2b776-pub-net
- ok
- test_add_interface_router_null_subnet (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:37:32,229 - neutron_utils - INFO - Creating network with name NeutronUtilsRouterTests-e52f96b6-92c9-49a3-ac7f-6a4a61a82c7e-pub-net
- 2017-03-30 05:37:32,833 - neutron_utils - INFO - Creating router with name - NeutronUtilsRouterTests-e52f96b6-92c9-49a3-ac7f-6a4a61a82c7e-pub-router
- 2017-03-30 05:37:34,002 - neutron_utils - INFO - Adding interface to router with name NeutronUtilsRouterTests-e52f96b6-92c9-49a3-ac7f-6a4a61a82c7e-pub-router
- 2017-03-30 05:37:34,003 - neutron_utils - INFO - Deleting router with name - NeutronUtilsRouterTests-e52f96b6-92c9-49a3-ac7f-6a4a61a82c7e-pub-router
- 2017-03-30 05:37:35,238 - neutron_utils - INFO - Deleting network with name NeutronUtilsRouterTests-e52f96b6-92c9-49a3-ac7f-6a4a61a82c7e-pub-net
- ok
- test_create_port (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:37:35,898 - neutron_utils - INFO - Creating network with name NeutronUtilsRouterTests-842cf533-4886-4539-86e4-15bcd8c77b63-pub-net
- 2017-03-30 05:37:36,426 - neutron_utils - INFO - Creating subnet with name NeutronUtilsRouterTests-842cf533-4886-4539-86e4-15bcd8c77b63-pub-subnet
- 2017-03-30 05:37:37,725 - neutron_utils - INFO - Creating port for network with name - NeutronUtilsRouterTests-842cf533-4886-4539-86e4-15bcd8c77b63-pub-net
- 2017-03-30 05:37:38,511 - neutron_utils - INFO - Deleting port with name NeutronUtilsRouterTests-842cf533-4886-4539-86e4-15bcd8c77b63-port
- 2017-03-30 05:37:39,036 - neutron_utils - INFO - Deleting subnet with name NeutronUtilsRouterTests-842cf533-4886-4539-86e4-15bcd8c77b63-pub-subnet
- 2017-03-30 05:37:41,326 - neutron_utils - INFO - Deleting network with name NeutronUtilsRouterTests-842cf533-4886-4539-86e4-15bcd8c77b63-pub-net
- ok
- test_create_port_empty_name (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:37:42,725 - neutron_utils - INFO - Creating network with name NeutronUtilsRouterTests-303b5eae-374a-4da9-a905-aa39a7d5f026-pub-net
- 2017-03-30 05:37:43,246 - neutron_utils - INFO - Creating subnet with name NeutronUtilsRouterTests-303b5eae-374a-4da9-a905-aa39a7d5f026-pub-subnet
- 2017-03-30 05:37:43,945 - neutron_utils - INFO - Creating port for network with name - NeutronUtilsRouterTests-303b5eae-374a-4da9-a905-aa39a7d5f026-pub-net
- 2017-03-30 05:37:45,674 - neutron_utils - INFO - Deleting port with name NeutronUtilsRouterTests-303b5eae-374a-4da9-a905-aa39a7d5f026-port
- 2017-03-30 05:37:46,197 - neutron_utils - INFO - Deleting subnet with name NeutronUtilsRouterTests-303b5eae-374a-4da9-a905-aa39a7d5f026-pub-subnet
- 2017-03-30 05:37:48,252 - neutron_utils - INFO - Deleting network with name NeutronUtilsRouterTests-303b5eae-374a-4da9-a905-aa39a7d5f026-pub-net
- ok
- test_create_port_invalid_ip (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:37:49,864 - neutron_utils - INFO - Creating network with name NeutronUtilsRouterTests-bd7a4489-79e8-4328-8519-5ad1951c0b5d-pub-net
- 2017-03-30 05:37:50,322 - neutron_utils - INFO - Creating subnet with name NeutronUtilsRouterTests-bd7a4489-79e8-4328-8519-5ad1951c0b5d-pub-subnet
- 2017-03-30 05:37:50,803 - neutron_utils - INFO - Deleting subnet with name NeutronUtilsRouterTests-bd7a4489-79e8-4328-8519-5ad1951c0b5d-pub-subnet
- 2017-03-30 05:37:51,240 - neutron_utils - INFO - Deleting network with name NeutronUtilsRouterTests-bd7a4489-79e8-4328-8519-5ad1951c0b5d-pub-net
- ok
- test_create_port_invalid_ip_to_subnet (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:37:51,767 - neutron_utils - INFO - Creating network with name NeutronUtilsRouterTests-ef2c3474-7b51-483b-b269-05fc4532f294-pub-net
- 2017-03-30 05:37:52,246 - neutron_utils - INFO - Creating subnet with name NeutronUtilsRouterTests-ef2c3474-7b51-483b-b269-05fc4532f294-pub-subnet
- 2017-03-30 05:37:52,795 - neutron_utils - INFO - Deleting subnet with name NeutronUtilsRouterTests-ef2c3474-7b51-483b-b269-05fc4532f294-pub-subnet
- 2017-03-30 05:37:53,199 - neutron_utils - INFO - Deleting network with name NeutronUtilsRouterTests-ef2c3474-7b51-483b-b269-05fc4532f294-pub-net
- ok
- test_create_port_null_ip (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:37:53,806 - neutron_utils - INFO - Creating network with name NeutronUtilsRouterTests-f5829764-e1ff-4a43-b24e-52c0107f12b2-pub-net
- 2017-03-30 05:37:54,326 - neutron_utils - INFO - Creating subnet with name NeutronUtilsRouterTests-f5829764-e1ff-4a43-b24e-52c0107f12b2-pub-subnet
- 2017-03-30 05:37:55,475 - neutron_utils - INFO - Deleting subnet with name NeutronUtilsRouterTests-f5829764-e1ff-4a43-b24e-52c0107f12b2-pub-subnet
- 2017-03-30 05:37:55,932 - neutron_utils - INFO - Deleting network with name NeutronUtilsRouterTests-f5829764-e1ff-4a43-b24e-52c0107f12b2-pub-net
- ok
- test_create_port_null_name (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:37:57,121 - neutron_utils - INFO - Creating network with name NeutronUtilsRouterTests-194aff34-e0e6-4218-8c17-33a9d9b34816-pub-net
- 2017-03-30 05:37:57,611 - neutron_utils - INFO - Creating subnet with name NeutronUtilsRouterTests-194aff34-e0e6-4218-8c17-33a9d9b34816-pub-subnet
- 2017-03-30 05:37:58,880 - neutron_utils - INFO - Deleting subnet with name NeutronUtilsRouterTests-194aff34-e0e6-4218-8c17-33a9d9b34816-pub-subnet
- 2017-03-30 05:37:59,638 - neutron_utils - INFO - Deleting network with name NeutronUtilsRouterTests-194aff34-e0e6-4218-8c17-33a9d9b34816-pub-net
- ok
- test_create_port_null_network_object (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:38:01,037 - neutron_utils - INFO - Creating network with name NeutronUtilsRouterTests-3a49f710-5292-411b-83df-42bb176a5020-pub-net
- 2017-03-30 05:38:01,609 - neutron_utils - INFO - Creating subnet with name NeutronUtilsRouterTests-3a49f710-5292-411b-83df-42bb176a5020-pub-subnet
- 2017-03-30 05:38:02,095 - neutron_utils - INFO - Deleting subnet with name NeutronUtilsRouterTests-3a49f710-5292-411b-83df-42bb176a5020-pub-subnet
- 2017-03-30 05:38:03,034 - neutron_utils - INFO - Deleting network with name NeutronUtilsRouterTests-3a49f710-5292-411b-83df-42bb176a5020-pub-net
- ok
- test_create_router_empty_name (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... ok
- test_create_router_null_name (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... ok
- test_create_router_simple (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:38:03,973 - neutron_utils - INFO - Creating router with name - NeutronUtilsRouterTests-54c3eaf0-00c8-4726-a248-b57f98a37999-pub-router
- 2017-03-30 05:38:05,749 - neutron_utils - INFO - Deleting router with name - NeutronUtilsRouterTests-54c3eaf0-00c8-4726-a248-b57f98a37999-pub-router
- ok
- test_create_router_with_public_interface (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsRouterTests) ... 2017-03-30 05:38:07,392 - neutron_utils - INFO - Creating router with name - NeutronUtilsRouterTests-a4e93ee5-781e-4e9d-9b55-b4d8fb3f0e7b-pub-router
- 2017-03-30 05:38:09,164 - neutron_utils - INFO - Deleting router with name - NeutronUtilsRouterTests-a4e93ee5-781e-4e9d-9b55-b4d8fb3f0e7b-pub-router
- ok
- test_create_delete_simple_sec_grp (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsSecurityGroupTests) ... 2017-03-30 05:38:10,643 - neutron_utils - INFO - Creating security group with name - NeutronUtilsSecurityGroupTests-0b62acfe-fc43-4c9f-bd30-2ce350c73c57name
- 2017-03-30 05:38:11,020 - neutron_utils - INFO - Retrieving security group with name - NeutronUtilsSecurityGroupTests-0b62acfe-fc43-4c9f-bd30-2ce350c73c57name
- 2017-03-30 05:38:11,084 - neutron_utils - INFO - Deleting security group with name - NeutronUtilsSecurityGroupTests-0b62acfe-fc43-4c9f-bd30-2ce350c73c57name
- 2017-03-30 05:38:11,230 - neutron_utils - INFO - Retrieving security group with name - NeutronUtilsSecurityGroupTests-0b62acfe-fc43-4c9f-bd30-2ce350c73c57name
- ok
- test_create_sec_grp_no_name (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsSecurityGroupTests) ... ok
- test_create_sec_grp_no_rules (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsSecurityGroupTests) ... 2017-03-30 05:38:11,653 - neutron_utils - INFO - Creating security group with name - NeutronUtilsSecurityGroupTests-19dc66ba-630d-4ef5-87e1-b0461971ef8ename
- 2017-03-30 05:38:11,960 - neutron_utils - INFO - Retrieving security group with name - NeutronUtilsSecurityGroupTests-19dc66ba-630d-4ef5-87e1-b0461971ef8ename
- 2017-03-30 05:38:12,047 - neutron_utils - INFO - Deleting security group with name - NeutronUtilsSecurityGroupTests-19dc66ba-630d-4ef5-87e1-b0461971ef8ename
- ok
- test_create_sec_grp_one_rule (snaps.openstack.utils.tests.neutron_utils_tests.NeutronUtilsSecurityGroupTests) ... 2017-03-30 05:38:12,321 - neutron_utils - INFO - Creating security group with name - NeutronUtilsSecurityGroupTests-cf3022e5-dc6e-4cc1-8fe0-41c8c1c56defname
- 2017-03-30 05:38:12,676 - neutron_utils - INFO - Retrieving security group rules associate with the security group - NeutronUtilsSecurityGroupTests-cf3022e5-dc6e-4cc1-8fe0-41c8c1c56defname
- 2017-03-30 05:38:12,735 - neutron_utils - INFO - Creating security group to security group - NeutronUtilsSecurityGroupTests-cf3022e5-dc6e-4cc1-8fe0-41c8c1c56defname
- 2017-03-30 05:38:12,736 - neutron_utils - INFO - Retrieving security group with name - NeutronUtilsSecurityGroupTests-cf3022e5-dc6e-4cc1-8fe0-41c8c1c56defname
- 2017-03-30 05:38:12,948 - neutron_utils - INFO - Retrieving security group with name - NeutronUtilsSecurityGroupTests-cf3022e5-dc6e-4cc1-8fe0-41c8c1c56defname
- 2017-03-30 05:38:13,024 - neutron_utils - INFO - Retrieving security group rules associate with the security group - NeutronUtilsSecurityGroupTests-cf3022e5-dc6e-4cc1-8fe0-41c8c1c56defname
- 2017-03-30 05:38:13,054 - neutron_utils - INFO - Retrieving security group with name - NeutronUtilsSecurityGroupTests-cf3022e5-dc6e-4cc1-8fe0-41c8c1c56defname
- 2017-03-30 05:38:13,121 - neutron_utils - INFO - Deleting security group rule with ID - 07b4bfbe-c632-496b-95f7-b42de9293519
- 2017-03-30 05:38:13,238 - neutron_utils - INFO - Deleting security group rule with ID - c5e58c9f-6cc8-4543-ae39-aa1960b9a3e1
- 2017-03-30 05:38:13,387 - neutron_utils - INFO - Deleting security group rule with ID - 184d29e8-b460-4f80-858f-7915b9bafe9b
- 2017-03-30 05:38:13,492 - neutron_utils - INFO - Deleting security group with name - NeutronUtilsSecurityGroupTests-cf3022e5-dc6e-4cc1-8fe0-41c8c1c56defname
- ok
- test_create_delete_keypair (snaps.openstack.utils.tests.nova_utils_tests.NovaUtilsKeypairTests) ... 2017-03-30 05:38:13,664 - nova_utils - INFO - Creating keypair with name - NovaUtilsKeypairTests-cb36f8f9-ceca-4802-8735-a1dc846ad2a8
- ok
- test_create_key_from_file (snaps.openstack.utils.tests.nova_utils_tests.NovaUtilsKeypairTests) ... 2017-03-30 05:38:18,337 - nova_utils - INFO - Saved public key to - tmp/NovaUtilsKeypairTests-a7eba01b-9615-4271-b5f9-8fe915972f16.pub
- 2017-03-30 05:38:18,338 - nova_utils - INFO - Saved private key to - tmp/NovaUtilsKeypairTests-a7eba01b-9615-4271-b5f9-8fe915972f16
- 2017-03-30 05:38:18,338 - nova_utils - INFO - Saving keypair to - tmp/NovaUtilsKeypairTests-a7eba01b-9615-4271-b5f9-8fe915972f16.pub
- 2017-03-30 05:38:18,338 - nova_utils - INFO - Creating keypair with name - NovaUtilsKeypairTests-a7eba01b-9615-4271-b5f9-8fe915972f16
- ok
- test_create_keypair (snaps.openstack.utils.tests.nova_utils_tests.NovaUtilsKeypairTests) ... 2017-03-30 05:38:21,492 - nova_utils - INFO - Creating keypair with name - NovaUtilsKeypairTests-74535dab-d450-47b1-8814-c0b3f48b7643
- ok
- test_floating_ips (snaps.openstack.utils.tests.nova_utils_tests.NovaUtilsKeypairTests) ... 2017-03-30 05:38:23,509 - nova_utils - INFO - Creating floating ip to external network - admin_floating_net
- ok
- test_create_delete_flavor (snaps.openstack.utils.tests.nova_utils_tests.NovaUtilsFlavorTests) ... ok
- test_create_flavor (snaps.openstack.utils.tests.nova_utils_tests.NovaUtilsFlavorTests) ... ok
- test_create_clean_flavor (snaps.openstack.tests.create_flavor_tests.CreateFlavorTests) ... ok
- test_create_delete_flavor (snaps.openstack.tests.create_flavor_tests.CreateFlavorTests) ... ok
- test_create_flavor (snaps.openstack.tests.create_flavor_tests.CreateFlavorTests) ... ok
- test_create_flavor_existing (snaps.openstack.tests.create_flavor_tests.CreateFlavorTests) ... 2017-03-30 05:38:34,855 - create_image - INFO - Found flavor with name - CreateFlavorTests-3e389b6c-ee95-4f2d-bf74-78d324722ef2name
- ok
-
- ----------------------------------------------------------------------
- Ran 48 tests in 131.483s
-
- OK
- 2017-03-30 05:38:34,905 - functest - INFO - api_check OK
- 2017-03-30 05:38:35,259 - functest - INFO - The results were successfully pushed to DB
- 2017-03-30 05:38:35,259 - run_tests - INFO - Test execution time: 02:12
- 2017-03-30 05:38:35,267 - run_tests - INFO -
-
- 2017-03-30 05:38:35,268 - run_tests - INFO - ============================================
- 2017-03-30 05:38:35,268 - run_tests - INFO - Running test case 'snaps_health_check'...
- 2017-03-30 05:38:35,268 - run_tests - INFO - ============================================
- 2017-03-30 05:38:35,383 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:38:35,384 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- 2017-03-30 05:38:35,855 - functest - INFO - Using flavor metatdata '{'hw:mem_page_size': 'any'}'
- 2017-03-30 05:38:35,856 - file_utils - INFO - Attempting to read OS environment file - /home/opnfv/functest/conf/openstack.creds
- 2017-03-30 05:38:35,856 - openstack_tests - INFO - OS Credentials = OSCreds - username=admin, password=admin, auth_url=http://192.168.10.2:5000/v3, project_name=admin, identity_api_version=3, image_api_version=1, network_api_version=2, compute_api_version=2, user_domain_id=default, proxy_settings=None
- test_check_vm_ip_dhcp (snaps.openstack.tests.create_instance_tests.SimpleHealthCheck) ... 2017-03-30 05:38:39,896 - create_image - INFO - Creating image
- 2017-03-30 05:38:41,843 - create_image - INFO - Image is active with name - SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181-image
- 2017-03-30 05:38:41,843 - create_image - INFO - Image is now active with name - SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181-image
- 2017-03-30 05:38:41,845 - OpenStackNetwork - INFO - Creating neutron network SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181-priv-net...
- 2017-03-30 05:38:42,140 - neutron_utils - INFO - Creating network with name SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181-priv-net
- 2017-03-30 05:38:42,480 - neutron_utils - INFO - Creating subnet with name SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181-priv-subnet
- 2017-03-30 05:38:44,166 - neutron_utils - INFO - Creating port for network with name - SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181-priv-net
- 2017-03-30 05:38:45,173 - create_instance - INFO - Creating VM with name - SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181-inst
- 2017-03-30 05:38:48,419 - create_instance - INFO - Created instance with name - SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181-inst
- 2017-03-30 05:39:05,164 - create_instance - INFO - VM is - ACTIVE
- 2017-03-30 05:39:05,164 - create_instance_tests - INFO - Looking for expression Lease of.*obtained in the console log
- 2017-03-30 05:39:06,547 - create_instance_tests - INFO - DHCP lease obtained logged in console
- 2017-03-30 05:39:06,548 - create_instance_tests - INFO - With correct IP address
- 2017-03-30 05:39:06,548 - create_instance - INFO - Deleting Port - SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181port-1
- 2017-03-30 05:39:06,548 - neutron_utils - INFO - Deleting port with name SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181port-1
- 2017-03-30 05:39:07,178 - create_instance - INFO - Deleting VM instance - SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181-inst
- 2017-03-30 05:39:07,693 - create_instance - INFO - Checking deletion status
- 2017-03-30 05:39:11,088 - create_instance - INFO - VM has been properly deleted VM with name - SimpleHealthCheck-85a41a34-a9b3-463d-a12c-4bd057d70181-inst
- ok
-
- ----------------------------------------------------------------------
- Ran 1 test in 36.376s
-
- OK
- 2017-03-30 05:39:12,233 - functest - INFO - snaps_health_check OK
- 2017-03-30 05:39:12,598 - functest - INFO - The results were successfully pushed to DB
- 2017-03-30 05:39:12,598 - run_tests - INFO - Test execution time: 00:37
- 2017-03-30 05:39:12,599 - run_tests - INFO -
+
+ 2017-08-16 12:35:51,799 - functest.ci.run_tests - INFO - ############################################
+ 2017-08-16 12:35:51,799 - functest.ci.run_tests - INFO - Running tier 'healthcheck'
+ 2017-08-16 12:35:51,800 - functest.ci.run_tests - INFO - ############################################
+ 2017-08-16 12:35:51,800 - functest.ci.run_tests - INFO -
+ 2017-08-16 12:35:51,800 - functest.ci.run_tests - INFO - ============================================
+ 2017-08-16 12:35:51,800 - functest.ci.run_tests - INFO - Running test case 'connection_check'...
+ 2017-08-16 12:35:51,800 - functest.ci.run_tests - INFO - ============================================
+ 2017-08-16 12:36:00,278 - functest.core.testcase - INFO - The results were successfully pushed to DB
+ 2017-08-16 12:36:00,279 - functest.ci.run_tests - INFO - Test result:
+ +--------------------------+------------------+------------------+----------------+
+ | TEST CASE | PROJECT | DURATION | RESULT |
+ +--------------------------+------------------+------------------+----------------+
+ | connection_check | functest | 00:06 | PASS |
+ +--------------------------+------------------+------------------+----------------+
+ 2017-08-16 12:36:00,281 - functest.ci.run_tests - INFO -
+ 2017-08-16 12:36:00,281 - functest.ci.run_tests - INFO - ============================================
+ 2017-08-16 12:36:00,281 - functest.ci.run_tests - INFO - Running test case 'api_check'...
+ 2017-08-16 12:36:00,281 - functest.ci.run_tests - INFO - ============================================
+ 2017-08-16 12:41:04,088 - functest.core.testcase - INFO - The results were successfully pushed to DB
+ 2017-08-16 12:41:04,088 - functest.ci.run_tests - INFO - Test result:
+ +-------------------+------------------+------------------+----------------+
+ | TEST CASE | PROJECT | DURATION | RESULT |
+ +-------------------+------------------+------------------+----------------+
+ | api_check | functest | 05:03 | PASS |
+ +-------------------+------------------+------------------+----------------+
+ 2017-08-16 12:41:04,092 - functest.ci.run_tests - INFO -
+ 2017-08-16 12:41:04,092 - functest.ci.run_tests - INFO - ============================================
+ 2017-08-16 12:41:04,092 - functest.ci.run_tests - INFO - Running test case 'snaps_health_check'...
+ 2017-08-16 12:41:04,092 - functest.ci.run_tests - INFO - ============================================
+ 2017-08-16 12:41:39,817 - functest.core.testcase - INFO - The results were successfully pushed to DB
+ 2017-08-16 12:41:39,818 - functest.ci.run_tests - INFO - Test result:
+ +----------------------------+------------------+------------------+----------------+
+ | TEST CASE | PROJECT | DURATION | RESULT |
+ +----------------------------+------------------+------------------+----------------+
+ | snaps_health_check | functest | 00:35 | PASS |
+ +----------------------------+------------------+------------------+----------------+
and
root@22e436918db0:~/repos/functest/ci# functest testcase run vping_ssh
- 2016-06-30 11:50:31,865 - run_tests - INFO - ============================================
- 2016-06-30 11:50:31,865 - run_tests - INFO - Running test case 'vping_ssh'...
- 2016-06-30 11:50:31,865 - run_tests - INFO - ============================================
- 2016-06-30 11:50:32,977 - vping_ssh - INFO - Creating image 'functest-vping' from '/home/opnfv/functest/data/cirros-0.3.5-x86_64-disk.img'...
- 2016-06-30 11:50:45,470 - vping_ssh - INFO - Creating neutron network vping-net...
- 2016-06-30 11:50:47,645 - vping_ssh - INFO - Creating security group 'vPing-sg'...
- 2016-06-30 11:50:48,843 - vping_ssh - INFO - Using existing Flavor 'm1.small'...
- 2016-06-30 11:50:48,927 - vping_ssh - INFO - vPing Start Time:'2016-06-30 11:50:48'
- 2016-06-30 11:50:48,927 - vping_ssh - INFO - Creating instance 'opnfv-vping-1'...
- 2016-06-30 11:51:34,664 - vping_ssh - INFO - Instance 'opnfv-vping-1' is ACTIVE.
- 2016-06-30 11:51:34,818 - vping_ssh - INFO - Adding 'opnfv-vping-1' to security group 'vPing-sg'...
- 2016-06-30 11:51:35,209 - vping_ssh - INFO - Creating instance 'opnfv-vping-2'...
- 2016-06-30 11:52:01,439 - vping_ssh - INFO - Instance 'opnfv-vping-2' is ACTIVE.
- 2016-06-30 11:52:01,439 - vping_ssh - INFO - Adding 'opnfv-vping-2' to security group 'vPing-sg'...
- 2016-06-30 11:52:01,754 - vping_ssh - INFO - Creating floating IP for VM 'opnfv-vping-2'...
- 2016-06-30 11:52:01,969 - vping_ssh - INFO - Floating IP created: '10.17.94.140'
- 2016-06-30 11:52:01,969 - vping_ssh - INFO - Associating floating ip: '10.17.94.140' to VM 'opnfv-vping-2'
- 2016-06-30 11:52:02,792 - vping_ssh - INFO - Trying to establish SSH connection to 10.17.94.140...
- 2016-06-30 11:52:19,915 - vping_ssh - INFO - Waiting for ping...
- 2016-06-30 11:52:21,108 - vping_ssh - INFO - vPing detected!
- 2016-06-30 11:52:21,108 - vping_ssh - INFO - vPing duration:'92.2' s.
- 2016-06-30 11:52:21,109 - vping_ssh - INFO - vPing OK
- 2016-06-30 11:52:21,153 - clean_openstack - INFO - +++++++++++++++++++++++++++++++
- 2016-06-30 11:52:21,153 - clean_openstack - INFO - Cleaning OpenStack resources...
- 2016-06-30 11:52:21,153 - clean_openstack - INFO - +++++++++++++++++++++++++++++++
- Version 1 is deprecated, use alternative version 2 instead.
+ 2017-08-16 12:41:39,821 - functest.ci.run_tests - INFO - ============================================
+ 2017-08-16 12:41:39,821 - functest.ci.run_tests - INFO - Running test case 'vping_ssh'...
+ 2017-08-16 12:41:39,821 - functest.ci.run_tests - INFO - ============================================
+ 2017-08-16 12:42:49,861 - functest.core.testcase - INFO - The results were successfully pushed to DB
+ 2017-08-16 12:42:49,861 - functest.ci.run_tests - INFO - Test result:
+ +-------------------+------------------+------------------+----------------+
+ | TEST CASE | PROJECT | DURATION | RESULT |
+ +-------------------+------------------+------------------+----------------+
+ | vping_ssh | functest | 00:47 | PASS |
+ +-------------------+------------------+------------------+----------------+
:
:
etc.
@@ -610,7 +257,7 @@ variables:
* The scenario [controller]-[feature]-[mode], stored in DEPLOY_SCENARIO with
* controller = (odl|ocl|nosdn|onos)
- * feature = (ovs(dpdk)|kvm|sfc|bgpvpn|multisites|ovs_dpdk_bar)
+ * feature = (ovs(dpdk)|kvm|sfc|bgpvpn|ovs_dpdk_bar)
* mode = (ha|noha)
The constraints per test case are defined in the Functest configuration file
@@ -686,3 +333,62 @@ might be eventually removed.
Please note that a system snapshot is taken before any test case execution.
This testcase.yaml file is used for CI, for the CLI and for the automatic reporting.
+
+
+Executing Functest suites (Alpine)
+==================================
+
+As mentioned in the configuration guide `[1]`_, Alpine docker containers have
+been introduced in Euphrates.
+Tier containers have been created.
+Assuming that you pulled the container and your environement is ready, you can
+simply run the tiers by typing (e.g. with functest-healthcheck)::
+
+ sudo docker run --env-file env \
+ -v $(pwd)/openstack.creds:/home/opnfv/functest/conf/openstack.creds \
+ -v $(pwd)/images:/home/opnfv/functest/images \
+ opnfv/functest-healthcheck
+
+You should get::
+
+ +----------------------------+------------------+---------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +----------------------------+------------------+---------------------+------------------+----------------+
+ | connection_check | functest | healthcheck | 00:02 | PASS |
+ | api_check | functest | healthcheck | 03:19 | PASS |
+ | snaps_health_check | functest | healthcheck | 00:46 | PASS |
+ +----------------------------+------------------+---------------------+------------------+----------------+
+
+You can run functest-healcheck, functest-smoke, functest-features,
+functest-components and functest-vnf.
+
+Please note that you may also use the CLI for manual tests using Alpine
+containers.
+
+
+Functest internal API
+=====================
+
+An internal API has been introduced in Euphrates. The goal is to trigger
+Functest operations through an API in addition of the CLI.
+This could be considered as a first step towards a pseudo micro services
+approach where the different test projects could expose and consume APIs to the
+other test projects.
+
+In Euphrates the main method of the APIs are:
+
+ * Show environment
+ * Prepare Environment
+ * Show credentials
+ * List all testcases
+ * Show a testcase
+ * List all tiers
+ * Show a tier
+ * List all testcases within given tier
+
+The API can be invoked as follows:
+ http://<functest_url>:5000/api/v1/functest/envs
+
+TODO
+
+.. _`[1]`: http://artifacts.opnfv.org/functest/colorado/docs/configguide/#
diff --git a/docs/testing/user/userguide/test_details.rst b/docs/testing/user/userguide/test_details.rst
new file mode 100644
index 000000000..5f5be4173
--- /dev/null
+++ b/docs/testing/user/userguide/test_details.rst
@@ -0,0 +1,539 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+
+
+The different test cases are described in the remaining sections of this document.
+
+VIM (Virtualized Infrastructure Manager)
+----------------------------------------
+
+Healthcheck tests
+^^^^^^^^^^^^^^^^^
+In Danube, healthcheck tests have been refactored and rely on SNAPS, an
+OPNFV middleware project.
+
+SNAPS stands for "SDN/NFV Application development Platform and Stack".
+SNAPS is an object-oriented OpenStack library packaged with tests that exercise
+OpenStack.
+More information on SNAPS can be found in  `[13]`_
+
+Three tests are declared as healthcheck tests and can be used for gating by the
+installer, they cover functionally the tests previously done by healthcheck
+test case.
+
+The tests are:
+
+
+ * *connection_check*
+ * *api_check*
+ * *snaps_health_check*
+
+Connection_check consists in 9 test cases (test duration < 5s) checking the
+connectivity with Glance, Keystone, Neutron, Nova and the external network.
+
+Api_check verifies the retrieval of OpenStack clients: Keystone, Glance,
+Neutron and Nova and may perform some simple queries. When the config value of
+snaps.use_keystone is True, functest must have access to the cloud's private
+network. This suite consists in 49 tests (test duration < 2 minutes).
+
+snaps_health_check creates instance, allocate floating IP, connect to the VM.
+This test replaced the previous Colorado healthcheck test.
+
+Self-obviously, successful completion of the 'healthcheck' testcase is a
+necessary pre-requisite for the execution of all other test Tiers.
+
+
+vPing_ssh
+^^^^^^^^^
+
+Given the script **ping.sh**::
+
+ #!/bin/sh
+ ping -c 1 $1 2>&1 >/dev/null
+ RES=$?
+ if [ "Z$RES" = "Z0" ] ; then
+ echo 'vPing OK'
+ else
+ echo 'vPing KO'
+ fi
+
+
+The goal of this test is to establish an SSH connection using a floating IP
+on the Public/External network and verify that 2 instances can talk over a Private
+Tenant network::
+
+ vPing_ssh test case
+ +-------------+ +-------------+
+ | | | |
+ | | Boot VM1 with IP1 | |
+ | +------------------->| |
+ | Tester | | System |
+ | | Boot VM2 | Under |
+ | +------------------->| Test |
+ | | | |
+ | | Create floating IP | |
+ | +------------------->| |
+ | | | |
+ | | Assign floating IP | |
+ | | to VM2 | |
+ | +------------------->| |
+ | | | |
+ | | Establish SSH | |
+ | | connection to VM2 | |
+ | | through floating IP| |
+ | +------------------->| |
+ | | | |
+ | | SCP ping.sh to VM2 | |
+ | +------------------->| |
+ | | | |
+ | | VM2 executes | |
+ | | ping.sh to VM1 | |
+ | +------------------->| |
+ | | | |
+ | | If ping: | |
+ | | exit OK | |
+ | | else (timeout): | |
+ | | exit Failed | |
+ | | | |
+ +-------------+ +-------------+
+
+This test can be considered as an "Hello World" example.
+It is the first basic use case which **must** work on any deployment.
+
+vPing_userdata
+^^^^^^^^^^^^^^
+
+This test case is similar to vPing_ssh but without the use of Floating IPs
+and the Public/External network to transfer the ping script.
+Instead, it uses Nova metadata service to pass it to the instance at booting time.
+As vPing_ssh, it checks that 2 instances can talk to
+each other on a Private Tenant network::
+
+ vPing_userdata test case
+ +-------------+ +-------------+
+ | | | |
+ | | Boot VM1 with IP1 | |
+ | +------------------->| |
+ | | | |
+ | | Boot VM2 with | |
+ | | ping.sh as userdata| |
+ | | with IP1 as $1. | |
+ | +------------------->| |
+ | Tester | | System |
+ | | VM2 exeutes ping.sh| Under |
+ | | (ping IP1) | Test |
+ | +------------------->| |
+ | | | |
+ | | Monitor nova | |
+ | | console-log VM 2 | |
+ | | If ping: | |
+ | | exit OK | |
+ | | else (timeout) | |
+ | | exit Failed | |
+ | | | |
+ +-------------+ +-------------+
+
+When the second VM boots it will execute the script passed as userdata
+automatically. The ping will be detected by periodically capturing the output
+in the console-log of the second VM.
+
+
+Tempest
+^^^^^^^
+
+Tempest `[2]`_ is the reference OpenStack Integration test suite.
+It is a set of integration tests to be run against a live OpenStack cluster.
+Tempest has suites of tests for:
+
+ * OpenStack API validation
+ * Scenarios
+ * Other specific tests useful in validating an OpenStack deployment
+
+Functest uses Rally `[3]`_ to run the Tempest suite.
+Rally generates automatically the Tempest configuration file **tempest.conf**.
+Before running the actual test cases,
+Functest creates the needed resources (user, tenant) and
+updates the appropriate parameters into the configuration file.
+
+When the Tempest suite is executed, each test duration is measured and the full
+console output is stored to a *log* file for further analysis.
+
+The Tempest testcases are distributed across two
+Tiers:
+
+ * Smoke Tier - Test Case 'tempest_smoke_serial'
+ * Components Tier - Test case 'tempest_full_parallel'
+
+NOTE: Test case 'tempest_smoke_serial' executes a defined set of tempest smoke
+tests with a single thread (i.e. serial mode). Test case 'tempest_full_parallel'
+executes all defined Tempest tests using several concurrent threads
+(i.e. parallel mode). The number of threads activated corresponds to the number
+of available logical CPUs.
+
+The goal of the Tempest test suite is to check the basic functionalities of the
+different OpenStack components on an OPNFV fresh installation, using the
+corresponding REST API interfaces.
+
+
+Rally bench test suites
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Rally `[3]`_ is a benchmarking tool that answers the question:
+
+*How does OpenStack work at scale?*
+
+The goal of this test suite is to benchmark all the different OpenStack modules and
+get significant figures that could help to define Telco Cloud KPIs.
+
+The OPNFV Rally scenarios are based on the collection of the actual Rally scenarios:
+
+ * authenticate
+ * cinder
+ * glance
+ * heat
+ * keystone
+ * neutron
+ * nova
+ * quotas
+
+A basic SLA (stop test on errors) has been implemented.
+
+The Rally testcases are distributed across two Tiers:
+
+ * Smoke Tier - Test Case 'rally_sanity'
+ * Components Tier - Test case 'rally_full'
+
+NOTE: Test case 'rally_sanity' executes a limited number of Rally smoke test
+cases. Test case 'rally_full' executes the full defined set of Rally tests.
+
+
+Refstack-client to run Defcore testcases
+-----------------------------------------
+
+Refstack-client `[8]`_ is a command line utility that allows you to
+execute Tempest test runs based on configurations you specify.
+It is the official tool to run Defcore `[9]`_ testcases,
+which focuses on testing interoperability between OpenStack clouds.
+
+Refstack-client is integrated in Functest, consumed by Dovetail, which
+intends to define and provide a set of OPNFV related validation criteria
+that will provide input for the evaluation of the use of OPNFV trademarks.
+This progress is under the guideline of Compliance Verification Program(CVP).
+
+Defcore testcases
+^^^^^^^^^^^^^^^^^^
+
+*Danube Release*
+
+Set of DefCore tempest test cases not flagged and required.
+According to `[10]`_, some tests are still flagged due to outstanding bugs
+in the Tempest library, particularly tests that require SSH. Refstack developers
+are working on correcting these bugs upstream. Please note that although some tests
+are flagged because of bugs, there is still an expectation that the capabilities
+covered by the tests are available. It only contains Openstack core compute
+(no object storage). The approved guidelines (2016.08) are valid for Kilo,
+Liberty, Mitaka and Newton releases of OpenStack.
+The list can be generated using the Rest API from RefStack project:
+https://refstack.openstack.org/api/v1/guidelines/2016.08/tests?target=compute&type=required&alias=true&flag=false
+
+Running methods
+^^^^^^^^^^^^^^^
+
+Two running methods are provided after refstack-client integrated into
+Functest, Functest command line and manually, respectively.
+
+By default, for Defcore test cases run by Functest command line,
+are run followed with automatically generated
+configuration file, i.e., refstack_tempest.conf. In some circumstances,
+the automatic configuration file may not quite satisfied with the SUT,
+Functest also inherits the refstack-client command line and provides a way
+for users to set its configuration file according to its own SUT manually.
+
+*command line*
+
+Inside the Functest container, first to prepare Functest environment:
+
+::
+
+ functest env prepare
+
+then to run default defcore testcases by using refstack-client:
+
+::
+
+ functest testcase run refstack_defcore
+
+In OPNFV Continuous Integration(CI) system, the command line method is used.
+
+*manually*
+
+Prepare the tempest configuration file and the testcases want to run with the SUT,
+run the testcases with:
+
+::
+
+ ./refstack-client test -c <Path of the tempest configuration file to use> -v --test-list <Path or URL of test list>
+
+using help for more information:
+
+::
+
+ ./refstack-client --help
+ ./refstack-client test --help
+
+Reference tempest configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+*command line method*
+
+When command line method is used, the default tempest configuration file
+is generated by Rally.
+
+*manually*
+
+When running manually is used, recommended way to generate tempest configuration
+file is:
+
+::
+
+ cd /usr/lib/python2.7/site-packages/functest/opnfv_tests/openstack/refstack_client
+ python tempest_conf.py
+
+a file called tempest.conf is stored in the current path by default, users can do
+some adjustment according to the SUT:
+
+::
+
+ vim refstack_tempest.conf
+
+a reference article can be used `[15]`_.
+
+
+snaps_smoke
+------------
+
+This test case contains tests that setup and destroy environments with VMs with
+and without Floating IPs with a newly created user and project. Set the config
+value snaps.use_floating_ips (True|False) to toggle this functionality. When
+the config value of snaps.use_keystone is True, Functest must have access
+the cloud's private network.
+This suite consists in 38 tests (test duration < 10 minutes)
+
+
+SDN Controllers
+---------------
+
+There are currently 3 available controllers:
+
+ * OpenDaylight (ODL)
+ * ONOS
+ * OpenContrail (OCL)
+
+OpenDaylight
+^^^^^^^^^^^^
+
+The OpenDaylight (ODL) test suite consists of a set of basic tests inherited
+from the ODL project using the Robot `[11]`_ framework.
+The suite verifies creation and deletion of networks, subnets and ports with
+OpenDaylight and Neutron.
+
+The list of tests can be described as follows:
+
+ * Basic Restconf test cases
+ * Connect to Restconf URL
+ * Check the HTTP code status
+
+ * Neutron Reachability test cases
+ * Get the complete list of neutron resources (networks, subnets, ports)
+
+ * Neutron Network test cases
+ * Check OpenStack networks
+ * Check OpenDaylight networks
+ * Create a new network via OpenStack and check the HTTP status code returned by Neutron
+ * Check that the network has also been successfully created in OpenDaylight
+
+ * Neutron Subnet test cases
+ * Check OpenStack subnets
+ * Check OpenDaylight subnets
+ * Create a new subnet via OpenStack and check the HTTP status code returned by Neutron
+ * Check that the subnet has also been successfully created in OpenDaylight
+
+ * Neutron Port test cases
+ * Check OpenStack Neutron for known ports
+ * Check OpenDaylight ports
+ * Create a new port via OpenStack and check the HTTP status code returned by Neutron
+ * Check that the new port has also been successfully created in OpenDaylight
+
+ * Delete operations
+ * Delete the port previously created via OpenStack
+ * Check that the port has been also successfully deleted in OpenDaylight
+ * Delete previously subnet created via OpenStack
+ * Check that the subnet has also been successfully deleted in OpenDaylight
+ * Delete the network created via OpenStack
+ * Check that the network has also been successfully deleted in OpenDaylight
+
+Note: the checks in OpenDaylight are based on the returned HTTP status
+code returned by OpenDaylight.
+
+
+ONOS
+^^^^
+
+TestON Framework is used to test the ONOS SDN controller functions.
+The test cases deal with L2 and L3 functions.
+The ONOS test suite can be run on any ONOS compliant scenario.
+
+The test cases are described as follows:
+
+ * onosfunctest: The main executable file contains the initialization of
+ the docker environment and functions called by FUNCvirNetNB and
+ FUNCvirNetNBL3
+
+ * FUNCvirNetNB
+
+ * Create Network: Post Network data and check it in ONOS
+ * Update Network: Update the Network and compare it in ONOS
+ * Delete Network: Delete the Network and check if it's NULL in ONOS or
+ not
+ * Create Subnet: Post Subnet data and check it in ONOS
+ * Update Subnet: Update the Subnet and compare it in ONOS
+ * Delete Subnet: Delete the Subnet and check if it's NULL in ONOS or not
+ * Create Port: Post Port data and check it in ONOS
+ * Update Port: Update the Port and compare it in ONOS
+ * Delete Port: Delete the Port and check if it's NULL in ONOS or not
+
+ * FUNCvirNetNBL3
+
+ * Create Router: Post data for create Router and check it in ONOS
+ * Update Router: Update the Router and compare it in ONOS
+ * Delete Router: Delete the Router data and check it in ONOS
+ * Create RouterInterface: Post Router Interface data to an existing Router
+ and check it in ONOS
+ * Delete RouterInterface: Delete the RouterInterface and check the Router
+ * Create FloatingIp: Post data for create FloatingIp and check it in ONOS
+ * Update FloatingIp: Update the FloatingIp and compare it in ONOS
+ * Delete FloatingIp: Delete the FloatingIp and check that it is 'NULL' in
+ ONOS
+ * Create External Gateway: Post data to create an External Gateway for an
+ existing Router and check it in ONOS
+ * Update External Gateway: Update the External Gateway and compare the change
+ * Delete External Gateway: Delete the External Gateway and check that it is
+ 'NULL' in ONOS
+
+
+Features
+--------
+
+Functest has been supporting several feature projects since Brahpamutra:
+
+
++-----------------+---------+----------+--------+-----------+
+| Test | Brahma | Colorado | Danube | Euphrates |
++=================+=========+==========+========+===========+
+| barometer | | | X | X |
++-----------------+---------+----------+--------+-----------+
+| bgpvpn | | X | X | X |
++-----------------+---------+----------+--------+-----------+
+| copper | | X | | |
++-----------------+---------+----------+--------+-----------+
+| doctor | X | X | X | X |
++-----------------+---------+----------+--------+-----------+
+| domino | | X | X | X |
++-----------------+---------+----------+--------+-----------+
+| fds | | | X | X |
++-----------------+---------+----------+--------+-----------+
+| moon | | X | | X |
++-----------------+---------+----------+--------+-----------+
+| multisite | | X | X | |
++-----------------+---------+----------+--------+-----------+
+| netready | | | X | |
++-----------------+---------+----------+--------+-----------+
+| odl_sfc | | X | X | X |
++-----------------+---------+----------+--------+-----------+
+| opera | | | X | |
++-----------------+---------+----------+--------+-----------+
+| orchestra | | | X | X |
++-----------------+---------+----------+--------+-----------+
+| parser | | | X | |
++-----------------+---------+----------+--------+-----------+
+| promise | X | X | X | X |
++-----------------+---------+----------+--------+-----------+
+| security_scan | | X | X | |
++-----------------+---------+----------+--------+-----------+
+
+Please refer to the dedicated feature user guides for details.
+
+
+VNF
+---
+
+
+cloudify_ims
+^^^^^^^^^^^^
+The IP Multimedia Subsystem or IP Multimedia Core Network Subsystem (IMS) is an
+architectural framework for delivering IP multimedia services.
+
+vIMS has been integrated in Functest to demonstrate the capability to deploy a
+relatively complex NFV scenario on the OPNFV platform. The deployment of a complete
+functional VNF allows the test of most of the essential functions needed for a
+NFV platform.
+
+The goal of this test suite consists of:
+
+ * deploy a VNF orchestrator (Cloudify)
+ * deploy a Clearwater vIMS (IP Multimedia Subsystem) VNF from this
+ orchestrator based on a TOSCA blueprint defined in `[5]`_
+ * run suite of signaling tests on top of this VNF
+
+The Clearwater architecture is described as follows:
+
+.. figure:: ../../../images/clearwater-architecture.png
+ :align: center
+ :alt: vIMS architecture
+
+orchestra_openims
+^^^^^^^^^^^^^^^^^
+Orchestra test case deals with the deployment of OpenIMS with OpenBaton
+orchestrator.
+
+orchestra_clearwaterims
+^^^^^^^^^^^^^^^^^^^^^^^
+Orchestra test case deals with the deployment of Clearwater vIMS with OpenBaton
+orchestrator.
+
+parser
+^^^^^^
+
+See parser user guide for details: `[12]`_
+
+
+vyos-vrouter
+^^^^^^^^^^^^
+
+This test case deals with the deployment and the test of vyos vrouter with
+Cloudify orchestrator. The test case can do testing for interchangeability of
+BGP Protocol using vyos.
+
+The Workflow is as follows:
+ * Deploy
+ Deploy VNF Testing topology by Cloudify using blueprint.
+ * Configuration
+ Setting configuration to Target VNF and reference VNF using ssh
+ * Run
+ Execution of test command for test item written YAML format file.
+ Check VNF status and behavior.
+ * Reporting
+ Output of report based on result using JSON format.
+
+The vyos-vrouter architecture is described in `[14]`_
+
+.. _`[2]`: http://docs.openstack.org/developer/tempest/overview.html
+.. _`[3]`: https://rally.readthedocs.org/en/latest/index.html
+.. _`[5]`: https://github.com/Orange-OpenSource/opnfv-cloudify-clearwater/blob/master/openstack-blueprint.yaml
+.. _`[8]`: https://github.com/openstack/refstack-client
+.. _`[10]`: https://github.com/openstack/interop/blob/master/2016.08/procedure.rst
+.. _`[11]`: http://robotframework.org/
+.. _`[12]`: http://artifacts.opnfv.org/parser/colorado/docs/userguide/index.html
+.. _`[13]`: https://wiki.opnfv.org/display/PROJ/SNAPS-OO
+.. _`[14]`: https://github.com/oolorg/opnfv-functest-vrouter
+.. _`[15]`: https://aptira.com/testing-openstack-tempest-part-1/
diff --git a/docs/testing/user/userguide/introduction.rst b/docs/testing/user/userguide/test_overview.rst
index 2954aaa83..6aae2825d 100644
--- a/docs/testing/user/userguide/introduction.rst
+++ b/docs/testing/user/userguide/test_overview.rst
@@ -132,10 +132,6 @@ validate the scenario for the release.
| | | | See `Domino User Guide`_ for |
| | | | details |
| | +----------------+----------------------------------+
-| | | multisite | Multisite |
-| | | | See `Multisite User Guide`_ for |
-| | | | details |
-| | +----------------+----------------------------------+
| | | odl-sfc | SFC testing for odl scenarios |
| | | | See `SFC User Guide`_ for details|
| | +----------------+----------------------------------+
@@ -159,11 +155,6 @@ validate the scenario for the release.
| | | | storage. |
| | | | See `Promise User Guide`_ for |
| | | | details. |
-| | +----------------+----------------------------------+
-| | | security_scan | Implementation of a simple |
-| | | | security scan. (Currently |
-| | | | available only for the Apex |
-| | | | installer environment) |
+-------------+---------------+----------------+----------------------------------+
| VNF | vnf | cloudify_ims | Example of a real VNF deployment |
| | | | to show the NFV capabilities of |
@@ -173,8 +164,11 @@ validate the scenario for the release.
| | | | It provides a fully functional |
| | | | VoIP System |
| | +----------------+----------------------------------+
-| | | orchestra_ims | OpenIMS deployment using |
-| | | | Openbaton orchestrator |
+| | | orchestra | OpenIMS deployment using |
+| | | openims | Openbaton orchestrator |
+| | +----------------+----------------------------------+
+| | | orchestra | Cleawater IMS deployment using |
+| | | cleawaterims | Openbaton orchestrator |
| | +----------------+----------------------------------+
| | | vyos_vrouter | vRouter testing |
+-------------+---------------+----------------+----------------------------------+
@@ -230,7 +224,7 @@ Functest considers OPNFV as a black box. As of Danube release the OPNFV
offers a lot of potential combinations:
* 3 controllers (OpenDaylight, ONOS, OpenContrail)
- * 4 installers (Apex, Compass, Fuel, Joid)
+ * 5 installers (Apex, Compass, Daisy, Fuel, Joid)
Most of the tests are runnable by any combination, but some tests might have
restrictions imposed by the utilized installers or due to the available
@@ -257,4 +251,3 @@ section `Executing the functest suites`_ of this document.
.. _`Parser User Guide`: http://artifacts.opnfv.org/parser/colorado/docs/userguide/index.html
.. _`Functest Dashboard`: http://testresults.opnfv.org/kibana_dashboards/
.. _`SFC User Guide`: http://artifacts.opnfv.org/sfc/colorado/userguide/index.html
-.. _`Multisite User Guide`: http://artifacts.opnfv.org/multisite/docs/userguide/index.html
diff --git a/docs/testing/user/userguide/test_results.rst b/docs/testing/user/userguide/test_results.rst
new file mode 100644
index 000000000..53e4d3a86
--- /dev/null
+++ b/docs/testing/user/userguide/test_results.rst
@@ -0,0 +1,50 @@
+Test results
+============
+
+Manual testing
+--------------
+
+In manual mode test results are displayed in the console and result files
+are put in /home/opnfv/functest/results.
+
+If you want additionnal logs, you may configure the logging.ini under <repo>/functest:functest/ci
+
+Automated testing
+--------------
+
+In automated mode, test results are displayed in jenkins logs, a summary is provided
+at the end of the job and can be described as follow::
+
+ +-------------------------+----------------------------------------------------------+
+ | ENV VAR | VALUE |
+ +-------------------------+----------------------------------------------------------+
+ | INSTALLER_TYPE | daisy |
+ | DEPLOY_SCENARIO | os-nosdn-nofeature-ha |
+ | BUILD_TAG | jenkins-functest-daisy-baremetal-daily-master-67 |
+ | CI_LOOP | daily |
+ +-------------------------+----------------------------------------------------------+
+
+ +------------------------------+------------------+---------------------+------------------+----------------+
+ | TEST CASE | PROJECT | TIER | DURATION | RESULT |
+ +------------------------------+------------------+---------------------+------------------+----------------+
+ | connection_check | functest | healthcheck | 00:08 | PASS |
+ | api_check | functest | healthcheck | 04:22 | PASS |
+ | snaps_health_check | functest | healthcheck | 00:35 | PASS |
+ | vping_ssh | functest | smoke | 00:54 | PASS |
+ | vping_userdata | functest | smoke | 00:27 | PASS |
+ | tempest_smoke_serial | functest | smoke | 19:39 | FAIL |
+ | rally_sanity | functest | smoke | 15:16 | PASS |
+ | refstack_defcore | functest | smoke | 15:55 | PASS |
+ | snaps_smoke | functest | smoke | 26:45 | FAIL |
+ | cloudify_ims | functest | vnf | 83:33 | FAIL |
+ | orchestra_ims | functest | vnf | 11:32 | FAIL |
+ +------------------------------+------------------+---------------------+------------------+----------------+
+
+Results are automatically pushed to the test results database, some additional
+result files are pushed to OPNFV artifact web sites.
+
+Based on the results stored in the result database, a `Functest reporting`_
+portal is also automatically updated. This portal provides information on the
+overall status per scenario and per installer
+
+.. _`Functest reporting`: http://testresults.opnfv.org/reporting/functest/release/danube/index-status-fuel.html
diff --git a/functest/opnfv_tests/vnf/aaa/__init__.py b/functest/api/__init__.py
index e69de29bb..e69de29bb 100644
--- a/functest/opnfv_tests/vnf/aaa/__init__.py
+++ b/functest/api/__init__.py
diff --git a/functest/api/base.py b/functest/api/base.py
new file mode 100644
index 000000000..ffc567860
--- /dev/null
+++ b/functest/api/base.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+The base class to dispatch request
+
+"""
+
+import logging
+
+from flask import request
+from flask_restful import Resource
+
+from functest.api.common import api_utils
+
+
+LOGGER = logging.getLogger(__name__)
+
+
+class ApiResource(Resource):
+ """ API Resource class"""
+
+ def __init__(self):
+ super(ApiResource, self).__init__()
+
+ def _post_args(self): # pylint: disable=no-self-use
+ # pylint: disable=maybe-no-member
+ """ Return action and args after parsing request """
+
+ data = request.json if request.json else {}
+ params = api_utils.change_to_str_in_dict(data)
+ action = params.get('action', request.form.get('action', ''))
+ args = params.get('args', {})
+ try:
+ args['file'] = request.files['file']
+ except KeyError:
+ pass
+ LOGGER.debug('Input args are: action: %s, args: %s', action, args)
+
+ return action, args
+
+ def _dispatch_post(self):
+ """ Dispatch request """
+ action, args = self._post_args()
+ return self._dispatch(args, action)
+
+ def _dispatch(self, args, action):
+ """
+ Dynamically load the classes with reflection and
+ obtain corresponding methods
+ """
+ try:
+ return getattr(self, action)(args)
+ except AttributeError:
+ api_utils.result_handler(status=1, data='No such action')
+
+
+# Import modules from package "functest.api.resources"
+# and append them into sys.modules
+api_utils.import_modules_from_package("functest.api.resources")
diff --git a/functest/api/common/__init__.py b/functest/api/common/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/functest/api/common/__init__.py
diff --git a/functest/api/common/api_utils.py b/functest/api/common/api_utils.py
new file mode 100644
index 000000000..d85acf927
--- /dev/null
+++ b/functest/api/common/api_utils.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Utils for functest restapi
+
+"""
+
+import collections
+import logging
+import os
+import sys
+from oslo_utils import importutils
+
+from flask import jsonify
+import six
+
+import functest
+
+LOGGER = logging.getLogger(__name__)
+
+
+def change_to_str_in_dict(obj):
+ """
+ Return a dict with key and value both in string if they are in Unicode
+ """
+ if isinstance(obj, collections.Mapping):
+ return {str(k): change_to_str_in_dict(v) for k, v in obj.items()}
+ elif isinstance(obj, list):
+ return [change_to_str_in_dict(ele) for ele in obj]
+ elif isinstance(obj, six.text_type):
+ return str(obj)
+ return obj
+
+
+def itersubclasses(cls, _seen=None):
+ """ Generator over all subclasses of a given class in depth first order """
+
+ if not isinstance(cls, type):
+ raise TypeError("itersubclasses must be called with "
+ "new-style classes, not %.100r" % cls)
+ _seen = _seen or set()
+ try:
+ subs = cls.__subclasses__()
+ except TypeError: # fails only when cls is type
+ subs = cls.__subclasses__(cls)
+ for sub in subs:
+ if sub not in _seen:
+ _seen.add(sub)
+ yield sub
+ for itersub in itersubclasses(sub, _seen):
+ yield itersub
+
+
+def import_modules_from_package(package):
+ """
+ Import modules from package and append into sys.modules
+ :param: package - Full package name. For example: functest.api.resources
+ """
+ path = [os.path.dirname(functest.__file__), ".."] + package.split(".")
+ path = os.path.join(*path)
+ for root, _, files in os.walk(path):
+ for filename in files:
+ if filename.startswith("__") or not filename.endswith(".py"):
+ continue
+ new_package = ".".join(root.split(os.sep)).split("....")[1]
+ module_name = "%s.%s" % (new_package, filename[:-3])
+ try:
+ try_append_module(module_name, sys.modules)
+ except ImportError:
+ LOGGER.exception("unable to import %s", module_name)
+
+
+def try_append_module(name, modules):
+ """ Append the module into specified module system """
+
+ if name not in modules:
+ modules[name] = importutils.import_module(name)
+
+
+def change_obj_to_dict(obj):
+ """ Transfer the object into dict """
+ dic = {}
+ for key, value in vars(obj).items():
+ dic.update({key: value})
+ return dic
+
+
+def result_handler(status, data):
+ """ Return the json format of result in dict """
+ result = {
+ 'status': status,
+ 'result': data
+ }
+ return jsonify(result)
diff --git a/functest/api/common/thread.py b/functest/api/common/thread.py
new file mode 100644
index 000000000..fb60aaac7
--- /dev/null
+++ b/functest/api/common/thread.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Used to handle multi-thread tasks
+"""
+
+import logging
+import threading
+
+from oslo_serialization import jsonutils
+
+
+LOGGER = logging.getLogger(__name__)
+
+
+class TaskThread(threading.Thread):
+ """ Task Thread Class """
+
+ def __init__(self, target, args, handler):
+ super(TaskThread, self).__init__(target=target, args=args)
+ self.target = target
+ self.args = args
+ self.handler = handler
+
+ def run(self):
+ """ Override the function run: run testcase and update database """
+ update_data = {'task_id': self.args.get('task_id'),
+ 'status': 'IN PROGRESS'}
+ self.handler.insert(update_data)
+
+ LOGGER.info('Starting running test case')
+
+ try:
+ data = self.target(self.args)
+ except Exception as err: # pylint: disable=broad-except
+ LOGGER.exception('Task Failed')
+ update_data = {'status': 'FAIL', 'error': str(err)}
+ self.handler.update_attr(self.args.get('task_id'), update_data)
+ else:
+ LOGGER.info('Task Finished')
+ LOGGER.debug('Result: %s', data)
+ new_data = {'status': 'FINISHED',
+ 'result': jsonutils.dumps(data.get('result', {}))}
+
+ self.handler.update_attr(self.args.get('task_id'), new_data)
diff --git a/functest/api/database/__init__.py b/functest/api/database/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/functest/api/database/__init__.py
diff --git a/functest/api/database/db.py b/functest/api/database/db.py
new file mode 100644
index 000000000..ea861ddbd
--- /dev/null
+++ b/functest/api/database/db.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Create database to store task results using sqlalchemy
+"""
+
+from sqlalchemy import create_engine
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.orm import scoped_session, sessionmaker
+
+
+SQLITE = 'sqlite:////tmp/functest.db'
+
+ENGINE = create_engine(SQLITE, convert_unicode=True)
+DB_SESSION = scoped_session(sessionmaker(autocommit=False,
+ autoflush=False,
+ bind=ENGINE))
+BASE = declarative_base()
+BASE.query = DB_SESSION.query_property()
diff --git a/functest/api/database/v1/__init__.py b/functest/api/database/v1/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/functest/api/database/v1/__init__.py
diff --git a/functest/api/database/v1/handlers.py b/functest/api/database/v1/handlers.py
new file mode 100644
index 000000000..7bd286ded
--- /dev/null
+++ b/functest/api/database/v1/handlers.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Used to handle tasks: insert the task info into database and update it
+"""
+
+from functest.api.database.db import DB_SESSION
+from functest.api.database.v1.models import Tasks
+
+
+class TasksHandler(object):
+ """ Tasks Handler Class """
+
+ def insert(self, kwargs): # pylint: disable=no-self-use
+ """ To insert the task info into database """
+ task = Tasks(**kwargs)
+ DB_SESSION.add(task) # pylint: disable=maybe-no-member
+ DB_SESSION.commit() # pylint: disable=maybe-no-member
+ return task
+
+ def get_task_by_taskid(self, task_id): # pylint: disable=no-self-use
+ """ Obtain the task by task id """
+ # pylint: disable=maybe-no-member
+ task = Tasks.query.filter_by(task_id=task_id).first()
+ if not task:
+ raise ValueError
+
+ return task
+
+ def update_attr(self, task_id, attr):
+ """ Update the required attributes of the task """
+ task = self.get_task_by_taskid(task_id)
+
+ for key, value in attr.items():
+ setattr(task, key, value)
+ DB_SESSION.commit() # pylint: disable=maybe-no-member
diff --git a/functest/api/database/v1/models.py b/functest/api/database/v1/models.py
new file mode 100644
index 000000000..c5de91bca
--- /dev/null
+++ b/functest/api/database/v1/models.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Define tables for tasks
+"""
+
+from sqlalchemy import Column
+from sqlalchemy import Integer
+from sqlalchemy import String
+from sqlalchemy import Text
+
+from functest.api.database.db import BASE
+
+
+class Tasks(BASE): # pylint: disable=too-few-public-methods, no-init
+ """ Create a table for tasks"""
+
+ __tablename__ = 'tasks'
+ id = Column(Integer, primary_key=True) # pylint: disable=invalid-name
+ task_id = Column(String(50))
+ status = Column(Integer)
+ error = Column(String(120))
+ result = Column(Text)
+
+ def __repr__(self):
+ return '<Task %r>' % Tasks.task_id
diff --git a/functest/api/resources/__init__.py b/functest/api/resources/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/functest/api/resources/__init__.py
diff --git a/functest/api/resources/v1/__init__.py b/functest/api/resources/v1/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/functest/api/resources/v1/__init__.py
diff --git a/functest/api/resources/v1/creds.py b/functest/api/resources/v1/creds.py
new file mode 100644
index 000000000..45e4559f4
--- /dev/null
+++ b/functest/api/resources/v1/creds.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Resources to handle openstack related requests
+"""
+
+import collections
+import logging
+
+from flask import jsonify
+
+from functest.api.base import ApiResource
+from functest.api.common import api_utils
+from functest.cli.commands.cli_os import OpenStack
+from functest.utils import openstack_utils as os_utils
+from functest.utils.constants import CONST
+
+LOGGER = logging.getLogger(__name__)
+
+
+class V1Creds(ApiResource):
+ """ V1Creds Resource class"""
+
+ def get(self): # pylint: disable=no-self-use
+ """ Get credentials """
+ os_utils.source_credentials(CONST.__getattribute__('openstack_creds'))
+ credentials_show = OpenStack.show_credentials()
+ return jsonify(credentials_show)
+
+ def post(self):
+ """ Used to handle post request """
+ return self._dispatch_post()
+
+ def update_openrc(self, args): # pylint: disable=no-self-use
+ """ Used to update the OpenStack RC file """
+ try:
+ openrc_vars = args['openrc']
+ except KeyError:
+ return api_utils.result_handler(
+ status=0, data='openrc must be provided')
+ else:
+ if not isinstance(openrc_vars, collections.Mapping):
+ return api_utils.result_handler(
+ status=0, data='args should be a dict')
+
+ lines = ['export {}={}\n'.format(k, v) for k, v in openrc_vars.items()]
+
+ rc_file = CONST.__getattribute__('openstack_creds')
+ with open(rc_file, 'w') as creds_file:
+ creds_file.writelines(lines)
+
+ LOGGER.info("Sourcing the OpenStack RC file...")
+ try:
+ os_utils.source_credentials(rc_file)
+ except Exception as err: # pylint: disable=broad-except
+ LOGGER.exception('Failed to source the OpenStack RC file')
+ return api_utils.result_handler(status=0, data=str(err))
+
+ return api_utils.result_handler(
+ status=0, data='Update openrc successfully')
diff --git a/functest/api/resources/v1/envs.py b/functest/api/resources/v1/envs.py
new file mode 100644
index 000000000..9c455198d
--- /dev/null
+++ b/functest/api/resources/v1/envs.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Resources to handle environment related requests
+"""
+
+from flask import jsonify
+
+from functest.api.base import ApiResource
+from functest.cli.commands.cli_env import Env
+from functest.api.common import api_utils
+import functest.utils.functest_utils as ft_utils
+
+
+class V1Envs(ApiResource):
+ """ V1Envs Resource class"""
+
+ def get(self): # pylint: disable=no-self-use
+ """ Get environment """
+ environment_show = Env().show()
+ return jsonify(environment_show)
+
+ def post(self):
+ """ Used to handle post request """
+ return self._dispatch_post()
+
+ def prepare(self, args): # pylint: disable=no-self-use, unused-argument
+ """ Prepare environment """
+ try:
+ ft_utils.execute_command("prepare_env start")
+ except Exception as err: # pylint: disable=broad-except
+ return api_utils.result_handler(status=1, data=str(err))
+ return api_utils.result_handler(
+ status=0, data="Prepare env successfully")
diff --git a/functest/api/resources/v1/tasks.py b/functest/api/resources/v1/tasks.py
new file mode 100644
index 000000000..7086e7075
--- /dev/null
+++ b/functest/api/resources/v1/tasks.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Resources to retrieve the task results
+"""
+
+
+import json
+import logging
+import uuid
+
+from flask import jsonify
+
+from functest.api.base import ApiResource
+from functest.api.common import api_utils
+from functest.api.database.v1.handlers import TasksHandler
+
+
+LOGGER = logging.getLogger(__name__)
+
+
+class V1Tasks(ApiResource):
+ """ V1Tasks Resource class"""
+
+ def get(self, task_id): # pylint: disable=no-self-use
+ """ GET the result of the task id """
+ try:
+ uuid.UUID(task_id)
+ except ValueError:
+ return api_utils.result_handler(status=1, data='Invalid task id')
+
+ task_handler = TasksHandler()
+ try:
+ task = task_handler.get_task_by_taskid(task_id)
+ except ValueError:
+ return api_utils.result_handler(status=1, data='No such task id')
+
+ status = task.status
+ LOGGER.debug('Task status is: %s', status)
+
+ if status not in ['IN PROGRESS', 'FAIL', 'FINISHED']:
+ return api_utils.result_handler(status=1,
+ data='internal server error')
+ if status == 'IN PROGRESS':
+ result = {'status': status, 'result': ''}
+ elif status == 'FAIL':
+ result = {'status': status, 'error': task.error}
+ else:
+ result = {'status': status, 'result': json.loads(task.result)}
+
+ return jsonify(result)
diff --git a/functest/api/resources/v1/testcases.py b/functest/api/resources/v1/testcases.py
new file mode 100644
index 000000000..f146c24ce
--- /dev/null
+++ b/functest/api/resources/v1/testcases.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Resources to handle testcase related requests
+"""
+
+import os
+import logging
+import uuid
+
+from flask import abort, jsonify
+
+from functest.api.base import ApiResource
+from functest.api.common import api_utils, thread
+from functest.cli.commands.cli_testcase import Testcase
+from functest.api.database.v1.handlers import TasksHandler
+from functest.utils.constants import CONST
+import functest.utils.functest_utils as ft_utils
+
+LOGGER = logging.getLogger(__name__)
+
+
+class V1Testcases(ApiResource):
+ """ V1Testcases Resource class"""
+
+ def get(self): # pylint: disable=no-self-use
+ """ GET all testcases """
+ testcases_list = Testcase().list()
+ result = {'testcases': testcases_list.split('\n')[:-1]}
+ return jsonify(result)
+
+
+class V1Testcase(ApiResource):
+ """ V1Testcase Resource class"""
+
+ def get(self, testcase_name): # pylint: disable=no-self-use
+ """ GET the info of one testcase"""
+ testcase = Testcase().show(testcase_name)
+ if not testcase:
+ abort(404, "The test case '%s' does not exist or is not supported"
+ % testcase_name)
+ testcase_info = api_utils.change_obj_to_dict(testcase)
+ dependency_dict = api_utils.change_obj_to_dict(
+ testcase_info.get('dependency'))
+ testcase_info.pop('name')
+ testcase_info.pop('dependency')
+ result = {'testcase': testcase_name}
+ result.update(testcase_info)
+ result.update({'dependency': dependency_dict})
+ return jsonify(result)
+
+ def post(self):
+ """ Used to handle post request """
+ return self._dispatch_post()
+
+ def run_test_case(self, args):
+ """ Run a testcase """
+ try:
+ case_name = args['testcase']
+ except KeyError:
+ return api_utils.result_handler(
+ status=1, data='testcase name must be provided')
+
+ task_id = str(uuid.uuid4())
+
+ task_args = {'testcase': case_name, 'task_id': task_id}
+
+ task_args.update(args.get('opts', {}))
+
+ task_thread = thread.TaskThread(self._run, task_args, TasksHandler())
+ task_thread.start()
+
+ results = {'testcase': case_name, 'task_id': task_id}
+ return jsonify(results)
+
+ def _run(self, args): # pylint: disable=no-self-use
+ """ The built_in function to run a test case """
+
+ case_name = args.get('testcase')
+
+ if not os.path.isfile(CONST.__getattribute__('env_active')):
+ raise Exception("Functest environment is not ready.")
+ else:
+ try:
+ cmd = "run_tests -t {}".format(case_name)
+ runner = ft_utils.execute_command(cmd)
+ except Exception: # pylint: disable=broad-except
+ result = 'FAIL'
+ LOGGER.exception("Running test case %s failed!", case_name)
+ if runner == os.EX_OK:
+ result = 'PASS'
+ else:
+ result = 'FAIL'
+
+ env_info = {
+ 'installer': CONST.__getattribute__('INSTALLER_TYPE'),
+ 'scenario': CONST.__getattribute__('DEPLOY_SCENARIO'),
+ 'build_tag': CONST.__getattribute__('BUILD_TAG'),
+ 'ci_loop': CONST.__getattribute__('CI_LOOP')
+ }
+ result = {
+ 'task_id': args.get('task_id'),
+ 'case_name': case_name,
+ 'env_info': env_info,
+ 'result': result
+ }
+
+ return {'result': result}
diff --git a/functest/api/resources/v1/tiers.py b/functest/api/resources/v1/tiers.py
new file mode 100644
index 000000000..71a98bea6
--- /dev/null
+++ b/functest/api/resources/v1/tiers.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Resources to handle tier related requests
+"""
+
+import re
+
+from flask import abort, jsonify
+
+from functest.api.base import ApiResource
+from functest.cli.commands.cli_tier import Tier
+
+
+class V1Tiers(ApiResource):
+ """ V1Tiers Resource class """
+
+ def get(self):
+ # pylint: disable=no-self-use
+ """ GET all tiers """
+ tiers_list = Tier().list()
+ data = re.split("[\n\t]", tiers_list)
+ data = [i.strip() for i in data if i != '']
+ data_dict = dict()
+ for i in range(len(data) / 2):
+ one_data = {data[i * 2]: data[i * 2 + 1]}
+ if i == 0:
+ data_dict = one_data
+ else:
+ data_dict.update(one_data)
+ result = {'tiers': data_dict}
+ return jsonify(result)
+
+
+class V1Tier(ApiResource):
+ """ V1Tier Resource class """
+
+ def get(self, tier_name): # pylint: disable=no-self-use
+ """ GET the info of one tier """
+ testcases = Tier().gettests(tier_name)
+ if not testcases:
+ abort(404, "The tier with name '%s' does not exist." % tier_name)
+ tier_info = Tier().show(tier_name)
+ tier_info.__dict__.pop('name')
+ tier_info.__dict__.pop('tests_array')
+ result = {'tier': tier_name, 'testcases': testcases}
+ result.update(tier_info.__dict__)
+ return jsonify(result)
+
+
+class V1TestcasesinTier(ApiResource):
+ """ V1TestcasesinTier Resource class """
+
+ def get(self, tier_name): # pylint: disable=no-self-use
+ """ GET all testcases within given tier """
+ testcases = Tier().gettests(tier_name)
+ if not testcases:
+ abort(404, "The tier with name '%s' does not exist." % tier_name)
+ result = {'tier': tier_name, 'testcases': testcases}
+ return jsonify(result)
diff --git a/functest/api/server.py b/functest/api/server.py
new file mode 100644
index 000000000..1d47b0dcb
--- /dev/null
+++ b/functest/api/server.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Used to launch Functest RestApi
+
+"""
+
+import inspect
+import logging
+import socket
+from urlparse import urljoin
+import pkg_resources
+
+from flask import Flask
+from flask_restful import Api
+
+from functest.api.base import ApiResource
+from functest.api.common import api_utils
+from functest.api.database.db import BASE
+from functest.api.database.db import DB_SESSION
+from functest.api.database.db import ENGINE
+from functest.api.database.v1 import models
+from functest.api.urls import URLPATTERNS
+
+
+LOGGER = logging.getLogger(__name__)
+
+APP = Flask(__name__)
+API = Api(APP)
+
+
+@APP.teardown_request
+def shutdown_session(exception=None): # pylint: disable=unused-argument
+ """
+ To be called at the end of each request whether it is successful
+ or an exception is raised
+ """
+ DB_SESSION.remove()
+
+
+def get_resource(resource_name):
+ """ Obtain the required resource according to resource name """
+ name = ''.join(resource_name.split('_'))
+ return next((r for r in api_utils.itersubclasses(ApiResource)
+ if r.__name__.lower() == name))
+
+
+def get_endpoint(url):
+ """ Obtain the endpoint of url """
+ address = socket.gethostbyname(socket.gethostname())
+ return urljoin('http://{}:5000'.format(address), url)
+
+
+def api_add_resource():
+ """
+ The resource has multiple URLs and you can pass multiple URLs to the
+ add_resource() method on the Api object. Each one will be routed to
+ your Resource
+ """
+ for url_pattern in URLPATTERNS:
+ try:
+ API.add_resource(
+ get_resource(url_pattern.target), url_pattern.url,
+ endpoint=get_endpoint(url_pattern.url))
+ except StopIteration:
+ LOGGER.error('url resource not found: %s', url_pattern.url)
+
+
+def init_db():
+ """
+ Import all modules here that might define models so that
+ they will be registered properly on the metadata, and then
+ create a database
+ """
+ def func(subcls):
+ """ To check the subclasses of BASE"""
+ try:
+ if issubclass(subcls[1], BASE):
+ return True
+ except TypeError:
+ pass
+ return False
+ # pylint: disable=bad-builtin
+ subclses = filter(func, inspect.getmembers(models, inspect.isclass))
+ LOGGER.debug('Import models: %s', [subcls[1] for subcls in subclses])
+ BASE.metadata.create_all(bind=ENGINE)
+
+
+def main():
+ """Entry point"""
+ logging.config.fileConfig(pkg_resources.resource_filename(
+ 'functest', 'ci/logging.ini'))
+ LOGGER.info('Starting Functest server')
+ api_add_resource()
+ init_db()
+ APP.run(host='0.0.0.0')
diff --git a/functest/api/urls.py b/functest/api/urls.py
new file mode 100644
index 000000000..f7bcae389
--- /dev/null
+++ b/functest/api/urls.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Define multiple URLs
+"""
+
+
+class Url(object): # pylint: disable=too-few-public-methods
+ """ Url Class """
+
+ def __init__(self, url, target):
+ super(Url, self).__init__()
+ self.url = url
+ self.target = target
+
+
+URLPATTERNS = [
+ # GET /api/v1/functest/envs => GET environment
+ Url('/api/v1/functest/envs', 'v1_envs'),
+
+ # POST /api/v1/functest/envs/action , {"action":"prepare"}
+ # => Prepare environment
+ Url('/api/v1/functest/envs/action', 'v1_envs'),
+
+ # GET /api/v1/functest/openstack/credentials => GET credentials
+ Url('/api/v1/functest/openstack/credentials', 'v1_creds'),
+
+ # POST /api/v1/functest/openstack/action
+ # {"action":"update_openrc", "args": {"openrc": {}}} => Update openrc
+ Url('/api/v1/functest/openstack/action', 'v1_creds'),
+
+ # GET /api/v1/functest/testcases => GET all testcases
+ Url('/api/v1/functest/testcases', 'v1_test_cases'),
+
+ # GET /api/v1/functest/testcases/<testcase_name>
+ # => GET the info of one testcase
+ Url('/api/v1/functest/testcases/<testcase_name>', 'v1_testcase'),
+
+ # POST /api/v1/functest/testcases/action
+ # {"action":"run_test_case", "args": {"opts": {}, "testcase": "vping_ssh"}}
+ # => Run a testcase
+ Url('/api/v1/functest/testcases/action', 'v1_testcase'),
+
+ # GET /api/v1/functest/testcases => GET all tiers
+ Url('/api/v1/functest/tiers', 'v1_tiers'),
+
+ # GET /api/v1/functest/tiers/<tier_name>
+ # => GET the info of one tier
+ Url('/api/v1/functest/tiers/<tier_name>', 'v1_tier'),
+
+ # GET /api/v1/functest/tiers/<tier_name>/testcases
+ # => GET all testcases within given tier
+ Url('/api/v1/functest/tiers/<tier_name>/testcases',
+ 'v1_testcases_in_tier'),
+
+ # GET /api/v1/functest/tasks/<task_id>
+ # => GET the result of the task id
+ Url('/api/v1/functest/tasks/<task_id>', 'v1_tasks')
+]
diff --git a/functest/ci/config_aarch64_patch.yaml b/functest/ci/config_aarch64_patch.yaml
index de82dbc70..6b3699b4d 100644
--- a/functest/ci/config_aarch64_patch.yaml
+++ b/functest/ci/config_aarch64_patch.yaml
@@ -18,6 +18,14 @@ os:
hw_firmware_type: 'uefi'
short_id: 'ubuntu16.04'
hw_video_model: 'vga'
+ ubuntu:
+ disk_file: /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-arm64-uefi1.img
+ extra_properties:
+ hw_firmware_type: 'uefi'
+ hw_video_model: 'vga'
+ centos:
+ disk_file: /home/opnfv/functest/images/CentOS-7-aarch64-GenericCloud.qcow2
+
vping:
image_name: TestVM
diff --git a/functest/ci/config_functest.yaml b/functest/ci/config_functest.yaml
index 679140fe8..cf63e1edd 100644
--- a/functest/ci/config_functest.yaml
+++ b/functest/ci/config_functest.yaml
@@ -5,7 +5,7 @@ general:
dir_repo_rally: /home/opnfv/repos/rally
repo_tempest: /src/tempest
dir_repo_releng: /home/opnfv/repos/releng
- repo_vims_test: /home/opnfv/repos/vnfs/vims-test
+ repo_vims_test: /src/vims-test
repo_onos: /home/opnfv/repos/onos
repo_barometer: /home/opnfv/repos/barometer
repo_doctor: /home/opnfv/repos/doctor
@@ -61,6 +61,25 @@ snaps:
disk_file: /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-amd64-disk1.img
centos:
disk_file: /home/opnfv/functest/images/CentOS-7-x86_64-GenericCloud.qcow2
+ # All of these values are optional and will override the values retrieved
+ # by the RC file
+# os_creds_override:
+# username: {user}
+# password: {password}
+# auth_url: {auth_url}
+# project_name: {project_name}
+# identity_api_version: {2|3}
+# network_api_version: {2}
+# compute_api_version: {2}
+# image_api_version: {1|2}
+# user_domain_id: {user_domain_id}
+# project_domain_id: {projects_domain_id}
+# interface: {interface}
+# cacert: {True|False}
+# proxy_settings:
+# host: {proxy_host}
+# port: {proxy_port}
+# ssh_proxy_cmd: {OpenSSH -o ProxyCommand value}
vping:
ping_timeout: 200
@@ -69,6 +88,9 @@ vping:
vm_name_2: opnfv-vping-2
image_name: functest-vping
private_net_name: vping-net
+ # network_type: vlan
+ # physical_network: physnet2
+ # segmentation_id: 2366
private_subnet_name: vping-subnet
private_subnet_cidr: 192.168.130.0/24
router_name: vping-router
@@ -121,10 +143,6 @@ rally:
router_name: rally-router
vnf:
- aaa:
- tenant_name: aaa
- tenant_description: Freeradius server
- tenant_images: {}
juju_epc:
tenant_name: epc
tenant_description: OAI EPC deployed with Juju
@@ -133,13 +151,14 @@ vnf:
tenant_name: cloudify_ims
tenant_description: vIMS
config: cloudify_ims.yaml
- orchestra_ims:
- tenant_name: orchestra_ims
- tenant_description: ims deployed with openbaton
- config: orchestra_ims.yaml
- opera_ims:
- tenant_name: opera_ims
- tenant_description: ims deployed with open-o
+ orchestra_openims:
+ tenant_name: orchestra_openims
+ tenant_description: OpenIMS deployed with Open Baton
+ config: orchestra.yaml
+ orchestra_clearwaterims:
+ tenant_name: orchestra_clearwaterims
+ tenant_description: Clearwater IMS deployed with Open Baton
+ config: orchestra.yaml
ONOS:
general:
@@ -158,14 +177,6 @@ ONOS:
installer_master: '10.20.0.2'
installer_master_username: 'root'
installer_master_password: 'r00tme'
-multisite:
- fuel:
- installer_username: 'root'
- installer_password: 'r00tme'
- compass:
- installer_username: 'root'
- installer_password: 'root'
- multisite_controller_ip: '10.1.0.50'
promise:
tenant_name: promise
tenant_description: promise Functionality Testing
@@ -201,3 +212,4 @@ energy_recorder:
api_url: http://energy.opnfv.fr/resources
api_user: ""
api_password: ""
+
diff --git a/functest/ci/config_patch.yaml b/functest/ci/config_patch.yaml
index ad8b0889f..865a564e6 100644
--- a/functest/ci/config_patch.yaml
+++ b/functest/ci/config_patch.yaml
@@ -20,6 +20,3 @@ ovs:
image_properties: {'hw_mem_page_size':'large'}
tempest:
use_custom_flavors: True
-multisite:
- tempest:
- use_custom_flavors: True
diff --git a/functest/ci/download_images.sh b/functest/ci/download_images.sh
index dd3e37894..88474d3a7 100644
--- a/functest/ci/download_images.sh
+++ b/functest/ci/download_images.sh
@@ -1,62 +1,25 @@
#!/bin/bash
-CIRROS_REPO_URL=http://download.cirros-cloud.net
-CIRROS_AARCH64_TAG=161201
-CIRROS_X86_64_TAG=0.3.5
-
-RED='\033[1;31m'
-NC='\033[0m' # No Color
-
-function usage(){
- echo -e "${RED}USAGE: $script <destination_folder> <scenario_name> [arch]${NC}"
- exit 0
-}
-
-script=`basename "$0"`
-IMAGES_FOLDER_DIR=$1
-SCENARIO=$2
-ARCH=$3
-
-if [[ -z $IMAGES_FOLDER_DIR ]]; then usage; fi;
-
set -ex
-mkdir -p ${IMAGES_FOLDER_DIR}
-
-
-####################
-# MANDATORY IMAGES #
-####################
-# These images should be present in Functest for the tests to work
-
-# Functest:
-wget -nc ${CIRROS_REPO_URL}/${CIRROS_X86_64_TAG}/cirros-${CIRROS_X86_64_TAG}-x86_64-disk.img -P ${IMAGES_FOLDER_DIR}
-wget -nc ${CIRROS_REPO_URL}/${CIRROS_X86_64_TAG}/cirros-${CIRROS_X86_64_TAG}-x86_64-lxc.tar.gz -P ${IMAGES_FOLDER_DIR}
-
-# SNAPS:
-wget -nc http://uec-images.ubuntu.com/releases/trusty/14.04/ubuntu-14.04-server-cloudimg-amd64-disk1.img -P ${IMAGES_FOLDER_DIR}
-wget -nc http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2 -P ${IMAGES_FOLDER_DIR}
-
-
-###################
-# OPTIONAL IMAGES #
-###################
-# Optional images can be commented if they are not going to be used by the tests
-
-# SDNVPN (odl-bgpvpn scenarios):
-if [[ ${SCENARIO} == *"bgpvpn"* ]]; then
- wget -nc http://artifacts.opnfv.org/sdnvpn/ubuntu-16.04-server-cloudimg-amd64-disk1.img -P ${IMAGES_FOLDER_DIR}
-fi
-
-# ONOS (onos-sfc scenarios):
-if [[ ${SCENARIO} == *"onos-sfc"* ]]; then
- wget -nc http://artifacts.opnfv.org/onosfw/images/firewall_block_image.img -P ${IMAGES_FOLDER_DIR}
-fi
-
-if [[ ${ARCH} == "arm" ]] || [[ ${ARCH} == "aarch64" ]]; then
- # ARM (aarch64 cirros images):
- wget -nc ${CIRROS_REPO_URL}/daily/20${CIRROS_AARCH64_TAG}/cirros-d${CIRROS_AARCH64_TAG}-aarch64-disk.img -P ${IMAGES_FOLDER_DIR}
- wget -nc ${CIRROS_REPO_URL}/daily/20${CIRROS_AARCH64_TAG}/cirros-d${CIRROS_AARCH64_TAG}-aarch64-initramfs -P ${IMAGES_FOLDER_DIR}
- wget -nc ${CIRROS_REPO_URL}/daily/20${CIRROS_AARCH64_TAG}/cirros-d${CIRROS_AARCH64_TAG}-aarch64-kernel -P ${IMAGES_FOLDER_DIR}
-fi
-set +ex \ No newline at end of file
+wget_opts="-N --tries=1 --connect-timeout=30"
+
+cat << EOF | wget ${wget_opts} -i - -P ${1:-/home/opnfv/functest/images}
+http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img
+https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-amd64-disk1.img
+https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2
+https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-amd64-disk1.img
+http://repository.cloudifysource.org/cloudify/4.0.1/sp-release/cloudify-manager-premium-4.0.1.qcow2
+http://marketplace.openbaton.org:8082/api/v1/images/52e2ccc0-1dce-4663-894d-28aab49323aa/img
+http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img
+http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-lxc.tar.gz
+http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-disk.img
+http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-initramfs
+http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-kernel
+https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-arm64-uefi1.img
+http://cloud.centos.org/altarch/7/images/aarch64/CentOS-7-aarch64-GenericCloud.qcow2.xz
+EOF
+
+xz --decompress --force ${1:-/home/opnfv/functest/images}/CentOS-7-aarch64-GenericCloud.qcow2.xz
+
+exit $?
diff --git a/functest/ci/logging.ini b/functest/ci/logging.ini
index 210c8f5f4..f1ab72414 100644
--- a/functest/ci/logging.ini
+++ b/functest/ci/logging.ini
@@ -1,5 +1,5 @@
[loggers]
-keys=root,functest,ci,cli,core,energy,opnfv_tests,utils
+keys=root,functest,api,ci,cli,core,energy,opnfv_tests,utils
[handlers]
keys=console,wconsole,file,null
@@ -16,6 +16,11 @@ level=NOTSET
handlers=file
qualname=functest
+[logger_api]
+level=NOTSET
+handlers=wconsole
+qualname=functest.api
+
[logger_ci]
level=NOTSET
handlers=console
diff --git a/functest/ci/prepare_env.py b/functest/ci/prepare_env.py
index c40e32660..a354dbe83 100644
--- a/functest/ci/prepare_env.py
+++ b/functest/ci/prepare_env.py
@@ -33,7 +33,7 @@ actions = ['start', 'check']
logger = logging.getLogger('functest.ci.prepare_env')
handler = None
# set the architecture to default
-pod_arch = None
+pod_arch = os.getenv("POD_ARCH", None)
arch_filter = ['aarch64']
CONFIG_FUNCTEST_PATH = pkg_resources.resource_filename(
diff --git a/functest/ci/run_tests.py b/functest/ci/run_tests.py
index e26f43051..87e3d37ba 100644
--- a/functest/ci/run_tests.py
+++ b/functest/ci/run_tests.py
@@ -92,6 +92,8 @@ class Runner(object):
CONST.__setattr__('OS_TENANT_NAME', value)
elif key == 'OS_PASSWORD':
CONST.__setattr__('OS_PASSWORD', value)
+ elif key == "OS_PROJECT_DOMAIN_NAME":
+ CONST.__setattr__('OS_PROJECT_DOMAIN_NAME', value)
@staticmethod
def get_run_dict(testname):
@@ -186,12 +188,12 @@ class Runner(object):
self.run_tier(tier)
def main(self, **kwargs):
- if kwargs['noclean']:
+ if 'noclean' in kwargs:
self.clean_flag = False
- if kwargs['report']:
+ if 'report' in kwargs:
self.report_flag = True
try:
- if kwargs['test']:
+ if 'test' in kwargs:
self.source_rc_file()
logger.debug("Test args: %s", kwargs['test'])
if self._tiers.get_tier(kwargs['test']):
@@ -241,12 +243,18 @@ class Runner(object):
tiers = [tier] if tier else self._tiers.get_tiers()
for tier in tiers:
for test in tier.get_tests():
- test_case = self.executed_test_cases[test.get_name()]
- result = 'PASS' if(test_case.is_successful(
- ) == test_case.EX_OK) else 'FAIL'
- msg.add_row([test_case.case_name, test_case.project_name,
- self._tiers.get_tier_name(test_case.case_name),
- test_case.get_duration(), result])
+ try:
+ test_case = self.executed_test_cases[test.get_name()]
+ except KeyError:
+ msg.add_row([test.get_name(), test.get_project(),
+ tier.get_name(), "00:00", "SKIP"])
+ else:
+ result = 'PASS' if(test_case.is_successful(
+ ) == test_case.EX_OK) else 'FAIL'
+ msg.add_row(
+ [test_case.case_name, test_case.project_name,
+ self._tiers.get_tier_name(test_case.case_name),
+ test_case.get_duration(), result])
for test in tier.get_skipped_test():
msg.add_row([test.get_name(), test.get_project(),
tier.get_name(), "00:00", "SKIP"])
diff --git a/functest/ci/testcases.yaml b/functest/ci/testcases.yaml
index 869144811..fac81267f 100644
--- a/functest/ci/testcases.yaml
+++ b/functest/ci/testcases.yaml
@@ -269,6 +269,7 @@ tiers:
-
case_name: doctor-notification
+ enabled: false
project_name: doctor
criteria: 100
blocking: false
@@ -317,21 +318,6 @@ tiers:
cmd: '. /home/opnfv/functest/conf/stackrc && security_scan --config /usr/local/etc/securityscanning/config.ini'
-
- case_name: multisite
- enabled: false
- project_name: multisite
- criteria: 100
- blocking: false
- description: >-
- Test suite from kingbird
- dependencies:
- installer: '(fuel)|(compass)'
- scenario: 'multisite'
- run:
- module: 'functest.opnfv_tests.openstack.tempest.tempest'
- class: 'TempestMultisite'
-
- -
case_name: functest-odl-sfc
enabled: false
project_name: sfc
@@ -399,18 +385,17 @@ tiers:
-
case_name: barometercollectd
- enabled: false
+ enabled: true
project_name: barometer
criteria: 100
blocking: false
description: >-
- Test suite for the Barometer project. Separate tests verify the
- proper configuration and functionality of the following
- collectd plugins Ceilometer, Hugepages, Memory RAS (mcelog),
- and OVS Events
+ Test suite for the Barometer project. Separate tests verify
+ the proper configuration and basic functionality of all the
+ collectd plugins as described in the Project Release Plan
dependencies:
- installer: 'fuel'
- scenario: 'kvm_ovs_dpdk_bar'
+ installer: 'apex'
+ scenario: 'bar'
run:
module: 'baro_tests.barometer'
class: 'BarometerCollectd'
@@ -474,7 +459,7 @@ tiers:
-
name: vnf
order: 4
- ci_loop: 'daily'
+ ci_loop: '(daily)|(weekly)'
description : >-
Collection of VNF test cases.
testcases:
@@ -492,51 +477,33 @@ tiers:
run:
module: 'functest.opnfv_tests.vnf.ims.cloudify_ims'
class: 'CloudifyIms'
-
-
- case_name: aaa
- enabled: false
+ case_name: orchestra_openims
project_name: functest
criteria: 100
blocking: false
description: >-
- Test suite from Parser project.
+ OpenIMS VNF deployment with Open Baton (Orchestra)
dependencies:
installer: ''
- scenario: ''
+ scenario: 'os-nosdn-nofeature-ha'
run:
- module: 'functest.opnfv_tests.vnf.aaa.aaa'
- class: 'AaaVnf'
+ module: 'functest.opnfv_tests.vnf.ims.orchestra_openims'
+ class: 'OpenImsVnf'
-
- case_name: orchestra_ims
- enabled: true
+ case_name: orchestra_clearwaterims
project_name: functest
criteria: 100
blocking: false
description: >-
- VNF deployment with OpenBaton (Orchestra)
+ ClearwaterIMS VNF deployment with Open Baton (Orchestra)
dependencies:
installer: ''
scenario: 'os-nosdn-nofeature-ha'
run:
- module: 'functest.opnfv_tests.vnf.ims.orchestra_ims'
- class: 'ImsVnf'
-
- -
- case_name: opera_vims
- enabled: false
- project_name: opera
- criteria: 100
- blocking: false
- description: >-
- VNF deployment with OPEN-O
- dependencies:
- installer: 'compass'
- scenario: 'os-nosdn-openo-ha'
- run:
- module: 'functest.opnfv_tests.vnf.ims.opera_ims'
- class: 'OperaIms'
+ module: 'functest.opnfv_tests.vnf.ims.orchestra_clearwaterims'
+ class: 'ClearwaterImsVnf'
-
case_name: vyos_vrouter
diff --git a/functest/cli/commands/cli_env.py b/functest/cli/commands/cli_env.py
index 99d36996d..72a870b59 100644
--- a/functest/cli/commands/cli_env.py
+++ b/functest/cli/commands/cli_env.py
@@ -16,7 +16,7 @@ from functest.utils.constants import CONST
import functest.utils.functest_utils as ft_utils
-class CliEnv(object):
+class Env(object):
def __init__(self):
pass
@@ -56,17 +56,14 @@ class CliEnv(object):
if self.status(verbose=False) == 0:
STATUS = "ready"
- msg = prettytable.PrettyTable(
- header_style='upper', padding_width=5,
- field_names=['Functest Environment', 'value'])
- msg.add_row(['INSTALLER', installer_info])
- msg.add_row(['SCENARIO', scenario])
- msg.add_row(['POD', node])
- if build_tag:
- msg.add_row(['BUILD TAG', build_tag])
- msg.add_row(['DEBUG FLAG', is_debug])
- msg.add_row(['STATUS', STATUS])
- click.echo(msg.get_string())
+ env_info = {'INSTALLER': installer_info,
+ 'SCENARIO': scenario,
+ 'POD': node,
+ 'DEBUG FLAG': is_debug,
+ 'BUILD_TAG': build_tag,
+ 'STATUS': STATUS}
+
+ return env_info
def status(self, verbose=True):
ret_val = 0
@@ -78,3 +75,19 @@ class CliEnv(object):
click.echo("Functest environment ready to run tests.\n")
return ret_val
+
+
+class CliEnv(Env):
+
+ def __init__(self):
+ super(CliEnv, self).__init__()
+
+ def show(self):
+ env_info = super(CliEnv, self).show()
+ msg = prettytable.PrettyTable(
+ header_style='upper', padding_width=5,
+ field_names=['Functest Environment', 'value'])
+ for key, value in env_info.iteritems():
+ if key is not None:
+ msg.add_row([key, value])
+ click.echo(msg.get_string())
diff --git a/functest/cli/commands/cli_os.py b/functest/cli/commands/cli_os.py
index f4ec16615..e97ab0809 100644
--- a/functest/cli/commands/cli_os.py
+++ b/functest/cli/commands/cli_os.py
@@ -18,7 +18,7 @@ import functest.utils.openstack_clean as os_clean
import functest.utils.openstack_snapshot as os_snapshot
-class CliOpenStack(object):
+class OpenStack(object):
def __init__(self):
self.os_auth_url = CONST.__getattribute__('OS_AUTH_URL')
@@ -43,9 +43,11 @@ class CliOpenStack(object):
@staticmethod
def show_credentials():
+ dic_credentials = {}
for key, value in os.environ.items():
if key.startswith('OS_'):
- click.echo("{}={}".format(key, value))
+ dic_credentials.update({key: value})
+ return dic_credentials
def check(self):
self.ping_endpoint()
@@ -88,3 +90,16 @@ class CliOpenStack(object):
"'functest openstack snapshot-create'")
return
os_clean.main()
+
+
+class CliOpenStack(OpenStack):
+
+ def __init__(self):
+ super(CliOpenStack, self).__init__()
+
+ @staticmethod
+ def show_credentials():
+ dic_credentials = OpenStack.show_credentials()
+ for key, value in dic_credentials.items():
+ if key.startswith('OS_'):
+ click.echo("{}={}".format(key, value))
diff --git a/functest/cli/commands/cli_testcase.py b/functest/cli/commands/cli_testcase.py
index cb3d47391..65dd9ab75 100644
--- a/functest/cli/commands/cli_testcase.py
+++ b/functest/cli/commands/cli_testcase.py
@@ -20,7 +20,7 @@ import functest.utils.functest_utils as ft_utils
import functest.utils.functest_vacation as vacation
-class CliTestcase(object):
+class Testcase(object):
def __init__(self):
self.tiers = tb.TierBuilder(
@@ -33,15 +33,11 @@ class CliTestcase(object):
for tier in self.tiers.get_tiers():
for test in tier.get_tests():
summary += (" %s\n" % test.get_name())
- click.echo(summary)
+ return summary
def show(self, testname):
description = self.tiers.get_test(testname)
- if description is None:
- click.echo("The test case '%s' does not exist or is not supported."
- % testname)
-
- click.echo(description)
+ return description
@staticmethod
def run(testname, noclean=False, report=False):
@@ -62,3 +58,20 @@ class CliTestcase(object):
for test in tests:
cmd = "run_tests {}-t {}".format(flags, test)
ft_utils.execute_command(cmd)
+
+
+class CliTestcase(Testcase):
+
+ def __init__(self):
+ super(CliTestcase, self).__init__()
+
+ def list(self):
+ click.echo(super(CliTestcase, self).list())
+
+ def show(self, testname):
+ testcase_show = super(CliTestcase, self).show(testname)
+ if testcase_show:
+ click.echo(testcase_show)
+ else:
+ click.echo("The test case '%s' does not exist or is not supported."
+ % testname)
diff --git a/functest/cli/commands/cli_tier.py b/functest/cli/commands/cli_tier.py
index 9b2e60baa..995354bbd 100644
--- a/functest/cli/commands/cli_tier.py
+++ b/functest/cli/commands/cli_tier.py
@@ -19,7 +19,7 @@ from functest.utils.constants import CONST
import functest.utils.functest_utils as ft_utils
-class CliTier(object):
+class Tier(object):
def __init__(self):
self.tiers = tb.TierBuilder(
@@ -34,26 +34,23 @@ class CliTier(object):
% (tier.get_order(),
tier.get_name(),
tier.get_test_names()))
- click.echo(summary)
+ return summary
def show(self, tiername):
tier = self.tiers.get_tier(tiername)
if tier is None:
- tier_names = self.tiers.get_tier_names()
- click.echo("The tier with name '%s' does not exist. "
- "Available tiers are:\n %s\n" % (tiername, tier_names))
+ return None
else:
- click.echo(self.tiers.get_tier(tiername))
+ tier_info = self.tiers.get_tier(tiername)
+ return tier_info
def gettests(self, tiername):
tier = self.tiers.get_tier(tiername)
if tier is None:
- tier_names = self.tiers.get_tier_names()
- click.echo("The tier with name '%s' does not exist. "
- "Available tiers are:\n %s\n" % (tiername, tier_names))
+ return None
else:
tests = tier.get_test_names()
- click.echo("Test cases in tier '%s':\n %s\n" % (tiername, tests))
+ return tests
@staticmethod
def run(tiername, noclean=False, report=False):
@@ -70,3 +67,30 @@ class CliTier(object):
else:
cmd = "run_tests {}-t {}".format(flags, tiername)
ft_utils.execute_command(cmd)
+
+
+class CliTier(Tier):
+
+ def __init__(self):
+ super(CliTier, self).__init__()
+
+ def list(self):
+ click.echo(super(CliTier, self).list())
+
+ def show(self, tiername):
+ tier_info = super(CliTier, self).show(tiername)
+ if tier_info:
+ click.echo(tier_info)
+ else:
+ tier_names = self.tiers.get_tier_names()
+ click.echo("The tier with name '%s' does not exist. "
+ "Available tiers are:\n %s\n" % (tiername, tier_names))
+
+ def gettests(self, tiername):
+ tests = super(CliTier, self).gettests(tiername)
+ if tests:
+ click.echo("Test cases in tier '%s':\n %s\n" % (tiername, tests))
+ else:
+ tier_names = self.tiers.get_tier_names()
+ click.echo("The tier with name '%s' does not exist. "
+ "Available tiers are:\n %s\n" % (tiername, tier_names))
diff --git a/functest/energy/energy.py b/functest/energy/energy.py
index ec03e1801..508f18e74 100644
--- a/functest/energy/energy.py
+++ b/functest/energy/energy.py
@@ -16,6 +16,7 @@ import urllib
from functools import wraps
import requests
+import urllib3
from functest.utils.constants import CONST
import functest.utils.functest_utils as ft_utils
@@ -77,7 +78,7 @@ class EnergyRecorder(object):
INITIAL_STEP = "running"
# Default connection timeout
- CONNECTION_TIMOUT = 1
+ CONNECTION_TIMOUT = urllib3.Timeout(connect=1, read=3)
@staticmethod
def load_config():
@@ -105,13 +106,13 @@ class EnergyRecorder(object):
"API recorder at: " + energy_recorder_uri + uri_comp)
# Creds
- user = ft_utils.get_functest_config(
+ creds_usr = ft_utils.get_functest_config(
"energy_recorder.api_user")
- password = ft_utils.get_functest_config(
+ creds_pass = ft_utils.get_functest_config(
"energy_recorder.api_password")
- if user != "" and password != "":
- energy_recorder_api_auth = (user, password)
+ if creds_usr != "" and creds_pass != "":
+ energy_recorder_api_auth = (creds_usr, creds_pass)
else:
energy_recorder_api_auth = None
diff --git a/functest/opnfv_tests/openstack/rally/blacklist.txt b/functest/opnfv_tests/openstack/rally/blacklist.txt
index 95bea2b7a..099d6864d 100644
--- a/functest/opnfv_tests/openstack/rally/blacklist.txt
+++ b/functest/opnfv_tests/openstack/rally/blacklist.txt
@@ -6,6 +6,38 @@ scenario:
- joid
tests:
- NovaServers.boot_server_from_volume_and_delete
+ -
+ scenarios:
+ - '^os-' # all scenarios
+ installers:
+ - '.+' # all installers
+ tests:
+ # Following tests currently fail due to required Gnocchi API:
+ # HTTP 410: "This telemetry installation is configured to use
+ # Gnocchi. Please use the Gnocchi API available on the
+ # metric endpoint to retrieve data."
+ # Issue: https://bugs.launchpad.net/rally/+bug/1704322
+ - CeilometerMeters.list_matched_meters
+ - CeilometerMeters.list_meters
+ - CeilometerQueries.create_and_query_samples
+ - CeilometerResource.get_tenant_resources
+ - CeilometerResource.list_matched_resources
+ - CeilometerResource.list_resources
+ - CeilometerSamples.list_matched_samples
+ - CeilometerSamples.list_samples
+ - CeilometerStats.create_meter_and_get_stats
+ - CeilometerStats.get_stats
+ -
+ scenarios:
+ - '^os-' # all scenarios
+ installers:
+ - '.+' # all installers
+ tests:
+ # Following test currently fails due to but in
+ # python-ceilometerclient during fetching of event_types
+ # Bug: https://bugs.launchpad.net/ubuntu/+bug/1704138
+ # Fix: https://review.openstack.org/#/c/483402/
+ - CeilometerEvents.create_user_and_list_event_types
functionality:
-
diff --git a/functest/opnfv_tests/openstack/rally/rally.py b/functest/opnfv_tests/openstack/rally/rally.py
index 6b7c49ca7..fdef8bed0 100644
--- a/functest/opnfv_tests/openstack/rally/rally.py
+++ b/functest/opnfv_tests/openstack/rally/rally.py
@@ -34,8 +34,8 @@ LOGGER = logging.getLogger(__name__)
class RallyBase(testcase.OSGCTestCase):
"""Base class form Rally testcases implementation."""
- TESTS = ['authenticate', 'glance', 'cinder', 'heat', 'keystone',
- 'neutron', 'nova', 'quotas', 'vm', 'all']
+ TESTS = ['authenticate', 'glance', 'ceilometer', 'cinder', 'heat',
+ 'keystone', 'neutron', 'nova', 'quotas', 'vm', 'all']
GLANCE_IMAGE_NAME = CONST.__getattribute__('openstack_image_name')
GLANCE_IMAGE_FILENAME = CONST.__getattribute__('openstack_image_file_name')
GLANCE_IMAGE_PATH = os.path.join(
diff --git a/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml
new file mode 100644
index 000000000..7efb5a83b
--- /dev/null
+++ b/functest/opnfv_tests/openstack/rally/scenario/full/opnfv-ceilometer.yaml
@@ -0,0 +1,458 @@
+ CeilometerMeters.list_meters:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ ceilometer:
+ counter_name: "benchmark_meter"
+ counter_type: "gauge"
+ counter_unit: "%"
+ counter_volume: 100
+ resources_per_tenant: 100
+ samples_per_resource: 100
+ timestamp_interval: 10
+ metadata_list:
+ -
+ status: "active"
+ name: "rally benchmark on"
+ deleted: "false"
+ -
+ status: "terminated"
+ name: "rally benchmark off"
+ deleted: "true"
+ {% endcall %}
+ args:
+ limit: 50
+ metadata_query:
+ status: "terminated"
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerResource.list_resources:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ ceilometer:
+ counter_name: "benchmark_meter"
+ counter_type: "gauge"
+ counter_unit: "%"
+ counter_volume: 100
+ resources_per_tenant: 100
+ samples_per_resource: 100
+ timestamp_interval: 10
+ metadata_list:
+ -
+ status: "active"
+ name: "rally benchmark on"
+ deleted: "false"
+ -
+ status: "terminated"
+ name: "rally benchmark off"
+ deleted: "true"
+ {% endcall %}
+ args:
+ limit: 50
+ metadata_query:
+ status: "terminated"
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerAlarms.create_alarm_and_get_history:
+ -
+ args:
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ state: "ok"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerAlarms.create_and_delete_alarm:
+ -
+ args:
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerAlarms.create_and_get_alarm:
+ -
+ args:
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerAlarms.create_and_list_alarm:
+ -
+ args:
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerQueries.create_and_query_alarm_history:
+ -
+ args:
+ orderby: !!null
+ limit: !!null
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerQueries.create_and_query_alarms:
+ -
+ args:
+ filter: {"and": [{"!=": {"state": "dummy_state"}},{"=": {"type": "threshold"}}]}
+ orderby: !!null
+ limit: 10
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerQueries.create_and_query_samples:
+ -
+ args:
+ filter: {"=": {"counter_unit": "instance"}}
+ orderby: !!null
+ limit: 10
+ counter_name: "cpu_util"
+ counter_type: "gauge"
+ counter_unit: "instance"
+ counter_volume: 1.0
+ resource_id: "resource_id"
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerAlarms.create_and_update_alarm:
+ -
+ args:
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerStats.create_meter_and_get_stats:
+ -
+ args:
+ user_id: "user-id"
+ resource_id: "resource-id"
+ counter_volume: 1.0
+ counter_unit: ""
+ counter_type: "cumulative"
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerEvents.create_user_and_get_event:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerEvents.create_user_and_list_events:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerEvents.create_user_and_list_event_types:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerTraits.create_user_and_list_trait_descriptions:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerTraits.create_user_and_list_traits:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerStats.get_stats:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ ceilometer:
+ counter_name: "benchmark_meter"
+ counter_type: "gauge"
+ counter_unit: "%"
+ counter_volume: 100
+ resources_per_tenant: 100
+ samples_per_resource: 100
+ timestamp_interval: 10
+ metadata_list:
+ -
+ status: "active"
+ name: "rally benchmark on"
+ deleted: "false"
+ -
+ status: "terminated"
+ name: "rally benchmark off"
+ deleted: "true"
+ {% endcall %}
+ args:
+ meter_name: "benchmark_meter"
+ filter_by_user_id: true
+ filter_by_project_id: true
+ filter_by_resource_id: true
+ metadata_query:
+ status: "terminated"
+ period: 300
+ groupby: "resource_id"
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerResource.get_tenant_resources:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ ceilometer:
+ counter_name: "cpu_util"
+ counter_type: "gauge"
+ counter_volume: 1.0
+ counter_unit: "instance"
+ {% endcall %}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerAlarms.list_alarms:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerSamples.list_matched_samples:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ ceilometer:
+ counter_name: "cpu_util"
+ counter_type: "gauge"
+ counter_unit: "instance"
+ counter_volume: 1.0
+ resources_per_tenant: 100
+ samples_per_resource: 100
+ timestamp_interval: 60
+ metadata_list:
+ - status: "active"
+ name: "fake_resource"
+ deleted: "False"
+ created_at: "2015-09-04T12:34:19.000000"
+ - status: "not_active"
+ name: "fake_resource_1"
+ deleted: "False"
+ created_at: "2015-09-10T06:55:12.000000"
+ {% endcall %}
+ args:
+ limit: 50
+ filter_by_user_id: true
+ filter_by_project_id: true
+ filter_by_resource_id: true
+ metadata_query:
+ status: "not_active"
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerMeters.list_matched_meters:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ ceilometer:
+ counter_name: "benchmark_meter"
+ counter_type: "gauge"
+ counter_unit: "%"
+ counter_volume: 100
+ resources_per_tenant: 100
+ samples_per_resource: 100
+ timestamp_interval: 10
+ metadata_list:
+ -
+ status: "active"
+ name: "rally benchmark on"
+ deleted: "false"
+ -
+ status: "terminated"
+ name: "rally benchmark off"
+ deleted: "true"
+ {% endcall %}
+ args:
+ limit: 50
+ filter_by_user_id: true
+ filter_by_project_id: true
+ filter_by_resource_id: true
+ metadata_query:
+ status: "terminated"
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerResource.list_matched_resources:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ ceilometer:
+ counter_name: "benchmark_meter"
+ counter_type: "gauge"
+ counter_unit: "%"
+ counter_volume: 100
+ resources_per_tenant: 100
+ samples_per_resource: 100
+ timestamp_interval: 10
+ metadata_list:
+ -
+ status: "active"
+ name: "rally benchmark on"
+ deleted: "false"
+ -
+ status: "terminated"
+ name: "rally benchmark off"
+ deleted: "true"
+ {% endcall %}
+ args:
+ limit: 50
+ filter_by_user_id: true
+ filter_by_project_id: true
+ metadata_query:
+ status: "terminated"
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerSamples.list_samples:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ ceilometer:
+ counter_name: "cpu_util"
+ counter_type: "gauge"
+ counter_unit: "instance"
+ counter_volume: 1.0
+ resources_per_tenant: 100
+ samples_per_resource: 100
+ timestamp_interval: 60
+ metadata_list:
+ - status: "active"
+ name: "fake_resource"
+ deleted: "False"
+ created_at: "2015-09-04T12:34:19.000000"
+ - status: "not_active"
+ name: "fake_resource_1"
+ deleted: "False"
+ created_at: "2015-09-10T06:55:12.000000"
+ batch_size: 5
+ {% endcall %}
+ args:
+ limit: 50
+ metadata_query:
+ status: "not_active"
+ sla:
+ {{ no_failures_sla() }}
+
diff --git a/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml
new file mode 100644
index 000000000..bb070cd3a
--- /dev/null
+++ b/functest/opnfv_tests/openstack/rally/scenario/sanity/opnfv-ceilometer.yaml
@@ -0,0 +1,247 @@
+ CeilometerAlarms.create_alarm_and_get_history:
+ -
+ args:
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ state: "ok"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerAlarms.create_and_delete_alarm:
+ -
+ args:
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerAlarms.create_and_get_alarm:
+ -
+ args:
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerAlarms.create_and_list_alarm:
+ -
+ args:
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerQueries.create_and_query_alarm_history:
+ -
+ args:
+ orderby: !!null
+ limit: !!null
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerQueries.create_and_query_alarms:
+ -
+ args:
+ filter: {"and": [{"!=": {"state": "dummy_state"}},{"=": {"type": "threshold"}}]}
+ orderby: !!null
+ limit: 10
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerQueries.create_and_query_samples:
+ -
+ args:
+ filter: {"=": {"counter_unit": "instance"}}
+ orderby: !!null
+ limit: 10
+ counter_name: "cpu_util"
+ counter_type: "gauge"
+ counter_unit: "instance"
+ counter_volume: 1.0
+ resource_id: "resource_id"
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerAlarms.create_and_update_alarm:
+ -
+ args:
+ meter_name: "ram_util"
+ threshold: 10.0
+ type: "threshold"
+ statistic: "avg"
+ alarm_actions: ["http://localhost:8776/alarm"]
+ ok_actions: ["http://localhost:8776/ok"]
+ insufficient_data_actions: ["http://localhost:8776/notok"]
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerEvents.create_user_and_get_event:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerEvents.create_user_and_list_events:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerEvents.create_user_and_list_event_types:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerTraits.create_user_and_list_trait_descriptions:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerTraits.create_user_and_list_traits:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerStats.get_stats:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ ceilometer:
+ counter_name: "benchmark_meter"
+ counter_type: "gauge"
+ counter_unit: "%"
+ counter_volume: 100
+ resources_per_tenant: 100
+ samples_per_resource: 100
+ timestamp_interval: 10
+ metadata_list:
+ -
+ status: "active"
+ name: "rally benchmark on"
+ deleted: "false"
+ -
+ status: "terminated"
+ name: "rally benchmark off"
+ deleted: "true"
+ {% endcall %}
+ args:
+ meter_name: "benchmark_meter"
+ filter_by_user_id: true
+ filter_by_project_id: true
+ filter_by_resource_id: true
+ metadata_query:
+ status: "terminated"
+ period: 300
+ groupby: "resource_id"
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerResource.get_tenant_resources:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {% call user_context(tenants_amount, users_amount, use_existing_users) %}
+ ceilometer:
+ counter_name: "cpu_util"
+ counter_type: "gauge"
+ counter_volume: 1.0
+ counter_unit: "instance"
+ {% endcall %}
+ sla:
+ {{ no_failures_sla() }}
+
+ CeilometerAlarms.list_alarms:
+ -
+ runner:
+ {{ constant_runner(concurrency=concurrency, times=iterations, is_smoke=smoke) }}
+ context:
+ {{ user_context(tenants_amount, users_amount, use_existing_users) }}
+ sla:
+ {{ no_failures_sla() }}
diff --git a/functest/opnfv_tests/openstack/rally/task.yaml b/functest/opnfv_tests/openstack/rally/task.yaml
index 033edb831..65f101fbe 100644
--- a/functest/opnfv_tests/openstack/rally/task.yaml
+++ b/functest/opnfv_tests/openstack/rally/task.yaml
@@ -31,6 +31,10 @@
{%- include "var/opnfv-neutron.yaml"-%}
{% endif %}
+{% if "ceilometer" in service_list %}
+{%- include "var/opnfv-ceilometer.yaml"-%}
+{% endif %}
+
{% if "quotas" in service_list %}
{%- include "var/opnfv-quotas.yaml"-%}
{% endif %}
diff --git a/functest/opnfv_tests/openstack/refstack_client/refstack_client.py b/functest/opnfv_tests/openstack/refstack_client/refstack_client.py
index 86053ccf3..4f71b5f5d 100644
--- a/functest/opnfv_tests/openstack/refstack_client/refstack_client.py
+++ b/functest/opnfv_tests/openstack/refstack_client/refstack_client.py
@@ -28,12 +28,13 @@ from functest.opnfv_tests.openstack.refstack_client.tempest_conf \
from functest.opnfv_tests.openstack.tempest import conf_utils
from functest.utils.constants import CONST
import functest.utils.functest_utils as ft_utils
+import functest.utils.openstack_utils as os_utils
# logging configuration """
LOGGER = logging.getLogger(__name__)
-class RefstackClient(testcase.OSGCTestCase):
+class RefstackClient(testcase.TestCase):
"""RefstackClient testcase implementation class."""
def __init__(self, **kwargs):
@@ -41,6 +42,7 @@ class RefstackClient(testcase.OSGCTestCase):
if "case_name" not in kwargs:
kwargs["case_name"] = "refstack_defcore"
super(RefstackClient, self).__init__(**kwargs)
+ self.tempestconf = None
self.conf_path = pkg_resources.resource_filename(
'functest',
'opnfv_tests/openstack/refstack_client/refstack_tempest.conf')
@@ -57,6 +59,13 @@ class RefstackClient(testcase.OSGCTestCase):
CONST.__getattribute__('OS_INSECURE').lower() == 'true'):
self.insecure = '-k'
+ def generate_conf(self):
+ if not os.path.exists(conf_utils.REFSTACK_RESULTS_DIR):
+ os.makedirs(conf_utils.REFSTACK_RESULTS_DIR)
+
+ self.tempestconf = TempestConf()
+ self.tempestconf.generate_tempestconf()
+
def run_defcore(self, conf, testlist):
"""Run defcore sys command."""
cmd = ("refstack-client test {0} -c {1} -v --test-list {2}"
@@ -87,7 +96,7 @@ class RefstackClient(testcase.OSGCTestCase):
stderr=subprocess.STDOUT)
def parse_refstack_result(self):
- """Parse Refstact results."""
+ """Parse Refstack results."""
try:
with open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR,
"refstack.log"), 'r') as logfile:
@@ -144,18 +153,18 @@ class RefstackClient(testcase.OSGCTestCase):
"""
self.start_time = time.time()
- if not os.path.exists(conf_utils.REFSTACK_RESULTS_DIR):
- os.makedirs(conf_utils.REFSTACK_RESULTS_DIR)
-
try:
- tempestconf = TempestConf()
- tempestconf.generate_tempestconf()
+ # Make sure that Tempest is configured
+ if not self.tempestconf:
+ self.generate_conf()
self.run_defcore_default()
self.parse_refstack_result()
res = testcase.TestCase.EX_OK
except Exception:
LOGGER.exception("Error with run")
res = testcase.TestCase.EX_RUN_ERROR
+ finally:
+ self.tempestconf.clean()
self.stop_time = time.time()
return res
@@ -194,6 +203,42 @@ class RefstackClient(testcase.OSGCTestCase):
return res
+ def create_snapshot(self):
+ """
+ Run the Tempest cleanup utility to initialize OS state.
+ For details, see https://docs.openstack.org/tempest/latest/cleanup.html
+
+ :return: TestCase.EX_OK
+ """
+ LOGGER.info("Initializing the saved state of the OpenStack deployment")
+
+ # Make sure that Tempest is configured
+ if not self.tempestconf:
+ self.generate_conf()
+
+ os_utils.init_tempest_cleanup(
+ self.tempestconf.DEPLOYMENT_DIR, 'tempest.conf',
+ os.path.join(conf_utils.REFSTACK_RESULTS_DIR,
+ "tempest-cleanup-init.log")
+ )
+
+ return super(RefstackClient, self).create_snapshot()
+
+ def clean(self):
+ """
+ Run the Tempest cleanup utility to delete and destroy OS resources.
+ For details, see https://docs.openstack.org/tempest/latest/cleanup.html
+ """
+ LOGGER.info("Destroying the resources created for tempest")
+
+ os_utils.perform_tempest_cleanup(
+ self.tempestconf.DEPLOYMENT_DIR, 'tempest.conf',
+ os.path.join(conf_utils.REFSTACK_RESULTS_DIR,
+ "tempest-cleanup.log")
+ )
+
+ return super(RefstackClient, self).clean()
+
class RefstackClientParser(object): # pylint: disable=too-few-public-methods
"""Command line argument parser helper."""
diff --git a/functest/opnfv_tests/openstack/refstack_client/tempest_conf.py b/functest/opnfv_tests/openstack/refstack_client/tempest_conf.py
index 30590b9eb..db7452271 100644
--- a/functest/opnfv_tests/openstack/refstack_client/tempest_conf.py
+++ b/functest/opnfv_tests/openstack/refstack_client/tempest_conf.py
@@ -11,13 +11,15 @@ import pkg_resources
from functest.opnfv_tests.openstack.tempest import conf_utils
from functest.utils import openstack_utils
from functest.utils.constants import CONST
+from functest.opnfv_tests.openstack.tempest.tempest \
+ import TempestResourcesManager
""" logging configuration """
logger = logging.getLogger(__name__)
class TempestConf(object):
- def __init__(self):
+ def __init__(self, **kwargs):
self.VERIFIER_ID = conf_utils.get_verifier_id()
self.VERIFIER_REPO_DIR = conf_utils.get_verifier_repo_dir(
self.VERIFIER_ID)
@@ -27,15 +29,22 @@ class TempestConf(object):
self.confpath = pkg_resources.resource_filename(
'functest',
'opnfv_tests/openstack/refstack_client/refstack_tempest.conf')
+ self.resources = TempestResourcesManager(**kwargs)
def generate_tempestconf(self):
try:
openstack_utils.source_credentials(
CONST.__getattribute__('openstack_creds'))
- img_flavor_dict = conf_utils.create_tempest_resources(
- use_custom_images=True, use_custom_flavors=True)
+ resources = self.resources.create(create_project=True,
+ use_custom_images=True,
+ use_custom_flavors=True)
conf_utils.configure_tempest_defcore(
- self.DEPLOYMENT_DIR, img_flavor_dict)
+ self.DEPLOYMENT_DIR,
+ image_id=resources.get("image_id"),
+ flavor_id=resources.get("flavor_id"),
+ image_id_alt=resources.get("image_id_alt"),
+ flavor_id_alt=resources.get("flavor_id_alt"),
+ tenant_id=resources.get("project_id"))
except Exception as e:
logger.error("error with generating refstack client "
"reference tempest conf file: %s", e)
@@ -48,6 +57,9 @@ class TempestConf(object):
except Exception as e:
logger.error('Error with run: %s', e)
+ def clean(self):
+ self.resources.cleanup()
+
def main():
logging.basicConfig()
diff --git a/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py b/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py
index 0b87440b8..19c6a87f2 100644
--- a/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py
+++ b/functest/opnfv_tests/openstack/snaps/snaps_test_runner.py
@@ -28,9 +28,14 @@ class SnapsTestRunner(unit.Suite):
if 'os_creds' in kwargs:
self.os_creds = kwargs['os_creds']
else:
+ creds_override = None
+ if hasattr(CONST, 'snaps_os_creds_override'):
+ creds_override = CONST.__getattribute__(
+ 'snaps_os_creds_override')
self.os_creds = openstack_tests.get_credentials(
os_env_file=CONST.__getattribute__('openstack_creds'),
- proxy_settings_str=None, ssh_proxy_cmd=None)
+ proxy_settings_str=None, ssh_proxy_cmd=None,
+ overrides=creds_override)
if 'ext_net_name' in kwargs:
self.ext_net_name = kwargs['ext_net_name']
diff --git a/functest/opnfv_tests/openstack/tempest/conf_utils.py b/functest/opnfv_tests/openstack/tempest/conf_utils.py
index 7c88fc5d3..52fa60032 100644
--- a/functest/opnfv_tests/openstack/tempest/conf_utils.py
+++ b/functest/opnfv_tests/openstack/tempest/conf_utils.py
@@ -11,7 +11,6 @@ import ConfigParser
import logging
import os
import pkg_resources
-import re
import shutil
import subprocess
@@ -42,6 +41,9 @@ REFSTACK_RESULTS_DIR = os.path.join(CONST.__getattribute__('dir_results'),
'refstack')
TEMPEST_CONF_YAML = pkg_resources.resource_filename(
'functest', 'opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml')
+TEST_ACCOUNTS_FILE = pkg_resources.resource_filename(
+ 'functest',
+ 'opnfv_tests/openstack/tempest/custom_tests/test_accounts.yaml')
CI_INSTALLER_TYPE = CONST.__getattribute__('INSTALLER_TYPE')
CI_INSTALLER_IP = CONST.__getattribute__('INSTALLER_IP')
@@ -50,96 +52,9 @@ CI_INSTALLER_IP = CONST.__getattribute__('INSTALLER_IP')
logger = logging.getLogger(__name__)
-def create_tempest_resources(use_custom_images=False,
- use_custom_flavors=False):
- keystone_client = os_utils.get_keystone_client()
-
- logger.debug("Creating tenant and user for Tempest suite")
- tenant_id = os_utils.create_tenant(
- keystone_client,
- CONST.__getattribute__('tempest_identity_tenant_name'),
- CONST.__getattribute__('tempest_identity_tenant_description'))
- if not tenant_id:
- logger.error("Failed to create %s tenant"
- % CONST.__getattribute__('tempest_identity_tenant_name'))
-
- user_id = os_utils.create_user(
- keystone_client,
- CONST.__getattribute__('tempest_identity_user_name'),
- CONST.__getattribute__('tempest_identity_user_password'),
- None, tenant_id)
- if not user_id:
- logger.error("Failed to create %s user" %
- CONST.__getattribute__('tempest_identity_user_name'))
-
- logger.debug("Creating private network for Tempest suite")
- network_dic = os_utils.create_shared_network_full(
- CONST.__getattribute__('tempest_private_net_name'),
- CONST.__getattribute__('tempest_private_subnet_name'),
- CONST.__getattribute__('tempest_router_name'),
- CONST.__getattribute__('tempest_private_subnet_cidr'))
- if network_dic is None:
- raise Exception('Failed to create private network')
-
- image_id = ""
- image_id_alt = ""
- flavor_id = ""
- flavor_id_alt = ""
-
- if (CONST.__getattribute__('tempest_use_custom_images') or
- use_custom_images):
- # adding alternative image should be trivial should we need it
- logger.debug("Creating image for Tempest suite")
- _, image_id = os_utils.get_or_create_image(
- CONST.__getattribute__('openstack_image_name'),
- GLANCE_IMAGE_PATH,
- CONST.__getattribute__('openstack_image_disk_format'))
- if image_id is None:
- raise Exception('Failed to create image')
-
- if use_custom_images:
- logger.debug("Creating 2nd image for Tempest suite")
- _, image_id_alt = os_utils.get_or_create_image(
- CONST.__getattribute__('openstack_image_name_alt'),
- GLANCE_IMAGE_PATH,
- CONST.__getattribute__('openstack_image_disk_format'))
- if image_id_alt is None:
- raise Exception('Failed to create image')
-
- if (CONST.__getattribute__('tempest_use_custom_flavors') or
- use_custom_flavors):
- # adding alternative flavor should be trivial should we need it
- logger.debug("Creating flavor for Tempest suite")
- _, flavor_id = os_utils.get_or_create_flavor(
- CONST.__getattribute__('openstack_flavor_name'),
- CONST.__getattribute__('openstack_flavor_ram'),
- CONST.__getattribute__('openstack_flavor_disk'),
- CONST.__getattribute__('openstack_flavor_vcpus'))
- if flavor_id is None:
- raise Exception('Failed to create flavor')
-
- if use_custom_flavors:
- logger.debug("Creating 2nd flavor for tempest_defcore")
- _, flavor_id_alt = os_utils.get_or_create_flavor(
- CONST.__getattribute__('openstack_flavor_name_alt'),
- CONST.__getattribute__('openstack_flavor_ram'),
- CONST.__getattribute__('openstack_flavor_disk'),
- CONST.__getattribute__('openstack_flavor_vcpus'))
- if flavor_id_alt is None:
- raise Exception('Failed to create flavor')
-
- img_flavor_dict = {}
- img_flavor_dict['image_id'] = image_id
- img_flavor_dict['image_id_alt'] = image_id_alt
- img_flavor_dict['flavor_id'] = flavor_id
- img_flavor_dict['flavor_id_alt'] = flavor_id_alt
-
- return img_flavor_dict
-
-
def get_verifier_id():
"""
- Returns verifer id for current Tempest
+ Returns verifier id for current Tempest
"""
cmd = ("rally verify list-verifiers | awk '/" +
CONST.__getattribute__('tempest_deployment_name') +
@@ -173,7 +88,7 @@ def get_verifier_deployment_id():
def get_verifier_repo_dir(verifier_id):
"""
- Returns installed verfier repo directory for Tempest
+ Returns installed verifier repo directory for Tempest
"""
if not verifier_id:
verifier_id = get_verifier_id()
@@ -215,34 +130,27 @@ def backup_tempest_config(conf_file):
"""
Copy config file to tempest results directory
"""
- if not os.path.exists(TEMPEST_RESULTS_DIR):
- os.makedirs(TEMPEST_RESULTS_DIR)
-
shutil.copyfile(conf_file,
os.path.join(TEMPEST_RESULTS_DIR, 'tempest.conf'))
-def configure_tempest(deployment_dir, IMAGE_ID=None, FLAVOR_ID=None,
- MODE=None):
+def configure_tempest(deployment_dir, image_id=None, flavor_id=None,
+ mode=None):
"""
Calls rally verify and updates the generated tempest.conf with
given parameters
"""
conf_file = configure_verifier(deployment_dir)
- configure_tempest_update_params(conf_file,
- IMAGE_ID, FLAVOR_ID)
- if MODE == 'feature_multisite':
- configure_tempest_multisite_params(conf_file)
+ configure_tempest_update_params(conf_file, image_id, flavor_id)
-def configure_tempest_defcore(deployment_dir, img_flavor_dict):
+def configure_tempest_defcore(deployment_dir, image_id, flavor_id,
+ image_id_alt, flavor_id_alt, tenant_id):
"""
Add/update needed parameters into tempest.conf file
"""
conf_file = configure_verifier(deployment_dir)
- configure_tempest_update_params(conf_file,
- img_flavor_dict.get("image_id"),
- img_flavor_dict.get("flavor_id"))
+ configure_tempest_update_params(conf_file, image_id, flavor_id)
logger.debug("Updating selected tempest.conf parameters for defcore...")
config = ConfigParser.RawConfigParser()
@@ -250,14 +158,14 @@ def configure_tempest_defcore(deployment_dir, img_flavor_dict):
config.set('DEFAULT', 'log_file', '{}/tempest.log'.format(deployment_dir))
config.set('oslo_concurrency', 'lock_path',
'{}/lock_files'.format(deployment_dir))
+ generate_test_accounts_file(tenant_id=tenant_id)
+ config.set('auth', 'test_accounts_file', TEST_ACCOUNTS_FILE)
config.set('scenario', 'img_dir', '{}'.format(deployment_dir))
config.set('scenario', 'img_file', 'tempest-image')
- config.set('compute', 'image_ref', img_flavor_dict.get("image_id"))
- config.set('compute', 'image_ref_alt',
- img_flavor_dict['image_id_alt'])
- config.set('compute', 'flavor_ref', img_flavor_dict.get("flavor_id"))
- config.set('compute', 'flavor_ref_alt',
- img_flavor_dict['flavor_id_alt'])
+ config.set('compute', 'image_ref', image_id)
+ config.set('compute', 'image_ref_alt', image_id_alt)
+ config.set('compute', 'flavor_ref', flavor_id)
+ config.set('compute', 'flavor_ref_alt', flavor_id_alt)
with open(conf_file, 'wb') as config_file:
config.write(config_file)
@@ -268,8 +176,29 @@ def configure_tempest_defcore(deployment_dir, img_flavor_dict):
shutil.copyfile(conf_file, confpath)
+def generate_test_accounts_file(tenant_id):
+ """
+ Add needed tenant and user params into test_accounts.yaml
+ """
+
+ logger.debug("Add needed params into test_accounts.yaml...")
+ accounts_list = [
+ {
+ 'tenant_name':
+ CONST.__getattribute__('tempest_identity_tenant_name'),
+ 'tenant_id': str(tenant_id),
+ 'username': CONST.__getattribute__('tempest_identity_user_name'),
+ 'password':
+ CONST.__getattribute__('tempest_identity_user_password')
+ }
+ ]
+
+ with open(TEST_ACCOUNTS_FILE, "w") as f:
+ yaml.dump(accounts_list, f, default_flow_style=False)
+
+
def configure_tempest_update_params(tempest_conf_file,
- IMAGE_ID=None, FLAVOR_ID=None):
+ image_id=None, flavor_id=None):
"""
Add/update needed parameters into tempest.conf file
"""
@@ -283,21 +212,15 @@ def configure_tempest_update_params(tempest_conf_file,
config.set('compute', 'volume_device_name',
CONST.__getattribute__('tempest_volume_device_name'))
if CONST.__getattribute__('tempest_use_custom_images'):
- if IMAGE_ID is not None:
- config.set('compute', 'image_ref', IMAGE_ID)
+ if image_id is not None:
+ config.set('compute', 'image_ref', image_id)
if IMAGE_ID_ALT is not None:
config.set('compute', 'image_ref_alt', IMAGE_ID_ALT)
if CONST.__getattribute__('tempest_use_custom_flavors'):
- if FLAVOR_ID is not None:
- config.set('compute', 'flavor_ref', FLAVOR_ID)
+ if flavor_id is not None:
+ config.set('compute', 'flavor_ref', flavor_id)
if FLAVOR_ID_ALT is not None:
config.set('compute', 'flavor_ref_alt', FLAVOR_ID_ALT)
- config.set('identity', 'tenant_name',
- CONST.__getattribute__('tempest_identity_tenant_name'))
- config.set('identity', 'username',
- CONST.__getattribute__('tempest_identity_user_name'))
- config.set('identity', 'password',
- CONST.__getattribute__('tempest_identity_user_password'))
config.set('identity', 'region', 'RegionOne')
if os_utils.is_keystone_v3():
auth_version = 'v3'
@@ -373,93 +296,3 @@ def configure_verifier(deployment_dir):
% tempest_conf_file)
else:
return tempest_conf_file
-
-
-def configure_tempest_multisite_params(tempest_conf_file):
- """
- Add/update multisite parameters into tempest.conf file generated by Rally
- """
- logger.debug("Updating multisite tempest.conf parameters...")
- config = ConfigParser.RawConfigParser()
- config.read(tempest_conf_file)
-
- config.set('service_available', 'kingbird', 'true')
- # cmd = ("openstack endpoint show kingbird | grep publicurl |"
- # "awk '{print $4}' | awk -F '/' '{print $4}'")
- # kingbird_api_version = os.popen(cmd).read()
- # kingbird_api_version = os_utils.get_endpoint(service_type='multisite')
-
- if CI_INSTALLER_TYPE == 'fuel':
- # For MOS based setup, the service is accessible
- # via bind host
- kingbird_conf_path = "/etc/kingbird/kingbird.conf"
- installer_type = CI_INSTALLER_TYPE
- installer_ip = CI_INSTALLER_IP
- installer_username = CONST.__getattribute__(
- 'multisite_{}_installer_username'.format(installer_type))
- installer_password = CONST.__getattribute__(
- 'multisite_{}_installer_password'.format(installer_type))
-
- ssh_options = ("-o UserKnownHostsFile=/dev/null -o "
- "StrictHostKeyChecking=no")
-
- # Get the controller IP from the fuel node
- cmd = ('sshpass -p %s ssh 2>/dev/null %s %s@%s '
- '\'fuel node --env 1| grep controller | grep "True\| 1" '
- '| awk -F\| "{print \$5}"\'' % (installer_password,
- ssh_options,
- installer_username,
- installer_ip))
- multisite_controller_ip = "".join(os.popen(cmd).read().split())
-
- # Login to controller and get bind host details
- cmd = ('sshpass -p %s ssh 2>/dev/null %s %s@%s "ssh %s \\" '
- 'grep -e "^bind_" %s \\""' % (installer_password,
- ssh_options,
- installer_username,
- installer_ip,
- multisite_controller_ip,
- kingbird_conf_path))
- bind_details = os.popen(cmd).read()
- bind_details = "".join(bind_details.split())
- # Extract port number from the bind details
- bind_port = re.findall(r"\D(\d{4})", bind_details)[0]
- # Extract ip address from the bind details
- bind_host = re.findall(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",
- bind_details)[0]
- kingbird_endpoint_url = "http://%s:%s/" % (bind_host, bind_port)
- else:
- # cmd = "openstack endpoint show kingbird | grep publicurl |\
- # awk '{print $4}' | awk -F '/' '{print $3}'"
- # kingbird_endpoint_url = os.popen(cmd).read()
- kingbird_endpoint_url = os_utils.get_endpoint(service_type='kingbird')
-
- try:
- config.add_section("kingbird")
- except Exception:
- logger.info('kingbird section exist')
-
- # set the domain id
- config.set('auth', 'admin_domain_name', 'default')
-
- config.set('kingbird', 'endpoint_type', 'publicURL')
- config.set('kingbird', 'TIME_TO_SYNC', '120')
- config.set('kingbird', 'endpoint_url', kingbird_endpoint_url)
- config.set('kingbird', 'api_version', 'v1.0')
- with open(tempest_conf_file, 'wb') as config_file:
- config.write(config_file)
-
- backup_tempest_config(tempest_conf_file)
-
-
-def install_verifier_ext(path):
- """
- Install extension to active verifier
- """
- logger.info("Installing verifier from existing repo...")
- tag = get_repo_tag(path)
- cmd = ("rally verify add-verifier-ext --source {0} "
- "--version {1}"
- .format(path, tag))
- error_msg = ("Problem while adding verifier extension from %s" % path)
- ft_utils.execute_command_raise(cmd, error_msg=error_msg)
diff --git a/functest/opnfv_tests/openstack/tempest/tempest.py b/functest/opnfv_tests/openstack/tempest/tempest.py
index b00bc6af6..c7ad4df2f 100644
--- a/functest/opnfv_tests/openstack/tempest/tempest.py
+++ b/functest/opnfv_tests/openstack/tempest/tempest.py
@@ -12,7 +12,6 @@ from __future__ import division
import logging
import os
-import pkg_resources
import re
import shutil
import subprocess
@@ -24,15 +23,26 @@ from functest.core import testcase
from functest.opnfv_tests.openstack.tempest import conf_utils
from functest.utils.constants import CONST
import functest.utils.functest_utils as ft_utils
+import functest.utils.openstack_utils as os_utils
+
+from snaps.openstack import create_flavor
+from snaps.openstack.create_flavor import FlavorSettings, OpenStackFlavor
+from snaps.openstack.create_project import ProjectSettings
+from snaps.openstack.create_network import NetworkSettings, SubnetSettings
+from snaps.openstack.create_user import UserSettings
+from snaps.openstack.tests import openstack_tests
+from snaps.openstack.utils import deploy_utils
+
""" logging configuration """
logger = logging.getLogger(__name__)
-class TempestCommon(testcase.OSGCTestCase):
+class TempestCommon(testcase.TestCase):
def __init__(self, **kwargs):
super(TempestCommon, self).__init__(**kwargs)
+ self.resources = TempestResourcesManager(**kwargs)
self.MODE = ""
self.OPTION = ""
self.VERIFIER_ID = conf_utils.get_verifier_id()
@@ -63,8 +73,6 @@ class TempestCommon(testcase.OSGCTestCase):
else:
if self.MODE == 'smoke':
testr_mode = "smoke"
- elif self.MODE == 'feature_multisite':
- testr_mode = "'[Kk]ingbird'"
elif self.MODE == 'full':
testr_mode = ""
else:
@@ -187,9 +195,12 @@ class TempestCommon(testcase.OSGCTestCase):
try:
self.result = 100 * int(num_success) / int(num_executed)
except ZeroDivisionError:
- logger.error("No test has been executed")
self.result = 0
- return
+ if int(num_tests) > 0:
+ logger.info("All tests have been skipped")
+ else:
+ logger.error("No test has been executed")
+ return
with open(os.path.join(conf_utils.TEMPEST_RESULTS_DIR,
"tempest.log"), 'r') as logfile:
@@ -222,12 +233,12 @@ class TempestCommon(testcase.OSGCTestCase):
try:
if not os.path.exists(conf_utils.TEMPEST_RESULTS_DIR):
os.makedirs(conf_utils.TEMPEST_RESULTS_DIR)
- image_and_flavor = conf_utils.create_tempest_resources()
+ resources = self.resources.create()
conf_utils.configure_tempest(
self.DEPLOYMENT_DIR,
- IMAGE_ID=image_and_flavor.get("image_id"),
- FLAVOR_ID=image_and_flavor.get("flavor_id"),
- MODE=self.MODE)
+ image_id=resources.get("image_id"),
+ flavor_id=resources.get("flavor_id"),
+ mode=self.MODE)
self.generate_test_list(self.VERIFIER_REPO_DIR)
self.apply_tempest_blacklist()
self.run_verifier_tests()
@@ -236,10 +247,49 @@ class TempestCommon(testcase.OSGCTestCase):
except Exception as e:
logger.error('Error with run: %s' % e)
res = testcase.TestCase.EX_RUN_ERROR
+ finally:
+ self.resources.cleanup()
self.stop_time = time.time()
return res
+ def create_snapshot(self):
+ """
+ Run the Tempest cleanup utility to initialize OS state.
+
+ :return: TestCase.EX_OK
+ """
+ logger.info("Initializing the saved state of the OpenStack deployment")
+
+ if not os.path.exists(conf_utils.TEMPEST_RESULTS_DIR):
+ os.makedirs(conf_utils.TEMPEST_RESULTS_DIR)
+
+ # Make sure that the verifier is configured
+ conf_utils.configure_verifier(self.DEPLOYMENT_DIR)
+
+ os_utils.init_tempest_cleanup(
+ self.DEPLOYMENT_DIR, 'tempest.conf',
+ os.path.join(conf_utils.TEMPEST_RESULTS_DIR,
+ "tempest-cleanup-init.log")
+ )
+
+ return super(TempestCommon, self).create_snapshot()
+
+ def clean(self):
+ """
+ Run the Tempest cleanup utility to delete and destroy OS resources
+ created by Tempest.
+ """
+ logger.info("Destroying the resources created for refstack")
+
+ os_utils.perform_tempest_cleanup(
+ self.DEPLOYMENT_DIR, 'tempest.conf',
+ os.path.join(conf_utils.TEMPEST_RESULTS_DIR,
+ "tempest-cleanup.log")
+ )
+
+ return super(TempestCommon, self).clean()
+
class TempestSmokeSerial(TempestCommon):
@@ -270,18 +320,6 @@ class TempestFullParallel(TempestCommon):
self.MODE = "full"
-class TempestMultisite(TempestCommon):
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = 'multisite'
- TempestCommon.__init__(self, **kwargs)
- self.MODE = "feature_multisite"
- self.OPTION = "--concurrency 1"
- conf_utils.install_verifier_ext(
- pkg_resources.resource_filename('kingbird', '..'))
-
-
class TempestCustom(TempestCommon):
def __init__(self, **kwargs):
@@ -300,3 +338,170 @@ class TempestDefcore(TempestCommon):
TempestCommon.__init__(self, **kwargs)
self.MODE = "defcore"
self.OPTION = "--concurrency 1"
+
+
+class TempestResourcesManager(object):
+
+ def __init__(self, **kwargs):
+ self.os_creds = None
+ if 'os_creds' in kwargs:
+ self.os_creds = kwargs['os_creds']
+ else:
+ self.os_creds = openstack_tests.get_credentials(
+ os_env_file=CONST.__getattribute__('openstack_creds'))
+
+ self.creators = list()
+
+ if hasattr(CONST, 'snaps_images_cirros'):
+ self.cirros_image_config = CONST.__getattribute__(
+ 'snaps_images_cirros')
+ else:
+ self.cirros_image_config = None
+
+ def create(self, use_custom_images=False, use_custom_flavors=False,
+ create_project=False):
+ if create_project:
+ logger.debug("Creating project (tenant) for Tempest suite")
+ project_name = CONST.__getattribute__(
+ 'tempest_identity_tenant_name')
+ project_creator = deploy_utils.create_project(
+ self.os_creds, ProjectSettings(
+ name=project_name,
+ description=CONST.__getattribute__(
+ 'tempest_identity_tenant_description')))
+ if (project_creator is None or
+ project_creator.get_project() is None):
+ raise Exception("Failed to create tenant")
+ project_id = project_creator.get_project().id
+ self.creators.append(project_creator)
+
+ logger.debug("Creating user for Tempest suite")
+ user_creator = deploy_utils.create_user(
+ self.os_creds, UserSettings(
+ name=CONST.__getattribute__('tempest_identity_user_name'),
+ password=CONST.__getattribute__(
+ 'tempest_identity_user_password'),
+ project_name=project_name))
+ if user_creator is None or user_creator.get_user() is None:
+ raise Exception("Failed to create user")
+ user_id = user_creator.get_user().id
+ self.creators.append(user_creator)
+ else:
+ project_name = None
+ project_id = None
+ user_id = None
+
+ logger.debug("Creating private network for Tempest suite")
+ network_creator = deploy_utils.create_network(
+ self.os_creds, NetworkSettings(
+ name=CONST.__getattribute__('tempest_private_net_name'),
+ project_name=project_name,
+ subnet_settings=[SubnetSettings(
+ name=CONST.__getattribute__('tempest_private_subnet_name'),
+ cidr=CONST.__getattribute__('tempest_private_subnet_cidr'))
+ ]))
+ if network_creator is None or network_creator.get_network() is None:
+ raise Exception("Failed to create private network")
+ self.creators.append(network_creator)
+
+ image_id = None
+ image_id_alt = None
+ flavor_id = None
+ flavor_id_alt = None
+
+ if (CONST.__getattribute__('tempest_use_custom_images') or
+ use_custom_images):
+ logger.debug("Creating image for Tempest suite")
+ image_base_name = CONST.__getattribute__('openstack_image_name')
+ os_image_settings = openstack_tests.cirros_image_settings(
+ image_base_name, public=True,
+ image_metadata=self.cirros_image_config)
+ logger.debug("Creating image for Tempest suite")
+ image_creator = deploy_utils.create_image(
+ self.os_creds, os_image_settings)
+ if image_creator is None:
+ raise Exception('Failed to create image')
+ self.creators.append(image_creator)
+ image_id = image_creator.get_image().id
+
+ if use_custom_images:
+ logger.debug("Creating 2nd image for Tempest suite")
+ image_base_name_alt = CONST.__getattribute__(
+ 'openstack_image_name_alt')
+ os_image_settings_alt = openstack_tests.cirros_image_settings(
+ image_base_name_alt, public=True,
+ image_metadata=self.cirros_image_config)
+ logger.debug("Creating 2nd image for Tempest suite")
+ image_creator_alt = deploy_utils.create_image(
+ self.os_creds, os_image_settings_alt)
+ if image_creator_alt is None:
+ raise Exception('Failed to create image')
+ self.creators.append(image_creator_alt)
+ image_id_alt = image_creator_alt.get_image().id
+
+ if (CONST.__getattribute__('tempest_use_custom_flavors') or
+ use_custom_flavors):
+ logger.info("Creating flavor for Tempest suite")
+ scenario = ft_utils.get_scenario()
+ flavor_metadata = None
+ if 'ovs' in scenario or 'fdio' in scenario:
+ flavor_metadata = create_flavor.MEM_PAGE_SIZE_LARGE
+ flavor_creator = OpenStackFlavor(
+ self.os_creds, FlavorSettings(
+ name=CONST.__getattribute__('openstack_flavor_name'),
+ ram=CONST.__getattribute__('openstack_flavor_ram'),
+ disk=CONST.__getattribute__('openstack_flavor_disk'),
+ vcpus=CONST.__getattribute__('openstack_flavor_vcpus'),
+ metadata=flavor_metadata))
+ flavor = flavor_creator.create()
+ if flavor is None:
+ raise Exception('Failed to create flavor')
+ self.creators.append(flavor_creator)
+ flavor_id = flavor.id
+
+ if use_custom_flavors:
+ logger.info("Creating 2nd flavor for Tempest suite")
+ scenario = ft_utils.get_scenario()
+ flavor_metadata_alt = None
+ if 'ovs' in scenario or 'fdio' in scenario:
+ flavor_metadata_alt = create_flavor.MEM_PAGE_SIZE_LARGE
+ flavor_creator_alt = OpenStackFlavor(
+ self.os_creds, FlavorSettings(
+ name=CONST.__getattribute__('openstack_flavor_name_alt'),
+ ram=CONST.__getattribute__('openstack_flavor_ram'),
+ disk=CONST.__getattribute__('openstack_flavor_disk'),
+ vcpus=CONST.__getattribute__('openstack_flavor_vcpus'),
+ metadata=flavor_metadata_alt))
+ flavor_alt = flavor_creator_alt.create()
+ if flavor_alt is None:
+ raise Exception('Failed to create flavor')
+ self.creators.append(flavor_creator_alt)
+ flavor_id_alt = flavor_alt.id
+
+ print("RESOURCES CREATE: image_id: %s, image_id_alt: %s, "
+ "flavor_id: %s, flavor_id_alt: %s" % (
+ image_id, image_id_alt, flavor_id, flavor_id_alt,))
+
+ result = {
+ 'image_id': image_id,
+ 'image_id_alt': image_id_alt,
+ 'flavor_id': flavor_id,
+ 'flavor_id_alt': flavor_id_alt
+ }
+
+ if create_project:
+ result['project_id'] = project_id
+ result['tenant_id'] = project_id # for compatibility
+ result['user_id'] = user_id
+
+ return result
+
+ def cleanup(self):
+ """
+ Cleanup all OpenStack objects. Should be called on completion.
+ """
+ for creator in reversed(self.creators):
+ try:
+ creator.clean()
+ except Exception as e:
+ logger.error('Unexpected error cleaning - %s', e)
diff --git a/functest/opnfv_tests/openstack/vping/vping_base.py b/functest/opnfv_tests/openstack/vping/vping_base.py
index 74fbce1b0..40fcb07f0 100644
--- a/functest/opnfv_tests/openstack/vping/vping_base.py
+++ b/functest/opnfv_tests/openstack/vping/vping_base.py
@@ -43,8 +43,14 @@ class VPingBase(testcase.TestCase):
if 'os_creds' in kwargs:
self.os_creds = kwargs['os_creds']
else:
+ creds_override = None
+ if hasattr(CONST, 'snaps_os_creds_override'):
+ creds_override = CONST.__getattribute__(
+ 'snaps_os_creds_override')
+
self.os_creds = openstack_tests.get_credentials(
- os_env_file=CONST.__getattribute__('openstack_creds'))
+ os_env_file=CONST.__getattribute__('openstack_creds'),
+ overrides=creds_override)
self.creators = list()
self.image_creator = None
@@ -102,14 +108,33 @@ class VPingBase(testcase.TestCase):
'vping_private_subnet_name') + self.guid
private_subnet_cidr = CONST.__getattribute__(
'vping_private_subnet_cidr')
+
+ vping_network_type = None
+ vping_physical_network = None
+ vping_segmentation_id = None
+
+ if (hasattr(CONST, 'network_type')):
+ vping_network_type = CONST.__getattribute__(
+ 'vping_network_type')
+ if (hasattr(CONST, 'physical_network')):
+ vping_physical_network = CONST.__getattribute__(
+ 'vping_physical_network')
+ if (hasattr(CONST, 'segmentation_id')):
+ vping_segmentation_id = CONST.__getattribute__(
+ 'vping_segmentation_id')
+
self.logger.info(
"Creating network with name: '%s'" % private_net_name)
self.network_creator = deploy_utils.create_network(
self.os_creds,
- NetworkSettings(name=private_net_name,
- subnet_settings=[SubnetSettings(
- name=private_subnet_name,
- cidr=private_subnet_cidr)]))
+ NetworkSettings(
+ name=private_net_name,
+ network_type=vping_network_type,
+ physical_network=vping_physical_network,
+ segmentation_id=vping_segmentation_id,
+ subnet_settings=[SubnetSettings(
+ name=private_subnet_name,
+ cidr=private_subnet_cidr)]))
self.creators.append(self.network_creator)
self.logger.info(
diff --git a/functest/opnfv_tests/vnf/aaa/aaa.py b/functest/opnfv_tests/vnf/aaa/aaa.py
deleted file mode 100644
index 71e3c972a..000000000
--- a/functest/opnfv_tests/vnf/aaa/aaa.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 Orange and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import logging
-
-import functest.core.vnf as vnf
-
-
-class AaaVnf(vnf.VnfOnBoarding):
- """AAA VNF sample"""
-
- logger = logging.getLogger(__name__)
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = "aaa"
- super(AaaVnf, self).__init__(**kwargs)
-
- def deploy_orchestrator(self):
- self.logger.info("No VNFM needed to deploy a free radius here")
- return True
-
- def deploy_vnf(self):
- self.logger.info("Freeradius VNF deployment")
- # find a way to deploy freeradius and tester (heat,manual, ..)
- deploy_vnf = {'status': 'PASS', 'version': 'xxxx'}
- self.details['deploy_vnf'] = deploy_vnf
- return True
-
- def test_vnf(self):
- self.logger.info("Run test towards freeradius")
- # once the freeradius is deployed..make some tests
- test_vnf = {'status': 'PASS', 'version': 'xxxx'}
- self.details['test_vnf'] = test_vnf
- return True
diff --git a/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py b/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py
index 5a5c12bee..8851f7a48 100644
--- a/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py
+++ b/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py
@@ -10,7 +10,9 @@ import json
import logging
import os
import pkg_resources
+import shlex
import shutil
+import subprocess
import time
import requests
@@ -109,19 +111,17 @@ class ClearwaterOnBoardingBase(vnf.VnfOnBoarding):
bono_ip=None, ellis_ip=None,
signup_code='secret'):
self.logger.info('Run Clearwater live test')
- nameservers = ft_utils.get_resolvconf_ns()
- resolvconf = ['{0}{1}{2}'.format(os.linesep, 'nameserver ', ns)
- for ns in nameservers]
- self.logger.debug('resolvconf: %s', resolvconf)
dns_file = '/etc/resolv.conf'
dns_file_bak = '/etc/resolv.conf.bak'
+ self.logger.debug('Backup %s -> %s', dns_file, dns_file_bak)
shutil.copy(dns_file, dns_file_bak)
- script = ('echo -e "nameserver {0}{1}" > {2};'
- 'source /etc/profile.d/rvm.sh;'
- 'cd {3};'
- 'rake test[{4}] SIGNUP_CODE={5}'
- .format(dns_ip,
- ''.join(resolvconf),
+ cmd = ("dnsmasq -d -u root --server=/clearwater.opnfv/{0} "
+ "-r /etc/resolv.conf.bak".format(dns_ip))
+ dnsmasq_process = subprocess.Popen(shlex.split(cmd))
+ script = ('echo -e "nameserver {0}" > {1};'
+ 'cd {2};'
+ 'rake test[{3}] SIGNUP_CODE={4}'
+ .format('127.0.0.1',
dns_file,
self.test_dir,
public_domain,
@@ -136,7 +136,7 @@ class ClearwaterOnBoardingBase(vnf.VnfOnBoarding):
ft_utils.execute_command(cmd,
error_msg='Clearwater live test failed',
output_file=output_file)
-
+ dnsmasq_process.kill()
with open(dns_file_bak, 'r') as bak_file:
result = bak_file.read()
with open(dns_file, 'w') as f:
diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.py b/functest/opnfv_tests/vnf/ims/cloudify_ims.py
index 8f6fcec89..b07eaee23 100644
--- a/functest/opnfv_tests/vnf/ims/cloudify_ims.py
+++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.py
@@ -110,15 +110,15 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase):
# needs some images
self.__logger.info("Upload some OS images if it doesn't exist")
- for image_name, image_url in self.images.iteritems():
- self.__logger.info("image: %s, url: %s", image_name, image_url)
- if image_url and image_name:
+ for image_name, image_file in self.images.iteritems():
+ self.__logger.info("image: %s, file: %s", image_name, image_file)
+ if image_file and image_name:
image_creator = OpenStackImage(
self.snaps_creds,
ImageSettings(name=image_name,
image_user='cloud',
img_format='qcow2',
- url=image_url))
+ image_file=image_file))
image_creator.create()
# self.created_object.append(image_creator)
diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml b/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml
index 743c6ddd8..280e0a6b8 100644
--- a/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml
+++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml
@@ -1,6 +1,6 @@
tenant_images:
- ubuntu_14.04: http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img
- cloudify_manager_4.0: http://repository.cloudifysource.org/cloudify/4.0.1/sp-release/cloudify-manager-premium-4.0.1.qcow2
+ ubuntu_14.04: /home/opnfv/functest/images/trusty-server-cloudimg-amd64-disk1.img
+ cloudify_manager_4.0: /home/opnfv/functest/images/cloudify-manager-premium-4.0.1.qcow2
orchestrator:
name: cloudify
version: '4.0'
diff --git a/functest/opnfv_tests/vnf/ims/opera_ims.py b/functest/opnfv_tests/vnf/ims/opera_ims.py
deleted file mode 100644
index d420705aa..000000000
--- a/functest/opnfv_tests/vnf/ims/opera_ims.py
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-
-import json
-import logging
-import os
-import time
-
-from opera import openo_connect
-import requests
-
-import functest.opnfv_tests.vnf.ims.clearwater_ims_base as clearwater_ims_base
-from functest.utils.constants import CONST
-
-
-class OperaIms(clearwater_ims_base.ClearwaterOnBoardingBase):
-
- def __init__(self, **kwargs):
- if "case_name" not in kwargs:
- kwargs["case_name"] = "opera_ims"
- super(OperaIms, self).__init__(**kwargs)
- self.logger = logging.getLogger(__name__)
- self.ellis_file = os.path.join(
- CONST.__getattribute__('dir_results'), 'ellis.info')
- self.live_test_file = os.path.join(
- CONST.__getattribute__('dir_results'), 'live_test_report.json')
- try:
- self.openo_msb_endpoint = os.environ['OPENO_MSB_ENDPOINT']
- except KeyError:
- raise Exception('OPENO_MSB_ENDPOINT is not specified,'
- ' put it as <OPEN-O ip>:<port>')
- else:
- self.logger.info('OPEN-O endpoint is: %s', self.openo_msb_endpoint)
-
- def prepare(self):
- pass
-
- def clean(self):
- pass
-
- def deploy_vnf(self):
- try:
- openo_connect.create_service(self.openo_msb_endpoint,
- 'functest_opera',
- 'VNF for functest testing')
- except Exception as e:
- self.logger.error(e)
- return {'status': 'FAIL', 'result': e}
- else:
- self.logger.info('vIMS deployment is kicked off')
- return {'status': 'PASS', 'result': ''}
-
- def dump_info(self, info_file, result):
- with open(info_file, 'w') as f:
- self.logger.debug('Save information to file: %s', info_file)
- json.dump(result, f)
-
- def test_vnf(self):
- vnfm_ip = openo_connect.get_vnfm_ip(self.openo_msb_endpoint)
- self.logger.info('VNFM IP: %s', vnfm_ip)
- vnf_status_url = 'http://{0}:5000/api/v1/model/status'.format(vnfm_ip)
- vnf_alive = False
- retry = 40
-
- self.logger.info('Check the VNF status')
- while retry > 0:
- rq = requests.get(vnf_status_url, timeout=90)
- response = rq.json()
- vnf_alive = response['vnf_alive']
- msg = response['msg']
- self.logger.info(msg)
- if vnf_alive:
- break
- self.logger.info('check again in one and half a minute...')
- retry = retry - 1
- time.sleep(90)
-
- if not vnf_alive:
- raise Exception('VNF failed to start: {0}'.format(msg))
-
- ellis_config_url = ('http://{0}:5000/api/v1/model/ellis/configure'
- .format(vnfm_ip))
- rq = requests.get(ellis_config_url, timeout=90)
- if rq.json() and not rq.json()['ellis_ok']:
- self.logger.error(rq.json()['data'])
- raise Exception('Failed to configure Ellis')
-
- self.logger.info('Get Clearwater deployment detail')
- vnf_info_url = ('http://{0}:5000/api/v1/model/output'
- .format(vnfm_ip))
- rq = requests.get(vnf_info_url, timeout=90)
- data = rq.json()['data']
- self.logger.info(data)
- bono_ip = data['bono_ip']
- ellis_ip = data['ellis_ip']
- dns_ip = data['dns_ip']
- result = self.config_ellis(ellis_ip, 'signup', True)
- self.logger.debug('Ellis Result: %s', result)
- self.dump_info(self.ellis_file, result)
-
- if dns_ip:
- vims_test_result = self.run_clearwater_live_test(
- dns_ip,
- 'clearwater.local',
- bono_ip,
- ellis_ip,
- 'signup')
- if vims_test_result != '':
- self.dump_info(self.live_test_file, vims_test_result)
- return {'status': 'PASS', 'result': vims_test_result}
- else:
- return {'status': 'FAIL', 'result': ''}
-
- def main(self, **kwargs):
- self.logger.info("Start to run Opera vIMS VNF onboarding test")
- self.execute()
- self.logger.info("Opera vIMS VNF onboarding test finished")
- if self.result is "PASS":
- return self.EX_OK
- else:
- return self.EX_RUN_ERROR
-
- def run(self):
- kwargs = {}
- return self.main(**kwargs)
diff --git a/functest/opnfv_tests/vnf/ims/orchestra.yaml b/functest/opnfv_tests/vnf/ims/orchestra.yaml
new file mode 100644
index 000000000..4cd18e72b
--- /dev/null
+++ b/functest/opnfv_tests/vnf/ims/orchestra.yaml
@@ -0,0 +1,61 @@
+tenant_images:
+ orchestrator:
+ ubuntu-14.04-server-cloudimg-amd64-disk1: /home/opnfv/functest/images/trusty-server-cloudimg-amd64-disk1.img
+ orchestra_openims:
+ openims: /home/opnfv/functest/images/img
+ orchestra_clearwaterims:
+ ubuntu-14.04-server-cloudimg-amd64-disk1: /home/opnfv/functest/images/trusty-server-cloudimg-amd64-disk1.img
+mano:
+ name: OpenBaton
+ version: '3.2.0'
+ requirements:
+ flavor:
+ name: openbaton
+ ram_min: 4096
+ disk: 5
+ vcpus: 2
+ image: 'ubuntu-14.04-server-cloudimg-amd64-disk1'
+ bootstrap:
+ url: http://get.openbaton.org/bootstraps/bootstrap_3.2.0_opnfv/bootstrap
+ config:
+ url: http://get.openbaton.org/bootstraps/bootstrap_3.2.0_opnfv/bootstrap-config-file
+ gvnfm:
+ userdata:
+ url: https://raw.githubusercontent.com/openbaton/generic-vnfm/3.2.0/src/main/resources/user-data.sh
+ credentials:
+ username: admin
+ password: openbaton
+
+orchestra_openims:
+ name: OpenIMS
+ descriptor:
+ url: http://marketplace.openbaton.org:8082/api/v1/nsds/fokus/OpenImsCore/3.2.0/json
+ requirements:
+ flavor:
+ name: m1.small
+ ram_min: 2048
+ disk: 5
+ vcpus: 2
+ test:
+ scscf:
+ ports: [3870, 6060]
+ pcscf:
+ ports: [4060]
+ icscf:
+ ports: [3869, 5060]
+ fhoss:
+ ports: [3868]
+ bind9:
+ ports: []
+
+orchestra_clearwaterims:
+ name: Clearwater IMS
+ descriptor:
+ url: http://marketplace.openbaton.org:8082/api/v1/nsds/fokus/ClearwaterIMS/3.2.0/json
+ requirements:
+ flavor:
+ name: m1.small
+ ram_min: 2048
+ disk: 5
+ vcpus: 2
+ test:
diff --git a/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py b/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py
new file mode 100644
index 000000000..a54059966
--- /dev/null
+++ b/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py
@@ -0,0 +1,682 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2016 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""Orchestra Clearwater IMS testcase implementation."""
+
+import json
+import logging
+import os
+import socket
+import time
+import pkg_resources
+import yaml
+
+from snaps.openstack.create_image import OpenStackImage, ImageSettings
+from snaps.openstack.create_flavor import OpenStackFlavor, FlavorSettings
+from snaps.openstack.create_security_group import (
+ OpenStackSecurityGroup,
+ SecurityGroupSettings,
+ SecurityGroupRuleSettings,
+ Direction,
+ Protocol)
+from snaps.openstack.create_network import (
+ OpenStackNetwork,
+ NetworkSettings,
+ SubnetSettings,
+ PortSettings)
+from snaps.openstack.create_router import OpenStackRouter, RouterSettings
+from snaps.openstack.os_credentials import OSCreds
+from snaps.openstack.create_instance import (
+ VmInstanceSettings,
+ OpenStackVmInstance)
+from functest.opnfv_tests.openstack.snaps import snaps_utils
+
+import functest.core.vnf as vnf
+import functest.utils.openstack_utils as os_utils
+from functest.utils.constants import CONST
+
+from org.openbaton.cli.errors.errors import NfvoException
+from org.openbaton.cli.agents.agents import MainAgent
+
+
+__author__ = "Pauls, Michael <michael.pauls@fokus.fraunhofer.de>"
+# ----------------------------------------------------------
+#
+# UTILS
+#
+# -----------------------------------------------------------
+
+
+def get_config(parameter, file_path):
+ """
+ Get config parameter.
+
+ Returns the value of a given parameter in file.yaml
+ parameter must be given in string format with dots
+ Example: general.openstack.image_name
+ """
+ with open(file_path) as config_file:
+ file_yaml = yaml.safe_load(config_file)
+ config_file.close()
+ value = file_yaml
+ for element in parameter.split("."):
+ value = value.get(element)
+ if value is None:
+ raise ValueError("The parameter %s is not defined in"
+ " reporting.yaml", parameter)
+ return value
+
+
+def servertest(host, port):
+ """Method to test that a server is reachable at IP:port"""
+ args = socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM)
+ for family, socktype, proto, canonname, sockaddr in args:
+ sock = socket.socket(family, socktype, proto)
+ try:
+ sock.connect(sockaddr)
+ except socket.error:
+ return False
+ else:
+ sock.close()
+ return True
+
+
+def get_userdata(orchestrator=dict):
+ """Build userdata for Open Baton machine"""
+ userdata = "#!/bin/bash\n"
+ userdata += "echo \"Executing userdata...\"\n"
+ userdata += "set -x\n"
+ userdata += "set -e\n"
+ userdata += "echo \"Set nameserver to '8.8.8.8'...\"\n"
+ userdata += "echo \"nameserver 8.8.8.8\" >> /etc/resolv.conf\n"
+ userdata += "echo \"Install curl...\"\n"
+ userdata += "apt-get install curl\n"
+ userdata += "echo \"Inject public key...\"\n"
+ userdata += ("echo \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuPXrV3"
+ "geeHc6QUdyUr/1Z+yQiqLcOskiEGBiXr4z76MK4abiFmDZ18OMQlc"
+ "fl0p3kS0WynVgyaOHwZkgy/DIoIplONVr2CKBKHtPK+Qcme2PVnCtv"
+ "EqItl/FcD+1h5XSQGoa+A1TSGgCod/DPo+pes0piLVXP8Ph6QS1k7S"
+ "ic7JDeRQ4oT1bXYpJ2eWBDMfxIWKZqcZRiGPgMIbJ1iEkxbpeaAd9O"
+ "4MiM9nGCPESmed+p54uYFjwEDlAJZShcAZziiZYAvMZhvAhe6USljc"
+ "7YAdalAnyD/jwCHuwIrUw/lxo7UdNCmaUxeobEYyyFA1YVXzpNFZya"
+ "XPGAAYIJwEq/ openbaton@opnfv\" >> /home/ubuntu/.ssh/aut"
+ "horized_keys\n")
+ userdata += "echo \"Download bootstrap...\"\n"
+ userdata += ("curl -s %s "
+ "> ./bootstrap\n" % orchestrator['bootstrap']['url'])
+ userdata += ("curl -s %s" "> ./config_file\n" %
+ orchestrator['bootstrap']['config']['url'])
+ userdata += ("echo \"Disable usage of mysql...\"\n")
+ userdata += "sed -i s/mysql=.*/mysql=no/g /config_file\n"
+ userdata += ("echo \"Setting 'rabbitmq_broker_ip' to '%s'\"\n"
+ % orchestrator['details']['fip'].ip)
+ userdata += ("sed -i s/rabbitmq_broker_ip=localhost/rabbitmq_broker_ip"
+ "=%s/g /config_file\n" % orchestrator['details']['fip'].ip)
+ userdata += "echo \"Set autostart of components to 'false'\"\n"
+ userdata += "export OPENBATON_COMPONENT_AUTOSTART=false\n"
+ userdata += "echo \"Execute bootstrap...\"\n"
+ bootstrap = "sh ./bootstrap release -configFile=./config_file"
+ userdata += bootstrap + "\n"
+ userdata += "echo \"Setting 'nfvo.plugin.timeout' to '300000'\"\n"
+ userdata += ("echo \"nfvo.plugin.timeout=600000\" >> "
+ "/etc/openbaton/openbaton-nfvo.properties\n")
+ userdata += (
+ "wget %s -O /etc/openbaton/openbaton-vnfm-generic-user-data.sh\n" %
+ orchestrator['gvnfm']['userdata']['url'])
+ userdata += "sed -i '113i"'\ \ \ \ '"sleep 60' " \
+ "/etc/openbaton/openbaton-vnfm-generic-user-data.sh\n"
+ userdata += "echo \"Starting NFVO\"\n"
+ userdata += "service openbaton-nfvo restart\n"
+ userdata += "echo \"Starting Generic VNFM\"\n"
+ userdata += "service openbaton-vnfm-generic restart\n"
+ userdata += "echo \"...end of userdata...\"\n"
+ return userdata
+
+
+class ClearwaterImsVnf(vnf.VnfOnBoarding):
+ """Clearwater IMS VNF deployed with openBaton orchestrator"""
+
+ logger = logging.getLogger(__name__)
+
+ def __init__(self, **kwargs):
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = "orchestra_clearwaterims"
+ super(ClearwaterImsVnf, self).__init__(**kwargs)
+ # self.logger = logging.getLogger("functest.ci.run_tests.orchestra")
+ self.logger.info("kwargs %s", (kwargs))
+
+ self.case_dir = pkg_resources.resource_filename(
+ 'functest', 'opnfv_tests/vnf/ims/')
+ self.data_dir = CONST.__getattribute__('dir_ims_data')
+ self.test_dir = CONST.__getattribute__('dir_repo_vims_test')
+ self.created_resources = []
+ self.logger.info("%s VNF onboarding test starting", self.case_name)
+
+ try:
+ self.config = CONST.__getattribute__(
+ 'vnf_{}_config'.format(self.case_name))
+ except BaseException:
+ raise Exception("Orchestra VNF config file not found")
+ config_file = self.case_dir + self.config
+
+ self.mano = dict(
+ get_config("mano", config_file),
+ details={}
+ )
+ self.logger.debug("Orchestrator configuration %s", self.mano)
+
+ self.details['orchestrator'] = dict(
+ name=self.mano['name'],
+ version=self.mano['version'],
+ status='ERROR',
+ result=''
+ )
+
+ self.vnf = dict(
+ get_config(self.case_name, config_file),
+ )
+ self.logger.debug("VNF configuration: %s", self.vnf)
+
+ self.details['vnf'] = dict(
+ name=self.vnf['name'],
+ )
+
+ self.details['test_vnf'] = dict(
+ name=self.case_name,
+ )
+
+ # Orchestra base Data directory creation
+ if not os.path.exists(self.data_dir):
+ os.makedirs(self.data_dir)
+
+ self.images = get_config("tenant_images.orchestrator", config_file)
+ self.images.update(
+ get_config(
+ "tenant_images.%s" %
+ self.case_name,
+ config_file))
+ self.snaps_creds = None
+
+ def prepare(self):
+ """Prepare testscase (Additional pre-configuration steps)."""
+ super(ClearwaterImsVnf, self).prepare()
+
+ self.logger.info("Additional pre-configuration steps")
+ self.logger.info("creds %s", (self.creds))
+
+ self.snaps_creds = OSCreds(
+ username=self.creds['username'],
+ password=self.creds['password'],
+ auth_url=self.creds['auth_url'],
+ project_name=self.creds['tenant'],
+ identity_api_version=int(os_utils.get_keystone_client_version()))
+
+ self.prepare_images()
+ self.prepare_flavor()
+ self.prepare_security_groups()
+ self.prepare_network()
+ self.prepare_floating_ip()
+
+ def prepare_images(self):
+ """Upload images if they doen't exist yet"""
+ self.logger.info("Upload images if they doen't exist yet")
+ for image_name, image_file in self.images.iteritems():
+ self.logger.info("image: %s, file: %s", image_name, image_file)
+ if image_file and image_name:
+ image = OpenStackImage(
+ self.snaps_creds,
+ ImageSettings(name=image_name,
+ image_user='cloud',
+ img_format='qcow2',
+ image_file=image_file))
+ image.create()
+ # self.created_resources.append(image);
+
+ def prepare_security_groups(self):
+ """Create Open Baton security group if it doesn't exist yet"""
+ self.logger.info(
+ "Creating security group for Open Baton if not yet existing...")
+ sg_rules = list()
+ sg_rules.append(
+ SecurityGroupRuleSettings(
+ sec_grp_name="orchestra-sec-group-allowall",
+ direction=Direction.ingress,
+ protocol=Protocol.tcp,
+ port_range_min=1,
+ port_range_max=65535))
+ sg_rules.append(
+ SecurityGroupRuleSettings(
+ sec_grp_name="orchestra-sec-group-allowall",
+ direction=Direction.egress,
+ protocol=Protocol.tcp,
+ port_range_min=1,
+ port_range_max=65535))
+ sg_rules.append(
+ SecurityGroupRuleSettings(
+ sec_grp_name="orchestra-sec-group-allowall",
+ direction=Direction.ingress,
+ protocol=Protocol.udp,
+ port_range_min=1,
+ port_range_max=65535))
+ sg_rules.append(
+ SecurityGroupRuleSettings(
+ sec_grp_name="orchestra-sec-group-allowall",
+ direction=Direction.egress,
+ protocol=Protocol.udp,
+ port_range_min=1,
+ port_range_max=65535))
+ sg_rules.append(
+ SecurityGroupRuleSettings(
+ sec_grp_name="orchestra-sec-group-allowall",
+ direction=Direction.ingress,
+ protocol=Protocol.icmp))
+ sg_rules.append(
+ SecurityGroupRuleSettings(
+ sec_grp_name="orchestra-sec-group-allowall",
+ direction=Direction.egress,
+ protocol=Protocol.icmp))
+ # sg_rules.append(
+ # SecurityGroupRuleSettings(
+ # sec_grp_name="orchestra-sec-group-allowall",
+ # direction=Direction.ingress,
+ # protocol=Protocol.icmp,
+ # port_range_min=-1,
+ # port_range_max=-1))
+ # sg_rules.append(
+ # SecurityGroupRuleSettings(
+ # sec_grp_name="orchestra-sec-group-allowall",
+ # direction=Direction.egress,
+ # protocol=Protocol.icmp,
+ # port_range_min=-1,
+ # port_range_max=-1))
+
+ security_group = OpenStackSecurityGroup(
+ self.snaps_creds,
+ SecurityGroupSettings(
+ name="orchestra-sec-group-allowall",
+ rule_settings=sg_rules))
+
+ security_group_info = security_group.create()
+ self.created_resources.append(security_group)
+ self.mano['details']['sec_group'] = security_group_info.name
+ self.logger.info(
+ "Security group orchestra-sec-group-allowall prepared")
+
+ def prepare_flavor(self):
+ """Create Open Baton flavor if it doesn't exist yet"""
+ self.logger.info(
+ "Create Flavor for Open Baton NFVO if not yet existing")
+
+ flavor_settings = FlavorSettings(
+ name=self.mano['requirements']['flavor']['name'],
+ ram=self.mano['requirements']['flavor']['ram_min'],
+ disk=self.mano['requirements']['flavor']['disk'],
+ vcpus=self.mano['requirements']['flavor']['vcpus'])
+ flavor = OpenStackFlavor(self.snaps_creds, flavor_settings)
+ flavor_info = flavor.create()
+ self.created_resources.append(flavor)
+ self.mano['details']['flavor'] = {}
+ self.mano['details']['flavor']['name'] = flavor_settings.name
+ self.mano['details']['flavor']['id'] = flavor_info.id
+
+ def prepare_network(self):
+ """Create network/subnet/router if they doen't exist yet"""
+ self.logger.info(
+ "Creating network/subnet/router if they doen't exist yet...")
+ subnet_settings = SubnetSettings(
+ name='%s_subnet' %
+ self.case_name,
+ cidr="192.168.100.0/24")
+ network_settings = NetworkSettings(
+ name='%s_net' %
+ self.case_name,
+ subnet_settings=[subnet_settings])
+ orchestra_network = OpenStackNetwork(
+ self.snaps_creds, network_settings)
+ orchestra_network_info = orchestra_network.create()
+ self.mano['details']['network'] = {}
+ self.mano['details']['network']['id'] = orchestra_network_info.id
+ self.mano['details']['network']['name'] = orchestra_network_info.name
+ self.mano['details']['external_net_name'] = snaps_utils.\
+ get_ext_net_name(self.snaps_creds)
+ self.created_resources.append(orchestra_network)
+ orchestra_router = OpenStackRouter(
+ self.snaps_creds,
+ RouterSettings(
+ name='%s_router' %
+ self.case_name,
+ external_gateway=self.mano['details']['external_net_name'],
+ internal_subnets=[
+ subnet_settings.name]))
+ orchestra_router.create()
+ self.created_resources.append(orchestra_router)
+ self.logger.info("Created network and router for Open Baton NFVO...")
+
+ def prepare_floating_ip(self):
+ """Select/Create Floating IP if it doesn't exist yet"""
+ self.logger.info("Retrieving floating IP for Open Baton NFVO")
+ neutron_client = snaps_utils.neutron_utils.neutron_client(
+ self.snaps_creds)
+ # Finding Tenant ID to check to which tenant the Floating IP belongs
+ tenant_id = os_utils.get_tenant_id(
+ os_utils.get_keystone_client(self.creds),
+ self.tenant_name)
+ # Use os_utils to retrieve complete information of Floating IPs
+ floating_ips = os_utils.get_floating_ips(neutron_client)
+ my_floating_ips = []
+ # Filter Floating IPs with tenant id
+ for floating_ip in floating_ips:
+ # self.logger.info("Floating IP: %s", floating_ip)
+ if floating_ip.get('tenant_id') == tenant_id:
+ my_floating_ips.append(floating_ip.get('floating_ip_address'))
+ # Select if Floating IP exist else create new one
+ if len(my_floating_ips) >= 1:
+ # Get Floating IP object from snaps for clean up
+ snaps_floating_ips = snaps_utils.neutron_utils.get_floating_ips(
+ neutron_client)
+ for my_floating_ip in my_floating_ips:
+ for snaps_floating_ip in snaps_floating_ips:
+ if snaps_floating_ip.ip == my_floating_ip:
+ self.mano['details']['fip'] = snaps_floating_ip
+ self.logger.info(
+ "Selected floating IP for Open Baton NFVO %s",
+ (self.mano['details']['fip'].ip))
+ break
+ if self.mano['details']['fip'] is not None:
+ break
+ else:
+ self.logger.info("Creating floating IP for Open Baton NFVO")
+ self.mano['details']['fip'] = snaps_utils.neutron_utils.\
+ create_floating_ip(
+ neutron_client,
+ self.mano['details']['external_net_name'])
+ self.logger.info(
+ "Created floating IP for Open Baton NFVO %s",
+ (self.mano['details']['fip'].ip))
+
+ def get_vim_descriptor(self):
+ """"Create VIM descriptor to be used for onboarding"""
+ self.logger.info(
+ "Building VIM descriptor with PoP creds: %s",
+ self.creds)
+ # Depending on API version either tenant ID or project name must be
+ # used
+ if os_utils.is_keystone_v3():
+ self.logger.info(
+ "Using v3 API of OpenStack... -> Using OS_PROJECT_ID")
+ project_id = os_utils.get_tenant_id(
+ os_utils.get_keystone_client(),
+ self.creds.get("project_name"))
+ else:
+ self.logger.info(
+ "Using v2 API of OpenStack... -> Using OS_TENANT_NAME")
+ project_id = self.creds.get("tenant_name")
+ self.logger.debug("VIM project/tenant id: %s", project_id)
+ vim_json = {
+ "name": "vim-instance",
+ "authUrl": self.creds.get("auth_url"),
+ "tenant": project_id,
+ "username": self.creds.get("username"),
+ "password": self.creds.get("password"),
+ "securityGroups": [
+ self.mano['details']['sec_group']
+ ],
+ "type": "openstack",
+ "location": {
+ "name": "opnfv",
+ "latitude": "52.525876",
+ "longitude": "13.314400"
+ }
+ }
+ self.logger.info("Built VIM descriptor: %s", vim_json)
+ return vim_json
+
+ def deploy_orchestrator(self):
+ self.logger.info("Deploying Open Baton...")
+ self.logger.info("Details: %s", self.mano['details'])
+ start_time = time.time()
+
+ self.logger.info("Creating orchestra instance...")
+ userdata = get_userdata(self.mano)
+ self.logger.info("flavor: %s\n"
+ "image: %s\n"
+ "network_id: %s\n",
+ self.mano['details']['flavor']['name'],
+ self.mano['requirements']['image'],
+ self.mano['details']['network']['id'])
+ self.logger.debug("userdata: %s\n", userdata)
+ # setting up image
+ image_settings = ImageSettings(
+ name=self.mano['requirements']['image'],
+ image_user='ubuntu',
+ exists=True)
+ # setting up port
+ port_settings = PortSettings(
+ name='%s_port' % self.case_name,
+ network_name=self.mano['details']['network']['name'])
+ # build configuration of vm
+ orchestra_settings = VmInstanceSettings(
+ name=self.case_name,
+ flavor=self.mano['details']['flavor']['name'],
+ port_settings=[port_settings],
+ security_group_names=[self.mano['details']['sec_group']],
+ userdata=userdata)
+ orchestra_vm = OpenStackVmInstance(self.snaps_creds,
+ orchestra_settings,
+ image_settings)
+
+ orchestra_vm.create()
+ self.created_resources.append(orchestra_vm)
+ self.mano['details']['id'] = orchestra_vm.get_vm_info()['id']
+ self.logger.info(
+ "Created orchestra instance: %s",
+ self.mano['details']['id'])
+
+ self.logger.info("Associating floating ip: '%s' to VM '%s' ",
+ self.mano['details']['fip'].ip,
+ self.case_name)
+ nova_client = os_utils.get_nova_client()
+ if not os_utils.add_floating_ip(
+ nova_client,
+ self.mano['details']['id'],
+ self.mano['details']['fip'].ip):
+ duration = time.time() - start_time
+ self.details["orchestrator"].update(
+ status='FAIL', duration=duration)
+ self.logger.error("Cannot associate floating IP to VM.")
+ return False
+
+ self.logger.info("Waiting for Open Baton NFVO to be up and running...")
+ timeout = 0
+ while timeout < 200:
+ if servertest(
+ self.mano['details']['fip'].ip,
+ "8080"):
+ break
+ else:
+ self.logger.info(
+ "Open Baton NFVO is not started yet (%ss)",
+ (timeout * 5))
+ time.sleep(5)
+ timeout += 1
+
+ if timeout >= 200:
+ duration = time.time() - start_time
+ self.details["orchestrator"].update(
+ status='FAIL', duration=duration)
+ self.logger.error("Open Baton is not started correctly")
+ return False
+
+ self.logger.info("Waiting for all components to be up and running...")
+ time.sleep(60)
+ duration = time.time() - start_time
+ self.details["orchestrator"].update(status='PASS', duration=duration)
+ self.logger.info("Deploy Open Baton NFVO: OK")
+ return True
+
+ def deploy_vnf(self):
+ start_time = time.time()
+ self.logger.info("Deploying %s...", self.vnf['name'])
+
+ main_agent = MainAgent(
+ nfvo_ip=self.mano['details']['fip'].ip,
+ nfvo_port=8080,
+ https=False,
+ version=1,
+ username=self.mano['credentials']['username'],
+ password=self.mano['credentials']['password'])
+
+ self.logger.info(
+ "Create %s Flavor if not existing", self.vnf['name'])
+ flavor_settings = FlavorSettings(
+ name=self.vnf['requirements']['flavor']['name'],
+ ram=self.vnf['requirements']['flavor']['ram_min'],
+ disk=self.vnf['requirements']['flavor']['disk'],
+ vcpus=self.vnf['requirements']['flavor']['vcpus'])
+ flavor = OpenStackFlavor(self.snaps_creds, flavor_settings)
+ flavor_info = flavor.create()
+ self.logger.debug("Flavor id: %s", flavor_info.id)
+
+ self.logger.info("Getting project 'default'...")
+ project_agent = main_agent.get_agent("project", "")
+ for project in json.loads(project_agent.find()):
+ if project.get("name") == "default":
+ self.mano['details']['project_id'] = project.get("id")
+ self.logger.info("Found project 'default': %s", project)
+ break
+
+ vim_json = self.get_vim_descriptor()
+ self.logger.info("Registering VIM: %s", vim_json)
+
+ main_agent.get_agent(
+ "vim", project_id=self.mano['details']['project_id']).create(
+ entity=json.dumps(vim_json))
+
+ market_agent = main_agent.get_agent(
+ "market", project_id=self.mano['details']['project_id'])
+
+ try:
+ self.logger.info("sending: %s", self.vnf['descriptor']['url'])
+ nsd = market_agent.create(entity=self.vnf['descriptor']['url'])
+ if nsd.get('id') is None:
+ self.logger.error("NSD not onboarded correctly")
+ duration = time.time() - start_time
+ self.details["vnf"].update(status='FAIL', duration=duration)
+ return False
+ self.mano['details']['nsd_id'] = nsd.get('id')
+ self.logger.info("Onboarded NSD: " + nsd.get("name"))
+
+ nsr_agent = main_agent.get_agent(
+ "nsr", project_id=self.mano['details']['project_id'])
+
+ self.mano['details']['nsr'] = nsr_agent.create(
+ self.mano['details']['nsd_id'])
+ except NfvoException as exc:
+ self.logger.error(exc.message)
+ duration = time.time() - start_time
+ self.details["vnf"].update(status='FAIL', duration=duration)
+ return False
+
+ if self.mano['details']['nsr'].get('code') is not None:
+ self.logger.error(
+ "%s cannot be deployed: %s -> %s",
+ self.vnf['name'],
+ self.mano['details']['nsr'].get('code'),
+ self.mano['details']['nsr'].get('message'))
+ self.logger.error("%s cannot be deployed", self.vnf['name'])
+ duration = time.time() - start_time
+ self.details["vnf"].update(status='FAIL', duration=duration)
+ return False
+
+ timeout = 0
+ self.logger.info("Waiting for NSR to go to ACTIVE...")
+ while self.mano['details']['nsr'].get("status") != 'ACTIVE' \
+ and self.mano['details']['nsr'].get("status") != 'ERROR':
+ timeout += 1
+ self.logger.info("NSR is not yet ACTIVE... (%ss)", 5 * timeout)
+ if timeout == 300:
+ self.logger.error("INACTIVE NSR after %s sec..", 5 * timeout)
+ duration = time.time() - start_time
+ self.details["vnf"].update(status='FAIL', duration=duration)
+ return False
+ time.sleep(5)
+ self.mano['details']['nsr'] = json.loads(
+ nsr_agent.find(self.mano['details']['nsr'].get('id')))
+
+ duration = time.time() - start_time
+ if self.mano['details']['nsr'].get("status") == 'ACTIVE':
+ self.details["vnf"].update(status='PASS', duration=duration)
+ self.logger.info("Sleep for 60s to ensure that all "
+ "services are up and running...")
+ time.sleep(60)
+ result = True
+ else:
+ self.details["vnf"].update(status='FAIL', duration=duration)
+ self.logger.error("NSR: %s", self.mano['details'].get('nsr'))
+ result = False
+ return result
+
+ def test_vnf(self):
+ self.logger.info(
+ "Testing VNF Clearwater IMS is not yet implemented...")
+ start_time = time.time()
+
+ duration = time.time() - start_time
+ self.details["test_vnf"].update(status='PASS', duration=duration)
+ self.logger.info("Test VNF: OK")
+ return True
+
+ def clean(self):
+ self.logger.info("Cleaning %s...", self.case_name)
+ try:
+ main_agent = MainAgent(
+ nfvo_ip=self.mano['details']['fip'].ip,
+ nfvo_port=8080,
+ https=False,
+ version=1,
+ username=self.mano['credentials']['username'],
+ password=self.mano['credentials']['password'])
+ self.logger.info("Terminating %s...", self.vnf['name'])
+ if (self.mano['details'].get('nsr')):
+ main_agent.get_agent(
+ "nsr",
+ project_id=self.mano['details']['project_id']).delete(
+ self.mano['details']['nsr'].get('id'))
+ self.logger.info("Sleeping 60 seconds...")
+ time.sleep(60)
+ else:
+ self.logger.info("No need to terminate the VNF...")
+ # os_utils.delete_instance(nova_client=os_utils.get_nova_client(),
+ # instance_id=self.mano_instance_id)
+ except (NfvoException, KeyError) as exc:
+ self.logger.error('Unexpected error cleaning - %s', exc)
+
+ try:
+ neutron_client = os_utils.get_neutron_client(self.creds)
+ self.logger.info("Deleting Open Baton Port...")
+ port = snaps_utils.neutron_utils.get_port_by_name(
+ neutron_client, '%s_port' % self.case_name)
+ snaps_utils.neutron_utils.delete_port(neutron_client, port)
+ time.sleep(10)
+ except Exception as exc:
+ self.logger.error('Unexpected error cleaning - %s', exc)
+ try:
+ self.logger.info("Deleting Open Baton Floating IP...")
+ snaps_utils.neutron_utils.delete_floating_ip(
+ neutron_client, self.mano['details']['fip'])
+ except Exception as exc:
+ self.logger.error('Unexpected error cleaning - %s', exc)
+
+ for resource in reversed(self.created_resources):
+ try:
+ self.logger.info("Cleaning %s", str(resource))
+ resource.clean()
+ except Exception as exc:
+ self.logger.error('Unexpected error cleaning - %s', exc)
+ super(ClearwaterImsVnf, self).clean()
diff --git a/functest/opnfv_tests/vnf/ims/orchestra_ims.yaml b/functest/opnfv_tests/vnf/ims/orchestra_ims.yaml
deleted file mode 100644
index 9deb11c7b..000000000
--- a/functest/opnfv_tests/vnf/ims/orchestra_ims.yaml
+++ /dev/null
@@ -1,45 +0,0 @@
-tenant_images:
- ubuntu_14.04: http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img
- openims: http://marketplace.openbaton.org:8082/api/v1/images/52e2ccc0-1dce-4663-894d-28aab49323aa/img
-orchestrator:
- name: openbaton
- version: '3.2.0'
- requirements:
- flavor:
- name: orchestra
- ram_min: 4096
- disk: 5
- vcpus: 2
- os_image: 'ubuntu_14.04'
- bootstrap:
- url: http://get.openbaton.org/bootstraps/bootstrap_3.2.0_opnfv/bootstrap
- config:
- url: http://get.openbaton.org/bootstraps/bootstrap_3.2.0_opnfv/bootstrap-config-file
- gvnfm:
- userdata:
- url: https://raw.githubusercontent.com/openbaton/generic-vnfm/3.2.0/src/main/resources/user-data.sh
- credentials:
- username: admin
- password: openbaton
-vnf:
- name: openims
- descriptor:
- url: http://marketplace.openbaton.org:8082/api/v1/nsds/fokus/OpenImsCore/3.2.0/json
- requirements:
- flavor:
- name: m1.small
- ram_min: 2048
- disk: 5
- vcpus: 2
-
-vIMS:
- scscf:
- ports: [3870, 6060]
- pcscf:
- ports: [4060]
- icscf:
- ports: [3869, 5060]
- fhoss:
- ports: [3868]
- bind9:
- ports: [] \ No newline at end of file
diff --git a/functest/opnfv_tests/vnf/ims/orchestra_ims.py b/functest/opnfv_tests/vnf/ims/orchestra_openims.py
index 0a0a766a3..f8acada44 100644
--- a/functest/opnfv_tests/vnf/ims/orchestra_ims.py
+++ b/functest/opnfv_tests/vnf/ims/orchestra_openims.py
@@ -139,16 +139,16 @@ def get_userdata(orchestrator=dict):
return userdata
-class ImsVnf(vnf.VnfOnBoarding):
+class OpenImsVnf(vnf.VnfOnBoarding):
"""OpenIMS VNF deployed with openBaton orchestrator"""
- # logger = logging.getLogger(__name__)
+ logger = logging.getLogger(__name__)
def __init__(self, **kwargs):
if "case_name" not in kwargs:
- kwargs["case_name"] = "orchestra_ims"
- super(ImsVnf, self).__init__(**kwargs)
- self.logger = logging.getLogger("functest.ci.run_tests.orchestra")
+ kwargs["case_name"] = "orchestra_openims"
+ super(OpenImsVnf, self).__init__(**kwargs)
+ # self.logger = logging.getLogger("functest.ci.run_tests.orchestra")
self.logger.info("kwargs %s", (kwargs))
self.case_dir = pkg_resources.resource_filename(
@@ -156,7 +156,7 @@ class ImsVnf(vnf.VnfOnBoarding):
self.data_dir = CONST.__getattribute__('dir_ims_data')
self.test_dir = CONST.__getattribute__('dir_repo_vims_test')
self.created_resources = []
- self.logger.info("Orchestra IMS VNF onboarding test starting")
+ self.logger.info("%s VNF onboarding test starting", self.case_name)
try:
self.config = CONST.__getattribute__(
@@ -165,48 +165,44 @@ class ImsVnf(vnf.VnfOnBoarding):
raise Exception("Orchestra VNF config file not found")
config_file = self.case_dir + self.config
- self.baton = dict(
- requirements=get_config("orchestrator.requirements", config_file),
- credentials=get_config("orchestrator.credentials", config_file),
- bootstrap=get_config("orchestrator.bootstrap", config_file),
- gvnfm=get_config("orchestrator.gvnfm", config_file),
+ self.mano = dict(
+ get_config("mano", config_file),
+ details={}
)
- self.logger.debug("Orchestrator configuration %s", self.baton)
+ self.logger.debug("Orchestrator configuration %s", self.mano)
self.details['orchestrator'] = dict(
- name=get_config("orchestrator.name", config_file),
- version=get_config("orchestrator.version", config_file),
+ name=self.mano['name'],
+ version=self.mano['version'],
status='ERROR',
result=''
)
- self.baton['details'] = {}
- self.baton['details']['image'] = self.baton['requirements']['os_image']
- self.baton['details']['name'] = self.details['orchestrator']['name']
self.vnf = dict(
- descriptor=get_config("vnf.descriptor", config_file),
- requirements=get_config("vnf.requirements", config_file)
+ get_config(self.case_name, config_file),
)
+ self.logger.debug("VNF configuration: %s", self.vnf)
+
self.details['vnf'] = dict(
- name=get_config("vnf.name", config_file),
+ name=self.vnf['name'],
)
- self.logger.debug("VNF configuration: %s", self.vnf)
self.details['test_vnf'] = dict(
- name="openims-test",
+ name=self.case_name,
)
- # vIMS Data directory creation
+ # Orchestra base Data directory creation
if not os.path.exists(self.data_dir):
os.makedirs(self.data_dir)
- self.images = get_config("tenant_images", config_file)
- self.ims_conf = get_config("vIMS", config_file)
+ self.images = get_config("tenant_images.orchestrator", config_file)
+ self.images.update(get_config("tenant_images.%s" %
+ self.case_name, config_file))
self.snaps_creds = None
def prepare(self):
"""Prepare testscase (Additional pre-configuration steps)."""
- super(ImsVnf, self).prepare()
+ super(OpenImsVnf, self).prepare()
self.logger.info("Additional pre-configuration steps")
self.logger.info("creds %s", (self.creds))
@@ -227,15 +223,15 @@ class ImsVnf(vnf.VnfOnBoarding):
def prepare_images(self):
"""Upload images if they doen't exist yet"""
self.logger.info("Upload images if they doen't exist yet")
- for image_name, image_url in self.images.iteritems():
- self.logger.info("image: %s, url: %s", image_name, image_url)
- if image_url and image_name:
+ for image_name, image_file in self.images.iteritems():
+ self.logger.info("image: %s, file: %s", image_name, image_file)
+ if image_file and image_name:
image = OpenStackImage(
self.snaps_creds,
ImageSettings(name=image_name,
image_user='cloud',
img_format='qcow2',
- url=image_url))
+ image_file=image_file))
image.create()
# self.created_resources.append(image);
@@ -272,6 +268,16 @@ class ImsVnf(vnf.VnfOnBoarding):
protocol=Protocol.udp,
port_range_min=1,
port_range_max=65535))
+ sg_rules.append(
+ SecurityGroupRuleSettings(
+ sec_grp_name="orchestra-sec-group-allowall",
+ direction=Direction.ingress,
+ protocol=Protocol.icmp))
+ sg_rules.append(
+ SecurityGroupRuleSettings(
+ sec_grp_name="orchestra-sec-group-allowall",
+ direction=Direction.egress,
+ protocol=Protocol.icmp))
# sg_rules.append(
# SecurityGroupRuleSettings(
# sec_grp_name="orchestra-sec-group-allowall",
@@ -295,7 +301,7 @@ class ImsVnf(vnf.VnfOnBoarding):
security_group_info = security_group.create()
self.created_resources.append(security_group)
- self.baton['details']['sec_group'] = security_group_info.name
+ self.mano['details']['sec_group'] = security_group_info.name
self.logger.info(
"Security group orchestra-sec-group-allowall prepared")
@@ -305,16 +311,16 @@ class ImsVnf(vnf.VnfOnBoarding):
"Create Flavor for Open Baton NFVO if not yet existing")
flavor_settings = FlavorSettings(
- name=self.baton['requirements']['flavor']['name'],
- ram=self.baton['requirements']['flavor']['ram_min'],
- disk=self.baton['requirements']['flavor']['disk'],
- vcpus=self.baton['requirements']['flavor']['vcpus'])
+ name=self.mano['requirements']['flavor']['name'],
+ ram=self.mano['requirements']['flavor']['ram_min'],
+ disk=self.mano['requirements']['flavor']['disk'],
+ vcpus=self.mano['requirements']['flavor']['vcpus'])
flavor = OpenStackFlavor(self.snaps_creds, flavor_settings)
flavor_info = flavor.create()
self.created_resources.append(flavor)
- self.baton['details']['flavor'] = {}
- self.baton['details']['flavor']['name'] = flavor_settings.name
- self.baton['details']['flavor']['id'] = flavor_info.id
+ self.mano['details']['flavor'] = {}
+ self.mano['details']['flavor']['name'] = flavor_settings.name
+ self.mano['details']['flavor']['id'] = flavor_info.id
def prepare_network(self):
"""Create network/subnet/router if they doen't exist yet"""
@@ -322,27 +328,27 @@ class ImsVnf(vnf.VnfOnBoarding):
"Creating network/subnet/router if they doen't exist yet...")
subnet_settings = SubnetSettings(
name='%s_subnet' %
- self.baton['details']['name'],
+ self.case_name,
cidr="192.168.100.0/24")
network_settings = NetworkSettings(
name='%s_net' %
- self.baton['details']['name'],
+ self.case_name,
subnet_settings=[subnet_settings])
orchestra_network = OpenStackNetwork(
self.snaps_creds, network_settings)
orchestra_network_info = orchestra_network.create()
- self.baton['details']['network'] = {}
- self.baton['details']['network']['id'] = orchestra_network_info.id
- self.baton['details']['network']['name'] = orchestra_network_info.name
- self.baton['details']['external_net_name'] = \
+ self.mano['details']['network'] = {}
+ self.mano['details']['network']['id'] = orchestra_network_info.id
+ self.mano['details']['network']['name'] = orchestra_network_info.name
+ self.mano['details']['external_net_name'] = \
snaps_utils.get_ext_net_name(self.snaps_creds)
self.created_resources.append(orchestra_network)
orchestra_router = OpenStackRouter(
self.snaps_creds,
RouterSettings(
name='%s_router' %
- self.baton['details']['name'],
- external_gateway=self.baton['details']['external_net_name'],
+ self.case_name,
+ external_gateway=self.mano['details']['external_net_name'],
internal_subnets=[
subnet_settings.name]))
orchestra_router.create()
@@ -374,21 +380,21 @@ class ImsVnf(vnf.VnfOnBoarding):
for my_floating_ip in my_floating_ips:
for snaps_floating_ip in snaps_floating_ips:
if snaps_floating_ip.ip == my_floating_ip:
- self.baton['details']['fip'] = snaps_floating_ip
+ self.mano['details']['fip'] = snaps_floating_ip
self.logger.info(
"Selected floating IP for Open Baton NFVO %s",
- (self.baton['details']['fip'].ip))
+ (self.mano['details']['fip'].ip))
break
- if self.baton['details']['fip'] is not None:
+ if self.mano['details']['fip'] is not None:
break
else:
self.logger.info("Creating floating IP for Open Baton NFVO")
- self.baton['details']['fip'] = \
- snaps_utils.neutron_utils.create_floating_ip(
- neutron_client, self.baton['details']['external_net_name'])
+ self.mano['details']['fip'] = (
+ snaps_utils.neutron_utils. create_floating_ip(
+ neutron_client, self.mano['details']['external_net_name']))
self.logger.info(
"Created floating IP for Open Baton NFVO %s",
- (self.baton['details']['fip'].ip))
+ (self.mano['details']['fip'].ip))
def get_vim_descriptor(self):
""""Create VIM descriptor to be used for onboarding"""
@@ -415,7 +421,7 @@ class ImsVnf(vnf.VnfOnBoarding):
"username": self.creds.get("username"),
"password": self.creds.get("password"),
"securityGroups": [
- self.baton['details']['sec_group']
+ self.mano['details']['sec_group']
],
"type": "openstack",
"location": {
@@ -428,34 +434,34 @@ class ImsVnf(vnf.VnfOnBoarding):
return vim_json
def deploy_orchestrator(self):
- self.logger.info("Deploying orchestrator Open Baton ...")
- self.logger.info("Details: %s", self.baton['details'])
+ self.logger.info("Deploying Open Baton...")
+ self.logger.info("Details: %s", self.mano['details'])
start_time = time.time()
self.logger.info("Creating orchestra instance...")
- userdata = get_userdata(self.baton)
+ userdata = get_userdata(self.mano)
self.logger.info("flavor: %s\n"
"image: %s\n"
"network_id: %s\n",
- self.baton['details']['flavor']['name'],
- self.baton['details']['image'],
- self.baton['details']['network']['id'])
+ self.mano['details']['flavor']['name'],
+ self.mano['requirements']['image'],
+ self.mano['details']['network']['id'])
self.logger.debug("userdata: %s\n", userdata)
# setting up image
image_settings = ImageSettings(
- name=self.baton['details']['image'],
+ name=self.mano['requirements']['image'],
image_user='ubuntu',
exists=True)
# setting up port
port_settings = PortSettings(
- name='%s_port' % self.baton['details']['name'],
- network_name=self.baton['details']['network']['name'])
+ name='%s_port' % self.case_name,
+ network_name=self.mano['details']['network']['name'])
# build configuration of vm
orchestra_settings = VmInstanceSettings(
- name=self.baton['details']['name'],
- flavor=self.baton['details']['flavor']['name'],
+ name=self.case_name,
+ flavor=self.mano['details']['flavor']['name'],
port_settings=[port_settings],
- security_group_names=[self.baton['details']['sec_group']],
+ security_group_names=[self.mano['details']['sec_group']],
userdata=userdata)
orchestra_vm = OpenStackVmInstance(self.snaps_creds,
orchestra_settings,
@@ -463,19 +469,19 @@ class ImsVnf(vnf.VnfOnBoarding):
orchestra_vm.create()
self.created_resources.append(orchestra_vm)
- self.baton['details']['id'] = orchestra_vm.get_vm_info()['id']
+ self.mano['details']['id'] = orchestra_vm.get_vm_info()['id']
self.logger.info(
"Created orchestra instance: %s",
- self.baton['details']['id'])
+ self.mano['details']['id'])
self.logger.info("Associating floating ip: '%s' to VM '%s' ",
- self.baton['details']['fip'].ip,
- self.baton['details']['name'])
+ self.mano['details']['fip'].ip,
+ self.case_name)
nova_client = os_utils.get_nova_client()
if not os_utils.add_floating_ip(
nova_client,
- self.baton['details']['id'],
- self.baton['details']['fip'].ip):
+ self.mano['details']['id'],
+ self.mano['details']['fip'].ip):
duration = time.time() - start_time
self.details["orchestrator"].update(
status='FAIL', duration=duration)
@@ -486,7 +492,7 @@ class ImsVnf(vnf.VnfOnBoarding):
timeout = 0
while timeout < 200:
if servertest(
- self.baton['details']['fip'].ip,
+ self.mano['details']['fip'].ip,
"8080"):
break
else:
@@ -511,18 +517,18 @@ class ImsVnf(vnf.VnfOnBoarding):
def deploy_vnf(self):
start_time = time.time()
- self.logger.info("Deploying OpenIMS...")
+ self.logger.info("Deploying %s...", self.vnf['name'])
main_agent = MainAgent(
- nfvo_ip=self.baton['details']['fip'].ip,
+ nfvo_ip=self.mano['details']['fip'].ip,
nfvo_port=8080,
https=False,
version=1,
- username=self.baton['credentials']['username'],
- password=self.baton['credentials']['password'])
+ username=self.mano['credentials']['username'],
+ password=self.mano['credentials']['password'])
self.logger.info(
- "Check if openims Flavor is available, if not, create one")
+ "Create %s Flavor if not existing", self.vnf['name'])
flavor_settings = FlavorSettings(
name=self.vnf['requirements']['flavor']['name'],
ram=self.vnf['requirements']['flavor']['ram_min'],
@@ -536,7 +542,7 @@ class ImsVnf(vnf.VnfOnBoarding):
project_agent = main_agent.get_agent("project", "")
for project in json.loads(project_agent.find()):
if project.get("name") == "default":
- self.baton['details']['project_id'] = project.get("id")
+ self.mano['details']['project_id'] = project.get("id")
self.logger.info("Found project 'default': %s", project)
break
@@ -544,11 +550,11 @@ class ImsVnf(vnf.VnfOnBoarding):
self.logger.info("Registering VIM: %s", vim_json)
main_agent.get_agent(
- "vim", project_id=self.baton['details']['project_id']).create(
+ "vim", project_id=self.mano['details']['project_id']).create(
entity=json.dumps(vim_json))
market_agent = main_agent.get_agent(
- "market", project_id=self.baton['details']['project_id'])
+ "market", project_id=self.mano['details']['project_id'])
try:
self.logger.info("sending: %s", self.vnf['descriptor']['url'])
@@ -558,47 +564,48 @@ class ImsVnf(vnf.VnfOnBoarding):
duration = time.time() - start_time
self.details["vnf"].update(status='FAIL', duration=duration)
return False
- self.baton['details']['nsd_id'] = nsd.get('id')
+ self.mano['details']['nsd_id'] = nsd.get('id')
self.logger.info("Onboarded NSD: " + nsd.get("name"))
nsr_agent = main_agent.get_agent(
- "nsr", project_id=self.baton['details']['project_id'])
+ "nsr", project_id=self.mano['details']['project_id'])
- self.baton['details']['nsr'] = nsr_agent.create(
- self.baton['details']['nsd_id'])
+ self.mano['details']['nsr'] = nsr_agent.create(
+ self.mano['details']['nsd_id'])
except NfvoException as exc:
self.logger.error(exc.message)
duration = time.time() - start_time
self.details["vnf"].update(status='FAIL', duration=duration)
return False
- if self.baton['details']['nsr'].get('code') is not None:
+ if self.mano['details']['nsr'].get('code') is not None:
self.logger.error(
- "vIMS cannot be deployed: %s -> %s",
- self.baton['details']['nsr'].get('code'),
- self.baton['details']['nsr'].get('message'))
- self.logger.error("vIMS cannot be deployed")
+ "%s cannot be deployed: %s -> %s",
+ self.vnf['name'],
+ self.mano['details']['nsr'].get('code'),
+ self.mano['details']['nsr'].get('message'))
+ self.logger.error("%s cannot be deployed", self.vnf['name'])
duration = time.time() - start_time
self.details["vnf"].update(status='FAIL', duration=duration)
return False
timeout = 0
self.logger.info("Waiting for NSR to go to ACTIVE...")
- while self.baton['details']['nsr'].get("status") != 'ACTIVE' \
- and self.baton['details']['nsr'].get("status") != 'ERROR':
+ while self.mano['details']['nsr'].get("status") != 'ACTIVE' \
+ and self.mano['details']['nsr'].get("status") != 'ERROR':
timeout += 1
self.logger.info("NSR is not yet ACTIVE... (%ss)", 5 * timeout)
- if timeout == 150:
+ if timeout == 300:
self.logger.error("INACTIVE NSR after %s sec..", 5 * timeout)
duration = time.time() - start_time
self.details["vnf"].update(status='FAIL', duration=duration)
return False
time.sleep(5)
- self.baton['details']['nsr'] = json.loads(
- nsr_agent.find(self.baton['details']['nsr'].get('id')))
+ self.mano['details']['nsr'] = json.loads(
+ nsr_agent.find(self.mano['details']['nsr'].get('id')))
duration = time.time() - start_time
- if self.baton['details']['nsr'].get("status") == 'ACTIVE':
+ if self.mano['details']['nsr'].get("status") == 'ACTIVE':
self.details["vnf"].update(status='PASS', duration=duration)
self.logger.info("Sleep for 60s to ensure that all "
"services are up and running...")
@@ -606,7 +613,7 @@ class ImsVnf(vnf.VnfOnBoarding):
result = True
else:
self.details["vnf"].update(status='FAIL', duration=duration)
- self.logger.error("NSR: %s", self.baton['details'].get('nsr'))
+ self.logger.error("NSR: %s", self.mano['details'].get('nsr'))
result = False
return result
@@ -615,11 +622,11 @@ class ImsVnf(vnf.VnfOnBoarding):
start_time = time.time()
self.logger.info(
"Testing if %s works properly...",
- self.baton['details']['nsr'].get('name'))
- for vnfr in self.baton['details']['nsr'].get('vnfr'):
+ self.mano['details']['nsr'].get('name'))
+ for vnfr in self.mano['details']['nsr'].get('vnfr'):
self.logger.info(
"Checking ports %s of VNF %s",
- self.ims_conf.get(vnfr.get('name')).get('ports'),
+ self.vnf['test'][vnfr.get('name')]['ports'],
vnfr.get('name'))
for vdu in vnfr.get('vdu'):
for vnfci in vdu.get('vnfc_instance'):
@@ -631,8 +638,8 @@ class ImsVnf(vnf.VnfOnBoarding):
"Testing %s:%s",
vnfci.get('hostname'),
floating_ip.get('ip'))
- for port in self.ims_conf.get(
- vnfr.get('name')).get('ports'):
+ for port in self.vnf['test'][vnfr.get(
+ 'name')]['ports']:
if servertest(floating_ip.get('ip'), port):
self.logger.info(
"VNFC instance %s is reachable at %s:%s",
@@ -662,32 +669,43 @@ class ImsVnf(vnf.VnfOnBoarding):
return True
def clean(self):
- self.logger.info("Cleaning...")
+ self.logger.info("Cleaning %s...", self.case_name)
try:
main_agent = MainAgent(
- nfvo_ip=self.baton['details']['fip'].ip,
+ nfvo_ip=self.mano['details']['fip'].ip,
nfvo_port=8080,
https=False,
version=1,
- username=self.baton['credentials']['username'],
- password=self.baton['credentials']['password'])
- self.logger.info("Terminating OpenIMS VNF...")
- if (self.baton['details'].get('nsr')):
+ username=self.mano['credentials']['username'],
+ password=self.mano['credentials']['password'])
+ self.logger.info("Terminating %s...", self.vnf['name'])
+ if (self.mano['details'].get('nsr')):
main_agent.get_agent(
"nsr",
- project_id=self.baton['details']['project_id'])\
- .delete(self.baton['details']['nsr'].get('id'))
- self.logger.info("Waiting 60sec for terminating OpenIMS VNF..")
+ project_id=self.mano['details']['project_id']).\
+ delete(self.mano['details']['nsr'].get('id'))
+ self.logger.info("Sleeping 60 seconds...")
time.sleep(60)
+ else:
+ self.logger.info("No need to terminate the VNF...")
# os_utils.delete_instance(nova_client=os_utils.get_nova_client(),
- # instance_id=self.baton_instance_id)
+ # instance_id=self.mano_instance_id)
except (NfvoException, KeyError) as exc:
self.logger.error('Unexpected error cleaning - %s', exc)
try:
neutron_client = os_utils.get_neutron_client(self.creds)
+ self.logger.info("Deleting Open Baton Port...")
+ port = snaps_utils.neutron_utils.get_port_by_name(
+ neutron_client, '%s_port' % self.case_name)
+ snaps_utils.neutron_utils.delete_port(neutron_client, port)
+ time.sleep(10)
+ except Exception as exc:
+ self.logger.error('Unexpected error cleaning - %s', exc)
+ try:
+ self.logger.info("Deleting Open Baton Floating IP...")
snaps_utils.neutron_utils.delete_floating_ip(
- neutron_client, self.baton['details']['fip'])
+ neutron_client, self.mano['details']['fip'])
except Exception as exc:
self.logger.error('Unexpected error cleaning - %s', exc)
@@ -697,4 +715,4 @@ class ImsVnf(vnf.VnfOnBoarding):
resource.clean()
except Exception as exc:
self.logger.error('Unexpected error cleaning - %s', exc)
- super(ImsVnf, self).clean()
+ super(OpenImsVnf, self).clean()
diff --git a/functest/tests/unit/openstack/refstack_client/test_refstack_client.py b/functest/tests/unit/openstack/refstack_client/test_refstack_client.py
index c5601075e..ca0974832 100644
--- a/functest/tests/unit/openstack/refstack_client/test_refstack_client.py
+++ b/functest/tests/unit/openstack/refstack_client/test_refstack_client.py
@@ -12,9 +12,12 @@ import pkg_resources
import unittest
from functest.core import testcase
-from functest.opnfv_tests.openstack.refstack_client import refstack_client
+from functest.opnfv_tests.openstack.refstack_client.refstack_client import \
+ RefstackClient, RefstackClientParser
from functest.utils.constants import CONST
+from snaps.openstack.os_credentials import OSCreds
+
class OSRefstackClientTesting(unittest.TestCase):
@@ -25,34 +28,44 @@ class OSRefstackClientTesting(unittest.TestCase):
'functest', 'opnfv_tests/openstack/refstack_client/defcore.txt')
def setUp(self):
- self.defaultargs = {'config': self._config,
- 'testlist': self._testlist}
+ self.default_args = {'config': self._config,
+ 'testlist': self._testlist}
CONST.__setattr__('OS_AUTH_URL', 'https://ip:5000/v3')
CONST.__setattr__('OS_INSECURE', 'true')
- self.refstackclient = refstack_client.RefstackClient()
+ self.os_creds = OSCreds(
+ username='user', password='pass',
+ auth_url='http://foo.com:5000/v3', project_name='bar')
+
+ @mock.patch('functest.opnfv_tests.openstack.refstack_client.tempest_conf.'
+ 'TempestConf', return_value=mock.Mock())
+ def _create_client(self, mock_conf):
+ with mock.patch('snaps.openstack.tests.openstack_tests.'
+ 'get_credentials', return_value=self.os_creds):
+ return RefstackClient()
def test_run_defcore_insecure(self):
insecure = '-k'
config = 'tempest.conf'
testlist = 'testlist'
+ client = self._create_client()
with mock.patch('functest.opnfv_tests.openstack.refstack_client.'
'refstack_client.ft_utils.execute_command') as m:
cmd = ("refstack-client test {0} -c {1} -v --test-list {2}"
.format(insecure, config, testlist))
- self.refstackclient.run_defcore(config, testlist)
+ client.run_defcore(config, testlist)
m.assert_any_call(cmd)
def test_run_defcore(self):
CONST.__setattr__('OS_AUTH_URL', 'http://ip:5000/v3')
- refstackclient = refstack_client.RefstackClient()
insecure = ''
config = 'tempest.conf'
testlist = 'testlist'
+ client = self._create_client()
with mock.patch('functest.opnfv_tests.openstack.refstack_client.'
'refstack_client.ft_utils.execute_command') as m:
cmd = ("refstack-client test {0} -c {1} -v --test-list {2}"
.format(insecure, config, testlist))
- refstackclient.run_defcore(config, testlist)
+ client.run_defcore(config, testlist)
m.assert_any_call(cmd)
@mock.patch('functest.opnfv_tests.openstack.refstack_client.'
@@ -62,7 +75,7 @@ class OSRefstackClientTesting(unittest.TestCase):
mock_logger_info):
self.case_name = 'refstack_defcore'
self.result = 0
- self.refstackclient.parse_refstack_result()
+ self._create_client().parse_refstack_result()
mock_logger_info.assert_called_once_with(
"Testcase %s success_rate is %s%%",
self.case_name, self.result)
@@ -82,10 +95,11 @@ class OSRefstackClientTesting(unittest.TestCase):
"success": ['tempest.api.compute [18.464988s]'],
"errors": ['tempest.api.volume [0.230334s]'],
"skipped": ['tempest.api.network [1.265828s]']}
+ client = self._create_client()
with mock.patch('__builtin__.open',
mock.mock_open(read_data=log_file)):
- self.refstackclient.parse_refstack_result()
- self.assertEqual(self.refstackclient.details, self.details)
+ client.parse_refstack_result()
+ self.assertEqual(client.details, self.details)
def _get_main_kwargs(self, key=None):
kwargs = {'config': self._config,
@@ -96,16 +110,18 @@ class OSRefstackClientTesting(unittest.TestCase):
def _test_main(self, status, *args):
kwargs = self._get_main_kwargs()
- self.assertEqual(self.refstackclient.main(**kwargs), status)
+ client = self._create_client()
+ self.assertEqual(client.main(**kwargs), status)
if len(args) > 0:
args[0].assert_called_once_with(
- refstack_client.RefstackClient.result_dir)
+ RefstackClient.result_dir)
if len(args) > 1:
args
def _test_main_missing_keyword(self, key):
kwargs = self._get_main_kwargs(key)
- self.assertEqual(self.refstackclient.main(**kwargs),
+ client = self._create_client()
+ self.assertEqual(client.main(**kwargs),
testcase.TestCase.EX_RUN_ERROR)
def test_main_missing_conf(self):
@@ -115,10 +131,10 @@ class OSRefstackClientTesting(unittest.TestCase):
self._test_main_missing_keyword('testlist')
def _test_argparser(self, arg, value):
- self.defaultargs[arg] = value
- parser = refstack_client.RefstackClientParser()
+ self.default_args[arg] = value
+ parser = RefstackClientParser()
self.assertEqual(parser.parse_args(["--{}={}".format(arg, value)]),
- self.defaultargs)
+ self.default_args)
def test_argparser_conf(self):
self._test_argparser('config', self._config)
@@ -127,13 +143,13 @@ class OSRefstackClientTesting(unittest.TestCase):
self._test_argparser('testlist', self._testlist)
def test_argparser_multiple_args(self):
- self.defaultargs['config'] = self._config
- self.defaultargs['testlist'] = self._testlist
- parser = refstack_client.RefstackClientParser()
+ self.default_args['config'] = self._config
+ self.default_args['testlist'] = self._testlist
+ parser = RefstackClientParser()
self.assertEqual(parser.parse_args(
["--config={}".format(self._config),
"--testlist={}".format(self._testlist)
- ]), self.defaultargs)
+ ]), self.default_args)
if __name__ == "__main__":
diff --git a/functest/tests/unit/openstack/tempest/test_conf_utils.py b/functest/tests/unit/openstack/tempest/test_conf_utils.py
index a807ae469..77558086b 100644
--- a/functest/tests/unit/openstack/tempest/test_conf_utils.py
+++ b/functest/tests/unit/openstack/tempest/test_conf_utils.py
@@ -10,89 +10,83 @@ import unittest
import mock
-from functest.opnfv_tests.openstack.tempest import conf_utils
+from functest.opnfv_tests.openstack.tempest import tempest, conf_utils
from functest.utils.constants import CONST
+from snaps.openstack.os_credentials import OSCreds
class OSTempestConfUtilsTesting(unittest.TestCase):
- def test_create_tempest_resources_missing_network_dic(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.get_keystone_client',
- return_value=mock.Mock()), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.create_tenant',
- return_value='test_tenant_id'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.create_user',
- return_value='test_user_id'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.create_shared_network_full',
- return_value=None), \
- self.assertRaises(Exception) as context:
- conf_utils.create_tempest_resources()
- msg = 'Failed to create private network'
- self.assertTrue(msg in context)
-
- def test_create_tempest_resources_missing_image(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.get_keystone_client',
- return_value=mock.Mock()), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.create_tenant',
- return_value='test_tenant_id'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.create_user',
- return_value='test_user_id'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.create_shared_network_full',
- return_value=mock.Mock()), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.get_or_create_image',
- return_value=(mock.Mock(), None)), \
- self.assertRaises(Exception) as context:
-
- CONST.__setattr__('tempest_use_custom_images', True)
- conf_utils.create_tempest_resources()
- msg = 'Failed to create image'
- self.assertTrue(msg in context)
-
- CONST.__setattr__('tempest_use_custom_images', False)
- conf_utils.create_tempest_resources(use_custom_images=True)
- msg = 'Failed to create image'
- self.assertTrue(msg in context)
-
- def test_create_tempest_resources_missing_flavor(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.get_keystone_client',
- return_value=mock.Mock()), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.create_tenant',
- return_value='test_tenant_id'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.create_user',
- return_value='test_user_id'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.create_shared_network_full',
- return_value=mock.Mock()), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.get_or_create_image',
- return_value=(mock.Mock(), 'image_id')), \
- mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
- 'os_utils.get_or_create_flavor',
- return_value=(mock.Mock(), None)), \
- self.assertRaises(Exception) as context:
- CONST.__setattr__('tempest_use_custom_images', True)
- CONST.__setattr__('tempest_use_custom_flavors', True)
- conf_utils.create_tempest_resources()
- msg = 'Failed to create flavor'
- self.assertTrue(msg in context)
-
- CONST.__setattr__('tempest_use_custom_images', True)
- CONST.__setattr__('tempest_use_custom_flavors', False)
- conf_utils.create_tempest_resources(use_custom_flavors=False)
- msg = 'Failed to create flavor'
- self.assertTrue(msg in context)
+ def setUp(self):
+ self.os_creds = OSCreds(
+ username='user', password='pass',
+ auth_url='http://foo.com:5000/v3', project_name='bar')
+
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_project',
+ return_value=mock.Mock())
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_user',
+ return_value=mock.Mock())
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_network',
+ return_value=None)
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_image',
+ return_value=mock.Mock())
+ def test_create_tempest_resources_missing_network_dic(self, *mock_args):
+ tempest_resources = tempest.TempestResourcesManager(os_creds={})
+ with self.assertRaises(Exception) as context:
+ tempest_resources.create()
+ msg = 'Failed to create private network'
+ self.assertTrue(msg in context.exception)
+
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_project',
+ return_value=mock.Mock())
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_user',
+ return_value=mock.Mock())
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_network',
+ return_value=mock.Mock())
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_image',
+ return_value=None)
+ def test_create_tempest_resources_missing_image(self, *mock_args):
+ tempest_resources = tempest.TempestResourcesManager(os_creds={})
+
+ CONST.__setattr__('tempest_use_custom_imagess', True)
+ with self.assertRaises(Exception) as context:
+ tempest_resources.create()
+ msg = 'Failed to create image'
+ self.assertTrue(msg in context.exception, msg=str(context.exception))
+
+ CONST.__setattr__('tempest_use_custom_imagess', False)
+ with self.assertRaises(Exception) as context:
+ tempest_resources.create(use_custom_images=True)
+ msg = 'Failed to create image'
+ self.assertTrue(msg in context.exception, msg=str(context.exception))
+
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_project',
+ return_value=mock.Mock())
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_user',
+ return_value=mock.Mock())
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_network',
+ return_value=mock.Mock())
+ @mock.patch('snaps.openstack.utils.deploy_utils.create_image',
+ return_value=mock.Mock())
+ @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create',
+ return_value=None)
+ def test_create_tempest_resources_missing_flavor(self, *mock_args):
+ tempest_resources = tempest.TempestResourcesManager(
+ os_creds=self.os_creds)
+
+ CONST.__setattr__('tempest_use_custom_images', True)
+ CONST.__setattr__('tempest_use_custom_flavors', True)
+ with self.assertRaises(Exception) as context:
+ tempest_resources.create()
+ msg = 'Failed to create flavor'
+ self.assertTrue(msg in context.exception, msg=str(context.exception))
+
+ CONST.__setattr__('tempest_use_custom_images', True)
+ CONST.__setattr__('tempest_use_custom_flavors', False)
+ with self.assertRaises(Exception) as context:
+ tempest_resources.create(use_custom_flavors=True)
+ msg = 'Failed to create flavor'
+ self.assertTrue(msg in context.exception, msg=str(context.exception))
def test_get_verifier_id_missing_verifier(self):
CONST.__setattr__('tempest_deployment_name', 'test_deploy_name')
@@ -176,51 +170,20 @@ class OSTempestConfUtilsTesting(unittest.TestCase):
def test_backup_tempest_config_default(self):
with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os.path.exists',
- return_value=False), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os.makedirs') as m1, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.shutil.copyfile') as m2:
+ 'conf_utils.shutil.copyfile') as m1:
conf_utils.backup_tempest_config('test_conf_file')
self.assertTrue(m1.called)
- self.assertTrue(m2.called)
-
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os.path.exists',
- return_value=True), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.shutil.copyfile') as m2:
- conf_utils.backup_tempest_config('test_conf_file')
- self.assertTrue(m2.called)
def test_configure_tempest_default(self):
with mock.patch('functest.opnfv_tests.openstack.tempest.'
'conf_utils.configure_verifier',
return_value='test_conf_file'), \
mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.configure_tempest_update_params') as m1, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.configure_tempest_multisite_params') as m2:
- conf_utils.configure_tempest('test_dep_dir',
- MODE='feature_multisite')
- self.assertTrue(m1.called)
- self.assertTrue(m2.called)
-
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.configure_verifier',
- return_value='test_conf_file'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
'conf_utils.configure_tempest_update_params') as m1:
conf_utils.configure_tempest('test_dep_dir')
self.assertTrue(m1.called)
- self.assertTrue(m2.called)
def test_configure_tempest_defcore_default(self):
- img_flavor_dict = {'image_id': 'test_image_id',
- 'flavor_id': 'test_flavor_id',
- 'image_id_alt': 'test_image_alt_id',
- 'flavor_id_alt': 'test_flavor_alt_id'}
with mock.patch('functest.opnfv_tests.openstack.tempest.'
'conf_utils.configure_verifier',
return_value='test_conf_file'), \
@@ -237,9 +200,12 @@ class OSTempestConfUtilsTesting(unittest.TestCase):
'write') as mwrite, \
mock.patch('__builtin__.open', mock.mock_open()), \
mock.patch('functest.opnfv_tests.openstack.tempest.'
+ 'conf_utils.generate_test_accounts_file'), \
+ mock.patch('functest.opnfv_tests.openstack.tempest.'
'conf_utils.shutil.copyfile'):
- conf_utils.configure_tempest_defcore('test_dep_dir',
- img_flavor_dict)
+ conf_utils.configure_tempest_defcore(
+ 'test_dep_dir', 'test_image_id', 'test_flavor_id',
+ 'test_image_alt_id', 'test_flavor_alt_id', 'test_tenant_id')
mset.assert_any_call('compute', 'image_ref', 'test_image_id')
mset.assert_any_call('compute', 'image_ref_alt',
'test_image_alt_id')
@@ -249,6 +215,13 @@ class OSTempestConfUtilsTesting(unittest.TestCase):
self.assertTrue(mread.called)
self.assertTrue(mwrite.called)
+ def test_generate_test_accounts_file_default(self):
+ with mock.patch("__builtin__.open", mock.mock_open()), \
+ mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.'
+ 'yaml.dump') as mock_dump:
+ conf_utils.generate_test_accounts_file('test_tenant_id')
+ self.assertTrue(mock_dump.called)
+
def _test_missing_param(self, params, image_id, flavor_id):
with mock.patch('functest.opnfv_tests.openstack.tempest.'
'conf_utils.ConfigParser.RawConfigParser.'
@@ -267,8 +240,8 @@ class OSTempestConfUtilsTesting(unittest.TestCase):
CONST.__setattr__('OS_ENDPOINT_TYPE', None)
conf_utils.\
configure_tempest_update_params('test_conf_file',
- IMAGE_ID=image_id,
- FLAVOR_ID=flavor_id)
+ image_id=image_id,
+ flavor_id=flavor_id)
mset.assert_any_call(params[0], params[1], params[2])
self.assertTrue(mread.called)
self.assertTrue(mwrite.called)
@@ -322,50 +295,6 @@ class OSTempestConfUtilsTesting(unittest.TestCase):
mexe.assert_any_call("rally verify configure-verifier "
"--reconfigure")
- def test_configure_tempest_multisite_params_without_fuel(self):
- conf_utils.CI_INSTALLER_TYPE = 'not_fuel'
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.os_utils.get_endpoint',
- return_value='kingbird_endpoint_url'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ConfigParser.RawConfigParser.'
- 'set') as mset, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ConfigParser.RawConfigParser.'
- 'read') as mread, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ConfigParser.RawConfigParser.'
- 'add_section') as msection, \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ConfigParser.RawConfigParser.'
- 'write') as mwrite, \
- mock.patch('__builtin__.open', mock.mock_open()), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.backup_tempest_config'):
-
- conf_utils.configure_tempest_multisite_params('test_conf_file')
- msection.assert_any_call("kingbird")
- mset.assert_any_call('service_available', 'kingbird', 'true')
- mset.assert_any_call('kingbird', 'endpoint_type', 'publicURL')
- mset.assert_any_call('kingbird', 'TIME_TO_SYNC', '120')
- mset.assert_any_call('kingbird', 'endpoint_url',
- 'kingbird_endpoint_url')
- self.assertTrue(mread.called)
- self.assertTrue(mwrite.called)
-
- def test_install_verifier_ext_default(self):
- with mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.get_repo_tag',
- return_value='test_tag'), \
- mock.patch('functest.opnfv_tests.openstack.tempest.'
- 'conf_utils.ft_utils.'
- 'execute_command_raise') as mexe:
- conf_utils.install_verifier_ext('test_path')
- cmd = ("rally verify add-verifier-ext --source test_path "
- "--version test_tag")
- error_msg = ("Problem while adding verifier extension from"
- " test_path")
- mexe.assert_called_once_with(cmd, error_msg=error_msg)
if __name__ == "__main__":
logging.disable(logging.CRITICAL)
diff --git a/functest/tests/unit/openstack/tempest/test_tempest.py b/functest/tests/unit/openstack/tempest/test_tempest.py
index b8b258b36..54d7d49bb 100644
--- a/functest/tests/unit/openstack/tempest/test_tempest.py
+++ b/functest/tests/unit/openstack/tempest/test_tempest.py
@@ -15,10 +15,16 @@ from functest.opnfv_tests.openstack.tempest import tempest
from functest.opnfv_tests.openstack.tempest import conf_utils
from functest.utils.constants import CONST
+from snaps.openstack.os_credentials import OSCreds
+
class OSTempestTesting(unittest.TestCase):
def setUp(self):
+ os_creds = OSCreds(
+ username='user', password='pass',
+ auth_url='http://foo.com:5000/v3', project_name='bar')
+
with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
'conf_utils.get_verifier_id',
return_value='test_deploy_id'), \
@@ -30,14 +36,13 @@ class OSTempestTesting(unittest.TestCase):
return_value='test_verifier_repo_dir'), \
mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
'conf_utils.get_verifier_deployment_dir',
- return_value='test_verifier_deploy_dir'):
+ return_value='test_verifier_deploy_dir'), \
+ mock.patch('snaps.openstack.tests.openstack_tests.get_credentials',
+ return_value=os_creds):
self.tempestcommon = tempest.TempestCommon()
self.tempestsmoke_serial = tempest.TempestSmokeSerial()
self.tempestsmoke_parallel = tempest.TempestSmokeParallel()
self.tempestfull_parallel = tempest.TempestFullParallel()
- with mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'conf_utils.install_verifier_ext'):
- self.tempestmultisite = tempest.TempestMultisite()
self.tempestcustom = tempest.TempestCustom()
self.tempestdefcore = tempest.TempestDefcore()
@@ -75,8 +80,6 @@ class OSTempestTesting(unittest.TestCase):
self.tempestcommon.MODE = mode
if self.tempestcommon.MODE == 'smoke':
testr_mode = "smoke"
- elif self.tempestcommon.MODE == 'feature_multisite':
- testr_mode = "'[Kk]ingbird'"
elif self.tempestcommon.MODE == 'full':
testr_mode = ""
else:
@@ -96,9 +99,6 @@ class OSTempestTesting(unittest.TestCase):
def test_generate_test_list_smoke_mode(self):
self._test_generate_test_list_mode_default('smoke')
- def test_generate_test_list_feature_multisite_mode(self):
- self._test_generate_test_list_mode_default('feature_multisite')
-
def test_generate_test_list_full_mode(self):
self._test_generate_test_list_mode_default('full')
@@ -161,8 +161,8 @@ class OSTempestTesting(unittest.TestCase):
'os.path.exists', return_value=False)
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs')
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'conf_utils.create_tempest_resources', side_effect=Exception)
- def test_run_create_tempest_resources_ko(self, *args):
+ 'TempestResourcesManager.create', side_effect=Exception)
+ def test_run_tempest_create_resources_ko(self, *args):
self.assertEqual(self.tempestcommon.run(),
testcase.TestCase.EX_RUN_ERROR)
@@ -170,7 +170,7 @@ class OSTempestTesting(unittest.TestCase):
'os.path.exists', return_value=False)
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs')
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'conf_utils.create_tempest_resources', return_value={})
+ 'TempestResourcesManager.create', return_value={})
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
'conf_utils.configure_tempest', side_effect=Exception)
def test_run_configure_tempest_ko(self, *args):
@@ -181,7 +181,7 @@ class OSTempestTesting(unittest.TestCase):
'os.path.exists', return_value=False)
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs')
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
- 'conf_utils.create_tempest_resources', return_value={})
+ 'TempestResourcesManager.create', return_value={})
@mock.patch('functest.opnfv_tests.openstack.tempest.tempest.'
'conf_utils.configure_tempest')
def _test_run(self, status, *args):
diff --git a/functest/tests/unit/openstack/vping/test_vping.py b/functest/tests/unit/openstack/vping/test_vping.py
index b229c3519..a28c61aeb 100644
--- a/functest/tests/unit/openstack/vping/test_vping.py
+++ b/functest/tests/unit/openstack/vping/test_vping.py
@@ -50,8 +50,6 @@ class VPingUserdataTesting(unittest.TestCase):
'vm_active', return_value=True)
def test_vping_userdata(self, deploy_vm, path_exists, create_flavor,
get_port_ip, vm_active):
- os_vm_inst = mock.MagicMock(name='get_console_output')
- os_vm_inst.get_console_output.return_value = 'vPing OK'
with mock.patch('snaps.openstack.utils.deploy_utils.create_image',
return_value=OpenStackImage(self.os_creds, None)), \
mock.patch('snaps.openstack.utils.deploy_utils.create_network',
@@ -67,8 +65,8 @@ class VPingUserdataTesting(unittest.TestCase):
name='foo', network_name='bar')]),
None)), \
mock.patch('snaps.openstack.create_instance.'
- 'OpenStackVmInstance.get_os_vm_server_obj',
- return_value=os_vm_inst):
+ 'OpenStackVmInstance.get_console_output',
+ return_value='vPing OK'):
self.assertEquals(TestCase.EX_OK, self.vping_userdata.run())
diff --git a/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py b/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py
new file mode 100644
index 000000000..ef227ca43
--- /dev/null
+++ b/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py
@@ -0,0 +1,227 @@
+#!/usr/bin/env python
+
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""Test module for orchestra_clearwaterims"""
+
+import logging
+import unittest
+
+import mock
+from snaps.openstack.os_credentials import OSCreds
+
+from functest.core import vnf
+from functest.opnfv_tests.vnf.ims import orchestra_clearwaterims
+
+
+class OrchestraClearwaterImsTesting(unittest.TestCase):
+ """Test class for orchestra_clearwaterims"""
+ def setUp(self):
+
+ self.tenant = 'orchestra_clearwaterims'
+ self.creds = {'username': 'mocked_username',
+ 'password': 'mocked_password'}
+ self.tenant_images = {
+ 'image1': 'mocked_image_url_1',
+ 'image2': 'mocked_image_url_2'
+ }
+ self.mano = {
+ 'name': 'openbaton',
+ 'version': '3.2.0',
+ 'object': 'foo',
+ 'requirements': {
+ 'flavor': {
+ 'name': 'mocked_flavor',
+ 'ram_min': 4096,
+ 'disk': 5,
+ 'vcpus': 2
+ },
+ 'os_image': 'mocked_image'
+ },
+ 'bootstrap': {
+ 'url': 'mocked_bootstrap_url',
+ 'config': {
+ 'url': 'mocked_config_url'}
+ },
+ 'gvnfm': {
+ 'userdata': {
+ 'url': 'mocked_userdata_url'
+ }
+ },
+ 'credentials': {
+ 'username': 'mocked_username',
+ 'password': 'mocked_password'
+ }
+ }
+ self.vnf = {
+ 'name': 'openims',
+ 'descriptor': {
+ 'url': 'mocked_descriptor_url'
+ },
+ 'requirements': {
+ 'flavor': {
+ 'name': 'mocked_flavor',
+ 'ram_min': 2048,
+ 'disk': 5,
+ 'vcpus': 2}
+ }
+ }
+ self.clearwaterims = {
+ 'scscf': {
+ 'ports': [3870, 6060]
+ },
+ 'pcscf': {
+ 'ports': [4060]
+ },
+ 'icscf': {
+ 'ports': [3869, 5060]
+ },
+ 'fhoss': {
+ 'ports': [3868]
+ },
+ 'bind9': {
+ 'ports': []
+ }
+ }
+ with mock.patch('functest.opnfv_tests.vnf.ims.orchestra_clearwaterims.'
+ 'os.makedirs'),\
+ mock.patch('functest.opnfv_tests.vnf.ims.orchestra_clearwaterims.'
+ 'get_config', return_value={
+ 'orchestrator': self.mano,
+ 'name': self.mano['name'],
+ 'version': self.mano['version'],
+ 'requirements': self.mano['requirements'],
+ 'credentials': self.mano['credentials'],
+ 'bootstrap': self.mano['bootstrap'],
+ 'gvnfm': self.mano['gvnfm'],
+ 'os_image': self.mano['requirements']['os_image'],
+ 'flavor': self.mano['requirements']['flavor'],
+ 'url': self.mano['bootstrap']['url'],
+ 'config': self.mano['bootstrap']['config'],
+ 'tenant_images': self.tenant_images,
+ 'vnf': self.vnf,
+ 'orchestra_clearwaterims': self.clearwaterims}):
+ self.ims_vnf = orchestra_clearwaterims.ClearwaterImsVnf()
+
+ self.details = {'orchestrator': {'status': 'PASS', 'duration': 120},
+ 'vnf': {},
+ 'test_vnf': {}}
+
+ @mock.patch('functest.core.vnf.os_utils.get_keystone_client',
+ return_value='test')
+ @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf',
+ return_value=True)
+ @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf',
+ return_value=True)
+ @mock.patch('functest.core.vnf.os_utils.get_credentials',
+ return_value={'auth_url': 'test/v1'})
+ @mock.patch(
+ 'functest.utils.openstack_utils.get_tenant_id',
+ return_value={'mocked_tenant_id'})
+ @mock.patch(
+ 'functest.utils.openstack_utils.get_floating_ips',
+ return_value=[])
+ @mock.patch('snaps.openstack.create_image.OpenStackImage.create')
+ @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create')
+ @mock.patch(
+ 'snaps.openstack.create_security_group.OpenStackSecurityGroup.create')
+ @mock.patch('snaps.openstack.create_network.OpenStackNetwork.create')
+ @mock.patch('snaps.openstack.create_router.OpenStackRouter.create')
+ @mock.patch(
+ 'functest.opnfv_tests.openstack.snaps.snaps_utils.get_ext_net_name')
+ @mock.patch(
+ 'functest.opnfv_tests.openstack.snaps.'
+ 'snaps_utils.neutron_utils.create_floating_ip')
+ def test_prepare_default(self, *args):
+ """Testing prepare function without any exceptions expected"""
+ self.assertIsNone(self.ims_vnf.prepare())
+ args[4].assert_called_once_with()
+
+ @mock.patch('functest.core.vnf.os_utils.get_keystone_client',
+ return_value='test')
+ @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf',
+ return_value=True)
+ @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf',
+ return_value=True)
+ @mock.patch('functest.core.vnf.os_utils.get_credentials',
+ return_value={'auth_url': 'test/no_v'})
+ @mock.patch('snaps.openstack.create_image.OpenStackImage.create')
+ def test_prepare_bad_auth_url(self, *args):
+ """Testing prepare function with bad auth url"""
+ with self.assertRaises(Exception):
+ self.ims_vnf.image_creator(
+ OSCreds(username='user', password='pass', auth_url='url',
+ project_name='project', identity_api_version=3),
+ mock.Mock())
+ args[0].assert_not_called()
+
+ def test_prepare_missing_param(self):
+ """Testing prepare function with missing param"""
+ with self.assertRaises(vnf.VnfPreparationException):
+ self.ims_vnf.prepare()
+
+ @mock.patch('functest.core.vnf.os_utils.get_keystone_client',
+ side_effect=Exception)
+ def test_prepare_keystone_exception(self, *args):
+ """Testing prepare function with keystone exception"""
+ with self.assertRaises(vnf.VnfPreparationException):
+ self.ims_vnf.prepare()
+ args[0].assert_called_once_with()
+
+ @mock.patch('functest.core.vnf.os_utils.get_keystone_client',
+ return_value='test')
+ @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf',
+ side_effect=Exception)
+ def test_prepare_tenant_exception(self, *args):
+ """Testing prepare function with tenant exception"""
+ with self.assertRaises(vnf.VnfPreparationException):
+ self.ims_vnf.prepare()
+ args[1].assert_called_once_with()
+
+ @mock.patch('functest.core.vnf.os_utils.get_keystone_client',
+ return_value='test')
+ @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf',
+ return_value=True)
+ @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf',
+ side_effect=Exception)
+ def test_prepare_user_exception(self, *args):
+ """Testing prepare function with user exception"""
+ with self.assertRaises(vnf.VnfPreparationException):
+ self.ims_vnf.prepare()
+ args[2].assert_called_once_with()
+
+ @mock.patch('functest.core.vnf.os_utils.get_keystone_client',
+ return_value='test')
+ @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf',
+ return_value=True)
+ @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf',
+ return_value=True)
+ @mock.patch('functest.core.vnf.os_utils.get_credentials',
+ side_effect=Exception)
+ def test_prepare_credentials_exception(self, *args):
+ """Testing prepare function with credentials exception"""
+ with self.assertRaises(vnf.VnfPreparationException):
+ self.ims_vnf.prepare()
+ args[0].assert_called_once_with()
+
+ # # @mock.patch('functest.opnfv_tests.vnf.
+ # ims.orchestra_clearwaterims.get_userdata')
+ # def test_deploy_orchestrator(self, *args):
+ # floating_ip = FloatingIp
+ # floating_ip.ip = 'mocked_ip'
+ # details = {'fip':floating_ip,'flavor':{'name':'mocked_name'}}
+ # self.mano['details'] = details
+ # with mock.patch.dict(self.mano, {'details':
+ # {'fip':floating_ip,'flavor':{'name':'mocked_name'}}}):
+ # # with mock.patch.dict(self.mano, details):
+ # orchestra_clearwaterims.get_userdata(self.mano)
+ # self.assertIsNone(self.ims_vnf.deploy_orchestrator())
+ # args[4].assert_called_once_with()
+
+
+if __name__ == "__main__":
+ logging.disable(logging.CRITICAL)
+ unittest.main(verbosity=2)
diff --git a/functest/tests/unit/vnf/ims/test_orchestra_ims.py b/functest/tests/unit/vnf/ims/test_orchestra_openims.py
index 5a1efc7fd..5911cf77b 100644
--- a/functest/tests/unit/vnf/ims/test_orchestra_ims.py
+++ b/functest/tests/unit/vnf/ims/test_orchestra_openims.py
@@ -5,29 +5,30 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
-"""Test module for orchestra_ims"""
+"""Test module for orchestra_openims"""
import logging
import unittest
import mock
+from snaps.openstack.os_credentials import OSCreds
from functest.core import vnf
-from functest.opnfv_tests.vnf.ims import orchestra_ims
+from functest.opnfv_tests.vnf.ims import orchestra_openims
-class OrchestraImsTesting(unittest.TestCase):
- """Test class for orchestra_ims"""
+class OrchestraOpenImsTesting(unittest.TestCase):
+ """Test class for orchestra_openims"""
def setUp(self):
- self.tenant = 'orchestra_ims'
+ self.tenant = 'orchestra_openims'
self.creds = {'username': 'mocked_username',
'password': 'mocked_password'}
self.tenant_images = {
'image1': 'mocked_image_url_1',
'image2': 'mocked_image_url_2'
}
- self.orchestrator = {
+ self.mano = {
'name': 'openbaton',
'version': '3.2.0',
'object': 'foo',
@@ -68,7 +69,7 @@ class OrchestraImsTesting(unittest.TestCase):
'vcpus': 2}
}
}
- self.vIMS = {
+ self.openims = {
'scscf': {
'ports': [3870, 6060]
},
@@ -85,27 +86,27 @@ class OrchestraImsTesting(unittest.TestCase):
'ports': []
}
}
- with mock.patch('functest.opnfv_tests.vnf.ims.orchestra_ims.'
+ with mock.patch('functest.opnfv_tests.vnf.ims.orchestra_openims.'
'os.makedirs'),\
- mock.patch('functest.opnfv_tests.vnf.ims.orchestra_ims.'
+ mock.patch('functest.opnfv_tests.vnf.ims.orchestra_openims.'
'get_config', return_value={
- 'orchestrator': self.orchestrator,
- 'name': self.orchestrator['name'],
- 'version': self.orchestrator['version'],
- 'requirements': self.orchestrator['requirements'],
- 'credentials': self.orchestrator['credentials'],
- 'bootstrap': self.orchestrator['bootstrap'],
- 'gvnfm': self.orchestrator['gvnfm'],
+ 'orchestrator': self.mano,
+ 'name': self.mano['name'],
+ 'version': self.mano['version'],
+ 'requirements': self.mano['requirements'],
+ 'credentials': self.mano['credentials'],
+ 'bootstrap': self.mano['bootstrap'],
+ 'gvnfm': self.mano['gvnfm'],
'os_image':
- self.orchestrator['requirements']['os_image'],
+ self.mano['requirements']['os_image'],
'flavor':
- self.orchestrator['requirements']['flavor'],
- 'url': self.orchestrator['bootstrap']['url'],
- 'config': self.orchestrator['bootstrap']['config'],
+ self.mano['requirements']['flavor'],
+ 'url': self.mano['bootstrap']['url'],
+ 'config': self.mano['bootstrap']['config'],
'tenant_images': self.tenant_images,
'vnf': self.vnf,
- 'vIMS': self.vIMS}):
- self.ims_vnf = orchestra_ims.ImsVnf()
+ 'orchestra_openims': self.openims}):
+ self.ims_vnf = orchestra_openims.OpenImsVnf()
self.details = {'orchestrator': {'status': 'PASS', 'duration': 120},
'vnf': {},
@@ -153,7 +154,10 @@ class OrchestraImsTesting(unittest.TestCase):
def test_prepare_bad_auth_url(self, *args):
"""Testing prepare function with bad auth url"""
with self.assertRaises(Exception):
- self.ims_vnf.prepare()
+ self.ims_vnf.image_creator(
+ OSCreds(username='user', password='pass', auth_url='url',
+ project_name='project', identity_api_version=3),
+ mock.Mock())
args[0].assert_not_called()
def test_prepare_missing_param(self):
@@ -205,16 +209,17 @@ class OrchestraImsTesting(unittest.TestCase):
self.ims_vnf.prepare()
args[0].assert_called_once_with()
- # # @mock.patch('functest.opnfv_tests.vnf.ims.orchestra_ims.get_userdata')
+ # # @mock.patch('functest.opnfv_tests.
+ # vnf.ims.orchestra_openims.get_userdata')
# def test_deploy_orchestrator(self, *args):
# floating_ip = FloatingIp
# floating_ip.ip = 'mocked_ip'
# details = {'fip':floating_ip,'flavor':{'name':'mocked_name'}}
- # self.orchestrator['details'] = details
- # with mock.patch.dict(self.orchestrator, {'details':
+ # self.mano['details'] = details
+ # with mock.patch.dict(self.mano, {'details':
# {'fip':floating_ip,'flavor':{'name':'mocked_name'}}}):
- # # with mock.patch.dict(self.orchestrator, details):
- # orchestra_ims.get_userdata(self.orchestrator)
+ # # with mock.patch.dict(self.mano, details):
+ # orchestra_openims.get_userdata(self.mano)
# self.assertIsNone(self.ims_vnf.deploy_orchestrator())
# args[4].assert_called_once_with()
diff --git a/functest/utils/env.py b/functest/utils/env.py
index 2fb766d32..d7b396eaa 100644
--- a/functest/utils/env.py
+++ b/functest/utils/env.py
@@ -32,7 +32,8 @@ class Environment(object):
if k not in os.environ:
self.__setattr__(k, v)
self._set_ci_run()
- self._set_ci_loop()
+ if 'CI_LOOP' not in os.environ:
+ self._set_ci_loop()
def _set_ci_run(self):
if self.BUILD_TAG:
diff --git a/functest/utils/functest_utils.py b/functest/utils/functest_utils.py
index ce9a205c0..5bf3adb63 100644
--- a/functest/utils/functest_utils.py
+++ b/functest/utils/functest_utils.py
@@ -254,14 +254,14 @@ def get_ci_envvars():
def execute_command_raise(cmd, info=False, error_msg="",
- verbose=True, output_file=None):
- ret = execute_command(cmd, info, error_msg, verbose, output_file)
+ verbose=True, output_file=None, env=None):
+ ret = execute_command(cmd, info, error_msg, verbose, output_file, env)
if ret != 0:
raise Exception(error_msg)
def execute_command(cmd, info=False, error_msg="",
- verbose=True, output_file=None):
+ verbose=True, output_file=None, env=None):
if not error_msg:
error_msg = ("The command '%s' failed." % cmd)
msg_exec = ("Executing command: '%s'" % cmd)
@@ -270,7 +270,7 @@ def execute_command(cmd, info=False, error_msg="",
logger.info(msg_exec)
else:
logger.debug(msg_exec)
- p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
+ p = subprocess.Popen(cmd, env=env, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
if output_file:
f = open(output_file, "w")
diff --git a/functest/utils/openstack_utils.py b/functest/utils/openstack_utils.py
index 335f14cd1..73d1cde49 100644
--- a/functest/utils/openstack_utils.py
+++ b/functest/utils/openstack_utils.py
@@ -22,8 +22,8 @@ from heatclient import client as heatclient
from novaclient import client as novaclient
from keystoneclient import client as keystoneclient
from neutronclient.neutron import client as neutronclient
-from functest.utils.constants import CONST
+from functest.utils.constants import CONST
import functest.utils.functest_utils as ft_utils
logger = logging.getLogger(__name__)
@@ -713,6 +713,8 @@ def get_private_net(neutron_client):
def get_external_net(neutron_client):
+ if (hasattr(CONST, 'EXTERNAL_NETWORK')):
+ return CONST.__getattribute__('EXTERNAL_NETWORK')
for network in neutron_client.list_networks()['networks']:
if network['router:external']:
return network['name']
@@ -720,6 +722,11 @@ def get_external_net(neutron_client):
def get_external_net_id(neutron_client):
+ if (hasattr(CONST, 'EXTERNAL_NETWORK')):
+ networks = neutron_client.list_networks(
+ name=CONST.__getattribute__('EXTERNAL_NETWORK'))
+ net_id = networks['networks'][0]['id']
+ return net_id
for network in neutron_client.list_networks()['networks']:
if network['router:external']:
return network['id']
@@ -1554,3 +1561,62 @@ def get_resource(heat_client, stack_id, resource):
except Exception as e:
logger.error("Error [get_resource]: %s" % e)
return None
+
+
+# *********************************************
+# TEMPEST
+# *********************************************
+def init_tempest_cleanup(tempest_config_dir=None,
+ tempest_config_filename='tempest.conf',
+ output_file=None):
+ """
+ Initialize the Tempest Cleanup utility.
+ See https://docs.openstack.org/tempest/latest/cleanup.html for docs.
+
+ :param tempest_config_dir: The directory where the Tempest config file is
+ located. If not specified, we let Tempest pick both the directory
+ and the filename (i.e. second parameter is ignored)
+ :param tempest_config_filename: The filename of the Tempest config file
+ :param output_file: Optional file where to save output
+ """
+ # The Tempest cleanup utility currently offers no cmd argument to specify
+ # the config file, therefore it has to be configured with env variables
+ env = None
+ if tempest_config_dir:
+ env = os.environ.copy()
+ env['TEMPEST_CONFIG_DIR'] = tempest_config_dir
+ env['TEMPEST_CONFIG'] = tempest_config_filename
+
+ # If this command fails, an exception must be raised to stop the script
+ # otherwise the later cleanup would destroy also other resources
+ cmd_line = "tempest cleanup --init-saved-state"
+ ft_utils.execute_command_raise(cmd_line, env=env, output_file=output_file,
+ error_msg="Tempest cleanup init failed")
+
+
+def perform_tempest_cleanup(tempest_config_dir=None,
+ tempest_config_filename='tempest.conf',
+ output_file=None):
+ """
+ Perform cleanup using the Tempest Cleanup utility.
+ See https://docs.openstack.org/tempest/latest/cleanup.html for docs.
+
+ :param tempest_config_dir: The directory where the Tempest config file is
+ located. If not specified, we let Tempest pick both the directory
+ and the filename (i.e. second parameter is ignored)
+ :param tempest_config_filename: The filename of the Tempest config file
+ :param output_file: Optional file where to save output
+ """
+ # The Tempest cleanup utility currently offers no cmd argument to specify
+ # the config file, therefore it has to be configured with env variables
+ env = None
+ if tempest_config_dir:
+ env = os.environ.copy()
+ env['TEMPEST_CONFIG_DIR'] = tempest_config_dir
+ env['TEMPEST_CONFIG'] = tempest_config_filename
+
+ # If this command fails, an exception must be raised to stop the script
+ # otherwise the later cleanup would destroy also other resources
+ cmd_line = "tempest cleanup"
+ ft_utils.execute_command(cmd_line, env=env, output_file=output_file,
+ error_msg="Tempest cleanup failed")
diff --git a/requirements.txt b/requirements.txt
index 5344d0c30..e1d34a36a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -21,11 +21,12 @@ dnspython3!=1.13.0,!=1.14.0,>=1.12.0;python_version>='3.0' # http://www.dnspytho
click
openbaton-cli
cloudify_rest_client
+Flask!=0.11,<1.0,>=0.10 # BSD
+Flask-RESTful>=0.3.5 # BSD
mock>=2.0 # BSD
iniparse==0.4
PrettyTable<0.8,>=0.7.1 # BSD
six>=1.9.0 # MIT
-kingbird
opnfv
snaps
rally
diff --git a/setup.cfg b/setup.cfg
index 7630a17fb..89aa033e7 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -22,3 +22,4 @@ console_scripts =
prepare_env = functest.ci.prepare_env:main
run_tests = functest.ci.run_tests:main
check_deployment = functest.ci.check_deployment:main
+ functest_restapi = functest.api.server:main
diff --git a/tox.ini b/tox.ini
index 208091ac3..9fc18b39f 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
[tox]
-envlist = docs,pep8,pylint,py35,py27,perm
+envlist = docs,pep8,pylint,py35,py27,perm,aarch64
[testenv]
usedevelop = True
@@ -30,6 +30,7 @@ commands = flake8
basepython = python2.7
whitelist_externals = bash
modules =
+ functest.api
functest.core
functest.opnfv_tests.sdn.odl
functest.tests.unit.core
@@ -59,3 +60,12 @@ commands =
-exec ls -l \{\} + | grep '.' && exit 1 || exit 0"
bash -c "\
find {[testenv:perm]path} -exec file \{\} + | grep CRLF && exit 1 || exit 0"
+
+[testenv:aarch64]
+basepython = python2.7
+whitelist_externals =
+ bash
+ git
+commands =
+ bash -c "patch -f -p1 < docker/Dockerfile.aarch64.patch"
+ git checkout docker/Dockerfile
diff --git a/upper-constraints.txt b/upper-constraints.txt
index 4f4e1daa4..74d363c50 100644
--- a/upper-constraints.txt
+++ b/upper-constraints.txt
@@ -2,7 +2,6 @@ git+https://gerrit.opnfv.org/gerrit/releng#egg=opnfv&subdirectory=modules
git+https://gerrit.opnfv.org/gerrit/snaps#egg=snaps
git+https://gerrit.opnfv.org/gerrit/barometer#egg=baro_tests
git+https://gerrit.opnfv.org/gerrit/sdnvpn#egg=sdnvpn
-git+https://gerrit.opnfv.org/gerrit/opera#egg=opera
git+https://gerrit.opnfv.org/gerrit/securityscanning#egg=securityscanning
git+https://gerrit.opnfv.org/gerrit/sfc#egg=sfc
-e git+https://gerrit.opnfv.org/gerrit/promise#egg=promise
@@ -14,5 +13,4 @@ robotframework===3.0.2
robotframework-httplibrary===0.4.2
robotframework-requests===0.4.7
robotframework-sshlibrary===2.1.3;python_version=='2.7'
-kingbird===1.1.0
rally===0.9.1