From a7d4dd7a5df828aa42453dc35aee2bf87593307d Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 13 Jan 2026 16:20:36 +0200 Subject: [PATCH 1/4] feat(api): add quota discount for virt-launcher Signed-off-by: Daniil Antoshin --- .../pkg/common/annotations/annotations.go | 4 ++++ .../pkg/controller/vm/internal/sync_metadata.go | 2 ++ 2 files changed, 6 insertions(+) diff --git a/images/virtualization-artifact/pkg/common/annotations/annotations.go b/images/virtualization-artifact/pkg/common/annotations/annotations.go index 64af0ead86..31e7e8d883 100644 --- a/images/virtualization-artifact/pkg/common/annotations/annotations.go +++ b/images/virtualization-artifact/pkg/common/annotations/annotations.go @@ -175,6 +175,10 @@ const ( QuotaExcludeValue = "true" // QuotaExcludeLabel provides a constant for exclude quota label. QuotaExcludeLabel = "resource-quota-overrides.deckhouse.io/ignore" + // AnnQuotaDiscountCPU provides a constant for discount CPU from quota annotation. + AnnQuotaDiscountCPU = "resource-quota-overrides.deckhouse.io/discount-cpu" + // AnnQuotaDiscountMemory provides a constant for discount Memory from quota annotation. + AnnQuotaDiscountMemory = "resource-quota-overrides.deckhouse.io/discount-memory" // InhibitNodeShutdownLabel is a label to prevent node shutdown is Pod with label is present. InhibitNodeShutdownLabel = "pod.deckhouse.io/inhibit-node-shutdown" diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/sync_metadata.go b/images/virtualization-artifact/pkg/controller/vm/internal/sync_metadata.go index 7c2cb40094..9ff71a07db 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/sync_metadata.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/sync_metadata.go @@ -165,6 +165,8 @@ func PropagateVMMetadata(vm *v1alpha2.VirtualMachine, kvvm *virtv1.VirtualMachin vm.GetLabels(), map[string]string{ annotations.InhibitNodeShutdownLabel: "", + annotations.AnnQuotaDiscountCPU: vm.Status.Resources.CPU.RuntimeOverhead.String(), + annotations.AnnQuotaDiscountMemory: vm.Status.Resources.Memory.RuntimeOverhead.String(), }, ) newLabels, labelsChanged := merger.ApplyMapChanges(destObj.GetLabels(), lastPropagatedLabels, propagateLabels) From 6414d152b811c21c7b8f863fdcd311084a9f828f Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Thu, 15 Jan 2026 07:24:25 +0200 Subject: [PATCH 2/4] test Signed-off-by: Daniil Antoshin --- images/virt-artifact/werf.inc.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/images/virt-artifact/werf.inc.yaml b/images/virt-artifact/werf.inc.yaml index 50ef78fb33..bc91d72a54 100644 --- a/images/virt-artifact/werf.inc.yaml +++ b/images/virt-artifact/werf.inc.yaml @@ -2,7 +2,7 @@ # Source https://github.com/kubevirt/kubevirt/blob/v1.3.1/hack/dockerized#L15 {{- $gitRepoName := "3p-kubevirt" }} {{- $gitRepoUrl := (printf "%s/%s" "deckhouse" $gitRepoName) }} -{{- $tag := get $.Core $gitRepoName }} +{{- $tag := "feat/core/virt-launcher-quota-exclude" }} {{- $version := (split "-" $tag)._0 }} --- @@ -13,8 +13,10 @@ secrets: - id: SOURCE_REPO value: {{ $.SOURCE_REPO }} shell: + installCacheVersion: "{{ now | date "Mon Jan 2 15:04:05 MST 2006" }}" install: - | + echo "$date" echo "Git clone {{ $gitRepoName }} repository..." git clone --depth=1 $(cat /run/secrets/SOURCE_REPO)/{{ $gitRepoUrl }} --branch {{ $tag }} /src/kubevirt From 02200cbc0dc01d9dfe9a9463ccbd71bb395f63e4 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Thu, 15 Jan 2026 09:23:26 +0200 Subject: [PATCH 3/4] fix ann Signed-off-by: Daniil Antoshin --- .../pkg/common/annotations/annotations.go | 8 ++++---- .../pkg/controller/vm/internal/sync_metadata.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/images/virtualization-artifact/pkg/common/annotations/annotations.go b/images/virtualization-artifact/pkg/common/annotations/annotations.go index 31e7e8d883..420f530e5c 100644 --- a/images/virtualization-artifact/pkg/common/annotations/annotations.go +++ b/images/virtualization-artifact/pkg/common/annotations/annotations.go @@ -175,10 +175,10 @@ const ( QuotaExcludeValue = "true" // QuotaExcludeLabel provides a constant for exclude quota label. QuotaExcludeLabel = "resource-quota-overrides.deckhouse.io/ignore" - // AnnQuotaDiscountCPU provides a constant for discount CPU from quota annotation. - AnnQuotaDiscountCPU = "resource-quota-overrides.deckhouse.io/discount-cpu" - // AnnQuotaDiscountMemory provides a constant for discount Memory from quota annotation. - AnnQuotaDiscountMemory = "resource-quota-overrides.deckhouse.io/discount-memory" + // QuotaDiscountCPU provides a constant for discount CPU from quota annotation. + QuotaDiscountCPU = "resource-quota-overrides.deckhouse.io/discount-cpu" + // QuotaDiscountMemory provides a constant for discount Memory from quota annotation. + QuotaDiscountMemory = "resource-quota-overrides.deckhouse.io/discount-memory" // InhibitNodeShutdownLabel is a label to prevent node shutdown is Pod with label is present. InhibitNodeShutdownLabel = "pod.deckhouse.io/inhibit-node-shutdown" diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/sync_metadata.go b/images/virtualization-artifact/pkg/controller/vm/internal/sync_metadata.go index 9ff71a07db..f0d8b73642 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/sync_metadata.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/sync_metadata.go @@ -165,8 +165,8 @@ func PropagateVMMetadata(vm *v1alpha2.VirtualMachine, kvvm *virtv1.VirtualMachin vm.GetLabels(), map[string]string{ annotations.InhibitNodeShutdownLabel: "", - annotations.AnnQuotaDiscountCPU: vm.Status.Resources.CPU.RuntimeOverhead.String(), - annotations.AnnQuotaDiscountMemory: vm.Status.Resources.Memory.RuntimeOverhead.String(), + annotations.QuotaDiscountCPU: vm.Status.Resources.CPU.RuntimeOverhead.String(), + annotations.QuotaDiscountMemory: vm.Status.Resources.Memory.RuntimeOverhead.String(), }, ) newLabels, labelsChanged := merger.ApplyMapChanges(destObj.GetLabels(), lastPropagatedLabels, propagateLabels) From 872f7546f119e1e01a87bed45d1ec4faf15be171 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Thu, 15 Jan 2026 11:18:33 +0200 Subject: [PATCH 4/4] upd Signed-off-by: Daniil Antoshin --- .../pkg/controller/vm/internal/migrating.go | 26 ++++++++++++++++++- .../controller/vm/internal/migrating_test.go | 2 +- .../pkg/controller/vm/vm_controller.go | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go b/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go index 310c8b58f7..71f11fab3f 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/migrating.go @@ -26,8 +26,11 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" virtv1 "kubevirt.io/api/core/v1" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" + "github.com/deckhouse/deckhouse/pkg/log" + "github.com/deckhouse/virtualization-controller/pkg/common/annotations" commonvmop "github.com/deckhouse/virtualization-controller/pkg/common/vmop" "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/service" @@ -46,11 +49,13 @@ type migratingVolumesService interface { GetVirtualDiskNamesWithUnreadyTarget(ctx context.Context, s state.VirtualMachineState) ([]string, error) } type MigratingHandler struct { + client client.Client migratingVolumesService migratingVolumesService } -func NewMigratingHandler(migratingVolumesService migratingVolumesService) *MigratingHandler { +func NewMigratingHandler(client client.Client, migratingVolumesService migratingVolumesService) *MigratingHandler { return &MigratingHandler{ + client: client, migratingVolumesService: migratingVolumesService, } } @@ -260,6 +265,25 @@ func (h *MigratingHandler) syncMigrating(ctx context.Context, s state.VirtualMac if liveMigrationSucceeded(vm.Status.MigrationState) { conditions.RemoveCondition(vmcondition.TypeMigrating, &vm.Status.Conditions) + + pod, err := s.Pod(ctx) + if err != nil { + return err + } + + if pod.Name != vm.Status.MigrationState.Target.Pod { + log.Error("Migration target pod is not the same as the pod from status") + return nil + } + + if pod != nil { + delete(pod.Labels, annotations.QuotaExcludeLabel) + err = h.client.Update(ctx, pod) + if err != nil { + return err + } + } + return nil } diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/migrating_test.go b/images/virtualization-artifact/pkg/controller/vm/internal/migrating_test.go index e412ad68c2..7771439ffb 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/migrating_test.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/migrating_test.go @@ -92,7 +92,7 @@ var _ = Describe("MigratingHandler", func() { } reconcile := func() { - h := NewMigratingHandler(vmservice.NewMigrationVolumesService(fakeClient, MakeKVVMFromVMSpec, 10*time.Second)) + h := NewMigratingHandler(fakeClient, vmservice.NewMigrationVolumesService(fakeClient, MakeKVVMFromVMSpec, 10*time.Second)) _, err := h.Handle(ctx, vmState) Expect(err).NotTo(HaveOccurred()) err = resource.Update(context.Background()) diff --git a/images/virtualization-artifact/pkg/controller/vm/vm_controller.go b/images/virtualization-artifact/pkg/controller/vm/vm_controller.go index 1cd2ad4433..5567c91944 100644 --- a/images/virtualization-artifact/pkg/controller/vm/vm_controller.go +++ b/images/virtualization-artifact/pkg/controller/vm/vm_controller.go @@ -76,7 +76,7 @@ func SetupController( internal.NewSyncPowerStateHandler(client, recorder), internal.NewSyncMetadataHandler(client), internal.NewLifeCycleHandler(client, recorder), - internal.NewMigratingHandler(migrateVolumesService), + internal.NewMigratingHandler(client, migrateVolumesService), internal.NewFirmwareHandler(firmwareImage), internal.NewEvictHandler(), internal.NewStatisticHandler(client),