---
- name: setup instance to be absent
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    state: expunged
  register: instance
- name: verify instance to be absent
  assert:
    that:
    - instance is successful

- name: test create instance in check mode
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    template: "{{ test_cs_instance_template }}"
    service_offering: "{{ test_cs_instance_offering_1 }}"
    affinity_group: "{{ cs_resource_prefix }}-ag"
    security_group: "{{ cs_resource_prefix }}-sg"
    ssh_key: "{{ cs_resource_prefix }}-sshkey"
    user_data: |
        #cloud-config
        package_upgrade: true
        packages:
          - tmux
    tags: []
  register: instance
  check_mode: true
- name: verify create instance in check mode
  assert:
    that:
    - instance is successful
    - instance is changed

- name: test create instance
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    template: "{{ test_cs_instance_template }}"
    service_offering: "{{ test_cs_instance_offering_1 }}"
    affinity_group: "{{ cs_resource_prefix }}-ag"
    security_group: "{{ cs_resource_prefix }}-sg"
    ssh_key: "{{ cs_resource_prefix }}-sshkey"
    user_data: |
        #cloud-config
        package_upgrade: true
        packages:
          - tmux
    tags: []
  register: instance
- name: verify create instance
  assert:
    that:
    - instance is successful
    - instance is changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_1 }}"
    - instance.state == "Running"
    - instance.ssh_key == "{{ cs_resource_prefix }}-sshkey"
    - not instance.tags

- name: test create instance idempotence
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    template: "{{ test_cs_instance_template }}"
    service_offering: "{{ test_cs_instance_offering_1 }}"
    affinity_group: "{{ cs_resource_prefix }}-ag"
    security_group: "{{ cs_resource_prefix }}-sg"
    ssh_key: "{{ cs_resource_prefix }}-sshkey"
    user_data: |
        #cloud-config
        package_upgrade: true
        packages:
          - tmux
    tags: []
  register: instance
- name: verify create instance idempotence
  assert:
    that:
    - instance is successful
    - instance is not changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_1 }}"
    - instance.state == "Running"
    - instance.ssh_key == "{{ cs_resource_prefix }}-sshkey"
    - not instance.tags

- name: gather host facts of running instance
  cs_instance_facts:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"

- name: test running instance not updated in check mode
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    service_offering: "{{ test_cs_instance_offering_2 }}"
  register: instance
  check_mode: true
- name: verify running instance not updated in check mode
  assert:
    that:
    - instance is successful
    - instance is not changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_1 }}"
    - instance.state == "Running"

- name: test running instance not updated
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    service_offering: "{{ test_cs_instance_offering_2 }}"
  register: instance
- name: verify running instance not updated
  assert:
    that:
    - instance is successful
    - instance is not changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_1 }}"
    - instance.state == "Running"

- name: test stopping instance in check mode
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    state: stopped
  register: instance
  check_mode: true
- name: verify stopping instance in check mode
  assert:
    that:
    - instance is successful
    - instance is changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_1 }}"
    - instance.state == "Running"

- name: test stopping instance
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    state: stopped
  register: instance
- name: verify stopping instance
  assert:
    that:
    - instance is successful
    - instance is changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_1 }}"
    - instance.state == "Stopped"

- name: test stopping instance idempotence
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    state: stopped
  register: instance
- name: verify stopping instance idempotence
  assert:
    that:
    - instance is successful
    - instance is not changed
    - instance.state == "Stopped"

- name: test updating stopped instance in check mode
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    display_name: "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    service_offering: "{{ test_cs_instance_offering_2 }}"
  register: instance
  check_mode: true
- name: verify updating stopped instance in check mode
  assert:
    that:
    - instance is successful
    - instance is changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_1 }}"
    - instance.state == "Stopped"

- name: test updating stopped instance
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    display_name: "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    service_offering: "{{ test_cs_instance_offering_2 }}"
  register: instance
