---
- block:
    - name: Create a namespace
      k8s:
        name: crd
        kind: Namespace

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

    - name: Pause 5 seconds to avoid race condition
      pause:
        seconds: 5

    - name: Create custom resource definition
      k8s:
        definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}"
        namespace: crd
        apply: "{{ create_crd_with_apply | default(omit) }}"
      register: create_crd

    - name: Patch custom resource definition
      k8s:
        definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}"
        namespace: crd
      register: recreate_crd
      ignore_errors: yes

    - name: Assert that recreating crd is as expected
      assert:
        that:
          - recreate_crd is not failed

    - block:
        - name: Recreate custom resource definition with merge_type
          k8s:
            definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}"
            merge_type: merge
            namespace: crd
          register: recreate_crd_with_merge

        - name: Recreate custom resource definition with merge_type list
          k8s:
            definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}"
            merge_type:
              - strategic-merge
              - merge
            namespace: crd
          register: recreate_crd_with_merge_list
      when: recreate_crd is successful


    - name: Remove crd
      k8s:
        definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}"
        namespace: crd
        state: absent

  always:
    - name: Remove crd namespace
      k8s:
        kind: Namespace
        name: crd
        state: absent
      ignore_errors: yes
