From c9eb9d9b6c8c5be341b58108f84f29a4895c83a0 Mon Sep 17 00:00:00 2001 From: Karel Simon Date: Mon, 8 Jun 2020 10:40:15 +0200 Subject: [PATCH] fix labeller when no kvm device is available on the node When node doesn't have access to kvm, labeller stays in pending state. This commit removes the requirement for devices.kubevirt.io/kvm: "1". It adds new check which control if pod has access to kvm device. If yes, everything goes as usual (binaries are copied, node is updated with new labels). If kvm is not available, containers exit with 0 and no labells are added. Signed-off-by: Karel Simon --- functests/06-test-deploy-node-labeller.sh | 20 -------------- functests/node-labeller-unversioned-cr.yaml | 1 - ...erator.vVERSION.clusterserviceversion.yaml | 2 +- ...operator.latest.clusterserviceversion.yaml | 2 +- pkg/apis/kubevirt/v1/types.go | 1 - roles/KubevirtNodeLabeller/tasks/main.yml | 12 --------- .../kubevirt-node-labeller-ds.yaml.j2 | 26 ++++--------------- 7 files changed, 7 insertions(+), 57 deletions(-) diff --git a/functests/06-test-deploy-node-labeller.sh b/functests/06-test-deploy-node-labeller.sh index c9abdf2f..be426f71 100755 --- a/functests/06-test-deploy-node-labeller.sh +++ b/functests/06-test-deploy-node-labeller.sh @@ -14,26 +14,6 @@ oc apply -n ${TEST_NS} -f "${SCRIPTPATH}/node-labeller-unversioned-cr.yaml" || e wait_node_labeller_running ${TEST_NS} 5 60 -for idx in $( seq 1 30); do - echo "Waiting for node-labeller to label nodes" - - number_of_cpu=$( oc get nodes -o json | jq '.items[0].metadata.labels | keys | map(select(startswith("feature.node.kubernetes.io/cpu-model-"))) | length') - number_of_cpu_features=$( oc get nodes -o json | jq '.items[0].metadata.labels | keys | map(select(startswith("feature.node.kubernetes.io/cpu-feature-"))) | length') - - echo "Number of CPU labels: $number_of_cpu" - echo "Number of CPU features: $number_of_cpu_features" - - if [ $number_of_cpu -gt 0 ] && [ $number_of_cpu_features -gt 0 ]; then - RET=0 - break - fi - sleep 2s -done - -if [ $RET -eq 1 ] ; then - exit 2 -fi - #wait for ssp operator to set proper conditions wait_for_condition ${TEST_NS} 5 40 "KubevirtNodeLabellerBundle" "Available" "True" RET="$?" diff --git a/functests/node-labeller-unversioned-cr.yaml b/functests/node-labeller-unversioned-cr.yaml index da6a2e3a..938f536d 100644 --- a/functests/node-labeller-unversioned-cr.yaml +++ b/functests/node-labeller-unversioned-cr.yaml @@ -3,4 +3,3 @@ kind: KubevirtNodeLabellerBundle metadata: name: kubevirt-node-labeller-bundle spec: - useKVM: false diff --git a/manifests/generated/kubevirt-ssp-operator.vVERSION.clusterserviceversion.yaml b/manifests/generated/kubevirt-ssp-operator.vVERSION.clusterserviceversion.yaml index 6cda5de3..ec9a278a 100644 --- a/manifests/generated/kubevirt-ssp-operator.vVERSION.clusterserviceversion.yaml +++ b/manifests/generated/kubevirt-ssp-operator.vVERSION.clusterserviceversion.yaml @@ -2,7 +2,7 @@ apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion metadata: annotations: - alm-examples: '[{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtCommonTemplatesBundle","metadata":{"name":"kubevirt-common-template-bundle"},"spec":{"version":"v0.7.0"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtMetricsAggregation","metadata":{"name":"kubevirt-metrics-aggregation"},"spec":{"version":"v0.0.1"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtNodeLabellerBundle","metadata":{"name":"kubevirt-node-labeller-bundle"},"spec":{"version":"v0.1.1"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtTemplateValidator","metadata":{"name":"kubevirt-template-validator","namespace":"kubevirt"},"spec":{"templateValidatorReplicas":2,"version":"v0.6.2"}}]' + alm-examples: '[{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtTemplateValidator","metadata":{"name":"kubevirt-template-validator","namespace":"kubevirt"},"spec":{"templateValidatorReplicas":2,"version":"v0.6.2"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtCommonTemplatesBundle","metadata":{"name":"kubevirt-common-template-bundle"},"spec":{"version":"v0.7.0"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtMetricsAggregation","metadata":{"name":"kubevirt-metrics-aggregation"},"spec":{"version":"v0.0.1"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtNodeLabellerBundle","metadata":{"name":"kubevirt-node-labeller-bundle"},"spec":{"version":"v0.1.1"}}]' capabilities: Basic Install categories: Openshift Optional containerImage: REPLACE_IMAGE diff --git a/manifests/kubevirt-ssp-operator/latest/kubevirt-ssp-operator.latest.clusterserviceversion.yaml b/manifests/kubevirt-ssp-operator/latest/kubevirt-ssp-operator.latest.clusterserviceversion.yaml index aa8975df..4a13232c 100644 --- a/manifests/kubevirt-ssp-operator/latest/kubevirt-ssp-operator.latest.clusterserviceversion.yaml +++ b/manifests/kubevirt-ssp-operator/latest/kubevirt-ssp-operator.latest.clusterserviceversion.yaml @@ -3,7 +3,7 @@ apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion metadata: annotations: - alm-examples: '[{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtCommonTemplatesBundle","metadata":{"name":"kubevirt-common-template-bundle"},"spec":{"version":"v0.7.0"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtMetricsAggregation","metadata":{"name":"kubevirt-metrics-aggregation"},"spec":{"version":"v0.0.1"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtNodeLabellerBundle","metadata":{"name":"kubevirt-node-labeller-bundle"},"spec":{"version":"v0.1.1"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtTemplateValidator","metadata":{"name":"kubevirt-template-validator","namespace":"kubevirt"},"spec":{"templateValidatorReplicas":2,"version":"v0.6.2"}}]' + alm-examples: '[{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtTemplateValidator","metadata":{"name":"kubevirt-template-validator","namespace":"kubevirt"},"spec":{"templateValidatorReplicas":2,"version":"v0.6.2"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtCommonTemplatesBundle","metadata":{"name":"kubevirt-common-template-bundle"},"spec":{"version":"v0.7.0"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtMetricsAggregation","metadata":{"name":"kubevirt-metrics-aggregation"},"spec":{"version":"v0.0.1"}},{"apiVersion":"ssp.kubevirt.io/v1","kind":"KubevirtNodeLabellerBundle","metadata":{"name":"kubevirt-node-labeller-bundle"},"spec":{"version":"v0.1.1"}}]' capabilities: Basic Install categories: Openshift Optional containerImage: REPLACE_IMAGE diff --git a/pkg/apis/kubevirt/v1/types.go b/pkg/apis/kubevirt/v1/types.go index 86c62ee7..b40335e3 100644 --- a/pkg/apis/kubevirt/v1/types.go +++ b/pkg/apis/kubevirt/v1/types.go @@ -70,7 +70,6 @@ type VersionSpec struct { type ComponentSpec struct { Version string `json:"version,omitempty"` - UseKVM bool `json:"useKVM"` } type TemplateValidatorSpec struct { diff --git a/roles/KubevirtNodeLabeller/tasks/main.yml b/roles/KubevirtNodeLabeller/tasks/main.yml index 1705e073..32898dc2 100644 --- a/roles/KubevirtNodeLabeller/tasks/main.yml +++ b/roles/KubevirtNodeLabeller/tasks/main.yml @@ -17,18 +17,6 @@ definition: "{{ lookup('k8s', kind=nl.result.kind, namespace=nl.result.metadata.namespace, resource_name=nl.result.metadata.name) | from_yaml }}" register: nl_status -- name: Set UseKVM condition - operator_sdk.util.k8s_status: - api_version: ssp.kubevirt.io/v1 - kind: KubevirtNodeLabellerBundle - name: "{{ meta.name }}" - namespace: "{{ meta.namespace }}" - conditions: - - type: KVMSupport - status: "{{ use_kvm }}" - reason: "enabled" - message: "KVM support is enabled." - - name: Set progressing condition operator_sdk.util.k8s_status: api_version: ssp.kubevirt.io/v1 diff --git a/roles/KubevirtNodeLabeller/templates/kubevirt-node-labeller-ds.yaml.j2 b/roles/KubevirtNodeLabeller/templates/kubevirt-node-labeller-ds.yaml.j2 index 367366a2..d028b6c5 100644 --- a/roles/KubevirtNodeLabeller/templates/kubevirt-node-labeller-ds.yaml.j2 +++ b/roles/KubevirtNodeLabeller/templates/kubevirt-node-labeller-ds.yaml.j2 @@ -46,40 +46,24 @@ spec: - name: libvirt image: {{ ssp_registry | default('kubevirt') }}/{{ image_name_prefix }}{{ virt_launcher_image }}{{"@" if virt_launcher_tag.startswith("sha256:") else ":" }}{{ virt_launcher_tag }} command: ["/bin/sh","-c"] -{% if use_kvm %} - args: ["libvirtd -d; chmod o+rw /dev/kvm; virsh domcapabilities --machine q35 --arch x86_64 --virttype kvm > /etc/kubernetes/node-feature-discovery/source.d/virsh_domcapabilities.xml; cp -r /usr/share/libvirt/cpu_map /etc/kubernetes/node-feature-discovery/source.d/"] -{% else %} - args: ["libvirtd -d; virsh domcapabilities --machine q35 --arch x86_64 --virttype qemu > /etc/kubernetes/node-feature-discovery/source.d/virsh_domcapabilities.xml; cp -r /usr/share/libvirt/cpu_map /etc/kubernetes/node-feature-discovery/source.d/"] -{% endif %} + args: ["if [ ! -e /dev/kvm ] && [ $(grep '\\' /proc/misc | wc -l) -eq 0 ]; then echo 'exiting due to missing kvm device'; exit 0; fi; if [ ! -e /dev/kvm ]; then mknod /dev/kvm c 10 $(grep '\\' /proc/misc | cut -f 1 -d' '); fi; libvirtd -d; chmod o+rw /dev/kvm; virsh domcapabilities --machine q35 --arch x86_64 --virttype kvm > /etc/kubernetes/node-feature-discovery/source.d/virsh_domcapabilities.xml; cp -r /usr/share/libvirt/cpu_map /etc/kubernetes/node-feature-discovery/source.d/"] imagePullPolicy: Always -{% if use_kvm %} securityContext: privileged: true - resources: - requests: - devices.kubevirt.io/kvm: "1" - limits: - devices.kubevirt.io/kvm: "1" -{% endif %} volumeMounts: - name: nfd-source mountPath: "/etc/kubernetes/node-feature-discovery/source.d/" - name: kubevirt-node-labeller + securityContext: + privileged: true + command: ["/bin/sh","-c"] + args: ["if [ ! -e /dev/kvm ] && [ $(grep '\\' /proc/misc | wc -l) -eq 0 ]; then echo 'exiting due to missing kvm device'; exit 0; fi; if [ ! -e /dev/kvm ]; then mknod /dev/kvm c 10 $(grep '\\' /proc/misc | cut -f 1 -d' '); fi; ./usr/sbin/node-labeller"] env: - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName image: {{ ssp_registry | default('quay.io/kubevirt') }}/{{ image_name_prefix }}{{ kubevirt_node_labeller_image }}{{"@" if kubevirt_node_labeller_tag.startswith("sha256:") else ":" }}{{ kubevirt_node_labeller_tag }} -{% if use_kvm %} - securityContext: - privileged: true - resources: - requests: - devices.kubevirt.io/kvm: "1" - limits: - devices.kubevirt.io/kvm: "1" -{% endif %} volumeMounts: - name: nfd-source mountPath: "/etc/kubernetes/node-feature-discovery/source.d/"