- name: Install Nova controller
  hosts: controller
  become: true
  roles:
    - role: init_database
      vars:
        database: nova
        user: nova
    - role: init_database
      vars:
        database: nova_api
        user: nova
    - role: init_database
      vars:
        database: nova_cell0
        user: nova
    - role: create_identity_user
      vars:
        user: nova
    - role: create_identity_service
      vars:
        service: nova
        type: compute
        description: "OpenStack Compute"
        endpoint: http://{{ hostvars['controller']['ansible_default_ipv4']['address'] }}:8774/v2.1
  tasks:
    - name: Install nova package
      yum:
        name:
          - openstack-nova-api
          - openstack-nova-conductor
          - openstack-nova-novncproxy
          - openstack-nova-scheduler

- name: Install Nova compute
  hosts: compute
  become: true
  tasks:
    - name: Install nova-compute package
      yum:
        name:
          - openstack-nova-compute
          - dmidecode

    - name: Install edk2 for aarch64
      yum:
        name:
          - edk2-aarch64
      when: ansible_architecture == "aarch64"

    - name: Check node architecture
      shell: |
        mkdir -p /etc/qemu/firmware
        cat << EOF > /etc/qemu/firmware/edk2-aarch64.json
        {
            "description": "UEFI firmware for ARM64 virtual machines",
            "interface-types": [
                "uefi"
            ],
            "mapping": {
                "device": "flash",
                "executable": {
                    "filename": "/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw",
                    "format": "raw"
                },
                "nvram-template": {
                    "filename": "/usr/share/edk2/aarch64/vars-template-pflash.raw",
                    "format": "raw"
                }
            },
            "targets": [
                {
                    "architecture": "aarch64",
                    "machines": [
                        "virt-*"
                    ]
                }
            ],
            "features": [
            ],
            "tags": [
            ]
        }
        EOF
      when: ansible_architecture == "aarch64" and "{{ openstack_release }}" != "train"

- name: Config mutual trust for nova
  hosts: compute
  become: true
  tasks:
    - name: Change login shell for nova
      shell: |
        usermod -s /bin/bash nova
    - name: Create directory
      file:
        path: /var/lib/nova/.ssh
        owner: nova
        group: nova
        mode: 0755
        state: directory
    - name: Copy file for hosts
      copy:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
        mode: "{{ item.mode }}"
        owner: nova
        group: nova
        remote_src: yes
      with_items:
        - { src: '/root/.ssh/id_rsa',dest: '/var/lib/nova/.ssh/id_rsa', mode: '0600'}
        - { src: '/root/.ssh/authorized_keys',dest: '/var/lib/nova/.ssh/authorized_keys', mode: '0644'}
    - name: Initialize config file
      shell: |
        cat << EOF > /var/lib/nova/.ssh/config
        Host *
        StrictHostKeyChecking no
        EOF

