---
- hosts: all
  tasks:
    - name: Copy all files to undercloud
      copy:
        src: "{{ apex_temp_dir }}/{{ item }}"
        dest: "/home/stack/{{ item }}"
        owner: stack
        group: stack
        mode: 0644
      with_items:
        - network-environment.yaml
        - instackenv.json
        - overcloud-full.qcow2
        - deploy_command
        - virtual-environment.yaml
        - baremetal-environment.yaml
        - "{{ apex_env_file }}"
    - name: Copy network data to undercloud
      copy:
        src: "{{ apex_temp_dir }}/network_data.yaml"
        dest: "/home/stack/network_data.yaml"
        owner: stack
        group: stack
        mode: 0644
      when: os_version != 'ocata'
    - copy:
        src: "{{ apex_temp_dir }}/storage-environment.yaml"
        dest: /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml
        owner: root
        group: root
        mode: 0664
    - systemd:
        name: openstack-swift-proxy
        state: restarted
        enabled: yes
      become: yes
    - name: Remove Ceph OSD from ceph storage role
      lineinfile:
        path: /usr/share/openstack-tripleo-heat-templates/roles_data.yaml
        line: '    - OS::TripleO::Services::CephOSD'
        owner: root
        group: root
        state: absent
      become: yes
    - name: Insert Ceph OSDs into Compute role
      lineinfile:
        path: /usr/share/openstack-tripleo-heat-templates/roles_data.yaml
        insertbefore:  '^\s*-\sOS::TripleO::Services::NovaCompute$'
        line: '    - OS::TripleO::Services::CephOSD'
        owner: root
        group: root
      become: yes
    - name: Upload glance images
      shell: "{{ stackrc }} && openstack overcloud image upload"
      become: yes
      become_user: stack
    - name: Import inventory (baremetal)
      shell: "{{ stackrc }} && openstack overcloud node import instackenv.json"
      when: not virtual
    - name: Introspect inventory (baremetal)
      shell: "{{ stackrc }} && openstack overcloud node introspect --all-manageable --provide"
      when:
        - not virtual
        - not aarch64
    - name: Import inventory (virtual)
      shell: "{{ stackrc }} && openstack overcloud node import --provide instackenv.json"
      when: virtual
    - name: Set flavors
      shell: '{{ stackrc }} && openstack flavor set --property "cpu_arch"="{{ ansible_architecture }}" {{ item }}'
      with_items:
        - baremetal
        - control
        - compute
    - name: Configure DNS server for ctlplane network
      shell: "{{ stackrc }} && openstack subnet set ctlplane-subnet {{ dns_server_args }}"
    - block:
        - name: Execute Overcloud Deployment
          shell: "{{ stackrc }} && bash deploy_command"
      rescue:
        - name: Show overcloud failures
          shell: "{{ stackrc }} && openstack stack failures list overcloud --long"
    - name: Show Keystone output
      shell: "{{ overcloudrc }} && {{ item }}"
      when: debug
      with_items:
        - openstack endpoint list
        - openstack service list
    - name: Get overcloud nodes and IPs
      shell: "{{ stackrc }} && openstack server list -f json"
      register: nova_list
    - name: Write nova list output to file
      local_action: copy content="{{ nova_list.stdout }}" dest="{{ apex_temp_dir }}/nova_output"
    - name: Fetch overcloudrc
      fetch:
        src: /home/stack/overcloudrc
        dest: "{{ apex_temp_dir }}/"
        flat: yes