diff --git a/api/core/v1alpha2/events.go b/api/core/v1alpha2/events.go index c62c6bf098..e2f23a7077 100644 --- a/api/core/v1alpha2/events.go +++ b/api/core/v1alpha2/events.go @@ -61,9 +61,6 @@ const ( // ReasonVMOPStarted is event reason that the operation is started ReasonVMOPStarted = "VirtualMachineOperationStarted" - // ReasonVMClassInUse is event reason that VMClass is used by virtual machine. - ReasonVMClassInUse = "VirtualMachineClassInUse" - // ReasonVDStorageClassWasDeleted is event reason that VDStorageClass was deleted. ReasonVDStorageClassWasDeleted = "VirtualDiskStorageClassWasDeleted" // ReasonVDStorageClassNotFound is event reason that VDStorageClass not found. diff --git a/api/core/v1alpha2/vmclasscondition/condition.go b/api/core/v1alpha2/vmclasscondition/condition.go index 471f76151b..3860bbe722 100644 --- a/api/core/v1alpha2/vmclasscondition/condition.go +++ b/api/core/v1alpha2/vmclasscondition/condition.go @@ -25,6 +25,7 @@ func (t Type) String() string { const ( TypeReady Type = "Ready" TypeDiscovered Type = "Discovered" + TypeInUse Type = "InUse" ) type Reason string @@ -44,4 +45,9 @@ const ( ReasonDiscoverySucceeded Reason = "DiscoverySucceeded" ReasonDiscoverySkip Reason = "DiscoverySkip" ReasonDiscoveryFailed Reason = "DiscoveryFailed" + + // ReasonVMClassInUse is event reason that VMClass is used by virtual machine. + ReasonVMClassInUse Reason = "VirtualMachineClassInUse" + // ReasonVMClassFree is event reason that VMClass not used by virtual machine. + ReasonVMClassFree Reason = "VirtualMachineClassFree" ) diff --git a/images/virtualization-artifact/pkg/controller/vmclass/internal/deletion.go b/images/virtualization-artifact/pkg/controller/vmclass/internal/deletion.go index 4a75a1b28c..fc506873f2 100644 --- a/images/virtualization-artifact/pkg/controller/vmclass/internal/deletion.go +++ b/images/virtualization-artifact/pkg/controller/vmclass/internal/deletion.go @@ -21,16 +21,18 @@ import ( "fmt" "time" - corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/deckhouse/deckhouse/pkg/log" "github.com/deckhouse/virtualization-controller/pkg/common/object" + "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/vmclass/internal/state" "github.com/deckhouse/virtualization-controller/pkg/eventrecord" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" + "github.com/deckhouse/virtualization/api/core/v1alpha2/vmclasscondition" ) const nameDeletionHandler = "DeletionHandler" @@ -58,15 +60,28 @@ func (h *DeletionHandler) Handle(ctx context.Context, s state.VirtualMachineClas controllerutil.AddFinalizer(changed, virtv2.FinalizerVMCleanup) return reconcile.Result{}, nil } + cb := conditions.NewConditionBuilder(vmclasscondition.TypeInUse).Generation(changed.Generation) + defer func() { conditions.SetCondition(cb, &changed.Status.Conditions) }() vms, err := s.VirtualMachines(ctx) if err != nil { return reconcile.Result{}, err } if len(vms) > 0 { - msg := fmt.Sprintf("VirtualMachineClass cannot be deleted, there are VMs that use it. %s...", object.NamespacedName(&vms[0])) - h.recorder.Event(changed, corev1.EventTypeWarning, virtv2.ReasonVMClassInUse, msg) + var vmNamespacedNames []string + for i := range vms { + vmNamespacedNames = append(vmNamespacedNames, object.NamespacedName(&vms[i]).String()) + } + msg := fmt.Sprintf("VirtualMachineClass cannot be deleted, there are VMs that use it. %q", vmNamespacedNames) + cb. + Status(metav1.ConditionTrue). + Reason(vmclasscondition.ReasonVMClassInUse). + Message(msg) return reconcile.Result{RequeueAfter: 60 * time.Second}, nil } + cb. + Status(metav1.ConditionFalse). + Reason(vmclasscondition.ReasonVMClassFree). + Message("") h.logger.Info("Deletion observed: remove cleanup finalizer from VirtualMachineClass") controllerutil.RemoveFinalizer(changed, virtv2.FinalizerVMCleanup) return reconcile.Result{}, nil