Use Docker healthchecks for core services

This change enables the use of Docker healthchecks for core OpenStack
services.
Also check-failures.sh has been updated to treat containers with
unhealthy status as failed.

Implements: blueprint container-health-check
Change-Id: I79c6b11511ce8af70f77e2f6a490b59b477fefbb
This commit is contained in:
Michal Nasiadka 2019-08-14 11:15:33 +00:00
parent 4c4ad2b87b
commit c52a89ae04
29 changed files with 456 additions and 4 deletions

View File

@ -152,6 +152,16 @@ docker_common_options:
# Dimension options for Docker Containers
default_container_dimensions: {}
#####################
# Healthcheck options
#####################
enable_container_healthchecks: "yes"
# Healthcheck options for Docker containers
# interval/timeout/start_period are in seconds
default_container_healthcheck_interval: 30
default_container_healthcheck_timeout: 30
default_container_healthcheck_retries: 3
default_container_healthcheck_start_period: 5
#######################
# Extra volumes options
@ -289,6 +299,7 @@ glance_internal_fqdn: "{{ kolla_internal_fqdn }}"
glance_external_fqdn: "{{ kolla_external_fqdn }}"
glance_api_port: "9292"
glance_api_listen_port: "{{ glance_api_port }}"
glance_tls_proxy_stats_port: "9293"
gnocchi_internal_fqdn: "{{ kolla_internal_fqdn }}"
gnocchi_external_fqdn: "{{ kolla_external_fqdn }}"

View File

@ -12,6 +12,7 @@ glance_services:
privileged: "{{ enable_cinder | bool and enable_cinder_backend_iscsi | bool }}"
volumes: "{{ glance_api_default_volumes + glance_api_extra_volumes }}"
dimensions: "{{ glance_api_dimensions }}"
healthcheck: "{{ glance_api_healthcheck }}"
haproxy:
glance_api:
enabled: "{{ enable_glance | bool and not glance_enable_tls_backend | bool }}"
@ -41,6 +42,7 @@ glance_services:
image: "{{ glance_tls_proxy_image_full }}"
volumes: "{{ glance_tls_proxy_default_volumes + glance_tls_proxy_extra_volumes }}"
dimensions: "{{ glance_tls_proxy_dimensions }}"
healthcheck: "{{ glance_tls_proxy_healthcheck }}"
haproxy:
glance_tls_proxy:
enabled: "{{ enable_glance | bool and glance_enable_tls_backend | bool }}"
@ -130,6 +132,32 @@ glance_tls_proxy_image_full: "{{ glance_tls_proxy_image }}:{{ glance_tls_proxy_t
glance_api_dimensions: "{{ default_container_dimensions }}"
glance_tls_proxy_dimensions: "{{ default_container_dimensions }}"
glance_api_enable_healthchecks: "{{ enable_container_healthchecks }}"
glance_api_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
glance_api_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
glance_api_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
glance_api_healthcheck_test: ["CMD-SHELL", "healthcheck_curl http://{% if glance_enable_tls_backend | bool %}localhost{% else %}{{ api_interface_address | put_address_in_context('url') }}{% endif %}:{{ glance_api_listen_port }}"]
glance_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
glance_api_healthcheck:
interval: "{{ glance_api_healthcheck_interval }}"
retries: "{{ glance_api_healthcheck_retries }}"
start_period: "{{ glance_api_healthcheck_start_period }}"
test: "{% if glance_api_enable_healthchecks | bool %}{{ glance_api_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ glance_api_healthcheck_timeout }}"
glance_tls_proxy_enable_healthchecks: "{{ enable_container_healthchecks }}"
glance_tls_proxy_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
glance_tls_proxy_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
glance_tls_proxy_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
glance_tls_proxy_healthcheck_test: ["CMD-SHELL", "healthcheck_curl -u {{ haproxy_user }}:{{ haproxy_password }} {{ api_interface_address | put_address_in_context('url') }}:{{ glance_tls_proxy_stats_port }}"]
glance_tls_proxy_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
glance_tls_proxy_healthcheck:
interval: "{{ glance_tls_proxy_healthcheck_interval }}"
retries: "{{ glance_tls_proxy_healthcheck_retries }}"
start_period: "{{ glance_tls_proxy_healthcheck_start_period }}"
test: "{% if glance_tls_proxy_enable_healthchecks | bool %}{{ glance_tls_proxy_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ glance_tls_proxy_healthcheck_timeout }}"
glance_api_default_volumes:
- "{{ node_config_directory }}/glance-api/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"

View File

@ -13,6 +13,7 @@
environment: "{{ service.environment }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -28,5 +29,6 @@
image: "{{ service.image }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"

View File

@ -10,6 +10,7 @@
environment: "{{ item.value.environment | default(omit) }}"
volumes: "{{ item.value.volumes|reject('equalto', '')|list }}"
dimensions: "{{ item.value.dimensions }}"
healthcheck: "{{ item.value.healthcheck | default(omit) }}"
when:
- item.value.host_in_groups | bool
- item.value.enabled | bool

View File

@ -30,6 +30,15 @@ defaults
balance {{ glance_tls_proxy_defaults_balance }}
maxconn {{ glance_tls_proxy_defaults_max_connections }}
listen stats
bind {{ api_interface_address }}:{{ glance_tls_proxy_stats_port }}
mode http
stats enable
stats uri /
stats refresh 15s
stats realm Haproxy\ Stats
stats auth {{ haproxy_user }}:{{ haproxy_password }}
frontend glance_backend_tls
bind {{ api_interface_address }}:{{ glance_api_listen_port }} ssl crt /etc/glance/certs/glance-cert-and-key.pem
default_backend glance_api

View File

