From 4e5aa85cfc58c9cfdc2c73633769a0960ee1ff8a Mon Sep 17 00:00:00 2001 From: Wolfgang Kulhanek Date: Fri, 6 Dec 2024 09:21:08 -0500 Subject: [PATCH] Make installing Hyperconverged optional (#8917) Co-authored-by: Wolfgang Kulhanek --- .../ocp4_workload_kubevirt/defaults/main.yml | 9 +- .../ocp4_workload_kubevirt/tasks/workload.yml | 269 +++++++++--------- 2 files changed, 143 insertions(+), 135 deletions(-) diff --git a/ansible/roles_ocp_workloads/ocp4_workload_kubevirt/defaults/main.yml b/ansible/roles_ocp_workloads/ocp4_workload_kubevirt/defaults/main.yml index cb838a889f9..11c3bdc5680 100644 --- a/ansible/roles_ocp_workloads/ocp4_workload_kubevirt/defaults/main.yml +++ b/ansible/roles_ocp_workloads/ocp4_workload_kubevirt/defaults/main.yml @@ -26,8 +26,6 @@ ocp4_workload_kubevirt_automatic_install_plan_approval: true ocp4_workload_kubevirt_starting_csv: "" # ocp4_workload_kubevirt_starting_csv: "v4.16.0" -ocp4_workload_kubevirt_install_virtctl: true - # Add additional tolerations to the HyperConverged components # This is necessary in mixed worker node environment where nodes that can run # VMs are tainted to prevent other pods from running on them @@ -48,6 +46,13 @@ ocp4_workload_kubevirt_boot_sources_shapshot: true # whih will be added if the following variable is set to true ocp4_workload_kubevirt_enabled_nested_kvm: false +# Deploy the Hyperconverged Object. Defaults to true +# Only set to false if a lab needs students to create it +ocp4_workload_kubevirt_deploy_hyperconverged: true + +# Install virtctl - requires hyperconverged to be deployed +ocp4_workload_kubevirt_install_virtctl: true + # -------------------------------- # Operator Catalog Snapshot Settings # -------------------------------- diff --git a/ansible/roles_ocp_workloads/ocp4_workload_kubevirt/tasks/workload.yml b/ansible/roles_ocp_workloads/ocp4_workload_kubevirt/tasks/workload.yml index 0cf4e71d221..7dc1d621d89 100644 --- a/ansible/roles_ocp_workloads/ocp4_workload_kubevirt/tasks/workload.yml +++ b/ansible/roles_ocp_workloads/ocp4_workload_kubevirt/tasks/workload.yml @@ -28,142 +28,145 @@ install_operator_catalogsource_image_tag: "{{ ocp4_workload_kubevirt_catalog_snapshot_image_tag | default('') }}" install_operator_subscription_config: "{{ _ocp4_workload_kubevirt_extra_config }}" -- name: Create the HyperConverged instance - kubernetes.core.k8s: - state: present - definition: "{{ lookup('template', 'hyperconverged.yaml.j2') }}" - -- name: Wait until HyperConverged is installed - kubernetes.core.k8s_info: - api_version: hco.kubevirt.io/v1beta1 - kind: HyperConverged - name: kubevirt-hyperconverged - namespace: openshift-cnv - wait: true - wait_sleep: 10 - wait_timeout: 1200 - wait_condition: - reason: "ReconcileCompleted" - type: "Available" - status: "True" - -# For deployments on CNV with external Ceph use PVCs for boot image snapshots -# HyperConverged must have been created with .spec.featureGates.enableCommonBootImageImport: false -# See template for that logic -- name: Set boot sources to use PVCs - when: not ocp4_workload_kubevirt_boot_sources_shapshot | bool +- name: Deploy and configure HyperConverged + when: ocp4_workload_kubevirt_deploy_hyperconverged | bool block: - - name: Get all available storage classes - kubernetes.core.k8s_info: - api_version: storage.k8s.io/v1 - kind: StorageClass - register: r_storageclasses - - - name: Abort if no storage classes found - when: r_storageclasses.resources | length == 0 - ansible.builtin.fail: - msg: "No storage classes found. Can not continue." - - - name: Find default storage class - ansible.builtin.set_fact: - _ocp4_workload_kubevirt_default_storage_class: "{{ default_sc[0] }}" - vars: - default_sc: "{{ r_storageclasses.resources | json_query(query) }}" - query: "[?metadata.annotations.\"storageclass.kubernetes.io/is-default-class\" == 'true'].metadata.name" - - - name: Abort if no default storage class found - when: _ocp4_workload_kubevirt_default_storage_class | length == 0 - ansible.builtin.fail: - msg: "No default storage class found. Can not continue." - - - name: Print default storage class name - ansible.builtin.debug: - msg: "Default storage class: {{ _ocp4_workload_kubevirt_default_storage_class }}" - - - name: Patch the storage profile matching the default storage class to use pvc instead of snapshot - kubernetes.core.k8s: - state: patched - api_version: cdi.kubevirt.io/v1beta1 - kind: StorageProfile - name: "{{ _ocp4_workload_kubevirt_default_storage_class }}" - definition: - spec: - dataImportCronSourceFormat: pvc - - - name: If we are using Hosted Control Planes, it is needed to set default accessMode, volumeMode and cloneStrategy - when: _ocp4_workload_kubevirt_default_storage_class == "kubevirt-csi-infra-default" + - name: Create the HyperConverged instance kubernetes.core.k8s: - state: patched - api_version: cdi.kubevirt.io/v1beta1 - kind: StorageProfile - name: "{{ _ocp4_workload_kubevirt_default_storage_class }}" - definition: - spec: - claimPropertySets: - - accessModes: - - ReadWriteMany - volumeMode: Block - cloneStrategy: copy - - - name: Finally patch HyperConverged to import boot sources now using PVCs - kubernetes.core.k8s: - state: patched + state: present + definition: "{{ lookup('template', 'hyperconverged.yaml.j2') }}" + + - name: Wait until HyperConverged is installed + kubernetes.core.k8s_info: api_version: hco.kubevirt.io/v1beta1 kind: HyperConverged name: kubevirt-hyperconverged namespace: openshift-cnv - definition: - spec: - featureGates: - enableCommonBootImageImport: true - -- name: Install virtctl to bastion VM - when: ocp4_workload_kubevirt_install_virtctl | bool - block: - - name: Get virtctl-clidownloads-kubevirt-hyperconverged ConsoleCLIDownload - kubernetes.core.k8s_info: - api_version: console.openshift.io/v1 - kind: ConsoleCLIDownload - name: virtctl-clidownloads-kubevirt-hyperconverged - register: r_virtctl_cli_download - retries: 20 - delay: 10 - ignore_errors: true - until: - - r_virtctl_cli_download.resources is defined - - r_virtctl_cli_download.resources | length > 0 - - - name: Get virtctl download URL from ConsoleCLIDownload - when: r_virtctl_cli_download.resources | length > 0 - ansible.builtin.set_fact: - _ocp4_workload_kubevirt_virtctl_url: >- - {{ r_virtctl_cli_download.resources[0] | to_json | from_json - | json_query("spec.links[?contains(href,'linux')].href") | first }} - - - name: Download virtctl cli tool - ansible.builtin.get_url: - url: "{{ _ocp4_workload_kubevirt_virtctl_url }}" - validate_certs: false - dest: /tmp/virtctl.tar.gz - mode: "0660" - register: r_virtctl - until: r_virtctl is success - retries: 20 - delay: 10 - - - name: Install virtctl CLI on bastion - become: true - ansible.builtin.unarchive: - src: /tmp/virtctl.tar.gz - remote_src: true - dest: /usr/bin - mode: "0775" - owner: root - group: root - args: - creates: /usr/bin/virtctl - - - name: Remove downloaded file - ansible.builtin.file: - state: absent - path: /tmp/virtctl.tar.gz + wait: true + wait_sleep: 10 + wait_timeout: 1200 + wait_condition: + reason: "ReconcileCompleted" + type: "Available" + status: "True" + + # For deployments on CNV with external Ceph use PVCs for boot image snapshots + # HyperConverged must have been created with .spec.featureGates.enableCommonBootImageImport: false + # See template for that logic + - name: Set boot sources to use PVCs + when: not ocp4_workload_kubevirt_boot_sources_shapshot | bool + block: + - name: Get all available storage classes + kubernetes.core.k8s_info: + api_version: storage.k8s.io/v1 + kind: StorageClass + register: r_storageclasses + + - name: Abort if no storage classes found + when: r_storageclasses.resources | length == 0 + ansible.builtin.fail: + msg: "No storage classes found. Can not continue." + + - name: Find default storage class + ansible.builtin.set_fact: + _ocp4_workload_kubevirt_default_storage_class: "{{ default_sc[0] }}" + vars: + default_sc: "{{ r_storageclasses.resources | json_query(query) }}" + query: "[?metadata.annotations.\"storageclass.kubernetes.io/is-default-class\" == 'true'].metadata.name" + + - name: Abort if no default storage class found + when: _ocp4_workload_kubevirt_default_storage_class | length == 0 + ansible.builtin.fail: + msg: "No default storage class found. Can not continue." + + - name: Print default storage class name + ansible.builtin.debug: + msg: "Default storage class: {{ _ocp4_workload_kubevirt_default_storage_class }}" + + - name: Patch the storage profile matching the default storage class to use pvc instead of snapshot + kubernetes.core.k8s: + state: patched + api_version: cdi.kubevirt.io/v1beta1 + kind: StorageProfile + name: "{{ _ocp4_workload_kubevirt_default_storage_class }}" + definition: + spec: + dataImportCronSourceFormat: pvc + + - name: If we are using Hosted Control Planes, it is needed to set default accessMode, volumeMode and cloneStrategy + when: _ocp4_workload_kubevirt_default_storage_class == "kubevirt-csi-infra-default" + kubernetes.core.k8s: + state: patched + api_version: cdi.kubevirt.io/v1beta1 + kind: StorageProfile + name: "{{ _ocp4_workload_kubevirt_default_storage_class }}" + definition: + spec: + claimPropertySets: + - accessModes: + - ReadWriteMany + volumeMode: Block + cloneStrategy: copy + + - name: Finally patch HyperConverged to import boot sources now using PVCs + kubernetes.core.k8s: + state: patched + api_version: hco.kubevirt.io/v1beta1 + kind: HyperConverged + name: kubevirt-hyperconverged + namespace: openshift-cnv + definition: + spec: + featureGates: + enableCommonBootImageImport: true + + - name: Install virtctl to bastion VM + when: ocp4_workload_kubevirt_install_virtctl | bool + block: + - name: Get virtctl-clidownloads-kubevirt-hyperconverged ConsoleCLIDownload + kubernetes.core.k8s_info: + api_version: console.openshift.io/v1 + kind: ConsoleCLIDownload + name: virtctl-clidownloads-kubevirt-hyperconverged + register: r_virtctl_cli_download + retries: 20 + delay: 10 + ignore_errors: true + until: + - r_virtctl_cli_download.resources is defined + - r_virtctl_cli_download.resources | length > 0 + + - name: Get virtctl download URL from ConsoleCLIDownload + when: r_virtctl_cli_download.resources | length > 0 + ansible.builtin.set_fact: + _ocp4_workload_kubevirt_virtctl_url: >- + {{ r_virtctl_cli_download.resources[0] | to_json | from_json + | json_query("spec.links[?contains(href,'linux')].href") | first }} + + - name: Download virtctl cli tool + ansible.builtin.get_url: + url: "{{ _ocp4_workload_kubevirt_virtctl_url }}" + validate_certs: false + dest: /tmp/virtctl.tar.gz + mode: "0660" + register: r_virtctl + until: r_virtctl is success + retries: 20 + delay: 10 + + - name: Install virtctl CLI on bastion + become: true + ansible.builtin.unarchive: + src: /tmp/virtctl.tar.gz + remote_src: true + dest: /usr/bin + mode: "0775" + owner: root + group: root + args: + creates: /usr/bin/virtctl + + - name: Remove downloaded file + ansible.builtin.file: + state: absent + path: /tmp/virtctl.tar.gz