What happens
packages/system/kubevirt/templates/kubevirt-cr.yaml enables seven feature gates. At KubeVirt v1.9.0 five of them are GA: LiveMigration, GPU and AutoResourceLimitsGate were already GA at v1.8.4, ExpandDisks and VMExport became GA in 1.9. IsEnabled in pkg/virt-config/featuregate/feature-gates.go returns true for a GA gate before it reads either list, so those five lines change nothing, and the update webhook emits a warning for each of them whenever the gate lists change. Only CPUManager (Alpha) and HotplugVolumes (Deprecated, kept on purpose, see #4015) still do work.
Why it is not a one-line delete
After #4015 the list lives in three places that have to agree: the rendered featureGates block, the guard's $staticFeatureGates copy at the top of the same template, and one helm-unittest case per gate in tests/kubevirt_cr_test.yaml. The make update insert for extraFeatureGates also anchors on the literal - VMExport line in that block, so dropping VMExport means moving the anchor to whatever line ends the list, in packages/system/kubevirt/Makefile and in tests/update_idempotency_test.sh. The memory that this list is inert tends to surface only at the next bump, which is why it has survived two of them.
Fix shape
Drop the five GA entries from all three places, move the make update anchor to the new last static line, and keep the per-gate cases for the entries that remain. Behaviour on the cluster does not change; the rendered CR gets shorter and the webhook stops warning about them. Check the pinned release's pkg/virt-config/featuregate/inactive.go before deciding what is GA, not the release notes.
What happens
packages/system/kubevirt/templates/kubevirt-cr.yamlenables seven feature gates. At KubeVirt v1.9.0 five of them are GA:LiveMigration,GPUandAutoResourceLimitsGatewere already GA at v1.8.4,ExpandDisksandVMExportbecame GA in 1.9.IsEnabledinpkg/virt-config/featuregate/feature-gates.goreturns true for a GA gate before it reads either list, so those five lines change nothing, and the update webhook emits a warning for each of them whenever the gate lists change. OnlyCPUManager(Alpha) andHotplugVolumes(Deprecated, kept on purpose, see #4015) still do work.Why it is not a one-line delete
After #4015 the list lives in three places that have to agree: the rendered
featureGatesblock, the guard's$staticFeatureGatescopy at the top of the same template, and one helm-unittest case per gate intests/kubevirt_cr_test.yaml. Themake updateinsert forextraFeatureGatesalso anchors on the literal- VMExportline in that block, so droppingVMExportmeans moving the anchor to whatever line ends the list, inpackages/system/kubevirt/Makefileand intests/update_idempotency_test.sh. The memory that this list is inert tends to surface only at the next bump, which is why it has survived two of them.Fix shape
Drop the five GA entries from all three places, move the
make updateanchor to the new last static line, and keep the per-gate cases for the entries that remain. Behaviour on the cluster does not change; the rendered CR gets shorter and the webhook stops warning about them. Check the pinned release'spkg/virt-config/featuregate/inactive.gobefore deciding what is GA, not the release notes.