@ -9,6 +9,7 @@ heat_services:
image: "{{ heat_api_image_full }}"
volumes: "{{ heat_api_default_volumes + heat_api_extra_volumes }}"
dimensions: "{{ heat_api_dimensions }}"
healthcheck: "{{ heat_api_healthcheck }}"
haproxy:
heat_api:
enabled: "{{ enable_heat }}"
@ -31,6 +32,7 @@ heat_services:
image: "{{ heat_api_cfn_image_full }}"
volumes: "{{ heat_api_cfn_default_volumes + heat_api_cfn_extra_volumes }}"
dimensions: "{{ heat_api_cfn_dimensions }}"
healthcheck: "{{ heat_api_cfn_healthcheck }}"
haproxy:
heat_api_cfn:
enabled: "{{ enable_heat }}"
@ -53,6 +55,7 @@ heat_services:
image: "{{ heat_engine_image_full }}"
volumes: "{{ heat_engine_default_volumes + heat_engine_extra_volumes }}"
dimensions: "{{ heat_engine_dimensions }}"
healthcheck: "{{ heat_engine_healthcheck }}"
####################
# Database
@ -84,6 +87,45 @@ heat_api_dimensions: "{{ default_container_dimensions }}"
heat_api_cfn_dimensions: "{{ default_container_dimensions }}"
heat_engine_dimensions: "{{ default_container_dimensions }}"
heat_api_enable_healthchecks: "{{ enable_container_healthchecks }}"
heat_api_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
heat_api_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
heat_api_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
heat_api_healthcheck_test: ["CMD-SHELL", "healthcheck_curl {{ 'https' if heat_enable_tls_backend | bool else 'http' }}://{{ api_interface_address | put_address_in_context('url') }}:{{ heat_api_listen_port }}"]
heat_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
heat_api_healthcheck:
interval: "{{ heat_api_healthcheck_interval }}"
retries: "{{ heat_api_healthcheck_retries }}"
start_period: "{{ heat_api_healthcheck_start_period }}"
test: "{% if heat_api_enable_healthchecks | bool %}{{ heat_api_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ heat_api_healthcheck_timeout }}"
heat_api_cfn_enable_healthchecks: "{{ enable_container_healthchecks }}"
heat_api_cfn_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
heat_api_cfn_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
heat_api_cfn_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
heat_api_cfn_healthcheck_test: ["CMD-SHELL", "healthcheck_curl {{ 'https' if heat_enable_tls_backend | bool else 'http' }}://{{ api_interface_address | put_address_in_context('url') }}:{{ heat_api_cfn_listen_port }}"]
heat_api_cfn_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
heat_api_cfn_healthcheck:
interval: "{{ heat_api_cfn_healthcheck_interval }}"
retries: "{{ heat_api_cfn_healthcheck_retries }}"
start_period: "{{ heat_api_cfn_healthcheck_start_period }}"
test: "{% if heat_api_cfn_enable_healthchecks | bool %}{{ heat_api_cfn_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ heat_api_cfn_healthcheck_timeout }}"
heat_engine_enable_healthchecks: "{{ enable_container_healthchecks }}"
heat_engine_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
heat_engine_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
heat_engine_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
heat_engine_healthcheck_test: ["CMD-SHELL", "healthcheck_port heat-engine {{ om_rpc_port }}"]
heat_engine_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
heat_engine_healthcheck:
interval: "{{ heat_engine_healthcheck_interval }}"
retries: "{{ heat_engine_healthcheck_retries }}"
start_period: "{{ heat_engine_healthcheck_start_period }}"
test: "{% if heat_engine_enable_healthchecks | bool %}{{ heat_engine_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ heat_engine_healthcheck_timeout }}"
heat_api_default_volumes:
- "{{ node_config_directory }}/heat-api/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"

View File

@ -11,6 +11,7 @@
image: "{{ service.image }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -26,6 +27,7 @@
image: "{{ service.image }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -41,5 +43,6 @@
image: "{{ service.image }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"

View File

@ -8,6 +8,7 @@
image: "{{ item.value.image }}"
volumes: "{{ item.value.volumes|reject('equalto', '')|list }}"
dimensions: "{{ item.value.dimensions }}"
healthcheck: "{{ item.value.healthcheck | default(omit) }}"
when:
- inventory_hostname in groups[item.value.group]
- item.value.enabled | bool

View File

@ -36,6 +36,7 @@ horizon_services:
FORCE_GENERATE: "{{ 'yes' if horizon_dev_mode | bool else 'no' }}"
volumes: "{{ horizon_default_volumes + horizon_extra_volumes }}"
dimensions: "{{ horizon_dimensions }}"
healthcheck: "{{ horizon_healthcheck }}"
haproxy:
horizon:
enabled: "{{ enable_horizon }}"
@ -87,6 +88,19 @@ horizon_image_full: "{{ horizon_image }}:{{ horizon_tag }}"
horizon_dimensions: "{{ default_container_dimensions }}"
horizon_enable_healthchecks: "{{ enable_container_healthchecks }}"
horizon_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
horizon_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
horizon_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
horizon_healthcheck_test: ["CMD-SHELL", "healthcheck_curl {{ 'https' if horizon_enable_tls_backend | bool else 'http' }}://{{ api_interface_address | put_address_in_context('url') }}:{{ horizon_listen_port }}"]
horizon_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
horizon_healthcheck:
interval: "{{ horizon_healthcheck_interval }}"
retries: "{{ horizon_healthcheck_retries }}"
start_period: "{{ horizon_healthcheck_start_period }}"
test: "{% if horizon_enable_healthchecks | bool %}{{ horizon_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ horizon_healthcheck_timeout }}"
horizon_default_volumes:
- "{{ node_config_directory }}/horizon/:{{ container_config_directory }}/:ro"
- "{{ kolla_dev_repos_directory ~ '/horizon/horizon:/var/lib/kolla/venv/lib/python' ~ distro_python_version ~ '/site-packages/horizon' if horizon_dev_mode | bool else '' }}"

