diff options
58 files changed, 749 insertions, 617 deletions
diff --git a/ci/config_functest.yaml b/ci/config_functest.yaml index 2b3317a1b..12e78d6df 100644 --- a/ci/config_functest.yaml +++ b/ci/config_functest.yaml @@ -162,20 +162,19 @@ multisite: installer_password: 'root' multisite_controller_ip: '10.1.0.50' promise: - general: - tenant_name: promise - tenant_description: promise Functionality Testing - user_name: promiser - user_pwd: test - image_name: promise-img - flavor_name: promise-flavor - flavor_vcpus: 1 - flavor_ram: 128 - flavor_disk: 0 - network_name: promise-net - subnet_name: promise-subnet - subnet_cidr: 192.168.121.0/24 - router_name: promise-router + tenant_name: promise + tenant_description: promise Functionality Testing + user_name: promiser + user_pwd: test + image_name: promise-img + flavor_name: promise-flavor + flavor_vcpus: 1 + flavor_ram: 128 + flavor_disk: 0 + network_name: promise-net + subnet_name: promise-subnet + subnet_cidr: 192.168.121.0/24 + router_name: promise-router example: example_vm_name: example-vm diff --git a/ci/config_patch.yaml b/ci/config_patch.yaml index 4994d49d1..251ab1c4d 100644 --- a/ci/config_patch.yaml +++ b/ci/config_patch.yaml @@ -7,4 +7,8 @@ lxd: healthcheck: disk_image: /home/opnfv/functest/data/cirros-0.3.4-x86_64-lxc.tar.gz - disk_format: raw
\ No newline at end of file + disk_format: raw +fdio: + general: + flavor_extra_specs: {'hw:mem_page_size':'large'} + image_properties: {'hw_mem_page_size':'large'}
\ No newline at end of file diff --git a/ci/exec_test.sh b/ci/exec_test.sh index deb505df9..e402e0c31 100755 --- a/ci/exec_test.sh +++ b/ci/exec_test.sh @@ -147,18 +147,11 @@ function run_test(){ python ${FUNCTEST_REPO_DIR}/testcases/features/domino.py $report ;; "odl-sfc") - bash ${FUNCTEST_REPO_DIR}/testcases/features/sfc/server_presetup_CI.bash - ret_val=$? - if [ $ret_val != 0 ]; then - exit $ret_val - fi - bash ${FUNCTEST_REPO_DIR}/testcases/features/sfc/compute_presetup_CI.bash - ret_val=$? - if [ $ret_val != 0 ]; then - exit $ret_val - fi - source ${FUNCTEST_REPO_DIR}/testcases/features/sfc/tackerc - python ${FUNCTEST_REPO_DIR}/testcases/features/sfc/sfc.py $report + ODL_SFC_DIR=${FUNCTEST_REPO_DIR}/testcases/features/sfc + # pass FUNCTEST_REPO_DIR inside prepare_odl_sfc.bash + FUNCTEST_REPO_DIR=${FUNCTEST_REPO_DIR} bash ${ODL_SFC_DIR}/prepare_odl_sfc.bash || exit $? + source ${ODL_SFC_DIR}/tackerc + python ${ODL_SFC_DIR}/sfc.py $report ;; "parser") python ${FUNCTEST_REPO_DIR}/testcases/vnf/vRNC/parser.py $report diff --git a/ci/prepare_env.py b/ci/prepare_env.py index 49dcdd505..6b1babaa8 100755 --- a/ci/prepare_env.py +++ b/ci/prepare_env.py @@ -20,11 +20,11 @@ import subprocess import sys import argparse +import yaml + import functest.utils.functest_logger as ft_logger import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils -import yaml -from functest.utils.functest_utils import FUNCTEST_REPO as FUNCTEST_REPO actions = ['start', 'check'] parser = argparse.ArgumentParser() @@ -48,21 +48,21 @@ CONFIG_FUNCTEST_PATH = os.environ["CONFIG_FUNCTEST_YAML"] CONFIG_PATCH_PATH = os.path.join(os.path.dirname( CONFIG_FUNCTEST_PATH), "config_patch.yaml") -functest_yaml = ft_utils.get_functest_yaml() - with open(CONFIG_PATCH_PATH) as f: functest_patch_yaml = yaml.safe_load(f) -FUNCTEST_CONF_DIR = functest_yaml.get("general").get( - "directories").get("dir_functest_conf") +FUNCTEST_CONF_DIR = \ + ft_utils.get_functest_config('general.directories.dir_functest_conf') + -FUNCTEST_DATA_DIR = functest_yaml.get("general").get( - "directories").get("dir_functest_data") -FUNCTEST_RESULTS_DIR = functest_yaml.get("general").get( - "directories").get("dir_results") -DEPLOYMENT_MAME = functest_yaml.get("rally").get("deployment_name") -TEMPEST_REPO_DIR = functest_yaml.get("general").get( - "directories").get("dir_repo_tempest") +FUNCTEST_DATA_DIR = \ + ft_utils.get_functest_config('general.directories.dir_functest_data') +FUNCTEST_RESULTS_DIR = \ + ft_utils.get_functest_config('general.directories.dir_results') +DEPLOYMENT_MAME = \ + ft_utils.get_functest_config('rally.deployment_name') +TEMPEST_REPO_DIR = \ + ft_utils.get_functest_config('general.directories.dir_repo_tempest') ENV_FILE = FUNCTEST_CONF_DIR + "/env_active" @@ -89,10 +89,11 @@ def check_env_variables(): logger.warning("The env variable 'INSTALLER_TYPE' is not defined.") CI_INSTALLER_TYPE = "undefined" else: - if os.getenv('INSTALLER_TYPE') not in INSTALLERS: + if CI_INSTALLER_TYPE not in INSTALLERS: logger.warning("INSTALLER_TYPE=%s is not a valid OPNFV installer. " - "Available OPNFV Installers are : %s." - "Setting INSTALLER_TYPE=undefined." % INSTALLERS) + "Available OPNFV Installers are : %s. " + "Setting INSTALLER_TYPE=undefined." + % (CI_INSTALLER_TYPE, INSTALLERS)) CI_INSTALLER_TYPE = "undefined" else: logger.info(" INSTALLER_TYPE=%s" % CI_INSTALLER_TYPE) @@ -191,7 +192,7 @@ def patch_config_file(): for key in functest_patch_yaml: if key in CI_SCENARIO: new_functest_yaml = dict(ft_utils.merge_dicts( - functest_yaml, functest_patch_yaml[key])) + ft_utils.get_functest_yaml(), functest_patch_yaml[key])) updated = True if updated: @@ -204,7 +205,7 @@ def patch_config_file(): def verify_deployment(): print_separator() logger.info("Verifying OpenStack services...") - cmd = ("%s/ci/check_os.sh" % FUNCTEST_REPO) + cmd = ("%s/ci/check_os.sh" % ft_utils.FUNCTEST_REPO) logger.debug("Executing command: %s" % cmd) p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) diff --git a/ci/run_tests.py b/ci/run_tests.py index 194793838..af8f51dd0 100755 --- a/ci/run_tests.py +++ b/ci/run_tests.py @@ -14,6 +14,7 @@ import re import sys import argparse + import functest.ci.generate_report as generate_report import functest.ci.tier_builder as tb import functest.utils.functest_logger as ft_logger @@ -22,7 +23,6 @@ import functest.utils.openstack_clean as os_clean import functest.utils.openstack_snapshot as os_snapshot import functest.utils.openstack_utils as os_utils from functest.testcases.Controllers.ODL.OpenDaylightTesting import ODLTestCases -from functest.utils.functest_utils import FUNCTEST_REPO as FUNCTEST_REPO parser = argparse.ArgumentParser() parser.add_argument("-t", "--test", dest="test", action='store', @@ -41,7 +41,7 @@ logger = ft_logger.Logger("run_tests").getLogger() """ global variables """ -EXEC_SCRIPT = ("%s/ci/exec_test.sh" % FUNCTEST_REPO) +EXEC_SCRIPT = ("%s/ci/exec_test.sh" % ft_utils.FUNCTEST_REPO) CLEAN_FLAG = True REPORT_FLAG = False EXECUTED_TEST_CASES = [] diff --git a/ci/testcases.yaml b/ci/testcases.yaml index 4fcdd1b02..3b76e139d 100644 --- a/ci/testcases.yaml +++ b/ci/testcases.yaml @@ -71,7 +71,7 @@ tiers: Rally suite in smoke mode. dependencies: installer: '' - scenario: '' + scenario: '^((?!bgpvpn).)*$' - name: sdn_suites diff --git a/cli/commands/cli_env.py b/cli/commands/cli_env.py index 0f5ef2c60..572012643 100644 --- a/cli/commands/cli_env.py +++ b/cli/commands/cli_env.py @@ -7,14 +7,15 @@ # http://www.apache.org/licenses/LICENSE-2.0 # +import os + import click import git -import os import functest.utils.functest_utils as ft_utils -from functest.utils.functest_utils import FUNCTEST_REPO as FUNCTEST_REPO ENV_FILE = "/home/opnfv/functest/conf/env_active" +FUNCTEST_REPO = ft_utils.FUNCTEST_REPO class CliEnv: diff --git a/cli/commands/cli_os.py b/cli/commands/cli_os.py index d38dc9e6a..4324ae44d 100644 --- a/cli/commands/cli_os.py +++ b/cli/commands/cli_os.py @@ -11,18 +11,17 @@ import os import click + import functest.utils.functest_utils as ft_utils import functest.utils.openstack_clean as os_clean import functest.utils.openstack_snapshot as os_snapshot -from functest.utils.functest_utils import FUNCTEST_REPO as FUNCTEST_REPO -functest_yaml = ft_utils.get_functest_yaml() -FUNCTEST_CONF_DIR = functest_yaml.get("general").get( - "directories").get("dir_functest_conf") +FUNCTEST_CONF_DIR = \ + ft_utils.get_functest_config('general.directories.dir_functest_conf') RC_FILE = os.getenv('creds') -OS_SNAPSHOT_FILE = ft_utils.get_parameter_from_yaml( - "general.openstack.snapshot_file") +OS_SNAPSHOT_FILE = \ + ft_utils.get_functest_config("general.openstack.snapshot_file") class CliOpenStack: @@ -80,7 +79,7 @@ class CliOpenStack: def check(self): self.ping_endpoint() - cmd = FUNCTEST_REPO + "/ci/check_os.sh" + cmd = ft_utils.FUNCTEST_REPO + "/ci/check_os.sh" ft_utils.execute_command(cmd, verbose=False) def snapshot_create(self): diff --git a/cli/commands/cli_testcase.py b/cli/commands/cli_testcase.py index 68f9ed610..510d740ba 100644 --- a/cli/commands/cli_testcase.py +++ b/cli/commands/cli_testcase.py @@ -12,16 +12,16 @@ import os import click + import functest.ci.tier_builder as tb import functest.utils.functest_utils as ft_utils import functest.utils.functest_vacation as vacation -from functest.utils.functest_utils import FUNCTEST_REPO as FUNCTEST_REPO -functest_yaml = ft_utils.get_functest_yaml() -FUNCTEST_CONF_DIR = functest_yaml.get("general").get( - "directories").get("dir_functest_conf") +FUNCTEST_CONF_DIR = \ + ft_utils.get_functest_config('general.directories.dir_functest_conf') ENV_FILE = FUNCTEST_CONF_DIR + "/env_active" +FUNCTEST_REPO = ft_utils.FUNCTEST_REPO class CliTestcase: diff --git a/cli/commands/cli_tier.py b/cli/commands/cli_tier.py index 314246890..aa0541981 100644 --- a/cli/commands/cli_tier.py +++ b/cli/commands/cli_tier.py @@ -12,15 +12,15 @@ import os import click + import functest.ci.tier_builder as tb import functest.utils.functest_utils as ft_utils -from functest.utils.functest_utils import FUNCTEST_REPO as FUNCTEST_REPO -functest_yaml = ft_utils.get_functest_yaml() -FUNCTEST_CONF_DIR = functest_yaml.get("general").get( - "directories").get("dir_functest_conf") +FUNCTEST_CONF_DIR = \ + ft_utils.get_functest_config('general.directories.dir_functest_conf') ENV_FILE = FUNCTEST_CONF_DIR + "/env_active" +FUNCTEST_REPO = ft_utils.FUNCTEST_REPO class CliTier: diff --git a/docker/Dockerfile b/docker/Dockerfile index b27b881a9..3d9940406 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -28,6 +28,13 @@ FROM ubuntu:14.04 MAINTAINER Jose Lausuch <jose.lausuch@ericsson.com> LABEL version="0.1" description="OPNFV Functest Docker container" +ARG BRANCH=master +ARG TEMPEST_TAG=12.2.0 +ARG RALLY_TAG=0.5.0 +ARG ODL_TAG=release/beryllium-sr3 +ARG OPENSTACK_TAG=stable/mitaka +ARG KINGBIRD_TAG=0.2.1 +ARG VIMS_TAG=stable ENV HOME /home/opnfv ENV repos_dir /home/opnfv/repos ENV creds /home/opnfv/functest/conf/openstack.creds @@ -69,24 +76,31 @@ RUN mkdir -p /root/.ssh RUN chmod 700 /root/.ssh RUN git config --global http.sslVerify false -RUN git clone https://gerrit.opnfv.org/gerrit/functest ${repos_dir}/functest -RUN git clone https://gerrit.opnfv.org/gerrit/releng ${repos_dir}/releng -RUN git clone https://gerrit.opnfv.org/gerrit/doctor ${repos_dir}/doctor -RUN git clone -b 0.5.0 https://github.com/openstack/rally.git ${repos_dir}/rally -RUN git clone -b 12.1.0 https://github.com/openstack/tempest.git ${repos_dir}/tempest -RUN git clone https://git.opendaylight.org/gerrit/p/integration/test.git ${repos_dir}/odl_test -RUN git clone -b stable https://github.com/boucherv-orange/clearwater-live-test ${repos_dir}/vims-test -RUN git clone https://github.com/openstack/networking-bgpvpn ${repos_dir}/bgpvpn -RUN git clone https://github.com/wuwenbin2/OnosSystemTest.git ${repos_dir}/onos + +# OPNFV repositories +RUN git clone -b $BRANCH https://gerrit.opnfv.org/gerrit/functest ${repos_dir}/functest +RUN git clone -b $BRANCH https://gerrit.opnfv.org/gerrit/copper ${repos_dir}/copper +RUN git clone -b $BRANCH https://gerrit.opnfv.org/gerrit/moon ${repos_dir}/moon +RUN git clone -b $BRANCH https://gerrit.opnfv.org/gerrit/sdnvpn ${repos_dir}/sdnvpn +RUN git clone -b $BRANCH https://gerrit.opnfv.org/gerrit/domino ${repos_dir}/domino +RUN git clone -b $BRANCH https://gerrit.opnfv.org/gerrit/parser ${repos_dir}/parser +RUN git clone -b $BRANCH https://gerrit.opnfv.org/gerrit/doctor ${repos_dir}/doctor +RUN git clone -b $BRANCH https://gerrit.opnfv.org/gerrit/ovno ${repos_dir}/ovno RUN git clone https://github.com/opnfv/promise ${repos_dir}/promise -RUN git clone https://gerrit.opnfv.org/gerrit/ovno ${repos_dir}/ovno -RUN git clone https://gerrit.opnfv.org/gerrit/copper ${repos_dir}/copper -RUN git clone https://gerrit.opnfv.org/gerrit/moon ${repos_dir}/moon -RUN git clone https://gerrit.opnfv.org/gerrit/sdnvpn ${repos_dir}/sdnvpn -RUN git clone https://github.com/openstack/kingbird.git ${repos_dir}/kingbird -RUN git clone https://gerrit.opnfv.org/gerrit/domino ${repos_dir}/domino -RUN git clone https://gerrit.opnfv.org/gerrit/parser ${repos_dir}/parser RUN git clone https://gerrit.opnfv.org/gerrit/securityscanning ${repos_dir}/securityscanning +RUN git clone https://gerrit.opnfv.org/gerrit/releng ${repos_dir}/releng + + +# OpenStack repositories +RUN git clone -b $OPENSTACK_TAG https://github.com/openstack/networking-bgpvpn ${repos_dir}/bgpvpn +RUN git clone -b $KINGBIRD_TAG https://github.com/openstack/kingbird.git ${repos_dir}/kingbird +RUN git clone -b $RALLY_TAG https://github.com/openstack/rally.git ${repos_dir}/rally +RUN git clone -b $TEMPEST_TAG https://github.com/openstack/tempest.git ${repos_dir}/tempest + +# other repositories +RUN git clone -b $ODL_TAG https://git.opendaylight.org/gerrit/p/integration/test.git ${repos_dir}/odl_test +RUN git clone -b $VIMS_TAG https://github.com/boucherv-orange/clearwater-live-test ${repos_dir}/vims-test +RUN git clone https://github.com/wuwenbin2/OnosSystemTest.git ${repos_dir}/onos RUN pip install -r ${repos_dir}/functest/docker/requirements.pip RUN pip install -r ${repos_dir}/rally/requirements.txt diff --git a/docs/com/lib/font/source-sans-pro/LICENSE b/docs/com/lib/font/source-sans-pro/LICENSE deleted file mode 100755 index 71b7a02a2..000000000 --- a/docs/com/lib/font/source-sans-pro/LICENSE +++ /dev/null @@ -1,45 +0,0 @@ -SIL Open Font License - -Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL - -—————————————————————————————- -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 -—————————————————————————————- - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. - -The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. - -DEFINITIONS -“Font Software” refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. - -“Reserved Font Name” refers to any names specified as such after the copyright statement(s). - -“Original Version” refers to the collection of Font Software components as distributed by the Copyright Holder(s). - -“Modified Version” refers to any derivative made by adding to, deleting, or substituting—in part or in whole—any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. - -“Author” refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. - -5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
\ No newline at end of file diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-italic.eot b/docs/com/lib/font/source-sans-pro/source-sans-pro-italic.eot Binary files differdeleted file mode 100755 index 32fe466bb..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-italic.eot +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-italic.ttf b/docs/com/lib/font/source-sans-pro/source-sans-pro-italic.ttf Binary files differdeleted file mode 100755 index f9ac13ffc..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-italic.ttf +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-italic.woff b/docs/com/lib/font/source-sans-pro/source-sans-pro-italic.woff Binary files differdeleted file mode 100755 index ceecbf17f..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-italic.woff +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-regular.eot b/docs/com/lib/font/source-sans-pro/source-sans-pro-regular.eot Binary files differdeleted file mode 100755 index 4d29ddadd..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-regular.eot +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-regular.ttf b/docs/com/lib/font/source-sans-pro/source-sans-pro-regular.ttf Binary files differdeleted file mode 100755 index 00c833cdc..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-regular.ttf +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-regular.woff b/docs/com/lib/font/source-sans-pro/source-sans-pro-regular.woff Binary files differdeleted file mode 100755 index 630754abf..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-regular.woff +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibold.eot b/docs/com/lib/font/source-sans-pro/source-sans-pro-semibold.eot Binary files differdeleted file mode 100755 index 1104e074f..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibold.eot +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibold.ttf b/docs/com/lib/font/source-sans-pro/source-sans-pro-semibold.ttf Binary files differdeleted file mode 100755 index 6d0253da9..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibold.ttf +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibold.woff b/docs/com/lib/font/source-sans-pro/source-sans-pro-semibold.woff Binary files differdeleted file mode 100755 index 8888cf8d4..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibold.woff +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot b/docs/com/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot Binary files differdeleted file mode 100755 index cdf733438..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf b/docs/com/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf Binary files differdeleted file mode 100755 index 56442992a..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff b/docs/com/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff Binary files differdeleted file mode 100755 index 7c2d3c74f..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff +++ /dev/null diff --git a/docs/com/lib/font/source-sans-pro/source-sans-pro.css b/docs/com/lib/font/source-sans-pro/source-sans-pro.css deleted file mode 100755 index 0707a4f86..000000000 --- a/docs/com/lib/font/source-sans-pro/source-sans-pro.css +++ /dev/null @@ -1,39 +0,0 @@ -@font-face { - font-family: 'Source Sans Pro'; - src: url('source-sans-pro-regular.eot'); - src: url('source-sans-pro-regular.eot?#iefix') format('embedded-opentype'), - url('source-sans-pro-regular.woff') format('woff'), - url('source-sans-pro-regular.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'Source Sans Pro'; - src: url('source-sans-pro-italic.eot'); - src: url('source-sans-pro-italic.eot?#iefix') format('embedded-opentype'), - url('source-sans-pro-italic.woff') format('woff'), - url('source-sans-pro-italic.ttf') format('truetype'); - font-weight: normal; - font-style: italic; -} - -@font-face { - font-family: 'Source Sans Pro'; - src: url('source-sans-pro-semibold.eot'); - src: url('source-sans-pro-semibold.eot?#iefix') format('embedded-opentype'), - url('source-sans-pro-semibold.woff') format('woff'), - url('source-sans-pro-semibold.ttf') format('truetype'); - font-weight: 600; - font-style: normal; -} - -@font-face { - font-family: 'Source Sans Pro'; - src: url('source-sans-pro-semibolditalic.eot'); - src: url('source-sans-pro-semibolditalic.eot?#iefix') format('embedded-opentype'), - url('source-sans-pro-semibolditalic.woff') format('woff'), - url('source-sans-pro-semibolditalic.ttf') format('truetype'); - font-weight: 600; - font-style: italic; -}
\ No newline at end of file diff --git a/docs/com/pres/summit-Berlin.html b/docs/com/pres/summit-Berlin.html index 62e86c582..3d1f12531 100755 --- a/docs/com/pres/summit-Berlin.html +++ b/docs/com/pres/summit-Berlin.html @@ -222,7 +222,7 @@ * New internal test cases: healthcheck, security * New controler: OpenContrail? * New feature projects (domino, multisites, movie, parser, moon, copper, models, onos-sfc...) - * ARM Support (congratulations to ANEA team!) + * ARM Support (congratulations to ENEA team!) * Simplified feature project integration journey </section> diff --git a/docs/configguide/configguide.rst b/docs/configguide/configguide.rst index d79494399..4ef673c94 100644 --- a/docs/configguide/configguide.rst +++ b/docs/configguide/configguide.rst @@ -31,7 +31,7 @@ following docker command:: [functester@jumphost ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE opnfv/functest latest 8cd6683c32ae 2 weeks ago 1.611 GB - opnfv/functest brahmaputra.3.0 94b78faa94f7 4 weeks ago 874.9 MB + opnfv/functest colorado.1.0 94b78faa94f7 4 weeks ago 874.9 MB hello-world latest 94df4f0ce8a4 7 weeks ago 967 B The Functest docker container environment can -in principle- be also @@ -119,7 +119,7 @@ recommended parameters for invoking docker container The credentials file needs to exist in the Docker container under the path: '/home/opnfv/functest/conf/openstack.creds'. - WARNING: If you are using the Joid installer, you must pass the + **WARNING:** If you are using the Joid installer, you must pass the credentials using the **-v** option: -v /var/lib/jenkins/admin-openrc:/home/opnfv/functest/conf/openstack.creds. See the section `Accessing the Openstack credentials`_ above. diff --git a/docs/devguide/index.rst b/docs/devguide/index.rst index 6b98437c6..cab9ec33c 100644 --- a/docs/devguide/index.rst +++ b/docs/devguide/index.rst @@ -144,6 +144,7 @@ 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 @@ -249,12 +250,16 @@ Results:: "build_tag": <such as "jenkins-functest-fuel-baremetal-daily-master-108">, "scenario": <Scenario on which the test was executed>, "criteria": <PASS or FAILED>, - "trust_indicator": <0~1> + "trust_indicator": { + "current": 0, + "histories": [] + } } The API can described as follows. For detailed information, please go to http://testresults.opnfv.org/test/swagger/spec.html + Authentication: opnfv/api@opnfv Please notes that POST/DELETE/PUT operations for test or study purpose via @@ -475,6 +480,9 @@ Dashboard url: http://testresults.opnfv.org/kibana_dashboards/ Credentials for a guest account: opnfvuser/kibana +A script has been developped to build elasticsearch data set. This +script can be found in `[16]`_. + Automatic reporting =================== @@ -511,8 +519,14 @@ corresponding to this scenario. +---------------------+---------+---------+---------+---------+ | promise | | | X | X | +---------------------+---------+---------+---------+---------+ + | doctor | X | | X | | + +---------------------+---------+---------+---------+---------+ | security_scan | X | | | | +---------------------+---------+---------+---------+---------+ + | parser | | | X | | + +---------------------+---------+---------+---------+---------+ + | moon | | X | | | + +---------------------+---------+---------+---------+---------+ | copper | X | | | X | +---------------------+---------+---------+---------+---------+ @@ -520,7 +534,7 @@ 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 succesfull at least once but no anymore during the 4 runs, +If it was succesfull 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. @@ -649,8 +663,6 @@ bgpvpn scenarios:: scenario: '(ocl)|(nosdn)|^(os-odl)((?!bgpvpn).)*$' - - How to write and check constaint regex? ======================================= @@ -914,15 +926,13 @@ _`[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 -OPNFV main site: opnfvmain_. +_`[16]`: https://git.opnfv.org/cgit/releng/tree/utils/test/scripts/mongo_to_elasticsearch.py -OPNFV functional test page: opnfvfunctest_. +OPNFV main site: http://www.opnfv.org -IRC support chan: #opnfv-functest +OPNFV functional test page: https://wiki.opnfv.org/opnfv_functional_testing -_opnfvmain: http://www.opnfv.org - -_opnfvfunctest: https://wiki.opnfv.org/opnfv_functional_testing +IRC support chan: #opnfv-functest _`OpenRC`: http://docs.openstack.org/user-guide/common/cli_set_environment_variables_using_openstack_rc.html diff --git a/docs/release-notes/functest-release.rst b/docs/release-notes/functest-release.rst index ed258b690..47efa917a 100644 --- a/docs/release-notes/functest-release.rst +++ b/docs/release-notes/functest-release.rst @@ -1,6 +1,6 @@ -============================================== -OPNFV Brahmaputra3.0 release note for Functest -============================================== +=========================================== +OPNFV Colorado1.0 release note for Functest +=========================================== Abstract ======== @@ -242,14 +242,24 @@ Colorado known restrictions/issues | | | metadata service excluded from onos scenarios| | | | https://gerrit.opnfv.org/gerrit/#/c/18729/ | +-----------+-----------+----------------------------------------------+ -| any | odl_l3-* | vPing_ssh and Tempest cases related to using | -| | | floating IP addresses are excluded (ODL bug) | +| any | odl_l3-* | Tempest cases related to using floating IP | +| | | addresses fail because of a known ODL bug. | +| | | vPing_ssh test case is excluded for the same | +| | | reason. | | | | https://jira.opnfv.org/browse/APEX-112 | | | | https://jira.opnfv.org/browse/FUNCTEST-445 | +-----------+-----------+----------------------------------------------+ | apex/fuel | *-bgpvpn | vPing_ssh (floating ips not supported) and | | | | vIMS excluded. Some Tempest cases related to | -| | | floating ips also excluded. | +| | | floating ips also excluded. Some performance | +| | | issues have been detected in this scenario | +| | | (i.e. BGPVPN extension enabled) when running | +| | | commands against the OpenStack APIs, thus | +| | | Rally sanity test case has been disabled. | +| | | Performance issues seem to be connected to | +| | | the ODL version. It is planned to reintroduce| +| | | Rally sanity in Colorado 2.0 with the | +| | | adoption of ODL Boron release. | +-----------+-----------+----------------------------------------------+ | compass | moon | First ODL test FAILS because ODL/Openstack | | | | federation done in moon is partial. Only | @@ -299,6 +309,8 @@ Test results are available in: - jenkins logs on CI: https://build.opnfv.org/ci/view/functest/ + - jenkins logs on ARM CI: https://build.opnfv.org/ci/view/armband/ + Open JIRA tickets diff --git a/docs/userguide/index.rst b/docs/userguide/index.rst index 6140f606d..30bee8dc0 100644 --- a/docs/userguide/index.rst +++ b/docs/userguide/index.rst @@ -16,7 +16,7 @@ The goal of this document is to describe the OPNFV Functest test cases and to provide a procedure to execute them. In the OPNFV Colorado system release, a Functest CLI utility is introduced for easier execution of test procedures. -A overview presentation has been created for the first OPNFV Summit `[4]`_. +An overview presentation has been created for the first OPNFV Summit `[4]`_. This document is a continuation of the OPNFV Functest Configuration Guide `[1]`_. @@ -360,7 +360,7 @@ The current work flow is as follows: * Jenkins Build Initiated * security_scan.py script is called, and a config file is passed to the script as an argument. - * The IP addresses of each NFVi node (compute / control), is gathered. + * The IP addresses of each NFVi node (compute / control) are gathered * A scan profile is matched to the node type. * The OpenSCAP application is remotely installed onto each target node gathered on step 3, using upstream packaging (rpm and .deb). diff --git a/docs/userguide/introduction.rst b/docs/userguide/introduction.rst index fc8e6680e..627f907f3 100644 --- a/docs/userguide/introduction.rst +++ b/docs/userguide/introduction.rst @@ -195,14 +195,14 @@ offers a lot of potential combinations: 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 deployed features. The system uses the environment variables (INSTALLER_IP and -DEPLOY_SCENARIO) to automatically determine the valid test cases; for each given +DEPLOY_SCENARIO) to automatically determine the valid test cases, for each given environment. In the Colorado OPNFV System release a convenience Functest CLI utility is also introduced to simplify setting up the Functest evironment, management of the OpenStack environment (e.g. resource clean-up) and for executing tests. The Functest CLI organised the testcase into logical Tiers, which contain in -turn one or more testcases. The CLI allow execution of a single specified +turn one or more testcases. The CLI allows execution of a single specified testcase, all test cases in a specified Tier, or the special case of execution of **ALL** testcases. The Functest CLI is introduced in more detail in the section `Executing the functest suites`_ of this document. diff --git a/testcases/Controllers/ONOS/Teston/adapters/client.py b/testcases/Controllers/ONOS/Teston/adapters/client.py index 77de092e4..6b3285e5e 100644 --- a/testcases/Controllers/ONOS/Teston/adapters/client.py +++ b/testcases/Controllers/ONOS/Teston/adapters/client.py @@ -10,15 +10,19 @@ Description: # http://www.apache.org/licenses/LICENSE-2.0 # """ -from environment import environment -import time +import json import pexpect import requests -import json +import time + +from environment import environment +import functest.utils.functest_logger as ft_logger class client(environment): + logger = ft_logger.Logger("client").getLogger() + def __init__(self): environment.__init__(self) self.loginfo = environment() @@ -50,7 +54,7 @@ class client(environment): [len(lastshowscreeninfo)::]) lastshowscreeninfo = curshowscreeninfo if Result == 0: - print "Done!" + self.logger.info("Done!") return time.sleep(1) circletime += 1 @@ -61,7 +65,7 @@ class client(environment): def onosstart(self): # This is the compass run machine user&pass,you need to modify - print "Test Begin....." + self.logger.info("Test Begin.....") self.OnosConnectionSet() masterhandle = self.SSHlogin(self.localhost, self.masterusername, self.masterpassword) diff --git a/testcases/Controllers/ONOS/Teston/adapters/connection.py b/testcases/Controllers/ONOS/Teston/adapters/connection.py index 16f2ef32c..b2a2e3d88 100644 --- a/testcases/Controllers/ONOS/Teston/adapters/connection.py +++ b/testcases/Controllers/ONOS/Teston/adapters/connection.py @@ -16,11 +16,15 @@ Description: import os import pexpect import re + from foundation import foundation +import functest.utils.functest_logger as ft_logger class connection(foundation): + logger = ft_logger.Logger("connection").getLogger() + def __init__(self): foundation.__init__(self) self.loginfo = foundation() @@ -33,7 +37,7 @@ class connection(foundation): username: login user name password: login password """ - print("Now Adding an user to known hosts " + ipaddr) + self.logger.info("Now Adding an user to known hosts " + ipaddr) login = handle login.sendline("ssh -l %s -p 8101 %s" % (username, ipaddr)) index = 0 @@ -78,7 +82,7 @@ class connection(foundation): """ Generate ssh keys, used for some server have no sshkey. """ - print "Now Generating SSH keys..." + self.logger.info("Now Generating SSH keys...") # Here file name may be id_rsa or id_ecdsa or others # So here will have a judgement keysub = handle @@ -112,7 +116,7 @@ class connection(foundation): parameters: password: root login password """ - print("Now changing to user root") + self.logger.info("Now changing to user root") login = pexpect.spawn("su - root") index = 0 while index != 2: @@ -129,7 +133,7 @@ class connection(foundation): """ Exit root user. """ - print("Now Release user root") + self.logger.info("Now Release user root") login = pexpect.spawn("exit") index = login.expect(['logout', pexpect.EOF, pexpect.TIMEOUT]) if index == 0: @@ -145,7 +149,7 @@ class connection(foundation): parameters: envalue: environment value to add """ - print "Now Adding bash environment" + self.logger.info("Now Adding bash environment") fileopen = open("/etc/profile", 'r') findContext = 1 while findContext: @@ -165,7 +169,7 @@ class connection(foundation): Change ONOS root path in file:bash_profile onospath: path of onos root """ - print "Now Changing ONOS Root Path" + self.logger.info("Now Changing ONOS Root Path") filepath = onospath + 'onos/tools/dev/bash_profile' line = open(filepath, 'r').readlines() lenall = len(line) - 1 @@ -175,7 +179,7 @@ class connection(foundation): NewFile = open(filepath, 'w') NewFile.writelines(line) NewFile.close - print "Done!" + self.logger.info("Done!") def OnosConnectionSet(self): """ diff --git a/testcases/Controllers/ONOS/Teston/adapters/environment.py b/testcases/Controllers/ONOS/Teston/adapters/environment.py index 231677333..f2755b669 100644 --- a/testcases/Controllers/ONOS/Teston/adapters/environment.py +++ b/testcases/Controllers/ONOS/Teston/adapters/environment.py @@ -15,17 +15,21 @@ Description: # """ -import os -import time import pexpect +import pxssh import re +import os import sys -import pxssh +import time + from connection import connection +import functest.utils.functest_logger as ft_logger class environment(connection): + logger = ft_logger.Logger("environment").getLogger() + def __init__(self): connection.__init__(self) self.loginfo = connection() @@ -39,9 +43,9 @@ class environment(connection): handle: current working handle codeurl: clone code url """ - print "Now loading test codes! Please wait in patient..." + self.logger.info("Now loading test codes! Please wait in patient...") originalfolder = sys.path[0] - print originalfolder + self.logger.info(originalfolder) gitclone = handle gitclone.sendline("git clone " + codeurl) index = 0 @@ -82,7 +86,7 @@ class environment(connection): parameters: handle(input): current working handle """ - print "Now Cleaning test environment" + self.logger.info("Now Cleaning test environment") handle.sendline("sudo apt-get install -y mininet") handle.prompt() handle.sendline("sudo pip install configobj") @@ -102,7 +106,7 @@ class environment(connection): cmd(input): onos-push-keys xxx(xxx is device) password(input): login in password """ - print "Now Pushing Onos Keys:" + cmd + self.logger.info("Now Pushing Onos Keys:" + cmd) Pushkeys = handle Pushkeys.sendline(cmd) Result = 0 @@ -121,7 +125,7 @@ class environment(connection): break time.sleep(2) Pushkeys.prompt() - print "Done!" + self.logger.info("Done!") def SetOnosEnvVar(self, handle, masterpass, agentpass): """ @@ -131,13 +135,14 @@ class environment(connection): masterpass: scripts running server's password agentpass: onos cluster&compute node password """ - print "Now Setting test environment" + self.logger.info("Now Setting test environment") for host in self.hosts: - print "try to connect " + str(host) + self.logger.info("try to connect " + str(host)) result = self.CheckSshNoPasswd(host) if not result: - print ("ssh login failed,try to copy master publickey" + - "to agent " + str(host)) + self.logger.info( + "ssh login failed,try to copy master publickey" + + "to agent " + str(host)) self.CopyPublicKey(host) self.OnosPushKeys(handle, "onos-push-keys " + self.OCT, masterpass) self.OnosPushKeys(handle, "onos-push-keys " + self.OC1, agentpass) @@ -173,7 +178,7 @@ class environment(connection): user: onos&compute node user password: onos&compute node password """ - print "Now Changing ONOS name&password" + self.logger.info("Now Changing ONOS name&password") filepath = self.home + '/onos/tools/build/envDefaults' line = open(filepath, 'r').readlines() lenall = len(line) - 1 @@ -187,7 +192,7 @@ class environment(connection): NewFile = open(filepath, 'w') NewFile.writelines(line) NewFile.close - print "Done!" + self.logger.info("Done!") def ChangeTestCasePara(self, testcase, user, password): """ @@ -196,7 +201,7 @@ class environment(connection): user: onos&compute node user password: onos&compute node password """ - print "Now Changing " + testcase + " name&password" + self.logger.info("Now Changing " + testcase + " name&password") if self.masterusername == 'root': filepath = '/root/' else: @@ -232,7 +237,7 @@ class environment(connection): login.sendline('ls -l') # match prompt login.prompt() - print("SSH login " + ipaddr + " success!") + self.logger.info("SSH login " + ipaddr + " success!") return login def SSHRelease(self, handle): @@ -256,7 +261,7 @@ class environment(connection): str(publickey) + ">>/root/.ssh/authorized_keys\'") tmphandle.prompt() self.SSHRelease(tmphandle) - print "Add OCT PublicKey to " + host + " success" + self.logger.info("Add OCT PublicKey to " + host + " success") def OnosEnvSetup(self, handle): """ diff --git a/testcases/Controllers/ONOS/Teston/adapters/foundation.py b/testcases/Controllers/ONOS/Teston/adapters/foundation.py index 70c84ac02..5c42c35e8 100644 --- a/testcases/Controllers/ONOS/Teston/adapters/foundation.py +++ b/testcases/Controllers/ONOS/Teston/adapters/foundation.py @@ -17,8 +17,7 @@ import os import re import time -import yaml -from functest.utils.functest_utils import FUNCTEST_REPO as FUNCTEST_REPO +import functest.utils.functest_utils as ft_utils class foundation: @@ -26,7 +25,7 @@ class foundation: def __init__(self): # currentpath = os.getcwd() - REPO_PATH = FUNCTEST_REPO + '/' + REPO_PATH = ft_utils.FUNCTEST_REPO + '/' currentpath = REPO_PATH + 'testcases/Controllers/ONOS/Teston/CI' self.cipath = currentpath self.logdir = os.path.join(currentpath, 'log') @@ -49,42 +48,36 @@ class foundation: filemode='w') filelog = logging.FileHandler(self.logfilepath) logging.getLogger('Functest').addHandler(filelog) - print loginfo logging.info(loginfo) def getdefaultpara(self): """ Get Default Parameters value """ - with open(os.environ["CONFIG_FUNCTEST_YAML"]) as f: - functest_yaml = yaml.safe_load(f) - - self.Result_DB = str(functest_yaml.get("results").get("test_db_url")) - self.masterusername = str(functest_yaml.get("ONOS").get("general"). - get('onosbench_username')) - self.masterpassword = str(functest_yaml.get("ONOS").get("general"). - get("onosbench_password")) - self.agentusername = str(functest_yaml.get("ONOS").get("general"). - get("onoscli_username")) - self.agentpassword = str(functest_yaml.get("ONOS").get("general"). - get("onoscli_password")) - self.runtimeout = functest_yaml.get("ONOS").get("general").get( - "runtimeout") - self.OCT = str(functest_yaml.get("ONOS").get("environment").get("OCT")) - self.OC1 = str(functest_yaml.get("ONOS").get("environment").get("OC1")) - self.OC2 = str(functest_yaml.get("ONOS").get("environment").get("OC2")) - self.OC3 = str(functest_yaml.get("ONOS").get("environment").get("OC3")) - self.OCN = str(functest_yaml.get("ONOS").get("environment").get("OCN")) - self.OCN2 = str(functest_yaml.get("ONOS"). - get("environment").get("OCN2")) - self.installer_master = str(functest_yaml.get("ONOS"). - get("environment").get("installer_master")) - self.installer_master_username = str(functest_yaml.get("ONOS"). - get("environment"). - get("installer_master_username")) - self.installer_master_password = str(functest_yaml.get("ONOS"). - get("environment"). - get("installer_master_password")) + self.Result_DB = str( + ft_utils.get_functest_config('results.test_db_url')) + self.masterusername = str( + ft_utils.get_functest_config('ONOS.general.onosbench_username')) + self.masterpassword = str( + ft_utils.get_functest_config('ONOS.general.onosbench_password')) + self.agentusername = str( + ft_utils.get_functest_config('ONOS.general.onoscli_username')) + self.agentpassword = str( + ft_utils.get_functest_config('ONOS.general.onoscli_password')) + self.runtimeout = \ + ft_utils.get_functest_config('ONOS.general.runtimeout') + self.OCT = str(ft_utils.get_functest_config('ONOS.environment.OCT')) + self.OC1 = str(ft_utils.get_functest_config('ONOS.environment.OC1')) + self.OC2 = str(ft_utils.get_functest_config('ONOS.environment.OC2')) + self.OC3 = str(ft_utils.get_functest_config('ONOS.environment.OC3')) + self.OCN = str(ft_utils.get_functest_config('ONOS.environment.OCN')) + self.OCN2 = str(ft_utils.get_functest_config('ONOS.environment.OCN2')) + self.installer_master = str( + ft_utils.get_functest_config('ONOS.environment.installer_master')) + self.installer_master_username = str(ft_utils.get_functest_config( + 'ONOS.environment.installer_master_username')) + self.installer_master_password = str(ft_utils.get_functest_config( + 'ONOS.environment.installer_master_password')) self.hosts = [self.OC1, self.OCN, self.OCN2] self.localhost = self.OCT diff --git a/testcases/Controllers/ONOS/Teston/onosfunctest.py b/testcases/Controllers/ONOS/Teston/onosfunctest.py index 01537b990..c8045fd12 100755 --- a/testcases/Controllers/ONOS/Teston/onosfunctest.py +++ b/testcases/Controllers/ONOS/Teston/onosfunctest.py @@ -20,11 +20,11 @@ import re import time import argparse +from neutronclient.v2_0 import client as neutronclient + import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as functest_utils +import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as openstack_utils -from functest.utils.functest_utils import FUNCTEST_REPO as REPO_PATH -from neutronclient.v2_0 import client as neutronclient parser = argparse.ArgumentParser() parser.add_argument("-t", "--testcase", help="Testcase name") @@ -35,12 +35,11 @@ args = parser.parse_args() logger = ft_logger.Logger("onos").getLogger() # onos parameters -TEST_DB = functest_utils.get_parameter_from_yaml( - "results.test_db_url") -ONOS_REPO_PATH = functest_utils.get_parameter_from_yaml( - "general.directories.dir_repos") -ONOS_CONF_DIR = functest_utils.get_parameter_from_yaml( - "general.directories.dir_functest_conf") +TEST_DB = ft_utils.get_functest_config("results.test_db_url") +ONOS_REPO_PATH = \ + ft_utils.get_functest_config("general.directories.dir_repos") +ONOS_CONF_DIR = \ + ft_utils.get_functest_config("general.directories.dir_functest_conf") ONOSCI_PATH = ONOS_REPO_PATH + "/" starttime = datetime.datetime.now() @@ -49,14 +48,14 @@ HOME = os.environ['HOME'] + "/" INSTALLER_TYPE = os.environ['INSTALLER_TYPE'] DEPLOY_SCENARIO = os.environ['DEPLOY_SCENARIO'] ONOSCI_PATH = ONOS_REPO_PATH + "/" -GLANCE_IMAGE_NAME = functest_utils.get_parameter_from_yaml( - "onos_sfc.image_name") -GLANCE_IMAGE_FILENAME = functest_utils.get_parameter_from_yaml( - "onos_sfc.image_file_name") -GLANCE_IMAGE_PATH = functest_utils.get_parameter_from_yaml( - "general.directories.dir_functest_data") + "/" + GLANCE_IMAGE_FILENAME -SFC_PATH = REPO_PATH + "/" + functest_utils.get_parameter_from_yaml( - "general.directories.dir_onos_sfc") +GLANCE_IMAGE_NAME = ft_utils.get_functest_config("onos_sfc.image_name") +GLANCE_IMAGE_FILENAME = \ + ft_utils.get_functest_config("onos_sfc.image_file_name") +GLANCE_IMAGE_PATH = \ + ft_utils.get_functest_config("general.directories.dir_functest_data") + \ + "/" + GLANCE_IMAGE_FILENAME +SFC_PATH = ft_utils.FUNCTEST_REPO + "/" + \ + ft_utils.get_functest_config("general.directories.dir_onos_sfc") def RunScript(testname): @@ -243,12 +242,12 @@ def OnosTest(): except: logger.error("Unable to set ONOS criteria") - functest_utils.push_results_to_db("functest", - "onos", - start_time, - stop_time, - status, - result) + ft_utils.push_results_to_db("functest", + "onos", + start_time, + stop_time, + status, + result) except: logger.error("Error pushing results into Database") diff --git a/testcases/OpenStack/examples/create_instance_and_ip.py b/testcases/OpenStack/examples/create_instance_and_ip.py index 3d41e5dde..50cdf8a57 100755 --- a/testcases/OpenStack/examples/create_instance_and_ip.py +++ b/testcases/OpenStack/examples/create_instance_and_ip.py @@ -32,33 +32,30 @@ HOME = os.environ['HOME'] + "/" VM_BOOT_TIMEOUT = 180 -INSTANCE_NAME = ft_utils.get_parameter_from_yaml("example.example_vm_name") -FLAVOR = ft_utils.get_parameter_from_yaml("example.example_flavor") -IMAGE_NAME = ft_utils.get_parameter_from_yaml("example.example_image_name") -IMAGE_FILENAME = ft_utils.get_parameter_from_yaml( - "general.openstack.image_file_name") -IMAGE_FORMAT = ft_utils.get_parameter_from_yaml( - "general.openstack.image_disk_format") -IMAGE_PATH = ft_utils.get_parameter_from_yaml( - "general.directories.dir_functest_data") + "/" + IMAGE_FILENAME +INSTANCE_NAME = ft_utils.get_functest_config("example.example_vm_name") +FLAVOR = ft_utils.get_functest_config("example.example_flavor") +IMAGE_NAME = ft_utils.get_functest_config("example.example_image_name") +IMAGE_FILENAME = \ + ft_utils.get_functest_config("general.openstack.image_file_name") +IMAGE_FORMAT = \ + ft_utils.get_functest_config("general.openstack.image_disk_format") +IMAGE_PATH = \ + ft_utils.get_functest_config("general.directories.dir_functest_data") + \ + "/" + IMAGE_FILENAME # NEUTRON Private Network parameters -NET_NAME = ft_utils.get_parameter_from_yaml( - "example.example_private_net_name") -SUBNET_NAME = ft_utils.get_parameter_from_yaml( - "example.example_private_subnet_name") -SUBNET_CIDR = ft_utils.get_parameter_from_yaml( - "example.example_private_subnet_cidr") -ROUTER_NAME = ft_utils.get_parameter_from_yaml( - "example.example_router_name") - -SECGROUP_NAME = ft_utils.get_parameter_from_yaml( - "example.example_sg_name") -SECGROUP_DESCR = ft_utils.get_parameter_from_yaml( - "example.example_sg_descr") - -TEST_DB = ft_utils.get_parameter_from_yaml("results.test_db_url") +NET_NAME = ft_utils.get_functest_config("example.example_private_net_name") +SUBNET_NAME = \ + ft_utils.get_functest_config("example.example_private_subnet_name") +SUBNET_CIDR = \ + ft_utils.get_functest_config("example.example_private_subnet_cidr") +ROUTER_NAME = ft_utils.get_functest_config("example.example_router_name") + +SECGROUP_NAME = ft_utils.get_functest_config("example.example_sg_name") +SECGROUP_DESCR = ft_utils.get_functest_config("example.example_sg_descr") + +TEST_DB = ft_utils.get_functest_config("results.test_db_url") def main(): diff --git a/testcases/OpenStack/rally/blacklist.txt b/testcases/OpenStack/rally/blacklist.txt new file mode 100644 index 000000000..02d85f4d8 --- /dev/null +++ b/testcases/OpenStack/rally/blacklist.txt @@ -0,0 +1,8 @@ +- + scenarios: + - os-nosdn-lxd-ha + - os-nosdn-lxd-noha + installers: + - joid + tests: + - NovaServers.boot_server_from_volume_and_delete diff --git a/testcases/OpenStack/rally/run_rally-cert.py b/testcases/OpenStack/rally/run_rally-cert.py index 85d21d9bd..29fd0a334 100755 --- a/testcases/OpenStack/rally/run_rally-cert.py +++ b/testcases/OpenStack/rally/run_rally-cert.py @@ -22,11 +22,12 @@ import subprocess import time import argparse +import iniparse +import yaml + import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as functest_utils +import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils -import iniparse -from functest.utils.functest_utils import FUNCTEST_REPO as REPO_PATH tests = ['authenticate', 'glance', 'cinder', 'heat', 'keystone', 'neutron', 'nova', 'quotas', 'requests', 'vm', 'all'] @@ -71,13 +72,13 @@ else: logger = ft_logger.Logger("run_rally").getLogger() -functest_yaml = functest_utils.get_functest_yaml() - HOME = os.environ['HOME'] + "/" -RALLY_DIR = REPO_PATH + '/' + functest_yaml.get("general").get( - "directories").get("dir_rally") +RALLY_DIR = ft_utils.FUNCTEST_REPO + '/' + \ + ft_utils.get_functest_config('general.directories.dir_rally') TEMPLATE_DIR = RALLY_DIR + "scenario/templates" SUPPORT_DIR = RALLY_DIR + "scenario/support" +TEMP_DIR = RALLY_DIR + "var" +BLACKLIST_FILE = RALLY_DIR + "blacklist.txt" FLAVOR_NAME = "m1.tiny" USERS_AMOUNT = 2 @@ -85,25 +86,27 @@ TENANTS_AMOUNT = 3 ITERATIONS_AMOUNT = 10 CONCURRENCY = 4 -RESULTS_DIR = functest_yaml.get("general").get("directories").get( - "dir_rally_res") -TEMPEST_CONF_FILE = functest_yaml.get("general").get("directories").get( - "dir_results") + '/tempest/tempest.conf' -TEST_DB = functest_yaml.get("results").get("test_db_url") - -PRIVATE_NET_NAME = functest_yaml.get("rally").get("network_name") -PRIVATE_SUBNET_NAME = functest_yaml.get("rally").get("subnet_name") -PRIVATE_SUBNET_CIDR = functest_yaml.get("rally").get("subnet_cidr") -ROUTER_NAME = functest_yaml.get("rally").get("router_name") - -GLANCE_IMAGE_NAME = functest_yaml.get("general").get("openstack").get( - "image_name") -GLANCE_IMAGE_FILENAME = functest_yaml.get("general").get("openstack").get( - "image_file_name") -GLANCE_IMAGE_FORMAT = functest_yaml.get("general").get("openstack").get( - "image_disk_format") -GLANCE_IMAGE_PATH = functest_yaml.get("general").get("directories").get( - "dir_functest_data") + "/" + GLANCE_IMAGE_FILENAME +RESULTS_DIR = \ + ft_utils.get_functest_config('general.directories.dir_rally_res') +TEMPEST_CONF_FILE = \ + ft_utils.get_functest_config('general.directories.dir_results') + \ + '/tempest/tempest.conf' +TEST_DB = ft_utils.get_functest_config('results.test_db_url') + +PRIVATE_NET_NAME = ft_utils.get_functest_config('rally.network_name') +PRIVATE_SUBNET_NAME = ft_utils.get_functest_config('rally.subnet_name') +PRIVATE_SUBNET_CIDR = ft_utils.get_functest_config('rally.subnet_cidr') +ROUTER_NAME = ft_utils.get_functest_config('rally.router_name') + +GLANCE_IMAGE_NAME = \ + ft_utils.get_functest_config('general.openstack.image_name') +GLANCE_IMAGE_FILENAME = \ + ft_utils.get_functest_config('general.openstack.image_file_name') +GLANCE_IMAGE_FORMAT = \ + ft_utils.get_functest_config('general.openstack.image_disk_format') +GLANCE_IMAGE_PATH = \ + ft_utils.get_functest_config('general.directories.dir_functest_data') + \ + "/" + GLANCE_IMAGE_FILENAME CINDER_VOLUME_TYPE_NAME = "volume_test" @@ -160,6 +163,7 @@ def build_task_args(test_file_name): task_args['image_name'] = GLANCE_IMAGE_NAME task_args['flavor_name'] = FLAVOR_NAME task_args['glance_image_location'] = GLANCE_IMAGE_PATH + task_args['glance_image_format'] = GLANCE_IMAGE_FORMAT task_args['tmpl_dir'] = TEMPLATE_DIR task_args['sup_dir'] = SUPPORT_DIR task_args['users_amount'] = USERS_AMOUNT @@ -269,6 +273,64 @@ def get_cmd_output(proc): return result +def apply_blacklist(case_file_name, result_file_name): + logger.debug("Applying blacklist...") + cases_file = open(case_file_name, 'r') + result_file = open(result_file_name, 'w') + black_tests = [] + + try: + installer_type = os.getenv('INSTALLER_TYPE') + deploy_scenario = os.getenv('DEPLOY_SCENARIO') + if (bool(installer_type) * bool(deploy_scenario)): + # if INSTALLER_TYPE and DEPLOY_SCENARIO are set we read the file + with open(BLACKLIST_FILE, 'r') as black_list_file: + black_list_yaml = yaml.safe_load(black_list_file) + + for item in black_list_yaml: + scenarios = item['scenarios'] + installers = item['installers'] + if (deploy_scenario in scenarios and + installer_type in installers): + tests = item['tests'] + black_tests.extend(tests) + except: + black_tests = [] + logger.debug("Blacklisting not applied.") + + include = True + for cases_line in cases_file: + if include: + for black_tests_line in black_tests: + if black_tests_line == cases_line.strip().rstrip(':'): + include = False + break + else: + result_file.write(str(cases_line)) + else: + if cases_line.isspace(): + include = True + + cases_file.close() + result_file.close() + + +def prepare_test_list(test_name): + scenario_file_name = '{}opnfv-{}.yaml'.format(RALLY_DIR + "scenario/", + test_name) + if not os.path.exists(scenario_file_name): + logger.info("The scenario '%s' does not exist." % scenario_file_name) + exit(-1) + + logger.debug('Scenario fetched from : {}'.format(scenario_file_name)) + test_file_name = '{}opnfv-{}.yaml'.format(TEMP_DIR + "/", test_name) + + if not os.path.exists(TEMP_DIR): + os.makedirs(TEMP_DIR) + + apply_blacklist(scenario_file_name, test_file_name) + + def run_task(test_name): # # the "main" function of the script who launch rally for a task @@ -284,13 +346,7 @@ def run_task(test_name): logger.error("Task file '%s' does not exist." % task_file) exit(-1) - test_file_name = '{}opnfv-{}.yaml'.format(RALLY_DIR + "scenario/", - test_name) - if not os.path.exists(test_file_name): - logger.error("The scenario '%s' does not exist." % test_file_name) - exit(-1) - - logger.debug('Scenario fetched from : {}'.format(test_file_name)) + prepare_test_list(test_name) cmd_line = ("rally task start --abort-on-sla-failure " + "--task {} ".format(task_file) + @@ -353,12 +409,12 @@ def run_task(test_name): if args.report: stop_time = time.time() logger.debug("Push Rally detailed results into DB") - functest_utils.push_results_to_db("functest", - "Rally_details", - start_time, - stop_time, - status, - json_data) + ft_utils.push_results_to_db("functest", + "Rally_details", + start_time, + stop_time, + status, + json_data) def main(): @@ -477,7 +533,7 @@ def main(): case_name = "rally_full" # Evaluation of the success criteria - status = functest_utils.check_success_rate(case_name, success_rate) + status = ft_utils.check_success_rate(case_name, success_rate) exit_code = -1 if status == "PASS": @@ -485,12 +541,12 @@ def main(): if args.report: logger.debug("Pushing Rally summary into DB...") - functest_utils.push_results_to_db("functest", - case_name, - start_time, - stop_time, - status, - payload) + ft_utils.push_results_to_db("functest", + case_name, + start_time, + stop_time, + status, + payload) if args.noclean: exit(exit_code) diff --git a/testcases/OpenStack/rally/scenario/opnfv-glance.yaml b/testcases/OpenStack/rally/scenario/opnfv-glance.yaml index adbf8b79a..3a67e7457 100644 --- a/testcases/OpenStack/rally/scenario/opnfv-glance.yaml +++ b/testcases/OpenStack/rally/scenario/opnfv-glance.yaml @@ -1,7 +1,7 @@ GlanceImages.create_and_delete_image: - args: - {{ glance_args(location=glance_image_location) }} + {{ glance_args(location=glance_image_location, type=glance_image_format) }} context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} runner: @@ -12,7 +12,7 @@ GlanceImages.create_and_list_image: - args: - {{ glance_args(location=glance_image_location) }} + {{ glance_args(location=glance_image_location, type=glance_image_format) }} context: {{ user_context(tenants_amount, users_amount, use_existing_users) }} runner: @@ -32,7 +32,7 @@ GlanceImages.create_image_and_boot_instances: - args: - {{ glance_args(location=glance_image_location) }} + {{ glance_args(location=glance_image_location, type=glance_image_format) }} flavor: name: {{ flavor_name }} number_instances: 2 diff --git a/testcases/OpenStack/rally/task.yaml b/testcases/OpenStack/rally/task.yaml index 3dded7db0..c482f120d 100644 --- a/testcases/OpenStack/rally/task.yaml +++ b/testcases/OpenStack/rally/task.yaml @@ -8,41 +8,41 @@ --- {% if "authenticate" in service_list %} -{%- include "scenario/opnfv-authenticate.yaml"-%} +{%- include "var/opnfv-authenticate.yaml"-%} {% endif %} {% if "cinder" in service_list %} -{%- include "scenario/opnfv-cinder.yaml"-%} +{%- include "var/opnfv-cinder.yaml"-%} {% endif %} {% if "keystone" in service_list %} -{%- include "scenario/opnfv-keystone.yaml"-%} +{%- include "var/opnfv-keystone.yaml"-%} {% endif %} {% if "nova" in service_list %} -{%- include "scenario/opnfv-nova.yaml"-%} +{%- include "var/opnfv-nova.yaml"-%} {% endif %} {% if "glance" in service_list %} -{%- include "scenario/opnfv-glance.yaml"-%} +{%- include "var/opnfv-glance.yaml"-%} {% endif %} {% if "neutron" in service_list %} -{%- include "scenario/opnfv-neutron.yaml"-%} +{%- include "var/opnfv-neutron.yaml"-%} {% endif %} {% if "quotas" in service_list %} -{%- include "scenario/opnfv-quotas.yaml"-%} +{%- include "var/opnfv-quotas.yaml"-%} {% endif %} {% if "requests" in service_list %} -{%- include "scenario/opnfv-requests.yaml"-%} +{%- include "var/opnfv-requests.yaml"-%} {% endif %} {% if "heat" in service_list %} -{%- include "scenario/opnfv-heat.yaml"-%} +{%- include "var/opnfv-heat.yaml"-%} {% endif %} {% if "vm" in service_list %} -{%- include "scenario/opnfv-vm.yaml"-%} +{%- include "var/opnfv-vm.yaml"-%} {% endif %} diff --git a/testcases/OpenStack/tempest/custom_tests/blacklist.txt b/testcases/OpenStack/tempest/custom_tests/blacklist.txt index a2427e282..5c8581f66 100644 --- a/testcases/OpenStack/tempest/custom_tests/blacklist.txt +++ b/testcases/OpenStack/tempest/custom_tests/blacklist.txt @@ -79,31 +79,18 @@ # https://bugs.launchpad.net/tempest/+bug/1586931 scenarios: - os-odl_l2-nofeature-ha + - os-odl_l2-nofeature-noha - os-odl_l2-sfc-ha + - os-odl_l2-sfc-noha - os-odl_l3-nofeature-ha + - os-odl_l3-nofeature-noha - os-nosdn-kvm-ha + - os-nosdn-kvm-noha - os-nosdn-nofeature-ha + - os-nosdn-nofeature-noha - os-nosdn-ovs-ha + - os-nosdn-ovs-noha installers: - fuel tests: - tempest.scenario.test_server_basic_ops.TestServerBasicOps.test_server_basic_ops - -- - # https://bugs.opendaylight.org/show_bug.cgi?id=5586 - # https://jira.opnfv.org/browse/APEX-112 - # https://jira.opnfv.org/browse/FUNCTEST-445 - scenarios: - - os-odl_l3-nofeature-ha - - os-odl_l3-nofeature-noha - installers: - - fuel - - apex - - compass - - joid - tests: - - 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 diff --git a/testcases/OpenStack/tempest/gen_tempest_conf.py b/testcases/OpenStack/tempest/gen_tempest_conf.py index 688a92402..ca671d00d 100755 --- a/testcases/OpenStack/tempest/gen_tempest_conf.py +++ b/testcases/OpenStack/tempest/gen_tempest_conf.py @@ -55,10 +55,10 @@ def configure_tempest_multisite(deployment_dir): kingbird_conf_path = "/etc/kingbird/kingbird.conf" installer_type = os.getenv('INSTALLER_TYPE', 'Unknown') installer_ip = os.getenv('INSTALLER_IP', 'Unknown') - installer_username = ft_utils.get_parameter_from_yaml( + installer_username = ft_utils.get_functest_config( "multisite." + installer_type + "_environment.installer_username") - installer_password = ft_utils.get_parameter_from_yaml( + installer_password = ft_utils.get_functest_config( "multisite." + installer_type + "_environment.installer_password") diff --git a/testcases/OpenStack/tempest/run_tempest.py b/testcases/OpenStack/tempest/run_tempest.py index e93972182..2f24e96de 100755 --- a/testcases/OpenStack/tempest/run_tempest.py +++ b/testcases/OpenStack/tempest/run_tempest.py @@ -22,11 +22,11 @@ import sys import time import argparse +import yaml + import functest.utils.functest_logger as ft_logger import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils -import yaml -from functest.utils.functest_utils import FUNCTEST_REPO as FUNCTEST_REPO modes = ['full', 'smoke', 'baremetal', 'compute', 'data_processing', 'identity', 'image', 'network', 'object_storage', 'orchestration', @@ -58,39 +58,49 @@ args = parser.parse_args() """ logging configuration """ logger = ft_logger.Logger("run_tempest").getLogger() -functest_yaml = ft_utils.get_functest_yaml() -TEST_DB = functest_yaml.get("results").get("test_db_url") +TEST_DB = ft_utils.get_functest_config('results.test_db_url') MODE = "smoke" -GLANCE_IMAGE_NAME = functest_yaml.get("general").get( - "openstack").get("image_name") -GLANCE_IMAGE_FILENAME = functest_yaml.get("general").get( - "openstack").get("image_file_name") -GLANCE_IMAGE_FORMAT = functest_yaml.get("general").get( - "openstack").get("image_disk_format") -GLANCE_IMAGE_PATH = functest_yaml.get("general").get("directories").get( - "dir_functest_data") + "/" + GLANCE_IMAGE_FILENAME -PRIVATE_NET_NAME = functest_yaml.get("tempest").get("private_net_name") -PRIVATE_SUBNET_NAME = functest_yaml.get("tempest").get("private_subnet_name") -PRIVATE_SUBNET_CIDR = functest_yaml.get("tempest").get("private_subnet_cidr") -ROUTER_NAME = functest_yaml.get("tempest").get("router_name") -TENANT_NAME = functest_yaml.get("tempest").get("identity").get("tenant_name") -TENANT_DESCRIPTION = functest_yaml.get("tempest").get("identity").get( - "tenant_description") -USER_NAME = functest_yaml.get("tempest").get("identity").get("user_name") -USER_PASSWORD = functest_yaml.get("tempest").get("identity").get( - "user_password") -SSH_TIMEOUT = functest_yaml.get("tempest").get("validation").get( - "ssh_timeout") -DEPLOYMENT_MAME = functest_yaml.get("rally").get("deployment_name") -RALLY_INSTALLATION_DIR = functest_yaml.get("general").get("directories").get( - "dir_rally_inst") -RESULTS_DIR = functest_yaml.get("general").get("directories").get( - "dir_results") +GLANCE_IMAGE_NAME = \ + ft_utils.get_functest_config('general.openstack.image_name') +GLANCE_IMAGE_FILENAME = \ + ft_utils.get_functest_config('general.openstack.image_file_name') +GLANCE_IMAGE_FORMAT = \ + ft_utils.get_functest_config('general.openstack.image_disk_format') +GLANCE_IMAGE_PATH = \ + ft_utils.get_functest_config('general.directories.dir_functest_data') + \ + "/" + GLANCE_IMAGE_FILENAME + +PRIVATE_NET_NAME = \ + ft_utils.get_functest_config('tempest.private_net_name') +PRIVATE_SUBNET_NAME = \ + ft_utils.get_functest_config('tempest.private_subnet_name') +PRIVATE_SUBNET_CIDR = \ + ft_utils.get_functest_config('tempest.private_subnet_cidr') +ROUTER_NAME = \ + ft_utils.get_functest_config('tempest.router_name') +TENANT_NAME = \ + ft_utils.get_functest_config('tempest.identity.tenant_name') +TENANT_DESCRIPTION = \ + ft_utils.get_functest_config('tempest.identity.tenant_description') +USER_NAME = \ + ft_utils.get_functest_config('tempest.identity.user_name') +USER_PASSWORD = \ + ft_utils.get_functest_config('tempest.identity.user_password') +SSH_TIMEOUT = \ + ft_utils.get_functest_config('tempest.validation.ssh_timeout') +DEPLOYMENT_MAME = \ + ft_utils.get_functest_config('rally.deployment_name') +RALLY_INSTALLATION_DIR = \ + ft_utils.get_functest_config('general.directories.dir_rally_inst') + +RESULTS_DIR = \ + ft_utils.get_functest_config('general.directories.dir_results') TEMPEST_RESULTS_DIR = RESULTS_DIR + '/tempest' -TEST_LIST_DIR = functest_yaml.get("general").get("directories").get( - "dir_tempest_cases") -REPO_PATH = FUNCTEST_REPO + '/' + +REPO_PATH = ft_utils.FUNCTEST_REPO + '/' +TEST_LIST_DIR = \ + ft_utils.get_functest_config('general.directories.dir_tempest_cases') TEMPEST_CUSTOM = REPO_PATH + TEST_LIST_DIR + 'test_list.txt' TEMPEST_BLACKLIST = REPO_PATH + TEST_LIST_DIR + 'blacklist.txt' TEMPEST_DEFCORE = REPO_PATH + TEST_LIST_DIR + 'defcore_req.txt' diff --git a/testcases/OpenStack/vPing/vping_util.py b/testcases/OpenStack/vPing/vping_util.py index 7e7173aee..cf5a28dbd 100644 --- a/testcases/OpenStack/vPing/vping_util.py +++ b/testcases/OpenStack/vPing/vping_util.py @@ -4,43 +4,43 @@ import re import sys import time -import functest.utils.functest_utils as ft_utils -import functest.utils.openstack_utils as os_utils import paramiko -from functest.utils.functest_utils import FUNCTEST_REPO as REPO_PATH from scp import SCPClient -functest_yaml = ft_utils.get_functest_yaml() +import functest.utils.functest_utils as ft_utils +import functest.utils.openstack_utils as os_utils +FUNCTEST_REPO = ft_utils.FUNCTEST_REPO -NAME_VM_1 = functest_yaml.get("vping").get("vm_name_1") -NAME_VM_2 = functest_yaml.get("vping").get("vm_name_2") +NAME_VM_1 = ft_utils.get_functest_config('vping.vm_name_1') +NAME_VM_2 = ft_utils.get_functest_config('vping.vm_name_2') VM_BOOT_TIMEOUT = 180 VM_DELETE_TIMEOUT = 100 -PING_TIMEOUT = functest_yaml.get("vping").get("ping_timeout") +PING_TIMEOUT = ft_utils.get_functest_config('vping.ping_timeout') + +GLANCE_IMAGE_NAME = ft_utils.get_functest_config('vping.image_name') +GLANCE_IMAGE_FILENAME = \ + ft_utils.get_functest_config('general.openstack.image_file_name') +GLANCE_IMAGE_FORMAT = \ + ft_utils.get_functest_config('general.openstack.image_disk_format') +GLANCE_IMAGE_PATH = \ + ft_utils.get_functest_config('general.directories.dir_functest_data') + \ + "/" + GLANCE_IMAGE_FILENAME -GLANCE_IMAGE_NAME = functest_yaml.get("vping").get("image_name") -GLANCE_IMAGE_FILENAME = functest_yaml.get("general").get( - "openstack").get("image_file_name") -GLANCE_IMAGE_FORMAT = functest_yaml.get("general").get( - "openstack").get("image_disk_format") -GLANCE_IMAGE_PATH = functest_yaml.get("general").get("directories").get( - "dir_functest_data") + "/" + GLANCE_IMAGE_FILENAME -FLAVOR = functest_yaml.get("vping").get("vm_flavor") +FLAVOR = ft_utils.get_functest_config('vping.vm_flavor') # NEUTRON Private Network parameters -PRIVATE_NET_NAME = functest_yaml.get("vping").get( - "vping_private_net_name") -PRIVATE_SUBNET_NAME = functest_yaml.get("vping").get( - "vping_private_subnet_name") -PRIVATE_SUBNET_CIDR = functest_yaml.get("vping").get( - "vping_private_subnet_cidr") -ROUTER_NAME = functest_yaml.get("vping").get( - "vping_router_name") +PRIVATE_NET_NAME = \ + ft_utils.get_functest_config('vping.vping_private_net_name') +PRIVATE_SUBNET_NAME = \ + ft_utils.get_functest_config('vping.vping_private_subnet_name') +PRIVATE_SUBNET_CIDR = \ + ft_utils.get_functest_config('vping.vping_private_subnet_cidr') +ROUTER_NAME = ft_utils.get_functest_config('vping.vping_router_name') -SECGROUP_NAME = functest_yaml.get("vping").get("vping_sg_name") -SECGROUP_DESCR = functest_yaml.get("vping").get("vping_sg_descr") +SECGROUP_NAME = ft_utils.get_functest_config('vping.vping_sg_name') +SECGROUP_DESCR = ft_utils.get_functest_config('vping.vping_sg_descr') neutron_client = None @@ -57,8 +57,8 @@ def pMsg(value): def check_repo_exist(): - if not os.path.exists(REPO_PATH): - logger.error("Functest repository not found '%s'" % REPO_PATH) + if not os.path.exists(FUNCTEST_REPO): + logger.error("Functest repository not found '%s'" % FUNCTEST_REPO) exit(-1) @@ -339,7 +339,7 @@ def transfer_ping_script(ssh, floatip): logger.info("Trying to transfer ping.sh to %s..." % floatip) scp = SCPClient(ssh.get_transport()) - ping_script = REPO_PATH + '/' + "testcases/OpenStack/vPing/ping.sh" + ping_script = FUNCTEST_REPO + "/testcases/OpenStack/vPing/ping.sh" try: scp.put(ping_script, "~/") except: diff --git a/testcases/features/copper.py b/testcases/features/copper.py index 50319d965..be6744a95 100755 --- a/testcases/features/copper.py +++ b/testcases/features/copper.py @@ -28,10 +28,10 @@ parser.add_argument("-r", "--report", action="store_true") args = parser.parse_args() -COPPER_REPO = functest_utils.get_parameter_from_yaml( - 'general.directories.dir_repo_copper') -RESULTS_DIR = functest_utils.get_parameter_from_yaml( - 'general.directories.dir_results') +COPPER_REPO = \ + functest_utils.get_functest_config('general.directories.dir_repo_copper') +RESULTS_DIR = \ + functest_utils.get_functest_config('general.directories.dir_results') logger = ft_logger.Logger("copper").getLogger() diff --git a/testcases/features/doctor.py b/testcases/features/doctor.py index 5fc0713f9..6c26875d3 100755 --- a/testcases/features/doctor.py +++ b/testcases/features/doctor.py @@ -13,12 +13,14 @@ # 0.2: measure test duration and publish results under json format # # +import argparse +import os import time -import argparse import functest.utils.functest_logger as ft_logger import functest.utils.functest_utils as functest_utils + parser = argparse.ArgumentParser() parser.add_argument("-r", "--report", help="Create json result file", @@ -27,28 +29,40 @@ args = parser.parse_args() functest_yaml = functest_utils.get_functest_yaml() -dirs = functest_yaml.get('general').get('directories') -DOCTOR_REPO = dirs.get('dir_repo_doctor') +DOCTOR_REPO = \ + functest_utils.get_functest_config('general.directories.dir_repo_doctor') +RESULTS_DIR = \ + functest_utils.get_functest_config('general.directories.dir_results') logger = ft_logger.Logger("doctor").getLogger() def main(): exit_code = -1 + + # if the image name is explicitly set for the doctor suite, set it as + # enviroment variable + if 'doctor' in functest_yaml and 'image_name' in functest_yaml['doctor']: + os.environ["IMAGE_NAME"] = functest_yaml['doctor']['image_name'] + cmd = 'cd %s/tests && ./run.sh' % DOCTOR_REPO + log_file = RESULTS_DIR + "/doctor.log" + start_time = time.time() - ret = functest_utils.execute_command(cmd, info=True, - exit_on_error=False) + ret = functest_utils.execute_command(cmd, + info=True, + exit_on_error=False, + output_file=log_file) stop_time = time.time() duration = round(stop_time - start_time, 1) if ret == 0: - logger.info("doctor OK") + logger.info("Doctor test case OK") test_status = 'OK' exit_code = 0 else: - logger.info("doctor FAILED") + logger.info("Doctor test case FAILED") test_status = 'NOK' details = { diff --git a/testcases/features/domino.py b/testcases/features/domino.py index aaf38047b..75351a56e 100755 --- a/testcases/features/domino.py +++ b/testcases/features/domino.py @@ -14,11 +14,11 @@ # 0.3: add report flag to push results when needed # +import argparse import time -import argparse import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as functest_utils +import functest.utils.functest_utils as ft_utils parser = argparse.ArgumentParser() @@ -27,19 +27,23 @@ parser.add_argument("-r", "--report", action="store_true") args = parser.parse_args() -functest_yaml = functest_utils.get_functest_yaml() -dirs = functest_yaml.get('general').get('directories') -DOMINO_REPO = dirs.get('dir_repo_domino') +DOMINO_REPO = \ + ft_utils.get_functest_config('general.directories.dir_repo_domino') +RESULTS_DIR = \ + ft_utils.get_functest_config('general.directories.dir_results') logger = ft_logger.Logger("domino").getLogger() def main(): cmd = 'cd %s && ./tests/run_multinode.sh' % DOMINO_REPO + log_file = RESULTS_DIR + "/domino.log" start_time = time.time() - ret = functest_utils.execute_command(cmd, exit_on_error=False) + ret = ft_utils.execute_command(cmd, + exit_on_error=False, + output_file=log_file) stop_time = time.time() duration = round(stop_time - start_time, 1) @@ -65,17 +69,18 @@ def main(): elif details['status'] == "SKIPPED": status = "SKIP" - functest_utils.logger_test_results("Domino", - "domino-multinode", - status, details) + ft_utils.logger_test_results("Domino", + "domino-multinode", + status, + details) if args.report: if status is not "SKIP": - functest_utils.push_results_to_db("domino", - "domino-multinode", - start_time, - stop_time, - status, - details) + ft_utils.push_results_to_db("domino", + "domino-multinode", + start_time, + stop_time, + status, + details) logger.info("Domino results pushed to DB") diff --git a/testcases/features/promise.py b/testcases/features/promise.py index 47e360ca3..cce0f5dc1 100755 --- a/testcases/features/promise.py +++ b/testcases/features/promise.py @@ -9,18 +9,19 @@ # # Maintainer : jose.lausuch@ericsson.com # +import argparse import json import os import subprocess import time -import argparse import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as functest_utils +import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as openstack_utils import keystoneclient.v2_0.client as ksclient -import novaclient.client as nvclient from neutronclient.v2_0 import client as ntclient +import novaclient.client as nvclient + parser = argparse.ArgumentParser() @@ -30,35 +31,35 @@ parser.add_argument("-r", "--report", action="store_true") args = parser.parse_args() -functest_yaml = functest_utils.get_functest_yaml() -dirs = functest_yaml.get('general').get('directories') +dirs = ft_utils.get_functest_config('general.directories') PROMISE_REPO = dirs.get('dir_repo_promise') -TEST_DB = functest_yaml.get('results').get('test_db_url') - -TENANT_NAME = functest_yaml.get('promise').get('general').get('tenant_name') -TENANT_DESCRIPTION = functest_yaml.get('promise').get( - 'general').get('tenant_description') -USER_NAME = functest_yaml.get('promise').get('general').get('user_name') -USER_PWD = functest_yaml.get('promise').get('general').get('user_pwd') -IMAGE_NAME = functest_yaml.get('promise').get('general').get('image_name') -FLAVOR_NAME = functest_yaml.get('promise').get('general').get('flavor_name') -FLAVOR_VCPUS = functest_yaml.get('promise').get('general').get('flavor_vcpus') -FLAVOR_RAM = functest_yaml.get('promise').get('general').get('flavor_ram') -FLAVOR_DISK = functest_yaml.get('promise').get('general').get('flavor_disk') - - -GLANCE_IMAGE_FILENAME = functest_yaml.get('general').get('openstack').get( - 'image_file_name') -GLANCE_IMAGE_FORMAT = functest_yaml.get('general').get('openstack').get( - 'image_disk_format') -GLANCE_IMAGE_PATH = functest_yaml.get('general').get('directories').get( - 'dir_functest_data') + "/" + GLANCE_IMAGE_FILENAME - -NET_NAME = functest_yaml.get('promise').get('general').get('network_name') -SUBNET_NAME = functest_yaml.get('promise').get('general').get('subnet_name') -SUBNET_CIDR = functest_yaml.get('promise').get('general').get('subnet_cidr') -ROUTER_NAME = functest_yaml.get('promise').get('general').get('router_name') +RESULTS_DIR = ft_utils.get_functest_config('general.directories.dir_results') + +TENANT_NAME = ft_utils.get_functest_config('promise.tenant_name') +TENANT_DESCRIPTION = \ + ft_utils.get_functest_config('promise.tenant_description') +USER_NAME = ft_utils.get_functest_config('promise.user_name') +USER_PWD = ft_utils.get_functest_config('promise.user_pwd') +IMAGE_NAME = ft_utils.get_functest_config('promise.image_name') +FLAVOR_NAME = ft_utils.get_functest_config('promise.flavor_name') +FLAVOR_VCPUS = ft_utils.get_functest_config('promise.flavor_vcpus') +FLAVOR_RAM = ft_utils.get_functest_config('promise.flavor_ram') +FLAVOR_DISK = ft_utils.get_functest_config('promise.flavor_disk') + + +GLANCE_IMAGE_FILENAME = \ + ft_utils.get_functest_config('general.openstack.image_file_name') +GLANCE_IMAGE_FORMAT = \ + ft_utils.get_functest_config('general.openstack.image_disk_format') +GLANCE_IMAGE_PATH = \ + ft_utils.get_functest_config('general.directories.dir_functest_data') + \ + "/" + GLANCE_IMAGE_FILENAME + +NET_NAME = ft_utils.get_functest_config('promise.network_name') +SUBNET_NAME = ft_utils.get_functest_config('promise.subnet_name') +SUBNET_CIDR = ft_utils.get_functest_config('promise.subnet_cidr') +ROUTER_NAME = ft_utils.get_functest_config('promise.router_name') """ logging configuration """ @@ -181,7 +182,7 @@ def main(): os.environ["OS_TEST_NETWORK"] = network_dic["net_id"] os.chdir(PROMISE_REPO) - results_file_name = 'promise-results.json' + results_file_name = RESULTS_DIR + '/' + 'promise-results.json' results_file = open(results_file_name, 'w+') cmd = 'npm run -s test -- --reporter json' @@ -240,12 +241,12 @@ def main(): status = "PASS" exit_code = 0 - functest_utils.push_results_to_db("promise", - "promise", - start_time, - stop_time, - status, - json_results) + ft_utils.push_results_to_db("promise", + "promise", + start_time, + stop_time, + status, + json_results) exit(exit_code) diff --git a/testcases/features/sfc/prepare_odl_sfc.bash b/testcases/features/sfc/prepare_odl_sfc.bash new file mode 100755 index 000000000..80ed9bd92 --- /dev/null +++ b/testcases/features/sfc/prepare_odl_sfc.bash @@ -0,0 +1,38 @@ +#!/bin/bash + +# +# Author: George Paraskevopoulos (geopar@intracom-telecom.com) +# Manuel Buil (manuel.buil@ericsson.com) +# Prepares the controller and the compute nodes for the odl-sfc testcase +# +# +# 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 +# + +ODL_SFC_LOG=/home/opnfv/functest/results/odl-sfc.log +ODL_SFC_DIR=${FUNCTEST_REPO_DIR}/testcases/features/sfc + +# Split the output to the log file and redirect STDOUT and STDERR to /dev/null +bash ${ODL_SFC_DIR}/server_presetup_CI.bash |& \ + tee -a ${ODL_SFC_LOG} 1>/dev/null 2>&1 + +# Get return value from PIPESTATUS array (bash specific feature) +ret_val=${PIPESTATUS[0]} +if [ $ret_val != 0 ]; then + echo "The tacker server deployment failed" + exit $ret_val +fi +echo "The tacker server was deployed successfully" + +bash ${ODL_SFC_DIR}/compute_presetup_CI.bash |& \ + tee -a ${ODL_SFC_LOG} 1>/dev/null 2>&1 + +ret_val=${PIPESTATUS[0]} +if [ $ret_val != 0 ]; then + exit $ret_val +fi + +exit 0 diff --git a/testcases/features/sfc/sfc.py b/testcases/features/sfc/sfc.py index a228ed298..8aa7bb9a0 100755 --- a/testcases/features/sfc/sfc.py +++ b/testcases/features/sfc/sfc.py @@ -4,11 +4,11 @@ import sys import time import argparse +import paramiko + import functest.utils.functest_logger as ft_logger import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as os_utils -import paramiko -from functest.utils.functest_utils import FUNCTEST_REPO as FUNCTEST_REPO parser = argparse.ArgumentParser() @@ -21,6 +21,8 @@ args = parser.parse_args() """ logging configuration """ logger = ft_logger.Logger("ODL_SFC").getLogger() +FUNCTEST_REPO = ft_utils.FUNCTEST_REPO + HOME = os.environ['HOME'] + "/" VM_BOOT_TIMEOUT = 180 @@ -56,13 +58,19 @@ def main(): # Allow any port so that tacker commands reaches the server. # This will be deleted when tacker is included in OPNFV installation + status = "PASS" + failures = 0 + start_time = time.time() + json_results = {} + ssh_options = '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' contr_cmd = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" " 'fuel node'|grep controller|awk '{print $10}'") logger.info("Executing script to get ip_server: '%s'" % contr_cmd) process = subprocess.Popen(contr_cmd, shell=True, - stdout=subprocess.PIPE) + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) ip_server = process.stdout.readline().rstrip() contr_cmd2 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" @@ -70,16 +78,27 @@ def main(): logger.info("Executing script to get ip_compute: '%s'" % contr_cmd2) process = subprocess.Popen(contr_cmd2, shell=True, - stdout=subprocess.PIPE) + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) ip_compute = process.stdout.readline().rstrip() iptable_cmd1 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" " ssh " + ip_server + " iptables -P INPUT ACCEPT ") iptable_cmd2 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" " ssh " + ip_server + " iptables -t nat -P INPUT ACCEPT ") + iptable_cmd3 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" + " ssh " + ssh_options + " " + ip_server + + " iptables -A INPUT -m state" + " --state NEW,ESTABLISHED,RELATED -j ACCEPT") + + logger.info("Changing firewall policy in controller: '%s'" % iptable_cmd1) + subprocess.call(iptable_cmd1, shell=True, stderr=subprocess.PIPE) - subprocess.call(iptable_cmd1, shell=True) - subprocess.call(iptable_cmd2, shell=True) + logger.info("Changing firewall policy in controller: '%s'" % iptable_cmd2) + subprocess.call(iptable_cmd2, shell=True, stderr=subprocess.PIPE) + + logger.info("Changing firewall policy in controller: '%s'" % iptable_cmd3) + subprocess.call(iptable_cmd2, shell=True, stderr=subprocess.PIPE) # Getting the different clients @@ -308,7 +327,7 @@ def main(): logger.info("Waiting for 60 seconds before TEST") for j in range(0, 6): - logger.info("Test starting in {0} seconds".format(str((6 - j)*10))) + logger.info("Test starting in {0} seconds".format(str((6 - j) * 10))) time.sleep(10) i = 0 @@ -326,10 +345,13 @@ def main(): logger.info('\033[92m' + "TEST 1 [PASSED] " "==> SSH BLOCKED" + '\033[0m') i = i + 1 + json_results.update({"Test 1: SSH Blocked": "Passed"}) else: logger.error('\033[91m' + "TEST 1 [FAILED] " "==> SSH NOT BLOCKED" + '\033[0m') - return + status = "FAIL" + json_results.update({"Test 1: SSH Blocked": "Failed"}) + failures += 1 except: logger.debug("Waiting for %s..." % floatip_client) time.sleep(6) @@ -346,10 +368,13 @@ def main(): logger.info('\033[92m' + "TEST 2 [PASSED] " "==> HTTP WORKS" + '\033[0m') i = i + 1 + json_results.update({"Test 2: HTTP works": "Passed"}) else: logger.error('\033[91m' + "TEST 2 [FAILED] " "==> HTTP BLOCKED" + '\033[0m') - return + status = "FAIL" + json_results.update({"Test 2: HTTP works": "Failed"}) + failures += 1 except: logger.debug("Waiting for %s..." % floatip_client) time.sleep(6) @@ -382,13 +407,16 @@ def main(): (stdin, stdout, stderr) = ssh.exec_command(command) if "timed out" in stdout.readlines()[0]: - logger.info('\033[92m' + "TEST 3 [WORKS] " + logger.info('\033[92m' + "TEST 3 [PASSED] " "==> HTTP BLOCKED" + '\033[0m') i = i + 1 + json_results.update({"Test 3: HTTP Blocked": "Passed"}) else: logger.error('\033[91m' + "TEST 3 [FAILED] " "==> HTTP NOT BLOCKED" + '\033[0m') - return + status = "FAIL" + json_results.update({"Test 3: HTTP Blocked": "Failed"}) + failures += 1 except: logger.debug("Waiting for %s..." % floatip_client) time.sleep(6) @@ -402,13 +430,16 @@ def main(): (stdin, stdout, stderr) = ssh.exec_command(command) if "succeeded" in stdout.readlines()[0]: - logger.info('\033[92m' + "TEST 4 [WORKS] " + logger.info('\033[92m' + "TEST 4 [PASSED] " "==> SSH WORKS" + '\033[0m') i = i + 1 + json_results.update({"Test 4: SSH works": "Passed"}) else: logger.error('\033[91m' + "TEST 4 [FAILED] " "==> SSH BLOCKED" + '\033[0m') - return + status = "FAIL" + json_results.update({"Test 4: SSH works": "Failed"}) + failures += 1 except: logger.debug("Waiting for %s..." % floatip_client) time.sleep(6) @@ -419,21 +450,20 @@ def main(): logger.info('\033[92m' + "SFC TEST WORKED" " :) \n" + '\033[0m') - # TODO report results to DB - # functest_utils.logger_test_results("SFC", - # "odl-sfc", - # status, details) - # see doctor, promise, domino, ... - # if args.report: - # logger.info("Pushing odl-SFC results") - # functest_utils.push_results_to_db("functest", - # "odl-sfc", - # start_time, - # stop_time, - # status, - # details) - - sys.exit(0) + if args.report: + stop_time = time.time() + json_results.update({"tests": "4", "failures": int(failures)}) + logger.debug("Promise Results json: " + str(json_results)) + ft_utils.push_results_to_db("sfc", + "functest-odl-sfc", + start_time, + stop_time, + status, + json_results) + if status == "PASS": + sys.exit(0) + else: + sys.exit(1) if __name__ == '__main__': main() diff --git a/testcases/security_scan/security_scan.py b/testcases/security_scan/security_scan.py index ac7b78ed6..98e6b7a8c 100755 --- a/testcases/security_scan/security_scan.py +++ b/testcases/security_scan/security_scan.py @@ -13,18 +13,18 @@ # all trace of the scan is removed from the remote system. -import argparse -import connect import datetime import os import sys - from ConfigParser import SafeConfigParser -from functest.utils.functest_utils import FUNCTEST_REPO as FUNCTEST_REPO + +import argparse from keystoneclient import session from keystoneclient.auth.identity import v2 from novaclient import client +import connect +import functest.utils.functest_utils as ft_utils __version__ = 0.1 __author__ = 'Luke Hinds (lhinds@redhat.com)' @@ -33,7 +33,7 @@ __url__ = 'https://wiki.opnfv.org/display/functest/Functest+Security' # Global vars INSTALLER_IP = os.getenv('INSTALLER_IP') oscapbin = 'sudo /bin/oscap' -functest_dir = '%s/testcases/security_scan/' % FUNCTEST_REPO +functest_dir = '%s/testcases/security_scan/' % ft_utils.FUNCTEST_REPO # Apex Spefic var needed to query Undercloud if os.getenv('OS_AUTH_URL') is None: diff --git a/testcases/vnf/vIMS/vIMS.py b/testcases/vnf/vIMS/vIMS.py index b72e4cd81..50aa715f4 100755 --- a/testcases/vnf/vIMS/vIMS.py +++ b/testcases/vnf/vIMS/vIMS.py @@ -19,15 +19,14 @@ import subprocess import time import argparse -import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as functest_utils -import functest.utils.openstack_utils as os_utils import keystoneclient.v2_0.client as ksclient import novaclient.client as nvclient import requests -from functest.utils.functest_utils import FUNCTEST_REPO as REPO_PATH from neutronclient.v2_0 import client as ntclient +import functest.utils.functest_logger as ft_logger +import functest.utils.functest_utils as ft_utils +import functest.utils.openstack_utils as os_utils from clearwater import clearwater from orchestrator import orchestrator @@ -48,34 +47,40 @@ args = parser.parse_args() logger = ft_logger.Logger("vIMS").getLogger() -functest_yaml = functest_utils.get_functest_yaml() - # Cloudify parameters -VIMS_DIR = (REPO_PATH + '/' + - functest_yaml.get("general").get("directories").get("dir_vIMS")) -VIMS_DATA_DIR = functest_yaml.get("general").get( - "directories").get("dir_vIMS_data") + "/" -VIMS_TEST_DIR = functest_yaml.get("general").get( - "directories").get("dir_repo_vims_test") + "/" -DB_URL = functest_yaml.get("results").get("test_db_url") - -TENANT_NAME = functest_yaml.get("vIMS").get("general").get("tenant_name") -TENANT_DESCRIPTION = functest_yaml.get("vIMS").get( - "general").get("tenant_description") -IMAGES = functest_yaml.get("vIMS").get("general").get("images") - -CFY_MANAGER_BLUEPRINT = functest_yaml.get( - "vIMS").get("cloudify").get("blueprint") -CFY_MANAGER_REQUIERMENTS = functest_yaml.get( - "vIMS").get("cloudify").get("requierments") -CFY_INPUTS = functest_yaml.get("vIMS").get("cloudify").get("inputs") - -CW_BLUEPRINT = functest_yaml.get("vIMS").get("clearwater").get("blueprint") -CW_DEPLOYMENT_NAME = functest_yaml.get("vIMS").get( - "clearwater").get("deployment-name") -CW_INPUTS = functest_yaml.get("vIMS").get("clearwater").get("inputs") -CW_REQUIERMENTS = functest_yaml.get("vIMS").get( - "clearwater").get("requierments") +VIMS_DIR = ft_utils.FUNCTEST_REPO + '/' + \ + ft_utils.get_functest_config('general.directories.dir_vIMS') + +VIMS_DATA_DIR = \ + ft_utils.get_functest_config('general.directories.dir_vIMS_data') + \ + '/' +VIMS_TEST_DIR = \ + ft_utils.get_functest_config('general.directories.dir_repo_vims_test') + \ + '/' +DB_URL = \ + ft_utils.get_functest_config('results.test_db_url') + +TENANT_NAME = \ + ft_utils.get_functest_config('vIMS.general.tenant_name') +TENANT_DESCRIPTION = \ + ft_utils.get_functest_config('vIMS.general.tenant_description') +IMAGES = \ + ft_utils.get_functest_config('vIMS.general.images') + +CFY_MANAGER_BLUEPRINT = \ + ft_utils.get_functest_config('vIMS.cloudify.blueprint') +CFY_MANAGER_REQUIERMENTS = \ + ft_utils.get_functest_config('vIMS.cloudify.requierments') +CFY_INPUTS = ft_utils.get_functest_config('vIMS.cloudify.inputs') + +CW_BLUEPRINT = \ + ft_utils.get_functest_config('vIMS.clearwater.blueprint') +CW_DEPLOYMENT_NAME = \ + ft_utils.get_functest_config('vIMS.clearwater.deployment-name') +CW_INPUTS = \ + ft_utils.get_functest_config('vIMS.clearwater.inputs') +CW_REQUIERMENTS = \ + ft_utils.get_functest_config('vIMS.clearwater.requierments') CFY_DEPLOYMENT_DURATION = 0 CW_DEPLOYMENT_DURATION = 0 @@ -91,7 +96,7 @@ def download_and_add_image_on_glance(glance, image_name, image_url): if not os.path.exists(dest_path): os.makedirs(dest_path) file_name = image_url.rsplit('/')[-1] - if not functest_utils.download_url(image_url, dest_path): + if not ft_utils.download_url(image_url, dest_path): logger.error("Failed to download image %s" % file_name) return False @@ -112,12 +117,12 @@ def step_failure(step_name, error_msg): stop_time = time.time() if step_name == "sig_test": status = "PASS" - functest_utils.push_results_to_db("functest", - "vims", - TESTCASE_START_TIME, - stop_time, - status, - RESULTS) + ft_utils.push_results_to_db("functest", + "vims", + TESTCASE_START_TIME, + stop_time, + status, + RESULTS) exit(-1) @@ -183,7 +188,7 @@ def test_clearwater(): logger.info("vIMS functional test Start Time:'%s'" % ( datetime.datetime.fromtimestamp(start_time_ts).strftime( '%Y-%m-%d %H:%M:%S'))) - nameservers = functest_utils.get_resolvconf_ns() + nameservers = ft_utils.get_resolvconf_ns() resolvconf = "" for ns in nameservers: resolvconf += "\nnameserver " + ns @@ -233,12 +238,12 @@ def test_clearwater(): except: logger.error("Unable to set test status") - functest_utils.push_results_to_db("functest", - "vims", - TESTCASE_START_TIME, - end_time_ts, - status, - RESULTS) + ft_utils.push_results_to_db("functest", + "vims", + TESTCASE_START_TIME, + end_time_ts, + status, + RESULTS) try: os.remove(VIMS_TEST_DIR + "temp.json") @@ -386,7 +391,7 @@ def main(): cfy.set_external_network_name(ext_net) - ns = functest_utils.get_resolvconf_ns() + ns = ft_utils.get_resolvconf_ns() if ns: cfy.set_nameservers(ns) @@ -397,10 +402,10 @@ def main(): logger.info("Prepare virtualenv for cloudify-cli") cmd = "chmod +x " + VIMS_DIR + "create_venv.sh" - functest_utils.execute_command(cmd) + ft_utils.execute_command(cmd) time.sleep(3) cmd = VIMS_DIR + "create_venv.sh " + VIMS_DATA_DIR - functest_utils.execute_command(cmd) + ft_utils.execute_command(cmd) cfy.download_manager_blueprint( CFY_MANAGER_BLUEPRINT['url'], CFY_MANAGER_BLUEPRINT['branch']) diff --git a/testcases/vnf/vRNC/parser.py b/testcases/vnf/vRNC/parser.py index 5ff207c14..0320b104d 100755 --- a/testcases/vnf/vRNC/parser.py +++ b/testcases/vnf/vRNC/parser.py @@ -27,10 +27,10 @@ parser.add_argument("-r", "--report", action="store_true") args = parser.parse_args() -PARSER_REPO = functest_utils.get_parameter_from_yaml( - 'general.directories.dir_repo_parser') -RESULTS_DIR = functest_utils.get_parameter_from_yaml( - 'general.directories.dir_results') +PARSER_REPO = \ + functest_utils.get_functest_config('general.directories.dir_repo_parser') +RESULTS_DIR = \ + functest_utils.get_functest_config('general.directories.dir_results') logger = ft_logger.Logger("parser").getLogger() diff --git a/utils/functest_utils.py b/utils/functest_utils.py index 644ad1a1b..717e4b2ce 100644 --- a/utils/functest_utils.py +++ b/utils/functest_utils.py @@ -7,23 +7,21 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 # -from datetime import datetime as dt import json import os import re -import requests import shutil import subprocess import sys import urllib2 - -import functest.ci.tier_builder as tb -import functest.utils.functest_logger as ft_logger +from datetime import datetime as dt import dns.resolver -from git import Repo +import requests import yaml +from git import Repo +import functest.utils.functest_logger as ft_logger logger = ft_logger.Logger("functest_utils").getLogger() @@ -152,9 +150,7 @@ def get_db_url(): """ Returns DB URL """ - functest_yaml = get_functest_yaml() - db_url = functest_yaml.get("results").get("test_db_url") - return db_url + return get_functest_config('results.test_db_url') def logger_test_results(project, case_name, status, details): @@ -331,10 +327,8 @@ def get_deployment_dir(): """ Returns current Rally deployment directory """ - functest_yaml = get_functest_yaml() - deployment_name = functest_yaml.get("rally").get("deployment_name") - rally_dir = functest_yaml.get("general").get("directories").get( - "dir_rally_inst") + deployment_name = get_functest_config('rally.deployment_name') + rally_dir = get_functest_config('general.directories.dir_rally_inst') cmd = ("rally deployment list | awk '/" + deployment_name + "/ {print $2}'") p = subprocess.Popen(cmd, shell=True, @@ -350,15 +344,16 @@ def get_deployment_dir(): def get_criteria_by_test(testname): - criteria = "" - file = get_testcases_file() - tiers = tb.TierBuilder("", "", file) - for tier in tiers.get_tiers(): - for test in tier.get_tests(): - if test.get_name() == testname: - criteria = test.get_criteria() + with open(get_testcases_file()) as f: + testcases_yaml = yaml.safe_load(f) + + for dic_tier in testcases_yaml.get("tiers"): + for dic_testcase in dic_tier['testcases']: + if dic_testcase['name'] == testname: + return dic_testcase['criteria'] - return criteria + logger.error('Project %s is not defined in testcases.yaml' % testname) + return None # ---------------------------------------------------------- @@ -366,18 +361,16 @@ def get_criteria_by_test(testname): # YAML UTILS # # ----------------------------------------------------------- -def get_parameter_from_yaml(parameter, file=None): +def get_parameter_from_yaml(parameter, file): """ - Returns the value of a given parameter in config_functest.yaml + Returns the value of a given parameter in file.yaml parameter must be given in string format with dots Example: general.openstack.image_name """ - if file is None: - file = os.environ["CONFIG_FUNCTEST_YAML"] with open(file) as f: - functest_yaml = yaml.safe_load(f) + file_yaml = yaml.safe_load(f) f.close() - value = functest_yaml + value = file_yaml for element in parameter.split("."): value = value.get(element) if value is None: @@ -386,6 +379,11 @@ def get_parameter_from_yaml(parameter, file=None): return value +def get_functest_config(parameter): + yaml_ = os.environ["CONFIG_FUNCTEST_YAML"] + return get_parameter_from_yaml(parameter, yaml_) + + def check_success_rate(case_name, success_rate): success_rate = float(success_rate) criteria = get_criteria_by_test(case_name) diff --git a/utils/openstack_clean.py b/utils/openstack_clean.py index 3b937c917..bf582dea2 100755 --- a/utils/openstack_clean.py +++ b/utils/openstack_clean.py @@ -29,8 +29,8 @@ import yaml logger = ft_logger.Logger("openstack_clean").getLogger() -OS_SNAPSHOT_FILE = ft_utils.get_parameter_from_yaml( - "general.openstack.snapshot_file") +OS_SNAPSHOT_FILE = \ + ft_utils.get_functest_config("general.openstack.snapshot_file") def separator(): @@ -233,7 +233,7 @@ def remove_ports(neutron_client, ports, network_ids): except: logger.debug(" > WARNING: Port %s does not contain fixed_ips" % port_id) - print port + logger.info(port) router_id = port['device_id'] if len(port['fixed_ips']) == 0 and router_id == '': logger.debug("Removing port %s ..." % port_id) diff --git a/utils/openstack_snapshot.py b/utils/openstack_snapshot.py index 236cf74e5..560cadbdb 100755 --- a/utils/openstack_snapshot.py +++ b/utils/openstack_snapshot.py @@ -29,8 +29,8 @@ import yaml logger = ft_logger.Logger("openstack_snapshot").getLogger() -OS_SNAPSHOT_FILE = ft_utils.get_parameter_from_yaml( - "general.openstack.snapshot_file") +OS_SNAPSHOT_FILE = \ + ft_utils.get_functest_config("general.openstack.snapshot_file") def separator(): diff --git a/utils/openstack_utils.py b/utils/openstack_utils.py index ff9b54a58..5a4775d3a 100755 --- a/utils/openstack_utils.py +++ b/utils/openstack_utils.py @@ -16,6 +16,7 @@ import time from cinderclient import client as cinderclient import functest.utils.functest_logger as ft_logger +import functest.utils.functest_utils as ft_utils from glanceclient import client as glanceclient from keystoneclient.v2_0 import client as keystoneclient from neutronclient.v2_0 import client as neutronclient @@ -235,6 +236,14 @@ def get_hypervisors(nova_client): def create_flavor(nova_client, flavor_name, ram, disk, vcpus): try: flavor = nova_client.flavors.create(flavor_name, ram, vcpus, disk) + try: + extra_specs = ft_utils.get_functest_config( + 'general.flavor_extra_specs') + flavor.update(extra_specs) + except ValueError: + # flavor extra specs are not configured, therefore skip the update + pass + except Exception, e: logger.error("Error [create_flavor(nova_client, '%s', '%s', '%s', " "'%s')]: %s" % (flavor_name, ram, disk, vcpus, e)) @@ -718,6 +727,18 @@ def update_bgpvpn(neutron_client, bgpvpn_id, **kwargs): def delete_bgpvpn(neutron_client, bgpvpn_id): return neutron_client.delete_bgpvpn(bgpvpn_id) + +def get_bgpvpn(neutron_client, bgpvpn_id): + return neutron_client.show_bgpvpn(bgpvpn_id) + + +def get_bgpvpn_routers(neutron_client, bgpvpn_id): + return get_bgpvpn(neutron_client, bgpvpn_id)['bgpvpn']['routers'] + + +def get_bgpvpn_networks(neutron_client, bgpvpn_id): + return get_bgpvpn(neutron_client, bgpvpn_id)['bgpvpn']['networks'] + # ********************************************* # SEC GROUPS # ********************************************* @@ -902,11 +923,19 @@ def create_glance_image(glance_client, image_name, file_path, disk="qcow2", if logger: logger.info("Creating image '%s' from '%s'..." % (image_name, file_path)) + try: + properties = ft_utils.get_functest_config( + 'general.image_properties') + except ValueError: + # image properties are not configured + # therefore don't add any properties + properties = {} with open(file_path) as fimage: image = glance_client.images.create(name=image_name, is_public=public, disk_format=disk, container_format=container, + properties=properties, data=fimage) image_id = image.id return image_id |