---
- hosts: kube-node
  tasks:
    - name: Test tunl0 routes
      shell: "! /sbin/ip ro | grep '/26 via' | grep -v tunl0"
      when: (ipip|default(false) or cloud_provider is defined) and (kube_network_plugin == 'calico')

- hosts: k8s-cluster
  vars:
    agent_report_interval: 10
    netcheck_namespace: default
    netchecker_port: 31081

  tasks:
    - name: Force binaries directory for Container Linux by CoreOS
      set_fact:
        bin_dir: "/opt/bin"
      when: ansible_os_family in ["CoreOS", "Container Linux by CoreOS"]

    - set_fact:
        bin_dir: "/usr/local/bin"
      when: not ansible_os_family in ["CoreOS", "Container Linux by CoreOS"]

    - name: Wait for netchecker server
      shell: "{{ bin_dir }}/kubectl get pods --namespace {{netcheck_namespace}} | grep ^netchecker-server"
      delegate_to: "{{groups['kube-master'][0]}}"
      run_once: true
      register: ncs_pod
      until: ncs_pod.stdout.find('Running') != -1
      retries: 3
      delay: 10

    - name: Wait for netchecker agents
      shell: "{{ bin_dir }}/kubectl get pods --namespace {{netcheck_namespace}} | grep '^netchecker-agent-.*Running'"
      run_once: true
      delegate_to: "{{groups['kube-master'][0]}}"
      register: nca_pod
      until: "{{ nca_pod.stdout_lines|length }} >= {{ groups['kube-node']|intersect(play_hosts)|length * 2 }}"
      retries: 3
      delay: 10

    - name: Get netchecker agents
      uri: url=http://localhost:{{netchecker_port}}/api/v1/agents/ return_content=yes
      run_once: true
      delegate_to: "{{groups['kube-master'][0]}}"
      register: agents
      retries: 18
      delay: "{{ agent_report_interval }}"
      until: "{{ agents.content|length > 0 and
        agents.content[0] == '{' and
        agents.content|from_json|length >= groups['kube-node']|intersect(play_hosts)|length * 2 }}"
      failed_when: false
      no_log: true

    - debug: var=agents.content|from_json
      failed_when: not agents|success and not agents.content=='{}'
      run_once: true

    - name: Check netchecker status
      uri: url=http://localhost:{{netchecker_port}}/api/v1/connectivity_check status_code=200 return_content=yes
      delegate_to: "{{groups['kube-master'][0]}}"
      run_once: true
      register: result
      retries: 3
      delay: "{{ agent_report_interval }}"
      no_log: true
      failed_when: false
      when: not agents.content=='{}'

    - debug: var=result.content|from_json
      failed_when: not result|success
      run_once: true
      when: not agents.content=='{}'
      delegate_to: "{{groups['kube-master'][0]}}"

    - debug: msg="Cannot get reports from agents, consider as PASSING"
      run_once: true
      when: agents.content=='{}'