View File

@ -12,5 +12,6 @@
environment: "{{ service.environment }}"
volumes: "{{ service.volumes }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"

View File

@ -11,6 +11,7 @@
environment: "{{ horizon.environment }}"
volumes: "{{ horizon.volumes }}"
dimensions: "{{ horizon.dimensions }}"
healthcheck: "{{ horizon.healthcheck | default(omit) }}"
when:
- inventory_hostname in groups[horizon.group]
- horizon.enabled | bool

View File

@ -9,6 +9,7 @@ keystone_services:
image: "{{ keystone_image_full }}"
volumes: "{{ keystone_default_volumes + keystone_extra_volumes }}"
dimensions: "{{ keystone_dimensions }}"
healthcheck: "{{ keystone_healthcheck }}"
haproxy:
keystone_internal:
enabled: "{{ enable_keystone }}"
@ -43,6 +44,7 @@ keystone_services:
- "kolla_logs:/var/log/kolla/"
- "keystone_fernet_tokens:/etc/keystone/fernet-keys"
dimensions: "{{ keystone_ssh_dimensions }}"
healthcheck: "{{ keystone_ssh_healthcheck }}"
keystone-fernet:
container_name: "keystone_fernet"
group: "keystone"
@ -56,7 +58,6 @@ keystone_services:
- "keystone_fernet_tokens:/etc/keystone/fernet-keys"
dimensions: "{{ keystone_fernet_dimensions }}"
####################
# Database
####################
@ -94,6 +95,32 @@ keystone_dimensions: "{{ default_container_dimensions }}"
keystone_fernet_dimensions: "{{ default_container_dimensions }}"
keystone_ssh_dimensions: "{{ default_container_dimensions }}"
keystone_enable_healthchecks: "{{ enable_container_healthchecks }}"
keystone_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
keystone_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
keystone_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
keystone_healthcheck_test: ["CMD-SHELL", "healthcheck_curl {{ 'https' if keystone_enable_tls_backend | bool else 'http' }}://{{ api_interface_address | put_address_in_context('url') }}:{{ keystone_public_listen_port }}"]
keystone_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
keystone_healthcheck:
interval: "{{ keystone_healthcheck_interval }}"
retries: "{{ keystone_healthcheck_retries }}"
start_period: "{{ keystone_healthcheck_start_period }}"
test: "{% if keystone_enable_healthchecks | bool %}{{ keystone_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ keystone_healthcheck_timeout }}"
keystone_ssh_enable_healthchecks: "{{ enable_container_healthchecks }}"
keystone_ssh_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
keystone_ssh_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
keystone_ssh_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
keystone_ssh_healthcheck_test: ["CMD-SHELL", "healthcheck_listen sshd {{ keystone_ssh_port }}"]
keystone_ssh_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
keystone_ssh_healthcheck:
interval: "{{ keystone_ssh_healthcheck_interval }}"
retries: "{{ keystone_ssh_healthcheck_retries }}"
start_period: "{{ keystone_ssh_healthcheck_start_period }}"
test: "{% if keystone_ssh_enable_healthchecks | bool %}{{ keystone_ssh_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ keystone_ssh_healthcheck_timeout }}"
keystone_default_volumes:
- "{{ node_config_directory }}/keystone/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"

View File

@ -38,6 +38,7 @@
image: "{{ service.image }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -53,6 +54,7 @@
image: "{{ service.image }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -68,6 +70,7 @@
image: "{{ service.image }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"

View File

@ -8,6 +8,7 @@
image: "{{ item.value.image }}"
volumes: "{{ item.value.volumes|reject('equalto', '')|list }}"
dimensions: "{{ item.value.dimensions }}"
healthcheck: "{{ item.value.healthcheck | default(omit) }}"
when:
- inventory_hostname in groups[item.value.group]
- item.value.enabled | bool

View File

