From 9cac1137d02f9de87fd03b1b5d0e6f5a99a32419 Mon Sep 17 00:00:00 2001
From: Mark Goddard <mark@stackhpc.com>
Date: Wed, 26 Jun 2019 14:38:45 +0100
Subject: [PATCH] Add upgrade-bifrost command

This performs the same as a deploy-bifrost, but first stops the
bifrost services and container if they are running.

This can help where a docker stop may lead to an ungraceful shutdown,
possibly due to running multiple services in one container.

Change-Id: I131ab3c0e850a1d7f5c814ab65385e3a03dfcc74
Implements: blueprint bifrost-upgrade
Closes-Bug: #1834332
---
 ansible/roles/bifrost/tasks/stop.yml    | 37 +++++++++++++++++++++----
 ansible/roles/bifrost/tasks/upgrade.yml |  5 ++--
 tools/kolla-ansible                     |  7 +++++
 3 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/ansible/roles/bifrost/tasks/stop.yml b/ansible/roles/bifrost/tasks/stop.yml
index 9a54ab6fc8..02c8f7583a 100644
--- a/ansible/roles/bifrost/tasks/stop.yml
+++ b/ansible/roles/bifrost/tasks/stop.yml
@@ -1,10 +1,35 @@
 ---
-- name: Stopping bifrost_deploy container
-  become: true
-  kolla_docker:
-    action: "stop_container"
-    common_options: "{{ docker_common_options }}"
-    name: "bifrost_deploy"
+- block:
+    - name: Check if bifrost_deploy container is running
+      become: true
+      kolla_container_facts:
+        name:
+          - bifrost_deploy
+      register: container_facts
+
+    - block:
+        # Ensure that all services are stopped gracefully, and in a sensible
+        # order.
+        - name: Stop services gracefully
+          become: true
+          command: docker exec bifrost_deploy systemctl stop {{ item }}.service
+          with_items:
+            - ironic-api
+            - ironic-conductor
+            - ironic-inspector
+            - mariadb
+            - rabbitmq-server
+            - nginx
+
+        - name: Stopping bifrost_deploy container
+          become: true
+          kolla_docker:
+            action: "stop_container"
+            common_options: "{{ docker_common_options }}"
+            name: "bifrost_deploy"
+
+      when: "'bifrost_deploy' in container_facts"
+
   when:
     - inventory_hostname in groups['bifrost']
     - "'bifrost_deploy' not in skip_stop_containers"
diff --git a/ansible/roles/bifrost/tasks/upgrade.yml b/ansible/roles/bifrost/tasks/upgrade.yml
index fae82a1da6..a65ad9bc09 100644
--- a/ansible/roles/bifrost/tasks/upgrade.yml
+++ b/ansible/roles/bifrost/tasks/upgrade.yml
@@ -1,4 +1,5 @@
 ---
-- include_tasks: config.yml
+# Stop the container prior to redeploying it.
+- include_tasks: stop.yml
 
-- include_tasks: start.yml
+- include_tasks: deploy.yml
diff --git a/tools/kolla-ansible b/tools/kolla-ansible
index c07ce13c5e..4ff3d42000 100755
--- a/tools/kolla-ansible
+++ b/tools/kolla-ansible
@@ -70,6 +70,7 @@ Commands:
     stop                Stop Kolla containers
     certificates        Generate self-signed certificate for TLS *For Development Only*
     upgrade             Upgrades existing OpenStack Environment
+    upgrade-bifrost     Upgrades an existing bifrost container
     genconfig           Generate configuration files for enabled OpenStack services
 EOF
 }
@@ -106,6 +107,7 @@ reconfigure
 stop
 certificates
 upgrade
+upgrade-bifrost
 genconfig
 EOF
 }
@@ -324,6 +326,11 @@ EOF
         ACTION="Upgrading OpenStack Environment"
         EXTRA_OPTS="$EXTRA_OPTS -e kolla_action=upgrade -e kolla_serial=${ANSIBLE_SERIAL}"
         ;;
+(upgrade-bifrost)
+        ACTION="Upgrading Bifrost"
+        PLAYBOOK="${BASEDIR}/ansible/bifrost.yml"
+        EXTRA_OPTS="$EXTRA_OPTS -e kolla_action=upgrade"
+        ;;
 (reconfigure)
         ACTION="Reconfigure OpenStack service"
         EXTRA_OPTS="$EXTRA_OPTS -e kolla_action=reconfigure -e kolla_serial=${ANSIBLE_SERIAL}"