diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/sync_kvvm.go b/images/virtualization-artifact/pkg/controller/vm/internal/sync_kvvm.go index 987181891f..6fb7a312e5 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/sync_kvvm.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/sync_kvvm.go @@ -303,7 +303,11 @@ func (h *SyncKvvmHandler) syncKVVM(ctx context.Context, s state.VirtualMachineSt if err != nil { return false, fmt.Errorf("detect changes on the stopped internal virtual machine: %w", err) } - if hasVMChanges { + hasVMClassChanges, err := h.detectVMClassSpecChanges(ctx, s) + if err != nil { + return false, fmt.Errorf("detect changes on the stopped internal virtual machine: %w", err) + } + if hasVMChanges || hasVMClassChanges { err := h.updateKVVM(ctx, s) if err != nil { return false, fmt.Errorf("update stopped internal virtual machine: %w", err) @@ -571,6 +575,21 @@ func (h *SyncKvvmHandler) detectVMSpecChanges(ctx context.Context, s state.Virtu return currentKvvm.Annotations[annotations.AnnVMLastAppliedSpec] != newKvvm.Annotations[annotations.AnnVMLastAppliedSpec], nil } +// detectVMClassSpecChanges returns true and no error if specification has changes. +func (h *SyncKvvmHandler) detectVMClassSpecChanges(ctx context.Context, s state.VirtualMachineState) (bool, error) { + currentKvvm, err := s.KVVM(ctx) + if err != nil { + return false, err + } + + newKvvm, err := MakeKVVMFromVMSpec(ctx, s) + if err != nil { + return false, err + } + + return currentKvvm.Annotations[annotations.AnnVMClassLastAppliedSpec] != newKvvm.Annotations[annotations.AnnVMClassLastAppliedSpec], nil +} + // canApplyChanges returns true if changes can be applied right now. // // Wait if changes are disruptive, and approval mode is manual, and VM is still running.