@ -10,6 +10,7 @@ neutron_services:
host_in_groups: "{{ inventory_hostname in groups['neutron-server'] }}"
volumes: "{{ neutron_server_default_volumes + neutron_server_extra_volumes }}"
dimensions: "{{ neutron_server_dimensions }}"
healthcheck: "{{ neutron_server_healthcheck }}"
haproxy:
neutron_server:
enabled: "{{ enable_neutron }}"
@ -47,6 +48,7 @@ neutron_services:
}}
volumes: "{{ neutron_openvswitch_agent_default_volumes + neutron_openvswitch_agent_extra_volumes }}"
dimensions: "{{ neutron_openvswitch_agent_dimensions }}"
healthcheck: "{{ neutron_openvswitch_agent_healthcheck }}"
neutron-linuxbridge-agent:
container_name: "neutron_linuxbridge_agent"
image: "{{ neutron_linuxbridge_agent_image_full }}"
@ -64,6 +66,7 @@ neutron_services:
}}
volumes: "{{ neutron_linuxbridge_agent_default_volumes + neutron_linuxbridge_agent_extra_volumes }}"
dimensions: "{{ neutron_linuxbridge_agent_dimensions }}"
healthcheck: "{{ neutron_linuxbridge_agent_healthcheck }}"
neutron-dhcp-agent:
container_name: "neutron_dhcp_agent"
image: "{{ neutron_dhcp_agent_image_full }}"
@ -73,6 +76,7 @@ neutron_services:
host_in_groups: "{{ inventory_hostname in groups['neutron-dhcp-agent'] }}"
volumes: "{{ neutron_dhcp_agent_default_volumes + neutron_dhcp_agent_extra_volumes }}"
dimensions: "{{ neutron_dhcp_agent_dimensions }}"
healthcheck: "{{ neutron_dhcp_agent_healthcheck }}"
neutron-l3-agent:
container_name: "neutron_l3_agent"
image: "{{ neutron_l3_agent_image_full }}"
@ -87,6 +91,7 @@ neutron_services:
}}
volumes: "{{ neutron_l3_agent_default_volumes + neutron_l3_agent_extra_volumes }}"
dimensions: "{{ neutron_l3_agent_dimensions }}"
healthcheck: "{{ neutron_l3_agent_healthcheck }}"
neutron-sriov-agent:
container_name: "neutron_sriov_agent"
image: "{{ neutron_sriov_agent_image_full }}"
@ -95,6 +100,7 @@ neutron_services:
host_in_groups: "{{ inventory_hostname in groups['compute'] }}"
volumes: "{{ neutron_sriov_agent_default_volumes + neutron_sriov_agent_extra_volumes }}"
dimensions: "{{ neutron_sriov_agent_dimensions }}"
healthcheck: "{{ neutron_sriov_agent_healthcheck }}"
neutron-mlnx-agent:
container_name: "neutron_mlnx_agent"
image: "{{ neutron_mlnx_agent_image_full }}"
@ -122,6 +128,7 @@ neutron_services:
}}
volumes: "{{ neutron_metadata_agent_default_volumes + neutron_metadata_agent_extra_volumes }}"
dimensions: "{{ neutron_metadata_agent_dimensions }}"
healthcheck: "{{ neutron_metadata_agent_healthcheck }}"
neutron-ovn-metadata-agent:
container_name: "neutron_ovn_metadata_agent"
image: "{{ neutron_ovn_metadata_agent_image_full }}"
@ -130,6 +137,7 @@ neutron_services:
host_in_groups: "{{ inventory_hostname in groups['neutron-ovn-metadata-agent'] }}"
volumes: "{{ neutron_ovn_metadata_agent_default_volumes + neutron_ovn_metadata_agent_extra_volumes }}"
dimensions: "{{ neutron_ovn_metadata_agent_dimensions }}"
healthcheck: "{{ neutron_ovn_metadata_agent_healthcheck }}"
neutron-bgp-dragent:
container_name: "neutron_bgp_dragent"
image: "{{ neutron_bgp_dragent_image_full }}"
@ -254,6 +262,109 @@ neutron_infoblox_ipam_agent_dimensions: "{{ default_container_dimensions }}"
neutron_metering_agent_dimensions: "{{ neutron_agent_dimensions }}"
ironic_neutron_agent_dimensions: "{{ default_container_dimensions }}"
neutron_dhcp_agent_enable_healthchecks: "{{ enable_container_healthchecks }}"
neutron_dhcp_agent_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
neutron_dhcp_agent_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
neutron_dhcp_agent_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
neutron_dhcp_agent_healthcheck_test: ["CMD-SHELL", "healthcheck_port neutron-dhcp-agent {{ om_rpc_port }}"]
neutron_dhcp_agent_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
neutron_dhcp_agent_healthcheck:
interval: "{{ neutron_dhcp_agent_healthcheck_interval }}"
retries: "{{ neutron_dhcp_agent_healthcheck_retries }}"
start_period: "{{ neutron_dhcp_agent_healthcheck_start_period }}"
test: "{% if neutron_dhcp_agent_enable_healthchecks | bool %}{{ neutron_dhcp_agent_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ neutron_dhcp_agent_healthcheck_timeout }}"
neutron_l3_agent_enable_healthchecks: "{{ enable_container_healthchecks }}"
neutron_l3_agent_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
neutron_l3_agent_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
neutron_l3_agent_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
neutron_l3_agent_healthcheck_test: ["CMD-SHELL", "healthcheck_port 'neutron-l3-agent ' {{ om_rpc_port }}"]
neutron_l3_agent_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
neutron_l3_agent_healthcheck:
interval: "{{ neutron_l3_agent_healthcheck_interval }}"
retries: "{{ neutron_l3_agent_healthcheck_retries }}"
start_period: "{{ neutron_l3_agent_healthcheck_start_period }}"
test: "{% if neutron_l3_agent_enable_healthchecks | bool %}{{ neutron_l3_agent_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ neutron_l3_agent_healthcheck_timeout }}"
neutron_linuxbridge_agent_enable_healthchecks: "{{ enable_container_healthchecks }}"
neutron_linuxbridge_agent_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
neutron_linuxbridge_agent_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
neutron_linuxbridge_agent_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
neutron_linuxbridge_agent_healthcheck_test: ["CMD-SHELL", "healthcheck_port neutron-linuxbridge-agent {{ om_rpc_port }}"]
neutron_linuxbridge_agent_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
neutron_linuxbridge_agent_healthcheck:
interval: "{{ neutron_linuxbridge_agent_healthcheck_interval }}"
retries: "{{ neutron_linuxbridge_agent_healthcheck_retries }}"
start_period: "{{ neutron_linuxbridge_agent_healthcheck_start_period }}"
test: "{% if neutron_linuxbridge_agent_enable_healthchecks | bool %}{{ neutron_linuxbridge_agent_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ neutron_linuxbridge_agent_healthcheck_timeout }}"
neutron_metadata_agent_enable_healthchecks: "{{ enable_container_healthchecks }}"
neutron_metadata_agent_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
neutron_metadata_agent_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
neutron_metadata_agent_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
neutron_metadata_agent_healthcheck_test: ["CMD-SHELL", "healthcheck_port neutron-metadata-agent {{ om_rpc_port }}"]
neutron_metadata_agent_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
neutron_metadata_agent_healthcheck:
interval: "{{ neutron_metadata_agent_healthcheck_interval }}"
retries: "{{ neutron_metadata_agent_healthcheck_retries }}"
start_period: "{{ neutron_metadata_agent_healthcheck_start_period }}"
test: "{% if neutron_metadata_agent_enable_healthchecks | bool %}{{ neutron_metadata_agent_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ neutron_metadata_agent_healthcheck_timeout }}"
neutron_openvswitch_agent_enable_healthchecks: "{{ enable_container_healthchecks }}"
neutron_openvswitch_agent_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
neutron_openvswitch_agent_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
neutron_openvswitch_agent_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
neutron_openvswitch_agent_healthcheck_test: ["CMD-SHELL", "healthcheck_port neutron-openvswitch-agent {{ om_rpc_port }}"]
neutron_openvswitch_agent_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
neutron_openvswitch_agent_healthcheck:
interval: "{{ neutron_openvswitch_agent_healthcheck_interval }}"
retries: "{{ neutron_openvswitch_agent_healthcheck_retries }}"
start_period: "{{ neutron_openvswitch_agent_healthcheck_start_period }}"
test: "{% if neutron_openvswitch_agent_enable_healthchecks | bool %}{{ neutron_openvswitch_agent_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ neutron_openvswitch_agent_healthcheck_timeout }}"
neutron_ovn_metadata_agent_enable_healthchecks: "{{ enable_container_healthchecks }}"
neutron_ovn_metadata_agent_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
neutron_ovn_metadata_agent_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
neutron_ovn_metadata_agent_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
neutron_ovn_metadata_agent_healthcheck_test: ["CMD-SHELL", "healthcheck_port python {{ ovn_sb_db_port }}"]
neutron_ovn_metadata_agent_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
neutron_ovn_metadata_agent_healthcheck:
interval: "{{ neutron_ovn_metadata_agent_healthcheck_interval }}"
retries: "{{ neutron_ovn_metadata_agent_healthcheck_retries }}"
start_period: "{{ neutron_ovn_metadata_agent_healthcheck_start_period }}"
test: "{% if neutron_ovn_metadata_agent_enable_healthchecks | bool %}{{ neutron_ovn_metadata_agent_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ neutron_ovn_metadata_agent_healthcheck_timeout }}"
neutron_server_enable_healthchecks: "{{ enable_container_healthchecks }}"
neutron_server_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
neutron_server_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
neutron_server_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
neutron_server_healthcheck_test: ["CMD-SHELL", "healthcheck_curl http://{{ api_interface_address | put_address_in_context('url') }}:{{ neutron_server_listen_port }}"]
neutron_server_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
neutron_server_healthcheck:
interval: "{{ neutron_server_healthcheck_interval }}"
retries: "{{ neutron_server_healthcheck_retries }}"
start_period: "{{ neutron_server_healthcheck_start_period }}"
test: "{% if neutron_server_enable_healthchecks | bool %}{{ neutron_server_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ neutron_server_healthcheck_timeout }}"
neutron_sriov_agent_enable_healthchecks: "{{ enable_container_healthchecks }}"
neutron_sriov_agent_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
neutron_sriov_agent_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
neutron_sriov_agent_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
neutron_sriov_agent_healthcheck_test: ["CMD-SHELL", "healthcheck_port neutron-sriov-nic-agent {{ om_rpc_port }}"]
neutron_sriov_agent_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
neutron_sriov_agent_healthcheck:
interval: "{{ neutron_sriov_agent_healthcheck_interval }}"
retries: "{{ neutron_sriov_agent_healthcheck_retries }}"
start_period: "{{ neutron_sriov_agent_healthcheck_start_period }}"
test: "{% if neutron_sriov_agent_enable_healthchecks | bool %}{{ neutron_sriov_agent_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ neutron_sriov_agent_healthcheck_timeout }}"
neutron_dhcp_agent_default_volumes:
- "{{ node_config_directory }}/neutron-dhcp-agent/:{{ container_config_directory }}/:ro"

