diff options
23 files changed, 450 insertions, 31 deletions
diff --git a/jjb/compass4nfv/compass-ci-jobs.yml b/jjb/compass4nfv/compass-ci-jobs.yml index eb9113114..b70bfc67b 100644 --- a/jjb/compass4nfv/compass-ci-jobs.yml +++ b/jjb/compass4nfv/compass-ci-jobs.yml @@ -248,6 +248,7 @@ name: COMPASS_OPENSTACK_VERSION choices: - 'mitaka' + - 'newton' - 'liberty' - choice: name: COMPASS_OS_VERSION_OPTION diff --git a/jjb/compass4nfv/compass-deploy.sh b/jjb/compass4nfv/compass-deploy.sh index 65e44b670..256717953 100644 --- a/jjb/compass4nfv/compass-deploy.sh +++ b/jjb/compass4nfv/compass-deploy.sh @@ -33,6 +33,11 @@ if [[ "${COMPASS_OS_VERSION_OPTION}" = "xenial" ]] && [[ "${OPENSTACK_VERSION}" export OPENSTACK_VERSION=${OPENSTACK_VERSION}_${COMPASS_OS_VERSION_OPTION} export OS_VERSION=${COMPASS_OS_VERSION_OPTION} fi +if [[ "${OPENSTACK_VERSION}" = "newton" ]]; then + export OS_VERSION="xenial" + export OPENSTACK_VERSION=${OPENSTACK_VERSION}_${OS_VERSION} +fi + if [[ "${DEPLOY_SCENARIO}" =~ "-ocl" ]]; then export NETWORK_CONF_FILE=network_ocl.yml diff --git a/jjb/compass4nfv/compass-project-jobs.yml b/jjb/compass4nfv/compass-project-jobs.yml index 3a52e91c9..50ff072fb 100644 --- a/jjb/compass4nfv/compass-project-jobs.yml +++ b/jjb/compass4nfv/compass-project-jobs.yml @@ -125,6 +125,7 @@ name: COMPASS_OPENSTACK_VERSION choices: - 'mitaka' + - 'newton' - 'liberty' - choice: name: COMPASS_OS_VERSION diff --git a/jjb/compass4nfv/compass-verify-jobs.yml b/jjb/compass4nfv/compass-verify-jobs.yml index 82e3dfdf2..87c19a9c5 100644 --- a/jjb/compass4nfv/compass-verify-jobs.yml +++ b/jjb/compass4nfv/compass-verify-jobs.yml @@ -243,6 +243,7 @@ name: COMPASS_OPENSTACK_VERSION choices: - 'mitaka' + - 'newton' - 'liberty' - choice: name: COMPASS_OS_VERSION diff --git a/jjb/daisy4nfv/daisy4nfv-virtual-deploy.sh b/jjb/daisy4nfv/daisy4nfv-virtual-deploy.sh index 8936be6c4..9de494fc2 100755 --- a/jjb/daisy4nfv/daisy4nfv-virtual-deploy.sh +++ b/jjb/daisy4nfv/daisy4nfv-virtual-deploy.sh @@ -4,3 +4,24 @@ echo "--------------------------------------------------------" echo "This is diasy4nfv virtual deploy job!" echo "--------------------------------------------------------" +cd $WORKSPACE + +if [[ "$NODE_NAME" =~ "-virtual" ]]; then + export NETWORK_CONF=./deploy/config/vm_environment/$NODE_NAME/network.yml + export DHA_CONF=./deploy/config/vm_environment/$NODE_NAME/deploy.yml +else + exit 1 +fi + +./ci/deploy/deploy.sh ${DHA_CONF} ${NETWORK_CONF} + +if [ $? -ne 0 ]; then + echo "depolyment failed!" + deploy_ret=1 +fi + +echo +echo "--------------------------------------------------------" +echo "Done!" + +exit $deploy_ret diff --git a/jjb/fuel/fuel-download-artifact.sh b/jjb/fuel/fuel-download-artifact.sh index 3f691d821..fd824ca44 100755 --- a/jjb/fuel/fuel-download-artifact.sh +++ b/jjb/fuel/fuel-download-artifact.sh @@ -16,11 +16,11 @@ set -o pipefail if [[ "$JOB_NAME" =~ "merge" ]]; then echo "Downloading http://$GS_URL/opnfv-gerrit-$GERRIT_CHANGE_NUMBER.properties" # get the properties file for the Fuel ISO built for a merged change - curl -s -o $WORKSPACE/latest.properties http://$GS_URL/opnfv-gerrit-$GERRIT_CHANGE_NUMBER.properties + curl -L -s -o $WORKSPACE/latest.properties http://$GS_URL/opnfv-gerrit-$GERRIT_CHANGE_NUMBER.properties else # get the latest.properties file in order to get info regarding latest artifact echo "Downloading http://$GS_URL/latest.properties" - curl -s -o $WORKSPACE/latest.properties http://$GS_URL/latest.properties + curl -L -s -o $WORKSPACE/latest.properties http://$GS_URL/latest.properties fi # check if we got the file diff --git a/jjb/opnfv/installer-params.yml b/jjb/opnfv/installer-params.yml index ec0b86170..55f4769b7 100644 --- a/jjb/opnfv/installer-params.yml +++ b/jjb/opnfv/installer-params.yml @@ -59,7 +59,7 @@ parameters: - string: name: INSTALLER_IP - default: '192.168.Y.Y' + default: '192.168.122.5' description: 'IP of the installer' - string: name: INSTALLER_TYPE @@ -67,11 +67,11 @@ description: 'Installer used for deploying OPNFV on this POD' - string: name: OS_RELEASE - default: 'mitaka' - description: 'OpenStack release (liberty|mitaka)' + default: 'newton' + description: 'OpenStack release (mitaka|newton)' - string: name: EXTERNAL_NETWORK - default: ext-net4 + default: ext-net description: "External network used for Floating ips." - string: name: LAB_CONFIG @@ -84,7 +84,7 @@ - string: name: UBUNTU_DISTRO default: 'xenial' - description: "Ubuntu distribution to use for Openstack (trusty|xenial)" + description: "Ubuntu distribution to use for Openstack (xenial)" - string: name: CPU_ARCHITECTURE default: 'amd64' diff --git a/jjb/vswitchperf/vswitchperf.yml b/jjb/vswitchperf/vswitchperf.yml index 3f7f6bf2d..5f952de00 100644 --- a/jjb/vswitchperf/vswitchperf.yml +++ b/jjb/vswitchperf/vswitchperf.yml @@ -63,11 +63,12 @@ concurrent: true properties: - - throttle: - enabled: true - max-total: 3 - max-per-node: 2 - option: 'project' + - build-blocker: + use-build-blocker: true + blocking-jobs: + - 'vswitchperf-verify-.*' + - 'vswitchperf-merge-.*' + block-level: 'NODE' parameters: - project-parameter: @@ -125,11 +126,12 @@ concurrent: true properties: - - throttle: - enabled: true - max-total: 3 - max-per-node: 2 - option: 'project' + - build-blocker: + use-build-blocker: true + blocking-jobs: + - 'vswitchperf-verify-.*' + - 'vswitchperf-merge-.*' + block-level: 'NODE' parameters: - project-parameter: diff --git a/modules/README.rst b/modules/README.rst index de9ff559f..caec46b1d 100644 --- a/modules/README.rst +++ b/modules/README.rst @@ -5,6 +5,8 @@ as follows: from opnfv.utils import SSHUtils from opnfv.utils import OPNFVLogger + from opnfv.utils import OPNFVException + from opnfv.utils import constants For further information about how to use this modules directory, contact: fatih.degirmenci@ericsson.com diff --git a/modules/opnfv/installer_adapters/InstallerHandler.py b/modules/opnfv/installer_adapters/InstallerHandler.py index b81b806ca..e353ef3f4 100644 --- a/modules/opnfv/installer_adapters/InstallerHandler.py +++ b/modules/opnfv/installer_adapters/InstallerHandler.py @@ -7,10 +7,10 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## -from FuelAdapter import FuelAdapter -from ApexAdapter import ApexAdapter -from CompassAdapter import CompassAdapter -from JoidAdapter import JoidAdapter +from opnfv.installer_adapters.fuel.FuelAdapter import FuelAdapter +from opnfv.installer_adapters.apex.ApexAdapter import ApexAdapter +from opnfv.installer_adapters.compass.CompassAdapter import CompassAdapter +from opnfv.installer_adapters.joid.JoidAdapter import JoidAdapter INSTALLERS = ["fuel", "apex", "compass", "joid"] diff --git a/modules/opnfv/installer_adapters/fuel/FuelAdapter.py b/modules/opnfv/installer_adapters/fuel/FuelAdapter.py index 95b2ab673..6f079404c 100644 --- a/modules/opnfv/installer_adapters/fuel/FuelAdapter.py +++ b/modules/opnfv/installer_adapters/fuel/FuelAdapter.py @@ -8,8 +8,8 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## -import opnfv.modules.utils.SSHUtils as ssh_utils -import opnfv.modules.utils.OPNFVLogger as logger +import opnfv.utils.SSHUtils as ssh_utils +import opnfv.utils.OPNFVLogger as logger class FuelAdapter: diff --git a/modules/opnfv/installer_adapters/fuel/example.py b/modules/opnfv/installer_adapters/fuel/example.py index 804d79c3d..7fea4dfd7 100644 --- a/modules/opnfv/installer_adapters/fuel/example.py +++ b/modules/opnfv/installer_adapters/fuel/example.py @@ -1,12 +1,12 @@ # This is an example of usage of this Tool # Author: Jose Lausuch (jose.lausuch@ericsson.com) -from InstallerHandler import InstallerHandler +import opnfv.installer_adapters.InstallerHandler as ins_handler -fuel_handler = InstallerHandler(installer='fuel', - installer_ip='10.20.0.2', - installer_user='root', - installer_pwd='r00tme') +fuel_handler = ins_handler.InstallerHandler(installer='fuel', + installer_ip='10.20.0.2', + installer_user='root', + installer_pwd='r00tme') print("Nodes in cluster 1:\n%s\n" % fuel_handler.get_nodes(options={'cluster': '1'})) print("Nodes in cluster 2:\n%s\n" % diff --git a/modules/opnfv/utils/Connection.py b/modules/opnfv/utils/Connection.py new file mode 100644 index 000000000..a3be51409 --- /dev/null +++ b/modules/opnfv/utils/Connection.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Orange and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 + + +import os +import time + + +class Connection(object): + + def __init__(self): + pass + + def verify_connectivity(self, target): + for x in range(0, 10): + ping_cmd = ("ping -c 1 -W 1 %s >/dev/null" % target) + response = os.system(ping_cmd) + if response == 0: + return os.EX_OK + time.sleep(1) + return os.EX_UNAVAILABLE + + def check_internet_access(self, url="www.google.com"): + return self.verify_connectivity(url) diff --git a/modules/opnfv/utils/Credentials.py b/modules/opnfv/utils/Credentials.py new file mode 100644 index 000000000..1882692b3 --- /dev/null +++ b/modules/opnfv/utils/Credentials.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Orange and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Usage example: +# from opnfv.utils.Credentials import Credentials as credentials +# credentials("fuel", "10.20.0.2", "root", "r00tme").fetch('./openrc') +# + +import os + +import opnfv.installer_adapters.InstallerHandler as ins_handler +import opnfv.utils.Connection as con +import opnfv.utils.OPNFVLogger as logger + + +class Credentials(object): + + def __init__(self, installer, ip, user, password=None): + self.installer = installer + self.ip = ip + self.logger = logger.Logger("Credentials", level="DEBUG").getLogger() + self.connection = con.Connection() + + if self.__check_installer_name(self.installer) != os.EX_OK: + self.logger.error("Installer %s not supported!" % self.installer) + return os.EX_CONFIG + else: + self.logger.debug("Installer %s supported." % self.installer) + + if self.connection.verify_connectivity(self.ip) != os.EX_OK: + self.logger.error("Installer %s not reachable!" % self.ip) + return os.EX_UNAVAILABLE + else: + self.logger.debug("IP %s is reachable!" % self.ip) + + self.logger.debug( + "Trying to stablish ssh connection to %s ..." % self.ip) + self.handler = ins_handler.InstallerHandler(installer, + ip, + user, + password) + + def __check_installer_name(self, installer): + if installer not in ("apex", "compass", "fuel", "joid"): + return os.EX_CONFIG + else: + return os.EX_OK + + def __check_path(self, path): + try: + with open(path, 'a'): + os.utime(path, None) + return os.EX_OK + except IOError as e: + self.logger.error(e) + return os.EX_IOERR + + def __fetch_creds_apex(self, target_path): + # TODO + pass + + def __fetch_creds_compass(self, target_path): + # TODO + pass + + def __fetch_creds_fuel(self, target_path): + creds_file = '/root/openrc' + try: + self.handler.get_file_from_controller(creds_file, target_path) + except Exception, e: + self.logger.error( + "Cannot get %s from controller. %e" % (creds_file, e)) + pass + + def __fetch_creds_joid(self, target_path): + # TODO + pass + + def fetch(self, target_path): + if self.__check_path(target_path) != os.EX_OK: + self.logger.error( + "Target path %s does not exist!" % target_path) + return os.EX_IOERR + else: + self.logger.debug("Target path correct.") + + self.logger.info("Fetching credentials from the deployment...") + if self.installer == "apex": + self.__fetch_creds_apex(target_path) + elif self.installer == "compass": + self.__fetch_creds_compass(target_path) + elif self.installer == "fuel": + self.__fetch_creds_fuel(target_path) + elif self.installer == "joid": + self.__fetch_creds_joid(target_path) diff --git a/modules/opnfv/utils/OPNFVExceptions.py b/modules/opnfv/utils/OPNFVExceptions.py new file mode 100644 index 000000000..03b3ea981 --- /dev/null +++ b/modules/opnfv/utils/OPNFVExceptions.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Orange and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# This class defines Python OPNFV exceptions +# + + +class OPNFVException(Exception): + def __call__(self, *args): + return self.__class__(*(self.args + args)) + + +# ************************************ +# Generic +# ************************************ +class OPNFVSUTNotReachable(OPNFVException): + """Target System Under Test is not reachable""" + pass + + +class OPNFVCiExecutionError(OPNFVException): + """Error occurs during CI exection""" + pass + + +class TestDashboardError(OPNFVException): + """Impossible to report results to dashboard""" + pass + + +class TestReportingError(OPNFVException): + """Impossible to report results to reporting""" + pass + + +# ************************************ +# Exceptions related to test DB +# ************************************ +class TestDbNotReachable(OPNFVException): + """Test database is not reachable""" + pass + + +class UnknownScenario(OPNFVException): + """Test scenario is unknown""" + pass + + +class UnknownPod(OPNFVException): + """Test POD is unknown""" + pass + + +class UnknownProject(OPNFVException): + """Project is unknown""" + pass + + +class UnknownTestCase(OPNFVException): + """Test case is unknown""" + pass + + +class UnknownVersion(OPNFVException): + """Version is unknown""" + pass + + +class UnknownInstaller(OPNFVException): + """Installer is not supported""" + pass + + +# ******************* +# Test project errors +# ******************* +class FunctestExecutionError(OPNFVException): + """Internal Functest error""" + pass + + +class YardstickExecutionError(OPNFVException): + """Internal Yardstick error""" + pass + + +# ********************************** +# Errors related to Feature projects +# ********************************** +class TestCaseNotRunnable(OPNFVException): + """test case incompatible with SUT, scenario, installer""" + pass + + +class FeatureTestIntegrationError(OPNFVException): + """Impossible to integrate Feature test""" + pass + + +class FeatureTestExecutionError(OPNFVException): + """Error during Feature test execution""" + pass + + +# ********************************* +# Errors related to VNF on boarding +# ********************************* +class VNFTestNotRunnable(OPNFVException): + """VNF test is not compatible with SUT, scenario, installer""" + pass + + +class VNFIntegrationError(OPNFVException): + """Impossible to integrate the VNF test""" + pass + + +class VNFExecutionError(OPNFVException): + """Error during VNF test execution""" + pass diff --git a/modules/opnfv/utils/SSHUtils.py b/modules/opnfv/utils/SSHUtils.py index 2f48addbf..6c794c274 100644 --- a/modules/opnfv/utils/SSHUtils.py +++ b/modules/opnfv/utils/SSHUtils.py @@ -10,7 +10,7 @@ import paramiko -import opnfv.modules.utils.OPNFVLogger as OPNFVLogger +import opnfv.utils.OPNFVLogger as OPNFVLogger import os logger = OPNFVLogger.Logger('SSHUtils').getLogger() @@ -68,7 +68,7 @@ class JumpHostHopClient(paramiko.SSHClient): ''' def __init__(self, *args, **kwargs): - self.logger = rl.Logger("JumpHostHopClient").getLogger() + self.logger = OPNFVLogger.Logger("JumpHostHopClient").getLogger() self.jumphost_ssh = None self.jumphost_transport = None self.jumphost_channel = None diff --git a/modules/opnfv/utils/constants.py b/modules/opnfv/utils/constants.py new file mode 100644 index 000000000..29f0d02c5 --- /dev/null +++ b/modules/opnfv/utils/constants.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Orange and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 + +INSTALLERS = ['apex', 'fuel', 'compass', 'joid'] +VERSIONS = ['arno', 'brahmaputra', 'colorado', 'danube'] + +EXIT_OK = 0 +EXIT_RUN_ERROR = -1 +EXIT_PUSH_TO_TEST_DB_ERROR = -2 diff --git a/modules/run_unit_tests.sh b/modules/run_unit_tests.sh new file mode 100755 index 000000000..df511ce0c --- /dev/null +++ b/modules/run_unit_tests.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -o errexit +set -o pipefail + +# Either Workspace is set (CI) +if [ -z $WORKSPACE ] +then + WORKSPACE="." +fi + + +# *************** +# Run unit tests +# *************** +echo "Running unit tests..." + +# start vitual env +virtualenv $WORKSPACE/modules_venv +source $WORKSPACE/modules_venv/bin/activate + +# install python packages +easy_install -U setuptools +easy_install -U pip +pip install $WORKSPACE + + +# unit tests +nosetests --with-xunit \ + --cover-package=opnfv \ + --with-coverage \ + --cover-xml \ + --cover-html \ + tests/unit +rc=$? + +deactivate diff --git a/modules/setup.py b/modules/setup.py index 26f8a6eaa..8ac5ceac3 100644 --- a/modules/setup.py +++ b/modules/setup.py @@ -17,5 +17,9 @@ setup( package_data={ }, url="https://www.opnfv.org", - install_requires=["paramiko>=2.0.1"] + install_requires=["paramiko>=2.0.1", + "mock==1.3.0", + "nose==1.3.7", + "coverage==4.1", + "requests==2.9.1"] ) diff --git a/modules/tests/__init__.py b/modules/tests/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/modules/tests/__init__.py diff --git a/modules/tests/unit/__init__.py b/modules/tests/unit/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/modules/tests/unit/__init__.py diff --git a/modules/tests/unit/utils/__init__.py b/modules/tests/unit/utils/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/modules/tests/unit/utils/__init__.py diff --git a/modules/tests/unit/utils/test_OPNFVExceptions.py b/modules/tests/unit/utils/test_OPNFVExceptions.py new file mode 100644 index 000000000..fca927b58 --- /dev/null +++ b/modules/tests/unit/utils/test_OPNFVExceptions.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Orange and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0import requests +import unittest +import requests + +from opnfv.utils import OPNFVExceptions + + +def base_function(): + raise OPNFVExceptions.TestDbNotReachable('Test database is not reachable') + + +def base_function_wrong(): + raise OPNFVExceptions.NotSelfDefinedException + + +def db_connectivity(): + url = 'http://testresults.opnfv2.org/test/api/v1/projects/functest/cases' + r = requests.get(url) + if r.status_code is not 200: + raise OPNFVExceptions.TestDbNotReachable('Database not found') + + +def project_unknown(): + url = 'http://testresults.opnfv.org/test/api/v1/projects/functest2/cases' + r = requests.get(url) + if len(r.json()['testcases']) is 0: + raise OPNFVExceptions.UnknownProject + + +class TestBasicRaise(unittest.TestCase): + def test(self): + with self.assertRaises(Exception) as context: + base_function() + self.assertTrue('Test database is not reachable' in context.exception) + + +class TestWrongRaise(unittest.TestCase): + def test(self): + try: + base_function_wrong() + except OPNFVExceptions.OPNFVException: + assert(False) + except AttributeError: + assert(True) + + +class TestCaseDBNotReachable(unittest.TestCase): + def test(self): + with self.assertRaises(Exception) as context: + db_connectivity() + self.assertTrue('Database not found' in context.exception) + + +class TestUnkownProject(unittest.TestCase): + def test(self): + try: + project_unknown() + except OPNFVExceptions.TestDashboardError: + # should not be there + assert(False) + except OPNFVExceptions.UnknownProject: + assert(True) + except Exception: + assert(False) + +if __name__ == '__main__': + unittest.main() |