---
- hosts: primary
  tasks:

    # Install the previous release of Kayobe, and use it to deploy a control
    # plane.

    - block:
        - name: Ensure kayobe is installed
          shell:
            cmd: dev/install.sh &> {{ logs_dir }}/ansible/install-pre-upgrade
            chdir: "{{ previous_kayobe_src_dir }}"
            executable: /bin/bash

        - name: Configure the firewall
          # We run kayobe commands to determine variable values. So this must
          # be run after install.
          shell:
            cmd: dev/configure-firewall.sh
            chdir: "{{ previous_kayobe_src_dir }}"
            executable: /bin/bash

        - name: Ensure overcloud is deployed
          shell:
            cmd: dev/overcloud-deploy.sh &> {{ logs_dir }}/ansible/overcloud-deploy-pre-upgrade
            chdir: "{{ previous_kayobe_src_dir }}"
            executable: /bin/bash

      environment:
        KAYOBE_CONFIG_SOURCE_PATH: "{{ previous_kayobe_config_src_dir }}"

    # Update the Kayobe configuration to the current release.

    - name: Ensure kolla config directory exists
      file:
        path: "{{ kayobe_config_src_dir }}/etc/kolla"
        state: directory

    - name: Copy across relevant kayobe-config files
      copy:
        src: "{{ previous_kayobe_config_src_dir }}/{{ item }}"
        dest: "{{ kayobe_config_src_dir }}/{{ item }}"
        remote_src: true
      with_items:
        - etc/kayobe/kolla/passwords.yml
        - etc/kolla/admin-openrc.sh
        - etc/kolla/public-openrc.sh
        - etc/kolla/clouds.yaml

    # NOTE(mgoddard): Use the name zz-overrides.yml to ensure this takes
    # precedence over the standard config files.
    - name: Ensure kayobe-config override config file exists
      template:
        src: overrides.yml.j2
        dest: "{{ kayobe_config_src_dir }}/etc/kayobe/zz-overrides.yml"

    - name: Ensure kolla-ansible globals.yml override config file exists
      template:
        src: globals.yml.j2
        dest: "{{ kayobe_config_src_dir }}/etc/kayobe/kolla/globals.yml"

    # Perform a smoke test against the previous release.

    - block:
        - name: Ensure test Tenks cluster is deployed
          shell:
            # Pass absolute source directory, since otherwise the `chdir` will
            # cause this to fail.
            cmd: dev/tenks-deploy-compute.sh '{{ tenks_src_dir }}' &> {{ logs_dir }}/ansible/tenks-deploy
            chdir: "{{ kayobe_src_dir }}"
            executable: /bin/bash

        - name: Perform testing of the VMs in the overcloud prior to upgrade
          shell:
            cmd: dev/overcloud-test-vm.sh &> {{ logs_dir }}/ansible/overcloud-test-vm-pre-upgrade
            chdir: "{{ previous_kayobe_src_dir }}"
            executable: /bin/bash

        - name: Perform testing of the baremetal machines in the overcloud prior to upgrade
          shell:
            cmd: dev/overcloud-test-baremetal.sh &> {{ logs_dir }}/ansible/overcloud-test-bm-pre-upgrade
            chdir: "{{ previous_kayobe_src_dir }}"
            executable: /bin/bash

        # Upgrade Kayobe, and use it to perform an upgrade of the control plane.

        - name: Ensure RabbitMQ is upgraded prior to a SLURP upgrade
          shell:
            cmd: dev/rabbitmq-pre-slurp-upgrade.sh &> {{ logs_dir }}/ansible/rabbitmq-pre-slurp-upgrade
            chdir: "{{ previous_kayobe_src_dir }}"
            executable: /bin/bash
          when: is_slurp
          environment:
            KAYOBE_CONFIG_SOURCE_PATH: "{{ previous_kayobe_config_src_dir }}"
            KAYOBE_SOURCE_PATH: "{{ previous_kayobe_src_dir }}"

        - name: Ensure RabbitMQ queues are migrated
          shell:
            cmd: dev/rabbitmq-migrate-queues.sh ironic,keystone,neutron,nova &> {{ logs_dir }}/ansible/rabbitmq-migrate-queues
            chdir: "{{ previous_kayobe_src_dir }}"
            executable: /bin/bash
          when: is_slurp
          environment:
            KAYOBE_CONFIG_SOURCE_PATH: "{{ previous_kayobe_config_src_dir }}"
            KAYOBE_SOURCE_PATH: "{{ previous_kayobe_src_dir }}"

        - name: Ensure overcloud is upgraded
          shell:
            cmd: "{{ kayobe_src_dir }}/dev/overcloud-upgrade.sh &> {{ logs_dir }}/ansible/overcloud-upgrade"
            executable: /bin/bash

        # Remove unused Docker images to avoid reaching full disk
        - name: Remove unused Docker images
          shell:
            cmd: "docker image prune --all --force"
          become: true

        # Perform a smoke test against the upgraded current release.

        - name: Perform testing of VMs in the upgraded overcloud
          shell:
            cmd: dev/overcloud-test-vm.sh &> {{ logs_dir }}/ansible/overcloud-test-vm-post-upgrade
            chdir: "{{ kayobe_src_dir }}"
            executable: /bin/bash

        - name: Perform testing of the baremetal machines in the upgraded overcloud
          shell:
            cmd: dev/overcloud-test-baremetal.sh &> {{ logs_dir }}/ansible/overcloud-test-bm-post-upgrade
            chdir: "{{ kayobe_src_dir }}"
            executable: /bin/bash

      environment:
        KAYOBE_CONFIG_SOURCE_PATH: "{{ kayobe_config_src_dir }}"
        KAYOBE_SOURCE_PATH: "{{ kayobe_src_dir }}"
        IS_SLURP: "{{ is_slurp }}"