View File

@ -12,6 +12,7 @@
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -29,6 +30,7 @@
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -45,6 +47,7 @@
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
with_sequence: "start=1 end={{ num_nova_fake_per_node }}"
when:
- kolla_action != "config"
@ -63,6 +66,7 @@
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -79,6 +83,7 @@
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -96,6 +101,7 @@
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -112,6 +118,7 @@
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -160,6 +167,7 @@
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -176,6 +184,7 @@
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -192,6 +201,7 @@
volumes: "{{ service.volumes }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -208,6 +218,7 @@
volumes: "{{ service.volumes }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -224,6 +235,7 @@
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -240,5 +252,6 @@
volumes: "{{ service.volumes }}"
dimensions: "{{ service.dimensions }}"
privileged: "{{ service.privileged | default(False) }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"

View File

@ -10,6 +10,7 @@
volumes: "{{ item.value.volumes }}"
dimensions: "{{ item.value.dimensions }}"
environment: "{{ item.value.environment | default(omit) }}"
healthcheck: "{{ item.value.healthcheck | default(omit) }}"
when:
- item.value.enabled | bool
- item.value.host_in_groups | bool

View File

@ -11,6 +11,7 @@ nova_cell_services:
privileged: True
volumes: "{{ nova_libvirt_default_volumes + nova_libvirt_extra_volumes }}"
dimensions: "{{ nova_libvirt_dimensions }}"
healthcheck: "{{ nova_libvirt_healthcheck }}"
nova-ssh:
container_name: "nova_ssh"
group: "{{ nova_cell_compute_group }}"
@ -18,6 +19,7 @@ nova_cell_services:
enabled: "{{ enable_nova_ssh | bool }}"
volumes: "{{ nova_ssh_default_volumes + nova_ssh_extra_volumes }}"
dimensions: "{{ nova_ssh_dimensions }}"
healthcheck: "{{ nova_ssh_healthcheck }}"
nova-novncproxy:
container_name: "nova_novncproxy"
group: "{{ nova_cell_novncproxy_group }}"
@ -25,6 +27,7 @@ nova_cell_services:
enabled: "{{ nova_console == 'novnc' }}"
volumes: "{{ nova_novncproxy_default_volumes + nova_novncproxy_extra_volumes }}"
dimensions: "{{ nova_novncproxy_dimensions }}"
healthcheck: "{{ nova_novncproxy_healthcheck }}"
nova-spicehtml5proxy:
container_name: "nova_spicehtml5proxy"
group: "{{ nova_cell_spicehtml5proxy_group }}"
@ -46,6 +49,7 @@ nova_cell_services:
image: "{{ nova_conductor_image_full }}"
volumes: "{{ nova_conductor_default_volumes + nova_conductor_extra_volumes }}"
dimensions: "{{ nova_conductor_dimensions }}"
healthcheck: "{{ nova_conductor_healthcheck }}"
nova-compute:
container_name: "nova_compute"
group: "{{ nova_cell_compute_group }}"
@ -57,6 +61,7 @@ nova_cell_services:
ipc_mode: "host"
volumes: "{{ nova_compute_default_volumes + nova_compute_extra_volumes }}"
dimensions: "{{ nova_compute_dimensions }}"
healthcheck: "{{ nova_compute_healthcheck }}"
nova-compute-ironic:
container_name: "nova_compute_ironic"
group: "{{ nova_cell_compute_ironic_group }}"
@ -64,6 +69,7 @@ nova_cell_services:
enabled: "{{ enable_ironic | bool and nova_cell_name == nova_cell_ironic_cell_name }}"
volumes: "{{ nova_compute_ironic_default_volumes + nova_compute_ironic_extra_volumes }}"
dimensions: "{{ nova_compute_ironic_dimensions }}"
healthcheck: "{{ nova_compute_ironic_healthcheck }}"
####################
# Ceph options
@ -236,6 +242,84 @@ nova_conductor_dimensions: "{{ default_container_dimensions }}"
nova_compute_dimensions: "{{ default_container_dimensions }}"
nova_compute_ironic_dimensions: "{{ default_container_dimensions }}"
nova_libvirt_enable_healthchecks: "{{ enable_container_healthchecks }}"
nova_libvirt_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
nova_libvirt_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
nova_libvirt_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
nova_libvirt_healthcheck_test: ["CMD-SHELL", "virsh version --daemon"]
nova_libvirt_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
nova_libvirt_healthcheck:
interval: "{{ nova_libvirt_healthcheck_interval }}"
retries: "{{ nova_libvirt_healthcheck_retries }}"
start_period: "{{ nova_libvirt_healthcheck_start_period }}"
test: "{% if nova_libvirt_enable_healthchecks | bool %}{{ nova_libvirt_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ nova_libvirt_healthcheck_timeout }}"
nova_ssh_enable_healthchecks: "{{ enable_container_healthchecks }}"
nova_ssh_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
nova_ssh_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
nova_ssh_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
nova_ssh_healthcheck_test: ["CMD-SHELL", "healthcheck_listen sshd {{ nova_ssh_port }}"]
nova_ssh_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
nova_ssh_healthcheck:
interval: "{{ nova_ssh_healthcheck_interval }}"
retries: "{{ nova_ssh_healthcheck_retries }}"
start_period: "{{ nova_ssh_healthcheck_start_period }}"
test: "{% if nova_ssh_enable_healthchecks | bool %}{{ nova_ssh_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ nova_ssh_healthcheck_timeout }}"
nova_novncproxy_enable_healthchecks: "{{ enable_container_healthchecks }}"
nova_novncproxy_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
nova_novncproxy_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
nova_novncproxy_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
nova_novncproxy_healthcheck_test: ["CMD-SHELL", "healthcheck_curl http://{{ api_interface_address | put_address_in_context('url') }}:{{ nova_novncproxy_listen_port }}/vnc_auto.html"]
nova_novncproxy_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
nova_novncproxy_healthcheck:
interval: "{{ nova_novncproxy_healthcheck_interval }}"
retries: "{{ nova_novncproxy_healthcheck_retries }}"
start_period: "{{ nova_novncproxy_healthcheck_start_period }}"
test: "{% if nova_novncproxy_enable_healthchecks | bool %}{{ nova_novncproxy_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ nova_novncproxy_healthcheck_timeout }}"
nova_conductor_enable_healthchecks: "{{ enable_container_healthchecks }}"
nova_conductor_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
nova_conductor_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
nova_conductor_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
nova_conductor_healthcheck_test: ["CMD-SHELL", "healthcheck_port nova-conductor {{ om_rpc_port }}"]
nova_conductor_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
nova_conductor_healthcheck:
interval: "{{ nova_conductor_healthcheck_interval }}"
retries: "{{ nova_conductor_healthcheck_retries }}"
start_period: "{{ nova_conductor_healthcheck_start_period }}"
test: "{% if nova_conductor_enable_healthchecks | bool %}{{ nova_conductor_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ nova_conductor_healthcheck_timeout }}"
nova_compute_enable_healthchecks: "{{ enable_container_healthchecks }}"
nova_compute_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
nova_compute_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
nova_compute_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
nova_compute_healthcheck_test: ["CMD-SHELL", "healthcheck_port nova-compute {{ om_rpc_port }}"]
nova_compute_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
nova_compute_healthcheck:
interval: "{{ nova_compute_healthcheck_interval }}"
retries: "{{ nova_compute_healthcheck_retries }}"
start_period: "{{ nova_compute_healthcheck_start_period }}"
test: "{% if nova_compute_enable_healthchecks | bool %}{{ nova_compute_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ nova_compute_healthcheck_timeout }}"
nova_compute_ironic_enable_healthchecks: "{{ enable_container_healthchecks }}"
nova_compute_ironic_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
nova_compute_ironic_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
nova_compute_ironic_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
nova_compute_ironic_healthcheck_test: ["CMD-SHELL", "healthcheck_port nova-compute {{ om_rpc_port }}"]
nova_compute_ironic_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
nova_compute_ironic_healthcheck:
interval: "{{ nova_compute_ironic_healthcheck_interval }}"
retries: "{{ nova_compute_ironic_healthcheck_retries }}"
start_period: "{{ nova_compute_ironic_healthcheck_start_period }}"
test: "{% if nova_compute_ironic_enable_healthchecks | bool %}{{ nova_compute_ironic_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ nova_compute_ironic_healthcheck_timeout }}"
nova_libvirt_default_volumes:
- "{{ node_config_directory }}/nova-libvirt/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"

