---
# Get the needed information about the current deployment
- hosts: masters[0]
  tasks:
  - name: Get number of app nodes
    shell: oc get nodes -l autoscaling=app --no-headers=true | wc -l
    register: oc_old_num_nodes
  - name: Get names of app nodes
    shell: oc get nodes -l autoscaling=app --no-headers=true | cut -f1 -d " "
    register: oc_old_app_nodes

- hosts: localhost
  tasks:
  # Since both number and names of app nodes are to be removed
  # localhost variables for these values need to be set
  - name: Store old number and names of app nodes locally (if there is an existing deployment)
    when: '"masters" in groups'
    register: set_fact_result
    set_fact:
      oc_old_num_nodes: "{{ hostvars[groups['masters'][0]]['oc_old_num_nodes'].stdout }}"
      oc_old_app_nodes: "{{ hostvars[groups['masters'][0]]['oc_old_app_nodes'].stdout_lines }}"

  - name: Set default values for old app nodes (if there is no existing deployment)
    when: 'set_fact_result | skipped'
    set_fact:
      oc_old_num_nodes: 0
      oc_old_app_nodes: []

  # Set how many nodes are to be added (1 by default)
  - name: Set how many nodes are to be added
    set_fact:
      increment_by: 1
  - name: Check that the number corresponds to scaling up (not down)
    assert:
      that: 'increment_by | int >= 1'
      msg: >
        FAIL: The value of increment_by must be at least 1
        (but it is {{ increment_by | int }}).
  - name: Update openstack_num_nodes variable
    set_fact:
      openstack_num_nodes: "{{ oc_old_num_nodes | int + increment_by | int }}"

# Run provision.yaml with higher number of nodes to create a new app-node VM
- include: provision.yaml

# Run config.yml to perform openshift installation
# Path to openshift-ansible can be customised:
# - the value of openshift_ansible_dir has to be an absolute path
# - the path cannot contain the '/' symbol at the end

# Creating a new deployment by the full installation
- include: "{{ openshift_ansible_dir }}/playbooks/byo/config.yml"
  vars:
    openshift_ansible_dir: ../../../../openshift-ansible
  when: 'not groups["new_nodes"] | list'

# Scaling up existing deployment
- include: "{{ openshift_ansible_dir }}/playbooks/byo/openshift-node/scaleup.yml"
  vars:
    openshift_ansible_dir: ../../../../openshift-ansible
  when: 'groups["new_nodes"] | list'

# Post-verification: Verify new number of nodes
- hosts: masters[0]
  tasks:
  - name: Get number of nodes
    shell: oc get nodes -l autoscaling=app --no-headers=true | wc -l
    register: oc_new_num_nodes
  - name: Check that the actual result matches the defined value
    assert:
      that: 'oc_new_num_nodes.stdout | int == (hostvars["localhost"]["oc_old_num_nodes"] | int + hostvars["localhost"]["increment_by"] | int)'
      msg: >
        FAIL: Number of application nodes has not been increased accordingly
        (it should be {{ hostvars["localhost"]["oc_old_num_nodes"] | int + hostvars["localhost"]["increment_by"] | int }}
        but it is {{ oc_new_num_nodes.stdout | int }}).
