Skip to content

Commit

Permalink
webhooks: remove validation for using mem limits with mem hotplug
Browse files Browse the repository at this point in the history
Signed-off-by: Antonio Cardace <[email protected]>
  • Loading branch information
acardace committed Mar 11, 2024
1 parent 4179837 commit 7ddc066
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ go_test(
"//vendor/k8s.io/client-go/testing:go_default_library",
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
"//vendor/k8s.io/utils/pointer:go_default_library",
"//vendor/k8s.io/utils/ptr:go_default_library",
"//vendor/kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1:go_default_library",
],
)
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ func ValidateVirtualMachineInstanceSpec(field *k8sfield.Path, spec *v1.VirtualMa
causes = append(causes, validateMemoryRequestsNegativeOrNull(field, spec)...)
causes = append(causes, validateMemoryLimitsNegativeOrNull(field, spec)...)
causes = append(causes, validateHugepagesMemoryRequests(field, spec)...)
causes = append(causes, validateGuestMemoryLimit(field, spec)...)
causes = append(causes, validateGuestMemoryLimit(field, spec, config)...)
causes = append(causes, validateEmulatedMachine(field, spec, config)...)
causes = append(causes, validateFirmwareSerial(field, spec)...)
causes = append(causes, validateCPURequestNotNegative(field, spec)...)
Expand Down Expand Up @@ -1378,7 +1378,11 @@ func validateEmulatedMachine(field *k8sfield.Path, spec *v1.VirtualMachineInstan
return causes
}

func validateGuestMemoryLimit(field *k8sfield.Path, spec *v1.VirtualMachineInstanceSpec) (causes []metav1.StatusCause) {
func validateGuestMemoryLimit(field *k8sfield.Path, spec *v1.VirtualMachineInstanceSpec, config *virtconfig.ClusterConfig) (causes []metav1.StatusCause) {
if config.IsVMRolloutStrategyLiveUpdate() {
return
}

if spec.Domain.Memory != nil && spec.Domain.Memory.Guest != nil {
limits := spec.Domain.Resources.Limits.Memory().Value()
guest := spec.Domain.Memory.Guest.Value()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import (
"k8s.io/apimachinery/pkg/util/validation"
k8sfield "k8s.io/apimachinery/pkg/util/validation/field"
"k8s.io/utils/pointer"
"k8s.io/utils/ptr"

v1 "kubevirt.io/api/core/v1"

Expand Down Expand Up @@ -876,6 +877,23 @@ var _ = Describe("Validating VMICreate Admitter", func() {
Expect(causes).To(HaveLen(1))
Expect(causes[0].Field).To(Equal("fake.domain.memory.guest"))
})
It("should allow bigger guest memory than the memory limit if vmRolloutStrategy is set to LiveUpdate", func() {
kvConfig := kv.DeepCopy()
kvConfig.Spec.Configuration.DeveloperConfiguration.FeatureGates = []string{virtconfig.VMLiveUpdateFeaturesGate}
kvConfig.Spec.Configuration.VMRolloutStrategy = ptr.To(v1.VMRolloutStrategyLiveUpdate)
testutils.UpdateFakeKubeVirtClusterConfig(kvInformer, kvConfig)

vmi := api.NewMinimalVMI("testvmi")
guestMemory := resource.MustParse("128Mi")

vmi.Spec.Domain.Resources.Limits = k8sv1.ResourceList{
k8sv1.ResourceMemory: resource.MustParse("64Mi"),
}
vmi.Spec.Domain.Memory = &v1.Memory{Guest: &guestMemory}

causes := ValidateVirtualMachineInstanceSpec(k8sfield.NewPath("fake"), &vmi.Spec, config)
Expect(causes).To(BeEmpty())
})
It("should allow guest memory which is between requests and limits", func() {
vmi := api.NewMinimalVMI("testvmi")
guestMemory := resource.MustParse("100Mi")
Expand Down
13 changes: 0 additions & 13 deletions pkg/virt-api/webhooks/validating-webhook/admitters/vms-admitter.go
Original file line number Diff line number Diff line change
Expand Up @@ -470,14 +470,6 @@ func validateLiveUpdateCPU(field *k8sfield.Path, domain *v1.DomainSpec) (causes
}

func validateLiveUpdateMemory(field *k8sfield.Path, domain *v1.DomainSpec, architecture string) (causes []metav1.StatusCause) {
if hasMemoryLimits(&domain.Resources) {
causes = append(causes, metav1.StatusCause{
Type: metav1.CauseTypeFieldValueInvalid,
Message: fmt.Sprintf("Configuration of Memory limits is not allowed when Memory live update is enabled"),
Field: field.Child("template", "spec", "domain", "resources").String(),
})
}

if domain.CPU != nil &&
domain.CPU.Realtime != nil {
causes = append(causes, metav1.StatusCause{
Expand Down Expand Up @@ -819,8 +811,3 @@ func hasCPURequestsOrLimits(rr *v1.ResourceRequirements) bool {

return false
}

func hasMemoryLimits(rr *v1.ResourceRequirements) bool {
_, ok := rr.Limits[corev1.ResourceMemory]
return ok
}
Original file line number Diff line number Diff line change
Expand Up @@ -1928,14 +1928,6 @@ var _ = Describe("Validating VM Admitter", func() {
Expect(response.Allowed).To(BeFalse())
Expect(response.Result.Details.Causes).To(ContainElement(cause))
},
Entry("resource limits are configured", func(vm *v1.VirtualMachine) {
vm.Spec.Template.Spec.Domain.Resources.Limits = make(k8sv1.ResourceList)
vm.Spec.Template.Spec.Domain.Resources.Limits[k8sv1.ResourceMemory] = resource.MustParse("128Mi")
}, metav1.StatusCause{
Type: metav1.CauseTypeFieldValueInvalid,
Field: "spec.template.spec.domain.resources",
Message: "Configuration of Memory limits is not allowed when Memory live update is enabled",
}),
Entry("hugepages is configured", func(vm *v1.VirtualMachine) {
vm.Spec.Template.Spec.Domain.Memory.Hugepages = &v1.Hugepages{
PageSize: "2Mi",
Expand Down

0 comments on commit 7ddc066

Please sign in to comment.