View File

@ -12,6 +12,7 @@
privileged: "{{ service.privileged | default(False) }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
- kolla_action != "upgrade" or not nova_safety_upgrade | bool
@ -29,6 +30,7 @@
privileged: "{{ service.privileged | default(False) }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
- kolla_action != "upgrade" or not nova_safety_upgrade | bool
@ -46,6 +48,7 @@
privileged: "{{ service.privileged | default(False) }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
- kolla_action != "upgrade" or not nova_safety_upgrade | bool
@ -63,6 +66,7 @@
privileged: "{{ service.privileged | default(False) }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
- kolla_action != "upgrade" or not nova_safety_upgrade | bool
@ -81,6 +85,7 @@
privileged: "{{ service.privileged | default(False) }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -98,6 +103,7 @@
privileged: "{{ service.privileged | default(False) }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
register: restart_nova_libvirt
# NOTE(Jeffrey4l): retry 5 to remove nova_libvirt container because when
# guests running, nova_libvirt will raise error even though it is removed.
@ -115,12 +121,13 @@
action: "recreate_or_restart_container"
common_options: "{{ docker_common_options }}"
name: "{{ service.container_name }}"
environment: "{{ service.environment | default(omit) }}"
environment: "{{ service.environment }}"
image: "{{ service.image }}"
privileged: "{{ service.privileged | default(False) }}"
ipc_mode: "{{ service.ipc_mode | default(omit) }}"
ipc_mode: "{{ service.ipc_mode }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
@ -137,6 +144,7 @@
privileged: "{{ service.privileged | default(False) }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"

