---
- block:
    - set_fact:
        template_namespace: template-test

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

    - name: Check if k8s_service does not inherit parameter
      kubernetes.core.k8s_service:
        template: "pod_template_one.j2"
        state: present
      ignore_errors: yes
      register: r

    - name: Check for expected failures in last tasks
      assert:
        that:
          - r.failed
          - "'is only supported parameter for' in r.msg"

    - name: Specify both definition and template
      kubernetes.core.k8s:
        state: present
        template: "pod_template_one.j2"
        definition:
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: apply-deploy
            namespace: "{{ template_namespace }}"
          spec:
            replicas: 1
            selector:
              matchLabels:
                app: "{{ k8s_pod_name }}"
      vars:
        k8s_pod_name: pod
        k8s_pod_namespace: "{{ template_namespace }}"
      register: r
      ignore_errors: yes

    - name: Check if definition and template are mutually exclusive
      assert:
        that:
          - r.failed
          - "'parameters are mutually exclusive' in r.msg"

    - name: Specify both src and template
      kubernetes.core.k8s:
        state: present
        src: "../templates/pod_template_one.j2"
        template: "pod_template_one.j2"
      vars:
        k8s_pod_name: pod
        k8s_pod_namespace: "{{ template_namespace }}"
      register: r
      ignore_errors: yes

    - name: Check if src and template are mutually exclusive
      assert:
        that:
          - r.failed
          - "'parameters are mutually exclusive' in r.msg"

    - name: Create pod using template (direct specification)
      kubernetes.core.k8s:
        template: "pod_template_one.j2"
        wait: yes
      vars:
        k8s_pod_name: pod-1
        k8s_pod_namespace: "{{ template_namespace }}"
      register: r

    - name: Assert that pod creation succeeded using template
      assert:
        that:
          - r is successful

    - name: Create pod using template with wrong parameter
      kubernetes.core.k8s:
        template:
          - default
        wait: yes
      vars:
        k8s_pod_name: pod-2
        k8s_pod_namespace: "{{ template_namespace }}"
      register: r
      ignore_errors: True

    - name: Assert that pod creation failed using template due to wrong parameter
      assert:
        that:
          - r is failed
          - "'Error while reading template file' in r.msg"

    - name: Create pod using template (path parameter)
      kubernetes.core.k8s:
        template:
          path: "pod_template_one.j2"
        wait: yes
      vars:
        k8s_pod_name: pod-3
        k8s_pod_namespace: "{{ template_namespace }}"
      register: r

    - name: Assert that pod creation succeeded using template
      assert:
        that:
          - r is successful

    - name: Create pod using template (different variable string)
      kubernetes.core.k8s:
        template:
          path: "pod_template_two.j2"
          variable_start_string: '[['
          variable_end_string: ']]'
        wait: yes
      vars:
        k8s_pod_name: pod-4
        k8s_pod_namespace: "[[ template_namespace ]]"
        ansible_python_interpreter: "[[ ansible_playbook_python ]]"
      register: r

    - name: Assert that pod creation succeeded using template
      assert:
        that:
          - r is successful

    - name: Create pods using multi-resource template
      kubernetes.core.k8s:
        template:
          path: "pod_template_three.j2"
        wait: yes
      vars:
        k8s_pod_name_one: pod-5
        k8s_pod_name_two: pod-6
        k8s_pod_namespace: "{{ template_namespace }}"
      register: r

    - name: Assert that pod creation succeeded using template
      assert:
        that:
          - r is successful

    - name: Remove Pod (Cleanup)
      k8s:
        api_version: v1
        kind: Pod
        name: "pod-{{ item }}"
        namespace: "{{ template_namespace }}"
        state: absent
        wait: yes
      ignore_errors: yes
      loop: "{{ range(1, 7) | list }}"

  always:
    - name: Remove namespace (Cleanup)
      k8s:
        kind: Namespace
        name: "{{ template_namespace }}"
        state: absent
