diff --git a/zaza/openstack/charm_tests/glance/setup.py b/zaza/openstack/charm_tests/glance/setup.py index 0a920c2..c992917 100644 --- a/zaza/openstack/charm_tests/glance/setup.py +++ b/zaza/openstack/charm_tests/glance/setup.py @@ -18,7 +18,6 @@ import logging import zaza.openstack.utilities.openstack as openstack_utils CIRROS_IMAGE_NAME = "cirros" -CIRROS_ALT_IMAGE_NAME = "cirros_alt" LTS_RELEASE = "bionic" LTS_IMAGE_NAME = "bionic" @@ -78,21 +77,6 @@ def add_cirros_image(glance_client=None, image_name=None): image_name=image_name) -def add_cirros_alt_image(glance_client=None, image_name=None): - """Add a cirros image to the current deployment. - - :param glance: Authenticated glanceclient - :type glance: glanceclient.Client - :param image_name: Label for the image in glance - :type image_name: str - """ - image_name = image_name or CIRROS_ALT_IMAGE_NAME - image_url = openstack_utils.find_cirros_image(arch='x86_64') - add_image(image_url, - glance_client=glance_client, - image_name=image_name) - - def add_lts_image(glance_client=None, image_name=None, release=None): """Add an Ubuntu LTS image to the current deployment. diff --git a/zaza/openstack/charm_tests/tempest/__init__.py b/zaza/openstack/charm_tests/tempest/__init__.py new file mode 100644 index 0000000..ed3be2f --- /dev/null +++ b/zaza/openstack/charm_tests/tempest/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2018 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Collection of code for setting up and using tempest.""" diff --git a/zaza/openstack/charm_tests/tempest/setup.py b/zaza/openstack/charm_tests/tempest/setup.py index 4bd8c4f..3f0a066 100644 --- a/zaza/openstack/charm_tests/tempest/setup.py +++ b/zaza/openstack/charm_tests/tempest/setup.py @@ -18,11 +18,15 @@ import os import subprocess import zaza.model +import zaza.utilities.deployment_env as deployment_env import zaza.openstack.utilities.openstack as openstack_utils import zaza.openstack.charm_tests.glance.setup as glance_setup import zaza.openstack.charm_tests.tempest.templates.tempest_v3 as tempest_v3 import zaza.openstack.charm_tests.tempest.templates.accounts as accounts +import keystoneauth1 +import novaclient + SETUP_ENV_VARS = [ 'OS_TEST_GATEWAY', 'OS_TEST_CIDR_EXT', @@ -31,6 +35,9 @@ SETUP_ENV_VARS = [ 'OS_TEST_CIDR_PRIV', 'OS_TEST_SWIFT_IP', ] +TEMPEST_FLAVOR_NAME = 'm1.tempest' +TEMPEST_ALT_FLAVOR_NAME = 'm2.tempest' +TEMPEST_CIRROS_ALT_IMAGE_NAME = 'cirros_alt' def get_app_access_ip(application_name): @@ -53,6 +60,16 @@ def add_application_ips(ctxt): ctxt['ncc'] = get_app_access_ip('nova-cloud-controller') +def add_nova_config(ctxt, keystone_session): + nova_client = openstack_utils.get_nova_session_client( + keystone_session) + for flavor in nova_client.flavors.list(): + if flavor.name == TEMPEST_FLAVOR_NAME: + ctxt['flavor_ref'] = flavor.id + if flavor.name == TEMPEST_ALT_FLAVOR_NAME: + ctxt['flavor_ref_alt'] = flavor.id + + def add_neutron_config(ctxt, keystone_session): neutron_client = openstack_utils.get_neutron_session_client( keystone_session) @@ -72,7 +89,7 @@ def add_glance_config(ctxt, keystone_session): image = openstack_utils.get_images_by_name( glance_client, glance_setup.CIRROS_IMAGE_NAME) image_alt = openstack_utils.get_images_by_name( - glance_client, glance_setup.CIRROS_ALT_IMAGE_NAME) + glance_client, TEMPEST_CIRROS_ALT_IMAGE_NAME) if image: ctxt['image_id'] = image[0].id if image_alt: @@ -89,8 +106,9 @@ def add_keystone_config(ctxt, keystone_session): def add_environment_var_config(ctxt): + deploy_env = deployment_env.get_deployment_context() for var in SETUP_ENV_VARS: - value = os.environ.get(var) + value = deploy_env.get(var) if value: ctxt[var.lower()] = value else: @@ -102,12 +120,19 @@ def add_environment_var_config(ctxt): def add_access_protocol(ctxt): overcloud_auth = openstack_utils.get_overcloud_auth() ctxt['proto'] = urllib.parse.urlparse(overcloud_auth['OS_AUTH_URL']).scheme + ctxt['admin_username'] = overcloud_auth['OS_USERNAME'] + ctxt['admin_password'] = overcloud_auth['OS_PASSWORD'] + ctxt['admin_project_name'] = overcloud_auth['OS_PROJECT_NAME'] + ctxt['admin_domain_name'] = overcloud_auth['OS_DOMAIN_NAME'] + ctxt['default_credentials_domain_name'] = overcloud_auth[ + 'OS_PROJECT_DOMAIN_NAME'] def get_tempest_context(): keystone_session = openstack_utils.get_overcloud_keystone_session() ctxt = {} add_application_ips(ctxt) + add_nova_config(ctxt, keystone_session) add_neutron_config(ctxt, keystone_session) add_glance_config(ctxt, keystone_session) add_keystone_config(ctxt, keystone_session) @@ -136,7 +161,7 @@ def setup_tempest(tempest_template, accounts_template): accounts_template) -def tempest_keystone_v3(): +def render_tempest_config_keystone_v3(): setup_tempest(tempest_v3, accounts) @@ -145,6 +170,54 @@ def clone_tempest(): subprocess.check_call( [ 'git', - 'clone', + 'clone', 'https://opendev.org/openstack/tempest', 'tempest']) + + +def add_cirros_alt_image(): + """Add a cirros image to the current deployment. + + :param glance: Authenticated glanceclient + :type glance: glanceclient.Client + :param image_name: Label for the image in glance + :type image_name: str + """ + image_url = openstack_utils.find_cirros_image(arch='x86_64') + glance_setup.add_image( + image_url, + glance_client=None, + image_name=TEMPEST_CIRROS_ALT_IMAGE_NAME) + + +def add_tempest_flavors(): + keystone_session = openstack_utils.get_overcloud_keystone_session() + nova_client = openstack_utils.get_nova_session_client( + keystone_session) + try: + nova_client.flavors.create( + name=TEMPEST_FLAVOR_NAME, + ram=256, + vcpus=1, + disk=1) + except novaclient.exceptions.Conflict: + pass + try: + nova_client.flavors.create( + name=TEMPEST_ALT_FLAVOR_NAME, + ram=512, + vcpus=1, + disk=1) + except novaclient.exceptions.Conflict: + pass + + +def add_tempest_roles(): + keystone_session = openstack_utils.get_overcloud_keystone_session() + keystone_client = openstack_utils.get_keystone_session_client( + keystone_session) + for role_name in ['Member', 'ResellerAdmin']: + try: + keystone_client.roles.create('Member') + except keystoneauth1.exceptions.http.Conflict: + pass diff --git a/zaza/openstack/charm_tests/tempest/templates/__init__.py b/zaza/openstack/charm_tests/tempest/templates/__init__.py new file mode 100644 index 0000000..1400887 --- /dev/null +++ b/zaza/openstack/charm_tests/tempest/templates/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2018 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Collection of templates for tempest.""" diff --git a/zaza/openstack/charm_tests/tempest/templates/tempest_v3.py b/zaza/openstack/charm_tests/tempest/templates/tempest_v3.py index 9e4727a..ea2d88d 100644 --- a/zaza/openstack/charm_tests/tempest/templates/tempest_v3.py +++ b/zaza/openstack/charm_tests/tempest/templates/tempest_v3.py @@ -6,17 +6,17 @@ log_file = tempest.log [auth] test_accounts_file = accounts.yaml -default_credentials_domain_name = admin_domain -admin_username = admin -admin_project_name = admin -admin_password = openstack -admin_domain_name = admin_domain +default_credentials_domain_name = {default_credentials_domain_name} +admin_username = {admin_username} +admin_project_name = {admin_project_name} +admin_password = {admin_password} +admin_domain_name = {admin_domain_name} [compute] image_ref = {image_id} image_ref_alt = {image_alt_id} -flavor_ref = 7 -flavor_ref_alt = 8 +flavor_ref = {flavor_ref} +flavor_ref_alt = {flavor_ref_alt} min_compute_nodes = 3 # TODO: review this as its release specific diff --git a/zaza/openstack/charm_tests/tempest/tests.py b/zaza/openstack/charm_tests/tempest/tests.py new file mode 100644 index 0000000..86b4f5b --- /dev/null +++ b/zaza/openstack/charm_tests/tempest/tests.py @@ -0,0 +1,14 @@ +import zaza.charm_lifecycle.test +import tempest.cmd.main + + +class TempestTest(): + + test_runner = zaza.charm_lifecycle.test.DIRECT + + def run(self): + the_app = tempest.cmd.main.Main() + return the_app.run([ + 'run', + '--smoke', + '--config', 'tempest/etc/tempest.conf'])