View File

@ -12,6 +12,7 @@
privileged: "{{ item.value.privileged|default(False) }}"
volumes: "{{ item.value.volumes|reject('equalto', '')|list }}"
dimensions: "{{ item.value.dimensions }}"
healthcheck: "{{ item.value.healthcheck | default(omit) }}"
when:
- inventory_hostname in groups[item.value.group]
- item.value.enabled | bool

View File

@ -10,6 +10,7 @@ nova_services:
privileged: True
volumes: "{{ nova_api_default_volumes + nova_api_extra_volumes }}"
dimensions: "{{ nova_api_dimensions }}"
healthcheck: "{{ nova_api_healthcheck }}"
haproxy:
nova_api:
enabled: "{{ enable_nova }}"
@ -46,6 +47,7 @@ nova_services:
enabled: True
volumes: "{{ nova_scheduler_default_volumes + nova_scheduler_extra_volumes }}"
dimensions: "{{ nova_scheduler_dimensions }}"
healthcheck: "{{ nova_scheduler_healthcheck }}"
nova-super-conductor:
container_name: "nova_super_conductor"
group: "nova-super-conductor"
@ -53,6 +55,7 @@ nova_services:
image: "{{ nova_super_conductor_image_full }}"
volumes: "{{ nova_super_conductor_default_volumes + nova_super_conductor_extra_volumes }}"
dimensions: "{{ nova_super_conductor_dimensions }}"
healthcheck: "{{ nova_super_conductor_healthcheck }}"
####################
# Database
@ -93,6 +96,45 @@ nova_api_dimensions: "{{ default_container_dimensions }}"
nova_scheduler_dimensions: "{{ default_container_dimensions }}"
nova_super_conductor_dimensions: "{{ default_container_dimensions }}"
nova_api_enable_healthchecks: "{{ enable_container_healthchecks }}"
nova_api_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
nova_api_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
nova_api_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
nova_api_healthcheck_test: ["CMD-SHELL", "healthcheck_curl {{ 'https' if nova_enable_tls_backend | bool else 'http' }}://{{ api_interface_address | put_address_in_context('url') }}:{{ nova_api_listen_port}} "]
nova_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
nova_api_healthcheck:
interval: "{{ nova_api_healthcheck_interval }}"
retries: "{{ nova_api_healthcheck_retries }}"
start_period: "{{ nova_api_healthcheck_start_period }}"
test: "{% if nova_api_enable_healthchecks | bool %}{{ nova_api_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ nova_api_healthcheck_timeout }}"
nova_scheduler_enable_healthchecks: "{{ enable_container_healthchecks }}"
nova_scheduler_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
nova_scheduler_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
nova_scheduler_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
nova_scheduler_healthcheck_test: ["CMD-SHELL", "healthcheck_port nova-scheduler {{ om_rpc_port }}"]
nova_scheduler_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
nova_scheduler_healthcheck:
interval: "{{ nova_scheduler_healthcheck_interval }}"
retries: "{{ nova_scheduler_healthcheck_retries }}"
start_period: "{{ nova_scheduler_healthcheck_start_period }}"
test: "{% if nova_scheduler_enable_healthchecks | bool %}{{ nova_scheduler_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ nova_scheduler_healthcheck_timeout }}"
nova_super_conductor_enable_healthchecks: "{{ enable_container_healthchecks }}"
nova_super_conductor_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
nova_super_conductor_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
nova_super_conductor_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
nova_super_conductor_healthcheck_test: ["CMD-SHELL", "healthcheck_port nova-conductor {{ om_rpc_port }}"]
nova_super_conductor_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
nova_super_conductor_healthcheck:
interval: "{{ nova_super_conductor_healthcheck_interval }}"
retries: "{{ nova_super_conductor_healthcheck_retries }}"
start_period: "{{ nova_super_conductor_healthcheck_start_period }}"
test: "{% if nova_super_conductor_enable_healthchecks | bool %}{{ nova_super_conductor_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ nova_super_conductor_healthcheck_timeout }}"
nova_api_default_volumes:
- "{{ node_config_directory }}/nova-api/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"

