openstack-ansible-os_nova/tasks/nova_db_setup.yml
Dmitriy Rabotyagov 51177a6574 Enable deployers to force update cell mappings
Add variable nova_cell_force_update to enable deployers to ensure that
role execution will also update cell mappings whenever that is needed.
For instance, it could be password rotation or intention to update MySQL
address.

Change-Id: I5b99d58a5c4d27a363306361544c5d80759483fd
2024-04-10 14:14:19 +02:00

136 lines
6.1 KiB
YAML

---
# Copyright 2014, Rackspace US, Inc.
#
# 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.
- name: Synchronize the nova API DB schema
command: "{{ nova_bin }}/nova-manage api_db sync"
become: yes
become_user: "{{ nova_system_user_name }}"
changed_when: false
# We need to check for existance of the cell, since nova-manage cell_v2 create_cell
# might be not idempotent due to the bug https://bugs.launchpad.net/nova/+bug/1923899
- name: Get UUID of Nova Cells
command: "{{ nova_bin }}/nova-manage cell_v2 list_cells"
become: yes
become_user: "{{ nova_system_user_name }}"
changed_when: false
register: _cell_list
- name: Set cell facts
set_fact:
_cell0_record: '{{ _cell_list.stdout_lines | select("regex", "[0-]{36}") }}'
_cell1_record: '{{ _cell_list.stdout_lines | select("regex", " " ~ nova_cell1_name ~ " ") }}'
# This is idempotent and therefore safe for greenfield
# and brownfield installations.
# Though since we anyway need to fetch cell records - let's run
# it conditionally.
- name: Create the cell0 mapping entry in the nova API DB
command: >-
{{ nova_bin }}/nova-manage cell_v2 map_cell0
--database_connection mysql+pymysql://{{ nova_api_galera_user }}:{{ nova_api_container_mysql_password }}@{{ nova_api_galera_address }}/{{
nova_cell0_database }}?charset=utf8{% if nova_galera_use_ssl | bool %}&ssl_verify_cert=true{%
if nova_galera_ssl_ca_cert | length > 0 %}&ssl_ca={{ nova_galera_ssl_ca_cert }}{% endif %}{% endif %}
become: yes
become_user: "{{ nova_system_user_name }}"
changed_when: false
when:
- not _cell0_record
- name: Update the cell0 mapping entry in the nova API DB
command: >-
{{ nova_bin }}/nova-manage cell_v2 update_cell --cell_uuid 00000000-0000-0000-0000-000000000000
--database_connection mysql+pymysql://{{ nova_api_galera_user }}:{{ nova_api_container_mysql_password }}@{{ nova_api_galera_address }}/{{
nova_cell0_database }}?charset=utf8{% if nova_galera_use_ssl | bool %}&ssl_verify_cert=true{%
if nova_galera_ssl_ca_cert | length > 0 %}&ssl_ca={{ nova_galera_ssl_ca_cert }}{% endif %}{% endif %}
--transport-url 'none:/'
become: yes
become_user: "{{ nova_system_user_name }}"
changed_when: false
when:
- _cell0_record | length > 0
- nova_cell_force_update or
('ssl_verify_cert' not in _cell0_record[0] and nova_galera_use_ssl) or
('ssl_verify_cert' in _cell0_record[0] and not nova_galera_use_ssl)
- name: Synchronize the nova DB schema
command: "{{ nova_bin }}/nova-manage db sync"
become: yes
become_user: "{{ nova_system_user_name }}"
changed_when: false
- name: Create the cell1 mapping entry in the nova API DB
command: >-
{{ nova_bin }}/nova-manage cell_v2 create_cell
--name {{ nova_cell1_name }}
--database_connection {scheme}://{username}:{password}@{hostname}:{port}/{path}?{query}
--transport-url {scheme}://{username}:{password}@{hostname}:{port}/{{ (
not nova_oslomsg_rabbit_quorum_queues | bool) | ternary('/{path}', '{path}') }}?{query}
become: yes
become_user: "{{ nova_system_user_name }}"
register: nova_cell1_create
# When upgrading, cell1 will already exist and nova-manage will
# give a return code of 2, so we therefore know that if the
# return code is:
# 0: the cell mapping record in the nova API database was
# successfully implemented (greenfield install)
# 2: the cell mapping record in the nova API database already
# exists (brownfield install). This is not working for templates
# because of the bug https://bugs.launchpad.net/nova/+bug/1923899
failed_when: "nova_cell1_create.rc not in [0, 2]"
changed_when: "nova_cell1_create.rc == 0"
when:
- not _cell1_record
- name: "Change the template for cell {{ nova_cell1_name }}"
command: >-
{{ nova_bin }}/nova-manage cell_v2 update_cell
--cell_uuid {{ _cell1_record[0].split()[3] }}
--database_connection {scheme}://{username}:{password}@{hostname}:{port}/{path}?{query}
--transport-url {scheme}://{username}:{password}@{hostname}:{port}/{{ (
not nova_oslomsg_rabbit_quorum_queues | bool) | ternary('/{path}', '{path}') }}?{query}
become: yes
become_user: "{{ nova_system_user_name }}"
changed_when: false
when:
- _cell1_record | length > 0
- nova_cell_force_update or
(nova_oslomsg_rpc_port ~ '/' ~ _nova_oslomsg_rpc_vhost_conf) not in _cell1_record[0]
# The nova-status upgrade check command is typically run after upgrading the
# controller services to new code, but is also OK to run for a greenfield
# install to verify everything is setup correctly. This must run after cell
# mapping setup and before actual service restart.
# https://docs.openstack.org/nova/latest/cli/nova-status.html
- name: Run nova-status upgrade check to validate a healthy configuration
command: "{{ nova_bin }}/nova-status upgrade check"
become: yes
become_user: "{{ nova_system_user_name }}"
register: nova_status_upgrade_check
until: nova_status_upgrade_check is success
retries: 8
delay: 15
# The nova-status upgrade check command has three standard return codes:
# 0: all checks were successful
# 1: warning: there might be some checks that require investigation, but
# generally will not block an automated install/upgrade; digging into
# warnings is useful for debugging post-install/upgrade issues
# 2: at least one check failed and must stop the install/upgrade because
# something was not setup properly
failed_when: "nova_status_upgrade_check.rc not in [0, 1]"
changed_when: false
when:
- "ansible_local['openstack_ansible']['nova']['need_online_data_migrations'] | bool"