
Kolla Ansible renamed kolla_internal_fqdn_cacert to kolla_admin_openrc_cacert in Victoria, after which we no longer set the variable correctly in globals.yml. This would lead to a missing OS_CACERT in admin-openrc.sh and public-openrc.sh. This change fixes the issue by renaming the relevant Kayobe variables to match and passing through the correct variable. Backwards compatibility is provided until the end of the deprecation period. kolla_public_openrc_cacert -> kolla_external_fqdn_cacert kolla_admin_openrc_cacert -> kolla_internal_fqdn_cacert Story: 2010486 Task: 47054 Change-Id: I9e1cc20579cf80525d6ef732a1aac99a65bc171b Co-Authored-By: Maksim Malchuk <maksim.malchuk@gmail.com>
554 lines
21 KiB
YAML
554 lines
21 KiB
YAML
---
|
|
- name: Test kolla-ansible role extras
|
|
hosts: localhost
|
|
connection: local
|
|
tasks:
|
|
- name: Add a seed host to the inventory
|
|
add_host:
|
|
name: test-seed
|
|
groups: seed
|
|
|
|
- name: Add a controller host to the inventory
|
|
add_host:
|
|
name: test-controller
|
|
groups: controllers
|
|
|
|
- name: Add a compute host to the inventory
|
|
add_host:
|
|
name: test-compute
|
|
groups: compute
|
|
|
|
- name: Create a temporary directory
|
|
tempfile:
|
|
state: directory
|
|
register: tempfile_result
|
|
|
|
- name: Create directory for custom overcloud foo group vars
|
|
file:
|
|
path: "{{ tempfile_result.path ~ '/etc/kayobe/kolla/inventory/group_vars/foo_group' }}"
|
|
state: directory
|
|
|
|
- name: Create extra globals file
|
|
copy:
|
|
content: |
|
|
---
|
|
extra-global-1: "extra-val-1"
|
|
extra-global-2: "extra-val-2"
|
|
dest: "{{ tempfile_result.path ~ '/etc/kayobe/kolla/globals.yml' }}"
|
|
|
|
- name: Create custom overcloud foo group vars
|
|
copy:
|
|
dest: "{{ tempfile_result.path ~ '/etc/kayobe/kolla/inventory/group_vars/foo_group/all' }}"
|
|
content: |
|
|
---
|
|
foo_port: "1234"
|
|
|
|
- name: Create custom overcloud bar group vars
|
|
copy:
|
|
dest: "{{ tempfile_result.path ~ '/etc/kayobe/kolla/inventory/group_vars/bar_group' }}"
|
|
content: |
|
|
---
|
|
bar_port: "4567"
|
|
|
|
- name: Create directory for custom CA certificates
|
|
file:
|
|
path: "{{ tempfile_result.path }}/etc/kayobe/kolla/certificates/ca"
|
|
state: directory
|
|
|
|
- name: Create custom CA certificate
|
|
copy:
|
|
dest: "{{ tempfile_result.path }}/etc/kayobe/kolla/certificates/ca/foo.crt"
|
|
content: |
|
|
bogus CA certificate
|
|
|
|
- name: Create custom backend certificate
|
|
copy:
|
|
dest: "{{ tempfile_result.path }}/etc/kayobe/kolla/certificates/backend-cert.pem"
|
|
content: |
|
|
bogus backend certificate
|
|
|
|
- block:
|
|
- name: Test the kolla-ansible role with default values
|
|
include_role:
|
|
name: ../../kolla-ansible
|
|
vars:
|
|
kolla_ansible_source_path: "{{ temp_path }}/src"
|
|
kolla_ansible_ctl_install_type: "source"
|
|
kolla_ansible_source_url: "http://github.com/openstack/kolla-ansible"
|
|
kolla_ansible_source_version: "{{ openstack_branch }}"
|
|
kolla_ansible_venv: "{{ temp_path }}/venv"
|
|
kolla_ansible_vault_password: "fake-password"
|
|
kolla_config_path: "{{ temp_path }}/etc/kolla"
|
|
kolla_overcloud_group_vars_path: "{{ temp_path }}/etc/kayobe/kolla/inventory/group_vars"
|
|
kolla_node_custom_config_path: "{{ temp_path }}/etc/kolla/config"
|
|
kolla_ansible_passwords_path: "{{ temp_path }}/passwords.yml"
|
|
# Config.
|
|
kolla_ansible_user: "fake-user"
|
|
kolla_ansible_group: "fake-group"
|
|
kolla_base_distro: "fake-distro"
|
|
kolla_base_distro_version: "1.23"
|
|
kolla_docker_namespace: "fake-namespace"
|
|
kolla_docker_registry: "fake-registry"
|
|
kolla_docker_registry_username: "fake-username"
|
|
kolla_openstack_release: "fake-release"
|
|
kolla_internal_vip_address: "10.0.0.1"
|
|
kolla_internal_fqdn: "fake.internal.fqdn"
|
|
kolla_external_vip_address: "10.0.0.2"
|
|
kolla_external_fqdn: "fake.external.fqdn"
|
|
# Inventory mapping.
|
|
kolla_overcloud_inventory_top_level_group_map:
|
|
control:
|
|
groups:
|
|
- controllers
|
|
compute:
|
|
groups:
|
|
- compute
|
|
kolla_overcloud_inventory_kolla_top_level_groups:
|
|
- "control"
|
|
- "compute"
|
|
kolla_neutron_ml2_type_drivers:
|
|
- "fake-ml2-type-1"
|
|
- "fake-ml2-type-2"
|
|
kolla_neutron_ml2_tenant_network_types:
|
|
- "fake-ml2-tenant-type-1"
|
|
- "fake-ml2-tenant-type-2"
|
|
kolla_ansible_certificates_path: "{{ temp_path }}/etc/kayobe/kolla/certificates"
|
|
kolla_enable_tls_external: True
|
|
kolla_external_fqdn_cert: "{{ temp_path }}/etc/kolla/certificates/external.pem"
|
|
kolla_external_tls_cert: |
|
|
bogus external certificate
|
|
kolla_enable_tls_internal: True
|
|
kolla_internal_fqdn_cert: "{{ temp_path }}/etc/kolla/certificates/internal.pem"
|
|
kolla_internal_tls_cert: |
|
|
bogus internal certificate
|
|
kolla_admin_openrc_cacert: "{{ temp_path }}/etc/kolla/certificates/ca/foo.crt"
|
|
kolla_openstack_logging_debug: True
|
|
grafana_local_admin_user_name: "grafana-admin"
|
|
kolla_inspector_dhcp_pool_start: "1.2.3.4"
|
|
kolla_inspector_dhcp_pool_end: "1.2.3.5"
|
|
kolla_inspector_netmask: "255.255.255.0"
|
|
kolla_inspector_default_gateway: "1.2.3.6"
|
|
# Enable everything.
|
|
kolla_enable_aodh: True
|
|
kolla_enable_barbican: True
|
|
kolla_enable_blazar: True
|
|
kolla_enable_ceilometer: True
|
|
kolla_enable_central_logging: True
|
|
kolla_enable_cinder: True
|
|
kolla_enable_cinder_backend_hnas_iscsi: True
|
|
kolla_enable_cinder_backend_hnas_nfs: True
|
|
kolla_enable_cinder_backend_iscsi: True
|
|
kolla_enable_cinder_backend_lvm: True
|
|
kolla_enable_cinder_backend_nfs: True
|
|
kolla_enable_cloudkitty: True
|
|
kolla_enable_designate: True
|
|
kolla_enable_etcd: True
|
|
kolla_enable_freezer: True
|
|
kolla_enable_gnocchi: True
|
|
kolla_enable_grafana: True
|
|
kolla_enable_haproxy: True
|
|
kolla_enable_heat: True
|
|
kolla_enable_horizon: True
|
|
kolla_enable_influxdb: True
|
|
kolla_enable_ironic: True
|
|
kolla_enable_ironic_neutron_agent: True
|
|
kolla_enable_kuryr: True
|
|
kolla_enable_magnum: True
|
|
kolla_enable_manila: True
|
|
kolla_enable_manila_backend_generic: True
|
|
kolla_enable_manila_backend_hnas: True
|
|
kolla_enable_mariadb: True
|
|
kolla_enable_mistral: True
|
|
kolla_enable_multipathd: True
|
|
kolla_enable_murano: True
|
|
kolla_enable_neutron_agent_ha: True
|
|
kolla_enable_neutron_bgp_dragent: True
|
|
kolla_enable_neutron_dvr: True
|
|
kolla_enable_neutron_provider_networks: True
|
|
kolla_enable_neutron_qos: True
|
|
kolla_enable_neutron_vpnaas: True
|
|
kolla_enable_nova_serialconsole_proxy: True
|
|
kolla_enable_octavia: True
|
|
kolla_enable_opensearch: True
|
|
kolla_enable_opensearch_dashboards: True
|
|
kolla_enable_osprofiler: True
|
|
kolla_enable_prometheus: True
|
|
kolla_enable_sahara: True
|
|
kolla_enable_senlin: True
|
|
kolla_enable_skydive: True
|
|
kolla_enable_solum: True
|
|
kolla_enable_swift: True
|
|
kolla_enable_tacker: True
|
|
kolla_enable_telegraf: True
|
|
kolla_enable_trove: True
|
|
kolla_enable_watcher: True
|
|
kolla_enable_zun: True
|
|
kolla_globals_paths_extra:
|
|
- "{{ tempfile_result.path ~ '/etc/kayobe/' }}"
|
|
kolla_ansible_custom_passwords:
|
|
custom-password-1: "custom-password-1"
|
|
custom-password-2: "custom-password-2"
|
|
kolla_nova_compute_ironic_host: "controller1"
|
|
apt_cache_valid_time: 3600
|
|
|
|
- name: Verify kolla-ansible installation
|
|
shell: ". {{ temp_path }}/venv/bin/activate && kolla-ansible -h"
|
|
changed_when: False
|
|
|
|
- name: Verify ansible installation
|
|
command: "{{ temp_path }}/venv/bin/ansible -h"
|
|
changed_when: False
|
|
|
|
- name: Validate variables are absent from globals.yml
|
|
debug:
|
|
var: globals_yml
|
|
vars:
|
|
# NOTE: Can't use set_fact for this, as it causes kolla-ansible
|
|
# Jinja expressions to be evaluated.
|
|
globals_yml: "{{ lookup('file', temp_path ~ '/etc/kolla/globals.yml') | from_yaml }}"
|
|
|
|
- name: Validate globals.yml contents
|
|
assert:
|
|
that:
|
|
- item.key in globals_yml
|
|
- globals_yml[item.key] == item.value
|
|
msg: >
|
|
Unexpected value for variable "{{ item.key }}" in globals.yml.
|
|
Expected "{{ item.value }}", actual
|
|
"{{ globals_yml.get(item.key, '<missing>') }}".
|
|
with_dict: "{{ expected_variables }}"
|
|
vars:
|
|
# NOTE: Can't use set_fact for this, as it causes kolla-ansible
|
|
# Jinja expressions to be evaluated.
|
|
globals_yml: "{{ lookup('file', temp_path ~ '/etc/kolla/globals.yml') | from_yaml }}"
|
|
expected_variables:
|
|
config_strategy: "COPY_ALWAYS"
|
|
kolla_user: "fake-user"
|
|
kolla_group: "fake-group"
|
|
kolla_base_distro: "fake-distro"
|
|
kolla_base_distro_version: "1.23"
|
|
openstack_release: "fake-release"
|
|
kolla_internal_vip_address: "10.0.0.1"
|
|
kolla_internal_fqdn: "fake.internal.fqdn"
|
|
kolla_external_vip_address: "10.0.0.2"
|
|
kolla_external_fqdn: "fake.external.fqdn"
|
|
node_custom_config: "{{ temp_path }}/etc/kolla/config"
|
|
docker_namespace: "fake-namespace"
|
|
docker_registry: "fake-registry"
|
|
docker_registry_username: "fake-username"
|
|
neutron_plugin_agent: "openvswitch"
|
|
kolla_enable_tls_external: True
|
|
kolla_external_fqdn_cert: "{{ temp_path }}/etc/kolla/certificates/external.pem"
|
|
kolla_enable_tls_internal: True
|
|
kolla_internal_fqdn_cert: "{{ temp_path }}/etc/kolla/certificates/internal.pem"
|
|
kolla_admin_openrc_cacert: "{{ temp_path }}/etc/kolla/certificates/ca/foo.crt"
|
|
openstack_logging_debug: True
|
|
grafana_admin_username: "grafana-admin"
|
|
ironic_dnsmasq_dhcp_ranges:
|
|
- range: "1.2.3.4,1.2.3.5,255.255.255.0"
|
|
routers: "1.2.3.6"
|
|
# NOTE: The following options are not present in globals.yml.
|
|
# It's possible this is related to the use of hostvars and
|
|
# include_role, caused by something like
|
|
# https://github.com/ansible/ansible/issues/19305.
|
|
#enable_aodh: True
|
|
#enable_barbican: True
|
|
#enable_blazar: True
|
|
#enable_ceilometer: True
|
|
#enable_central_logging: True
|
|
#enable_cinder: True
|
|
#enable_cinder_backend_hnas_iscsi: True
|
|
#enable_cinder_backend_hnas_nfs: True
|
|
#enable_cinder_backend_iscsi: True
|
|
#enable_cinder_backend_lvm: True
|
|
#enable_cinder_backend_nfs: True
|
|
#enable_cloudkitty: True
|
|
#enable_designate: True
|
|
#enable_etcd: True
|
|
#enable_freezer: True
|
|
#enable_gnocchi: True
|
|
#enable_grafana: True
|
|
#enable_haproxy: True
|
|
#enable_heat: True
|
|
#enable_horizon: True
|
|
#enable_influxdb: True
|
|
#enable_ironic: True
|
|
#enable_ironic_neutron_agent: True
|
|
#enable_kuryr: True
|
|
#enable_magnum: True
|
|
#enable_manila: True
|
|
#enable_manila_backend_generic: True
|
|
#enable_manila_backend_hnas: True
|
|
#enable_mariadb: True
|
|
#enable_mistral: True
|
|
#enable_multipathd: True
|
|
#enable_murano: True
|
|
#enable_neutron_agent_ha: True
|
|
#enable_neutron_bgp_dragent: True
|
|
#enable_neutron_dvr: True
|
|
#enable_neutron_provider_networks: True
|
|
#enable_neutron_qos: True
|
|
#enable_neutron_vpnaas: True
|
|
#enable_nova_serialconsole_proxy: True
|
|
#enable_octavia: True
|
|
#enable_opensearch: True
|
|
#enable_opensearch_dashboards: True
|
|
#enable_osprofiler: True
|
|
#enable_prometheus: True
|
|
#enable_sahara: True
|
|
#enable_senlin: True
|
|
#enable_skydive: True
|
|
#enable_solum: True
|
|
#enable_swift: True
|
|
#enable_tacker: True
|
|
#enable_telegraf: True
|
|
#enable_trove: True
|
|
#enable_watcher: True
|
|
#enable_zun: True
|
|
extra-global-1: "extra-val-1"
|
|
extra-global-2: "extra-val-2"
|
|
|
|
- name: Validate variables are absent from globals.yml
|
|
assert:
|
|
that: item not in globals_yml
|
|
msg: >
|
|
Unexpected variable "{{ item }}" found in globals.yml, value
|
|
"{{ globals_yml.get(item) }}".
|
|
with_items: "{{ unexpected_variables }}"
|
|
vars:
|
|
# NOTE: Can't use set_fact for this, as it causes kolla-ansible
|
|
# Jinja expressions to be evaluated.
|
|
globals_yml: "{{ lookup('file', temp_path ~ '/etc/kolla/globals.yml') | from_yaml }}"
|
|
unexpected_variables:
|
|
- enable_glance
|
|
- enable_ironic
|
|
- enable_neutron
|
|
- enable_nova
|
|
- network_interface
|
|
- api_interface
|
|
- kolla_external_vip_interface
|
|
- storage_interface
|
|
- cluster_interface
|
|
- swift_storage_interface
|
|
- swift_replication_interface
|
|
- provision_interface
|
|
- ironic_dnsmasq_interface
|
|
- dns_interface
|
|
- tunnel_interface
|
|
- bifrost_network_interface
|
|
- neutron_external_interface
|
|
- neutron_bridge_name
|
|
|
|
- name: Create a vault password file
|
|
copy:
|
|
content: "fake-password"
|
|
dest: "{{ temp_path ~ '/vault-pass' }}"
|
|
|
|
- name: Decrypt passwords.yml
|
|
command: ansible-vault decrypt --vault-password-file {{ temp_path ~ '/vault-pass' }} {{ temp_path ~ '/etc/kolla/passwords.yml' }}
|
|
changed_when: False
|
|
|
|
- name: Validate passwords.yml contents
|
|
assert:
|
|
that: item in passwords_yml
|
|
msg: >
|
|
Expected variable "{{ item }}" not present in passwords.yml.
|
|
with_items: "{{ expected_variables }}"
|
|
vars:
|
|
# NOTE: Can't use set_fact for this, as it causes kolla-ansible
|
|
# Jinja expressions to be evaluated.
|
|
passwords_yml: "{{ lookup('file', temp_path ~ '/etc/kolla/passwords.yml') | from_yaml }}"
|
|
expected_variables:
|
|
- database_password
|
|
- custom-password-1
|
|
- custom-password-2
|
|
|
|
- name: Validate passwords.yml custom passwords
|
|
assert:
|
|
that:
|
|
- item.key in passwords_yml
|
|
- passwords_yml[item.key] == item.value
|
|
msg: >
|
|
Expected custom password "{{ item.key }}" not present in passwords.yml.
|
|
with_dict: "{{ expected_variables }}"
|
|
vars:
|
|
# NOTE: Can't use set_fact for this, as it causes kolla-ansible
|
|
# Jinja expressions to be evaluated.
|
|
passwords_yml: "{{ lookup('file', temp_path ~ '/etc/kolla/passwords.yml') | from_yaml }}"
|
|
expected_variables:
|
|
custom-password-1: custom-password-1
|
|
custom-password-2: custom-password-2
|
|
|
|
- name: Check whether inventory files exist
|
|
stat:
|
|
path: "{{ temp_path ~ '/etc/kolla/inventory/' ~ item ~ '/hosts' }}"
|
|
with_items:
|
|
- seed
|
|
- overcloud
|
|
register: inventory_stat
|
|
|
|
- name: Validate inventory files
|
|
assert:
|
|
that:
|
|
- item.stat.exists
|
|
- item.stat.size > 0
|
|
msg: >
|
|
Inventory file {{ item.item }} was not found.
|
|
with_items: "{{ inventory_stat.results }}"
|
|
|
|
- name: Read inventory files
|
|
slurp:
|
|
src: "{{ item.stat.path }}"
|
|
with_items: "{{ inventory_stat.results }}"
|
|
register: inventory_slurp
|
|
|
|
- name: Validate seed inventory file contents
|
|
vars:
|
|
inventory_lines: "{{ (inventory_slurp.results[0].content | b64decode).splitlines() }}"
|
|
assert:
|
|
that: item in inventory_lines
|
|
with_items:
|
|
- test-seed
|
|
|
|
- name: Validate overcloud inventory file contents
|
|
vars:
|
|
inventory_lines: "{{ (inventory_slurp.results[1].content | b64decode).splitlines() }}"
|
|
assert:
|
|
that: item in inventory_lines
|
|
with_items:
|
|
- test-controller
|
|
- test-compute
|
|
|
|
- name: Check whether inventory group vars files exist
|
|
stat:
|
|
path: "{{ temp_path ~ '/etc/kolla/inventory/overcloud/group_vars/' ~ item }}"
|
|
with_items:
|
|
- foo_group/all
|
|
- bar_group
|
|
register: group_vars_stat
|
|
|
|
- name: Validate inventory group vars files
|
|
assert:
|
|
that:
|
|
- item.stat.exists
|
|
- item.stat.size > 0
|
|
msg: >
|
|
Inventory file {{ item.item }} was not found.
|
|
with_items: "{{ group_vars_stat.results }}"
|
|
|
|
- name: Read inventory group vars files
|
|
slurp:
|
|
src: "{{ item.stat.path }}"
|
|
with_items: "{{ group_vars_stat.results }}"
|
|
register: group_vars_slurp
|
|
|
|
- name: Validate inventory group vars file contents
|
|
assert:
|
|
that:
|
|
- group_vars_content is defined
|
|
- group_vars_content == item.1
|
|
with_together:
|
|
- "{{ group_vars_slurp.results }}"
|
|
- "{{ expected_contents }}"
|
|
vars:
|
|
group_vars_content: "{{ item.0.content | b64decode }}"
|
|
expected_contents:
|
|
- |
|
|
---
|
|
foo_port: "1234"
|
|
- |
|
|
---
|
|
bar_port: "4567"
|
|
|
|
- name: Check whether API certificate files exist
|
|
stat:
|
|
path: "{{ temp_path ~ '/etc/kolla/certificates/' ~ item }}"
|
|
with_items:
|
|
- external.pem
|
|
- internal.pem
|
|
register: certificates_stat
|
|
|
|
- name: Validate API certificates files
|
|
assert:
|
|
that:
|
|
- item.stat.exists
|
|
- item.stat.size > 0
|
|
msg: >
|
|
API certificate file {{ item.item }} was not found.
|
|
with_items: "{{ certificates_stat.results }}"
|
|
|
|
- name: Read API certificate files
|
|
slurp:
|
|
src: "{{ item.stat.path }}"
|
|
with_items: "{{ certificates_stat.results }}"
|
|
register: certificates_slurp
|
|
|
|
- name: Validate API certificate file contents
|
|
assert:
|
|
that:
|
|
- certificates_content is defined
|
|
- certificates_content == item.1
|
|
with_together:
|
|
- "{{ certificates_slurp.results }}"
|
|
- "{{ expected_contents }}"
|
|
vars:
|
|
certificates_content: "{{ item.0.content | b64decode }}"
|
|
expected_contents:
|
|
- |
|
|
bogus external certificate
|
|
- |
|
|
bogus internal certificate
|
|
|
|
- name: Check whether custom certificate files exist
|
|
stat:
|
|
path: "{{ temp_path ~ '/etc/kolla/certificates/' ~ item }}"
|
|
with_items:
|
|
- ca/foo.crt
|
|
- backend-cert.pem
|
|
register: certificates_stat
|
|
|
|
- name: Validate custom certificates files
|
|
assert:
|
|
that:
|
|
- item.stat.exists
|
|
- item.stat.size > 0
|
|
msg: >
|
|
Custom certificate file {{ item.item }} was not found.
|
|
with_items: "{{ certificates_stat.results }}"
|
|
|
|
- name: Read custom certificate files
|
|
slurp:
|
|
src: "{{ item.stat.path }}"
|
|
with_items: "{{ certificates_stat.results }}"
|
|
register: certificates_slurp
|
|
|
|
- name: Validate custom certificate file contents
|
|
assert:
|
|
that:
|
|
- certificates_content is defined
|
|
- certificates_content == item.1
|
|
with_together:
|
|
- "{{ certificates_slurp.results }}"
|
|
- "{{ expected_contents }}"
|
|
vars:
|
|
certificates_content: "{{ item.0.content | b64decode }}"
|
|
expected_contents:
|
|
- |
|
|
bogus CA certificate
|
|
- |
|
|
bogus backend certificate
|
|
always:
|
|
- name: Ensure the temporary directory is removed
|
|
file:
|
|
path: "{{ temp_path }}"
|
|
state: absent
|
|
|
|
- name: Refresh the inventory
|
|
meta: refresh_inventory
|
|
rescue:
|
|
- name: Flag that a failure occurred
|
|
set_fact:
|
|
test_failures: "{{ test_failures | default(0) | int + 1 }}"
|
|
vars:
|
|
temp_path: "{{ tempfile_result.path }}"
|