
nova-manage cell_v2 create_cell just uses a dumb string comparison to detect when a cell already exists. If there is a slight difference (e.g ordering of params in the db uri query string) it can result in duplicate cells. With this patch we should detect that the default cell already exists and update it to use the current transport_url/database_connection instead of attempting to create a new cell. Change-Id: If6a32e87b19cb0edf683144367701a115657ad0a Closes-bug: 1718912
310 lines
12 KiB
YAML
310 lines
12 KiB
YAML
heat_template_version: pike
|
|
|
|
description: >
|
|
OpenStack containerized Nova API service
|
|
|
|
parameters:
|
|
DockerNovaApiImage:
|
|
description: image
|
|
type: string
|
|
DockerNovaConfigImage:
|
|
description: The container image to use for the nova config_volume
|
|
type: string
|
|
EndpointMap:
|
|
default: {}
|
|
description: Mapping of service endpoint -> protocol. Typically set
|
|
via parameter_defaults in the resource registry.
|
|
type: json
|
|
ServiceData:
|
|
default: {}
|
|
description: Dictionary packing service data
|
|
type: json
|
|
ServiceNetMap:
|
|
default: {}
|
|
description: Mapping of service_name -> network name. Typically set
|
|
via parameter_defaults in the resource registry. This
|
|
mapping overrides those in ServiceNetMapDefaults.
|
|
type: json
|
|
DefaultPasswords:
|
|
default: {}
|
|
type: json
|
|
RoleName:
|
|
default: ''
|
|
description: Role name on which the service is applied
|
|
type: string
|
|
RoleParameters:
|
|
default: {}
|
|
description: Parameters specific to the role
|
|
type: json
|
|
EnableInternalTLS:
|
|
type: boolean
|
|
default: false
|
|
UpgradeRemoveUnusedPackages:
|
|
default: false
|
|
description: Remove package if the service is being disabled during upgrade
|
|
type: boolean
|
|
|
|
conditions:
|
|
|
|
internal_tls_enabled: {equals: [{get_param: EnableInternalTLS}, true]}
|
|
|
|
resources:
|
|
|
|
ContainersCommon:
|
|
type: ./containers-common.yaml
|
|
|
|
MySQLClient:
|
|
type: ../../puppet/services/database/mysql-client.yaml
|
|
|
|
NovaApiBase:
|
|
type: ../../puppet/services/nova-api.yaml
|
|
properties:
|
|
EndpointMap: {get_param: EndpointMap}
|
|
ServiceData: {get_param: ServiceData}
|
|
ServiceNetMap: {get_param: ServiceNetMap}
|
|
DefaultPasswords: {get_param: DefaultPasswords}
|
|
RoleName: {get_param: RoleName}
|
|
RoleParameters: {get_param: RoleParameters}
|
|
|
|
NovaApiLogging:
|
|
type: OS::TripleO::Services::Logging::NovaApi
|
|
|
|
outputs:
|
|
role_data:
|
|
description: Role data for the Nova API role.
|
|
value:
|
|
service_name: {get_attr: [NovaApiBase, role_data, service_name]}
|
|
config_settings:
|
|
map_merge:
|
|
- get_attr: [NovaApiBase, role_data, config_settings]
|
|
- get_attr: [NovaApiLogging, config_settings]
|
|
- apache::default_vhost: false
|
|
logging_source: {get_attr: [NovaApiBase, role_data, logging_source]}
|
|
logging_groups: {get_attr: [NovaApiBase, role_data, logging_groups]}
|
|
step_config: &step_config
|
|
list_join:
|
|
- "\n"
|
|
- - "['Nova_cell_v2'].each |String $val| { noop_resource($val) }"
|
|
- {get_attr: [NovaApiBase, role_data, step_config]}
|
|
- {get_attr: [MySQLClient, role_data, step_config]}
|
|
service_config_settings: {get_attr: [NovaApiBase, role_data, service_config_settings]}
|
|
# BEGIN DOCKER SETTINGS
|
|
puppet_config:
|
|
config_volume: nova
|
|
puppet_tags: nova_config
|
|
step_config: *step_config
|
|
config_image: {get_param: DockerNovaConfigImage}
|
|
kolla_config:
|
|
/var/lib/kolla/config_files/nova_api.json:
|
|
command: /usr/sbin/httpd -DFOREGROUND
|
|
config_files:
|
|
- source: "/var/lib/kolla/config_files/src/*"
|
|
dest: "/"
|
|
merge: true
|
|
preserve_properties: true
|
|
permissions:
|
|
- path: /var/log/nova
|
|
owner: nova:nova
|
|
recurse: true
|
|
/var/lib/kolla/config_files/nova_api_cron.json:
|
|
command: /usr/sbin/crond -n
|
|
config_files:
|
|
- source: "/var/lib/kolla/config_files/src/*"
|
|
dest: "/"
|
|
merge: true
|
|
preserve_properties: true
|
|
permissions:
|
|
- path: /var/log/nova
|
|
owner: nova:nova
|
|
recurse: true
|
|
docker_config_scripts:
|
|
nova_api_discover_hosts.sh:
|
|
mode: "0700"
|
|
content: |
|
|
#!/bin/bash
|
|
export OS_PROJECT_DOMAIN_NAME=$(crudini --get /etc/nova/nova.conf keystone_authtoken project_domain_name)
|
|
export OS_USER_DOMAIN_NAME=$(crudini --get /etc/nova/nova.conf keystone_authtoken user_domain_name)
|
|
export OS_PROJECT_NAME=$(crudini --get /etc/nova/nova.conf keystone_authtoken project_name)
|
|
export OS_USERNAME=$(crudini --get /etc/nova/nova.conf keystone_authtoken username)
|
|
export OS_PASSWORD=$(crudini --get /etc/nova/nova.conf keystone_authtoken password)
|
|
export OS_AUTH_URL=$(crudini --get /etc/nova/nova.conf keystone_authtoken auth_url)
|
|
export OS_AUTH_TYPE=password
|
|
export OS_IDENTITY_API_VERSION=3
|
|
|
|
echo "(cellv2) Running cell_v2 host discovery"
|
|
timeout=600
|
|
loop_wait=30
|
|
declare -A discoverable_hosts
|
|
for host in $(hiera -c /etc/puppet/hiera.yaml cellv2_discovery_hosts | sed -e '/^nil$/d' | tr "," " "); do discoverable_hosts[$host]=1; done
|
|
timeout_at=$(( $(date +"%s") + ${timeout} ))
|
|
echo "(cellv2) Waiting ${timeout} seconds for hosts to register"
|
|
finished=0
|
|
while : ; do
|
|
for host in $(openstack -q compute service list -c 'Host' -c 'Zone' -f value | awk '$2 != "internal" { print $1 }'); do
|
|
if (( discoverable_hosts[$host] == 1 )); then
|
|
echo "(cellv2) compute node $host has registered"
|
|
unset discoverable_hosts[$host]
|
|
fi
|
|
done
|
|
finished=1
|
|
for host in "${!discoverable_hosts[@]}"; do
|
|
if (( ${discoverable_hosts[$host]} == 1 )); then
|
|
echo "(cellv2) compute node $host has not registered"
|
|
finished=0
|
|
fi
|
|
done
|
|
remaining=$(( $timeout_at - $(date +"%s") ))
|
|
if (( $finished == 1 )); then
|
|
echo "(cellv2) All nodes registered"
|
|
break
|
|
elif (( $remaining <= 0 )); then
|
|
echo "(cellv2) WARNING: timeout waiting for nodes to register, running host discovery regardless"
|
|
echo "(cellv2) Expected host list:" $(hiera -c /etc/puppet/hiera.yaml cellv2_discovery_hosts | sed -e '/^nil$/d' | sort -u | tr ',' ' ')
|
|
echo "(cellv2) Detected host list:" $(openstack -q compute service list -c 'Host' -c 'Zone' -f value | awk '$2 != "internal" { print $1 }' | sort -u | tr '\n', ' ')
|
|
break
|
|
else
|
|
echo "(cellv2) Waiting ${remaining} seconds for hosts to register"
|
|
sleep $loop_wait
|
|
fi
|
|
done
|
|
echo "(cellv2) Running host discovery..."
|
|
su nova -s /bin/bash -c "/usr/bin/nova-manage cell_v2 discover_hosts --verbose"
|
|
nova_api_ensure_default_cell.sh:
|
|
mode: "0700"
|
|
content: |
|
|
#!/bin/bash
|
|
DEFID=$(nova-manage cell_v2 list_cells | sed -e '1,3d' -e '$d' | awk -F ' *| *' '$2 == "default" {print $4}')
|
|
if [ "$DEFID" ]; then
|
|
echo "(cellv2) Updating default cell_v2 cell $DEFID"
|
|
su nova -s /bin/bash -c "/usr/bin/nova-manage cell_v2 update_cell --cell_uuid $DEFID --name=default"
|
|
else
|
|
echo "(cellv2) Creating default cell_v2 cell"
|
|
su nova -s /bin/bash -c "/usr/bin/nova-manage cell_v2 create_cell --name=default"
|
|
fi
|
|
docker_config:
|
|
step_2:
|
|
get_attr: [NovaApiLogging, docker_config, step_2]
|
|
step_3:
|
|
nova_api_db_sync:
|
|
start_order: 0
|
|
image: &nova_api_image {get_param: DockerNovaApiImage}
|
|
net: host
|
|
detach: false
|
|
user: root
|
|
volumes: &nova_api_bootstrap_volumes
|
|
list_concat:
|
|
- {get_attr: [ContainersCommon, volumes]}
|
|
- {get_attr: [NovaApiLogging, volumes]}
|
|
-
|
|
- /var/lib/config-data/nova/etc/my.cnf.d/tripleo.cnf:/etc/my.cnf.d/tripleo.cnf:ro
|
|
- /var/lib/config-data/nova/etc/nova/:/etc/nova/:ro
|
|
command: "/usr/bin/bootstrap_host_exec nova_api su nova -s /bin/bash -c '/usr/bin/nova-manage api_db sync'"
|
|
nova_api_map_cell0:
|
|
start_order: 1
|
|
image: *nova_api_image
|
|
net: host
|
|
detach: false
|
|
user: root
|
|
volumes: *nova_api_bootstrap_volumes
|
|
command: "/usr/bin/bootstrap_host_exec nova_api su nova -s /bin/bash -c '/usr/bin/nova-manage cell_v2 map_cell0'"
|
|
nova_api_ensure_default_cell:
|
|
start_order: 2
|
|
image: *nova_api_image
|
|
net: host
|
|
detach: false
|
|
volumes:
|
|
list_concat:
|
|
- *nova_api_bootstrap_volumes
|
|
-
|
|
- /var/lib/config-data/nova/etc/my.cnf.d/tripleo.cnf:/etc/my.cnf.d/tripleo.cnf:ro
|
|
- /var/lib/config-data/nova/etc/nova/:/etc/nova/:ro
|
|
- /var/log/containers/nova:/var/log/nova
|
|
- /var/lib/docker-config-scripts/nova_api_ensure_default_cell.sh:/nova_api_ensure_default_cell.sh:ro
|
|
user: root
|
|
command: "/usr/bin/bootstrap_host_exec nova_api /nova_api_ensure_default_cell.sh"
|
|
nova_db_sync:
|
|
start_order: 3
|
|
image: *nova_api_image
|
|
net: host
|
|
detach: false
|
|
volumes: *nova_api_bootstrap_volumes
|
|
user: root
|
|
command: "/usr/bin/bootstrap_host_exec nova_api su nova -s /bin/bash -c '/usr/bin/nova-manage db sync'"
|
|
step_4:
|
|
nova_api:
|
|
start_order: 2
|
|
image: *nova_api_image
|
|
net: host
|
|
user: root
|
|
privileged: true
|
|
restart: always
|
|
healthcheck:
|
|
test: /openstack/healthcheck
|
|
volumes:
|
|
list_concat:
|
|
- {get_attr: [ContainersCommon, volumes]}
|
|
- {get_attr: [NovaApiLogging, volumes]}
|
|
-
|
|
- /var/lib/kolla/config_files/nova_api.json:/var/lib/kolla/config_files/config.json:ro
|
|
- /var/lib/config-data/puppet-generated/nova/:/var/lib/kolla/config_files/src:ro
|
|
-
|
|
if:
|
|
- internal_tls_enabled
|
|
- /etc/pki/tls/certs/httpd:/etc/pki/tls/certs/httpd:ro
|
|
- ''
|
|
-
|
|
if:
|
|
- internal_tls_enabled
|
|
- /etc/pki/tls/private/httpd:/etc/pki/tls/private/httpd:ro
|
|
- ''
|
|
environment:
|
|
- KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
|
|
nova_api_cron:
|
|
image: *nova_api_image
|
|
net: host
|
|
user: root
|
|
privileged: false
|
|
restart: always
|
|
volumes:
|
|
list_concat:
|
|
- {get_attr: [ContainersCommon, volumes]}
|
|
- {get_attr: [NovaApiLogging, volumes]}
|
|
-
|
|
- /var/lib/kolla/config_files/nova_api_cron.json:/var/lib/kolla/config_files/config.json:ro
|
|
- /var/lib/config-data/puppet-generated/nova/:/var/lib/kolla/config_files/src:ro
|
|
environment:
|
|
- KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
|
|
step_5:
|
|
nova_api_discover_hosts:
|
|
start_order: 1
|
|
image: *nova_api_image
|
|
net: host
|
|
detach: false
|
|
volumes:
|
|
list_concat:
|
|
- *nova_api_bootstrap_volumes
|
|
-
|
|
- /var/lib/config-data/nova/etc/my.cnf.d/tripleo.cnf:/etc/my.cnf.d/tripleo.cnf:ro
|
|
- /var/lib/config-data/nova/etc/nova/:/etc/nova/:ro
|
|
- /var/log/containers/nova:/var/log/nova
|
|
- /var/lib/docker-config-scripts/nova_api_discover_hosts.sh:/nova_api_discover_hosts.sh:ro
|
|
user: root
|
|
command: "/usr/bin/bootstrap_host_exec nova_api /nova_api_discover_hosts.sh"
|
|
metadata_settings:
|
|
get_attr: [NovaApiBase, role_data, metadata_settings]
|
|
host_prep_tasks: {get_attr: [NovaApiLogging, host_prep_tasks]}
|
|
upgrade_tasks:
|
|
- name: Stop and disable nova_api service
|
|
tags: step2
|
|
service: name=openstack-nova-api state=stopped enabled=no
|
|
- name: Remove openstack-nova-api package if operator requests it
|
|
yum: name=openstack-nova-api state=removed
|
|
tags: step2
|
|
ignore_errors: True
|
|
when: {get_param: UpgradeRemoveUnusedPackages}
|
|
- name: remove old nova cron jobs
|
|
tags: step2
|
|
file:
|
|
path: /var/spool/cron/nova
|
|
state: absent
|