Automatically enable/disable config for tempest.

Automatically enable/disable config for tempest based on the
contents of the keystone service catalogue.
This commit is contained in:
Liam Young
2020-06-11 14:12:16 +00:00
parent 5a94e4a52d
commit d837c0ed97
5 changed files with 187 additions and 163 deletions

View File

@@ -14,6 +14,7 @@
"""Code for configuring and initializing tempest."""
import jinja2
import urllib.parse
import os
import subprocess
@@ -22,20 +23,18 @@ import zaza.utilities.deployment_env as deployment_env
import zaza.openstack.utilities.juju as juju_utils
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_v2 as tempest_v2
import zaza.openstack.charm_tests.tempest.templates.tempest_v3 as tempest_v3
import zaza.openstack.charm_tests.tempest.templates.accounts as accounts
SETUP_ENV_VARS = [
'TEST_GATEWAY',
'TEST_CIDR_EXT',
'TEST_FIP_RANGE',
'TEST_NAMESERVER',
'TEST_CIDR_PRIV',
'TEST_SWIFT_IP',
]
SETUP_ENV_VARS = {
'neutron': ['TEST_GATEWAY', 'TEST_CIDR_EXT', 'TEST_FIP_RANGE',
'TEST_NAMESERVER', 'TEST_CIDR_PRIV'],
'swift': ['TEST_SWIFT_IP'],
}
TEMPEST_FLAVOR_NAME = 'm1.tempest'
TEMPEST_ALT_FLAVOR_NAME = 'm2.tempest'
TEMPEST_SVC_LIST = ['ceilometer', 'cinder', 'glance', 'heat', 'horizon',
'ironic', 'neutron', 'nova', 'sahara', 'swift', 'trove',
'zaqar']
def add_application_ips(ctxt):
@@ -169,7 +168,20 @@ def add_keystone_config(ctxt, keystone_session):
ctxt['default_domain_id'] = domain.id
def add_environment_var_config(ctxt):
def get_service_list(keystone_session):
"""Add keystone config to context.
:param keystone_session: keystoneauth1.session.Session object
:type: keystoneauth1.session.Session
:returns: None
:rtype: None
"""
keystone_client = openstack_utils.get_keystone_session_client(
keystone_session)
return [s.name for s in keystone_client.services.list() if s.enabled]
def add_environment_var_config(ctxt, services):
"""Add environment variable config to context.
:param ctxt: Context dictionary
@@ -178,14 +190,16 @@ def add_environment_var_config(ctxt):
:rtype: None
"""
deploy_env = deployment_env.get_deployment_context()
for var in SETUP_ENV_VARS:
value = deploy_env.get(var)
if value:
ctxt[var.lower()] = value
else:
raise ValueError(
("Environment variables {} must all be set to run this"
" test").format(', '.join(SETUP_ENV_VARS)))
for svc, env_vars in SETUP_ENV_VARS.items():
if svc in services:
for var in env_vars:
value = deploy_env.get(var)
if value:
ctxt[var.lower()] = value
else:
raise ValueError(
("Environment variables {} must all be set to run this"
" test").format(', '.join(env_vars)))
def add_auth_config(ctxt):
@@ -215,32 +229,42 @@ def get_tempest_context():
"""
keystone_session = openstack_utils.get_overcloud_keystone_session()
ctxt = {}
ctxt_funcs = {
'nova': add_nova_config,
'neutron': add_nova_config,
'glance': add_keystone_config,
'cinder': add_cinder_config,
'keystone': add_keystone_config}
ctxt['enabled_services'] = get_service_list(keystone_session)
ctxt['disabled_services'] = list(
set(TEMPEST_SVC_LIST) - set(ctxt['enabled_services']))
add_application_ips(ctxt)
add_nova_config(ctxt, keystone_session)
add_neutron_config(ctxt, keystone_session)
add_glance_config(ctxt, keystone_session)
add_cinder_config(ctxt, keystone_session)
add_keystone_config(ctxt, keystone_session)
add_environment_var_config(ctxt)
for svc_name, ctxt_func in ctxt_funcs.items():
if svc_name in ctxt['enabled_services']:
ctxt_func(ctxt, keystone_session)
add_environment_var_config(ctxt, ctxt['enabled_services'])
add_auth_config(ctxt)
return ctxt
def render_tempest_config(target_file, ctxt, template):
def render_tempest_config(target_file, ctxt, template_name):
"""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
:param template_name: Name of template file
:type template_name: str
:returns: None
:rtype: None
"""
# TODO: switch to jinja2 and generate config based on available services
jenv = jinja2.Environment(loader=jinja2.PackageLoader(
'zaza.openstack',
'charm_tests/tempest/templates'))
template = jenv.get_template(template_name)
with open(target_file, 'w') as f:
f.write(template.file_contents.format(**ctxt))
f.write(template.render(ctxt))
def setup_tempest(tempest_template, accounts_template):
@@ -279,7 +303,7 @@ def render_tempest_config_keystone_v2():
:returns: None
:rtype: None
"""
setup_tempest(tempest_v2, accounts)
setup_tempest('tempest_v2.j2', 'accounts.j2')
def render_tempest_config_keystone_v3():
@@ -288,4 +312,4 @@ def render_tempest_config_keystone_v3():
:returns: None
:rtype: None
"""
setup_tempest(tempest_v3, accounts)
setup_tempest('tempest_v3.j2', 'accounts.j2')

View File

@@ -1,9 +1,6 @@
# flake8: noqa
file_contents = """
- username: 'demo'
tenant_name: 'demo'
password: 'pass'
- username: 'alt_demo'
tenant_name: 'alt_demo'
password: 'secret'
"""

View File

@@ -1,5 +1,3 @@
# flake8: noqa
file_contents = """
[DEFAULT]
debug = false
use_stderr = false
@@ -8,16 +6,17 @@ log_file = tempest.log
[auth]
test_accounts_file = accounts.yaml
default_credentials_domain_name = Default
admin_username = {admin_username}
admin_username = {{ admin_username }}
admin_project_name = admin
admin_password = {admin_password}
admin_password = {{ admin_password }}
admin_domain_name = Default
{% if 'nova' in enabled_services %}
[compute]
image_ref = {image_id}
image_ref_alt = {image_alt_id}
flavor_ref = {flavor_ref}
flavor_ref_alt = {flavor_ref_alt}
image_ref = {{ image_id }}
image_ref_alt = {{ image_alt_id }}
flavor_ref = {{ flavor_ref }}
flavor_ref_alt = {{ flavor_ref_alt }}
region = RegionOne
min_compute_nodes = 3
@@ -31,9 +30,11 @@ resize = true
live_migration = true
block_migration_for_live_migration = true
attach_encrypted_volume = false
{% endif %}
{% if 'keystone' in enabled_services %}
[identity]
uri = {proto}://{keystone}:5000/v2.0
uri = {proto}://{{ keystone }}:5000/v2.0
auth_version = v2
admin_role = Admin
region = RegionOne
@@ -42,23 +43,28 @@ disable_ssl_certificate_validation = true
[identity-feature-enabled]
api_v2 = true
api_v3 = false
{% endif %}
[image]
http_image = http://{test_swift_ip}:80/swift/v1/images/cirros-0.3.4-x86_64-uec.tar.gz
http_image = http://{{ test_swift_ip }}:80/swift/v1/images/cirros-0.3.4-x86_64-uec.tar.gz
{% if 'neutron' in enabled_services %}
[network]
project_network_cidr = {test_cidr_priv}
public_network_id = {ext_net}
dns_servers = {test_nameserver}
project_network_cidr = {{ test_cidr_priv }}
public_network_id = {{ ext_net }}
dns_servers = {{ test_nameserver }}
project_networks_reachable = false
[network-feature-enabled]
ipv6 = false
{% endif %}
{% if 'heat' in enabled_services %}
[orchestration]
stack_owner_role = Admin
instance_type = m1.small
keypair_name = testkey
{% endif %}
[oslo_concurrency]
lock_path = /tmp
@@ -74,23 +80,19 @@ run_validation = true
image_ssh_user = cirros
[service_available]
ceilometer = true
cinder = true
glance = true
heat = true
horizon = true
ironic = false
neutron = true
nova = true
sahara = false
swift = true
trove = false
zaqar = false
{% for svc in enabled_services -%}
{{ svc }} = true
{% endfor -%}
{% for svc in disabled_services -%}
{{ svc }} = false
{% endfor %}
{% if 'cinder' in enabled_services %}
[volume]
backend_names = cinder-ceph
storage_protocol = ceph
catalog_type = {catalog_type}
catalog_type = {{ catalog_type }}
[volume-feature-enabled]
backup = false"""
backup = false
{% endif %}

View File

@@ -0,0 +1,101 @@
[DEFAULT]
debug = false
use_stderr = false
log_file = tempest.log
[auth]
test_accounts_file = accounts.yaml
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 }}
{% if 'nova' in enabled_services %}
[compute]
image_ref = {{ image_id }}
image_ref_alt = {{ image_alt_id }}
flavor_ref = {{ flavor_ref }}
flavor_ref_alt = {{ flavor_ref_alt }}
min_compute_nodes = 3
# TODO: review this as its release specific
# min_microversion = 2.2
# max_microversion = latest
[compute-feature-enabled]
console_output = true
resize = true
live_migration = true
block_migration_for_live_migration = true
attach_encrypted_volume = false
{% endif %}
{% if 'keystone' in enabled_services %}
[identity]
uri = {{ proto }}://{{ keystone }}:5000/v2.0
uri_v3 = {{ proto }}://{{ keystone }}:5000/v3
auth_version = v3
admin_role = Admin
region = RegionOne
default_domain_id = {{ default_domain_id }}
admin_domain_scope = true
disable_ssl_certificate_validation = true
[identity-feature-enabled]
api_v2 = false
api_v3 = true
{% endif %}
[image]
http_image = http://{{ test_swift_ip }}:80/swift/v1/images/cirros-0.3.4-x86_64-uec.tar.gz
{% if 'neutron' in enabled_services %}
[network]
project_network_cidr = {{ test_cidr_priv }}
public_network_id = {{ ext_net }}
dns_servers = {{ test_nameserver }}
project_networks_reachable = false
floating_network_name = {{ ext_net }}
[network-feature-enabled]
ipv6 = false
api_extensions = {{ neutron_api_extensions }}
{% endif %}
{% if 'heat' in enabled_services %}
[orchestration]
stack_owner_role = Admin
instance_type = m1.small
keypair_name = testkey
{% endif %}
[oslo_concurrency]
lock_path = /tmp
[scenario]
img_dir = /home/ubuntu/images
img_file = cirros-0.3.4-x86_64-disk.img
img_container_format = bare
img_disk_format = qcow2
[validation]
run_validation = true
image_ssh_user = cirros
[service_available]
{% for svc in enabled_services -%}
{{ svc }} = true
{% endfor -%}
{% for svc in disabled_services -%}
{{ svc }} = false
{% endfor %}
{% if 'cinder' in enabled_services %}
[volume]
backend_names = cinder-ceph
storage_protocol = ceph
catalog_type = {{ catalog_type }}
[volume-feature-enabled]
{% endif %}

View File

@@ -1,100 +0,0 @@
# flake8: noqa
file_contents = """
[DEFAULT]
debug = false
use_stderr = false
log_file = tempest.log
[auth]
test_accounts_file = accounts.yaml
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 = {flavor_ref}
flavor_ref_alt = {flavor_ref_alt}
min_compute_nodes = 3
# TODO: review this as its release specific
# min_microversion = 2.2
# max_microversion = latest
[compute-feature-enabled]
console_output = true
resize = true
live_migration = true
block_migration_for_live_migration = true
attach_encrypted_volume = false
[identity]
uri = {proto}://{keystone}:5000/v2.0
uri_v3 = {proto}://{keystone}:5000/v3
auth_version = v3
admin_role = Admin
region = RegionOne
default_domain_id = {default_domain_id}
admin_domain_scope = true
disable_ssl_certificate_validation = true
[identity-feature-enabled]
api_v2 = false
api_v3 = true
[image]
http_image = http://{test_swift_ip}:80/swift/v1/images/cirros-0.3.4-x86_64-uec.tar.gz
[network]
project_network_cidr = {test_cidr_priv}
public_network_id = {ext_net}
dns_servers = {test_nameserver}
project_networks_reachable = false
floating_network_name = {ext_net}
[network-feature-enabled]
ipv6 = false
api_extensions = {neutron_api_extensions}
[orchestration]
stack_owner_role = Admin
instance_type = m1.small
keypair_name = testkey
[oslo_concurrency]
lock_path = /tmp
[scenario]
img_dir = /home/ubuntu/images
img_file = cirros-0.3.4-x86_64-disk.img
img_container_format = bare
img_disk_format = qcow2
[validation]
run_validation = true
image_ssh_user = cirros
[service_available]
ceilometer = true
cinder = true
glance = true
heat = true
horizon = true
ironic = false
neutron = true
nova = true
sahara = false
swift = true
trove = false
zaqar = false
[volume]
backend_names = cinder-ceph
storage_protocol = ceph
catalog_type = {catalog_type}
[volume-feature-enabled]
backup = false"""