---
# Copyright 2017, Rackspace US, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in witing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

- name: Gather facts
  hosts: vm_hosts
  gather_facts: "{{ gather_facts | default(true) }}"
  pre_tasks:
    - name: Gather variables for each operating system
      include_vars: "{{ item }}"
      with_first_found:
        - "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}-{{ ansible_distribution_version | lower }}.yml"
        - "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}-{{ ansible_distribution_major_version | lower }}.yml"
        - "{{ playbook_dir }}/vars/{{ ansible_os_family | lower }}-{{ ansible_distribution_major_version | lower }}.yml"
        - "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}.yml"
        - "{{ playbook_dir }}/vars/{{ ansible_os_family | lower }}.yml"
      tags:
        - always

  tasks:
    - name: Create VM LV
      lvol:
        vg: vg01
        lv: "{{ hostvars[item]['server_hostname'] }}"
        size: "{{ default_vm_storage }}"
      when:
        - hostvars[item]['server_vm'] | default(false) | bool
      with_items: "{{ groups['pxe_servers'] }}"

    - name: Create the VM template
      template:
        src: kvm/kvm-vm.xml
        dest: "/etc/libvirt/qemu/{{ hostvars[item]['server_hostname'] }}.xml"
        mode: 0644
        owner: root
        group: root
      when:
        - hostvars[item]['server_vm'] | default(false) | bool
      with_items: "{{ groups['pxe_servers'] }}"

    - name: Define the VM
      command: "virsh define /etc/libvirt/qemu/{{ hostvars[item]['server_hostname'] }}.xml"
      failed_when: false
      when:
        - hostvars[item]['server_vm'] | default(false) | bool
      with_items: "{{ groups['pxe_servers'] }}"

    - name: Create the VM
      command: "virsh create /etc/libvirt/qemu/{{ hostvars[item]['server_hostname'] }}.xml"
      failed_when: false
      when:
        - hostvars[item]['server_vm'] | default(false) | bool
      with_items: "{{ groups['pxe_servers'] }}"

    - name: Start the VM
      command: "virsh start {{ hostvars[item]['server_hostname'] }}"
      failed_when: false
      when:
        - hostvars[item]['server_vm'] | default(false) | bool
      with_items: "{{ groups['pxe_servers'] }}"

  environment: "{{ deployment_environment_variables | default({}) }}"

  tags:
    - deploy-vms


- name: Create vm_servers group
  hosts: localhost
  gather_facts: false
  tasks:
    - name: VM Servers group
      add_host:
        name: "{{ hostvars[item]['server_vm_fixed_addr'] }}"
        groups: vm_servers
      when:
        - hostvars[item]['server_vm'] | default(false) | bool
      with_items: "{{ groups['pxe_servers'] }}"

  environment: "{{ deployment_environment_variables | default({}) }}"

  tags:
    - deploy-vms


- name: Wait for deploy host
  hosts: vm_servers
  gather_facts: false
  pre_tasks:
    - name: Wait for connectivity 1
      local_action:
        module: wait_for
        host: "{{ ansible_host }}"
        connect_timeout: 5
        port: 22
        sleep: 10
        timeout: 1200
        state: started
        search_regex: OpenSSH
  tasks:
    - name: copy host keys
      copy:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
        mode: "0600"
      with_items:
        - src: /root/.ssh/id_rsa
          dest: /root/.ssh/id_rsa
        - src: /root/.ssh/id_rsa.pub
          dest: /root/.ssh/id_rsa.pub

  environment: "{{ deployment_environment_variables | default({}) }}"

  tags:
    - deploy-vms


- name: Setup cinder host volume
  hosts: cinder_hosts:swift_hosts
  gather_facts: false
  tasks:
    - name: un-mount deleteme mount
      mount:
        name: "/var/lib/lxc"
        state: unmounted

    - name: remote deleteme mount
      mount:
        name: "/var/lib/lxc"
        state: absent

    - name: Remove deleteme lv
      lvol:
        vg: vg00
        lv: lxc00
        force: true
        state: absent

  environment: "{{ deployment_environment_variables | default({}) }}"

  tags:
    - deploy-vms


- name: Setup cinder host volume
  hosts: cinder_hosts
  gather_facts: false
  tasks:
    - name: Create cinder-volumes lv
      lvol:
        vg: vg00
        lv: cinder-volumes00
        size: "100%FREE"
        shrink: false

    - name: Create data cinder-volumes group
      lvg:
        vg: cinder-volumes
        pvs: "/dev/vg00/cinder-volumes00"

  environment: "{{ deployment_environment_variables | default({}) }}"

  tags:
    - deploy-vms


- name: Setup swift host volume
  hosts: swift_hosts
  gather_facts: false
  tasks:
    - name: Remove deleteme lv
      lvol:
        vg: vg00
        lv: "{{ item }}"
        size: 4G
      with_items:
        - disk1
        - disk2
        - disk3

    - name: Format swift drives
      filesystem:
        fstype: xfs
        dev: "/dev/vg00/{{ item }}"
      with_items:
        - disk1
        - disk2
        - disk3

    - name: Create drive directories
      file:
        path: "/srv/{{ item }}"
        state: directory
        owner: "root"
        group: "root"
        mode: "0755"
      with_items:
        - disk1
        - disk2
        - disk3

    - name: Mount swift drives
      mount:
        name: "/srv/{{ item }}"
        src: "/dev/mapper/vg00-{{ item }}"
        fstype: xfs
        state: mounted
      with_items:
        - disk1
        - disk2
        - disk3

  environment: "{{ deployment_environment_variables | default({}) }}"

  tags:
    - deploy-vms