---
- hosts: kube-master[0]

  tasks:

  - set_fact:
      bin_dir: "/usr/local/bin"

  - name: Create echoserver deployment
    shell: "{{bin_dir}}/kubectl create deployment source-ip-app --image=k8s.gcr.io/echoserver:1.4"

  - name: Waiting for echo server's pod running
    shell: "{{bin_dir}}/kubectl get pods --no-headers -l app=source-ip-app|grep Running | wc -l"
    register: echoserver_running_pod_result
    until: echoserver_running_pod_result.stdout|int == 1
    retries: 12
    delay: 5

  - name: Expose echoserver with NodePort service
    shell: "{{bin_dir}}/kubectl expose deployment source-ip-app --name=nodeport --port=80 --target-port=8080 --type=NodePort"

  - name: Get echoserver service's node port
    shell: "{{bin_dir}}/kubectl get svc nodeport -o jsonpath='{.spec.ports[0].nodePort}'"
    register: raw_node_port

  - set_fact:
      es_node_port: "{{ raw_node_port.stdout }}"

  - set_fact:
      node_nums: "{{ groups['k8s-cluster']|length }}"

  - debug:
      msg: "port: {{ es_node_port }}, node_nums: {{ node_nums }}"

  - name: Start to check nodeport service with Cluster type externalTrafficPolicy
    shell: "for node in $NODES;do curl --connect-timeout 1 -s $node:$NODEPORT;done | grep -i client_address|wc -l"
    register: etp_cluster_result
    environment:
      NODES: "{{ groups['k8s-cluster']|join(' ') }}"
      NODEPORT: "{{ es_node_port }}"

  - name: Check nodeport service with Cluster type externalTrafficPolicy
    assert:
      that: etp_cluster_result.stdout|int == node_nums|int
      msg: "the number of service with Cluster type externalTrafficPolicy that can be connected {{ etp_cluster_result.stdout|int }} must be equal to {{ node_nums }}"

  - name: Change service externalTrafficPolicy from Cluster to Local
    shell: "{{bin_dir}}/kubectl  patch svc nodeport -p '{\"spec\":{\"externalTrafficPolicy\":\"Local\"}}'"

  - name: Start to check nodeport service with Local type externalTrafficPolicy
    shell: "for node in $NODES;do curl --connect-timeout 1 -s $node:$NODEPORT;done | grep -i client_address|wc -l"
    register: etp_local_result
    environment:
      NODES: "{{ groups['k8s-cluster']|join(' ') }}"
      NODEPORT: "{{ es_node_port }}"

  - name: Check nodeport service with Local type externalTrafficPolicy
    assert:
      that: etp_local_result.stdout|int == 1
      msg: "the number of service with Local type externalTrafficPolicy that can be connected {{ etp_local_result.stdout|int }} must be equal to 1"
