diff options
46 files changed, 470 insertions, 781 deletions
@@ -9,7 +9,8 @@ docker/healthcheck \ docker/smoke \ docker/features \ docker/components \ -docker/vnf" +docker/vnf \ +docker/parser" (cd docker && docker build -t "${repo}/functest" .) docker push "${repo}/functest" diff --git a/docker/Dockerfile b/docker/Dockerfile index 66bd31ac9..6e5161c34 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -14,9 +14,10 @@ LABEL version="0.1" description="OPNFV Functest Docker container" # Environment variables ARG BRANCH=master ARG RALLY_TAG=stable/0.9 -ARG ODL_TAG=release/carbon +ARG ODL_TAG=35e415b6873b39d72775c88a337e92dac26012e2 ARG OPENSTACK_TAG=stable/ocata ARG VIMS_TAG=stable +ARG REFSTACK_TAG=4e187b07672dd1c41cb7c94658f1c91edebf53a2 ARG REPOS_DIR=/home/opnfv/repos ARG FUNCTEST_BASE_DIR=/home/opnfv/functest ARG FUNCTEST_CONF_DIR=${FUNCTEST_BASE_DIR}/conf @@ -50,6 +51,7 @@ libzmq3-dev \ python-dev \ python-mock \ python-pip \ +python3 \ postgresql \ ruby \ ruby-dev \ @@ -77,24 +79,30 @@ RUN wget -q -O- https://git.openstack.org/cgit/openstack/requirements/plain/uppe > upper-constraints.txt && \ pip install --src /src -cupper-constraints.txt \ -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \ + -e git+https://github.com/openstack/requirements@stable/ocata#egg=openstack_requirements && \ + git clone --depth 1 https://github.com/openstack/rally.git -b $RALLY_TAG /src/rally && \ + update-requirements -s --source /src/openstack-requirements /src/rally && \ + git clone --depth 1 https://github.com/openstack/refstack-client.git /src/refstack-client && \ + (cd src/refstack-client && git checkout -b $REFSTACK_TAG) && \ + update-requirements -s --source /src/openstack-requirements /src/refstack-client && \ + pip install --src /src -cupper-constraints.txt \ + -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \ + /src/rally -e/src/refstack-client && \ + pip install --src /src -cupper-constraints.txt \ + -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \ git+https://gerrit.opnfv.org/gerrit/functest@$BRANCH#egg=functest \ -rthirdparty-requirements.txt && \ - git clone --depth 1 https://github.com/openstack/rally.git -b $RALLY_TAG /src/rally && \ - update-requirements -s --source /src/openstack-requirements /src/rally/ && \ - pip install --no-cache-dir --src /src -cupper-constraints.txt \ - -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH /src/rally/ && \ mkdir -p /etc/rally && \ printf "[database]\nconnection = 'sqlite:////var/lib/rally/database/rally.sqlite'" > /etc/rally/rally.conf && \ mkdir -p /var/lib/rally/database && rally-manage db create && \ rm thirdparty-requirements.txt upper-constraints.txt # OPNFV repositories -RUN git clone --depth 1 -b $BRANCH https://gerrit.opnfv.org/gerrit/domino /src/domino -RUN git clone --depth 1 -b $BRANCH https://gerrit.opnfv.org/gerrit/doctor ${REPOS_DIR}/doctor RUN git clone --depth 1 -b $BRANCH https://gerrit.opnfv.org/gerrit/fds /src/fds # other repositories -RUN git clone --depth 1 -b $ODL_TAG https://git.opendaylight.org/gerrit/p/integration/test.git /src/odl_test +RUN git clone --depth 1 https://git.opendaylight.org/gerrit/p/integration/test.git /src/odl_test && \ + (cd src/odl_test && git checkout -b $ODL_TAG) RUN git clone --depth 1 -b $VIMS_TAG https://github.com/boucherv-orange/clearwater-live-test /src/vims-test # Install tempest venv and create symlink for running refstack-client @@ -109,3 +117,5 @@ RUN sh -c 'curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -' \ && cd /src/promise/source && npm install RUN echo ". ${FUNCTEST_DIR}/cli/functest-complete.sh" >> /root/.bashrc + +CMD ["functest_restapi"] diff --git a/docker/core/Dockerfile b/docker/core/Dockerfile index 66117092b..c5766da30 100644 --- a/docker/core/Dockerfile +++ b/docker/core/Dockerfile @@ -15,11 +15,14 @@ RUN apk --no-cache add --update \ > upper-constraints.txt && \ pip install --no-cache-dir --src /src -cupper-constraints.txt \ -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \ - git+https://gerrit.opnfv.org/gerrit/functest@$BRANCH#egg=functest && \ + -e git+https://github.com/openstack/requirements@stable/ocata#egg=openstack_requirements && \ git clone --depth 1 https://github.com/openstack/rally.git -b $RALLY_TAG /src/rally && \ update-requirements -s --source /src/openstack-requirements /src/rally/ && \ pip install --no-cache-dir --src /src -cupper-constraints.txt \ - -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH /src/rally/ && \ + -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH /src/rally && \ + pip install --no-cache-dir --src /src -cupper-constraints.txt \ + -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \ + git+https://gerrit.opnfv.org/gerrit/functest@$BRANCH#egg=functest && \ rm -r upper-constraints.txt /src/rally/.git && \ mkdir -p /etc/rally && \ printf "[database]\nconnection = 'sqlite:////var/lib/rally/database/rally.sqlite'" > /etc/rally/rally.conf && \ diff --git a/docker/features/Dockerfile b/docker/features/Dockerfile index 54bffe827..c3b1b041d 100644 --- a/docker/features/Dockerfile +++ b/docker/features/Dockerfile @@ -4,7 +4,7 @@ ARG BRANCH=master ARG OPENSTACK_TAG=stable/ocata COPY thirdparty-requirements.txt thirdparty-requirements.txt -RUN apk --no-cache add --update nodejs nodejs-npm && \ +RUN apk --no-cache add --update nodejs nodejs-npm python3 && \ apk --no-cache add --virtual .build-deps --update \ python-dev build-base linux-headers libffi-dev \ openssl-dev libjpeg-turbo-dev git && \ @@ -14,8 +14,7 @@ RUN apk --no-cache add --update nodejs nodejs-npm && \ -rthirdparty-requirements.txt && \ npm -g install npm@latest && \ (cd /src/promise/source && npm install) && \ - git clone --depth 1 -b $BRANCH https://gerrit.opnfv.org/gerrit/domino /src/domino && \ - rm -r thirdparty-requirements.txt /src/domino/.git && \ + rm -r thirdparty-requirements.txt && \ apk del .build-deps COPY testcases.yaml /usr/lib/python2.7/site-packages/functest/ci/testcases.yaml CMD ["bash","-c","prepare_env start && run_tests -t all"] diff --git a/docker/features/testcases.yaml b/docker/features/testcases.yaml index ec9962f7a..273a20e77 100644 --- a/docker/features/testcases.yaml +++ b/docker/features/testcases.yaml @@ -24,6 +24,23 @@ tiers: cmd: 'run_promise_tests.py' - + case_name: doctor-notification + enabled: false + project_name: doctor + criteria: 100 + blocking: false + description: >- + Test suite from Doctor project. + dependencies: + installer: '(apex)|(fuel)' + scenario: '^((?!fdio).)*$' + run: + module: 'functest.core.feature' + class: 'BashFeature' + args: + cmd: '(cd /src/doctor-test/tests && run.sh)' + + - case_name: bgpvpn project_name: sdnvpn criteria: 100 @@ -88,7 +105,7 @@ tiers: module: 'functest.core.feature' class: 'BashFeature' args: - cmd: 'cd /src/domino && ./tests/run_multinode.sh' + cmd: 'run_multinode.sh' - case_name: barometercollectd diff --git a/docker/features/thirdparty-requirements.txt b/docker/features/thirdparty-requirements.txt index 0fa9be36c..4a0b6ff88 100644 --- a/docker/features/thirdparty-requirements.txt +++ b/docker/features/thirdparty-requirements.txt @@ -3,3 +3,4 @@ sdnvpn securityscanning sfc promise +domino diff --git a/docker/healthcheck/testcases.yaml b/docker/healthcheck/testcases.yaml index e43c7c77c..9e40db774 100644 --- a/docker/healthcheck/testcases.yaml +++ b/docker/healthcheck/testcases.yaml @@ -37,7 +37,7 @@ tiers: snaps.use_keystone is True, functest must have access to the cloud's private network. dependencies: - installer: '^((?!netvirt).)*$' + installer: '^((?!netvirt|lxd).)*$' scenario: '' run: module: 'functest.opnfv_tests.openstack.snaps.api_check' diff --git a/docker/parser/Dockerfile b/docker/parser/Dockerfile new file mode 100644 index 000000000..e0dc0d5cd --- /dev/null +++ b/docker/parser/Dockerfile @@ -0,0 +1,38 @@ +FROM alpine:3.6 + +ARG BRANCH=master +ARG OPENSTACK_TAG=stable/pike +ARG RALLY_TAG=stable/0.9 + +RUN apk --no-cache add --update \ + python libffi libssl1.0 libjpeg-turbo py-pip bash \ + grep sed wget ca-certificates git openssh-client && \ + apk --no-cache add --virtual .build-deps --update \ + python-dev build-base linux-headers libffi-dev \ + openssl-dev libjpeg-turbo-dev && \ + wget -q -O- https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=$OPENSTACK_TAG | \ + sed /^heat-translator=/d | sed /^tosca-parser=/d \ + > upper-constraints.txt && \ + pip install --src /src -cupper-constraints.txt \ + -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \ + -e git+https://github.com/openstack/requirements@stable/ocata#egg=openstack_requirements && \ + git clone --depth 1 https://github.com/openstack/rally.git -b $RALLY_TAG /src/rally && \ + update-requirements -s --source /src/openstack-requirements /src/rally && \ + pip install --src /src -cupper-constraints.txt \ + -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \ + /src/rally && \ + pip install --no-cache-dir --src /src \ + -cupper-constraints.txt \ + -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \ + git+https://gerrit.opnfv.org/gerrit/functest@$BRANCH#egg=functest \ + git+https://gerrit.opnfv.org/gerrit/parser#egg=heat-translator\&subdirectory=tosca2heat/heat-translator \ + git+https://gerrit.opnfv.org/gerrit/parser#egg=nfv-toscaparser\&subdirectory=tosca2heat/tosca-parser \ + -e git+https://gerrit.opnfv.org/gerrit/parser#egg=nfv-parser && \ + rm -r upper-constraints.txt /src/rally/.git && \ + mkdir -p /etc/rally && \ + printf "[database]\nconnection = 'sqlite:////var/lib/rally/database/rally.sqlite'" > /etc/rally/rally.conf && \ + mkdir -p /var/lib/rally/database && rally-manage db create && \ + bash -c "mkdir -p /home/opnfv/functest{/conf,/data,/images,/results} /home/opnfv/repos/vnfs" && \ + apk del .build-deps +COPY testcases.yaml /usr/lib/python2.7/site-packages/functest/ci/testcases.yaml +CMD ["bash","-c","prepare_env start && run_tests -t all"] diff --git a/docker/parser/testcases.yaml b/docker/parser/testcases.yaml new file mode 100644 index 000000000..4ab3fae2b --- /dev/null +++ b/docker/parser/testcases.yaml @@ -0,0 +1,25 @@ +tiers: + - + name: features + order: 2 + ci_loop: '(daily)|(weekly)' + description : >- + Test suites from feature projects + integrated in functest + testcases: + - + case_name: parser-basics + enabled: false + project_name: parser + criteria: 100 + blocking: false + description: >- + Test suite from Parser project. + dependencies: + installer: 'fuel' + scenario: '^((?!bgpvpn|noha).)*$' + run: + module: 'functest.core.feature' + class: 'BashFeature' + args: + cmd: 'cd /src/nfv-parser/tests && ./functest_run.sh' diff --git a/docker/smoke/Dockerfile b/docker/smoke/Dockerfile index 103854703..abf1714b4 100644 --- a/docker/smoke/Dockerfile +++ b/docker/smoke/Dockerfile @@ -2,18 +2,28 @@ FROM opnfv/functest-core ARG BRANCH=master ARG OPENSTACK_TAG=stable/ocata -ARG ODL_TAG=release/carbon +ARG ODL_TAG=35e415b6873b39d72775c88a337e92dac26012e2 +ARG FDS_TAG=master +ARG REFSTACK_TAG=4e187b07672dd1c41cb7c94658f1c91edebf53a2 COPY thirdparty-requirements.txt thirdparty-requirements.txt RUN apk --no-cache add --virtual .build-deps --update \ python-dev build-base linux-headers libffi-dev \ openssl-dev libjpeg-turbo-dev git && \ + git clone --depth 1 https://github.com/openstack/refstack-client.git /src/refstack-client && \ + (cd src/refstack-client && git checkout -b $REFSTACK_TAG) && \ + update-requirements -s --source /src/openstack-requirements /src/refstack-client/ && \ + pip install --no-cache-dir --src /src \ + -chttps://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=$OPENSTACK_TAG \ + -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \ + -e/src/refstack-client && \ pip install --no-cache-dir --src /src \ -chttps://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=$OPENSTACK_TAG \ -chttps://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH \ -rthirdparty-requirements.txt && \ - git clone --depth 1 -b $ODL_TAG https://git.opendaylight.org/gerrit/p/integration/test.git /src/odl_test && \ - git clone --depth 1 -b $BRANCH https://gerrit.opnfv.org/gerrit/fds /src/fds && \ + git clone --depth 1 https://git.opendaylight.org/gerrit/p/integration/test.git /src/odl_test && \ + (cd src/odl_test && git checkout -b $ODL_TAG) && \ + git clone --depth 1 -b $FDS_TAG https://gerrit.opnfv.org/gerrit/fds /src/fds && \ ln -s /src/tempest /src/refstack-client/.tempest && \ virtualenv --system-site-packages /src/tempest/.venv && \ rm -r thirdparty-requirements.txt /src/refstack-client/.git /src/odl_test/.git \ diff --git a/docker/thirdparty-requirements.txt b/docker/thirdparty-requirements.txt index 773af7588..cc8f5f9c8 100644 --- a/docker/thirdparty-requirements.txt +++ b/docker/thirdparty-requirements.txt @@ -3,6 +3,8 @@ sdnvpn securityscanning sfc promise +doctor-test tosca-parser>=0.7.0 # Apache-2.0 heat-translator>=0.4.0 # Apache-2.0 refstack-client +domino diff --git a/docker/vnf/testcases.yaml b/docker/vnf/testcases.yaml index c0eba8225..dea4a1eaf 100644 --- a/docker/vnf/testcases.yaml +++ b/docker/vnf/testcases.yaml @@ -23,6 +23,7 @@ tiers: - case_name: orchestra_openims project_name: functest + enabled: false criteria: 100 blocking: false description: >- @@ -37,6 +38,7 @@ tiers: - case_name: orchestra_clearwaterims project_name: functest + enabled: false criteria: 100 blocking: false description: >- diff --git a/functest/api/resources/v1/envs.py b/functest/api/resources/v1/envs.py index fb76fa63f..8020544fb 100644 --- a/functest/api/resources/v1/envs.py +++ b/functest/api/resources/v1/envs.py @@ -33,10 +33,11 @@ class V1Envs(ApiResource): def prepare(self, args): # pylint: disable=no-self-use, unused-argument """ Prepare environment """ - try: - ft_utils.execute_command("prepare_env start") - except Exception as err: # pylint: disable=broad-except - return api_utils.result_handler(status=1, data=str(err)) + + result_env = ft_utils.execute_command("prepare_env start") + if not result_env == 0: + return api_utils.result_handler( + status=1, data="Failed to prepare env") return api_utils.result_handler( status=0, data="Prepare env successfully") diff --git a/functest/api/resources/v1/tasks.py b/functest/api/resources/v1/tasks.py index e05db51be..f099918f4 100644 --- a/functest/api/resources/v1/tasks.py +++ b/functest/api/resources/v1/tasks.py @@ -50,12 +50,15 @@ class V1Task(ApiResource): if status not in ['IN PROGRESS', 'FAIL', 'FINISHED']: return api_utils.result_handler(status=1, data='internal server error') + + switcher = {'IN PROGRESS': 0, 'FAIL': 1, 'FINISHED': 2} if status == 'IN PROGRESS': - result = {'status': status, 'result': ''} + result = {'status': switcher.get(status), 'result': ''} elif status == 'FAIL': - result = {'status': status, 'error': task.error} + result = {'status': switcher.get(status), 'error': task.error} else: - result = {'status': status, 'result': json.loads(task.result)} + result = {'status': switcher.get(status), + 'result': json.loads(task.result)} return jsonify(result) @@ -92,4 +95,7 @@ class V1TaskLog(ApiResource): return_data = {'data': data} - return api_utils.result_handler(status=task.status, data=return_data) + switcher = {'IN PROGRESS': 0, 'FAIL': 1, 'FINISHED': 2} + + return api_utils.result_handler(status=switcher.get(task.status), + data=return_data) diff --git a/functest/api/resources/v1/testcases.py b/functest/api/resources/v1/testcases.py index d708cf37b..cc2d4e193 100644 --- a/functest/api/resources/v1/testcases.py +++ b/functest/api/resources/v1/testcases.py @@ -17,7 +17,7 @@ import pkg_resources import uuid import ConfigParser -from flask import abort, jsonify +from flask import jsonify from functest.api.base import ApiResource from functest.api.common import api_utils, thread @@ -46,8 +46,11 @@ class V1Testcase(ApiResource): """ GET the info of one testcase""" testcase = Testcase().show(testcase_name) if not testcase: - abort(404, "The test case '%s' does not exist or is not supported" - % testcase_name) + return api_utils.result_handler( + status=1, + data="The test case '%s' does not exist or is not supported" + % testcase_name) + testcase_info = api_utils.change_obj_to_dict(testcase) dependency_dict = api_utils.change_obj_to_dict( testcase_info.get('dependency')) @@ -70,6 +73,13 @@ class V1Testcase(ApiResource): return api_utils.result_handler( status=1, data='testcase name must be provided') + testcase = Testcase().show(case_name) + if not testcase: + return api_utils.result_handler( + status=1, + data="The test case '%s' does not exist or is not supported" + % case_name) + task_id = str(uuid.uuid4()) task_args = {'testcase': case_name, 'task_id': task_id} @@ -79,8 +89,8 @@ class V1Testcase(ApiResource): task_thread = thread.TaskThread(self._run, task_args, TasksHandler()) task_thread.start() - results = {'testcase': case_name, 'task_id': task_id} - return jsonify(results) + result = {'testcase': case_name, 'task_id': task_id} + return jsonify({'result': result}) def _run(self, args): # pylint: disable=no-self-use """ The built_in function to run a test case """ @@ -110,7 +120,7 @@ class V1Testcase(ApiResource): } result = { 'task_id': args.get('task_id'), - 'case_name': case_name, + 'testcase': case_name, 'env_info': env_info, 'result': result } diff --git a/functest/api/resources/v1/tiers.py b/functest/api/resources/v1/tiers.py index 71a98bea6..4f4849e98 100644 --- a/functest/api/resources/v1/tiers.py +++ b/functest/api/resources/v1/tiers.py @@ -13,9 +13,10 @@ Resources to handle tier related requests import re -from flask import abort, jsonify +from flask import jsonify from functest.api.base import ApiResource +from functest.api.common import api_utils from functest.cli.commands.cli_tier import Tier @@ -46,7 +47,9 @@ class V1Tier(ApiResource): """ GET the info of one tier """ testcases = Tier().gettests(tier_name) if not testcases: - abort(404, "The tier with name '%s' does not exist." % tier_name) + return api_utils.result_handler( + status=1, + data="The tier with name '%s' does not exist." % tier_name) tier_info = Tier().show(tier_name) tier_info.__dict__.pop('name') tier_info.__dict__.pop('tests_array') @@ -62,6 +65,8 @@ class V1TestcasesinTier(ApiResource): """ GET all testcases within given tier """ testcases = Tier().gettests(tier_name) if not testcases: - abort(404, "The tier with name '%s' does not exist." % tier_name) + return api_utils.result_handler( + status=1, + data="The tier with name '%s' does not exist." % tier_name) result = {'tier': tier_name, 'testcases': testcases} return jsonify(result) diff --git a/functest/ci/config_aarch64_patch.yaml b/functest/ci/config_aarch64_patch.yaml index 6b3699b4d..c66d3cd3d 100644 --- a/functest/ci/config_aarch64_patch.yaml +++ b/functest/ci/config_aarch64_patch.yaml @@ -4,6 +4,10 @@ os: image_name: TestVM image_file_name: cirros-d161201-aarch64-disk.img image_password: gocubsgo + extra_properties: + hw_firmware_type: 'uefi' + hw_video_model: 'vga' + short_id: 'ubuntu16.04' snaps: images: glance_tests: @@ -30,7 +34,8 @@ os: image_name: TestVM tempest: - use_custom_images: False + use_custom_images: True + use_custom_flavors: True odl_sfc: image_base_url: "http://artifacts.opnfv.org/sfc/demo" diff --git a/functest/ci/config_functest.yaml b/functest/ci/config_functest.yaml index 5ff5c824e..cfcc728a2 100644 --- a/functest/ci/config_functest.yaml +++ b/functest/ci/config_functest.yaml @@ -7,7 +7,6 @@ general: dir_repo_releng: /home/opnfv/repos/releng repo_vims_test: /src/vims-test repo_barometer: /home/opnfv/repos/barometer - repo_doctor: /home/opnfv/repos/doctor repo_odl_test: /src/odl_test repo_fds: /src/fds repo_securityscan: /home/opnfv/repos/securityscanning diff --git a/functest/ci/download_images.sh b/functest/ci/download_images.sh index 367ad8d9f..236b763c6 100644 --- a/functest/ci/download_images.sh +++ b/functest/ci/download_images.sh @@ -10,7 +10,6 @@ https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloud https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2 https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-amd64-disk1.img http://repository.cloudifysource.org/cloudify/4.0.1/sp-release/cloudify-manager-premium-4.0.1.qcow2 -http://marketplace.openbaton.org:8082/api/v1/images/52e2ccc0-1dce-4663-894d-28aab49323aa/img http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-lxc.tar.gz http://download.cirros-cloud.net/daily/20161201/cirros-d161201-aarch64-disk.img diff --git a/functest/ci/testcases.yaml b/functest/ci/testcases.yaml index 5364035f2..191786cb0 100644 --- a/functest/ci/testcases.yaml +++ b/functest/ci/testcases.yaml @@ -37,7 +37,7 @@ tiers: snaps.use_keystone is True, functest must have access to the cloud's private network. dependencies: - installer: '^((?!netvirt).)*$' + installer: '^((?!netvirt|lxd).)*$' scenario: '' run: module: 'functest.opnfv_tests.openstack.snaps.api_check' @@ -266,7 +266,7 @@ tiers: module: 'functest.core.feature' class: 'BashFeature' args: - cmd: 'cd /home/opnfv/repos/doctor/tests && ./run.sh' + cmd: '(cd /src/doctor-test/tests && run.sh)' - case_name: bgpvpn @@ -350,7 +350,7 @@ tiers: module: 'functest.core.feature' class: 'BashFeature' args: - cmd: 'cd /src/domino && ./tests/run_multinode.sh' + cmd: 'run_multinode.sh' - case_name: barometercollectd @@ -449,6 +449,7 @@ tiers: - case_name: orchestra_openims project_name: functest + enabled: false criteria: 100 blocking: false description: >- @@ -463,6 +464,7 @@ tiers: - case_name: orchestra_clearwaterims project_name: functest + enabled: false criteria: 100 blocking: false description: >- diff --git a/functest/core/vnf.py b/functest/core/vnf.py index a329212d8..517838a76 100644 --- a/functest/core/vnf.py +++ b/functest/core/vnf.py @@ -14,7 +14,9 @@ import time import functest.core.testcase as base from functest.utils.constants import CONST -import functest.utils.openstack_utils as os_utils +from snaps.openstack.create_user import UserSettings, OpenStackUser +from snaps.openstack.create_project import ProjectSettings, OpenStackProject +from snaps.openstack.tests import openstack_tests __author__ = ("Morgan Richomme <morgan.richomme@orange.com>, " "Valentin Boucher <valentin.boucher@orange.com>") @@ -43,10 +45,11 @@ class VnfOnBoarding(base.TestCase): def __init__(self, **kwargs): super(VnfOnBoarding, self).__init__(**kwargs) - self.exist_obj = {'tenant': False, 'user': False} self.tenant_name = CONST.__getattribute__( 'vnf_{}_tenant_name'.format(self.case_name)) - self.creds = {} + self.snaps_creds = {} + self.created_object = [] + self.os_project = None def run(self, **kwargs): """ @@ -100,20 +103,31 @@ class VnfOnBoarding(base.TestCase): 'vnf_{}_tenant_description'.format(self.case_name)) self.__logger.info("Prepare VNF: %s, description: %s", self.tenant_name, tenant_description) - keystone_client = os_utils.get_keystone_client() - self.exist_obj['tenant'] = ( - not os_utils.get_or_create_tenant_for_vnf( - keystone_client, - self.tenant_name, - tenant_description)) - self.exist_obj['user'] = not os_utils.get_or_create_user_for_vnf( - keystone_client, self.tenant_name) - self.creds = { - "tenant": self.tenant_name, - "username": self.tenant_name, - "password": self.tenant_name, - "auth_url": os_utils.get_credentials()['auth_url'] - } + snaps_creds = openstack_tests.get_credentials( + os_env_file=CONST.__getattribute__('openstack_creds')) + + project_creator = OpenStackProject( + snaps_creds, + ProjectSettings( + name=self.tenant_name, + description=tenant_description + )) + project_creator.create() + self.created_object.append(project_creator) + self.os_project = project_creator + + user_creator = OpenStackUser( + snaps_creds, + UserSettings( + name=self.tenant_name, + password=self.tenant_name, + roles={'admin': self.tenant_name})) + + user_creator.create() + self.created_object.append(user_creator) + + self.snaps_creds = user_creator.get_os_creds(self.tenant_name) + return base.TestCase.EX_OK except Exception: # pylint: disable=broad-except self.__logger.exception("Exception raised during VNF preparation") @@ -185,8 +199,9 @@ class VnfOnBoarding(base.TestCase): * the tenant """ self.__logger.info("test cleaning") - keystone_client = os_utils.get_keystone_client() - if not self.exist_obj['tenant']: - os_utils.delete_tenant(keystone_client, self.tenant_name) - if not self.exist_obj['user']: - os_utils.delete_user(keystone_client, self.tenant_name) + self.__logger.info('Remove the cloudify manager OS object ..') + for creator in reversed(self.created_object): + try: + creator.clean() + except Exception as exc: # pylint: disable=broad-except + self.__logger.error('Unexpected error cleaning - %s', exc) diff --git a/functest/opnfv_tests/openstack/rally/blacklist.txt b/functest/opnfv_tests/openstack/rally/blacklist.txt index 0623368d8..cdb5be663 100644 --- a/functest/opnfv_tests/openstack/rally/blacklist.txt +++ b/functest/opnfv_tests/openstack/rally/blacklist.txt @@ -48,6 +48,7 @@ scenario: # panko in the deployment. This is not currently fulfilled # Ref: https://docs.openstack.org/releasenotes/ceilometer/ocata.html - 'CeilometerEvents..*' + - 'CeilometerTraits..*' functionality: - diff --git a/functest/opnfv_tests/openstack/rally/rally.py b/functest/opnfv_tests/openstack/rally/rally.py index fdef8bed0..2042b2d15 100644 --- a/functest/opnfv_tests/openstack/rally/rally.py +++ b/functest/opnfv_tests/openstack/rally/rally.py @@ -42,6 +42,10 @@ class RallyBase(testcase.OSGCTestCase): CONST.__getattribute__('dir_functest_images'), GLANCE_IMAGE_FILENAME) GLANCE_IMAGE_FORMAT = CONST.__getattribute__('openstack_image_disk_format') + GLANCE_IMAGE_EXTRA_PROPERTIES = {} + if hasattr(CONST, 'openstack_extra_properties'): + GLANCE_IMAGE_EXTRA_PROPERTIES = CONST.__getattribute__( + 'openstack_extra_properties') FLAVOR_NAME = "m1.tiny" RALLY_DIR = pkg_resources.resource_filename( @@ -462,7 +466,8 @@ class RallyBase(testcase.OSGCTestCase): self.image_exists, self.image_id = os_utils.get_or_create_image( self.GLANCE_IMAGE_NAME, self.GLANCE_IMAGE_PATH, - self.GLANCE_IMAGE_FORMAT) + self.GLANCE_IMAGE_FORMAT, + self.GLANCE_IMAGE_EXTRA_PROPERTIES) if self.image_id is None: raise Exception("Failed to get or create image '%s'" % self.GLANCE_IMAGE_NAME) diff --git a/functest/opnfv_tests/openstack/refstack_client/refstack_client.py b/functest/opnfv_tests/openstack/refstack_client/refstack_client.py index 17e024666..42befe221 100644 --- a/functest/opnfv_tests/openstack/refstack_client/refstack_client.py +++ b/functest/opnfv_tests/openstack/refstack_client/refstack_client.py @@ -1,6 +1,7 @@ #!/usr/bin/env python + # Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. -# matthew.lijun@huawei.com wangwulin@huawei.com +# # 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 @@ -10,7 +11,6 @@ from __future__ import division - import argparse import logging import os @@ -28,7 +28,9 @@ from functest.opnfv_tests.openstack.refstack_client.tempest_conf \ from functest.opnfv_tests.openstack.tempest import conf_utils from functest.utils.constants import CONST import functest.utils.functest_utils as ft_utils -import functest.utils.openstack_utils as os_utils + +__author__ = ("Matthew Li <matthew.lijun@huawei.com>," + "Linda Wang <wangwulin@huawei.com>") # logging configuration """ LOGGER = logging.getLogger(__name__) @@ -77,7 +79,7 @@ class RefstackClient(testcase.TestCase): """Run default defcore sys command.""" options = ["-v"] if not self.insecure else ["-v", self.insecure] cmd = (["refstack-client", "test", "-c", self.confpath] + - options + ["--test-list", self.defcorelist]) + options + ["--test-list", self.defcorelist]) LOGGER.info("Starting Refstack_defcore test case: '%s'.", cmd) with open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR, @@ -211,45 +213,6 @@ class RefstackClient(testcase.TestCase): return res - def create_snapshot(self): - """ - Run the Tempest cleanup utility to initialize OS state. - For details, see https://docs.openstack.org/tempest/latest/cleanup.html - - :return: TestCase.EX_OK - """ - LOGGER.info("Initializing the saved state of the OpenStack deployment") - - # Make sure that Tempest is configured - if not self.tempestconf: - self.generate_conf() - - try: - os_utils.init_tempest_cleanup( - self.tempestconf.DEPLOYMENT_DIR, 'tempest.conf', - os.path.join(conf_utils.REFSTACK_RESULTS_DIR, - "tempest-cleanup-init.log")) - except Exception as err: - LOGGER.error(str(err)) - return testcase.TestCase.EX_RUN_ERROR - - return super(RefstackClient, self).create_snapshot() - - def clean(self): - """ - Run the Tempest cleanup utility to delete and destroy OS resources. - For details, see https://docs.openstack.org/tempest/latest/cleanup.html - """ - LOGGER.info("Destroying the resources created for tempest") - - os_utils.perform_tempest_cleanup( - self.tempestconf.DEPLOYMENT_DIR, 'tempest.conf', - os.path.join(conf_utils.REFSTACK_RESULTS_DIR, - "tempest-cleanup.log") - ) - - return super(RefstackClient, self).clean() - class RefstackClientParser(object): # pylint: disable=too-few-public-methods """Command line argument parser helper.""" diff --git a/functest/opnfv_tests/openstack/snaps/snaps_utils.py b/functest/opnfv_tests/openstack/snaps/snaps_utils.py index 309f9db16..956b104ac 100644 --- a/functest/opnfv_tests/openstack/snaps/snaps_utils.py +++ b/functest/opnfv_tests/openstack/snaps/snaps_utils.py @@ -5,7 +5,7 @@ # # http://www.apache.org/licenses/LICENSE-2.0 -from snaps.openstack.utils import neutron_utils +from snaps.openstack.utils import neutron_utils, nova_utils def get_ext_net_name(os_creds): @@ -17,3 +17,14 @@ def get_ext_net_name(os_creds): neutron = neutron_utils.neutron_client(os_creds) ext_nets = neutron_utils.get_external_networks(neutron) return ext_nets[0].name + + +def get_active_compute_cnt(os_creds): + """ + Returns the number of active compute servers + :param: os_creds: an instance of snaps OSCreds object + :return: the number of active compute servers + """ + nova = nova_utils.nova_client(os_creds) + computes = nova_utils.get_availability_zone_hosts(nova, zone_name='nova') + return len(computes) diff --git a/functest/opnfv_tests/openstack/tempest/conf_utils.py b/functest/opnfv_tests/openstack/tempest/conf_utils.py index 2cdc2cf64..4202df625 100644 --- a/functest/opnfv_tests/openstack/tempest/conf_utils.py +++ b/functest/opnfv_tests/openstack/tempest/conf_utils.py @@ -119,18 +119,21 @@ def backup_tempest_config(conf_file): """ Copy config file to tempest results directory """ + if not os.path.exists(TEMPEST_RESULTS_DIR): + os.makedirs(TEMPEST_RESULTS_DIR) shutil.copyfile(conf_file, os.path.join(TEMPEST_RESULTS_DIR, 'tempest.conf')) def configure_tempest(deployment_dir, image_id=None, flavor_id=None, - mode=None): + compute_cnt=None): """ Calls rally verify and updates the generated tempest.conf with given parameters """ conf_file = configure_verifier(deployment_dir) - configure_tempest_update_params(conf_file, image_id, flavor_id) + configure_tempest_update_params(conf_file, image_id, flavor_id, + compute_cnt) def configure_tempest_defcore(deployment_dir, image_id, flavor_id, @@ -186,8 +189,8 @@ def generate_test_accounts_file(tenant_id): yaml.dump(accounts_list, f, default_flow_style=False) -def configure_tempest_update_params(tempest_conf_file, - image_id=None, flavor_id=None): +def configure_tempest_update_params(tempest_conf_file, image_id=None, + flavor_id=None, compute_cnt=1): """ Add/update needed parameters into tempest.conf file """ @@ -210,6 +213,10 @@ def configure_tempest_update_params(tempest_conf_file, config.set('compute', 'flavor_ref', flavor_id) if FLAVOR_ID_ALT is not None: config.set('compute', 'flavor_ref_alt', FLAVOR_ID_ALT) + if compute_cnt > 1: + # enable multinode tests + config.set('compute', 'min_compute_nodes', compute_cnt) + config.set('identity', 'region', 'RegionOne') if os_utils.is_keystone_v3(): auth_version = 'v3' diff --git a/functest/opnfv_tests/openstack/tempest/tempest.py b/functest/opnfv_tests/openstack/tempest/tempest.py index b8a4e9adc..19200142d 100644 --- a/functest/opnfv_tests/openstack/tempest/tempest.py +++ b/functest/opnfv_tests/openstack/tempest/tempest.py @@ -20,10 +20,10 @@ import time import yaml from functest.core import testcase +from functest.opnfv_tests.openstack.snaps import snaps_utils from functest.opnfv_tests.openstack.tempest import conf_utils from functest.utils.constants import CONST import functest.utils.functest_utils as ft_utils -import functest.utils.openstack_utils as os_utils from snaps.openstack import create_flavor from snaps.openstack.create_flavor import FlavorSettings, OpenStackFlavor @@ -234,11 +234,13 @@ class TempestCommon(testcase.TestCase): if not os.path.exists(conf_utils.TEMPEST_RESULTS_DIR): os.makedirs(conf_utils.TEMPEST_RESULTS_DIR) resources = self.resources.create() + compute_cnt = snaps_utils.get_active_compute_cnt( + self.resources.os_creds) conf_utils.configure_tempest( self.DEPLOYMENT_DIR, image_id=resources.get("image_id"), flavor_id=resources.get("flavor_id"), - mode=self.MODE) + compute_cnt=compute_cnt) self.generate_test_list(self.VERIFIER_REPO_DIR) self.apply_tempest_blacklist() self.run_verifier_tests() @@ -253,46 +255,6 @@ class TempestCommon(testcase.TestCase): self.stop_time = time.time() return res - def create_snapshot(self): - """ - Run the Tempest cleanup utility to initialize OS state. - - :return: TestCase.EX_OK - """ - logger.info("Initializing the saved state of the OpenStack deployment") - - if not os.path.exists(conf_utils.TEMPEST_RESULTS_DIR): - os.makedirs(conf_utils.TEMPEST_RESULTS_DIR) - - # Make sure that the verifier is configured - conf_utils.configure_verifier(self.DEPLOYMENT_DIR) - - try: - os_utils.init_tempest_cleanup( - self.DEPLOYMENT_DIR, 'tempest.conf', - os.path.join(conf_utils.TEMPEST_RESULTS_DIR, - "tempest-cleanup-init.log")) - except Exception as err: - logger.error(str(err)) - return testcase.TestCase.EX_RUN_ERROR - - return super(TempestCommon, self).create_snapshot() - - def clean(self): - """ - Run the Tempest cleanup utility to delete and destroy OS resources - created by Tempest. - """ - logger.info("Destroying the resources created for refstack") - - os_utils.perform_tempest_cleanup( - self.DEPLOYMENT_DIR, 'tempest.conf', - os.path.join(conf_utils.TEMPEST_RESULTS_DIR, - "tempest-cleanup.log") - ) - - return super(TempestCommon, self).clean() - class TempestSmokeSerial(TempestCommon): diff --git a/functest/opnfv_tests/sdn/odl/odl.py b/functest/opnfv_tests/sdn/odl/odl.py index 841da834b..d09532cb0 100644 --- a/functest/opnfv_tests/sdn/odl/odl.py +++ b/functest/opnfv_tests/sdn/odl/odl.py @@ -157,7 +157,11 @@ class ODLTests(testcase.TestCase): 'NEUTRON:' + kwargs['neutronip'], 'OS_AUTH_URL:"' + osauthurl + '"', 'OSUSERNAME:"' + kwargs['osusername'] + '"', + ('OSUSERDOMAINNAME:"' + + kwargs['osuserdomainname'] + '"'), 'OSTENANTNAME:"' + kwargs['ostenantname'] + '"', + ('OSPROJECTDOMAINNAME:"' + + kwargs['osprojectdomainname'] + '"'), 'OSPASSWORD:"' + kwargs['ospassword'] + '"', 'ODL_SYSTEM_IP:' + kwargs['odlip'], 'PORT:' + kwargs['odlwebport'], @@ -221,11 +225,16 @@ class ODLTests(testcase.TestCase): if 'INSTALLER_TYPE' in os.environ: installer_type = os.environ['INSTALLER_TYPE'] kwargs['osusername'] = os.environ['OS_USERNAME'] + kwargs['osuserdomainname'] = os.environ.get( + 'OS_USER_DOMAIN_NAME', 'Default') kwargs['ostenantname'] = os.environ['OS_TENANT_NAME'] + kwargs['osprojectdomainname'] = os.environ.get( + 'OS_PROJECT_DOMAIN_NAME', 'Default') kwargs['osauthurl'] = os.environ['OS_AUTH_URL'] kwargs['ospassword'] = os.environ['OS_PASSWORD'] if installer_type == 'fuel': - kwargs['odlwebport'] = '8282' + kwargs['odlwebport'] = '8181' + kwargs['odlrestconfport'] = '8282' elif installer_type == 'apex' or installer_type == 'netvirt': kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP'] kwargs['odlwebport'] = '8081' @@ -262,14 +271,21 @@ class ODLParser(object): # pylint: disable=too-few-public-methods default='127.0.0.1') self.parser.add_argument( '-k', '--osauthurl', help='OS_AUTH_URL as defined by OpenStack', - default='http://127.0.0.1:5000/v2.0') + default='http://127.0.0.1:5000/v3') self.parser.add_argument( '-a', '--osusername', help='Username for OpenStack', default='admin') self.parser.add_argument( + '-f', '--osuserdomainname', help='User domain name for OpenStack', + default='Default') + self.parser.add_argument( '-b', '--ostenantname', help='Tenantname for OpenStack', default='admin') self.parser.add_argument( + '-g', '--osprojectdomainname', + help='Project domain name for OpenStack', + default='Default') + self.parser.add_argument( '-c', '--ospassword', help='Password for OpenStack', default='admin') self.parser.add_argument( diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.py b/functest/opnfv_tests/vnf/ims/cloudify_ims.py index 8ed7f0dda..c8c2c509c 100644 --- a/functest/opnfv_tests/vnf/ims/cloudify_ims.py +++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.py @@ -24,7 +24,6 @@ import functest.opnfv_tests.vnf.ims.clearwater_ims_base as clearwater_ims_base from functest.utils.constants import CONST import functest.utils.openstack_utils as os_utils -from snaps.openstack.os_credentials import OSCreds from snaps.openstack.create_network import (NetworkSettings, SubnetSettings, OpenStackNetwork) from snaps.openstack.create_security_group import (SecurityGroupSettings, @@ -63,7 +62,6 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase): raise Exception("VNF config file not found") self.snaps_creds = '' - self.created_object = [] config_file = os.path.join(self.case_dir, self.config) self.orchestrator = dict( @@ -101,12 +99,19 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase): self.__logger.info("Additional pre-configuration steps") - self.snaps_creds = OSCreds( - username=self.creds['username'], - password=self.creds['password'], - auth_url=self.creds['auth_url'], - project_name=self.creds['tenant'], - identity_api_version=int(os_utils.get_keystone_client_version())) + compute_quotas = self.os_project.get_compute_quotas() + network_quotas = self.os_project.get_network_quotas() + + for key, value in ( + self.vnf['requirements']['compute_quotas'].items()): + setattr(compute_quotas, key, value) + + for key, value in ( + self.vnf['requirements']['network_quotas'].items()): + setattr(network_quotas, key, value) + + compute_quotas = self.os_project.update_compute_quotas(compute_quotas) + network_quotas = self.os_project.update_network_quotas(network_quotas) # needs some images self.__logger.info("Upload some OS images if it doesn't exist") @@ -402,12 +407,6 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase): self.__logger.warn("Some issue during the undeployment ..") self.__logger.warn("Tenant clean continue ..") - self.__logger.info('Remove the cloudify manager OS object ..') - for creator in reversed(self.created_object): - try: - creator.clean() - except Exception as exc: - self.logger.error('Unexpected error cleaning - %s', exc) super(CloudifyIms, self).clean() @energy.enable_recording diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml b/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml index 280e0a6b8..ad7fa70a9 100644 --- a/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml +++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.yaml @@ -21,6 +21,13 @@ vnf: flavor: name: m1.small ram_min: 2048 + compute_quotas: + cores: 50 + instances: 15 + network_quotas: + security_group: 20 + security_group_rule: 100 + port: 50 inputs: image_id: 'ubuntu_14.04' flavor_id: 'm1.small' diff --git a/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py b/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py index 5154dea20..c924a3470 100644 --- a/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py +++ b/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py @@ -31,7 +31,6 @@ from snaps.openstack.create_network import ( SubnetSettings, PortSettings) from snaps.openstack.create_router import OpenStackRouter, RouterSettings -from snaps.openstack.os_credentials import OSCreds from snaps.openstack.create_instance import ( VmInstanceSettings, OpenStackVmInstance) @@ -208,15 +207,13 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): super(ClearwaterImsVnf, self).prepare() self.logger.info("Additional pre-configuration steps") - self.logger.info("creds %s", (self.creds)) - - self.snaps_creds = OSCreds( - username=self.creds['username'], - password=self.creds['password'], - auth_url=self.creds['auth_url'], - project_name=self.creds['tenant'], - identity_api_version=int(os_utils.get_keystone_client_version())) + self.creds = { + "tenant": self.tenant_name, + "username": self.tenant_name, + "password": self.tenant_name, + "auth_url": os_utils.get_credentials()['auth_url'] + } self.prepare_images() self.prepare_flavor() self.prepare_security_groups() @@ -661,8 +658,9 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): try: neutron_client = os_utils.get_neutron_client(self.creds) self.logger.info("Deleting Open Baton Port...") - port = snaps_utils.neutron_utils.get_port_by_name( - neutron_client, '%s_port' % self.case_name) + port = snaps_utils.neutron_utils.get_port( + neutron_client, + port_name='%s_port' % self.case_name) snaps_utils.neutron_utils.delete_port(neutron_client, port) time.sleep(10) except Exception as exc: diff --git a/functest/opnfv_tests/vnf/ims/orchestra_openims.py b/functest/opnfv_tests/vnf/ims/orchestra_openims.py index 45440704e..aae35146f 100644 --- a/functest/opnfv_tests/vnf/ims/orchestra_openims.py +++ b/functest/opnfv_tests/vnf/ims/orchestra_openims.py @@ -32,7 +32,6 @@ from snaps.openstack.create_network import ( SubnetSettings, PortSettings) from snaps.openstack.create_router import OpenStackRouter, RouterSettings -from snaps.openstack.os_credentials import OSCreds from snaps.openstack.create_instance import ( VmInstanceSettings, OpenStackVmInstance) from functest.opnfv_tests.openstack.snaps import snaps_utils @@ -198,22 +197,18 @@ class OpenImsVnf(vnf.VnfOnBoarding): self.images = get_config("tenant_images.orchestrator", config_file) self.images.update(get_config("tenant_images.%s" % self.case_name, config_file)) - self.snaps_creds = None def prepare(self): """Prepare testscase (Additional pre-configuration steps).""" super(OpenImsVnf, self).prepare() self.logger.info("Additional pre-configuration steps") - self.logger.info("creds %s", (self.creds)) - - self.snaps_creds = OSCreds( - username=self.creds['username'], - password=self.creds['password'], - auth_url=self.creds['auth_url'], - project_name=self.creds['tenant'], - identity_api_version=int(os_utils.get_keystone_client_version())) - + self.creds = { + "tenant": self.tenant_name, + "username": self.tenant_name, + "password": self.tenant_name, + "auth_url": os_utils.get_credentials()['auth_url'] + } self.prepare_images() self.prepare_flavor() self.prepare_security_groups() @@ -697,8 +692,9 @@ class OpenImsVnf(vnf.VnfOnBoarding): try: neutron_client = os_utils.get_neutron_client(self.creds) self.logger.info("Deleting Open Baton Port...") - port = snaps_utils.neutron_utils.get_port_by_name( - neutron_client, '%s_port' % self.case_name) + port = snaps_utils.neutron_utils.get_port( + neutron_client, + port_name='%s_port' % self.case_name) snaps_utils.neutron_utils.delete_port(neutron_client, port) time.sleep(10) except Exception as exc: diff --git a/functest/opnfv_tests/vnf/router/cloudify_vrouter.py b/functest/opnfv_tests/vnf/router/cloudify_vrouter.py index c3cccb989..edbdb495f 100644 --- a/functest/opnfv_tests/vnf/router/cloudify_vrouter.py +++ b/functest/opnfv_tests/vnf/router/cloudify_vrouter.py @@ -25,7 +25,6 @@ import functest.utils.openstack_utils as os_utils from git import Repo -from snaps.openstack.os_credentials import OSCreds from snaps.openstack.create_network import (NetworkSettings, SubnetSettings, OpenStackNetwork) from snaps.openstack.create_security_group import (SecurityGroupSettings, @@ -110,17 +109,10 @@ class CloudifyVrouter(vrouter_base.VrouterOnBoardingBase): self.__logger.info("Additional pre-configuration steps") - self.snaps_creds = OSCreds( - username=self.creds['username'], - password=self.creds['password'], - auth_url=self.creds['auth_url'], - project_name=self.creds['tenant'], - identity_api_version=int(os_utils.get_keystone_client_version())) - - self.util.set_credentials(self.creds["username"], - self.creds["password"], - self.creds["auth_url"], - self.creds["tenant"]) + self.util.set_credentials(self.snaps_creds.username, + self.snaps_creds.password, + self.snaps_creds.auth_url, + self.snaps_creds.project_name) # needs some images self.__logger.info("Upload some OS images if it doesn't exist") diff --git a/functest/tests/unit/core/test_vnf.py b/functest/tests/unit/core/test_vnf.py index 2ebbbe379..00a29ead1 100644 --- a/functest/tests/unit/core/test_vnf.py +++ b/functest/tests/unit/core/test_vnf.py @@ -18,6 +18,8 @@ from functest.core import vnf from functest.core import testcase from functest.utils import constants +from snaps.openstack.os_credentials import OSCreds + class VnfBaseTesting(unittest.TestCase): """The class testing VNF.""" @@ -102,91 +104,62 @@ class VnfBaseTesting(unittest.TestCase): with self.assertRaises(vnf.VnfTestException): self.test.test_vnf() - @mock.patch('functest.core.vnf.os_utils.get_keystone_client') - @mock.patch('functest.core.vnf.os_utils.delete_user', - return_value=True) - def test_clean_user_already_exist(self, *args): - self.test.exist_obj['user'] = True - self.test.clean() - args[0].assert_not_called() - args[1].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client') - @mock.patch('functest.core.vnf.os_utils.delete_user', - return_value=True) - def test_clean_user_created(self, *args): - self.test.exist_obj['user'] = False - self.test.clean() - args[0].assert_called_once_with(mock.ANY, self.tenant_name) - args[1].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client') - @mock.patch('functest.core.vnf.os_utils.delete_tenant', - return_value=True) - def test_clean_tenant_already_exist(self, *args): - self.test.exist_obj['tenant'] = True - self.test.clean() - args[0].assert_not_called() - args[1].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client') - @mock.patch('functest.core.vnf.os_utils.delete_tenant', - return_value=True) - def test_clean_tenant_created(self, *args): - self.test.exist_obj['tenant'] = False - self.test.clean() - args[0].assert_called_once_with(mock.ANY, self.tenant_name) - args[1].assert_called_once_with() - def test_deploy_orch_unimplemented(self): self.assertTrue(self.test.deploy_orchestrator()) - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - return_value={'auth_url': 'test'}) - def test_prepare(self, *args): - self.assertEqual(self.test.prepare(), - testcase.TestCase.EX_OK) - args[0].assert_called_once_with() - args[1].assert_called_once_with('test', self.tenant_name) - args[2].assert_called_once_with( - 'test', self.tenant_name, self.tenant_description) - args[3].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', +# @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials', +# return_value='test') +# @mock.patch('snaps.openstack.create_project.OpenStackProject', +# return_value=True) +# @mock.patch('snaps.openstack.create_user.OpenStackUser', +# return_value=True) +# def test_prepare(self, *args): +# self.assertEqual(self.test.prepare(), +# testcase.TestCase.EX_OK) +# args[0].assert_called_once_with() +# args[1].assert_called_once_with('test', self.tenant_name) +# args[2].assert_called_once_with( +# 'test', self.tenant_name, self.tenant_description) +# args[3].assert_called_once_with() + + @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials', + return_value=OSCreds( + username='user', password='pass', + auth_url='http://foo.com:5000/v3', project_name='bar'), side_effect=Exception) def test_prepare_keystone_client_ko(self, *args): with self.assertRaises(vnf.VnfPreparationException): self.test.prepare() - args[0].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - side_effect=Exception) - def test_prepare_tenant_creation_ko(self, *args): - with self.assertRaises(vnf.VnfPreparationException): - self.test.prepare() - args[0].assert_called_once_with( - mock.ANY, self.tenant_name, self.tenant_description) - args[1].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=0) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - side_effect=Exception) - def test_prepare_user_creation_ko(self, *args): - with self.assertRaises(vnf.VnfPreparationException): - self.test.prepare() - args[0].assert_called_once_with(mock.ANY, self.tenant_name) - args[1].assert_called_once_with( - mock.ANY, self.tenant_name, self.tenant_description) - args[2].assert_called_once_with() + args[0].assert_called_once() + +# @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials', +# return_value=OS_CREDS) +# @mock.patch('snaps.openstack.create_project.OpenStackProject') +# @mock.patch('snaps.openstack.create_project.OpenStackProject.create', +# side_effect=Exception) +# def test_prepare_tenant_creation_ko(self, *args): +# with self.assertRaises(vnf.VnfPreparationException): +# self.test.prepare() +# args[2].assert_called_once() +# args[1].assert_called_once_with(OS_CREDS, +# ProjectSettings( +# name=self.tenant_name, +# description=self.tenant_description, +# )) +# args[0].assert_called_once() + +# @mock.patch('snaps.openstack.tests.openstack_tests.get_credentials') +# @mock.patch('snaps.openstack.create_project.OpenStackProject', +# return_value=0) +# @mock.patch('snaps.openstack.create_user.OpenStackUser', +# side_effect=Exception) +# def test_prepare_user_creation_ko(self, *args): +# with self.assertRaises(vnf.VnfPreparationException): +# self.test.prepare() +# args[0].assert_called_once_with(mock.ANY, self.tenant_name) +# args[1].assert_called_once_with( +# mock.ANY, self.tenant_name, self.tenant_description) +# args[2].assert_called_once_with() if __name__ == "__main__": diff --git a/functest/tests/unit/odl/test_odl.py b/functest/tests/unit/odl/test_odl.py index 8aeea41de..338a4e69d 100644 --- a/functest/tests/unit/odl/test_odl.py +++ b/functest/tests/unit/odl/test_odl.py @@ -69,7 +69,7 @@ class ODLTesting(unittest.TestCase): _keystone_ip = "127.0.0.1" _neutron_ip = "127.0.0.2" _sdn_controller_ip = "127.0.0.3" - _os_auth_url = "http://{}:5000/v2.0".format(_keystone_ip) + _os_auth_url = "http://{}:5000/v3".format(_keystone_ip) _os_tenantname = "admin" _os_username = "admin" _os_password = "admin" @@ -77,6 +77,8 @@ class ODLTesting(unittest.TestCase): _odl_restconfport = "8181" _odl_username = "admin" _odl_password = "admin" + _os_userdomainname = 'Default' + _os_projectdomainname = 'Default' def setUp(self): for var in ("INSTALLER_TYPE", "SDN_CONTROLLER", "SDN_CONTROLLER_IP"): @@ -84,15 +86,20 @@ class ODLTesting(unittest.TestCase): del os.environ[var] os.environ["OS_AUTH_URL"] = self._os_auth_url os.environ["OS_USERNAME"] = self._os_username + os.environ["OS_USER_DOMAIN_NAME"] = self._os_userdomainname os.environ["OS_PASSWORD"] = self._os_password os.environ["OS_TENANT_NAME"] = self._os_tenantname + os.environ["OS_PROJECT_DOMAIN_NAME"] = self._os_projectdomainname + os.environ["OS_PASSWORD"] = self._os_password self.test = odl.ODLTests(case_name='odl', project_name='functest') self.defaultargs = {'odlusername': self._odl_username, 'odlpassword': self._odl_password, 'neutronip': self._keystone_ip, 'osauthurl': self._os_auth_url, 'osusername': self._os_username, + 'osuserdomainname': self._os_userdomainname, 'ostenantname': self._os_tenantname, + 'osprojectdomainname': self._os_projectdomainname, 'ospassword': self._os_password, 'odlip': self._keystone_ip, 'odlwebport': self._odl_webport, @@ -211,7 +218,9 @@ class ODLMainTesting(ODLTesting): 'neutronip': self._neutron_ip, 'osauthurl': self._os_auth_url, 'osusername': self._os_username, + 'osuserdomainname': self._os_userdomainname, 'ostenantname': self._os_tenantname, + 'osprojectdomainname': self._os_projectdomainname, 'ospassword': self._os_password, 'odlip': self._sdn_controller_ip, 'odlwebport': self._odl_webport, @@ -231,7 +240,11 @@ class ODLMainTesting(ODLTesting): 'NEUTRON:{}'.format(self._neutron_ip), 'OS_AUTH_URL:"{}"'.format(self._os_auth_url), 'OSUSERNAME:"{}"'.format(self._os_username), + 'OSUSERDOMAINNAME:"{}"'.format( + self._os_userdomainname), 'OSTENANTNAME:"{}"'.format(self._os_tenantname), + 'OSPROJECTDOMAINNAME:"{}"'.format( + self._os_projectdomainname), 'OSPASSWORD:"{}"'.format(self._os_password), 'ODL_SYSTEM_IP:{}'.format(self._sdn_controller_ip), 'PORT:{}'.format(self._odl_webport), @@ -383,7 +396,9 @@ class ODLRunTesting(ODLTesting): odlusername=self._odl_username, odlwebport=odlwebport, osauthurl=self._os_auth_url, ospassword=self._os_password, ostenantname=self._os_tenantname, - osusername=self._os_username) + osusername=self._os_username, + osprojectdomainname=self._os_projectdomainname, + osuserdomainname=self._os_userdomainname) def _test_multiple_suites(self, suites, status=testcase.TestCase.EX_OK, **kwargs): @@ -404,7 +419,9 @@ class ODLRunTesting(ODLTesting): odlusername=self._odl_username, odlwebport=odlwebport, osauthurl=self._os_auth_url, ospassword=self._os_password, ostenantname=self._os_tenantname, - osusername=self._os_username) + osusername=self._os_username, + osprojectdomainname=self._os_projectdomainname, + osuserdomainname=self._os_userdomainname) def test_exc(self): with mock.patch('functest.utils.openstack_utils.get_endpoint', @@ -462,7 +479,8 @@ class ODLRunTesting(ODLTesting): def test_fuel(self): os.environ["INSTALLER_TYPE"] = "fuel" self._test_run(testcase.TestCase.EX_OK, - odlip=self._neutron_ip, odlwebport='8282') + odlip=self._neutron_ip, odlwebport='8181', + odlrestconfport='8282') def test_apex_no_controller_ip(self): with mock.patch('functest.utils.openstack_utils.get_endpoint', @@ -578,9 +596,15 @@ class ODLArgParserTesting(ODLTesting): def test_osusername(self): self._test_arg('osusername', 'foo') + def test_osuserdomainname(self): + self._test_arg('osuserdomainname', 'domain') + def test_ostenantname(self): self._test_arg('ostenantname', 'foo') + def test_osprojectdomainname(self): + self._test_arg('osprojectdomainname', 'domain') + def test_ospassword(self): self._test_arg('ospassword', 'foo') diff --git a/functest/tests/unit/openstack/refstack_client/test_refstack_client.py b/functest/tests/unit/openstack/refstack_client/test_refstack_client.py index ca0974832..61e950a6b 100644 --- a/functest/tests/unit/openstack/refstack_client/test_refstack_client.py +++ b/functest/tests/unit/openstack/refstack_client/test_refstack_client.py @@ -1,11 +1,14 @@ #!/usr/bin/env python + # Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. -# matthew.lijun@huawei.com wangwulin@huawei.com +# # 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 +# pylint: disable=missing-docstring + import logging import mock import pkg_resources @@ -18,8 +21,13 @@ from functest.utils.constants import CONST from snaps.openstack.os_credentials import OSCreds +__author__ = ("Matthew Li <matthew.lijun@huawei.com>," + "Linda Wang <wangwulin@huawei.com>") + class OSRefstackClientTesting(unittest.TestCase): + """The class testing RefstackClient """ + # pylint: disable=missing-docstring, too-many-public-methods _config = pkg_resources.resource_filename( 'functest', @@ -32,13 +40,20 @@ class OSRefstackClientTesting(unittest.TestCase): 'testlist': self._testlist} CONST.__setattr__('OS_AUTH_URL', 'https://ip:5000/v3') CONST.__setattr__('OS_INSECURE', 'true') + self.case_name = 'refstack_defcore' + self.result = 0 self.os_creds = OSCreds( username='user', password='pass', auth_url='http://foo.com:5000/v3', project_name='bar') + self.details = {"tests": 3, + "failures": 1, + "success": ['tempest.api.compute [18.464988s]'], + "errors": ['tempest.api.volume [0.230334s]'], + "skipped": ['tempest.api.network [1.265828s]']} @mock.patch('functest.opnfv_tests.openstack.refstack_client.tempest_conf.' 'TempestConf', return_value=mock.Mock()) - def _create_client(self, mock_conf): + def _create_client(self, *args): with mock.patch('snaps.openstack.tests.openstack_tests.' 'get_credentials', return_value=self.os_creds): return RefstackClient() @@ -49,11 +64,11 @@ class OSRefstackClientTesting(unittest.TestCase): testlist = 'testlist' client = self._create_client() with mock.patch('functest.opnfv_tests.openstack.refstack_client.' - 'refstack_client.ft_utils.execute_command') as m: + 'refstack_client.ft_utils.execute_command') as m_cmd: cmd = ("refstack-client test {0} -c {1} -v --test-list {2}" .format(insecure, config, testlist)) client.run_defcore(config, testlist) - m.assert_any_call(cmd) + m_cmd.assert_any_call(cmd) def test_run_defcore(self): CONST.__setattr__('OS_AUTH_URL', 'http://ip:5000/v3') @@ -62,25 +77,22 @@ class OSRefstackClientTesting(unittest.TestCase): testlist = 'testlist' client = self._create_client() with mock.patch('functest.opnfv_tests.openstack.refstack_client.' - 'refstack_client.ft_utils.execute_command') as m: + 'refstack_client.ft_utils.execute_command') as m_cmd: cmd = ("refstack-client test {0} -c {1} -v --test-list {2}" .format(insecure, config, testlist)) client.run_defcore(config, testlist) - m.assert_any_call(cmd) + m_cmd.assert_any_call(cmd) @mock.patch('functest.opnfv_tests.openstack.refstack_client.' 'refstack_client.LOGGER.info') @mock.patch('__builtin__.open', side_effect=Exception) - def test_parse_refstack_result_missing_log_file(self, mock_open, - mock_logger_info): - self.case_name = 'refstack_defcore' - self.result = 0 + def test_parse_refstack_result_fail(self, *args): self._create_client().parse_refstack_result() - mock_logger_info.assert_called_once_with( + args[1].assert_called_once_with( "Testcase %s success_rate is %s%%", self.case_name, self.result) - def test_parse_refstack_result_default(self): + def test_parse_refstack_result_ok(self): log_file = (''' {0} tempest.api.compute [18.464988s] ... ok {0} tempest.api.volume [0.230334s] ... FAILED @@ -90,11 +102,6 @@ class OSRefstackClientTesting(unittest.TestCase): - Skipped: 1 - Failed: 1 ''') - self.details = {"tests": 3, - "failures": 1, - "success": ['tempest.api.compute [18.464988s]'], - "errors": ['tempest.api.volume [0.230334s]'], - "skipped": ['tempest.api.network [1.265828s]']} client = self._create_client() with mock.patch('__builtin__.open', mock.mock_open(read_data=log_file)): @@ -108,16 +115,6 @@ class OSRefstackClientTesting(unittest.TestCase): del kwargs[key] return kwargs - def _test_main(self, status, *args): - kwargs = self._get_main_kwargs() - client = self._create_client() - self.assertEqual(client.main(**kwargs), status) - if len(args) > 0: - args[0].assert_called_once_with( - RefstackClient.result_dir) - if len(args) > 1: - args - def _test_main_missing_keyword(self, key): kwargs = self._get_main_kwargs(key) client = self._create_client() diff --git a/functest/tests/unit/openstack/tempest/test_conf_utils.py b/functest/tests/unit/openstack/tempest/test_conf_utils.py index 9df97b4c7..50b0edc60 100644 --- a/functest/tests/unit/openstack/tempest/test_conf_utils.py +++ b/functest/tests/unit/openstack/tempest/test_conf_utils.py @@ -159,9 +159,23 @@ class OSTempestConfUtilsTesting(unittest.TestCase): def test_backup_tempest_config_default(self): with mock.patch('functest.opnfv_tests.openstack.tempest.' - 'conf_utils.shutil.copyfile') as m1: + 'conf_utils.os.path.exists', + return_value=False), \ + mock.patch('functest.opnfv_tests.openstack.tempest.' + 'conf_utils.os.makedirs') as m1, \ + mock.patch('functest.opnfv_tests.openstack.tempest.' + 'conf_utils.shutil.copyfile') as m2: conf_utils.backup_tempest_config('test_conf_file') self.assertTrue(m1.called) + self.assertTrue(m2.called) + + with mock.patch('functest.opnfv_tests.openstack.tempest.' + 'conf_utils.os.path.exists', + return_value=True), \ + mock.patch('functest.opnfv_tests.openstack.tempest.' + 'conf_utils.shutil.copyfile') as m2: + conf_utils.backup_tempest_config('test_conf_file') + self.assertTrue(m2.called) def test_configure_tempest_default(self): with mock.patch('functest.opnfv_tests.openstack.tempest.' diff --git a/functest/tests/unit/openstack/tempest/test_tempest.py b/functest/tests/unit/openstack/tempest/test_tempest.py index 54d7d49bb..6fe103f18 100644 --- a/functest/tests/unit/openstack/tempest/test_tempest.py +++ b/functest/tests/unit/openstack/tempest/test_tempest.py @@ -171,6 +171,19 @@ class OSTempestTesting(unittest.TestCase): @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs') @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' 'TempestResourcesManager.create', return_value={}) + @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' + 'get_active_compute_cnt', side_effect=Exception) + def test_run_get_active_compute_cnt_ko(self, *args): + self.assertEqual(self.tempestcommon.run(), + testcase.TestCase.EX_RUN_ERROR) + + @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' + 'os.path.exists', return_value=False) + @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs') + @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' + 'TempestResourcesManager.create', return_value={}) + @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' + 'get_active_compute_cnt', return_value=2) @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' 'conf_utils.configure_tempest', side_effect=Exception) def test_run_configure_tempest_ko(self, *args): @@ -182,6 +195,8 @@ class OSTempestTesting(unittest.TestCase): @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.os.makedirs') @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' 'TempestResourcesManager.create', return_value={}) + @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.' + 'get_active_compute_cnt', return_value=2) @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.' 'conf_utils.configure_tempest') def _test_run(self, status, *args): diff --git a/functest/tests/unit/vnf/ims/test_cloudify_ims.py b/functest/tests/unit/vnf/ims/test_cloudify_ims.py index f0483c69f..cdd657aac 100644 --- a/functest/tests/unit/vnf/ims/test_cloudify_ims.py +++ b/functest/tests/unit/vnf/ims/test_cloudify_ims.py @@ -13,8 +13,6 @@ import mock from functest.core import vnf from functest.opnfv_tests.vnf.ims import cloudify_ims -from snaps.openstack.os_credentials import OSCreds - class CloudifyImsTesting(unittest.TestCase): @@ -57,114 +55,10 @@ class CloudifyImsTesting(unittest.TestCase): 'vnf': {}, 'test_vnf': {}} - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - return_value={'auth_url': 'test/v1'}) - @mock.patch('snaps.openstack.create_image.OpenStackImage.create') - def test_prepare_default(self, *args): - self.assertIsNone(self.ims_vnf.prepare()) - args[4].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - return_value={'auth_url': 'test/no_v'}) - @mock.patch('snaps.openstack.create_image.OpenStackImage.create') - def test_prepare_bad_auth_url(self, *args): - with self.assertRaises(Exception): - self.ims_vnf.image_creator( - OSCreds(username='user', password='pass', auth_url='url', - project_name='project', identity_api_version=3), - mock.Mock()) - args[0].assert_not_called() - def test_prepare_missing_param(self): with self.assertRaises(vnf.VnfPreparationException): self.ims_vnf.prepare() - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - side_effect=Exception) - def test_prepare_keystone_exception(self, *args): - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[0].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - side_effect=Exception) - def test_prepare_tenant_exception(self, *args): - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[1].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - side_effect=Exception) - def test_prepare_user_exception(self, *args): - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[2].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - side_effect=Exception) - def test_prepare_credentials_exception(self, *args): - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[0].assert_called_once_with() - - # @mock.patch('snaps.openstack.create_keypairs.OpenStackKeypair', - # side_effect=Exception) - # def test_deploy_orchestrator_keypair_exception(self, *args): - # with self.assertRaises(vnf.OrchestratorDeploymentException): - # self.ims_vnf.deploy_orchestrator() - - # def test_deploy_orchestrator_network_creation_fail(self): - # def test_deploy_orchestrator_floatting_ip_creation_fail(self): - # def test_deploy_orchestrator_flavor_fail(self): - # def test_deploy_orchestrator_get_image_id_fail(self): - # def test_deploy_orchestrator_create_instance_fail(self): - # def test_deploy_orchestrator_secgroup_fail(self): - # def test_deploy_orchestrator_add_floating_ip_fail(self): - # def test_deploy_orchestrator_get_endpoint_fail(self): - # def test_deploy_orchestrator_initiate CloudifyClient_fail(self): - # def test_deploy_orchestrator_get_status_fail(self): - # - - # def test_deploy_vnf(self): - # def test_deploy_vnf_publish_fail(self): - # def test_deploy_vnf_get_flavor_fail(self): - # def test_deploy_vnf_get_external_net_fail(self): - # def test_deploy_vnf_deployment_create_fail(self): - # def test_deploy_vnf_start_fail(self): - # - # def test_test_vnf(self): - # def test_test_vnf_deployment_get_fail(self): - # def test_test_vnf_run_live_test_fail(self): - # - # def test_clean(self): - # def test_clean_execution_start_fail(self): - # def test_clean_deployment_delete_fail(self): - # def test_clean_blueprint_delete_fail(self): - if __name__ == "__main__": logging.disable(logging.CRITICAL) diff --git a/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py b/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py index ef227ca43..2e83f30a4 100644 --- a/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py +++ b/functest/tests/unit/vnf/ims/test_orchestra_clearwaterims.py @@ -11,7 +11,6 @@ import logging import unittest import mock -from snaps.openstack.os_credentials import OSCreds from functest.core import vnf from functest.opnfv_tests.vnf.ims import orchestra_clearwaterims @@ -110,117 +109,11 @@ class OrchestraClearwaterImsTesting(unittest.TestCase): 'vnf': {}, 'test_vnf': {}} - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - return_value={'auth_url': 'test/v1'}) - @mock.patch( - 'functest.utils.openstack_utils.get_tenant_id', - return_value={'mocked_tenant_id'}) - @mock.patch( - 'functest.utils.openstack_utils.get_floating_ips', - return_value=[]) - @mock.patch('snaps.openstack.create_image.OpenStackImage.create') - @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create') - @mock.patch( - 'snaps.openstack.create_security_group.OpenStackSecurityGroup.create') - @mock.patch('snaps.openstack.create_network.OpenStackNetwork.create') - @mock.patch('snaps.openstack.create_router.OpenStackRouter.create') - @mock.patch( - 'functest.opnfv_tests.openstack.snaps.snaps_utils.get_ext_net_name') - @mock.patch( - 'functest.opnfv_tests.openstack.snaps.' - 'snaps_utils.neutron_utils.create_floating_ip') - def test_prepare_default(self, *args): - """Testing prepare function without any exceptions expected""" - self.assertIsNone(self.ims_vnf.prepare()) - args[4].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - return_value={'auth_url': 'test/no_v'}) - @mock.patch('snaps.openstack.create_image.OpenStackImage.create') - def test_prepare_bad_auth_url(self, *args): - """Testing prepare function with bad auth url""" - with self.assertRaises(Exception): - self.ims_vnf.image_creator( - OSCreds(username='user', password='pass', auth_url='url', - project_name='project', identity_api_version=3), - mock.Mock()) - args[0].assert_not_called() - def test_prepare_missing_param(self): """Testing prepare function with missing param""" with self.assertRaises(vnf.VnfPreparationException): self.ims_vnf.prepare() - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - side_effect=Exception) - def test_prepare_keystone_exception(self, *args): - """Testing prepare function with keystone exception""" - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[0].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - side_effect=Exception) - def test_prepare_tenant_exception(self, *args): - """Testing prepare function with tenant exception""" - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[1].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - side_effect=Exception) - def test_prepare_user_exception(self, *args): - """Testing prepare function with user exception""" - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[2].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - side_effect=Exception) - def test_prepare_credentials_exception(self, *args): - """Testing prepare function with credentials exception""" - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[0].assert_called_once_with() - - # # @mock.patch('functest.opnfv_tests.vnf. - # ims.orchestra_clearwaterims.get_userdata') - # def test_deploy_orchestrator(self, *args): - # floating_ip = FloatingIp - # floating_ip.ip = 'mocked_ip' - # details = {'fip':floating_ip,'flavor':{'name':'mocked_name'}} - # self.mano['details'] = details - # with mock.patch.dict(self.mano, {'details': - # {'fip':floating_ip,'flavor':{'name':'mocked_name'}}}): - # # with mock.patch.dict(self.mano, details): - # orchestra_clearwaterims.get_userdata(self.mano) - # self.assertIsNone(self.ims_vnf.deploy_orchestrator()) - # args[4].assert_called_once_with() - if __name__ == "__main__": logging.disable(logging.CRITICAL) diff --git a/functest/tests/unit/vnf/ims/test_orchestra_openims.py b/functest/tests/unit/vnf/ims/test_orchestra_openims.py index 5911cf77b..47a8d0338 100644 --- a/functest/tests/unit/vnf/ims/test_orchestra_openims.py +++ b/functest/tests/unit/vnf/ims/test_orchestra_openims.py @@ -11,7 +11,6 @@ import logging import unittest import mock -from snaps.openstack.os_credentials import OSCreds from functest.core import vnf from functest.opnfv_tests.vnf.ims import orchestra_openims @@ -112,117 +111,11 @@ class OrchestraOpenImsTesting(unittest.TestCase): 'vnf': {}, 'test_vnf': {}} - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - return_value={'auth_url': 'test/v1'}) - @mock.patch( - 'functest.utils.openstack_utils.get_tenant_id', - return_value={'mocked_tenant_id'}) - @mock.patch( - 'functest.utils.openstack_utils.get_floating_ips', - return_value=[]) - @mock.patch('snaps.openstack.create_image.OpenStackImage.create') - @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create') - @mock.patch( - 'snaps.openstack.create_security_group.OpenStackSecurityGroup.create') - @mock.patch('snaps.openstack.create_network.OpenStackNetwork.create') - @mock.patch('snaps.openstack.create_router.OpenStackRouter.create') - @mock.patch( - 'functest.opnfv_tests.openstack.snaps.snaps_utils.get_ext_net_name') - @mock.patch( - 'functest.opnfv_tests.openstack.snaps.snaps_utils.' - 'neutron_utils.create_floating_ip') - def test_prepare_default(self, *args): - """Testing prepare function without any exceptions expected""" - self.assertIsNone(self.ims_vnf.prepare()) - args[4].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - return_value={'auth_url': 'test/no_v'}) - @mock.patch('snaps.openstack.create_image.OpenStackImage.create') - def test_prepare_bad_auth_url(self, *args): - """Testing prepare function with bad auth url""" - with self.assertRaises(Exception): - self.ims_vnf.image_creator( - OSCreds(username='user', password='pass', auth_url='url', - project_name='project', identity_api_version=3), - mock.Mock()) - args[0].assert_not_called() - def test_prepare_missing_param(self): """Testing prepare function with missing param""" with self.assertRaises(vnf.VnfPreparationException): self.ims_vnf.prepare() - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - side_effect=Exception) - def test_prepare_keystone_exception(self, *args): - """Testing prepare function with keystone exception""" - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[0].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - side_effect=Exception) - def test_prepare_tenant_exception(self, *args): - """Testing prepare function with tenant exception""" - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[1].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - side_effect=Exception) - def test_prepare_user_exception(self, *args): - """Testing prepare function with user exception""" - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[2].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - side_effect=Exception) - def test_prepare_credentials_exception(self, *args): - """Testing prepare function with credentials exception""" - with self.assertRaises(vnf.VnfPreparationException): - self.ims_vnf.prepare() - args[0].assert_called_once_with() - - # # @mock.patch('functest.opnfv_tests. - # vnf.ims.orchestra_openims.get_userdata') - # def test_deploy_orchestrator(self, *args): - # floating_ip = FloatingIp - # floating_ip.ip = 'mocked_ip' - # details = {'fip':floating_ip,'flavor':{'name':'mocked_name'}} - # self.mano['details'] = details - # with mock.patch.dict(self.mano, {'details': - # {'fip':floating_ip,'flavor':{'name':'mocked_name'}}}): - # # with mock.patch.dict(self.mano, details): - # orchestra_openims.get_userdata(self.mano) - # self.assertIsNone(self.ims_vnf.deploy_orchestrator()) - # args[4].assert_called_once_with() - if __name__ == "__main__": logging.disable(logging.CRITICAL) diff --git a/functest/tests/unit/vnf/router/test_cloudify_vrouter.py b/functest/tests/unit/vnf/router/test_cloudify_vrouter.py index 7f2091be1..4f256234b 100644 --- a/functest/tests/unit/vnf/router/test_cloudify_vrouter.py +++ b/functest/tests/unit/vnf/router/test_cloudify_vrouter.py @@ -15,8 +15,6 @@ import mock from functest.core import vnf from functest.opnfv_tests.vnf.router import cloudify_vrouter -from snaps.openstack.os_credentials import OSCreds - class CloudifyVrouterTesting(unittest.TestCase): @@ -60,80 +58,10 @@ class CloudifyVrouterTesting(unittest.TestCase): 'vnf': {}, 'test_vnf': {}} - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - return_value={'auth_url': 'test/v1'}) - @mock.patch('snaps.openstack.create_image.OpenStackImage.create') - def test_prepare_default(self, *args): - self.assertIsNone(self.router_vnf.prepare()) - args[4].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - return_value={'auth_url': 'test/no_v'}) - @mock.patch('snaps.openstack.create_image.OpenStackImage.create') - def test_prepare_bad_auth_url(self, *args): - with self.assertRaises(Exception): - self.router_vnf.image_creator( - OSCreds(username='user', password='pass', auth_url='url', - project_name='project', identity_api_version=3), - mock.Mock()) - args[0].assert_not_called() - def test_prepare_missing_param(self): with self.assertRaises(vnf.VnfPreparationException): self.router_vnf.prepare() - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - side_effect=Exception) - def test_prepare_keystone_exception(self, *args): - with self.assertRaises(vnf.VnfPreparationException): - self.router_vnf.prepare() - args[0].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - side_effect=Exception) - def test_prepare_tenant_exception(self, *args): - with self.assertRaises(vnf.VnfPreparationException): - self.router_vnf.prepare() - args[1].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - side_effect=Exception) - def test_prepare_user_exception(self, *args): - with self.assertRaises(vnf.VnfPreparationException): - self.router_vnf.prepare() - args[2].assert_called_once_with() - - @mock.patch('functest.core.vnf.os_utils.get_keystone_client', - return_value='test') - @mock.patch('functest.core.vnf.os_utils.get_or_create_tenant_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_or_create_user_for_vnf', - return_value=True) - @mock.patch('functest.core.vnf.os_utils.get_credentials', - side_effect=Exception) - def test_prepare_credentials_exception(self, *args): - with self.assertRaises(vnf.VnfPreparationException): - self.router_vnf.prepare() - args[0].assert_called_once_with() - if __name__ == "__main__": logging.disable(logging.CRITICAL) diff --git a/functest/utils/functest_utils.py b/functest/utils/functest_utils.py index e4062373c..f07f59d7f 100644 --- a/functest/utils/functest_utils.py +++ b/functest/utils/functest_utils.py @@ -227,14 +227,14 @@ def get_ci_envvars(): def execute_command_raise(cmd, info=False, error_msg="", - verbose=True, output_file=None, env=None): - ret = execute_command(cmd, info, error_msg, verbose, output_file, env) + verbose=True, output_file=None): + ret = execute_command(cmd, info, error_msg, verbose, output_file) if ret != 0: raise Exception(error_msg) def execute_command(cmd, info=False, error_msg="", - verbose=True, output_file=None, env=None): + verbose=True, output_file=None): if not error_msg: error_msg = ("The command '%s' failed." % cmd) msg_exec = ("Executing command: '%s'" % cmd) @@ -243,7 +243,7 @@ def execute_command(cmd, info=False, error_msg="", logger.info(msg_exec) else: logger.debug(msg_exec) - p = subprocess.Popen(cmd, env=env, shell=True, stdout=subprocess.PIPE, + p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) if output_file: f = open(output_file, "w") diff --git a/functest/utils/openstack_utils.py b/functest/utils/openstack_utils.py index 73d1cde49..f211627a5 100644 --- a/functest/utils/openstack_utils.py +++ b/functest/utils/openstack_utils.py @@ -1195,8 +1195,13 @@ def get_image_id(glance_client, image_name): return id -def create_glance_image(glance_client, image_name, file_path, disk="qcow2", - container="bare", public="public"): +def create_glance_image(glance_client, + image_name, + file_path, + disk="qcow2", + extra_properties={}, + container="bare", + public="public"): if not os.path.isfile(file_path): logger.error("Error: file %s does not exist." % file_path) return None @@ -1211,7 +1216,8 @@ def create_glance_image(glance_client, image_name, file_path, disk="qcow2", image = glance_client.images.create(name=image_name, visibility=public, disk_format=disk, - container_format=container) + container_format=container, + **extra_properties) image_id = image.id with open(file_path) as image_data: glance_client.images.upload(image_id, image_data) @@ -1222,7 +1228,7 @@ def create_glance_image(glance_client, image_name, file_path, disk="qcow2", return None -def get_or_create_image(name, path, format): +def get_or_create_image(name, path, format, extra_properties): image_exists = False glance_client = get_glance_client() @@ -1232,7 +1238,11 @@ def get_or_create_image(name, path, format): image_exists = True else: logger.info("Creating image '%s' from '%s'..." % (name, path)) - image_id = create_glance_image(glance_client, name, path, format) + image_id = create_glance_image(glance_client, + name, + path, + format, + extra_properties) if not image_id: logger.error("Failed to create a Glance image...") else: @@ -1561,62 +1571,3 @@ def get_resource(heat_client, stack_id, resource): except Exception as e: logger.error("Error [get_resource]: %s" % e) return None - - -# ********************************************* -# TEMPEST -# ********************************************* -def init_tempest_cleanup(tempest_config_dir=None, - tempest_config_filename='tempest.conf', - output_file=None): - """ - Initialize the Tempest Cleanup utility. - See https://docs.openstack.org/tempest/latest/cleanup.html for docs. - - :param tempest_config_dir: The directory where the Tempest config file is - located. If not specified, we let Tempest pick both the directory - and the filename (i.e. second parameter is ignored) - :param tempest_config_filename: The filename of the Tempest config file - :param output_file: Optional file where to save output - """ - # The Tempest cleanup utility currently offers no cmd argument to specify - # the config file, therefore it has to be configured with env variables - env = None - if tempest_config_dir: - env = os.environ.copy() - env['TEMPEST_CONFIG_DIR'] = tempest_config_dir - env['TEMPEST_CONFIG'] = tempest_config_filename - - # If this command fails, an exception must be raised to stop the script - # otherwise the later cleanup would destroy also other resources - cmd_line = "tempest cleanup --init-saved-state" - ft_utils.execute_command_raise(cmd_line, env=env, output_file=output_file, - error_msg="Tempest cleanup init failed") - - -def perform_tempest_cleanup(tempest_config_dir=None, - tempest_config_filename='tempest.conf', - output_file=None): - """ - Perform cleanup using the Tempest Cleanup utility. - See https://docs.openstack.org/tempest/latest/cleanup.html for docs. - - :param tempest_config_dir: The directory where the Tempest config file is - located. If not specified, we let Tempest pick both the directory - and the filename (i.e. second parameter is ignored) - :param tempest_config_filename: The filename of the Tempest config file - :param output_file: Optional file where to save output - """ - # The Tempest cleanup utility currently offers no cmd argument to specify - # the config file, therefore it has to be configured with env variables - env = None - if tempest_config_dir: - env = os.environ.copy() - env['TEMPEST_CONFIG_DIR'] = tempest_config_dir - env['TEMPEST_CONFIG'] = tempest_config_filename - - # If this command fails, an exception must be raised to stop the script - # otherwise the later cleanup would destroy also other resources - cmd_line = "tempest cleanup" - ft_utils.execute_command(cmd_line, env=env, output_file=output_file, - error_msg="Tempest cleanup failed") diff --git a/requirements.txt b/requirements.txt index 75e264c38..da1b5ad56 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,6 @@ python-heatclient>=1.6.1 # Apache-2.0 python-keystoneclient>=3.8.0 # Apache-2.0 python-neutronclient>=5.1.0 # Apache-2.0 python-novaclient!=7.0.0,>=6.0.0 # Apache-2.0 -pexpect!=3.3,>=3.1 # ISC License requests!=2.12.2,>=2.10.0 # Apache-2.0 robotframework>=3.0 robotframework-httplibrary @@ -30,7 +29,7 @@ six>=1.9.0 # MIT opnfv snaps tempest>=12.1.0 # Apache-2.0 -openstack-requirements +rally SQLAlchemy<1.1.0,>=1.0.10 # MIT paramiko>=2.0 # LGPLv2.1+ Jinja2!=2.9.0,!=2.9.1,!=2.9.2,!=2.9.3,!=2.9.4,>=2.8 # BSD License (3 clause) diff --git a/upper-constraints.txt b/upper-constraints.txt index 98d7c55f5..62a460a1d 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -5,7 +5,8 @@ git+https://gerrit.opnfv.org/gerrit/sdnvpn#egg=sdnvpn git+https://gerrit.opnfv.org/gerrit/securityscanning#egg=securityscanning git+https://gerrit.opnfv.org/gerrit/sfc#egg=sfc -e git+https://gerrit.opnfv.org/gerrit/promise#egg=promise --e git+https://github.com/openstack/refstack-client#egg=refstack-client +-e git+https://gerrit.opnfv.org/gerrit/doctor#egg=doctor-test +git+https://gerrit.opnfv.org/gerrit/domino#egg=domino cloudify-rest-client===4.0 iniparse===0.4 openbaton-cli===2.2.1b7 @@ -14,4 +15,4 @@ robotframework-httplibrary===0.4.2 robotframework-requests===0.4.7 robotframework-sshlibrary===2.1.3;python_version=='2.7' IPy===0.83 --e git+https://github.com/openstack/requirements@stable/ocata#egg=openstack-requirements +os-faults===0.1.10 |