---

- 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_facts:
      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_facts:
      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_facts:
      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_facts:
      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