- name: verify updating stopped instance
  assert:
    that:
    - instance is successful
    - instance is changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_2 }}"
    - instance.state == "Stopped"

- name: test updating stopped instance idempotence
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    display_name: "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    service_offering: "{{ test_cs_instance_offering_2 }}"
  register: instance
- name: verify updating stopped instance idempotence
  assert:
    that:
    - instance is successful
    - instance is not changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_2 }}"
    - instance.state == "Stopped"

- name: setup zone facts
  cs_zone_facts:
    name: "{{ cs_common_zone_basic }}"

- name: setup find the host name
  shell: cs listHosts type=routing zoneid="{{ cloudstack_zone.id }}"
  args:
    chdir: "{{ playbook_dir }}"
  register: host

- name: host convert from json
  set_fact:
    host_json: "{{ host.stdout | from_json }}"

- name: select a host on which the instance is not running on
  set_fact:
    host: "{{ host_json | json_query('host[?name!=`' + cloudstack_instance.host + '`] | [0]') }}"

- name: test starting instance in check mode
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    host: "{{ host.name }}"
    state: started
  register: instance
  check_mode: true
- name: verify starting instance in check mode
  assert:
    that:
    - instance is successful
    - instance is changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_2 }}"
    - instance.host is not defined
    - instance.state == "Stopped"

- name: test starting instance
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    host: "{{ host.name }}"
    state: started
  register: instance
- name: verify starting instance
  assert:
    that:
    - instance is successful
    - instance is changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_2 }}"
    # TODO: this fails randomly, cloudstack issue?
    #- instance.host == "{{ host.name }}"
    - instance.state == "Running"

- name: test starting instance idempotence
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    host: "{{ host.name }}"
    state: started
  register: instance
- name: verify starting instance idempotence
  assert:
    that:
    - instance is successful
    - instance is not changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_2 }}"
    # TODO: this fails randomly, cloudstack issue?
    #- instance.host == "{{ host.name }}"
    - instance.state == "Running"

- name: select a host on which the instance is not running on
  set_fact:
    host: "{{ host_json | json_query('host[?name!=`' + instance.host + '`] | [0]') }}"

- name: test force update running instance in check mode
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    service_offering: "{{ test_cs_instance_offering_1 }}"
    host: "{{ host.name }}"
    force: true
  register: instance
  check_mode: true
- name: verify force update running instance in check mode
  assert:
    that:
    - instance is successful
    - instance is changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_2 }}"
    - instance.host != "{{ host.name }}"
    - instance.state == "Running"

- name: test force update running instance
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    service_offering: "{{ test_cs_instance_offering_1 }}"
    host: "{{ host.name }}"
    force: true
  register: instance
- name: verify force update running instance
  assert:
    that:
    - instance is successful
    - instance is changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_1 }}"
    - instance.host == "{{ host.name }}"
    - instance.state == "Running"

- name: test force update running instance idempotence
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    service_offering: "{{ test_cs_instance_offering_1 }}"
    host: "{{ host.name }}"
    force: true
  register: instance
- name: verify force update running instance idempotence
  assert:
    that:
    - instance is successful
    - instance is not changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_1 }}"
    - instance.host == "{{ host.name }}"
    - instance.state == "Running"

- name: test restore instance in check mode
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    template: "{{ test_cs_instance_template }}"
    state: restored
  register: instance
  check_mode: true
- name: verify restore instance in check mode
  assert:
    that:
    - instance is successful
    - instance is changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_1 }}"

- name: test restore instance
  cs_instance:
    name: "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    template: "{{ test_cs_instance_template }}"
    state: restored
  register: instance
- name: verify restore instance
  assert:
    that:
    - instance is successful
    - instance is changed
    - instance.name == "{{ cs_resource_prefix }}-vm-{{ instance_number }}"
    - instance.display_name == "{{ cs_resource_prefix }}-display-{{ instance_number }}"
    - instance.service_offering == "{{ test_cs_instance_offering_1 }}"
