From 09c569b4bea488c3ab1f0a07292283e7b3fcdc60 Mon Sep 17 00:00:00 2001 From: Leonardo Rossetti Date: Aug 18 2022 16:47:53 +0000 Subject: test refactor --- diff --git a/operator/.gitignore b/operator/.gitignore index 62fd3e3..b9d0ccd 100644 --- a/operator/.gitignore +++ b/operator/.gitignore @@ -12,3 +12,6 @@ bin *.swp *.swo *~ + +molecule/_logs/* +!molecule/_logs/.keepme diff --git a/operator/molecule/_backends/cluster/minikube/converge.yml b/operator/molecule/_backends/cluster/minikube/converge.yml new file mode 100644 index 0000000..88cb64d --- /dev/null +++ b/operator/molecule/_backends/cluster/minikube/converge.yml @@ -0,0 +1,3 @@ +--- +- debug: + msg: "Skip me" diff --git a/operator/molecule/_backends/cluster/minikube/create.yml b/operator/molecule/_backends/cluster/minikube/create.yml new file mode 100644 index 0000000..f60795e --- /dev/null +++ b/operator/molecule/_backends/cluster/minikube/create.yml @@ -0,0 +1,9 @@ +--- +- name: Start minikube + command: | + minikube start \ + --driver={{ minikube_driver }} + +- name: Sleep for 10 seconds and continue with play + wait_for: + timeout: 10 diff --git a/operator/molecule/_backends/cluster/minikube/destroy.yml b/operator/molecule/_backends/cluster/minikube/destroy.yml new file mode 100644 index 0000000..2d0dc84 --- /dev/null +++ b/operator/molecule/_backends/cluster/minikube/destroy.yml @@ -0,0 +1,8 @@ +--- +- name: Destroy minikube + command: minikube delete + + # - name: Unset pull policy + # command: '{{ kustomize }} edit remove patch pull_policy/{{ operator_pull_policy }}.yaml' + # args: + # chdir: '{{ config_dir }}/testing' diff --git a/operator/molecule/_backends/cluster/minikube/molecule.yml b/operator/molecule/_backends/cluster/minikube/molecule.yml new file mode 100644 index 0000000..2741334 --- /dev/null +++ b/operator/molecule/_backends/cluster/minikube/molecule.yml @@ -0,0 +1,56 @@ +--- +dependency: + name: galaxy + options: + requirements-file: requirements.yml +driver: + name: delegated +lint: | + set -e + yamllint -d "{extends: relaxed, rules: {line-length: {max: 120}}}" . +platforms: + - name: cluster + groups: + - k8s +provisioner: + name: ansible + playbooks: + verify: ../default/verify.yml + prepare: ../default/prepare.yml + lint: | + set -e + ansible-lint + inventory: + group_vars: + all: + namespace: ${TEST_OPERATOR_NAMESPACE:-osdk-test} + operator_image: buildsys.apps.fedoraproject.org/koji-operator:testing + operator_pull_policy: "Never" + host_vars: + localhost: + ansible_python_interpreter: '{{ ansible_playbook_python }}' + config_dir: ${MOLECULE_PROJECT_DIRECTORY}/config + samples_dir: ${MOLECULE_PROJECT_DIRECTORY}/config/samples + components_dir: ${MOLECULE_PROJECT_DIRECTORY}/../components + project_dir: ${MOLECULE_PROJECT_DIRECTORY} + operator_pull_policy: "Never" + kustomize: ${KUSTOMIZE_PATH:-kustomize} + minikube_driver: ${MINIKUBE_DRIVER:-docker} + minikube_skip: ${MINIKUBE_SKIP:-N} +scenario: + name: minikube + test_sequence: + # - lint + - destroy + - dependency + - syntax + - create + - prepare + - converge + - verify + - destroy +verifier: + name: ansible + lint: | + set -e + ansible-lint diff --git a/operator/molecule/_backends/cluster/minikube/prepare.yml b/operator/molecule/_backends/cluster/minikube/prepare.yml new file mode 100644 index 0000000..a576020 --- /dev/null +++ b/operator/molecule/_backends/cluster/minikube/prepare.yml @@ -0,0 +1,31 @@ +--- +- block: + - name: Enable kubevirt + command: minikube addons enable kubevirt + + - name: Wait for kubevirt namespace + k8s_info: + api_version: v1 + kind: Namespace + name: kubevirt + register: out + retries: 180 + delay: 3 + until: + - "out.resources | length == 1" + + - k8s_info: + api_version: kubevirt.io/v1 + kind: KubeVirt + namespace: kubevirt + name: kubevirt + register: out + retries: 300 + delay: 3 + until: + - "'resources' in out" + - "out.resources | length > 0" + - "'status' in out.resources[0]" + - "out.resources[0].status.phase == 'Deployed'" + when: + - "minikube_driver == 'kvm2'" diff --git a/operator/molecule/_backends/cluster/minikube/requirements.yml b/operator/molecule/_backends/cluster/minikube/requirements.yml new file mode 100644 index 0000000..3f626ed --- /dev/null +++ b/operator/molecule/_backends/cluster/minikube/requirements.yml @@ -0,0 +1,6 @@ +--- +collections: + - name: community.kubernetes + version: "1.2.1" + - name: operator_sdk.util + version: "0.2.0" diff --git a/operator/molecule/_backends/container/minikube/build.yml b/operator/molecule/_backends/container/minikube/build.yml new file mode 100644 index 0000000..5ffa26e --- /dev/null +++ b/operator/molecule/_backends/container/minikube/build.yml @@ -0,0 +1,13 @@ +- name: Show image name + debug: + msg: "Building {{ image_name }}:{{ image_tag }} container image" + +- name: Build container image + command: | + minikube + image build + -t {{ image_name }}:{{ image_tag }} \ + . + args: + chdir: "{{ image_dir }}" + changed_when: false diff --git a/operator/molecule/_backends/container/minikube/preflight.yml b/operator/molecule/_backends/container/minikube/preflight.yml new file mode 100644 index 0000000..25f1ab2 --- /dev/null +++ b/operator/molecule/_backends/container/minikube/preflight.yml @@ -0,0 +1,3 @@ +- name: Skip tasks + debug: + msg: "Skip me" diff --git a/operator/molecule/_backends/container/minikube/remove.yml b/operator/molecule/_backends/container/minikube/remove.yml new file mode 100644 index 0000000..25f1ab2 --- /dev/null +++ b/operator/molecule/_backends/container/minikube/remove.yml @@ -0,0 +1,3 @@ +- name: Skip tasks + debug: + msg: "Skip me" diff --git a/operator/molecule/_backends/container/podman/build.yml b/operator/molecule/_backends/container/podman/build.yml new file mode 100644 index 0000000..8648962 --- /dev/null +++ b/operator/molecule/_backends/container/podman/build.yml @@ -0,0 +1,12 @@ +- name: Show image name + debug: + msg: "Building {{ podman_image_name }}:{{ podman_image_tag }} container image" + +- name: Build container image + containers.podman.podman_image: + build: + format: "{{ podman_image_format | default('docker') }}" + path: "{{ podman_image_path }}" + name: "{{ podman_image_name }}" + tag: "{{ podman_image_tag }}" + push: "{{ podman_image_push | default(false) }}" diff --git a/operator/molecule/_backends/container/podman/preflight.yml b/operator/molecule/_backends/container/podman/preflight.yml new file mode 100644 index 0000000..b1411d1 --- /dev/null +++ b/operator/molecule/_backends/container/podman/preflight.yml @@ -0,0 +1,13 @@ +- name: Check if podman is available + ansible.builtin.stat: + path: "{{ podman_bin }}" + register: podman_bin_res + +- name: Assert podman bin + ansible.builtin.fail: + msg: "Unable to find {{ podman_bin }}" + when: podman_bin_res.stat.exists == false + +- name: Run podman info + ansible.builtin.shell: "{{ podman_bin }} info" + changed_when: false diff --git a/operator/molecule/_backends/container/podman/remove.yml b/operator/molecule/_backends/container/podman/remove.yml new file mode 100644 index 0000000..239e39e --- /dev/null +++ b/operator/molecule/_backends/container/podman/remove.yml @@ -0,0 +1,10 @@ +- name: Show image name + debug: + msg: "Deleting {{ podman_image_name }}:{{ podman_image_tag }} container image" + +- name: Delete container image + containers.podman.podman_image: + name: "{{ podman_image_name }}" + tag: "{{ podman_image_tag }}" + push: "{{ podman_image_push | default(false) }}" + state: absent diff --git a/operator/molecule/_components/koji-builder/container/create.yml b/operator/molecule/_components/koji-builder/container/create.yml new file mode 100644 index 0000000..6f94581 --- /dev/null +++ b/operator/molecule/_components/koji-builder/container/create.yml @@ -0,0 +1,30 @@ +- name: Create buildsys.apps.fedoraproject.org/v1alpha1.KojiBuilder + k8s: + state: present + namespace: '{{ namespace }}' + definition: + apiVersion: buildsys.apps.fedoraproject.org/v1alpha1 + kind: KojiBuilder + metadata: + name: sample + annotations: + buildsys.apps.fedoraproject.org/hub: sample/osdk-test + spec: + image: quay.io/fedora/koji-builder:f34 + type: repo + max_jobs: 5 + archs: + - x86_64 + channels: + - createrepo + ssl_verify: false + volume: true + wait: yes + wait_timeout: 300 + wait_condition: + type: Running + reason: Successful + status: "True" + vars: + cr_file: 'buildsys_v1alpha1_kojibuilder.yaml' + register: k8s_cr_kojibuilder_container diff --git a/operator/molecule/_components/koji-builder/container/verify.yml b/operator/molecule/_components/koji-builder/container/verify.yml new file mode 100644 index 0000000..0035a6f --- /dev/null +++ b/operator/molecule/_components/koji-builder/container/verify.yml @@ -0,0 +1,53 @@ +- block: + - name: 'TEST: kojibuilder.configmap' + k8s_info: + api_version: v1 + kind: ConfigMap + namespace: "{{ namespace }}" + name: kojid-sample-conf + register: koji_configmap + - assert: + that: + - koji_configmap.resources|length == 1 + - koji_configmap.resources[0].metadata.labels['app'] == 'koji-builder' + - "'kojid.conf' in koji_configmap.resources[0].data" + +- block: + - name: 'TEST: kojibuilder.secret.client-cert' + k8s_info: + api_version: v1 + kind: Secret + namespace: "{{ namespace }}" + # name: koji-builder-client-cert + name: kojid-sample-client-cert + register: kojibuilder_client_secrets + - assert: + that: + - kojibuilder_client_secrets.resources|length == 1 + - kojibuilder_client_secrets.resources[0].metadata.labels['app'] == 'koji-builder' + - "'client.pem' in kojibuilder_client_secrets.resources[0].data" + +- block: + - name: 'TEST: kojibuilder.pod deployment' + k8s_info: + api_version: v1 + kind: Pod + namespace: "{{ namespace }}" + label_selectors: + - app = koji-builder + register: pods + - assert: + that: + - pods.resources|length == 1 + - pods.resources[0].metadata.labels['app'] == 'koji-builder' + +- block: + - name: 'TEST: kojibuilder.deletion' + k8s: + state: absent + api_version: buildsys.apps.fedoraproject.org/v1alpha1 + kind: KojiBuilder + namespace: "{{ namespace }}" + name: sample + wait: yes + wait_timeout: 300 diff --git a/operator/molecule/_components/koji-builder/kubevirt/create.yml b/operator/molecule/_components/koji-builder/kubevirt/create.yml new file mode 100644 index 0000000..10ed373 --- /dev/null +++ b/operator/molecule/_components/koji-builder/kubevirt/create.yml @@ -0,0 +1,29 @@ +- name: Create buildsys.apps.fedoraproject.org/v1alpha1.KojiBuilder (kubevirt) + k8s: + state: present + namespace: "{{ namespace }}" + definition: + apiVersion: buildsys.apps.fedoraproject.org/v1alpha1 + kind: KojiBuilder + metadata: + name: sample-virt + annotations: + buildsys.apps.fedoraproject.org/hub: sample/osdk-test + spec: + image: quay.io/fedora-kube-sig/koji-builder-kubevirt:raw + type: kubevirt + max_jobs: 5 + archs: + - x86_64 + channels: + - default + ssl_verify: false + volume: false + running: true + wait: yes + wait_timeout: 1800 + wait_condition: + type: Running + reason: Successful + status: "True" + register: k8s_cr_kojibuilder_kubevirt diff --git a/operator/molecule/_components/koji-builder/kubevirt/verify.yml b/operator/molecule/_components/koji-builder/kubevirt/verify.yml new file mode 100644 index 0000000..d468640 --- /dev/null +++ b/operator/molecule/_components/koji-builder/kubevirt/verify.yml @@ -0,0 +1,27 @@ +- block: + - name: 'TEST: kojibuilder.configmap' + k8s_info: + api_version: v1 + kind: ConfigMap + namespace: "{{ namespace }}" + name: kojid-sample-virt-conf + register: koji_configmap + - assert: + that: + - koji_configmap.resources|length == 1 + - koji_configmap.resources[0].metadata.labels['app'] == 'koji-builder' + - "'kojid.conf' in koji_configmap.resources[0].data" + +- block: + - name: 'TEST: kojibuilder.secret.client-cert' + k8s_info: + api_version: v1 + kind: Secret + namespace: "{{ namespace }}" + name: kojid-sample-virt-client-cert + register: kojibuilder_client_secrets + - assert: + that: + - kojibuilder_client_secrets.resources|length == 1 + - kojibuilder_client_secrets.resources[0].metadata.labels['app'] == 'koji-builder' + - "'client.pem' in kojibuilder_client_secrets.resources[0].data" diff --git a/operator/molecule/_components/koji-hub/create.yml b/operator/molecule/_components/koji-hub/create.yml new file mode 100644 index 0000000..dddf639 --- /dev/null +++ b/operator/molecule/_components/koji-hub/create.yml @@ -0,0 +1,13 @@ +- name: Create buildsys.apps.fedoraproject.org/v1alpha1.KojiHub + k8s: + state: present + namespace: '{{ namespace }}' + definition: "{{ lookup('template', '/'.join([samples_dir, cr_file])) | from_yaml }}" + wait: yes + wait_timeout: 300 + wait_condition: + type: Running + reason: Successful + status: "True" + vars: + cr_file: 'buildsys_v1alpha1_kojihub.yaml' diff --git a/operator/molecule/_components/koji-hub/verify.yml b/operator/molecule/_components/koji-hub/verify.yml new file mode 100644 index 0000000..10f03f4 --- /dev/null +++ b/operator/molecule/_components/koji-hub/verify.yml @@ -0,0 +1,86 @@ +--- +- block: + - name: 'TEST: koji_hub.configmap' + k8s_info: + api_version: v1 + kind: ConfigMap + namespace: "{{ namespace }}" + name: koji-hub-sample + register: koji_configmap + - assert: + that: + - koji_configmap.resources|length == 1 + - koji_configmap.resources[0].metadata.labels['app'] == 'koji-hub' + - "'httpd.conf' in koji_configmap.resources[0].data" + - "'hub.conf' in koji_configmap.resources[0].data" + - "'kojiweb.conf' in koji_configmap.resources[0].data" + +- block: + - name: 'TEST: kojihub.secret.koji-hub-ca-cert' + k8s_info: + api_version: v1 + kind: Secret + namespace: "{{ namespace }}" + name: koji-hub-sample-ca + register: kojihub_secrets + - assert: + that: + - kojihub_secrets.resources|length == 1 + - kojihub_secrets.resources[0].metadata.labels['app'] == 'koji-hub' + - "'cert' in kojihub_secrets.resources[0].data" + +- block: + - name: 'TEST: kojihub.secret.koji-hub-service-cert' + k8s_info: + api_version: v1 + kind: Secret + namespace: "{{ namespace }}" + name: koji-hub-sample-httpd-certs + register: kojihub_secrets + - assert: + that: + - kojihub_secrets.resources|length == 1 + - kojihub_secrets.resources[0].metadata.labels['app'] == 'koji-hub' + - "'tls.crt' in kojihub_secrets.resources[0].data" + - "'tls.key' in kojihub_secrets.resources[0].data" + +- block: + - name: 'TEST: kojihub.secret.koji-hub-web-client-cert' + k8s_info: + api_version: v1 + kind: Secret + namespace: "{{ namespace }}" + name: koji-hub-sample-client-web + register: kojihub_secrets + - assert: + that: + - kojihub_secrets.resources|length == 1 + - "'client.pem' in kojihub_secrets.resources[0].data" + +- block: + - name: 'TEST: kojihub.pvcs' + k8s_info: + api_version: v1 + kind: PersistentVolumeClaim + namespace: "{{ namespace }}" + name: koji-hub-sample + register: kojihub_pvcs + - assert: + that: + - kojihub_pvcs.resources|length == 1 + - kojihub_pvcs.resources[0].metadata.labels['app'] == 'koji-hub' + - "'ReadWriteMany' in kojihub_pvcs.resources[0].spec.accessModes" + - "kojihub_pvcs.resources[0].spec.resources.requests.storage == '10Gi'" + +- block: + - name: 'TEST: kojihub.service' + k8s_info: + api_version: v1 + kind: Service + namespace: "{{ namespace }}" + name: koji-hub-sample + register: kojihub_svcs + - assert: + that: + - kojihub_svcs.resources|length == 1 + - kojihub_svcs.resources[0].metadata.labels['app'] == 'koji-hub' diff --git a/operator/molecule/_components/kojira/create.yml b/operator/molecule/_components/kojira/create.yml new file mode 100644 index 0000000..b6af53c --- /dev/null +++ b/operator/molecule/_components/kojira/create.yml @@ -0,0 +1,25 @@ +--- +- name: Create buildsys.apps.fedoraproject.org/v1alpha1.Kojira + kubernetes.core.k8s: + state: present + namespace: '{{ namespace }}' + definition: + apiVersion: buildsys.apps.fedoraproject.org/v1alpha1 + kind: Kojira + metadata: + name: sample + annotations: + buildsys.apps.fedoraproject.org/hub: sample/osdk-test + spec: + replicas: 1 + image: quay.io/fedora/kojira:f34 + src: 'no' + max_repo_tasks: 15 + repo_tasks_limit: 15 + wait: yes + wait_timeout: 300 + wait_condition: + type: Running + reason: Successful + status: "True" + register: k8s_cr_kojira diff --git a/operator/molecule/_components/kojira/verify.yml b/operator/molecule/_components/kojira/verify.yml new file mode 100644 index 0000000..d0c8fd8 --- /dev/null +++ b/operator/molecule/_components/kojira/verify.yml @@ -0,0 +1,51 @@ +- block: + - name: 'TEST: kojira.configmap' + k8s_info: + api_version: v1 + kind: ConfigMap + namespace: "{{ namespace }}" + name: kojira-sample-conf + register: kojira_configmap + - assert: + that: + - kojira_configmap.resources|length == 1 + - "kojira_configmap.resources[0].metadata.labels['app'] == 'kojira'" + - "'kojira.conf' in kojira_configmap.resources[0].data" + +- block: + - name: 'TEST: kojira.secret.client-cert' + k8s_info: + api_version: v1 + kind: Secret + namespace: "{{ namespace }}" + name: kojira-sample-client-cert + register: kojira_client_secrets + - assert: + that: + - kojira_client_secrets.resources|length == 1 + - kojira_client_secrets.resources[0].metadata.labels['app'] == 'kojira' + - "'client.pem' in kojira_client_secrets.resources[0].data" + +- block: + - name: 'TEST: kojira.deployment' + k8s_info: + api_version: v1 + kind: Deployment + namespace: "{{ namespace }}" + name: kojira + register: kojira_deployments + - k8s_info: + api_version: v1 + kind: Pod + namespace: "{{ namespace }}" + label_selectors: + - app = kojira + register: kojira_pods + - assert: + that: + - kojira_deployments.resources|length == 1 + - kojira_deployments.resources[0].metadata.labels['app'] == 'kojira' + - assert: + that: + - kojira_pods.resources|length == 1 + - kojira_pods.resources[0].metadata.labels['app'] == 'kojira' diff --git a/operator/molecule/_logs/.keepme b/operator/molecule/_logs/.keepme new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/operator/molecule/_logs/.keepme diff --git a/operator/molecule/cluster/converge.yml b/operator/molecule/cluster/converge.yml deleted file mode 100644 index 1652a6a..0000000 --- a/operator/molecule/cluster/converge.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -- name: Converge - hosts: localhost - connection: local - gather_facts: no - - tasks: - - name: Build operator image - docker_image: - build: - path: '{{ project_dir }}' - pull: no - name: '{{ operator_image }}' - tag: latest - push: no - source: build - force_source: yes - - - name: Load image into minikube - command: minikube image load {{ operator_image }} --overwrite=true - - - -- import_playbook: ../default/converge.yml diff --git a/operator/molecule/cluster/create.yml b/operator/molecule/cluster/create.yml deleted file mode 100644 index 1f88a28..0000000 --- a/operator/molecule/cluster/create.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -- name: Create - hosts: localhost - connection: local - gather_facts: false - tasks: - - name: Ensure namespace exists - k8s: - api_version: v1 - kind: Namespace - name: "{{ namespace }}" - state: present - wait: true - diff --git a/operator/molecule/cluster/destroy.yml b/operator/molecule/cluster/destroy.yml deleted file mode 100644 index 8ee5b41..0000000 --- a/operator/molecule/cluster/destroy.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- -- name: Destroy - hosts: localhost - connection: local - gather_facts: false - collections: - - community.kubernetes - - tasks: - - name: Destroy namespace - k8s: - api_version: v1 - kind: Namespace - name: "{{ namespace }}" - state: absent - wait: true - - - name: Unset pull policy - command: '{{ kustomize }} edit remove patch pull_policy/{{ operator_pull_policy }}.yaml' - args: - chdir: '{{ config_dir }}/testing' diff --git a/operator/molecule/cluster/molecule.yml b/operator/molecule/cluster/molecule.yml deleted file mode 100644 index 08dacd7..0000000 --- a/operator/molecule/cluster/molecule.yml +++ /dev/null @@ -1,54 +0,0 @@ ---- -dependency: - name: galaxy - options: - requirements-file: requirements.yml -driver: - name: delegated -lint: | - set -e - yamllint -d "{extends: relaxed, rules: {line-length: {max: 120}}}" . -platforms: - - name: cluster - groups: - - k8s -provisioner: - name: ansible - playbooks: - verify: ../default/verify.yml - prepare: ../default/prepare.yml - lint: | - set -e - ansible-lint - inventory: - group_vars: - all: - namespace: ${TEST_OPERATOR_NAMESPACE:-osdk-test} - operator_image: buildsys.apps.fedoraproject.org/koji-operator:testing - operator_pull_policy: "Never" - host_vars: - localhost: - ansible_python_interpreter: '{{ ansible_playbook_python }}' - config_dir: ${MOLECULE_PROJECT_DIRECTORY}/config - samples_dir: ${MOLECULE_PROJECT_DIRECTORY}/config/samples - components_dir: ${MOLECULE_PROJECT_DIRECTORY}/../components - project_dir: ${MOLECULE_PROJECT_DIRECTORY} - operator_pull_policy: "Never" - kustomize: ${KUSTOMIZE_PATH:-kustomize} -scenario: - name: cluster - test_sequence: - # - lint - - destroy - - dependency - - syntax - - create - - prepare - - converge - - verify - - destroy -verifier: - name: ansible - lint: | - set -e - ansible-lint diff --git a/operator/molecule/cluster/prepare.yml b/operator/molecule/cluster/prepare.yml deleted file mode 100644 index c8e3c05..0000000 --- a/operator/molecule/cluster/prepare.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -- name: Create - hosts: localhost - connection: local - gather_facts: false - tasks: - - name: Enable kubevirt - command: minikube addons enable kubevirt - when: "minikube_driver == 'kvm2'" - - - name: Wait for kubevirt readiness - k8s_info: - api_version: kubevirt.io/v1 - kind: KubeVirt - namespace: kubevirt - name: kubevirt - wait: true - wait_condition: - type: Available - reason: AllComponentsReady - status: "True" - diff --git a/operator/molecule/cluster/requirements.yml b/operator/molecule/cluster/requirements.yml deleted file mode 100644 index 3f626ed..0000000 --- a/operator/molecule/cluster/requirements.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -collections: - - name: community.kubernetes - version: "1.2.1" - - name: operator_sdk.util - version: "0.2.0" diff --git a/operator/molecule/default/INSTALL.rst b/operator/molecule/default/INSTALL.rst new file mode 100644 index 0000000..1b38d09 --- /dev/null +++ b/operator/molecule/default/INSTALL.rst @@ -0,0 +1,15 @@ +*********************************** +Delegated driver installation guide +*********************************** + +Requirements +============ + +This driver is delegated to the developer. Up to the developer to implement +requirements. + +Install +======= + +This driver is delegated to the developer. Up to the developer to implement +requirements. diff --git a/operator/molecule/default/_kustomize.yml b/operator/molecule/default/_kustomize.yml new file mode 100644 index 0000000..a74870c --- /dev/null +++ b/operator/molecule/default/_kustomize.yml @@ -0,0 +1,16 @@ +- name: Build kustomize testing overlay from folder + command: | + kustomize \ + build \ + --load-restrictor LoadRestrictionsNone . + args: + chdir: "{{ kustomize_source_dir }}" + register: resources + changed_when: false + +- name: Create parsed k8s resources + k8s: + definition: "{{ item }}" + state: present + wait: true + loop: "{{ resources.stdout | from_yaml_all | list }}" diff --git a/operator/molecule/default/_log.yml b/operator/molecule/default/_log.yml new file mode 100644 index 0000000..f1705e3 --- /dev/null +++ b/operator/molecule/default/_log.yml @@ -0,0 +1,24 @@ +- name: Look for pod + kubernetes.core.k8s_info: + api_version: v1 + kind: Pod + namespace: "{{ namespace }}" + label_selectors: "{{ log_labels }}" + register: k8s_info_out + +- block: + - name: Retrieve pod log + kubernetes.core.k8s_log: + api_version: "v1" + kind: "Pod" + namespace: "{{ namespace }}" + container: "{{ log_container }}" + label_selectors: "{{ log_labels }}" + ignore_errors: true + register: out + + - name: Write pod log + ansible.builtin.copy: + content: "{{ out.log }}" + dest: "{{ logs_dir }}/{{ log_fname }}" + when: k8s_info_out.resources | length > 0 diff --git a/operator/molecule/default/cleanup.yml b/operator/molecule/default/cleanup.yml new file mode 100644 index 0000000..943121d --- /dev/null +++ b/operator/molecule/default/cleanup.yml @@ -0,0 +1,19 @@ + +- name: CleanUp + hosts: localhost + connection: local + gather_facts: false + tasks: + - include_tasks: "{{ backends_dir }}/container/{{ backend_container }}/remove.yml" + vars: + podman_image_name: "{{ operator_image_name }}" + podman_image_tag: "{{ operator_image_tag }}" + + - name: Unset pull policy + command: | + kustomize \ + edit remove patch \ + pull_policy/{{ operator_pull_policy }}.yaml + args: + chdir: "{{ config_dir }}/testing" + changed_when: false diff --git a/operator/molecule/default/converge.yml b/operator/molecule/default/converge.yml index eaf9e1e..3bdfefd 100644 --- a/operator/molecule/default/converge.yml +++ b/operator/molecule/default/converge.yml @@ -2,22 +2,56 @@ - name: Converge hosts: localhost connection: local - gather_facts: no - collections: - - community.kubernetes - - operator_sdk.util - tasks: - - name: Create Namespace - k8s: + - include_tasks: "{{ backends_dir }}/cluster/{{ backend_cluster }}/converge.yml" + + - name: Clean molecule/_logs folder + ansible.builtin.file: + state: absent + path: "{{ item }}" + with_fileglob: + - "{{ logs_dir }}/*.log" + - "{{ logs_dir }}/*.yaml" + run_once: true + + - name: Create operator namespace + kubernetes.core.k8s: + state: present + wait: true api_version: v1 kind: Namespace - name: '{{ namespace }}' - wait: true + name: "{{ namespace }}" + + - name: Set testing image + command: | + kustomize \ + edit set image \ + testing={{ operator_image_name }}:{{ operator_image_tag }} + args: + chdir: "{{ config_dir }}/testing" + changed_when: false + + - name: Set pull policy + command: | + kustomize edit add patch \ + --path pull_policy/{{ operator_pull_policy }}.yaml + args: + chdir: "{{ config_dir }}/testing" + changed_when: false + + - name: Create operator CRDs + include_tasks: _kustomize.yml + vars: + kustomize_source_dir: "{{ config_dir }}/crd" + + - name: Deploy operator + include_tasks: _kustomize.yml + vars: + kustomize_source_dir: "{{ config_dir }}/testing" - name: Deploy postgres k8s: - src: "{{ components_dir }}/psql/{{ item }}" + src: "{{ services_dir }}/psql/{{ item }}" namespace: "{{ namespace }}" state: present wait: true @@ -25,7 +59,3 @@ - 0-secret.yaml - 1-deployment.yaml - 2-service.yaml - - - import_tasks: kustomize.yml - vars: - state: present diff --git a/operator/molecule/default/create.yml b/operator/molecule/default/create.yml index 1eeaf92..55a5bce 100644 --- a/operator/molecule/default/create.yml +++ b/operator/molecule/default/create.yml @@ -3,4 +3,15 @@ hosts: localhost connection: local gather_facts: false - tasks: [] + tasks: + - name: Show Cluster Backend + debug: + msg: "Using {{ backend_cluster }} as cluster backend" + + - name: Show Container Backend + debug: + msg: "Using {{ backend_container }} as container backend" + + - include_tasks: "{{ backends_dir }}/container/{{ backend_container }}/preflight.yml" + + - include_tasks: "{{ backends_dir }}/cluster/{{ backend_cluster }}/create.yml" diff --git a/operator/molecule/default/destroy.yml b/operator/molecule/default/destroy.yml index 167c9b5..1b26fa6 100644 --- a/operator/molecule/default/destroy.yml +++ b/operator/molecule/default/destroy.yml @@ -3,22 +3,5 @@ hosts: localhost connection: local gather_facts: false - collections: - - community.kubernetes - tasks: - - import_tasks: kustomize.yml - vars: - state: absent - - - name: Destroy Namespace - k8s: - api_version: v1 - kind: Namespace - name: '{{ namespace }}' - state: absent - - - name: Unset pull policy - command: '{{ kustomize }} edit remove patch --path pull_policy/{{ operator_pull_policy }}.yaml' - args: - chdir: '{{ config_dir }}/testing' + - include_tasks: "{{ backends_dir }}/cluster/{{ backend_cluster }}/destroy.yml" diff --git a/operator/molecule/default/kustomize.yml b/operator/molecule/default/kustomize.yml deleted file mode 100644 index cbe8d1a..0000000 --- a/operator/molecule/default/kustomize.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- -- name: Build kustomize testing overlay - # load_restrictor must be set to none so we can load patch files from the default overlay - # updated to use "--load-restrictor LoadRestrictionsNone" for kustomize 4+ - command: '{{ kustomize }} build --load-restrictor LoadRestrictionsNone .' - args: - chdir: '{{ config_dir }}/testing' - register: resources - changed_when: false - -- name: Set resources to {{ state }} - debug: - var: item - loop: '{{resources.stdout_lines }}' - -- name: Set resources to {{ state }} - k8s: - definition: '{{ item }}' - state: '{{ state }}' - wait: yes - loop: '{{ resources.stdout | from_yaml_all | list }}' diff --git a/operator/molecule/default/molecule.yml b/operator/molecule/default/molecule.yml index df6f813..fb8db9c 100644 --- a/operator/molecule/default/molecule.yml +++ b/operator/molecule/default/molecule.yml @@ -3,9 +3,6 @@ dependency: name: galaxy driver: name: delegated - # lint: | - # set -e - # yamllint -d "{extends: relaxed, rules: {}" . platforms: - name: cluster groups: @@ -21,17 +18,30 @@ provisioner: namespace: ${TEST_OPERATOR_NAMESPACE:-osdk-test} host_vars: localhost: - ansible_python_interpreter: '{{ ansible_playbook_python }}' - config_dir: ${MOLECULE_PROJECT_DIRECTORY}/config - samples_dir: ${MOLECULE_PROJECT_DIRECTORY}/config/samples - components_dir: ${MOLECULE_PROJECT_DIRECTORY}/../components - operator_image: ${OPERATOR_IMAGE:-"quay.io/fedora/koji-operator:latest"} - operator_pull_policy: ${OPERATOR_PULL_POLICY:-"IfNotPresent"} - kustomize: ${KUSTOMIZE_PATH:-kustomize} - env: - K8S_AUTH_KUBECONFIG: ${KUBECONFIG:-"~/.kube/config"} + ansible_python_interpreter: "{{ ansible_playbook_python }}" + backends_dir: "${MOLECULE_PROJECT_DIRECTORY}/molecule/_backends" + backend_cluster: "${BACKEND_CLUSTER:-minikube}" + backend_container: "${BACKEND_CLUSTER:-minikube}" + config_dir: "${MOLECULE_PROJECT_DIRECTORY}/config" + project_dir: "${MOLECULE_PROJECT_DIRECTORY}" + services_dir: "${MOLECULE_PROJECT_DIRECTORY}/../components" + samples_dir: "${MOLECULE_PROJECT_DIRECTORY}/config/samples" + components_dir: "${MOLECULE_PROJECT_DIRECTORY}/molecule/_components" + logs_dir: "${MOLECULE_PROJECT_DIRECTORY}/molecule/_logs" + kubeconfig: "${KUBECONFIG:-'~/.kube/config'}" + operator_image_name: "${OPERATOR_IMAGE_NAME:-localhost.localdomain/koji-operator}" + operator_image_tag: "${OPERATOR_IMAGE_TAG:-testing}" + operator_pull_policy: "${OPERATOR_PULL_POLICY:-IfNotPresent}" + # _backends/container/podman vars + podman_bin: "${PODMAN_BIN:-/usr/bin/podman}" + # _backends/cluster/minikube vars + minikube_driver: "${MINIKUBE_DRIVER:-podman}" + # verify.yml vars + verify_kojihub: "${VERIFY_KOJIHUB:-true}" + verify_kojira: "${VERIFY_KOJIRA:-true}" + verify_kojibuilder_container: "${VERIFY_KOJIBUILDER_CONTAINER:-true}" + verify_kojibuilder_kubevirt: "${VERIFY_KOJIBUILDER_KUBEVIRT:-false}" + env: + K8S_AUTH_KUBECONFIG: ${KUBECONFIG:-"~/.kube/config"} verifier: name: ansible - #lint: | - #set -e - #ansible-lint diff --git a/operator/molecule/default/prepare.yml b/operator/molecule/default/prepare.yml index ed40370..ad1361c 100644 --- a/operator/molecule/default/prepare.yml +++ b/operator/molecule/default/prepare.yml @@ -1,28 +1,12 @@ --- -- name: Prepare +- name: Converge hosts: localhost connection: local - gather_facts: false - - tasks: - - name: Ensure operator image is set - fail: - msg: | - You must specify the OPERATOR_IMAGE environment variable in order to run the - 'default' scenario - when: not operator_image - - - name: Set testing image - command: '{{ kustomize }} edit set image testing={{ operator_image }}' - args: - chdir: '{{ config_dir }}/testing' - - - name: Set pull policy - command: '{{ kustomize }} edit add patch --path pull_policy/{{ operator_pull_policy }}.yaml' - args: - chdir: '{{ config_dir }}/testing' - - - name: Set testing namespace - command: '{{ kustomize }} edit set namespace {{ namespace }}' - args: - chdir: '{{ config_dir }}/testing' + tasks: + - include_tasks: "{{ backends_dir }}/cluster/{{ backend_cluster }}/prepare.yml" + + - include_tasks: "{{ backends_dir }}/container/{{ backend_container }}/build.yml" + vars: + image_dir: "{{ project_dir }}" + image_name: "{{ operator_image_name }}" + image_tag: "{{ operator_image_tag }}" diff --git a/operator/molecule/default/tasks/kojibuilder_kubevirt_test.yml b/operator/molecule/default/tasks/kojibuilder_kubevirt_test.yml deleted file mode 100644 index b403406..0000000 --- a/operator/molecule/default/tasks/kojibuilder_kubevirt_test.yml +++ /dev/null @@ -1,100 +0,0 @@ ---- -- name: Create the buildsys.apps.fedoraproject.org/v1alpha1.KojiBuilder (kubevirt) - k8s: - state: present - namespace: '{{ namespace }}' - definition: - apiVersion: buildsys.apps.fedoraproject.org/v1alpha1 - kind: KojiBuilder - metadata: - name: sample-virt - annotations: - buildsys.apps.fedoraproject.org/hub: sample/osdk-test - spec: - image: quay.io/fedora-kube-sig/koji-builder-kubevirt:raw - type: kubevirt - max_jobs: 5 - archs: - - x86_64 - channels: - - default - ssl_verify: false - volume: false - running: true - wait: yes - wait_timeout: 1800 - wait_condition: - type: Running - reason: Successful - status: "True" - -- block: - - name: 'TEST: kojibuilder.configmap' - k8s_info: - api_version: v1 - kind: ConfigMap - namespace: "{{ namespace }}" - name: kojid-sample-virt-conf - register: koji_configmap - - assert: - that: - - koji_configmap.resources|length == 1 - - koji_configmap.resources[0].metadata.labels['app'] == 'koji-builder' - - "'kojid.conf' in koji_configmap.resources[0].data" - -- block: - - name: 'TEST: kojibuilder.secret.client-cert' - k8s_info: - api_version: v1 - kind: Secret - namespace: "{{ namespace }}" - name: kojid-sample-virt-client-cert - register: kojibuilder_client_secrets - - assert: - that: - - kojibuilder_client_secrets.resources|length == 1 - - kojibuilder_client_secrets.resources[0].metadata.labels['app'] == 'koji-builder' - - "'client.pem' in kojibuilder_client_secrets.resources[0].data" - #- block: - # - name: 'TEST: kojibuilder.secret.ssh-key' - # k8s_info: - # api_version: v1 - # kind: Secret - # namespace: "{{ namespace }}" - # name: "kojid-sample-virt-default-ssh-key" - # register: kojibuilder_ssh_secrets - # - assert: - # that: - # - kojibuilder_ssh_secrets.resources|length == 1 - # - kojibuilder_ssh_secrets.resources[0].metadata.labels['app'] == 'koji-builder' - # - kojibuilder_ssh_secrets.resources[0].metadata.labels['ctx'] == 'ssh-key' - # - kojibuilder_ssh_secrets.resources[0].metadata.labels['kojid'] == 'sample-virt' - # - "'id_rsa' in kojibuilder_ssh_secrets.resources[0].data" - # - "'id_rsa.pub' in kojibuilder_ssh_secrets.resources[0].data" - #- block: - # - name: 'TEST: kojibuilder.secret.ssh-pub-keys' - # k8s_info: - # api_version: v1 - # kind: Secret - # namespace: "{{ namespace }}" - # name: kojid-sample-virt-ssh-pub-keys - # register: kojibuilder_ssh_pub_secrets - # - assert: - # that: - # - kojibuilder_ssh_pub_secrets.resources|length == 1 - # - kojibuilder_ssh_pub_secrets.resources[0].metadata.labels['app'] == 'koji-builder' - # - kojibuilder_ssh_pub_secrets.resources[0].metadata.labels['ctx'] == 'ssh-key-pub' - # - kojibuilder_ssh_pub_secrets.resources[0].metadata.labels['kojid'] == 'sample-virt' - # - "'id_rsa' not in kojibuilder_ssh_pub_secrets.resources[0].data" - # - "'id_rsa.pub' not in kojibuilder_ssh_pub_secrets.resources[0].data" - # - "'key1' in kojibuilder_ssh_pub_secrets.resources[0].data" -- block: - - name: 'TEST: kojibuilder.deletion' - k8s: - state: absent - api_version: buildsys.apps.fedoraproject.org/v1alpha1 - kind: KojiBuilder - namespace: "{{ namespace }}" - name: sample-virt - wait: true - wait_timeout: 300 diff --git a/operator/molecule/default/tasks/kojibuilder_test.yml b/operator/molecule/default/tasks/kojibuilder_test.yml deleted file mode 100644 index 9edc871..0000000 --- a/operator/molecule/default/tasks/kojibuilder_test.yml +++ /dev/null @@ -1,85 +0,0 @@ ---- -- name: Create the buildsys.apps.fedoraproject.org/v1alpha1.KojiBuilder - k8s: - state: present - namespace: '{{ namespace }}' - definition: - apiVersion: buildsys.apps.fedoraproject.org/v1alpha1 - kind: KojiBuilder - metadata: - name: sample - annotations: - buildsys.apps.fedoraproject.org/hub: sample/osdk-test - spec: - image: quay.io/fedora/koji-builder:f34 - type: repo - max_jobs: 5 - archs: - - x86_64 - channels: - - createrepo - ssl_verify: false - volume: true - wait: yes - wait_timeout: 300 - wait_condition: - type: Running - reason: Successful - status: "True" - vars: - cr_file: 'buildsys_v1alpha1_kojibuilder.yaml' - -- block: - - name: 'TEST: kojibuilder.configmap' - k8s_info: - api_version: v1 - kind: ConfigMap - namespace: "{{ namespace }}" - name: kojid-sample-conf - register: koji_configmap - - assert: - that: - - koji_configmap.resources|length == 1 - - koji_configmap.resources[0].metadata.labels['app'] == 'koji-builder' - - "'kojid.conf' in koji_configmap.resources[0].data" - -- block: - - name: 'TEST: kojibuilder.secret.client-cert' - k8s_info: - api_version: v1 - kind: Secret - namespace: "{{ namespace }}" - # name: koji-builder-client-cert - name: kojid-sample-client-cert - register: kojibuilder_client_secrets - - assert: - that: - - kojibuilder_client_secrets.resources|length == 1 - - kojibuilder_client_secrets.resources[0].metadata.labels['app'] == 'koji-builder' - - "'client.pem' in kojibuilder_client_secrets.resources[0].data" - -- block: - - name: 'TEST: kojibuilder.pod deployment' - k8s_info: - api_version: v1 - kind: Pod - namespace: "{{ namespace }}" - label_selectors: - - app = koji-builder - register: pods - - assert: - that: - - pods.resources|length == 1 - - pods.resources[0].metadata.labels['app'] == 'koji-builder' - -- block: - - name: 'TEST: kojibuilder.deletion' - k8s: - state: absent - api_version: buildsys.apps.fedoraproject.org/v1alpha1 - kind: KojiBuilder - namespace: "{{ namespace }}" - name: sample - wait: yes - wait_timeout: 300 - diff --git a/operator/molecule/default/tasks/kojihub_test.yml b/operator/molecule/default/tasks/kojihub_test.yml deleted file mode 100644 index 986db27..0000000 --- a/operator/molecule/default/tasks/kojihub_test.yml +++ /dev/null @@ -1,100 +0,0 @@ ---- -- name: Create the buildsys.apps.fedoraproject.org/v1alpha1.MBKojiHub - k8s: - state: present - namespace: '{{ namespace }}' - definition: "{{ lookup('template', '/'.join([samples_dir, cr_file])) | from_yaml }}" - wait: yes - wait_timeout: 300 - wait_condition: - type: Running - reason: Successful - status: "True" - vars: - cr_file: 'buildsys_v1alpha1_kojihub.yaml' - -- block: - - name: 'TEST: koji_hub.configmap' - k8s_info: - api_version: v1 - kind: ConfigMap - namespace: "{{ namespace }}" - name: koji-hub-sample - register: koji_configmap - - assert: - that: - - koji_configmap.resources|length == 1 - - koji_configmap.resources[0].metadata.labels['app'] == 'koji-hub' - - "'httpd.conf' in koji_configmap.resources[0].data" - - "'hub.conf' in koji_configmap.resources[0].data" - - "'kojiweb.conf' in koji_configmap.resources[0].data" - -- block: - - name: 'TEST: kojihub.secret.koji-hub-ca-cert' - k8s_info: - api_version: v1 - kind: Secret - namespace: "{{ namespace }}" - name: koji-hub-sample-ca - register: kojihub_secrets - - assert: - that: - - kojihub_secrets.resources|length == 1 - - kojihub_secrets.resources[0].metadata.labels['app'] == 'koji-hub' - - "'cert' in kojihub_secrets.resources[0].data" - -- block: - - name: 'TEST: kojihub.secret.koji-hub-service-cert' - k8s_info: - api_version: v1 - kind: Secret - namespace: "{{ namespace }}" - name: koji-hub-sample-httpd-certs - register: kojihub_secrets - - assert: - that: - - kojihub_secrets.resources|length == 1 - - kojihub_secrets.resources[0].metadata.labels['app'] == 'koji-hub' - - "'tls.crt' in kojihub_secrets.resources[0].data" - - "'tls.key' in kojihub_secrets.resources[0].data" - -- block: - - name: 'TEST: kojihub.secret.koji-hub-web-client-cert' - k8s_info: - api_version: v1 - kind: Secret - namespace: "{{ namespace }}" - name: koji-hub-sample-client-web - register: kojihub_secrets - - assert: - that: - - kojihub_secrets.resources|length == 1 - - "'client.pem' in kojihub_secrets.resources[0].data" - -- block: - - name: 'TEST: kojihub.pvcs' - k8s_info: - api_version: v1 - kind: PersistentVolumeClaim - namespace: "{{ namespace }}" - name: koji-hub-sample - register: kojihub_pvcs - - assert: - that: - - kojihub_pvcs.resources|length == 1 - - kojihub_pvcs.resources[0].metadata.labels['app'] == 'koji-hub' - - "'ReadWriteMany' in kojihub_pvcs.resources[0].spec.accessModes" - - "kojihub_pvcs.resources[0].spec.resources.requests.storage == '10Gi'" - -- block: - - name: 'TEST: kojihub.service' - k8s_info: - api_version: v1 - kind: Service - namespace: "{{ namespace }}" - name: koji-hub-sample - register: kojihub_svcs - - assert: - that: - - kojihub_svcs.resources|length == 1 - - kojihub_svcs.resources[0].metadata.labels['app'] == 'koji-hub' diff --git a/operator/molecule/default/tasks/kojira_test.yml b/operator/molecule/default/tasks/kojira_test.yml deleted file mode 100644 index 61d80d2..0000000 --- a/operator/molecule/default/tasks/kojira_test.yml +++ /dev/null @@ -1,76 +0,0 @@ ---- -- name: Create the buildsys.apps.fedoraproject.org/v1alpha1.Kojira - k8s: - state: present - namespace: '{{ namespace }}' - definition: - apiVersion: buildsys.apps.fedoraproject.org/v1alpha1 - kind: Kojira - metadata: - name: sample - annotations: - buildsys.apps.fedoraproject.org/hub: sample/osdk-test - spec: - replicas: 1 - image: quay.io/fedora/kojira:f34 - src: 'no' - max_repo_tasks: 15 - repo_tasks_limit: 15 - wait: yes - wait_timeout: 300 - wait_condition: - type: Running - reason: Successful - status: "True" - -- block: - - name: 'TEST: kojira.configmap' - k8s_info: - api_version: v1 - kind: ConfigMap - namespace: "{{ namespace }}" - name: kojira-sample-conf - register: kojira_configmap - - assert: - that: - - kojira_configmap.resources|length == 1 - - "kojira_configmap.resources[0].metadata.labels['app'] == 'kojira'" - - "'kojira.conf' in kojira_configmap.resources[0].data" - -- block: - - name: 'TEST: kojira.secret.client-cert' - k8s_info: - api_version: v1 - kind: Secret - namespace: "{{ namespace }}" - name: kojira-sample-client-cert - register: kojira_client_secrets - - assert: - that: - - kojira_client_secrets.resources|length == 1 - - kojira_client_secrets.resources[0].metadata.labels['app'] == 'kojira' - - "'client.pem' in kojira_client_secrets.resources[0].data" - -- block: - - name: 'TEST: kojira.deployment' - k8s_info: - api_version: v1 - kind: Deployment - namespace: "{{ namespace }}" - name: kojira - register: kojira_deployments - - k8s_info: - api_version: v1 - kind: Pod - namespace: "{{ namespace }}" - label_selectors: - - app = kojira - register: kojira_pods - - assert: - that: - - kojira_deployments.resources|length == 1 - - kojira_deployments.resources[0].metadata.labels['app'] == 'kojira' - - assert: - that: - - kojira_pods.resources|length == 1 - - kojira_pods.resources[0].metadata.labels['app'] == 'kojira' diff --git a/operator/molecule/default/tasks/kojiuser_test.yml b/operator/molecule/default/tasks/kojiuser_test.yml deleted file mode 100644 index 370a0a9..0000000 --- a/operator/molecule/default/tasks/kojiuser_test.yml +++ /dev/null @@ -1,70 +0,0 @@ ---- -- name: Create the buildsys.apps.fedoraproject.org/v1alpha1.KojiUser - k8s: - state: present - namespace: '{{ namespace }}' - definition: - apiVersion: buildsys.apps.fedoraproject.org/v1alpha1 - kind: KojiUser - metadata: - name: sample - annotations: - buildsys.apps.fedoraproject.org/hub: sample/osdk-test - spec: - permissions: [] - ssl: true - wait: yes - wait_timeout: 300 - wait_condition: - type: Running - reason: Successful - status: "True" - vars: - cr_file: 'buildsys_v1alpha1_kojiuser.yaml' - -- block: - - name: 'TEST: kojiuser.secret.client-cert' - k8s_info: - api_version: v1 - kind: Secret - namespace: "{{ namespace }}" - name: sample-koji-client-cert - register: kojiuser_client_secrets - - assert: - that: - - kojiuser_client_secrets.resources | length == 1 - - kojiuser_client_secrets.resources[0].metadata.labels['app'] == 'koji' - - kojiuser_client_secrets.resources[0].metadata.labels['koji-hub'] == 'sample' - - kojiuser_client_secrets.resources[0].metadata.annotations['buildsys.apps.fedoraproject.org/hub'] == 'sample/osdk-test' - - "'client.pem' in kojiuser_client_secrets.resources[0].data" - -- block: - - name: 'TEST: kojiuser.created.database' - command: "kubectl get po --selector='app=postgres' -o jsonpath='{.items[0].metadata.name}' -n {{ namespace }}" - register: k8s_pod - - command: "kubectl exec -it {{ k8s_pod.stdout }} -n {{ namespace }} -- psql --username koji koji -c 'SELECT name FROM users;'" - register: psql_users - - assert: - that: - - "'sample' in psql_users.stdout" - - -- name: Delete KojiUser resource - k8s: - api_version: buildsys.apps.fedoraproject.org/v1alpha1 - kind: KojiUser - name: sample - namespace: "{{ namespace }}" - state: absent - wait: true - -- block: - - name: 'TEST: kojiuser.deleted.database' - command: "kubectl get po --selector='app=postgres' -o jsonpath='{.items[0].metadata.name}' -n {{ namespace }}" - register: k8s_pod - - command: "kubectl exec -it {{ k8s_pod.stdout }} -n {{ namespace }} -- psql --username koji koji -c 'SELECT name,status FROM users;'" - register: psql_users - - assert: - that: - - "'sample' in psql_users.stdout" - - "'1' in psql_users.stdout" diff --git a/operator/molecule/default/verify.yml b/operator/molecule/default/verify.yml index f1c22b5..12a3fa9 100644 --- a/operator/molecule/default/verify.yml +++ b/operator/molecule/default/verify.yml @@ -2,60 +2,102 @@ - name: Verify hosts: localhost connection: local - gather_facts: no - collections: - - community.kubernetes - - vars: - ctrl_label: control-plane=controller-manager - + gather_facts: false tasks: + - name: Set global vars + set_fact: + k8s_crs: [] + - block: - - name: Import all test files from tasks/ - include_tasks: 'tasks/{{ item }}_test.yml' - with_items: - - kojihub - - kojibuilder - - kojira - - kojiuser + - block: + - name: Koji-Hub Tests + include_tasks: "{{ components_dir }}/koji-hub/create.yml" + - include_tasks: "{{ components_dir }}/koji-hub/verify.yml" + when: verify_kojihub | bool | default(true) + + - block: + - name: Kojira Tests + include_tasks: "{{ components_dir }}/kojira/create.yml" + - include_tasks: "{{ components_dir }}/kojira/verify.yml" + when: verify_kojira | bool | default(true) + + - block: + - name: Koji-Builder (container) Tests + include_tasks: "{{ components_dir }}/koji-builder/container/create.yml" + - include_tasks: "{{ components_dir }}/koji-builder/container/verify.yml" + when: verify_kojibuilder_container | bool | default(true) - - name: Run kubevirt based builder - include_tasks: tasks/kojibuilder_kubevirt_test.yml - when: "minikube_driver == 'kvm2'" + - block: + - name: Koji-Builder (Kubevirt) Tests + include_tasks: "{{ components_dir }}/koji-builder/kubevirt/create.yml" + - include_tasks: "{{ components_dir }}/koji-builder/kubevirt/verify.yml" + when: + - verify_kojibuilder_kubevirt | bool | default(true) + - backend_cluster == 'minikube' + - minikube_driver == 'kvm2' + rescue: - - name: Retrieve relevant resources - k8s_info: - api_version: '{{ item.api_version }}' - kind: '{{ item.kind }}' - namespace: '{{ namespace }}' - loop: - - api_version: v1 - kind: Pod - - api_version: apps/v1 - kind: Deployment - - api_version: v1 - kind: Secret - - api_version: v1 - kind: ConfigMap - register: debug_resources - - - name: Retrieve Pod logs - shell: "kubectl logs {{ item.metadata.name }} -c manager -n {{ namespace }}" - loop: "{{ q('k8s', api_version='v1', kind='Pod', namespace=namespace, label_selector=ctrl_label) }}" - register: debug_logs - - - name: Output gathered resources - debug: - var: debug_resources - - - name: Output gathered logs - debug: - var: debug_logs - # loop: '{{ debug_logs.stdout_lines }}' - - - name: Re-emit failure + - block: + - name: Collect CRs to log + set_fact: + k8s_crs: "{{ k8s_crs + [['kojihub', k8s_cr_kojihub.result]] }}" + when: verify_kojihub | bool | default(true) + + - set_fact: + k8s_crs: "{{ k8s_crs + [['kojira', k8s_cr_kojira.result]] }}" + when: verify_kojira | bool | default(true) + + - set_fact: + k8s_crs: "{{ k8s_crs + [['kojibuilder_container', k8s_cr_kojibuilder_container.result]] }}" + when: verify_kojibuilder_container | bool | default(true) + + - set_fact: + k8s_crs: "{{ k8s_crs + [['kojibuilder_kubevirt', k8s_cr_kojibuilder_kubevirt.result]] }}" + when: verify_kojibuilder_kubevirt | bool | default(true) + + - ansible.builtin.debug: + msg: "Operator Runtime Error" + + - name: Operator Pod Log + ansible.builtin.include_tasks: _log.yml + vars: + log_container: manager + log_labels: + - "control-plane=controller-manager" + log_fname: operator.log + + - name: Koji-Hub Pod Log + ansible.builtin.include_tasks: _log.yml + vars: + log_container: "koji-hub" + log_labels: + - "app=koji-hub" + log_fname: "koji-hub_pod.log" + when: verify_kojihub | bool | default(true) + + - name: Kojira Pod Log + ansible.builtin.include_tasks: _log.yml vars: - failed_task: - result: '{{ ansible_failed_result }}' - fail: - msg: '{{ failed_task }}' + log_container: "kojira" + log_labels: + - "app=kojira" + log_fname: "kojira_pod.log" + when: verify_kojira | bool | default(true) + + - name: Koji-Builder (Container) Pod Log + ansible.builtin.include_tasks: _log.yml + vars: + log_container: "koji-builder" + log_labels: + - "app=koji-builder" + log_fname: "kojibuilder_pod.log" + when: verify_kojibuilder_container | bool | default(true) + + - name: Export Custom Resources + copy: + content: "{{ item.1 | to_yaml }}" + dest: "{{ logs_dir }}/{{ item.0 }}_cr.yaml" + loop: "{{ k8s_crs }}" + + - ansible.builtin.fail: + msg: "Deployment error found, check logs in {{ logs_dir }}" diff --git a/operator/molecule/kind/converge.yml b/operator/molecule/kind/converge.yml deleted file mode 100644 index 8bd5700..0000000 --- a/operator/molecule/kind/converge.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -- name: Converge - hosts: localhost - connection: local - gather_facts: no - - tasks: - - name: Build operator image - docker_image: - build: - path: '{{ project_dir }}' - pull: no - name: '{{ operator_image }}' - tag: latest - push: no - source: build - force_source: yes - - - name: Load image into kind cluster - command: kind load docker-image --name osdk-test '{{ operator_image }}' - register: result - changed_when: '"not yet present" in result.stdout' - -- import_playbook: ../default/converge.yml diff --git a/operator/molecule/kind/create.yml b/operator/molecule/kind/create.yml deleted file mode 100644 index 66a84a1..0000000 --- a/operator/molecule/kind/create.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -- name: Create - hosts: localhost - connection: local - gather_facts: false - tasks: - - name: Create test kind cluster - command: kind create cluster --name osdk-test --kubeconfig {{ kubeconfig }} diff --git a/operator/molecule/kind/destroy.yml b/operator/molecule/kind/destroy.yml deleted file mode 100644 index a1c3eac..0000000 --- a/operator/molecule/kind/destroy.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -- name: Destroy - hosts: localhost - connection: local - gather_facts: false - collections: - - community.kubernetes - - tasks: - - name: Destroy test kind cluster - command: kind delete cluster --name osdk-test --kubeconfig {{ kubeconfig }} - - - name: Unset pull policy - command: '{{ kustomize }} edit remove patch pull_policy/{{ operator_pull_policy }}.yaml' - args: - chdir: '{{ config_dir }}/testing' diff --git a/operator/molecule/kind/molecule.yml b/operator/molecule/kind/molecule.yml deleted file mode 100644 index 1356087..0000000 --- a/operator/molecule/kind/molecule.yml +++ /dev/null @@ -1,57 +0,0 @@ ---- -dependency: - name: galaxy - options: - requirements-file: requirements.yml -driver: - name: delegated -lint: | - set -e - yamllint -d "{extends: relaxed, rules: {line-length: {max: 120}}}" . -platforms: - - name: cluster - groups: - - k8s -provisioner: - name: ansible - playbooks: - prepare: ../default/prepare.yml - verify: ../default/verify.yml - lint: | - set -e - ansible-lint - inventory: - group_vars: - all: - namespace: ${TEST_OPERATOR_NAMESPACE:-osdk-test} - host_vars: - localhost: - ansible_python_interpreter: '{{ ansible_playbook_python }}' - config_dir: ${MOLECULE_PROJECT_DIRECTORY}/config - samples_dir: ${MOLECULE_PROJECT_DIRECTORY}/config/samples - components_dir: ${MOLECULE_PROJECT_DIRECTORY}/../components - project_dir: ${MOLECULE_PROJECT_DIRECTORY} - operator_image: testing-operator - operator_pull_policy: "Never" - kubeconfig: "{{ lookup('env', 'KUBECONFIG') }}" - kustomize: ${KUSTOMIZE_PATH:-kustomize} - env: - K8S_AUTH_KUBECONFIG: ${MOLECULE_EPHEMERAL_DIRECTORY}/kubeconfig - KUBECONFIG: ${MOLECULE_EPHEMERAL_DIRECTORY}/kubeconfig -scenario: - name: kind - test_sequence: - # - lint - - destroy - - dependency - - syntax - - create - - prepare - - converge - - verify - - destroy -verifier: - name: ansible - lint: | - set -e - ansible-lint diff --git a/operator/molecule/kind/requirements.yml b/operator/molecule/kind/requirements.yml deleted file mode 100644 index 3f626ed..0000000 --- a/operator/molecule/kind/requirements.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -collections: - - name: community.kubernetes - version: "1.2.1" - - name: operator_sdk.util - version: "0.2.0" diff --git a/operator/molecule/minikube/converge.yml b/operator/molecule/minikube/converge.yml deleted file mode 100644 index 42d1fd1..0000000 --- a/operator/molecule/minikube/converge.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -- name: Converge - hosts: localhost - connection: local - gather_facts: no - - tasks: - - name: Build operator image - containers.podman.podman_image: - build: - format: docker - path: '{{ project_dir }}' - name: '{{ operator_image }}' - tag: latest - push: no - - - name: Load image into minikube - command: minikube image load {{ operator_image }} --overwrite=true - - - -- import_playbook: ../default/converge.yml diff --git a/operator/molecule/minikube/create.yml b/operator/molecule/minikube/create.yml deleted file mode 100644 index b6b82d3..0000000 --- a/operator/molecule/minikube/create.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -- name: Create - hosts: localhost - connection: local - gather_facts: false - tasks: - - block: - - name: Start minikube - command: minikube start --driver={{ minikube_driver }} - - - name: Sleep for 10 seconds and continue with play - wait_for: - timeout: 10 - - - block: - - name: Enable kubevirt - command: minikube addons enable kubevirt - - name: Wait for kubevirt namespace - k8s_info: - api_version: v1 - kind: Namespace - name: kubevirt - register: out - retries: 180 - delay: 3 - until: - - "out.resources | length == 1" - - - k8s_info: - api_version: kubevirt.io/v1 - kind: KubeVirt - namespace: kubevirt - name: kubevirt - register: out - retries: 300 - delay: 3 - until: - - "'resources' in out" - - "out.resources | length > 0" - - "'status' in out.resources[0]" - - "out.resources[0].status.phase == 'Deployed'" - when: "minikube_driver == 'kvm2'" - when: minikube_skip == 'N' diff --git a/operator/molecule/minikube/destroy.yml b/operator/molecule/minikube/destroy.yml deleted file mode 100644 index cafd68c..0000000 --- a/operator/molecule/minikube/destroy.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -- name: Destroy - hosts: localhost - connection: local - gather_facts: false - collections: - - community.kubernetes - - tasks: - - name: Destroy minikube - command: minikube delete - when: minikube_skip == 'N' - - - name: Unset pull policy - command: '{{ kustomize }} edit remove patch pull_policy/{{ operator_pull_policy }}.yaml' - args: - chdir: '{{ config_dir }}/testing' diff --git a/operator/molecule/minikube/molecule.yml b/operator/molecule/minikube/molecule.yml deleted file mode 100644 index 2741334..0000000 --- a/operator/molecule/minikube/molecule.yml +++ /dev/null @@ -1,56 +0,0 @@ ---- -dependency: - name: galaxy - options: - requirements-file: requirements.yml -driver: - name: delegated -lint: | - set -e - yamllint -d "{extends: relaxed, rules: {line-length: {max: 120}}}" . -platforms: - - name: cluster - groups: - - k8s -provisioner: - name: ansible - playbooks: - verify: ../default/verify.yml - prepare: ../default/prepare.yml - lint: | - set -e - ansible-lint - inventory: - group_vars: - all: - namespace: ${TEST_OPERATOR_NAMESPACE:-osdk-test} - operator_image: buildsys.apps.fedoraproject.org/koji-operator:testing - operator_pull_policy: "Never" - host_vars: - localhost: - ansible_python_interpreter: '{{ ansible_playbook_python }}' - config_dir: ${MOLECULE_PROJECT_DIRECTORY}/config - samples_dir: ${MOLECULE_PROJECT_DIRECTORY}/config/samples - components_dir: ${MOLECULE_PROJECT_DIRECTORY}/../components - project_dir: ${MOLECULE_PROJECT_DIRECTORY} - operator_pull_policy: "Never" - kustomize: ${KUSTOMIZE_PATH:-kustomize} - minikube_driver: ${MINIKUBE_DRIVER:-docker} - minikube_skip: ${MINIKUBE_SKIP:-N} -scenario: - name: minikube - test_sequence: - # - lint - - destroy - - dependency - - syntax - - create - - prepare - - converge - - verify - - destroy -verifier: - name: ansible - lint: | - set -e - ansible-lint diff --git a/operator/molecule/minikube/prepare.yml b/operator/molecule/minikube/prepare.yml deleted file mode 100644 index c8e3c05..0000000 --- a/operator/molecule/minikube/prepare.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -- name: Create - hosts: localhost - connection: local - gather_facts: false - tasks: - - name: Enable kubevirt - command: minikube addons enable kubevirt - when: "minikube_driver == 'kvm2'" - - - name: Wait for kubevirt readiness - k8s_info: - api_version: kubevirt.io/v1 - kind: KubeVirt - namespace: kubevirt - name: kubevirt - wait: true - wait_condition: - type: Available - reason: AllComponentsReady - status: "True" - diff --git a/operator/molecule/minikube/requirements.yml b/operator/molecule/minikube/requirements.yml deleted file mode 100644 index 3f626ed..0000000 --- a/operator/molecule/minikube/requirements.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -collections: - - name: community.kubernetes - version: "1.2.1" - - name: operator_sdk.util - version: "0.2.0" diff --git a/operator/molecule/requirements.yml b/operator/molecule/requirements.yml deleted file mode 100644 index 3f626ed..0000000 --- a/operator/molecule/requirements.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -collections: - - name: community.kubernetes - version: "1.2.1" - - name: operator_sdk.util - version: "0.2.0" diff --git a/operator/molecule/test-local/converge.yml b/operator/molecule/test-local/converge.yml deleted file mode 100644 index 979ddd7..0000000 --- a/operator/molecule/test-local/converge.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- -- name: Build Operator in Kubernetes docker container - hosts: k8s - gather_facts: false - vars: - image_name: "{{ operator_image }}" - dockerfile_path: /build/Dockerfile - tasks: - # using command so we don't need to install any dependencies - - name: Get existing image hash - command: docker images -q {{ image_name }} - register: prev_hash - changed_when: false - - - name: Build Operator Image - command: docker build -f {{ dockerfile_path }} -t {{ image_name }} /build - register: build_cmd - changed_when: not prev_hash.stdout or (prev_hash.stdout and prev_hash.stdout not in ''.join(build_cmd.stdout_lines[-2:])) - - -- import_playbook: '{{ playbook_dir }}/../default/converge.yml' diff --git a/operator/molecule/test-local/destroy.yml b/operator/molecule/test-local/destroy.yml deleted file mode 100644 index 2985245..0000000 --- a/operator/molecule/test-local/destroy.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -- name: Destroy - hosts: localhost - connection: local - gather_facts: false - no_log: "{{ molecule_no_log }}" - tasks: - - name: Destroy molecule instance(s) - docker_container: - name: "{{ item.name }}" - docker_host: "{{ item.docker_host | default(lookup('env', 'DOCKER_HOST') or 'unix://var/run/docker.sock') }}" - cacert_path: "{{ item.cacert_path | default((lookup('env', 'DOCKER_CERT_PATH') + '/ca.pem') if lookup('env', 'DOCKER_CERT_PATH') else omit) }}" - cert_path: "{{ item.cert_path | default((lookup('env', 'DOCKER_CERT_PATH') + '/cert.pem') if lookup('env', 'DOCKER_CERT_PATH') else omit) }}" - key_path: "{{ item.key_path | default((lookup('env', 'DOCKER_CERT_PATH') + '/key.pem') if lookup('env', 'DOCKER_CERT_PATH') else omit) }}" - tls_verify: "{{ item.tls_verify | default(lookup('env', 'DOCKER_TLS_VERIFY')) or false }}" - state: absent - force_kill: "{{ item.force_kill | default(true) }}" - keep_volumes: "{{ item.keep_volumes | default(true) }}" - container_default_behavior: "{{ item.container_default_behavior | default('compatibility' if ansible_version.full is version_compare('2.10', '>=') else omit) }}" - register: server - with_items: "{{ molecule_yml.platforms }}" - async: 7200 - poll: 0 - - - name: Wait for instance(s) deletion to complete - async_status: - jid: "{{ item.ansible_job_id }}" - register: docker_jobs - until: docker_jobs.finished - retries: 300 - with_items: "{{ server.results }}" - - - name: Prune everything - docker_prune: - containers: yes - images: yes - networks: yes - volumes: yes - - - name: Unset pull policy - command: '{{ kustomize }} edit remove patch --path pull_policy/{{ operator_pull_policy }}.yaml' - args: - chdir: '{{ config_dir }}/testing' diff --git a/operator/molecule/test-local/molecule.yml b/operator/molecule/test-local/molecule.yml deleted file mode 100644 index af64e0b..0000000 --- a/operator/molecule/test-local/molecule.yml +++ /dev/null @@ -1,66 +0,0 @@ ---- -dependency: - name: galaxy -driver: - name: docker -lint: | - yamllint roles/ -platforms: - - name: kind-test-local - groups: - - k8s - image: bsycorp/kind:latest-1.16 - privileged: true - override_command: false - exposed_ports: - - 8443/tcp - - 10080/tcp - published_ports: - - 0.0.0.0:${TEST_CLUSTER_PORT:-10443}:8443/tcp - pre_build_image: true - volumes: - - ${MOLECULE_PROJECT_DIRECTORY}:/build:Z -provisioner: - name: ansible - log: true - lint: | - ansible-lint . - inventory: - group_vars: - all: - namespace: ${TEST_NAMESPACE:-osdk-test} - operator_image: apps.fedoraproject.org/mbox-operator:testing - host_vars: - localhost: - ansible_python_interpreter: '{{ ansible_playbook_python }}' - config_dir: ${MOLECULE_PROJECT_DIRECTORY}/config - samples_dir: ${MOLECULE_PROJECT_DIRECTORY}/config/samples - components_dir: ${MOLECULE_PROJECT_DIRECTORY}/../components - operator_image: ${OPERATOR_IMAGE:-"apps.fedoraproject.org/mbox-operator:testing"} - operator_pull_policy: ${OPERATOR_PULL_POLICY:-"IfNotPresent"} - kustomize: ${KUSTOMIZE_PATH:-kustomize} - kubeconfig: "{{ lookup('env', 'KUBECONFIG') }}" - env: - K8S_AUTH_KUBECONFIG: /tmp/molecule/kind-test-local/kubeconfig - KUBECONFIG: /tmp/molecule/kind-test-local/kubeconfig - ANSIBLE_ROLES_PATH: ${MOLECULE_PROJECT_DIRECTORY}/roles - KIND_PORT: '${TEST_CLUSTER_PORT:-10443}' - playbooks: - destroy: destroy.yml - verify: ../default/verify.yml -scenario: - name: test-local - test_sequence: - - lint - - destroy - - dependency - - syntax - - create - - prepare - - converge - - verify - - destroy -verifier: - name: ansible - lint: | - flake8 diff --git a/operator/molecule/test-local/prepare.yml b/operator/molecule/test-local/prepare.yml deleted file mode 100644 index 7e84707..0000000 --- a/operator/molecule/test-local/prepare.yml +++ /dev/null @@ -1,37 +0,0 @@ ---- -- name: Prepare - hosts: k8s - gather_facts: false - vars: - kubeconfig: "{{ lookup('env', 'KUBECONFIG') }}" - tasks: - - name: delete the kubeconfig if present - file: - path: '{{ kubeconfig }}' - state: absent - delegate_to: localhost - - - name: Fetch the kubeconfig - fetch: - dest: '{{ kubeconfig }}' - flat: true - src: /root/.kube/config - - - name: Change the kubeconfig port to the proper value - replace: - regexp: 'server: http(s?):\/\/([0-9\.]+|localhost):[0-9]+' - replace: "server: https://localhost:{{ lookup('env', 'KIND_PORT') }}" - path: '{{ kubeconfig }}' - delegate_to: localhost - - - name: Wait for the Kubernetes API to become available (this could take a minute) - uri: - url: "https://localhost:8443/readyz" - status_code: 200 - validate_certs: false - register: result - until: (result.status|default(-1)) == 200 - retries: 60 - delay: 5 - -- import_playbook: '{{ playbook_dir }}/../default/prepare.yml'