---
- block:
    - set_fact:
        scale_namespace: scale

    - name: Ensure namespace exists
      k8s:
        definition:
          apiVersion: v1
          kind: Namespace
          metadata:
            name: "{{ scale_namespace }}"

    - name: Add a deployment
      k8s:
        definition:
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: scale-deploy
            namespace: "{{ scale_namespace }}"
          spec:
            replicas: 1
            selector:
              matchLabels:
                app: "{{ k8s_pod_name }}"
            template: "{{ k8s_pod_template }}"
        wait: yes
        wait_timeout: 60
        apply: yes
      vars:
        k8s_pod_name: scale-deploy
        k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:v0.10.0-green
        k8s_pod_ports:
          - containerPort: 8080
            name: http
            protocol: TCP

    - name: Get pods in scale-deploy
      k8s_info:
        kind: Pod
        label_selectors:
          - app=scale-deploy
        namespace: "{{ scale_namespace }}"
        field_selectors:
          - status.phase=Running

    - name: Scale the deployment
      k8s_scale:
        api_version: apps/v1
        kind: Deployment
        name: scale-deploy
        namespace: "{{ scale_namespace }}"
        replicas: 0
        wait: yes
      register: scale_down
      diff: true

    - name: Get pods in scale-deploy
      k8s_info:
        kind: Pod
        label_selectors:
          - app=scale-deploy
        namespace: "{{ scale_namespace }}"
        field_selectors:
          - status.phase=Running
      register: scale_down_deploy_pods
      until: scale_down_deploy_pods.resources | length == 0
      retries: 6
      delay: 5

    - name: Ensure that scale down took effect
      assert:
        that:
          - scale_down is changed
          - '"duration" in scale_down'
          - scale_down.diff

    - name: Reapply the earlier deployment
      k8s:
        definition:
          api_version: apps/v1
          kind: Deployment
          metadata:
            name: scale-deploy
            namespace: "{{ scale_namespace }}"
          spec:
            replicas: 1
            selector:
              matchLabels:
                app: "{{ k8s_pod_name }}"
            template: "{{ k8s_pod_template }}"
        wait: yes
        wait_timeout: 60
        apply: yes
      vars:
        k8s_pod_name: scale-deploy
        k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:v0.10.0-green
        k8s_pod_ports:
          - containerPort: 8080
            name: http
            protocol: TCP
      register: reapply_after_scale

    - name: Get pods in scale-deploy
      k8s_info:
        kind: Pod
        label_selectors:
          - app=scale-deploy
        namespace: "{{ scale_namespace }}"
        field_selectors:
          - status.phase=Running
      register: scale_up_deploy_pods

    - name: Ensure that reapply after scale worked
      assert:
        that:
          - reapply_after_scale is changed
          - scale_up_deploy_pods.resources | length == 1

    - name: Scale the deployment up
      k8s_scale:
        api_version: apps/v1
        kind: Deployment
        name: scale-deploy
        namespace: "{{ scale_namespace }}"
        replicas: 2
        wait: yes
        wait_timeout: 60
      register: scale_up

    - name: Get pods in scale-deploy
      k8s_info:
        kind: Pod
        label_selectors:
          - app=scale-deploy
        field_selectors:
          - status.phase=Running
        namespace: "{{ scale_namespace }}"
      register: scale_up_further_deploy_pods

    - name: Ensure that scale up worked
      assert:
        that:
          - scale_up is changed
          - '"duration" in scale_up'
          - scale_up.diff is not defined
          - scale_up_further_deploy_pods.resources | length == 2

    - name: Don't scale the deployment up
      k8s_scale:
        api_version: apps/v1
        kind: Deployment
        name: scale-deploy
        namespace: "{{ scale_namespace }}"
        replicas: 2
        wait: yes
      register: scale_up_noop

    - name: Get pods in scale-deploy
      k8s_info:
        kind: Pod
        label_selectors:
          - app=scale-deploy
        field_selectors:
          - status.phase=Running
        namespace: "{{ scale_namespace }}"
      register: scale_up_noop_pods

    - name: Ensure that no-op scale up worked
      assert:
        that:
          - scale_up_noop is not changed
          - scale_up_noop.diff is not defined
          - scale_up_noop_pods.resources | length == 2
          - '"duration" in scale_up_noop'

    - name: Scale deployment down without wait
      k8s_scale:
        api_version: apps/v1
        kind: Deployment
        name: scale-deploy
        namespace: "{{ scale_namespace }}"
        replicas: 1
        wait: no
      register: scale_down_no_wait
      diff: true

    - name: Ensure that scale down succeeds
      k8s_info:
        kind: Pod
        label_selectors:
          - app=scale-deploy
        namespace: "{{ scale_namespace }}"
      register: scale_down_no_wait_pods
      retries: 6
      delay: 5
      until: scale_down_no_wait_pods.resources | length == 1

    - name: Ensure that scale down without wait worked
      assert:
        that:
          - scale_down_no_wait is changed
          - scale_down_no_wait.diff
          - scale_down_no_wait_pods.resources | length == 1

    # scale multiple resource using label selectors
    - name: create deployment
      kubernetes.core.k8s:
        namespace: "{{ scale_namespace }}"
        src: files/deployment.yaml

    - name: list deployment
      kubernetes.core.k8s_info:
        kind: Deployment
        namespace: "{{ scale_namespace }}"
        label_selectors:
          - app=nginx
      register: resource
    - assert:
        that:
          - resource.resources | list | length == 2

    - name: scale deployment using resource version
      kubernetes.core.k8s_scale:
        replicas: 2
        kind: Deployment
        namespace: "{{ scale_namespace }}"
        resource_version: 0
        label_selectors:
          - app=nginx
      register: scale_out

    - assert:
        that:
          - not scale_out.changed
          - scale_out.results | selectattr('warning', 'defined') | list | length == 2

    - name: scale deployment using current replicas (wrong value)
      kubernetes.core.k8s_scale:
        replicas: 2
        current_replicas: 4
        kind: Deployment
        namespace: "{{ scale_namespace }}"
        label_selectors:
          - app=nginx
      register: scale_out

    - assert:
        that:
          - not scale_out.changed
          - scale_out.results | selectattr('warning', 'defined') | list | length == 2

    - name: scale deployment using current replicas (right value)
      kubernetes.core.k8s_scale:
        replicas: 2
        current_replicas: 3
        kind: Deployment
        namespace: "{{ scale_namespace }}"
        label_selectors:
          - app=nginx
      register: scale_out

    - assert:
        that:
          - scale_out.changed
          - scale_out.results | map(attribute='result.status.replicas') | list | unique == [2]

  always:
    - name: Remove namespace
      k8s:
        kind: Namespace
        name: "{{ scale_namespace }}"
        state: absent