View File

@ -12,6 +12,7 @@
privileged: "{{ service.privileged | default(False) }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
- kolla_action != "upgrade" or not nova_safety_upgrade | bool
@ -29,6 +30,7 @@
privileged: "{{ service.privileged | default(False) }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
- kolla_action != "upgrade" or not nova_safety_upgrade | bool
@ -46,6 +48,7 @@
privileged: "{{ service.privileged | default(False) }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"
- kolla_action != "upgrade" or not nova_safety_upgrade | bool

View File

@ -12,6 +12,7 @@
privileged: "{{ item.value.privileged|default(False) }}"
volumes: "{{ item.value.volumes|reject('equalto', '')|list }}"
dimensions: "{{ item.value.dimensions }}"
healthcheck: "{{ item.value.healthcheck | default(omit) }}"
when:
- inventory_hostname in groups[item.value.group]
- item.value.enabled | bool

View File

@ -9,6 +9,7 @@ placement_services:
enabled: True
volumes: "{{ placement_api_default_volumes + placement_api_extra_volumes }}"
dimensions: "{{ placement_api_dimensions }}"
healthcheck: "{{ placement_api_healthcheck }}"
haproxy:
placement_api:
enabled: "{{ enable_placement }}"
@ -44,6 +45,19 @@ placement_api_image_full: "{{ placement_api_image }}:{{ placement_api_tag }}"
placement_api_dimensions: "{{ default_container_dimensions }}"
placement_api_enable_healthchecks: "{{ enable_container_healthchecks }}"
placement_api_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
placement_api_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
placement_api_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
placement_api_healthcheck_test: ["CMD-SHELL", "healthcheck_curl {{ 'https' if placement_enable_tls_backend | bool else 'http' }}://{{ api_interface_address | put_address_in_context('url') }}:{{ placement_api_listen_port }}"]
placement_api_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
placement_api_healthcheck:
interval: "{{ placement_api_healthcheck_interval }}"
retries: "{{ placement_api_healthcheck_retries }}"
start_period: "{{ placement_api_healthcheck_start_period }}"
test: "{% if placement_api_enable_healthchecks | bool %}{{ placement_api_healthcheck_test }}{% else %}NONE{% endif %}"
timeout: "{{ placement_api_healthcheck_timeout }}"
placement_api_default_volumes:
- "{{ node_config_directory }}/placement-api/:{{ container_config_directory }}/:ro"
- "/etc/localtime:/etc/localtime:ro"

View File

@ -11,5 +11,6 @@
image: "{{ service.image }}"
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
dimensions: "{{ service.dimensions }}"
healthcheck: "{{ service.healthcheck | default(omit) }}"
when:
- kolla_action != "config"

View File

@ -12,6 +12,7 @@
privileged: "{{ item.value.privileged|default(False) }}"
volumes: "{{ item.value.volumes|reject('equalto', '')|list }}"
dimensions: "{{ item.value.dimensions }}"
healthcheck: "{{ item.value.healthcheck | default(omit) }}"
when:
- inventory_hostname in groups[item.value.group]
- item.value.enabled | bool

View File

@ -179,6 +179,17 @@
# kernel_memory:
# ulimits:
#####################
# Healthcheck options
#####################
#enable_container_healthchecks: "yes"
# Healthcheck options for Docker containers
# interval/timeout/start_period are in seconds
#default_container_healthcheck_interval: 30
#default_container_healthcheck_timeout: 30
#default_container_healthcheck_retries: 3
#default_container_healthcheck_start_period: 5
#############
# TLS options

View File

@ -0,0 +1,9 @@
---
features:
- |
Implements container healthchecks for core OpenStack services. Docker
healthchecks are periodically called scripts that check health of a
running service that expose health information in ``docker ps`` output
and trigger a ``health_status event``. Healthchecks are now enabled
by default and can be disabled by setting
``enable_container_healthchecks`` to ``no`` in ``globals.yml``.

View File

@ -11,6 +11,8 @@ check_failure() {
# All docker container's status are created, restarting, running, removing,
# paused, exited and dead. Containers without running status are treated as
# failure. removing is added in docker 1.13, just ignore it now.
# In addition to that, containers in unhealthy state (from healthchecks)
# are trated as failure.
failed_containers=$(sudo docker ps -a --format "{{.Names}}" \
--filter status=created \
--filter status=restarting \
@ -18,10 +20,16 @@ check_failure() {
--filter status=exited \
--filter status=dead)
unhealthy_containers=$(sudo docker ps -a --format "{{.Names}}" \
--filter health=unhealthy)
if [[ -n "$failed_containers" ]]; then
exit 1;
fi
if [[ -n "$unhealthy_containers" ]]; then
exit 1;
fi
}
check_failure