- name: Init config file
  hosts: all
  become: true
  tasks:
    - name: Initialize config file
      shell: |
        cat << EOF > /etc/nova/nova.conf
        [DEFAULT]
        osapi_compute_workers = {{ nova_api_workers }}
        metadata_workers = {{ nova_metadata_api_workers }}
        enabled_apis = osapi_compute,metadata
        transport_url = rabbit://openstack:{{ rabbitmq_password }}@{{ hostvars['controller']['ansible_default_ipv4']['address'] }}:5672/
        my_ip = {{ ansible_default_ipv4['address'] }}
        use_neutron = true
        firewall_driver = nova.virt.firewall.NoopFirewallDriver
        compute_driver=libvirt.LibvirtDriver
        instances_path = /var/lib/nova/instances/
        lock_path = /var/lib/nova/tmp
        log_dir = /var/log/nova
        state_path = /var/lib/nova

        [api_database]
        connection = mysql+pymysql://nova:{{ mysql_project_password }}@{{ hostvars['controller']['ansible_default_ipv4']['address'] }}/nova_api

        [database]
        connection = mysql+pymysql://nova:{{ mysql_project_password }}@{{ hostvars['controller']['ansible_default_ipv4']['address'] }}/nova

        [api]
        auth_strategy = keystone

        [keystone_authtoken]
        www_authenticate_uri = http://{{ hostvars['controller']['ansible_default_ipv4']['address'] }}:5000/
        auth_url = http://{{ hostvars['controller']['ansible_default_ipv4']['address'] }}:5000/
        memcached_servers = {{ hostvars['controller']['ansible_default_ipv4']['address'] }}:11211
        auth_type = password
        project_domain_name = Default
        user_domain_name = Default
        project_name = service
        username = nova
        password = {{ project_identity_password }}

        [vnc]
        enabled = true
        server_listen = {{ ansible_default_ipv4['address'] }}
        server_proxyclient_address = {{ ansible_default_ipv4['address'] }}
        novncproxy_base_url = http://{{ hostvars['controller']['ansible_default_ipv4']['address'] }}:6080/vnc_auto.html

        [glance]
        api_servers = http://{{ hostvars['controller']['ansible_default_ipv4']['address'] }}:9292

        [oslo_concurrency]
        lock_path = /var/lib/nova/tmp

        [placement]
        region_name = RegionOne
        project_domain_name = Default
        project_name = service
        auth_type = password
        user_domain_name = Default
        auth_url = http://{{ hostvars['controller']['ansible_default_ipv4']['address'] }}:5000/v3
        username = placement
        password = {{ project_identity_password }}

        [neutron]
        auth_url = http://{{ hostvars['controller']['ansible_default_ipv4']['address'] }}:5000
        auth_type = password
        project_domain_name = default
        user_domain_name = default
        region_name = RegionOne
        project_name = service
        username = neutron
        password = {{ project_identity_password }}
        service_metadata_proxy = true
        metadata_proxy_shared_secret = secret

        [conductor]
        workers = {{ nova_conductor_workers }}

        [scheduler]
        workers = {{ nova_scheduler_workers }}
        EOF

# TODO: add kvm support
- name: Update Nova compute
  hosts: compute
  become: true
  tasks:
    - name: Update config file
      shell: |
        cat << EOF >> /etc/nova/nova.conf
        
        [libvirt]
        virt_type = qemu
        num_pcie_ports = 28
        EOF
        if [[ `uname -m` == 'aarch64' ]];then
        cat << EOF >> /etc/nova/nova.conf
        cpu_mode = custom
        cpu_model = cortex-a72
        EOF

          mkdir -p /usr/share/AAVMF
          chown nova:nova /usr/share/AAVMF

          ln -s /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw /usr/share/AAVMF/AAVMF_CODE.fd
          ln -s /usr/share/edk2/aarch64/vars-template-pflash.raw /usr/share/AAVMF/AAVMF_VARS.fd

        cat << EOF >> /etc/libvirt/qemu.conf
        nvram = ["/usr/share/AAVMF/AAVMF_CODE.fd:/usr/share/AAVMF/AAVMF_VARS.fd",
                 "/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw:/usr/share/edk2/aarch64/vars-template-pflash.raw"]
        EOF
        fi

- name: Complete Nova controller install
  hosts: controller
  become: true
  tasks:
    - name: Sync database
      shell: |
        su -s /bin/sh -c "nova-manage api_db sync" nova
        su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
        su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
        su -s /bin/sh -c "nova-manage db sync" nova
        su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova

    - name: Start openstack-nova-api service
      systemd:
        name: openstack-nova-api
        state: started
        enabled: True

    - name: Start openstack-nova-scheduler service
      systemd:
        name: openstack-nova-scheduler
        state: started
        enabled: True

    - name: Start openstack-nova-conductor service
      systemd:
        name: openstack-nova-conductor
        state: started
        enabled: True

    - name: Start openstack-nova-novncproxy service
      systemd:
        name: openstack-nova-novncproxy
        state: started
        enabled: True

- name: Complete Nova compute install
  hosts: compute
  become: true
  tasks:
    - name: Start libvirtd service
      systemd:
        name: libvirtd
        state: started
        enabled: True

    - name: Start openstack-nova-compute service
      systemd:
        name: openstack-nova-compute
        state: started
        enabled: True

- name: Discover compute node
  hosts: controller
  become: true
  tasks:
    - name: Discover compute node
      shell: su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova