Skip to content

Commit

Permalink
Make installing Hyperconverged optional (#8917)
Browse files Browse the repository at this point in the history
Co-authored-by: Wolfgang Kulhanek <[email protected]>
  • Loading branch information
wkulhanek and Wolfgang Kulhanek authored Dec 6, 2024
1 parent 2395484 commit 4e5aa85
Show file tree
Hide file tree
Showing 2 changed files with 143 additions and 135 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
# --------------------------------
Expand Down
269 changes: 136 additions & 133 deletions ansible/roles_ocp_workloads/ocp4_workload_kubevirt/tasks/workload.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 4e5aa85

Please sign in to comment.