---
- block:
    - name: Create a namespace
      k8s:
        name: "{{ playbook_namespace }}"
        kind: Namespace

    - copy:
        src: files
        dest: "{{ remote_tmp_dir }}"

    - name: incredibly simple ConfigMap
      k8s:
        definition:
          apiVersion: v1
          kind: ConfigMap
          metadata:
            name: hello
            namespace: "{{ playbook_namespace }}"
        validate:
          fail_on_error: yes
      register: k8s_with_validate

    - name: assert that k8s_with_validate succeeds
      assert:
        that:
          - k8s_with_validate is successful

    - name: extra property does not fail without strict
      k8s:
        src: "{{ remote_tmp_dir }}/files/kuard-extra-property.yml"
        namespace: "{{ playbook_namespace }}"
        validate:
          fail_on_error: yes
          strict: no

    - name: extra property fails with strict
      k8s:
        src: "{{ remote_tmp_dir }}/files/kuard-extra-property.yml"
        namespace: "{{ playbook_namespace }}"
        validate:
          fail_on_error: yes
          strict: yes
      ignore_errors: yes
      register: extra_property

    - name: check that extra property fails with strict
      assert:
        that:
          - extra_property is failed

    - name: invalid type fails at validation stage
      k8s:
        src: "{{ remote_tmp_dir }}/files/kuard-invalid-type.yml"
        namespace: "{{ playbook_namespace }}"
        validate:
          fail_on_error: yes
          strict: no
      ignore_errors: yes
      register: invalid_type

    - name: check that invalid type fails
      assert:
        that:
          - invalid_type is failed

    - name: invalid type fails with warnings when fail_on_error is False
      k8s:
        src: "{{ remote_tmp_dir }}/files/kuard-invalid-type.yml"
        namespace: "{{ playbook_namespace }}"
        validate:
          fail_on_error: no
          strict: no
      ignore_errors: yes
      register: invalid_type_no_fail

    - name: check that invalid type fails
      assert:
        that:
          - invalid_type_no_fail is failed

    - name: setup custom resource definition
      k8s:
        src: "{{ remote_tmp_dir }}/files/setup-crd.yml"

    - name: wait a few seconds
      pause:
        seconds: 5

    - name: add custom resource definition
      k8s:
        src: "{{ remote_tmp_dir }}/files/crd-resource.yml"
        namespace: "{{ playbook_namespace }}"
        validate:
          fail_on_error: yes
          strict: yes
      register: unknown_kind

    - name: check that unknown kind warns
      assert:
        that:
          - unknown_kind is successful
          - "'warnings' in unknown_kind"

  always:
    - name: remove custom resource
      k8s:
        definition: "{{ lookup('file', role_path + '/files/crd-resource.yml') }}"
        namespace: "{{ playbook_namespace }}"
        state: absent
      ignore_errors: yes

    - name: remove custom resource definitions
      k8s:
        definition: "{{ lookup('file', role_path + '/files/setup-crd.yml') }}"
        state: absent

    - name: Delete namespace
      k8s:
        state: absent
        definition:
          - kind: Namespace
            apiVersion: v1
            metadata:
              name: "{{ playbook_namespace }}"
      ignore_errors: yes
