From 63d72ea7e8b1418ccdaddd45b788ab98fb541c21 Mon Sep 17 00:00:00 2001
From: Michal Arbet <michal.arbet@ultimum.io>
Date: Mon, 23 Aug 2021 13:31:26 +0200
Subject: [PATCH] Use Docker healthchecks for mariadb-server service

This change enables the use of Docker healthchecks for
mariadb-server service.

Depends-On: https://review.opendev.org/c/openstack/kolla/+/805613
Change-Id: I893687a0501ea0f281b879df3141a354bff9eca6
---
 ansible/roles/mariadb/defaults/main.yml       | 19 +++++++++++++++++++
 .../roles/mariadb/tasks/check-containers.yml  |  2 ++
 .../roles/mariadb/tasks/recover_cluster.yml   |  2 ++
 .../roles/mariadb/tasks/restart_services.yml  |  2 ++
 ...s-for-mariadb-server-cd9d1a4ddaf432ee.yaml |  6 ++++++
 5 files changed, 31 insertions(+)
 create mode 100644 releasenotes/notes/implement-docker-healthchecks-for-mariadb-server-cd9d1a4ddaf432ee.yaml

diff --git a/ansible/roles/mariadb/defaults/main.yml b/ansible/roles/mariadb/defaults/main.yml
index 5ab183c395..5e8c7d9a1b 100644
--- a/ansible/roles/mariadb/defaults/main.yml
+++ b/ansible/roles/mariadb/defaults/main.yml
@@ -7,6 +7,12 @@ mariadb_services:
     image: "{{ mariadb_image_full }}"
     volumes: "{{ mariadb_default_volumes + mariadb_extra_volumes }}"
     dimensions: "{{ mariadb_dimensions }}"
+    healthcheck: "{{ mariadb_healthcheck }}"
+    environment:
+      MYSQL_USERNAME: "{{ mariadb_monitor_user }}"
+      MYSQL_PASSWORD: "{% if enable_proxysql | bool %}{{ mariadb_monitor_password }}{% endif %}"
+      MYSQL_HOST: "{{ api_interface_address }}"
+      AVAILABLE_WHEN_DONOR: "1"
     haproxy:
       mariadb:
         enabled: "{{ enable_mariadb | bool and not enable_external_mariadb_load_balancer | bool }}"
@@ -87,6 +93,19 @@ mariadb_clustercheck_default_volumes:
 mariadb_extra_volumes: "{{ default_extra_volumes }}"
 mariadb_clustercheck_extra_volumes: "{{ default_extra_volumes }}"
 
+mariadb_enable_healthchecks: "{{ enable_container_healthchecks }}"
+mariadb_healthcheck_interval: "{{ default_container_healthcheck_interval }}"
+mariadb_healthcheck_retries: "{{ default_container_healthcheck_retries }}"
+mariadb_healthcheck_start_period: "{{ default_container_healthcheck_start_period }}"
+mariadb_healthcheck_test: ["CMD-SHELL", "/usr/bin/clustercheck"]
+mariadb_healthcheck_timeout: "{{ default_container_healthcheck_timeout }}"
+mariadb_healthcheck:
+  interval: "{{ mariadb_healthcheck_interval }}"
+  retries: "{{ mariadb_healthcheck_retries }}"
+  start_period: "{{ mariadb_healthcheck_start_period }}"
+  test: "{% if mariadb_enable_healthchecks | bool %}{{ mariadb_healthcheck_test }}{% else %}NONE{% endif %}"
+  timeout: "{{ mariadb_healthcheck_timeout }}"
+
 ########################################
 # Vars used within recover_cluster.yml
 ########################################
diff --git a/ansible/roles/mariadb/tasks/check-containers.yml b/ansible/roles/mariadb/tasks/check-containers.yml
index ddaeee60a2..e7a65d60eb 100644
--- a/ansible/roles/mariadb/tasks/check-containers.yml
+++ b/ansible/roles/mariadb/tasks/check-containers.yml
@@ -8,6 +8,8 @@
     image: "{{ item.value.image }}"
     volumes: "{{ item.value.volumes }}"
     dimensions: "{{ item.value.dimensions }}"
+    environment: "{{ item.value.environment | default(omit) }}"
+    healthcheck: "{{ item.value.healthcheck | default(omit) }}"
   when:
     - inventory_hostname in groups[item.value.group]
     - item.value.enabled | bool
diff --git a/ansible/roles/mariadb/tasks/recover_cluster.yml b/ansible/roles/mariadb/tasks/recover_cluster.yml
index 21aef27ac7..e02fd726ff 100644
--- a/ansible/roles/mariadb/tasks/recover_cluster.yml
+++ b/ansible/roles/mariadb/tasks/recover_cluster.yml
@@ -175,6 +175,7 @@
     volumes: "{{ item.value.volumes }}"
     dimensions: "{{ item.value.dimensions }}"
     environment: "{{ item.value.environment | default({}) }}"
+    healthcheck: "{{ item.value.healthcheck | default(omit) }}"
   with_dict: "{{ mariadb_services }}"
   when:
     - bootstrap_host is defined
@@ -205,6 +206,7 @@
     volumes: "{{ item.value.volumes }}"
     dimensions: "{{ item.value.dimensions }}"
     environment: "{{ item.value.environment | default({}) }}"
+    healthcheck: "{{ item.value.healthcheck | default(omit) }}"
   with_dict: "{{ mariadb_services }}"
   when:
     - bootstrap_host is defined
diff --git a/ansible/roles/mariadb/tasks/restart_services.yml b/ansible/roles/mariadb/tasks/restart_services.yml
index dff5cafb10..f4970fd1de 100644
--- a/ansible/roles/mariadb/tasks/restart_services.yml
+++ b/ansible/roles/mariadb/tasks/restart_services.yml
@@ -11,6 +11,8 @@
     image: "{{ service.image }}"
     volumes: "{{ service.volumes }}"
     dimensions: "{{ service.dimensions }}"
+    environment: "{{ service.environment | default(omit) }}"
+    healthcheck: "{{ service.healthcheck | default(omit) }}"
 
 # NOTE(yoctozepto): We have to loop this to avoid breaking on connection resets
 - name: Wait for MariaDB service port liveness
diff --git a/releasenotes/notes/implement-docker-healthchecks-for-mariadb-server-cd9d1a4ddaf432ee.yaml b/releasenotes/notes/implement-docker-healthchecks-for-mariadb-server-cd9d1a4ddaf432ee.yaml
new file mode 100644
index 0000000000..81572e17c8
--- /dev/null
+++ b/releasenotes/notes/implement-docker-healthchecks-for-mariadb-server-cd9d1a4ddaf432ee.yaml
@@ -0,0 +1,6 @@
+---
+features:
+  - |
+    Implements container healthchecks for mariadb-server service.
+    See `blueprint
+    <https://blueprints.launchpad.net/kolla-ansible/+spec/container-health-check>`__