diff options
35 files changed, 686 insertions, 469 deletions
diff --git a/docker/components/testcases.yaml b/docker/components/testcases.yaml index ce55d85a8..081dc4c51 100644 --- a/docker/components/testcases.yaml +++ b/docker/components/testcases.yaml @@ -8,7 +8,7 @@ tiers: Extensive testing of OpenStack API. testcases: - - case_name: tempest_full_parallel + case_name: tempest_full project_name: functest criteria: 80 blocking: false @@ -21,7 +21,9 @@ tiers: scenario: '' run: module: 'functest.opnfv_tests.openstack.tempest.tempest' - class: 'TempestFullParallel' + class: 'TempestCommon' + args: + mode: '^tempest\.' - case_name: rally_full diff --git a/docker/healthcheck/Dockerfile b/docker/healthcheck/Dockerfile index 81cb7f141..e78d81c52 100644 --- a/docker/healthcheck/Dockerfile +++ b/docker/healthcheck/Dockerfile @@ -1,10 +1,20 @@ FROM opnfv/functest-core +ARG BRANCH=master +ARG OPENSTACK_TAG=stable/queens ARG ODL_TAG=85448c9d97b89989488e675b29b38ac42d8674e4 -RUN git clone https://git.opendaylight.org/gerrit/p/integration/test.git /src/odl_test && \ +COPY thirdparty-requirements.txt thirdparty-requirements.txt +RUN wget -q -O- https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=$OPENSTACK_TAG | \ + sed -E s/^tempest==+\(.*\)$/-e\ git+https:\\/\\/github.com\\/openstack\\/tempest@\\1#egg=tempest/ \ + > upper-constraints.txt && \ + wget -q -O- https://git.opnfv.org/functest/plain/upper-constraints.txt?h=$BRANCH | \ + sed -E /#egg=functest/d > upper-constraints.opnfv.txt && \ + pip install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \ + -rthirdparty-requirements.txt && \ + git clone https://git.opendaylight.org/gerrit/p/integration/test.git /src/odl_test && \ (cd /src/odl_test && git checkout $ODL_TAG) && \ - rm -r /src/odl_test/.git - + rm -r /src/odl_test/.git thirdparty-requirements.txt upper-constraints.txt \ + upper-constraints.opnfv.txt COPY testcases.yaml /usr/lib/python2.7/site-packages/xtesting/ci/testcases.yaml CMD ["run_tests", "-t", "all"] diff --git a/docker/healthcheck/testcases.yaml b/docker/healthcheck/testcases.yaml index ff3933b48..dd26e7695 100644 --- a/docker/healthcheck/testcases.yaml +++ b/docker/healthcheck/testcases.yaml @@ -35,7 +35,7 @@ tiers: required by advanced testcases (subnet, network and router). dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.tenantnetwork' @@ -51,7 +51,7 @@ tiers: all tenant network ressources required by a testcase (subnet, network and router). dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.tenantnetwork' @@ -67,7 +67,7 @@ tiers: resources and prepares a future VM attached to that network. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.singlevm' @@ -83,7 +83,7 @@ tiers: all tenant network ressources, flavors, images, etc. required by advanced testcases. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.singlevm' @@ -99,7 +99,7 @@ tiers: resources and completes it by booting a VM attached to that network. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.singlevm' @@ -115,7 +115,7 @@ tiers: all tenant network ressources and vms required by advanced testcases. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.singlevm' @@ -131,7 +131,7 @@ tiers: floating IPs over the public network. 2) Connectivity between 2 instances over a private network. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '^((?!lxd).)*$' run: module: 'functest.opnfv_tests.openstack.vping.vping_ssh' @@ -146,7 +146,7 @@ tiers: This test case verifies: 1) Boot a VM with given userdata. 2) Connectivity between 2 instances over a private network. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '^((?!lxd).)*$' run: module: @@ -164,7 +164,7 @@ tiers: from instance 1, attach it on instance 2 3) Read volume data dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '^((?!lxd).)*$' run: module: 'functest.opnfv_tests.openstack.cinder.cinder_test' @@ -180,7 +180,7 @@ tiers: integrates some test suites from upstream using Robot as the test framework. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: 'odl' run: module: 'functest.opnfv_tests.sdn.odl.odl' diff --git a/docker/smoke/thirdparty-requirements.txt b/docker/healthcheck/thirdparty-requirements.txt index 6d7ee1226..6d7ee1226 100644 --- a/docker/smoke/thirdparty-requirements.txt +++ b/docker/healthcheck/thirdparty-requirements.txt diff --git a/docker/smoke/Dockerfile b/docker/smoke/Dockerfile index 076b1a98c..4d239e581 100644 --- a/docker/smoke/Dockerfile +++ b/docker/smoke/Dockerfile @@ -4,11 +4,12 @@ ARG BRANCH=master ARG OPENSTACK_TAG=stable/queens ARG REFSTACK_TARGET=2017.09 ARG PATROLE_TAG=0.3.0 +ARG VMTP_TAG=refs/changes/14/580914/4 -COPY thirdparty-requirements.txt thirdparty-requirements.txt -RUN apk --no-cache add --virtual .build-deps --update \ +RUN apk --no-cache add --update libxml2 libxslt && \ + apk --no-cache add --virtual .build-deps --update \ python-dev build-base linux-headers libffi-dev \ - openssl-dev libjpeg-turbo-dev && \ + openssl-dev libjpeg-turbo-dev libxml2-dev libxslt-dev && \ wget -q -O- https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=$OPENSTACK_TAG | \ sed -E s/^tempest==+\(.*\)$/-e\ git+https:\\/\\/github.com\\/openstack\\/tempest@\\1#egg=tempest/ \ > upper-constraints.txt && \ @@ -17,15 +18,18 @@ RUN apk --no-cache add --virtual .build-deps --update \ git clone https://github.com/openstack/patrole.git /src/patrole && \ (cd /src/patrole && git checkout $PATROLE_TAG) && \ update-requirements -s --source /src/openstack-requirements /src/patrole/ && \ + git clone https://github.com/openstack/vmtp.git /src/vmtp && \ + (cd /src/vmtp && git fetch origin $VMTP_TAG && git checkout FETCH_HEAD) && \ + update-requirements -s --source /src/openstack-requirements /src/vmtp/ && \ git clone --depth 1 https://github.com/openstack/neutron-tempest-plugin.git /src/neutron-tempest-plugin && \ update-requirements -s --source /src/openstack-requirements /src/neutron-tempest-plugin && \ git clone --depth 1 https://github.com/openstack/barbican-tempest-plugin.git /src/barbican-tempest-plugin && \ update-requirements -s --source /src/openstack-requirements /src/barbican-tempest-plugin/ && \ pip install --no-cache-dir --src /src -cupper-constraints.txt -cupper-constraints.opnfv.txt \ - /src/patrole /src/barbican-tempest-plugin /src/neutron-tempest-plugin -rthirdparty-requirements.txt && \ + /src/patrole /src/barbican-tempest-plugin /src/neutron-tempest-plugin /src/vmtp && \ virtualenv --system-site-packages /src/tempest/.venv && \ - rm -r upper-constraints.txt upper-constraints.opnfv.txt thirdparty-requirements.txt \ - /src/patrole /src/barbican-tempest-plugin /src/neutron-tempest-plugin && \ + rm -r upper-constraints.txt upper-constraints.opnfv.txt \ + /src/patrole /src/barbican-tempest-plugin /src/neutron-tempest-plugin /src/vmtp && \ mkdir -p /home/opnfv/functest/data/refstack && \ wget "https://refstack.openstack.org/api/v1/guidelines/${REFSTACK_TARGET}/tests?target=compute&type=required&alias=true&flag=false" \ -O /home/opnfv/functest/data/refstack/defcore.txt && \ diff --git a/docker/smoke/testcases.yaml b/docker/smoke/testcases.yaml index 5a93a1d7c..916aa2919 100644 --- a/docker/smoke/testcases.yaml +++ b/docker/smoke/testcases.yaml @@ -8,7 +8,7 @@ tiers: Set of basic Functional tests to validate the OPNFV scenarios. testcases: - - case_name: tempest_smoke_serial + case_name: tempest_smoke project_name: functest criteria: 100 blocking: false @@ -22,7 +22,9 @@ tiers: scenario: '' run: module: 'functest.opnfv_tests.openstack.tempest.tempest' - class: 'TempestSmokeSerial' + class: 'TempestCommon' + args: + mode: '^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$' - case_name: rally_sanity @@ -78,6 +80,23 @@ tiers: - 'test_networks_multiprovider_rbac' - + case_name: vmtp + project_name: functest + criteria: 100 + blocking: false + description: >- + VMTP is a small python application that will automatically + perform ping connectivity, round trip time measurement + (latency) and TCP/UDP throughput + dependencies: + installer: '' + scenario: '' + run: + module: + 'functest.opnfv_tests.openstack.vmtp.vmtp' + class: 'Vmtp' + + - case_name: shaker project_name: functest criteria: 100 @@ -130,8 +149,10 @@ tiers: installer: '(fuel)|(apex)|(compass)' scenario: '' run: - module: 'functest.opnfv_tests.openstack.tempest.tempest' + module: 'functest.opnfv_tests.openstack.trunk.trunk' class: 'TempestNeutronTrunk' + args: + mode: 'neutron_tempest_plugin.(api|scenario).test_trunk' - case_name: barbican @@ -146,4 +167,6 @@ tiers: scenario: '' run: module: 'functest.opnfv_tests.openstack.tempest.tempest' - class: 'TempestBarbican' + class: 'TempestCommon' + args: + mode: 'barbican_tempest_plugin.tests.(api|scenario)' diff --git a/docker/vnf/testcases.yaml b/docker/vnf/testcases.yaml index 938f0b309..bc2a425cc 100644 --- a/docker/vnf/testcases.yaml +++ b/docker/vnf/testcases.yaml @@ -8,6 +8,19 @@ tiers: Collection of VNF test cases. testcases: - + case_name: cloudify + project_name: functest + criteria: 100 + blocking: false + description: >- + This test case deploys the Cloudify orchestrator. + dependencies: + installer: '' + scenario: 'os-.*-nofeature-.*ha' + run: + module: 'functest.core.cloudify' + class: 'Cloudify' + - case_name: cloudify_ims project_name: functest criteria: 80 diff --git a/docs/release/release-notes/functest-release.rst b/docs/release/release-notes/functest-release.rst index 1c6ef227c..bb7600d35 100644 --- a/docs/release/release-notes/functest-release.rst +++ b/docs/release/release-notes/functest-release.rst @@ -34,7 +34,7 @@ The internal test cases are: * odl * snaps_smoke * neutron_trunk - * tempest_full_parallel + * tempest_full * rally_full * cloudify_ims * vyos_vrouter diff --git a/docs/testing/developer/devguide/index.rst b/docs/testing/developer/devguide/index.rst index aabd72d4c..caa1ccb3b 100644 --- a/docs/testing/developer/devguide/index.rst +++ b/docs/testing/developer/devguide/index.rst @@ -90,8 +90,8 @@ The internal test cases in Euphrates are: * odl * rally_full * rally_sanity - * tempest_smoke_serial - * tempest_full_parallel + * tempest_smoke + * tempest_full * cloudify_ims By internal, we mean that this particular test cases have been developed and/or diff --git a/docs/testing/user/userguide/reporting.rst b/docs/testing/user/userguide/reporting.rst index 337c203db..7c8c48ece 100644 --- a/docs/testing/user/userguide/reporting.rst +++ b/docs/testing/user/userguide/reporting.rst @@ -25,7 +25,7 @@ and features) corresponding to this scenario. +---------------------+---------+---------+---------+---------+ | vPing_userdata | X | X | X | X | +---------------------+---------+---------+---------+---------+ - | tempest_smoke_serial| X | X | X | X | + | tempest_smoke | X | X | X | X | +---------------------+---------+---------+---------+---------+ | rally_sanity | X | X | X | X | +---------------------+---------+---------+---------+---------+ diff --git a/docs/testing/user/userguide/test_details.rst b/docs/testing/user/userguide/test_details.rst index 688b67431..992b546f5 100644 --- a/docs/testing/user/userguide/test_details.rst +++ b/docs/testing/user/userguide/test_details.rst @@ -166,17 +166,14 @@ console output is stored to a *log* file for further analysis. The Tempest testcases are distributed across three Tiers: - * Smoke Tier - Test Case 'tempest_smoke_serial' - * Components Tier - Test case 'tempest_full_parallel' + * Smoke Tier - Test Case 'tempest_smoke' + * Components Tier - Test case 'tempest_full' * Neutron Trunk Port - Test case 'neutron_trunk' * OpenStack interop testcases - Test case 'refstack_defcore' * Testing and verifying RBAC policy enforcement - Test case 'patrole' -NOTE: Test case 'tempest_smoke_serial' executes a defined set of tempest smoke -tests with a single thread (i.e. serial mode). Test case -'tempest_full_parallel' executes all defined Tempest tests using several -concurrent threads (i.e. parallel mode). The number of threads activated -corresponds to the number of available logical CPUs. +NOTE: Test case 'tempest_smoke' executes a defined set of tempest smoke +tests. Test case 'tempest_full' executes all defined Tempest tests. NOTE: The 'neutron_trunk' test set allows to connect a VM to multiple VLAN separated networks using a single NIC. The feature neutron trunk ports have diff --git a/docs/testing/user/userguide/test_overview.rst b/docs/testing/user/userguide/test_overview.rst index d85668687..2ff14f732 100644 --- a/docs/testing/user/userguide/test_overview.rst +++ b/docs/testing/user/userguide/test_overview.rst @@ -55,7 +55,7 @@ validate the scenario for the release. | | +------------+----------------------------------+ | | | tempest | Generate and run a relevant | | | | \_smoke | Tempest Test Suite in smoke mode.| -| | | \_serial | The generated test set is | +| | | | The generated test set is | | | | | dependent on the OpenStack | | | | | deployment environment | | | +------------+----------------------------------+ diff --git a/docs/testing/user/userguide/troubleshooting.rst b/docs/testing/user/userguide/troubleshooting.rst index 375b6ed28..5755544e6 100644 --- a/docs/testing/user/userguide/troubleshooting.rst +++ b/docs/testing/user/userguide/troubleshooting.rst @@ -20,8 +20,7 @@ VIM --- This section covers the test cases related to the VIM (healthcheck, vping_ssh, -vping_userdata, tempest_smoke_serial, tempest_full_parallel, rally_sanity, -rally_full). +vping_userdata, tempest_smoke, tempest_full, rally_sanity, rally_full). vPing common ^^^^^^^^^^^^ diff --git a/functest/ci/config_aarch64_patch.yaml b/functest/ci/config_aarch64_patch.yaml index b288641e1..00020af6a 100644 --- a/functest/ci/config_aarch64_patch.yaml +++ b/functest/ci/config_aarch64_patch.yaml @@ -94,6 +94,15 @@ os: hw_disk_bus: 'scsi' hw_scsi_model: 'virtio-scsi' + vmtp: + image: + /home/opnfv/functest/images/ubuntu-14.04-server-cloudimg-arm64-uefi1.img + extra_properties: + hw_firmware_type: 'uefi' + hw_video_model: 'vga' + hw_disk_bus: 'scsi' + hw_scsi_model: 'virtio-scsi' + shaker: image: /home/opnfv/functest/images/shaker-image-arm64.qcow2 extra_properties: diff --git a/functest/ci/config_patch.yaml b/functest/ci/config_patch.yaml index c2c6cb417..c2bfe33e7 100644 --- a/functest/ci/config_patch.yaml +++ b/functest/ci/config_patch.yaml @@ -54,6 +54,10 @@ fdio: flavor_extra_specs: {'hw:mem_page_size':'large'} extra_properties: {'hw_mem_page_size':'large'} flavor_ram: 1024 + vmtp: + flavor_extra_specs: {'hw:mem_page_size':'large'} + extra_properties: {'hw_mem_page_size':'large'} + flavor_ram: 2048 shaker: flavor_extra_specs: {'hw:mem_page_size':'large'} extra_properties: {'hw_mem_page_size':'large'} @@ -127,6 +131,10 @@ ovs: flavor_extra_specs: {'hw:mem_page_size':'large'} extra_properties: {'hw_mem_page_size':'large'} flavor_ram: 1024 + vmtp: + flavor_extra_specs: {'hw:mem_page_size':'large'} + extra_properties: {'hw_mem_page_size':'large'} + flavor_ram: 2048 shaker: flavor_extra_specs: {'hw:mem_page_size':'large'} extra_properties: {'hw_mem_page_size':'large'} diff --git a/functest/ci/testcases.yaml b/functest/ci/testcases.yaml index 166646b77..30e1c68c7 100644 --- a/functest/ci/testcases.yaml +++ b/functest/ci/testcases.yaml @@ -35,7 +35,7 @@ tiers: required by advanced testcases (subnet, network and router). dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.tenantnetwork' @@ -51,7 +51,7 @@ tiers: all tenant network ressources required by a testcase (subnet, network and router). dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.tenantnetwork' @@ -67,7 +67,7 @@ tiers: resources and prepares a future VM attached to that network. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.singlevm' @@ -83,7 +83,7 @@ tiers: all tenant network ressources, flavors, images, etc. required by advanced testcases. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.singlevm' @@ -99,7 +99,7 @@ tiers: resources and completes it by booting a VM attached to that network. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.singlevm' @@ -115,7 +115,7 @@ tiers: all tenant network ressources and vms required by advanced testcases. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '' run: module: 'functest.core.singlevm' @@ -131,7 +131,7 @@ tiers: floating IPs over the public network. 2) Connectivity between 2 instances over a private network. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '^((?!lxd).)*$' run: module: 'functest.opnfv_tests.openstack.vping.vping_ssh' @@ -146,7 +146,7 @@ tiers: This test case verifies: 1) Boot a VM with given userdata. 2) Connectivity between 2 instances over a private network. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '^((?!lxd).)*$' run: module: @@ -164,7 +164,7 @@ tiers: from instance 1, attach it on instance 2 3) Read volume data dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: '^((?!lxd).)*$' run: module: 'functest.opnfv_tests.openstack.cinder.cinder_test' @@ -180,7 +180,7 @@ tiers: integrates some test suites from upstream using Robot as the test framework. dependencies: - installer: '^((?!fuel|apex|compass|daisy|osa).)*$' + installer: '' scenario: 'odl' run: module: 'functest.opnfv_tests.sdn.odl.odl' @@ -233,7 +233,7 @@ tiers: Set of basic Functional tests to validate the OPNFV scenarios. testcases: - - case_name: tempest_smoke_serial + case_name: tempest_smoke project_name: functest criteria: 100 blocking: false @@ -247,7 +247,9 @@ tiers: scenario: '' run: module: 'functest.opnfv_tests.openstack.tempest.tempest' - class: 'TempestSmokeSerial' + class: 'TempestCommon' + args: + mode: '^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$' - case_name: rally_sanity @@ -303,6 +305,23 @@ tiers: - 'test_networks_multiprovider_rbac' - + case_name: vmtp + project_name: functest + criteria: 100 + blocking: false + description: >- + VMTP is a small python application that will automatically + perform ping connectivity, round trip time measurement + (latency) and TCP/UDP throughput + dependencies: + installer: '' + scenario: '' + run: + module: + 'functest.opnfv_tests.openstack.vmtp.vmtp' + class: 'Vmtp' + + - case_name: shaker project_name: functest criteria: 100 @@ -355,8 +374,10 @@ tiers: installer: '(fuel)|(apex)|(compass)' scenario: '' run: - module: 'functest.opnfv_tests.openstack.tempest.tempest' + module: 'functest.opnfv_tests.openstack.trunk.trunk' class: 'TempestNeutronTrunk' + args: + mode: 'neutron_tempest_plugin.(api|scenario).test_trunk' - case_name: barbican @@ -371,7 +392,9 @@ tiers: scenario: '' run: module: 'functest.opnfv_tests.openstack.tempest.tempest' - class: 'TempestBarbican' + class: 'TempestCommon' + args: + mode: 'barbican_tempest_plugin.tests.(api|scenario)' - name: features @@ -469,7 +492,7 @@ tiers: Extensive testing of OpenStack API. testcases: - - case_name: tempest_full_parallel + case_name: tempest_full project_name: functest criteria: 80 blocking: false @@ -482,7 +505,9 @@ tiers: scenario: '' run: module: 'functest.opnfv_tests.openstack.tempest.tempest' - class: 'TempestFullParallel' + class: 'TempestCommon' + args: + mode: '^tempest\.' - case_name: rally_full @@ -507,6 +532,19 @@ tiers: Collection of VNF test cases. testcases: - + case_name: cloudify + project_name: functest + criteria: 100 + blocking: false + description: >- + This test case deploys the Cloudify orchestrator. + dependencies: + installer: '' + scenario: 'os-.*-nofeature-.*ha' + run: + module: 'functest.core.cloudify' + class: 'Cloudify' + - case_name: cloudify_ims project_name: functest criteria: 80 diff --git a/functest/core/cloudify.py b/functest/core/cloudify.py new file mode 100644 index 000000000..954491f6c --- /dev/null +++ b/functest/core/cloudify.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +"""Cloudify testcase implementation.""" + +from __future__ import division + +import logging +import time + +from cloudify_rest_client import CloudifyClient + +from functest.core import singlevm + + +class Cloudify(singlevm.SingleVm2): + """Cloudify Orchestrator Case.""" + + __logger = logging.getLogger(__name__) + + filename = ('/home/opnfv/functest/images/' + 'cloudify-manager-premium-4.0.1.qcow2') + flavor_ram = 4096 + flavor_vcpus = 2 + flavor_disk = 50 + username = 'centos' + ssh_connect_loops = 12 + ports = [80, 443, 5671, 53333] + + def __init__(self, **kwargs): + """Initialize Cloudify testcase object.""" + if "case_name" not in kwargs: + kwargs["case_name"] = "cloudify" + super(Cloudify, self).__init__(**kwargs) + self.cfy_client = None + + def prepare(self): + super(Cloudify, self).prepare() + for port in self.ports: + self.cloud.create_security_group_rule( + self.sec.id, port_range_min=port, port_range_max=port, + protocol='tcp', direction='ingress') + + def execute(self): + """ + Deploy Cloudify Manager. + """ + self.cfy_client = CloudifyClient( + host=self.fip.floating_ip_address, + username='admin', password='admin', tenant='default_tenant', + api_version='v3') + self.__logger.info("Attemps running status of the Manager") + for loop in range(10): + try: + self.__logger.debug( + "status %s", self.cfy_client.manager.get_status()) + cfy_status = self.cfy_client.manager.get_status()['status'] + self.__logger.info( + "The current manager status is %s", cfy_status) + if str(cfy_status) != 'running': + raise Exception("Cloudify Manager isn't up and running") + break + except Exception: # pylint: disable=broad-except + self.__logger.info( + "try %s: Cloudify Manager isn't up and running", loop + 1) + time.sleep(30) + else: + self.__logger.error("Cloudify Manager isn't up and running") + return 1 + self.__logger.info("Cloudify Manager is up and running") + return 0 diff --git a/functest/core/singlevm.py b/functest/core/singlevm.py index 88e5155cb..61c74fd60 100644 --- a/functest/core/singlevm.py +++ b/functest/core/singlevm.py @@ -240,6 +240,7 @@ class SingleVm1(VmReady1): __logger = logging.getLogger(__name__) username = 'cirros' ssh_connect_timeout = 60 + ssh_connect_loops = 6 def __init__(self, **kwargs): if "case_name" not in kwargs: @@ -294,7 +295,7 @@ class SingleVm1(VmReady1): self.__logger.debug("vm console: \n%s", p_console) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.client.AutoAddPolicy()) - for loop in range(6): + for loop in range(self.ssh_connect_loops): try: ssh.connect( fip.floating_ip_address, @@ -367,7 +368,7 @@ class SingleVm1(VmReady1): self.cloud.delete_floating_ip(self.fip.id) self.cloud.delete_server(self.sshvm, wait=True) self.cloud.delete_security_group(self.sec.id) - self.cloud.delete_keypair(self.keypair.id) + self.cloud.delete_keypair(self.keypair.name) super(SingleVm1, self).clean() except Exception: # pylint: disable=broad-except self.__logger.exception("Cannot clean all ressources") diff --git a/functest/opnfv_tests/openstack/cinder/cinder_test.py b/functest/opnfv_tests/openstack/cinder/cinder_test.py index cc14752ea..7d4b4358b 100644 --- a/functest/opnfv_tests/openstack/cinder/cinder_test.py +++ b/functest/opnfv_tests/openstack/cinder/cinder_test.py @@ -29,6 +29,7 @@ class CinderCheck(singlevm.SingleVm2): to connect to the VMs and one data volume """ # pylint: disable=too-many-instance-attributes + volume_timeout = 60 def __init__(self, **kwargs): """Initialize testcase.""" @@ -58,11 +59,13 @@ class CinderCheck(singlevm.SingleVm2): security_groups=[self.sec.id]) (self.fip2, self.ssh2) = self.connect(self.vm2) self.volume = self.cloud.create_volume( - name='{}-volume_{}'.format(self.case_name, self.guid), size='2') + name='{}-volume_{}'.format(self.case_name, self.guid), size='2', + timeout=self.volume_timeout) def _write_data(self): assert self.cloud - self.cloud.attach_volume(self.sshvm, self.volume) + self.cloud.attach_volume(self.sshvm, self.volume, + timeout=self.volume_timeout) write_data_script = pkg_resources.resource_filename( 'functest.opnfv_tests.openstack.cinder', 'write_data.sh') try: @@ -85,7 +88,8 @@ class CinderCheck(singlevm.SingleVm2): assert self.cloud # Attach volume to VM 2 self.logger.info("Attach volume to VM 2") - self.cloud.attach_volume(self.vm2, self.volume) + self.cloud.attach_volume(self.vm2, self.volume, + timeout=self.volume_timeout) # Check volume data read_data_script = pkg_resources.resource_filename( 'functest.opnfv_tests.openstack.cinder', 'read_data.sh') @@ -101,7 +105,8 @@ class CinderCheck(singlevm.SingleVm2): self.logger.debug("read volume stdout: %s", stdout.read()) self.logger.debug("read volume stderr: %s", stderr.read()) self.logger.info("Detach volume from VM 2") - self.cloud.detach_volume(self.vm2, self.volume) + self.cloud.detach_volume(self.vm2, self.volume, + timeout=self.volume_timeout) return stdout.channel.recv_exit_status() def clean(self): diff --git a/functest/opnfv_tests/openstack/patrole/patrole.py b/functest/opnfv_tests/openstack/patrole/patrole.py index a00e17c37..efc513cdb 100644 --- a/functest/opnfv_tests/openstack/patrole/patrole.py +++ b/functest/opnfv_tests/openstack/patrole/patrole.py @@ -10,29 +10,16 @@ # pylint: disable=missing-docstring import logging -import os from six.moves import configparser from functest.opnfv_tests.openstack.tempest import tempest -from functest.utils import config class Patrole(tempest.TempestCommon): __logger = logging.getLogger(__name__) - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'patrole' - super(Patrole, self).__init__(**kwargs) - self.res_dir = os.path.join( - getattr(config.CONF, 'dir_results'), 'patrole') - self.list = os.path.join(self.res_dir, 'tempest-list.txt') - - def apply_tempest_blacklist(self): - pass - def configure(self, **kwargs): super(Patrole, self).configure(**kwargs) rconfig = configparser.RawConfigParser() @@ -46,7 +33,8 @@ class Patrole(tempest.TempestCommon): def run(self, **kwargs): for exclude in kwargs.get('exclude', []): - self.mode = "{}(?!.*{})".format(self.mode, exclude) - self.mode = "'{}(?=patrole_tempest_plugin.tests.api.({}))'".format( - self.mode, '|'.join(kwargs.get('services', []))) + kwargs['mode'] = "{}(?!.*{})".format( + kwargs.get('mode', ''), exclude) + kwargs['mode'] = '{}(?=patrole_tempest_plugin.tests.api.({}))'.format( + kwargs['mode'], '|'.join(kwargs.get('services', []))) return super(Patrole, self).run(**kwargs) diff --git a/functest/opnfv_tests/openstack/refstack/refstack.py b/functest/opnfv_tests/openstack/refstack/refstack.py index b55f7268a..8266e281d 100644 --- a/functest/opnfv_tests/openstack/refstack/refstack.py +++ b/functest/opnfv_tests/openstack/refstack/refstack.py @@ -27,19 +27,8 @@ class Refstack(tempest.TempestCommon): defcorelist = os.path.join( getattr(config.CONF, 'dir_refstack_data'), 'defcore.txt') - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'refstack' - super(Refstack, self).__init__(**kwargs) - self.res_dir = os.path.join( - getattr(config.CONF, 'dir_results'), 'refstack') - self.list = os.path.join(self.res_dir, 'tempest-list.txt') - - def generate_test_list(self): + def generate_test_list(self, **kwargs): parser = list_parser.TestListParser( getattr(config.CONF, 'dir_repo_tempest')) nfile = parser.get_normalized_test_list(Refstack.defcorelist) shutil.copyfile(nfile, self.list) - - def apply_tempest_blacklist(self): - pass diff --git a/functest/opnfv_tests/openstack/shaker/shaker.py b/functest/opnfv_tests/openstack/shaker/shaker.py index 70eb8a75b..cc8f9ec26 100644 --- a/functest/opnfv_tests/openstack/shaker/shaker.py +++ b/functest/opnfv_tests/openstack/shaker/shaker.py @@ -36,6 +36,7 @@ class Shaker(singlevm.SingleVm2): flavor_disk = 3 username = 'ubuntu' port = 9000 + ssh_connect_loops = 12 def prepare(self): super(Shaker, self).prepare() @@ -53,7 +54,7 @@ class Shaker(singlevm.SingleVm2): keystone_id = self.orig_cloud.search_services('keystone')[0].id self.__logger.debug("keystone id: %s", keystone_id) endpoint = self.orig_cloud.search_endpoints( - filters={'interface': os.environ.get('OS_INTERFACE', 'public'), + filters={'interface': 'public', 'service_id': keystone_id})[0].url self.__logger.debug("keystone endpoint: %s", endpoint) self.orig_cloud.grant_role( diff --git a/functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py b/functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py index ed3b2825e..0e9c41a23 100644 --- a/functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py +++ b/functest/opnfv_tests/openstack/snaps/snaps_suite_builder.py @@ -37,8 +37,9 @@ from snaps.openstack.tests.create_project_tests import ( CreateProjectSuccessTests, CreateProjectUserTests) from snaps.openstack.tests.create_qos_tests import ( CreateQoSTests) -from snaps.openstack.tests.create_router_tests import ( - CreateRouterSuccessTests, CreateRouterNegativeTests) +# from snaps.openstack.tests.create_router_tests import +# CreateRouterSuccessTests +from snaps.openstack.tests.create_router_tests import CreateRouterNegativeTests from snaps.openstack.tests.create_security_group_tests import ( CreateSecurityGroupTests) from snaps.openstack.tests.create_stack_tests import ( @@ -310,11 +311,13 @@ def add_openstack_integration_tests(suite, os_creds, ext_net_name, ext_net_name=ext_net_name, use_keystone=use_keystone, flavor_metadata=flavor_metadata, image_metadata=image_metadata, log_level=log_level)) - suite.addTest(OSIntegrationTestCase.parameterize( - CreateRouterSuccessTests, os_creds=os_creds, ext_net_name=ext_net_name, - use_keystone=use_keystone, - flavor_metadata=flavor_metadata, image_metadata=image_metadata, - log_level=log_level)) + # https://jira.opnfv.org/browse/SNAPS-320 + # suite.addTest(OSIntegrationTestCase.parameterize( + # CreateRouterSuccessTests, os_creds=os_creds, + # ext_net_name=ext_net_name, + # use_keystone=use_keystone, + # flavor_metadata=flavor_metadata, image_metadata=image_metadata, + # log_level=log_level)) suite.addTest(OSIntegrationTestCase.parameterize( CreateRouterNegativeTests, os_creds=os_creds, ext_net_name=ext_net_name, use_keystone=use_keystone, diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt b/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt deleted file mode 100644 index fbbee2ffc..000000000 --- a/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt +++ /dev/null @@ -1,249 +0,0 @@ -# Set of DefCore tempest test cases not flagged and required. It only contains OpenStack core (no object storage) -# The approved guidelines (2016.08) are valid for Kilo, Liberty, Mitaka and Newton releases of OpenStack -# The list can be generated using the Rest API from RefStack project: -# https://refstack.openstack.org/api/v1/guidelines/2017.01/tests?target=compute&type=required&alias=true&flag=false -tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_delete_image[id-3731d080-d4c5-4872-b41a-64d0d0021314] -tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_image_specify_multibyte_character_image_name[id-3b7c6fe4-dfe7-477c-9243-b06359db51e6] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_host_name_is_same_as_server_name[id-ac1ad47f-984b-4441-9274-c9079b7a0666] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers[id-9a438d88-10c6-4bcd-8b5b-5b6e25e1346f] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers_with_detail[id-585e934c-448e-43c4-acbf-d06a9b899997] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_created_server_vcpus[id-cbc0f52f-05aa-492b-bdc1-84b575ca294b] -tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_server_details[id-5de47127-9977-400a-936f-abcfbec1218f] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_host_name_is_same_as_server_name[id-ac1ad47f-984b-4441-9274-c9079b7a0666] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers[id-9a438d88-10c6-4bcd-8b5b-5b6e25e1346f] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers_with_detail[id-585e934c-448e-43c4-acbf-d06a9b899997] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_created_server_vcpus[id-cbc0f52f-05aa-492b-bdc1-84b575ca294b] -tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details[id-5de47127-9977-400a-936f-abcfbec1218f] -tempest.api.compute.servers.test_delete_server.DeleteServersTestJSON.test_delete_active_server[id-925fdfb4-5b13-47ea-ac8a-c36ae6fddb05] -tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_get_instance_action[id-aacc71ca-1d70-4aa5-bbf6-0ff71470e43c] -tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_list_instance_actions[id-77ca5cc5-9990-45e0-ab98-1de8fead201a] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_flavor[id-80c574cc-0925-44ba-8602-299028357dd9] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_image[id-b3304c3b-97df-46d2-8cd3-e2b6659724e7] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_name[id-f9eb2b70-735f-416c-b260-9914ac6181e4] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_status[id-de2612ab-b7dd-4044-b0b1-d2539601911f] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_limit_results[id-67aec2d0-35fe-4503-9f92-f13272b867ed] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_active_status[id-ca78e20e-fddb-4ce6-b7f7-bcbf8605e66e] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_flavor[id-573637f5-7325-47bb-9144-3476d0416908] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_image[id-05e8a8e7-9659-459a-989d-92c2f501f4ba] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_limit[id-614cdfc1-d557-4bac-915b-3e67b48eee76] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_name[id-9b067a7b-7fee-4f6a-b29c-be43fe18fc5a] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_status[id-ca78e20e-fddb-4ce6-b7f7-bcbf8605e66e] -tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filtered_by_name_wildcard[id-e9f624ee-92af-4562-8bec-437945a18dcb] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_future_date[id-74745ad8-b346-45b5-b9b8-509d7447fc1f] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_invalid_date[id-87d12517-e20a-4c9c-97b6-dd1628d6d6c9] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits[id-12c80a9f-2dec-480e-882b-98ba15757659] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_greater_than_actual_count[id-d47c17fb-eebd-4287-8e95-f20a7e627b18] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_negative_value[id-62610dd9-4713-4ee0-8beb-fd2c1aa7f950] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_string[id-679bc053-5e70-4514-9800-3dfab1a380a6] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_flavor[id-5913660b-223b-44d4-a651-a0fbfd44ca75] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_image[id-ff01387d-c7ad-47b4-ae9e-64fa214638fe] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_server_name[id-e2c77c4a-000a-4af3-a0bd-629a328bde7c] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_detail_server_is_deleted[id-93055106-2d34-46fe-af68-d9ddbf7ee570] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_status_non_existing[id-fcdf192d-0f74-4d89-911f-1ec002b822c4] -tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_with_a_deleted_server[id-24a26f1a-1ddc-4eea-b0d7-a90cc874ad8f] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_lock_unlock_server[id-80a8094c-211e-440a-ab88-9e59d556c7ee] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_reboot_server_hard[id-2cb1baf6-ac8d-4429-bf0d-ba8a0ba53e32] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_rebuild_server[id-aaa6cdf3-55a7-461a-add9-1c8596b9a07c] -tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_stop_start_server[id-af8eafd4-38a7-4a4b-bdbc-75145a580560] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_delete_server_metadata_item[id-127642d6-4c7b-4486-b7cd-07265a378658] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_get_server_metadata_item[id-3043c57d-7e0e-49a6-9a96-ad569c265e6a] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_list_server_metadata[id-479da087-92b3-4dcf-aeb3-fd293b2d14ce] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata[id-211021f6-21de-4657-a68f-908878cfe251] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata_item[id-58c02d4f-5c67-40be-8744-d3fa5982eb1c] -tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_update_server_metadata[id-344d981e-0c33-4997-8a5d-6c1d803e4134] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_server_with_admin_password[id-b92d5ec7-b1dd-44a2-87e4-45e888c46ef0] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_specify_keypair[id-f9e15296-d7f9-4e62-b53f-a04e89160833] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_with_existing_server_name[id-8fea6be7-065e-47cf-89b8-496e6f96c699] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_access_server_address[id-89b90870-bc13-4b73-96af-f9d4f2b70077] -tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_server_name[id-5e6ccff8-349d-4852-a8b3-055df7988dd2] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_numeric_server_name[id-fd57f159-68d6-4c2a-902b-03070828a87e] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_metadata_exceeds_length_limit[id-7fc74810-0bd2-4cd7-8244-4f33a9db865a] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_name_length_exceeds_256[id-c3e0fb12-07fc-4d76-a22e-37409887afe8] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_flavor[id-18f5227f-d155-4429-807c-ccb103887537] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_image[id-fcba1052-0a50-4cf3-b1ac-fae241edf02f] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_network_uuid[id-4e72dc2d-44c5-4336-9667-f7972e95c402] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_id_exceeding_length_limit[id-f4d7279b-5fd2-4bf2-9ba4-ae35df0d18c5] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_negative_id[id-75f79124-277c-45e6-a373-a1d6803f4cc4] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_get_non_existent_server[id-3436b02f-1b1e-4f03-881e-c6a602327439] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_invalid_ip_v6_address[id-5226dd80-1e9c-4d8a-b5f9-b26ca4763fd0] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_reboot_non_existent_server[id-d4c023a0-9c55-4747-9dd5-413b820143c7] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_deleted_server[id-98fa0458-1485-440f-873b-fe7f0d714930] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_non_existent_server[id-d86141a7-906e-4731-b187-d64a2ea61422] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_reboot_deleted_server[id-98fa0458-1485-440f-873b-fe7f0d714930] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_server_name_blank[id-dbbfd247-c40c-449e-8f6c-d2aa7c7da7cf] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_stop_non_existent_server[id-a31460a9-49e1-42aa-82ee-06e0bb7c2d03] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_name_of_non_existent_server[id-aa8eed43-e2cb-4ebf-930b-da14f6a21d81] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_name_length_exceeds_256[id-5c8e244c-dada-4590-9944-749c455b431f] -tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_set_empty_name[id-38204696-17c6-44da-9590-40f87fb5a899] -tempest.api.compute.test_quotas.QuotasTestJSON.test_get_default_quotas[id-9bfecac7-b966-4f47-913f-1a9e2c12134a] -tempest.api.compute.test_quotas.QuotasTestJSON.test_get_quotas[id-f1ef0a97-dbbb-4cca-adc5-c9fbc4f76107] -tempest.api.compute.test_versions.TestVersions.test_list_api_versions[id-6c0a0990-43b6-4529-9b61-5fd8daf7c55c] -tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_attach_detach_volume[id-52e9045a-e90d-4c0d-9087-79d657faffff] -tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_list_get_volume_attachments[id-7fa563fe-f0f7-43eb-9e22-a1ece036b513] -tempest.api.identity.v3.TestApiDiscovery.test_api_media_types[id-657c1970-4722-4189-8831-7325f3bc4265] -tempest.api.identity.v3.TestApiDiscovery.test_api_version_resources[id-b9232f5e-d9e5-4d97-b96c-28d3db4de1bd] -tempest.api.identity.v3.TestApiDiscovery.test_api_version_statuses[id-8879a470-abfb-47bb-bb8d-5a7fd279ad1e] -tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_media_types[id-657c1970-4722-4189-8831-7325f3bc4265] -tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_resources[id-b9232f5e-d9e5-4d97-b96c-28d3db4de1bd] -tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_statuses[id-8879a470-abfb-47bb-bb8d-5a7fd279ad1e] -tempest.api.identity.v3.test_tokens.TokensV3Test.test_create_token[id-6f8e4436-fc96-4282-8122-e41df57197a9] -tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_delete_image[id-f848bb94-1c6e-45a4-8726-39e3a5b23535] -tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_update_image[id-f66891a7-a35c-41a8-b590-a065c2a1caa6] -tempest.api.image.v2.test_images.ListImagesTest.test_get_image_schema[id-622b925c-479f-4736-860d-adeaf13bc371] -tempest.api.image.v2.test_images.ListImagesTest.test_get_images_schema[id-25c8d7b2-df21-460f-87ac-93130bcdc684] -tempest.api.image.v2.test_images.ListImagesTest.test_index_no_params[id-1e341d7a-90a9-494c-b143-2cdf2aeb6aee] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_container_format[id-9959ca1d-1aa7-4b7a-a1ea-0fff0499b37e] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_disk_format[id-4a4735a7-f22f-49b6-b0d9-66e1ef7453eb] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_limit[id-e914a891-3cc8-4b40-ad32-e0a39ffbddbb] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_min_max_size[id-4ad8c157-971a-4ba8-aa84-ed61154b1e7f] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_size[id-cf1b9a48-8340-480e-af7b-fe7e17690876] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_status[id-7fc9e369-0f58-4d05-9aa5-0969e2d59d15] -tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_visibility[id-7a95bb92-d99e-4b12-9718-7bc6ab73e6d2] -tempest.api.image.v2.test_images.ListImagesTest.test_list_no_params[id-1e341d7a-90a9-494c-b143-2cdf2aeb6aee] -tempest.api.image.v2.test_images.ListUserImagesTest.test_get_image_schema[id-622b925c-479f-4736-860d-adeaf13bc371] -tempest.api.image.v2.test_images.ListUserImagesTest.test_get_images_schema[id-25c8d7b2-df21-460f-87ac-93130bcdc684] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_container_format[id-9959ca1d-1aa7-4b7a-a1ea-0fff0499b37e] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_disk_format[id-4a4735a7-f22f-49b6-b0d9-66e1ef7453eb] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_limit[id-e914a891-3cc8-4b40-ad32-e0a39ffbddbb] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_min_max_size[id-4ad8c157-971a-4ba8-aa84-ed61154b1e7f] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_size[id-cf1b9a48-8340-480e-af7b-fe7e17690876] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_status[id-7fc9e369-0f58-4d05-9aa5-0969e2d59d15] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_visibility[id-7a95bb92-d99e-4b12-9718-7bc6ab73e6d2] -tempest.api.image.v2.test_images.ListUserImagesTest.test_list_no_params[id-1e341d7a-90a9-494c-b143-2cdf2aeb6aee] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_image_null_id[id-32248db1-ab88-4821-9604-c7c369f1f88c] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_non_existing_image[id-6fe40f1c-57bd-4918-89cc-8500f850f3de] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_delete_deleted_image[id-e57fc127-7ba0-4693-92d7-1d8a05ebcba9] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_image_null_id[id-ef45000d-0a72-4781-866d-4cb7bf2562ad] -tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_non_existent_image[id-668743d5-08ad-4480-b2b8-15da34f81d9f] -tempest.api.image.v2.test_images_tags.ImagesTagsTest.test_update_delete_tags_for_image[id-10407036-6059-4f95-a2cd-cbbbee7ed329] -tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_delete_non_existing_tag[id-39c023a2-325a-433a-9eea-649bf1414b19] -tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_update_tags_for_non_existing_image[id-8cd30f82-6f9a-4c6e-8034-c1b51fba43d9] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_all_attributes[id-a4d9ec4c-0306-4111-a75c-db01a709030b] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_allocation_pools[id-bec949c4-3147-4ba6-af5f-cd2306118404] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_dhcp_enabled[id-94ce038d-ff0a-4a4c-a56b-09da3ca0b55d] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw[id-9393b468-186d-496d-aa36-732348cd76e7] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw_and_allocation_pools[id-8217a149-0c6c-4cfb-93db-0486f707d13f] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_host_routes_and_dns_nameservers[id-d830de0a-be47-468f-8f02-1fd996118289] -tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_without_gateway[id-d2d596e2-8e76-47a9-ac51-d4648009f4d3] -tempest.api.network.test_networks.NetworksTest.test_create_update_delete_network_subnet[id-0e269138-0da6-4efc-a46d-578161e7b221] -tempest.api.network.test_networks.NetworksTest.test_delete_network_with_subnet[id-f04f61a9-b7f3-4194-90b2-9bcf660d1bfe] -tempest.api.network.test_networks.NetworksTest.test_list_networks[id-f7ffdeda-e200-4a7a-bcbe-05716e86bf43] -tempest.api.network.test_networks.NetworksTest.test_list_networks_fields[id-6ae6d24f-9194-4869-9c85-c313cb20e080] -tempest.api.network.test_networks.NetworksTest.test_list_subnets[id-db68ba48-f4ea-49e9-81d1-e367f6d0b20a] -tempest.api.network.test_networks.NetworksTest.test_list_subnets_fields[id-842589e3-9663-46b0-85e4-7f01273b0412] -tempest.api.network.test_networks.NetworksTest.test_show_network[id-2bf13842-c93f-4a69-83ed-717d2ec3b44e] -tempest.api.network.test_networks.NetworksTest.test_show_network_fields[id-867819bb-c4b6-45f7-acf9-90edcf70aa5e] -tempest.api.network.test_networks.NetworksTest.test_show_subnet[id-bd635d81-6030-4dd1-b3b9-31ba0cfdf6cc] -tempest.api.network.test_networks.NetworksTest.test_show_subnet_fields[id-270fff0b-8bfc-411f-a184-1e8fd35286f0] -tempest.api.network.test_networks.NetworksTest.test_update_subnet_gw_dns_host_routes_dhcp[id-3d3852eb-3009-49ec-97ac-5ce83b73010a] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_all_attributes[id-a4d9ec4c-0306-4111-a75c-db01a709030b] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_allocation_pools[id-bec949c4-3147-4ba6-af5f-cd2306118404] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_dhcp_enabled[id-94ce038d-ff0a-4a4c-a56b-09da3ca0b55d] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_gw[id-9393b468-186d-496d-aa36-732348cd76e7] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_gw_and_allocation_pools[id-8217a149-0c6c-4cfb-93db-0486f707d13f] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_with_host_routes_and_dns_nameservers[id-d830de0a-be47-468f-8f02-1fd996118289] -tempest.api.network.test_networks.NetworksTestJSON.test_create_delete_subnet_without_gateway[id-d2d596e2-8e76-47a9-ac51-d4648009f4d3] -tempest.api.network.test_networks.NetworksTestJSON.test_create_update_delete_network_subnet[id-0e269138-0da6-4efc-a46d-578161e7b221] -tempest.api.network.test_networks.NetworksTestJSON.test_delete_network_with_subnet[id-f04f61a9-b7f3-4194-90b2-9bcf660d1bfe] -tempest.api.network.test_networks.NetworksTestJSON.test_list_networks[id-f7ffdeda-e200-4a7a-bcbe-05716e86bf43] -tempest.api.network.test_networks.NetworksTestJSON.test_list_networks_fields[id-6ae6d24f-9194-4869-9c85-c313cb20e080] -tempest.api.network.test_networks.NetworksTestJSON.test_list_subnets[id-db68ba48-f4ea-49e9-81d1-e367f6d0b20a] -tempest.api.network.test_networks.NetworksTestJSON.test_list_subnets_fields[id-842589e3-9663-46b0-85e4-7f01273b0412] -tempest.api.network.test_networks.NetworksTestJSON.test_show_network[id-2bf13842-c93f-4a69-83ed-717d2ec3b44e] -tempest.api.network.test_networks.NetworksTestJSON.test_show_network_fields[id-867819bb-c4b6-45f7-acf9-90edcf70aa5e] -tempest.api.network.test_networks.NetworksTestJSON.test_show_subnet[id-bd635d81-6030-4dd1-b3b9-31ba0cfdf6cc] -tempest.api.network.test_networks.NetworksTestJSON.test_show_subnet_fields[id-270fff0b-8bfc-411f-a184-1e8fd35286f0] -tempest.api.network.test_networks.NetworksTestJSON.test_update_subnet_gw_dns_host_routes_dhcp[id-3d3852eb-3009-49ec-97ac-5ce83b73010a] -tempest.api.network.test_ports.PortsTestJSON.test_create_bulk_port[id-67f1b811-f8db-43e2-86bd-72c074d4a42c] -tempest.api.network.test_ports.PortsTestJSON.test_create_port_in_allowed_allocation_pools[id-0435f278-40ae-48cb-a404-b8a087bc09b1] -tempest.api.network.test_ports.PortsTestJSON.test_create_update_delete_port[id-c72c1c0c-2193-4aca-aaa4-b1442640f51c] -tempest.api.network.test_ports.PortsTestJSON.test_list_ports[id-cf95b358-3e92-4a29-a148-52445e1ac50e] -tempest.api.network.test_ports.PortsTestJSON.test_list_ports_fields[id-ff7f117f-f034-4e0e-abff-ccef05c454b4] -tempest.api.network.test_ports.PortsTestJSON.test_show_port[id-c9a685bd-e83f-499c-939f-9f7863ca259f] -tempest.api.network.test_ports.PortsTestJSON.test_show_port_fields[id-45fcdaf2-dab0-4c13-ac6c-fcddfb579dbd] -tempest.api.network.test_ports.PortsTestJSON.test_update_port_with_security_group_and_extra_attributes[id-58091b66-4ff4-4cc1-a549-05d60c7acd1a] -tempest.api.network.test_ports.PortsTestJSON.test_update_port_with_two_security_groups_and_extra_attributes[id-edf6766d-3d40-4621-bc6e-2521a44c257d] -tempest.api.network.test_security_groups.SecGroupTest.test_create_list_update_show_delete_security_group[id-bfd128e5-3c92-44b6-9d66-7fe29d22c802] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_additional_args[id-87dfbcf9-1849-43ea-b1e4-efa3eeae9f71] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_icmp_type_code[id-c9463db8-b44d-4f52-b6c0-8dbda99f26ce] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_protocol_integer_value[id-0a307599-6655-4220-bebc-fd70c64f2290] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_group_id[id-c2ed2deb-7a0c-44d8-8b4c-a5825b5c310b] -tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_ip_prefix[id-16459776-5da2-4634-bce4-4b55ee3ec188] -tempest.api.network.test_security_groups.SecGroupTest.test_create_show_delete_security_group_rule[id-cfb99e0e-7410-4a3d-8a0c-959a63ee77e9] -tempest.api.network.test_security_groups.SecGroupTest.test_list_security_groups[id-e30abd17-fef9-4739-8617-dc26da88e686] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_additional_default_security_group_fails[id-2323061e-9fbf-4eb0-b547-7e8fafc90849] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_duplicate_security_group_rule_fails[id-8fde898f-ce88-493b-adc9-4e4692879fc5] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_ethertype[id-5666968c-fff3-40d6-9efc-df1c8bd01abb] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_protocol[id-981bdc22-ce48-41ed-900a-73148b583958] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_remote_ip_prefix[id-5f8daf69-3c5f-4aaa-88c9-db1d66f68679] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_invalid_ports[id-0d9c7791-f2ad-4e2f-ac73-abf2373b0d2d] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_remote_groupid[id-4bf786fd-2f02-443c-9716-5b98e159a49a] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_security_group[id-be308db6-a7cf-4d5c-9baf-71bafd73f35e] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_delete_non_existent_security_group[id-1f1bb89d-5664-4956-9fcd-83ee0fa603df] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group[id-424fd5c3-9ddc-486a-b45f-39bf0c820fc6] -tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group_rule[id-4c094c09-000b-4e41-8100-9617600c02a6] -tempest.api.volume.test_availability_zone.AvailabilityZoneV2TestJSON.test_get_availability_zone_list[id-01f1ae88-eba9-4c6b-a011-6f7ace06b725] -tempest.api.volume.test_extensions.ExtensionsV2TestJSON.test_list_extensions[id-94607eb0-43a5-47ca-82aa-736b41bd2e2c] -tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_create_get_delete_snapshot_metadata[id-a2f20f99-e363-4584-be97-bc33afb1a56c] -tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_crud_snapshot_metadata[id-a2f20f99-e363-4584-be97-bc33afb1a56c] -tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_update_snapshot_metadata_item[id-e8ff85c5-8f97-477f-806a-3ac364a949ed] -tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_create_get_delete_volume_metadata[id-6f5b125b-f664-44bf-910f-751591fe5769] -tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_crud_volume_metadata[id-6f5b125b-f664-44bf-910f-751591fe5769] -tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_update_volume_metadata_item[id-862261c5-8df4-475a-8c21-946e50e36a20] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_attach_detach_volume_to_instance[id-fff42874-7db5-4487-a8e1-ddda5fb5288d] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_get_volume_attachment[id-9516a2c8-9135-488c-8dd6-5677a7e5f371] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_reserve_unreserve_volume[id-92c4ef64-51b2-40c0-9f7e-4749fbaaba33] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_bootable[id-63e21b4c-0a0c-41f6-bfc3-7c2816815599] -tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_readonly_update[id-fff74e1e-5bd3-4b33-9ea9-24c103bc3f59] -tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete[id-27fb0e9f-fb64-41dd-8bdb-1ffa762f0d51] -tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_as_clone[id-3f591b4a-7dc6-444c-bd51-77469506b3a1] -tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_from_image[id-54a01030-c7fc-447c-86ee-c1182beae638] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list[id-0b6ddd39-b948-471f-8038-4787978747c4] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_by_name[id-a28e8da4-0b56-472f-87a8-0f4d3f819c02] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_by_name[id-2de3a6d4-12aa-403b-a8f2-fdeb42a89623] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_param_display_name_and_status[id-777c87c1-2fc4-4883-8b8e-5c0b951d1ec8] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_display_name_and_status[id-856ab8ca-6009-4c37-b691-be1065528ad4] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_metadata[id-1ca92d3c-4a8e-4b43-93f5-e4c7fb3b291d] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_details[id-adcbb5a7-5ad8-4b61-bd10-5380e111a877] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_param_metadata[id-b5ebea1b-0603-40a0-bb41-15fcd0a53214] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_availability_zone[id-c0cfa863-3020-40d7-b587-e35f597d5d87] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_status[id-39654e13-734c-4dab-95ce-7613bf8407ce] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_availability_zone[id-e1b80d13-94f0-4ba2-a40e-386af29f8db1] -tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_status[id-2943f712-71ec-482a-bf49-d5ca06216b9f] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_attach_volumes_with_nonexistent_volume_id[id-f5e56b0a-5d02-43c1-a2a7-c9b792c2e3f6] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_invalid_size[id-1ed83a8a-682d-4dfb-a30e-ee63ffd6c049] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_snapshot_id[id-0c36f6ae-4604-4017-b0a9-34fdc63096f9] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_source_volid[id-47c73e08-4be8-45bb-bfdf-0c4e79b88344] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_volume_type[id-10254ed8-3849-454e-862e-3ab8e6aa01d2] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_out_passing_size[id-9387686f-334f-4d31-a439-33494b9e2683] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_negative[id-8b472729-9eba-446e-a83b-916bdb34bef7] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_zero[id-41331caa-eaf4-4001-869d-bc18c1869360] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_without_passing_size[id-9387686f-334f-4d31-a439-33494b9e2683] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_invalid_volume_id[id-1f035827-7c32-4019-9240-b4ec2dbd9dfd] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_volume_without_passing_volume_id[id-441a1550-5d44-4b30-af0f-a6d402f52026] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_detach_volumes_with_invalid_volume_id[id-9f9c24e4-011d-46b5-b992-952140ce237a] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_invalid_volume_id[id-30799cfd-7ee4-446c-b66c-45b383ed211b] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_volume_without_passing_volume_id[id-c6c3db06-29ad-4e91-beb0-2ab195fe49e3] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_invalid_status[id-ba94b27b-be3f-496c-a00e-0283b373fa75] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_nonexistent_name[id-9ca17820-a0e7-4cbd-a7fa-f4468735e359] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_invalid_status[id-143b279b-7522-466b-81be-34a87d564a7c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_nonexistent_name[id-0f4aa809-8c7b-418f-8fb3-84c7a5dfc52f] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_negative_volume_status[id-449c4ed2-ecdd-47bb-98dc-072aeccf158c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_nonexistent_volume_id[id-ac6084c0-0546-45f9-b284-38a367e0e0e2] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_unreserve_volume_with_nonexistent_volume_id[id-eb467654-3dc1-4a72-9b46-47c29d22654c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_empty_volume_id[id-72aeca85-57a5-4c1f-9057-f320f9ea575b] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_invalid_volume_id[id-e66e40d6-65e6-4e75-bdc7-636792fa152d] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_nonexistent_volume_id[id-0186422c-999a-480e-a026-6a665744c30c] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_delete_nonexistent_volume_id[id-555efa6e-efcd-44ef-8a3b-4a7ca4837a29] -tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_get_nonexistent_volume_id[id-f131c586-9448-44a4-a8b0-54ca838aa43e] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshot_create_get_list_update_delete[id-2a8abbe4-d871-46db-b049-c41f5af8216e] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshots_list_details_with_params[id-220a1022-1fcd-4a74-a7bd-6b859156cda2] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshots_list_with_params[id-59f41f43-aebf-48a9-ab5d-d76340fab32b] -tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_volume_from_snapshot[id-677863d1-3142-456d-b6ac-9924f667a7f4] -tempest.api.volume.test_volumes_snapshots_list.VolumesV2SnapshotListTestJSON.test_snapshots_list_details_with_params[id-220a1022-1fcd-4a74-a7bd-6b859156cda2] -tempest.api.volume.test_volumes_snapshots_list.VolumesV2SnapshotListTestJSON.test_snapshots_list_with_params[id-59f41f43-aebf-48a9-ab5d-d76340fab32b] -tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_with_nonexistent_volume_id[id-e3e466af-70ab-4f4b-a967-ab04e3532ea7] -tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_without_passing_volume_id[id-bb9da53e-d335-4309-9c15-7e76fd5e4d6d] -tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_pagination[id-e9138a2c-f67b-4796-8efa-635c196d01de] -tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_with_multiple_params[id-2a7064eb-b9c3-429b-b888-33928fc5edd3] -tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_pagination[id-af55e775-8e4b-4feb-8719-215c43b0238c] diff --git a/functest/opnfv_tests/openstack/tempest/tempest.py b/functest/opnfv_tests/openstack/tempest/tempest.py index 05e1021b2..3701e485f 100644 --- a/functest/opnfv_tests/openstack/tempest/tempest.py +++ b/functest/opnfv_tests/openstack/tempest/tempest.py @@ -19,7 +19,6 @@ import shutil import subprocess import time -from six.moves import configparser from xtesting.core import testcase import yaml @@ -35,15 +34,12 @@ class TempestCommon(singlevm.VmReady1): # pylint: disable=too-many-instance-attributes """TempestCommon testcases implementation class.""" - TEMPEST_RESULTS_DIR = os.path.join( - getattr(config.CONF, 'dir_results'), 'tempest') - visibility = 'public' def __init__(self, **kwargs): + if "case_name" not in kwargs: + kwargs["case_name"] = 'tempest' super(TempestCommon, self).__init__(**kwargs) - self.mode = "" - self.option = [] self.verifier_id = conf_utils.get_verifier_id() self.verifier_repo_dir = conf_utils.get_verifier_repo_dir( self.verifier_id) @@ -51,7 +47,8 @@ class TempestCommon(singlevm.VmReady1): self.deployment_dir = conf_utils.get_verifier_deployment_dir( self.verifier_id, self.deployment_id) self.verification_id = None - self.res_dir = TempestCommon.TEMPEST_RESULTS_DIR + self.res_dir = os.path.join( + getattr(config.CONF, 'dir_results'), self.case_name) self.raw_list = os.path.join(self.res_dir, 'test_raw_list.txt') self.list = os.path.join(self.res_dir, 'test_list.txt') self.conf_file = None @@ -103,11 +100,11 @@ class TempestCommon(singlevm.VmReady1): shutil.copyfile(conf_file, os.path.join(res_dir, 'tempest.conf')) - def generate_test_list(self): + def generate_test_list(self, **kwargs): """Generate test list based on the test mode.""" LOGGER.debug("Generating test case list...") self.backup_tempest_config(self.conf_file, '/etc') - if self.mode == 'custom': + if kwargs.get('mode') == 'custom': if os.path.isfile(conf_utils.TEMPEST_CUSTOM): shutil.copyfile( conf_utils.TEMPEST_CUSTOM, self.list) @@ -115,13 +112,9 @@ class TempestCommon(singlevm.VmReady1): raise Exception("Tempest test list file %s NOT found." % conf_utils.TEMPEST_CUSTOM) else: - if self.mode == 'smoke': - testr_mode = r"'^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$'" - elif self.mode == 'full': - testr_mode = r"'^tempest\.'" - else: - testr_mode = self.mode - cmd = "(cd {0}; stestr list {1} >{2} 2>/dev/null)".format( + testr_mode = kwargs.get( + 'mode', r'^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$') + cmd = "(cd {0}; stestr list '{1}' >{2} 2>/dev/null)".format( self.verifier_repo_dir, testr_mode, self.list) output = subprocess.check_output(cmd, shell=True) LOGGER.info("%s\n%s", cmd, output) @@ -166,11 +159,11 @@ class TempestCommon(singlevm.VmReady1): result_file.write(str(cases_line) + '\n') result_file.close() - def run_verifier_tests(self): + def run_verifier_tests(self, **kwargs): """Execute tempest test cases.""" cmd = ["rally", "verify", "start", "--load-list", self.list] - cmd.extend(self.option) + cmd.extend(kwargs.get('option', [])) LOGGER.info("Starting Tempest test suite: '%s'.", cmd) f_stdout = open( @@ -285,9 +278,9 @@ class TempestCommon(singlevm.VmReady1): try: super(TempestCommon, self).run(**kwargs) self.configure(**kwargs) - self.generate_test_list() + self.generate_test_list(**kwargs) self.apply_tempest_blacklist() - self.run_verifier_tests() + self.run_verifier_tests(**kwargs) self.parse_verifier_result() self.generate_report() res = testcase.TestCase.EX_OK @@ -304,85 +297,3 @@ class TempestCommon(singlevm.VmReady1): super(TempestCommon, self).clean() self.cloud.delete_image(self.image_alt) self.orig_cloud.delete_flavor(self.flavor_alt.id) - - -class TempestSmokeSerial(TempestCommon): - """Tempest smoke serial testcase implementation.""" - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'tempest_smoke_serial' - TempestCommon.__init__(self, **kwargs) - self.mode = "smoke" - self.option = ["--concurrency", "1"] - - -class TempestNeutronTrunk(TempestCommon): - """Tempest neutron trunk testcase implementation.""" - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'neutron_trunk' - TempestCommon.__init__(self, **kwargs) - self.mode = "'neutron_tempest_plugin.(api|scenario).test_trunk'" - self.res_dir = os.path.join( - getattr(config.CONF, 'dir_results'), 'neutron_trunk') - self.raw_list = os.path.join(self.res_dir, 'test_raw_list.txt') - self.list = os.path.join(self.res_dir, 'test_list.txt') - - def configure(self, **kwargs): - super(TempestNeutronTrunk, self).configure(**kwargs) - rconfig = configparser.RawConfigParser() - rconfig.read(self.conf_file) - rconfig.set('network-feature-enabled', 'api_extensions', 'all') - with open(self.conf_file, 'wb') as config_file: - rconfig.write(config_file) - - -class TempestBarbican(TempestCommon): - """Tempest Barbican testcase implementation.""" - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'barbican' - TempestCommon.__init__(self, **kwargs) - self.mode = "'barbican_tempest_plugin.tests.(api|scenario)'" - self.res_dir = os.path.join( - getattr(config.CONF, 'dir_results'), 'barbican') - self.raw_list = os.path.join(self.res_dir, 'test_raw_list.txt') - self.list = os.path.join(self.res_dir, 'test_list.txt') - - -class TempestSmokeParallel(TempestCommon): - """Tempest smoke parallel testcase implementation.""" - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'tempest_smoke_parallel' - TempestCommon.__init__(self, **kwargs) - self.mode = "smoke" - - -class TempestFullParallel(TempestCommon): - """Tempest full parallel testcase implementation.""" - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'tempest_full_parallel' - TempestCommon.__init__(self, **kwargs) - self.mode = "full" - - -class TempestCustom(TempestCommon): - """Tempest custom testcase implementation.""" - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'tempest_custom' - TempestCommon.__init__(self, **kwargs) - self.mode = "custom" - self.option = ["--concurrency", "1"] - - -class TempestDefcore(TempestCommon): - """Tempest Defcore testcase implementation.""" - def __init__(self, **kwargs): - if "case_name" not in kwargs: - kwargs["case_name"] = 'tempest_defcore' - TempestCommon.__init__(self, **kwargs) - self.mode = "defcore" - self.option = ["--concurrency", "1"] diff --git a/functest/opnfv_tests/openstack/trunk/__init__.py b/functest/opnfv_tests/openstack/trunk/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/functest/opnfv_tests/openstack/trunk/__init__.py diff --git a/functest/opnfv_tests/openstack/trunk/trunk.py b/functest/opnfv_tests/openstack/trunk/trunk.py new file mode 100644 index 000000000..8d177675b --- /dev/null +++ b/functest/opnfv_tests/openstack/trunk/trunk.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +# pylint: disable=missing-docstring + +from six.moves import configparser + +from functest.opnfv_tests.openstack.tempest import tempest + + +class TempestNeutronTrunk(tempest.TempestCommon): + """Tempest neutron trunk testcase implementation.""" + + def configure(self, **kwargs): + super(TempestNeutronTrunk, self).configure(**kwargs) + rconfig = configparser.RawConfigParser() + rconfig.read(self.conf_file) + rconfig.set('network-feature-enabled', 'api_extensions', 'all') + with open(self.conf_file, 'wb') as config_file: + rconfig.write(config_file) + self.backup_tempest_config(self.conf_file, self.res_dir) diff --git a/functest/opnfv_tests/openstack/vmtp/__init__.py b/functest/opnfv_tests/openstack/vmtp/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/functest/opnfv_tests/openstack/vmtp/__init__.py diff --git a/functest/opnfv_tests/openstack/vmtp/vmtp.py b/functest/opnfv_tests/openstack/vmtp/vmtp.py new file mode 100644 index 000000000..52d1d6d75 --- /dev/null +++ b/functest/opnfv_tests/openstack/vmtp/vmtp.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +""" +VMTP_ is a small python application that will automatically perform ping +connectivity, round trip time measurement (latency) and TCP/UDP throughput +measurement for the following East/West flows on any OpenStack deployment: + +- VM to VM same network (private fixed IP, flow #1) +- VM to VM different network using fixed IP (same as intra-tenant L3 fixed IP, + flow #2) +- VM to VM different network using floating IP and NAT (same as floating IP + inter-tenant L3, flow #3) + +.. _VMTP: http://vmtp.readthedocs.io/en/latest/ +""" + +import json +import logging +import os +import subprocess +import tempfile +import time +import yaml + +from xtesting.core import testcase + +from functest.core import singlevm +from functest.utils import env + + +class Vmtp(singlevm.VmReady1): + """Class to run Vmtp_ as an OPNFV Functest testcase + + .. _Vmtp: http://vmtp.readthedocs.io/en/latest/ + """ + # pylint: disable=too-many-instance-attributes + + __logger = logging.getLogger(__name__) + + filename = ('/home/opnfv/functest/images/' + 'ubuntu-14.04-server-cloudimg-amd64-disk1.img') + flavor_ram = 2048 + flavor_vcpus = 1 + flavor_disk = 0 + + def __init__(self, **kwargs): + if "case_name" not in kwargs: + kwargs["case_name"] = 'vmtp' + super(Vmtp, self).__init__(**kwargs) + self.config = "{}/vmtp.conf".format(self.res_dir) + (_, self.privkey_filename) = tempfile.mkstemp() + (_, self.pubkey_filename) = tempfile.mkstemp() + + def generate_keys(self): + """Generate Keys + + Raises: Exception on error + """ + assert self.cloud + name = "vmtp_{}".format(self.guid) + self.__logger.info("Creating keypair with name: '%s'", name) + keypair = self.cloud.create_keypair(name) + self.__logger.debug("keypair: %s", keypair) + with open(self.privkey_filename, 'w') as key_file: + key_file.write(keypair.private_key) + with open(self.pubkey_filename, 'w') as key_file: + key_file.write(keypair.public_key) + self.cloud.delete_keypair(keypair.id) + + def write_config(self): + """Write vmtp.conf + + Raises: Exception on error + """ + assert self.cloud + if not os.path.exists(self.res_dir): + os.makedirs(self.res_dir) + cmd = ['vmtp', '-sc'] + output = subprocess.check_output(cmd) + self.__logger.info("%s\n%s", " ".join(cmd), output) + with open(self.config, "w+") as conf: + vmtp_conf = yaml.load(output) + vmtp_conf["private_key_file"] = self.privkey_filename + vmtp_conf["public_key_file"] = self.pubkey_filename + vmtp_conf["image_name"] = str(self.image.name) + vmtp_conf["router_name"] = "pns_router_{}".format(self.guid) + vmtp_conf["flavor_type"] = str(self.flavor.name) + vmtp_conf["internal_network_name"] = [ + "pns-internal-net_{}".format(self.guid), + "pns-internal-net2_{}".format(self.guid)] + vmtp_conf["vm_name_client"] = "TestClient_{}".format(self.guid) + vmtp_conf["vm_name_server"] = "TestServer_{}".format(self.guid) + vmtp_conf["security_group_name"] = "pns-security{}".format( + self.guid) + vmtp_conf["dns_nameservers"] = [env.get('NAMESERVER')] + conf.write(yaml.dump(vmtp_conf)) + + def run_vmtp(self): + """Run Vmtp and generate charts + + Raises: Exception on error + """ + assert self.cloud + cmd = ['vmtp', '-d', '--json', '{}/vmtp.json'.format(self.res_dir), + '-c', self.config] + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) + self.__logger.info("%s\n%s", " ".join(cmd), output) + cmd = ['vmtp_genchart', '-c', '{}/vmtp.html'.format(self.res_dir), + '{}/vmtp.json'.format(self.res_dir)] + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) + self.__logger.info("%s\n%s", " ".join(cmd), output) + with open('{}/vmtp.json'.format(self.res_dir), 'r') as res_file: + self.details = json.load(res_file) + + def run(self, **kwargs): + self.start_time = time.time() + status = testcase.TestCase.EX_RUN_ERROR + try: + assert self.cloud + self.image = self.publish_image() + self.flavor = self.create_flavor() + self.generate_keys() + self.write_config() + self.run_vmtp() + self.result = 100 + status = testcase.TestCase.EX_OK + except subprocess.CalledProcessError as cpe: + self.__logger.error( + "Exception when calling %s\n%s", cpe.cmd, cpe.output) + self.result = 0 + except Exception: # pylint: disable=broad-except + self.__logger.exception("Cannot run vmtp") + self.result = 0 + self.stop_time = time.time() + return status + + def clean(self): + try: + assert self.cloud + os.remove(self.privkey_filename) + os.remove(self.pubkey_filename) + self.cloud.delete_image(self.image) + self.cloud.delete_network("pns-internal-net_{}".format(self.guid)) + self.cloud.delete_network("pns-internal-net2_{}".format(self.guid)) + except Exception: # pylint: disable=broad-except + pass diff --git a/functest/opnfv_tests/openstack/vping/vping_ssh.py b/functest/opnfv_tests/openstack/vping/vping_ssh.py index e3453e4c2..1fd2d975f 100644 --- a/functest/opnfv_tests/openstack/vping/vping_ssh.py +++ b/functest/opnfv_tests/openstack/vping/vping_ssh.py @@ -41,8 +41,6 @@ class VPingSSH(singlevm.SingleVm2): def execute(self): """Ping the second VM - It can be overriden to execute any command. - Returns: ping exit codes """ assert self.ssh diff --git a/functest/tests/unit/openstack/tempest/test_tempest.py b/functest/tests/unit/openstack/tempest/test_tempest.py index 2a1378572..14ba9f75f 100644 --- a/functest/tests/unit/openstack/tempest/test_tempest.py +++ b/functest/tests/unit/openstack/tempest/test_tempest.py @@ -16,6 +16,7 @@ from xtesting.core import testcase from functest.opnfv_tests.openstack.tempest import tempest from functest.opnfv_tests.openstack.tempest import conf_utils +from functest.utils import config class OSTempestTesting(unittest.TestCase): @@ -36,12 +37,6 @@ class OSTempestTesting(unittest.TestCase): return_value='test_verifier_deploy_dir'), \ mock.patch('os_client_config.make_shade'): self.tempestcommon = tempest.TempestCommon() - self.tempestsmoke_serial = tempest.TempestSmokeSerial() - self.tempestsmoke_parallel = tempest.TempestSmokeParallel() - self.tempestfull_parallel = tempest.TempestFullParallel() - self.tempestcustom = tempest.TempestCustom() - self.tempestdefcore = tempest.TempestDefcore() - self.tempestneutrontrunk = tempest.TempestNeutronTrunk() @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.error') @mock.patch('functest.opnfv_tests.openstack.tempest.tempest.LOGGER.debug') @@ -57,6 +52,7 @@ class OSTempestTesting(unittest.TestCase): self.assertTrue( (msg % conf_utils.TEMPEST_CUSTOM) in context.exception) + @mock.patch('subprocess.check_output') @mock.patch('os.remove') def test_gen_tl_cm_default(self, *args): self.tempestcommon.mode = 'custom' @@ -72,17 +68,16 @@ class OSTempestTesting(unittest.TestCase): @mock.patch('shutil.copyfile') @mock.patch('subprocess.check_output') def _test_gen_tl_mode_default(self, mode, *args): - self.tempestcommon.mode = mode - if self.tempestcommon.mode == 'smoke': - testr_mode = r"'^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$'" - elif self.tempestcommon.mode == 'full': - testr_mode = r"'^tempest\.'" + if mode == 'smoke': + testr_mode = r'^tempest\.(api|scenario).*\[.*\bsmoke\b.*\]$' + elif mode == 'full': + testr_mode = r'^tempest\.' else: testr_mode = self.tempestcommon.mode verifier_repo_dir = 'test_verifier_repo_dir' - cmd = "(cd {0}; stestr list {1} >{2} 2>/dev/null)".format( + cmd = "(cd {0}; stestr list '{1}' >{2} 2>/dev/null)".format( verifier_repo_dir, testr_mode, self.tempestcommon.list) - self.tempestcommon.generate_test_list() + self.tempestcommon.generate_test_list(mode=testr_mode) args[0].assert_called_once_with(cmd, shell=True) args[2].assert_called_once_with('/etc/tempest.conf') @@ -92,9 +87,6 @@ class OSTempestTesting(unittest.TestCase): def test_gen_tl_full_mode(self): self._test_gen_tl_mode_default('full') - def test_gen_tl_neutron_trunk_mode(self): - self._test_gen_tl_mode_default('neutron_trunk') - def test_verif_res_missing_verif_id(self): self.tempestcommon.verification_id = None with self.assertRaises(Exception): @@ -178,8 +170,11 @@ class OSTempestTesting(unittest.TestCase): 'subprocess.Popen') def test_generate_report(self, mock_popen): self.tempestcommon.verification_id = "1234" - html_file = os.path.join(tempest.TempestCommon.TEMPEST_RESULTS_DIR, - "tempest-report.html") + html_file = os.path.join( + os.path.join( + getattr(config.CONF, 'dir_results'), + self.tempestcommon.case_name), + "tempest-report.html") cmd = ["rally", "verify", "report", "--type", "html", "--uuid", "1234", "--to", html_file] self.tempestcommon.generate_report() diff --git a/functest/tests/unit/openstack/vmtp/__init__.py b/functest/tests/unit/openstack/vmtp/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/functest/tests/unit/openstack/vmtp/__init__.py diff --git a/functest/tests/unit/openstack/vmtp/test_vmtp.py b/functest/tests/unit/openstack/vmtp/test_vmtp.py new file mode 100644 index 000000000..7f8cf40c7 --- /dev/null +++ b/functest/tests/unit/openstack/vmtp/test_vmtp.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +# pylint: disable=missing-docstring + +import logging +import unittest + +import mock +import munch +import shade + +from functest.opnfv_tests.openstack.vmtp import vmtp + + +class VmtpInitTesting(unittest.TestCase): + + def _test_exc_init(self): + testcase = vmtp.Vmtp() + self.assertEqual(testcase.case_name, "vmtp") + self.assertEqual(testcase.result, 0) + for func in ['generate_keys', 'write_config', 'run_vmtp']: + with self.assertRaises(AssertionError): + getattr(testcase, func)() + self.assertEqual(testcase.run(), testcase.EX_RUN_ERROR) + self.assertEqual(testcase.clean(), None) + + @mock.patch('os_client_config.get_config', side_effect=Exception) + def test_init1(self, *args): + self._test_exc_init() + args[0].assert_called_once_with() + + @mock.patch('os_client_config.get_config') + @mock.patch('shade.OpenStackCloud', side_effect=Exception) + def test_init2(self, *args): + self._test_exc_init() + args[0].assert_called_once_with(cloud_config=mock.ANY) + args[1].assert_called_once_with() + + @mock.patch('os_client_config.get_config') + @mock.patch('shade.OpenStackCloud') + def test_case_name(self, *args): + testcase = vmtp.Vmtp(case_name="foo") + self.assertEqual(testcase.case_name, "foo") + args[0].assert_called_once_with(cloud_config=mock.ANY) + args[1].assert_called_once_with() + + +class VmtpTesting(unittest.TestCase): + + def setUp(self): + with mock.patch('os_client_config.get_config'), \ + mock.patch('shade.OpenStackCloud'): + self.testcase = vmtp.Vmtp() + self.testcase.cloud = mock.Mock() + self.testcase.cloud.create_keypair.return_value = munch.Munch( + private_key="priv", public_key="pub", id="id") + + @mock.patch('six.moves.builtins.open') + def test_generate_keys1(self, *args): + self.testcase.generate_keys() + self.testcase.cloud.create_keypair.assert_called_once_with( + 'vmtp_{}'.format(self.testcase.guid)) + self.testcase.cloud.delete_keypair.assert_called_once_with('id') + calls = [mock.call(self.testcase.privkey_filename, 'w'), + mock.call(self.testcase.pubkey_filename, 'w')] + args[0].assert_has_calls(calls, any_order=True) + + @mock.patch('six.moves.builtins.open') + def test_generate_keys2(self, *args): + # pylint: disable=bad-continuation + with mock.patch.object( + self.testcase.cloud, "create_keypair", + side_effect=shade.OpenStackCloudException(None)) as mock_obj, \ + self.assertRaises(shade.OpenStackCloudException): + self.testcase.generate_keys() + mock_obj.assert_called_once_with('vmtp_{}'.format(self.testcase.guid)) + args[0].assert_not_called() + +if __name__ == "__main__": + logging.disable(logging.CRITICAL) + unittest.main(verbosity=2) diff --git a/functest/tests/unit/openstack/vping/test_vping_ssh.py b/functest/tests/unit/openstack/vping/test_vping_ssh.py new file mode 100644 index 000000000..589668efc --- /dev/null +++ b/functest/tests/unit/openstack/vping/test_vping_ssh.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python + +# Copyright (c) 2018 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 + +# pylint: disable=missing-docstring + +import logging +import unittest + +from paramiko import ssh_exception +import mock +import munch +import shade + +from functest.opnfv_tests.openstack.vping import vping_ssh +from functest.utils import config + + +class VpingSSHTesting(unittest.TestCase): + + def setUp(self): + with mock.patch('functest.core.singlevm.SingleVm2.__init__'): + self.vping = vping_ssh.VPingSSH() + self.vping.cloud = mock.Mock() + self.vping.case_name = 'vping' + self.vping.guid = '1' + + @mock.patch('functest.core.singlevm.SingleVm2.prepare', + side_effect=Exception) + def test_prepare_exc1(self, *args): + with self.assertRaises(Exception): + self.vping.prepare() + args[0].assert_called_once_with() + + @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.' + 'boot_vm', + side_effect=Exception) + @mock.patch('functest.core.singlevm.SingleVm2.prepare') + def test_prepare_exc2(self, *args): + self.vping.sec = munch.Munch(id='foo') + with self.assertRaises(Exception): + self.vping.prepare() + args[0].assert_called_once_with() + args[1].assert_called_once_with( + '{}-vm2_{}'.format(self.vping.case_name, self.vping.guid), + security_groups=[self.vping.sec.id]) + + @mock.patch('functest.opnfv_tests.openstack.vping.vping_ssh.VPingSSH.' + 'boot_vm') + @mock.patch('functest.core.singlevm.SingleVm2.prepare') + def test_prepare(self, *args): + self.vping.sec = munch.Munch(id='foo') + self.vping.prepare() + args[0].assert_called_once_with() + args[1].assert_called_once_with( + '{}-vm2_{}'.format(self.vping.case_name, self.vping.guid), + security_groups=[self.vping.sec.id]) + + def test_execute_exc(self): + self.vping.vm2 = munch.Munch(private_v4='127.0.0.1') + self.vping.ssh = mock.Mock() + self.vping.ssh.exec_command.side_effect = ssh_exception.SSHException + with self.assertRaises(ssh_exception.SSHException): + self.vping.execute() + self.vping.ssh.exec_command.assert_called_once_with( + 'ping -c 1 {}'.format(self.vping.vm2.private_v4)) + + def _test_execute(self, ret=0): + self.vping.vm2 = munch.Munch(private_v4='127.0.0.1') + self.vping.ssh = mock.Mock() + stdout = mock.Mock() + stdout.channel.recv_exit_status.return_value = ret + self.vping.ssh.exec_command.return_value = (None, stdout, None) + self.assertEqual(self.vping.execute(), ret) + self.vping.ssh.exec_command.assert_called_once_with( + 'ping -c 1 {}'.format(self.vping.vm2.private_v4)) + + def test_execute1(self): + self._test_execute() + + def test_execute2(self): + self._test_execute(1) + + def test_clean_exc1(self): + self.vping.cloud = None + with self.assertRaises(AssertionError): + self.vping.clean() + + def test_clean_exc2(self): + mdelete_server = self.vping.cloud.delete_server + mdelete_server.side_effect = shade.OpenStackCloudException(None) + with self.assertRaises(shade.OpenStackCloudException): + self.vping.clean() + + @mock.patch('functest.core.singlevm.SingleVm2.clean', + side_effect=Exception) + def test_clean_exc3(self, *args): + self.vping.vm2 = munch.Munch() + with self.assertRaises(Exception): + self.vping.clean() + self.vping.cloud.delete_server.assert_called_once_with( + self.vping.vm2, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + args[0].assert_called_once_with() + + @mock.patch('functest.core.singlevm.SingleVm2.clean') + def test_clean(self, *args): + self.vping.vm2 = munch.Munch() + self.vping.clean() + self.vping.cloud.delete_server.assert_called_once_with( + self.vping.vm2, wait=True, + timeout=getattr(config.CONF, 'vping_vm_delete_timeout')) + args[0].assert_called_once_with() + + +if __name__ == '__main__': + logging.disable(logging.CRITICAL) + unittest.main(verbosity=2) @@ -53,12 +53,13 @@ basepython = python2.7 whitelist_externals = bash modules = functest.ci + functest.opnfv_tests.openstack.cinder functest.opnfv_tests.openstack.rally functest.opnfv_tests.openstack.refstack functest.opnfv_tests.openstack.snaps functest.opnfv_tests.openstack.tempest + functest.opnfv_tests.openstack.vmtp functest.opnfv_tests.openstack.vping - functest.opnfv_tests.openstack.cinder functest.opnfv_tests.sdn.odl functest.opnfv_tests.vnf.router functest.tests.unit.ci @@ -66,6 +67,7 @@ modules = functest.tests.unit.openstack.rally functest.tests.unit.openstack.snaps functest.tests.unit.openstack.tempest + functest.tests.unit.openstack.vmtp functest.tests.unit.openstack.vping functest.tests.unit.vnf.router functest.tests.unit.utils @@ -118,9 +120,11 @@ basepython = python2.7 dirs = functest/tests/unit/ci functest/tests/unit/odl + functest/tests/unit/openstack/vping commands = nosetests --with-coverage --cover-tests \ --cover-package functest.ci.check_deployment \ --cover-package functest.opnfv_tests.sdn.odl \ + --cover-package functest.opnfv_tests.openstack.vping.vping_ssh \ --cover-package functest.tests.unit \ --cover-min-percentage 100 {[testenv:cover]dirs} |