diff --git a/api/v1beta1/hyperconverged_types.go b/api/v1beta1/hyperconverged_types.go index 6150cc82cb..4e1205a2ed 100644 --- a/api/v1beta1/hyperconverged_types.go +++ b/api/v1beta1/hyperconverged_types.go @@ -195,6 +195,12 @@ type HyperConvergedSpec struct { // The storage class must support RWX in filesystem mode. // +optional VMStateStorageClass *string `json:"vmStateStorageClass,omitempty"` + + // VirtualMachineOptions holds the cluster level information regarding the virtual machine. + // +kubebuilder:default={"disableFreePageReporting": true} + // +default={"disableFreePageReporting": true} + // +optional + VirtualMachineOptions *VirtualMachineOptions `json:"virtualMachineOptions,omitempty"` } // CertRotateConfigCA contains the tunables for TLS certificates. @@ -315,6 +321,18 @@ type LiveMigrationConfigurations struct { AllowPostCopy *bool `json:"allowPostCopy,omitempty"` } +// VirtualMachineOptions holds the cluster level information regarding the virtual machine. +type VirtualMachineOptions struct { + // DisableFreePageReporting disable the free page reporting of + // memory balloon device https://libvirt.org/formatdomain.html#memory-balloon-device. + // This will have effect only if AutoattachMemBalloon is not false and the vmi is not + // requesting any high performance feature (dedicatedCPU/realtime/hugePages), in which free page reporting is always disabled. + // +optional + // +kubebuilder:default=true + // +default=true + DisableFreePageReporting bool `json:"disableFreePageReporting,omitempty"` +} + // HyperConvergedFeatureGates is a set of optional feature gates to enable or disable new features that are not enabled // by default yet. // +k8s:openapi-gen=true @@ -637,7 +655,7 @@ type HyperConverged struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` - // +kubebuilder:default={"certConfig": {"ca": {"duration": "48h0m0s", "renewBefore": "24h0m0s"}, "server": {"duration": "24h0m0s", "renewBefore": "12h0m0s"}}, "featureGates": {"withHostPassthroughCPU": false, "enableCommonBootImageImport": true, "deployTektonTaskResources": false, "deployKubeSecondaryDNS": false, "nonRoot": true}, "liveMigrationConfig": {"completionTimeoutPerGiB": 800, "parallelMigrationsPerCluster": 5, "parallelOutboundMigrationsPerNode": 2, "progressTimeout": 150, "allowAutoConverge": false, "allowPostCopy": false}, "uninstallStrategy": "BlockUninstallIfWorkloadsExist"} + // +kubebuilder:default={"certConfig": {"ca": {"duration": "48h0m0s", "renewBefore": "24h0m0s"}, "server": {"duration": "24h0m0s", "renewBefore": "12h0m0s"}}, "virtualMachineOptions": {"disableFreePageReporting": true}, "featureGates": {"withHostPassthroughCPU": false, "enableCommonBootImageImport": true, "deployTektonTaskResources": false, "deployKubeSecondaryDNS": false, "nonRoot": true}, "liveMigrationConfig": {"completionTimeoutPerGiB": 800, "parallelMigrationsPerCluster": 5, "parallelOutboundMigrationsPerNode": 2, "progressTimeout": 150, "allowAutoConverge": false, "allowPostCopy": false}, "uninstallStrategy": "BlockUninstallIfWorkloadsExist"} // +optional Spec HyperConvergedSpec `json:"spec,omitempty"` Status HyperConvergedStatus `json:"status,omitempty"` diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go index e867ba9e47..0a4f8d3e45 100644 --- a/api/v1beta1/zz_generated.deepcopy.go +++ b/api/v1beta1/zz_generated.deepcopy.go @@ -418,6 +418,11 @@ func (in *HyperConvergedSpec) DeepCopyInto(out *HyperConvergedSpec) { *out = new(string) **out = **in } + if in.VirtualMachineOptions != nil { + in, out := &in.VirtualMachineOptions, &out.VirtualMachineOptions + *out = new(VirtualMachineOptions) + **out = **in + } return } @@ -760,3 +765,19 @@ func (in *Version) DeepCopy() *Version { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VirtualMachineOptions) DeepCopyInto(out *VirtualMachineOptions) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VirtualMachineOptions. +func (in *VirtualMachineOptions) DeepCopy() *VirtualMachineOptions { + if in == nil { + return nil + } + out := new(VirtualMachineOptions) + in.DeepCopyInto(out) + return out +} diff --git a/api/v1beta1/zz_generated.defaults.go b/api/v1beta1/zz_generated.defaults.go index 38a9aa5657..5b6767a513 100644 --- a/api/v1beta1/zz_generated.defaults.go +++ b/api/v1beta1/zz_generated.defaults.go @@ -129,6 +129,16 @@ func SetObjectDefaults_HyperConverged(in *HyperConverged) { if in.Spec.UninstallStrategy == "" { in.Spec.UninstallStrategy = "BlockUninstallIfWorkloadsExist" } + if in.Spec.VirtualMachineOptions == nil { + if err := json.Unmarshal([]byte(`{"disableFreePageReporting": true}`), &in.Spec.VirtualMachineOptions); err != nil { + panic(err) + } + } + if in.Spec.VirtualMachineOptions != nil { + if in.Spec.VirtualMachineOptions.DisableFreePageReporting == false { + in.Spec.VirtualMachineOptions.DisableFreePageReporting = true + } + } } func SetObjectDefaults_HyperConvergedList(in *HyperConvergedList) { diff --git a/api/v1beta1/zz_generated.openapi.go b/api/v1beta1/zz_generated.openapi.go index bcad3be6c4..65c2db3717 100644 --- a/api/v1beta1/zz_generated.openapi.go +++ b/api/v1beta1/zz_generated.openapi.go @@ -505,11 +505,18 @@ func schema_kubevirt_hyperconverged_cluster_operator_api_v1beta1_HyperConvergedS Format: "", }, }, + "virtualMachineOptions": { + SchemaProps: spec.SchemaProps{ + Description: "VirtualMachineOptions holds the cluster level information regarding the virtual machine.", + Default: map[string]interface{}{"disableFreePageReporting": true}, + Ref: ref("github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.VirtualMachineOptions"), + }, + }, }, }, }, Dependencies: []string{ - "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.DataImportCronTemplate", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedCertConfig", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedConfig", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedFeatureGates", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedObsoleteCPUs", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedWorkloadUpdateStrategy", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.LiveMigrationConfigurations", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.LogVerbosityConfiguration", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.MediatedDevicesConfiguration", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.OperandResourceRequirements", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.PermittedHostDevices", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.StorageImportConfig", "github.com/openshift/api/config/v1.TLSSecurityProfile", "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1.FilesystemOverhead"}, + "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.DataImportCronTemplate", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedCertConfig", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedConfig", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedFeatureGates", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedObsoleteCPUs", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedWorkloadUpdateStrategy", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.LiveMigrationConfigurations", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.LogVerbosityConfiguration", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.MediatedDevicesConfiguration", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.OperandResourceRequirements", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.PermittedHostDevices", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.StorageImportConfig", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.VirtualMachineOptions", "github.com/openshift/api/config/v1.TLSSecurityProfile", "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1.FilesystemOverhead"}, } } diff --git a/config/crd/bases/hco.kubevirt.io_hyperconvergeds.yaml b/config/crd/bases/hco.kubevirt.io_hyperconvergeds.yaml index 3d74657c1c..4b015e92ab 100644 --- a/config/crd/bases/hco.kubevirt.io_hyperconvergeds.yaml +++ b/config/crd/bases/hco.kubevirt.io_hyperconvergeds.yaml @@ -65,6 +65,8 @@ spec: parallelOutboundMigrationsPerNode: 2 progressTimeout: 150 uninstallStrategy: BlockUninstallIfWorkloadsExist + virtualMachineOptions: + disableFreePageReporting: true description: HyperConvergedSpec defines the desired state of HyperConverged properties: certConfig: @@ -2540,6 +2542,21 @@ spec: description: VDDK Init Image eventually used to import VMs from external providers type: string + virtualMachineOptions: + default: + disableFreePageReporting: true + description: VirtualMachineOptions holds the cluster level information + regarding the virtual machine. + properties: + disableFreePageReporting: + default: true + description: DisableFreePageReporting disable the free page reporting + of memory balloon device https://libvirt.org/formatdomain.html#memory-balloon-device. + This will have effect only if AutoattachMemBalloon is not false + and the vmi is not requesting any high performance feature (dedicatedCPU/realtime/hugePages), + in which free page reporting is always disabled. + type: boolean + type: object vmStateStorageClass: description: VMStateStorageClass is the name of the storage class to use for the PVCs created to preserve VM state, like TPM. The diff --git a/controllers/operands/kubevirt.go b/controllers/operands/kubevirt.go index f40bfa6ed7..966fdf0507 100644 --- a/controllers/operands/kubevirt.go +++ b/controllers/operands/kubevirt.go @@ -441,6 +441,10 @@ func getKVConfig(hc *hcov1beta1.HyperConverged) (*kubevirtcorev1.KubeVirtConfigu config.VMStateStorageClass = *hc.Spec.VMStateStorageClass } + if hc.Spec.VirtualMachineOptions != nil && hc.Spec.VirtualMachineOptions.DisableFreePageReporting { + config.VirtualMachineOptions = &kubevirtcorev1.VirtualMachineOptions{DisableFreePageReporting: &kubevirtcorev1.DisableFreePageReporting{}} + } + return config, nil } diff --git a/controllers/operands/kubevirt_test.go b/controllers/operands/kubevirt_test.go index 2549b7ca30..776560875c 100644 --- a/controllers/operands/kubevirt_test.go +++ b/controllers/operands/kubevirt_test.go @@ -2797,6 +2797,48 @@ Version: 1.2.3`) }) }) + Context("Virtual machine options", func() { + It("should set disableFreePageReporting by default", func() { + kv, err := NewKubeVirt(hco) + Expect(err).ToNot(HaveOccurred()) + Expect(kv.Spec.Configuration).To(Not(BeNil())) + Expect(kv.Spec.Configuration.VirtualMachineOptions).To(Not(BeNil())) + Expect(kv.Spec.Configuration.VirtualMachineOptions.DisableFreePageReporting).To(Not(BeNil())) + }) + + DescribeTable("should modify disableFreePageReporting according to HCO CR", func(virtualMachineOptions *hcov1beta1.VirtualMachineOptions) { + existingResource, err := NewKubeVirt(hco) + Expect(err).ToNot(HaveOccurred()) + + By("Modify HCO's virtual machine options configuration") + hco.Spec.VirtualMachineOptions = virtualMachineOptions + + cl := commontestutils.InitClient([]client.Object{hco, existingResource}) + handler := (*genericOperand)(newKubevirtHandler(cl, commontestutils.GetScheme())) + res := handler.ensure(req) + Expect(res.UpgradeDone).To(BeFalse()) + Expect(res.Updated).To(BeTrue()) + Expect(res.Err).ToNot(HaveOccurred()) + + foundResource := &kubevirtcorev1.KubeVirt{} + Expect( + cl.Get(context.TODO(), + types.NamespacedName{Name: existingResource.Name, Namespace: existingResource.Namespace}, + foundResource), + ).ToNot(HaveOccurred()) + + Expect(existingResource.Spec.Configuration.VirtualMachineOptions).ToNot(BeNil()) + Expect(existingResource.Spec.Configuration.VirtualMachineOptions.DisableFreePageReporting).ToNot(BeNil()) + + Expect(foundResource.Spec.Configuration.VirtualMachineOptions).To(BeNil()) + + Expect(req.Conditions).To(BeEmpty()) + }, + Entry("with virtualMachineOptions containing disableFreePageReporting false", &hcov1beta1.VirtualMachineOptions{DisableFreePageReporting: false}), + Entry("with empty virtualMachineOptions", &hcov1beta1.VirtualMachineOptions{}), + ) + }) + It("should handle conditions", func() { expectedResource, err := NewKubeVirt(hco, commontestutils.Namespace) Expect(err).ToNot(HaveOccurred()) diff --git a/deploy/crds/hco00.crd.yaml b/deploy/crds/hco00.crd.yaml index 3d74657c1c..4b015e92ab 100644 --- a/deploy/crds/hco00.crd.yaml +++ b/deploy/crds/hco00.crd.yaml @@ -65,6 +65,8 @@ spec: parallelOutboundMigrationsPerNode: 2 progressTimeout: 150 uninstallStrategy: BlockUninstallIfWorkloadsExist + virtualMachineOptions: + disableFreePageReporting: true description: HyperConvergedSpec defines the desired state of HyperConverged properties: certConfig: @@ -2540,6 +2542,21 @@ spec: description: VDDK Init Image eventually used to import VMs from external providers type: string + virtualMachineOptions: + default: + disableFreePageReporting: true + description: VirtualMachineOptions holds the cluster level information + regarding the virtual machine. + properties: + disableFreePageReporting: + default: true + description: DisableFreePageReporting disable the free page reporting + of memory balloon device https://libvirt.org/formatdomain.html#memory-balloon-device. + This will have effect only if AutoattachMemBalloon is not false + and the vmi is not requesting any high performance feature (dedicatedCPU/realtime/hugePages), + in which free page reporting is always disabled. + type: boolean + type: object vmStateStorageClass: description: VMStateStorageClass is the name of the storage class to use for the PVCs created to preserve VM state, like TPM. The diff --git a/deploy/hco.cr.yaml b/deploy/hco.cr.yaml index 463af1c2e5..f2d1e6bf48 100644 --- a/deploy/hco.cr.yaml +++ b/deploy/hco.cr.yaml @@ -28,6 +28,8 @@ spec: parallelOutboundMigrationsPerNode: 2 progressTimeout: 150 uninstallStrategy: BlockUninstallIfWorkloadsExist + virtualMachineOptions: + disableFreePageReporting: true workloadUpdateStrategy: batchEvictionInterval: 1m0s batchEvictionSize: 10 diff --git a/deploy/index-image/community-kubevirt-hyperconverged/1.10.0/manifests/hco00.crd.yaml b/deploy/index-image/community-kubevirt-hyperconverged/1.10.0/manifests/hco00.crd.yaml index 3d74657c1c..4b015e92ab 100644 --- a/deploy/index-image/community-kubevirt-hyperconverged/1.10.0/manifests/hco00.crd.yaml +++ b/deploy/index-image/community-kubevirt-hyperconverged/1.10.0/manifests/hco00.crd.yaml @@ -65,6 +65,8 @@ spec: parallelOutboundMigrationsPerNode: 2 progressTimeout: 150 uninstallStrategy: BlockUninstallIfWorkloadsExist + virtualMachineOptions: + disableFreePageReporting: true description: HyperConvergedSpec defines the desired state of HyperConverged properties: certConfig: @@ -2540,6 +2542,21 @@ spec: description: VDDK Init Image eventually used to import VMs from external providers type: string + virtualMachineOptions: + default: + disableFreePageReporting: true + description: VirtualMachineOptions holds the cluster level information + regarding the virtual machine. + properties: + disableFreePageReporting: + default: true + description: DisableFreePageReporting disable the free page reporting + of memory balloon device https://libvirt.org/formatdomain.html#memory-balloon-device. + This will have effect only if AutoattachMemBalloon is not false + and the vmi is not requesting any high performance feature (dedicatedCPU/realtime/hugePages), + in which free page reporting is always disabled. + type: boolean + type: object vmStateStorageClass: description: VMStateStorageClass is the name of the storage class to use for the PVCs created to preserve VM state, like TPM. The diff --git a/deploy/olm-catalog/community-kubevirt-hyperconverged/1.10.0/manifests/hco00.crd.yaml b/deploy/olm-catalog/community-kubevirt-hyperconverged/1.10.0/manifests/hco00.crd.yaml index 3d74657c1c..4b015e92ab 100644 --- a/deploy/olm-catalog/community-kubevirt-hyperconverged/1.10.0/manifests/hco00.crd.yaml +++ b/deploy/olm-catalog/community-kubevirt-hyperconverged/1.10.0/manifests/hco00.crd.yaml @@ -65,6 +65,8 @@ spec: parallelOutboundMigrationsPerNode: 2 progressTimeout: 150 uninstallStrategy: BlockUninstallIfWorkloadsExist + virtualMachineOptions: + disableFreePageReporting: true description: HyperConvergedSpec defines the desired state of HyperConverged properties: certConfig: @@ -2540,6 +2542,21 @@ spec: description: VDDK Init Image eventually used to import VMs from external providers type: string + virtualMachineOptions: + default: + disableFreePageReporting: true + description: VirtualMachineOptions holds the cluster level information + regarding the virtual machine. + properties: + disableFreePageReporting: + default: true + description: DisableFreePageReporting disable the free page reporting + of memory balloon device https://libvirt.org/formatdomain.html#memory-balloon-device. + This will have effect only if AutoattachMemBalloon is not false + and the vmi is not requesting any high performance feature (dedicatedCPU/realtime/hugePages), + in which free page reporting is always disabled. + type: boolean + type: object vmStateStorageClass: description: VMStateStorageClass is the name of the storage class to use for the PVCs created to preserve VM state, like TPM. The diff --git a/docs/api.md b/docs/api.md index 0b253dcbd0..0bb79047ec 100644 --- a/docs/api.md +++ b/docs/api.md @@ -30,6 +30,7 @@ This Document documents the types introduced by the hyperconverged-cluster-opera * [PermittedHostDevices](#permittedhostdevices) * [StorageImportConfig](#storageimportconfig) * [Version](#version) +* [VirtualMachineOptions](#virtualmachineoptions) ## CertRotateConfigCA @@ -94,7 +95,7 @@ HyperConverged is the Schema for the hyperconvergeds API | Field | Description | Scheme | Default | Required | | ----- | ----------- | ------ | -------- |-------- | | metadata | | [metav1.ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#objectmeta-v1-meta) | | false | -| spec | | [HyperConvergedSpec](#hyperconvergedspec) | {"certConfig": {"ca": {"duration": "48h0m0s", "renewBefore": "24h0m0s"}, "server": {"duration": "24h0m0s", "renewBefore": "12h0m0s"}}, "featureGates": {"withHostPassthroughCPU": false, "enableCommonBootImageImport": true, "deployTektonTaskResources": false, "deployKubeSecondaryDNS": false, "nonRoot": true}, "liveMigrationConfig": {"completionTimeoutPerGiB": 800, "parallelMigrationsPerCluster": 5, "parallelOutboundMigrationsPerNode": 2, "progressTimeout": 150, "allowAutoConverge": false, "allowPostCopy": false}, "uninstallStrategy": "BlockUninstallIfWorkloadsExist"} | false | +| spec | | [HyperConvergedSpec](#hyperconvergedspec) | {"certConfig": {"ca": {"duration": "48h0m0s", "renewBefore": "24h0m0s"}, "server": {"duration": "24h0m0s", "renewBefore": "12h0m0s"}}, "virtualMachineOptions": {"disableFreePageReporting": true}, "featureGates": {"withHostPassthroughCPU": false, "enableCommonBootImageImport": true, "deployTektonTaskResources": false, "deployKubeSecondaryDNS": false, "nonRoot": true}, "liveMigrationConfig": {"completionTimeoutPerGiB": 800, "parallelMigrationsPerCluster": 5, "parallelOutboundMigrationsPerNode": 2, "progressTimeout": 150, "allowAutoConverge": false, "allowPostCopy": false}, "uninstallStrategy": "BlockUninstallIfWorkloadsExist"} | false | | status | | [HyperConvergedStatus](#hyperconvergedstatus) | | false | [Back to TOC](#table-of-contents) @@ -192,6 +193,7 @@ HyperConvergedSpec defines the desired state of HyperConverged | kubeSecondaryDNSNameServerIP | KubeSecondaryDNSNameServerIP defines name server IP used by KubeSecondaryDNS | *string | | false | | evictionStrategy | EvictionStrategy defines at the cluster level if the VirtualMachineInstance should be migrated instead of shut-off in case of a node drain. If the VirtualMachineInstance specific field is set it overrides the cluster level one. Defaults to LiveMigrate with multiple worker nodes, None on single worker clusters. | *v1.EvictionStrategy | | false | | vmStateStorageClass | VMStateStorageClass is the name of the storage class to use for the PVCs created to preserve VM state, like TPM. The storage class must support RWX in filesystem mode. | *string | | false | +| virtualMachineOptions | VirtualMachineOptions holds the cluster level information regarding the virtual machine. | *[VirtualMachineOptions](#virtualmachineoptions) | {"disableFreePageReporting": true} | false | [Back to TOC](#table-of-contents) @@ -341,3 +343,13 @@ StorageImportConfig contains configuration for importing containerized data | version | | string | | false | [Back to TOC](#table-of-contents) + +## VirtualMachineOptions + +VirtualMachineOptions holds the cluster level information regarding the virtual machine. + +| Field | Description | Scheme | Default | Required | +| ----- | ----------- | ------ | -------- |-------- | +| disableFreePageReporting | DisableFreePageReporting disable the free page reporting of memory balloon device https://libvirt.org/formatdomain.html#memory-balloon-device. This will have effect only if AutoattachMemBalloon is not false and the vmi is not requesting any high performance feature (dedicatedCPU/realtime/hugePages), in which free page reporting is always disabled. | bool | true | false | + +[Back to TOC](#table-of-contents) diff --git a/docs/cluster-configuration.md b/docs/cluster-configuration.md index 42185f86ca..38858b7ea5 100644 --- a/docs/cluster-configuration.md +++ b/docs/cluster-configuration.md @@ -862,6 +862,33 @@ spec: vmStateStorageClass: "rook-cephfs" ``` +## Virtual machine options + +`VirtualMachineOptions` holds the cluster level information regarding the virtual machine. +This defines the default behavior of some features related to the virtual machines. +- `DisableFreePageReporting` + With freePageReporting the guest OS informs the hypervisor about pages which are not +in use by the guest anymore. The hypervisor can use this information for freeing these pages. + + freePageReporting is an attribute that can be defined at [Memory balloon device](https://libvirt.org/formatdomain.html#memory-balloon-device) +in libvirt. freePageReporting will NOT be enabled for the vmis which does not have the Memballoon driver, +OR which are requesting any high performance components. A vmi is considered as high performance if one of the following is true: + - the vmi requests a dedicated cpu. + - the realtime flag is enabled. + - the vmi requests hugepages. + + With `DisableFreePageReporting` freePageReporting will never be enabled in any vmi. +`DisableFreePageReporting` is a boolean and freePageReporting is disabled by default. + +Example +```yaml +kind: HyperConverged +metadata: + name: kubevirt-hyperconverged +spec: + virtualMachineOptions: + disableFreePageReporting: true +``` ## Hyperconverged Kubevirt cluster-wide Crypto Policy API Starting from OCP/OKD 4.6, a [cluster-wide API](https://github.com/openshift/enhancements/blob/master/enhancements/kube-apiserver/tls-config.md) is available for cluster administrators to set TLS profiles for OCP/OKD core components. diff --git a/tests/func-tests/defaults_test.go b/tests/func-tests/defaults_test.go index fabac55fcf..770b1b3a7f 100644 --- a/tests/func-tests/defaults_test.go +++ b/tests/func-tests/defaults_test.go @@ -199,4 +199,28 @@ var _ = Describe("Check Default values", Label("defaults"), Serial, func() { Entry("when removing /spec", "/spec"), ) }) + + Context("virtualMachineOptions defaults", func() { + defaultVirtualMachineOptions := v1beta1.VirtualMachineOptions{ + DisableFreePageReporting: true, + } + + DescribeTable("Check that virtualMachineOptions default is behaving as expected", func(path string) { + restoreDefaults(cli) + + patch := []byte(fmt.Sprintf(removePathPatchTmplt, path)) + Eventually(func() error { + return tests.PatchHCO(ctx, cli, patch) + }).WithTimeout(2 * time.Second).WithPolling(500 * time.Millisecond).Should(Succeed()) + + Eventually(func(g Gomega) { + hc := tests.GetHCO(ctx, cli) + g.Expect(*hc.Spec.VirtualMachineOptions).Should(Equal(defaultVirtualMachineOptions), "virtualMachineOptions should be equal to default") + }).WithTimeout(2 * time.Second).WithPolling(100 * time.Millisecond).Should(Succeed()) + }, + Entry("when removing /spec/virtualMachineOptions/disableFreePageReporting", "/spec/virtualMachineOptions/disableFreePageReporting"), + Entry("when removing /spec/virtualMachineOptions", "/spec/virtualMachineOptions"), + Entry("when removing /spec", "/spec"), + ) + }) }) diff --git a/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/hyperconverged_types.go b/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/hyperconverged_types.go index 6150cc82cb..4e1205a2ed 100644 --- a/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/hyperconverged_types.go +++ b/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/hyperconverged_types.go @@ -195,6 +195,12 @@ type HyperConvergedSpec struct { // The storage class must support RWX in filesystem mode. // +optional VMStateStorageClass *string `json:"vmStateStorageClass,omitempty"` + + // VirtualMachineOptions holds the cluster level information regarding the virtual machine. + // +kubebuilder:default={"disableFreePageReporting": true} + // +default={"disableFreePageReporting": true} + // +optional + VirtualMachineOptions *VirtualMachineOptions `json:"virtualMachineOptions,omitempty"` } // CertRotateConfigCA contains the tunables for TLS certificates. @@ -315,6 +321,18 @@ type LiveMigrationConfigurations struct { AllowPostCopy *bool `json:"allowPostCopy,omitempty"` } +// VirtualMachineOptions holds the cluster level information regarding the virtual machine. +type VirtualMachineOptions struct { + // DisableFreePageReporting disable the free page reporting of + // memory balloon device https://libvirt.org/formatdomain.html#memory-balloon-device. + // This will have effect only if AutoattachMemBalloon is not false and the vmi is not + // requesting any high performance feature (dedicatedCPU/realtime/hugePages), in which free page reporting is always disabled. + // +optional + // +kubebuilder:default=true + // +default=true + DisableFreePageReporting bool `json:"disableFreePageReporting,omitempty"` +} + // HyperConvergedFeatureGates is a set of optional feature gates to enable or disable new features that are not enabled // by default yet. // +k8s:openapi-gen=true @@ -637,7 +655,7 @@ type HyperConverged struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` - // +kubebuilder:default={"certConfig": {"ca": {"duration": "48h0m0s", "renewBefore": "24h0m0s"}, "server": {"duration": "24h0m0s", "renewBefore": "12h0m0s"}}, "featureGates": {"withHostPassthroughCPU": false, "enableCommonBootImageImport": true, "deployTektonTaskResources": false, "deployKubeSecondaryDNS": false, "nonRoot": true}, "liveMigrationConfig": {"completionTimeoutPerGiB": 800, "parallelMigrationsPerCluster": 5, "parallelOutboundMigrationsPerNode": 2, "progressTimeout": 150, "allowAutoConverge": false, "allowPostCopy": false}, "uninstallStrategy": "BlockUninstallIfWorkloadsExist"} + // +kubebuilder:default={"certConfig": {"ca": {"duration": "48h0m0s", "renewBefore": "24h0m0s"}, "server": {"duration": "24h0m0s", "renewBefore": "12h0m0s"}}, "virtualMachineOptions": {"disableFreePageReporting": true}, "featureGates": {"withHostPassthroughCPU": false, "enableCommonBootImageImport": true, "deployTektonTaskResources": false, "deployKubeSecondaryDNS": false, "nonRoot": true}, "liveMigrationConfig": {"completionTimeoutPerGiB": 800, "parallelMigrationsPerCluster": 5, "parallelOutboundMigrationsPerNode": 2, "progressTimeout": 150, "allowAutoConverge": false, "allowPostCopy": false}, "uninstallStrategy": "BlockUninstallIfWorkloadsExist"} // +optional Spec HyperConvergedSpec `json:"spec,omitempty"` Status HyperConvergedStatus `json:"status,omitempty"` diff --git a/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.deepcopy.go b/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.deepcopy.go index e867ba9e47..0a4f8d3e45 100644 --- a/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.deepcopy.go +++ b/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.deepcopy.go @@ -418,6 +418,11 @@ func (in *HyperConvergedSpec) DeepCopyInto(out *HyperConvergedSpec) { *out = new(string) **out = **in } + if in.VirtualMachineOptions != nil { + in, out := &in.VirtualMachineOptions, &out.VirtualMachineOptions + *out = new(VirtualMachineOptions) + **out = **in + } return } @@ -760,3 +765,19 @@ func (in *Version) DeepCopy() *Version { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VirtualMachineOptions) DeepCopyInto(out *VirtualMachineOptions) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VirtualMachineOptions. +func (in *VirtualMachineOptions) DeepCopy() *VirtualMachineOptions { + if in == nil { + return nil + } + out := new(VirtualMachineOptions) + in.DeepCopyInto(out) + return out +} diff --git a/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.defaults.go b/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.defaults.go index 38a9aa5657..5b6767a513 100644 --- a/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.defaults.go +++ b/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.defaults.go @@ -129,6 +129,16 @@ func SetObjectDefaults_HyperConverged(in *HyperConverged) { if in.Spec.UninstallStrategy == "" { in.Spec.UninstallStrategy = "BlockUninstallIfWorkloadsExist" } + if in.Spec.VirtualMachineOptions == nil { + if err := json.Unmarshal([]byte(`{"disableFreePageReporting": true}`), &in.Spec.VirtualMachineOptions); err != nil { + panic(err) + } + } + if in.Spec.VirtualMachineOptions != nil { + if in.Spec.VirtualMachineOptions.DisableFreePageReporting == false { + in.Spec.VirtualMachineOptions.DisableFreePageReporting = true + } + } } func SetObjectDefaults_HyperConvergedList(in *HyperConvergedList) { diff --git a/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.openapi.go b/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.openapi.go index bcad3be6c4..65c2db3717 100644 --- a/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.openapi.go +++ b/tests/vendor/github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1/zz_generated.openapi.go @@ -505,11 +505,18 @@ func schema_kubevirt_hyperconverged_cluster_operator_api_v1beta1_HyperConvergedS Format: "", }, }, + "virtualMachineOptions": { + SchemaProps: spec.SchemaProps{ + Description: "VirtualMachineOptions holds the cluster level information regarding the virtual machine.", + Default: map[string]interface{}{"disableFreePageReporting": true}, + Ref: ref("github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.VirtualMachineOptions"), + }, + }, }, }, }, Dependencies: []string{ - "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.DataImportCronTemplate", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedCertConfig", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedConfig", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedFeatureGates", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedObsoleteCPUs", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedWorkloadUpdateStrategy", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.LiveMigrationConfigurations", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.LogVerbosityConfiguration", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.MediatedDevicesConfiguration", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.OperandResourceRequirements", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.PermittedHostDevices", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.StorageImportConfig", "github.com/openshift/api/config/v1.TLSSecurityProfile", "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1.FilesystemOverhead"}, + "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.DataImportCronTemplate", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedCertConfig", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedConfig", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedFeatureGates", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedObsoleteCPUs", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.HyperConvergedWorkloadUpdateStrategy", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.LiveMigrationConfigurations", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.LogVerbosityConfiguration", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.MediatedDevicesConfiguration", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.OperandResourceRequirements", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.PermittedHostDevices", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.StorageImportConfig", "github.com/kubevirt/hyperconverged-cluster-operator/api/v1beta1.VirtualMachineOptions", "github.com/openshift/api/config/v1.TLSSecurityProfile", "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1.FilesystemOverhead"}, } }