---
- name: Ensure testing1 namespace exists
  k8s:
    api_version: v1
    kind: Namespace
    name: testing1

- block:
    - name: Create configmaps
      k8s:
        namespace: testing1
        definition:
          apiVersion: v1
          kind: ConfigMapList
          items: '{{ configmaps }}'

    - name: Get ConfigMaps
      k8s_info:
        api_version: v1
        kind: ConfigMap
        namespace: testing1
        label_selectors:
          - app=test
      register: cms

    - name: All three configmaps should exist
      assert:
        that: item.data.a is defined
      with_items: '{{ cms.resources }}'

    - name: Delete configmaps
      k8s:
        state: absent
        namespace: testing1
        definition:
          apiVersion: v1
          kind: ConfigMapList
          items: '{{ configmaps }}'

    - name: Get ConfigMaps
      k8s_info:
        api_version: v1
        kind: ConfigMap
        namespace: testing1
        label_selectors:
          - app=test
      register: cms

    - name: All three configmaps should not exist
      assert:
        that: not cms.resources
  vars:
    configmaps:
      - metadata:
          name: list-example-1
          labels:
            app: test
        data:
          a: first
      - metadata:
          name: list-example-2
          labels:
            app: test
        data:
          a: second
      - metadata:
          name: list-example-3
          labels:
            app: test
        data:
          a: third

- block:
    - name: Create list of arbitrary resources
      k8s:
        namespace: testing1
        definition:
          apiVersion: v1
          kind: List
          namespace: testing1
          items: '{{ resources }}'

    - name: Get the created resources
      k8s_info:
        api_version: '{{ item.apiVersion }}'
        kind: '{{ item.kind }}'
        namespace: testing1
        name: '{{ item.metadata.name }}'
      register: list_resources
      with_items: '{{ resources }}'

    - name: All resources should exist
      assert:
        that: ((list_resources.results | sum(attribute="resources", start=[])) | length) == (resources | length)

    - name: Delete list of arbitrary resources
      k8s:
        state: absent
        namespace: testing1
        definition:
          apiVersion: v1
          kind: List
          namespace: testing1
          items: '{{ resources }}'

    - name: Get the resources
      k8s_info:
        api_version: '{{ item.apiVersion }}'
        kind: '{{ item.kind }}'
        namespace: testing1
        name: '{{ item.metadata.name }}'
      register: list_resources
      with_items: '{{ resources }}'

    - name: The resources should not exist
      assert:
        that: not ((list_resources.results | sum(attribute="resources", start=[])) | length)
  vars:
    resources:
      - apiVersion: v1
        kind: ConfigMap
        metadata:
          name: list-example-4
        data:
          key: value
      - apiVersion: v1
        kind: Service
        metadata:
          name: list-example-svc
          labels:
            app: test
        spec:
          selector:
            app: test
          ports:
            - protocol: TCP
              targetPort: 8000
              name: port-8000-tcp
              port: 8000
