Code cleanup

This commit is contained in:
Corey Bryant
2020-05-18 20:04:47 +00:00
parent 19be6f7d48
commit a21ddd33e6
3 changed files with 153 additions and 17 deletions

View File

@@ -13,6 +13,7 @@
# limitations under the License.
"""Code for configuring tempest."""
import urllib.parse
import os
import shutil
@@ -43,6 +44,13 @@ TEMPEST_CIRROS_ALT_IMAGE_NAME = 'cirros_alt'
def get_app_access_ip(application_name):
"""Get the application's access IP
:param application_name: Name of application
:type application_name: str
:returns: Application's access IP
:rtype: str
"""
try:
app_config = zaza.model.get_application_config(application_name)
except KeyError:
@@ -57,12 +65,28 @@ def get_app_access_ip(application_name):
def add_application_ips(ctxt):
"""Add application access IPs to context
:param ctxt: Context dictionary
:type ctxt: dict
:returns: None
:rtype: None
"""
ctxt['keystone'] = get_app_access_ip('keystone')
ctxt['dashboard'] = get_app_access_ip('openstack-dashboard')
ctxt['ncc'] = get_app_access_ip('nova-cloud-controller')
def add_nova_config(ctxt, keystone_session):
"""Add nova config to context
:param ctxt: Context dictionary
:type ctxt: dict
:returns keystone_session: keystoneauth1.session.Session object
:type: keystoneauth1.session.Session
:returns: None
:rtype: None
"""
nova_client = openstack_utils.get_nova_session_client(
keystone_session)
for flavor in nova_client.flavors.list():
@@ -73,6 +97,15 @@ def add_nova_config(ctxt, keystone_session):
def add_neutron_config(ctxt, keystone_session):
"""Add neutron config to context
:param ctxt: Context dictionary
:type ctxt: dict
:returns keystone_session: keystoneauth1.session.Session object
:type: keystoneauth1.session.Session
:returns: None
:rtype: None
"""
neutron_client = openstack_utils.get_neutron_session_client(
keystone_session)
for net in neutron_client.list_networks()['networks']:
@@ -86,6 +119,15 @@ def add_neutron_config(ctxt, keystone_session):
def add_glance_config(ctxt, keystone_session):
"""Add glance config to context
:param ctxt: Context dictionary
:type ctxt: dict
:returns keystone_session: keystoneauth1.session.Session object
:type: keystoneauth1.session.Session
:returns: None
:rtype: None
"""
glance_client = openstack_utils.get_glance_session_client(
keystone_session)
image = openstack_utils.get_images_by_name(
@@ -99,6 +141,15 @@ def add_glance_config(ctxt, keystone_session):
def add_cinder_config(ctxt, keystone_session):
"""Add cinder config to context
:param ctxt: Context dictionary
:type ctxt: dict
:returns keystone_session: keystoneauth1.session.Session object
:type: keystoneauth1.session.Session
:returns: None
:rtype: None
"""
volume_types = ['volumev2', 'volumev3']
keystone_client = openstack_utils.get_keystone_session_client(
keystone_session)
@@ -110,6 +161,15 @@ def add_cinder_config(ctxt, keystone_session):
def add_keystone_config(ctxt, keystone_session):
"""Add keystone config to context
:param ctxt: Context dictionary
:type ctxt: dict
:returns keystone_session: keystoneauth1.session.Session object
:type: keystoneauth1.session.Session
:returns: None
:rtype: None
"""
keystone_client = openstack_utils.get_keystone_session_client(
keystone_session)
for domain in keystone_client.domains.list():
@@ -119,6 +179,13 @@ def add_keystone_config(ctxt, keystone_session):
def add_environment_var_config(ctxt):
"""Add environment variable config to context
:param ctxt: Context dictionary
:type ctxt: dict
:returns: None
:rtype: None
"""
deploy_env = deployment_env.get_deployment_context()
for var in SETUP_ENV_VARS:
value = deploy_env.get(var)
@@ -130,7 +197,14 @@ def add_environment_var_config(ctxt):
" test").format(', '.join(SETUP_ENV_VARS)))
def add_access_protocol(ctxt):
def add_auth_config(ctxt):
"""Add authorization config to context
:param ctxt: Context dictionary
:type ctxt: dict
:returns: None
:rtype: None
"""
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']
@@ -140,12 +214,14 @@ def add_access_protocol(ctxt):
ctxt['admin_domain_name'] = overcloud_auth['OS_DOMAIN_NAME']
ctxt['default_credentials_domain_name'] = overcloud_auth[
'OS_PROJECT_DOMAIN_NAME']
elif overcloud_auth['API_VERSION'] == 2:
#ctxt['admin_tenant_name'] = overcloud_auth['OS_TENANT_NAME']
pass
def get_tempest_context():
"""Generate the tempest config context
:returns: Context dictionary
:rtype: dict
"""
keystone_session = openstack_utils.get_overcloud_keystone_session()
ctxt = {}
add_application_ips(ctxt)
@@ -155,16 +231,37 @@ def get_tempest_context():
add_cinder_config(ctxt, keystone_session)
add_keystone_config(ctxt, keystone_session)
add_environment_var_config(ctxt)
add_access_protocol(ctxt)
add_auth_config(ctxt)
return ctxt
def render_tempest_config(target_file, ctxt, tempest_template):
def render_tempest_config(target_file, ctxt, template):
"""Render tempest config for specified config file and template
:param target_file: Name of file to render config to
:type target_file: str
:param ctxt: Context dictionary
:type ctxt: dict
:param template: Template module
:type template: module
:returns: None
:rtype: None
"""
# TODO: switch to jinja2 and generate config based on available services
with open(target_file, 'w') as f:
f.write(tempest_template.file_contents.format(**ctxt))
def setup_tempest(tempest_template, accounts_template):
"""Initialize tempest and render tempest config
:param tempest_template: tempest.conf template
:type tempest_template: module
:param accounts_template: accounts.yaml template
:type accounts_template: module
:returns: None
:rtype: None
"""
if os.path.isdir('tempest-workspace'):
try:
subprocess.check_call(['tempest', 'workspace', 'remove', '--rmdir', '--name', 'tempest-workspace'])
@@ -185,20 +282,28 @@ def setup_tempest(tempest_template, accounts_template):
def render_tempest_config_keystone_v2():
"""Render tempest config for Keystone V2 API
:returns: None
:rtype: None
"""
setup_tempest(tempest_v2, accounts)
def render_tempest_config_keystone_v3():
"""Render tempest config for Keystone V3 API
:returns: None
:rtype: None
"""
setup_tempest(tempest_v3, accounts)
def add_cirros_alt_image():
"""Add a cirros image to the current deployment.
"""Add cirros alternate image to overcloud
:param glance: Authenticated glanceclient
:type glance: glanceclient.Client
:param image_name: Label for the image in glance
:type image_name: str
:returns: None
:rtype: None
"""
image_url = openstack_utils.find_cirros_image(arch='x86_64')
glance_setup.add_image(
@@ -208,6 +313,11 @@ def add_cirros_alt_image():
def add_tempest_flavors():
"""Add tempest flavors to overcloud
:returns: None
:rtype: None
"""
keystone_session = openstack_utils.get_overcloud_keystone_session()
nova_client = openstack_utils.get_nova_session_client(
keystone_session)
@@ -230,6 +340,11 @@ def add_tempest_flavors():
def add_tempest_roles():
"""Add tempest roles overcloud
:returns: None
:rtype: None
"""
keystone_session = openstack_utils.get_overcloud_keystone_session()
keystone_client = openstack_utils.get_keystone_session_client(
keystone_session)
@@ -238,4 +353,3 @@ def add_tempest_roles():
keystone_client.roles.create(role_name)
except keystoneauth1.exceptions.http.Conflict:
pass

View File

@@ -1,4 +1,4 @@
# Copyright 2018 Canonical Ltd.
# Copyright 2020 Canonical Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.

View File

@@ -1,3 +1,19 @@
# Copyright 2020 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.
"""Code for running tempest tests."""
import os
import subprocess
@@ -7,13 +23,19 @@ import zaza.charm_lifecycle.test
import tempest.cmd.main
import tempfile
class TempestTest():
test_runner = zaza.charm_lifecycle.test.DIRECT
"""Tempest test class."""
def run(self):
"""Run tempest tests as specified in tests/tests.yaml
Test keys are parsed from ['tests_options']['tempest']['model'], where
valid test keys are: smoke (bool), whitelist (list of tests), blacklist
(list of tests), and regex (list of regex's).
:returns: Status of tempest run
:rtype: bool
"""
charm_config = zaza.charm_lifecycle.utils.get_charm_config()
tempest_options = ['tempest', 'run', '--workspace', 'tempest-workspace',
'--config', 'tempest-workspace/etc/tempest.conf']