diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready.go b/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready.go index b4028a767..4103ee558 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready.go @@ -21,25 +21,30 @@ import ( "errors" "fmt" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/service" "github.com/deckhouse/virtualization-controller/pkg/controller/vd/internal/source" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" + "github.com/deckhouse/virtualization/api/core/v1alpha2" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) type DatasourceReadyHandler struct { - sources Sources - blank source.Handler + sources Sources + blank source.Handler + recorder eventrecord.EventRecorderLogger } -func NewDatasourceReadyHandler(blank source.Handler, sources Sources) *DatasourceReadyHandler { +func NewDatasourceReadyHandler(recorder eventrecord.EventRecorderLogger, blank source.Handler, sources Sources) *DatasourceReadyHandler { return &DatasourceReadyHandler{ - blank: blank, - sources: sources, + blank: blank, + sources: sources, + recorder: recorder, } } @@ -76,6 +81,13 @@ func (h DatasourceReadyHandler) Handle(ctx context.Context, vd *virtv2.VirtualDi Message("") return reconcile.Result{}, nil case errors.Is(err, source.ErrSecretNotFound): + h.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonVDContainerRegistrySecretNotFound, + "Container registry secret not found", + ) + cb. Status(metav1.ConditionFalse). Reason(vdcondition.ContainerRegistrySecretNotFound). diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready_test.go b/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready_test.go index 02a0b5238..594b982dd 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready_test.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready_test.go @@ -22,9 +22,11 @@ import ( "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/vd/internal/source" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) @@ -41,6 +43,9 @@ func TestDatasourceReadyHandler_Handle(t *testing.T) { return blank, true }, } + recorder := &eventrecord.EventRecorderLoggerMock{ + EventFunc: func(_ client.Object, _, _, _ string) {}, + } t.Run("VirtualDisk with DeletionTimestamp", func(t *testing.T) { vd := virtv2.VirtualDisk{ @@ -49,7 +54,7 @@ func TestDatasourceReadyHandler_Handle(t *testing.T) { }, } - handler := NewDatasourceReadyHandler(nil, nil) + handler := NewDatasourceReadyHandler(recorder, nil, nil) _, err := handler.Handle(ctx, &vd) require.NoError(t, err) @@ -62,7 +67,7 @@ func TestDatasourceReadyHandler_Handle(t *testing.T) { t.Run("VirtualDisk with Blank DataSource", func(t *testing.T) { vd := virtv2.VirtualDisk{} - handler := NewDatasourceReadyHandler(blank, nil) + handler := NewDatasourceReadyHandler(recorder, blank, nil) _, err := handler.Handle(ctx, &vd) require.NoError(t, err) @@ -81,7 +86,7 @@ func TestDatasourceReadyHandler_Handle(t *testing.T) { }, } - handler := NewDatasourceReadyHandler(nil, sources) + handler := NewDatasourceReadyHandler(recorder, nil, sources) _, err := handler.Handle(ctx, &vd) require.NoError(t, err) diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle.go b/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle.go index c47233469..e7593d3dd 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle.go @@ -20,34 +20,36 @@ import ( "context" "fmt" + 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/reconcile" "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/vd/internal/source" - "github.com/deckhouse/virtualization-controller/pkg/logger" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" + "github.com/deckhouse/virtualization/api/core/v1alpha2" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) type LifeCycleHandler struct { - client client.Client - blank source.Handler - sources Sources + client client.Client + blank source.Handler + sources Sources + recorder eventrecord.EventRecorderLogger } -func NewLifeCycleHandler(blank source.Handler, sources Sources, client client.Client) *LifeCycleHandler { +func NewLifeCycleHandler(recorder eventrecord.EventRecorderLogger, blank source.Handler, sources Sources, client client.Client) *LifeCycleHandler { return &LifeCycleHandler{ - client: client, - blank: blank, - sources: sources, + client: client, + blank: blank, + sources: sources, + recorder: recorder, } } func (h LifeCycleHandler) Handle(ctx context.Context, vd *virtv2.VirtualDisk) (reconcile.Result, error) { - log := logger.FromContext(ctx).With(logger.SlogHandler("lifecycle")) - readyCondition, ok := conditions.GetCondition(vdcondition.ReadyType, vd.Status.Conditions) if !ok { readyCondition = metav1.Condition{ @@ -81,7 +83,12 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vd *virtv2.VirtualDisk) (r } if readyCondition.Status != metav1.ConditionTrue && readyCondition.Reason != vdcondition.Lost.String() && h.sources.Changed(ctx, vd) { - log.Info("Spec changes are detected: restart import process") + h.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonVDStorageClassWasDeleted, + "Spec changes are detected: restart import process", + ) vd.Status = virtv2.VirtualDiskStatus{ Phase: virtv2.DiskPending, @@ -114,7 +121,12 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vd *virtv2.VirtualDisk) (r } if readyCondition.Status != metav1.ConditionTrue && storageClassReadyCondition.Status != metav1.ConditionTrue && vd.Status.StorageClassName != "" { - log.Info("Storage class was deleted while population") + h.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonVDStorageClassWasDeleted, + "Storage class was deleted while population", + ) vd.Status = virtv2.VirtualDiskStatus{ Phase: virtv2.DiskPending, diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle_test.go b/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle_test.go index 8ef3503a2..0fa0f0999 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle_test.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle_test.go @@ -23,10 +23,12 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/vd/internal/source" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" @@ -80,7 +82,10 @@ var _ = Describe("LifeCycleHandler Run", func() { return &handler, false } - handler := NewLifeCycleHandler(nil, &sourcesMock, nil) + recorder := &eventrecord.EventRecorderLoggerMock{ + EventFunc: func(_ client.Object, _, _, _ string) {}, + } + handler := NewLifeCycleHandler(recorder, nil, &sourcesMock, nil) ctx := logger.ToContext(context.TODO(), slog.Default()) @@ -179,7 +184,11 @@ var _ = Describe("LifeCycleHandler Run", func() { return &handler, false } - handler := NewLifeCycleHandler(nil, &sourcesMock, nil) + recorder := &eventrecord.EventRecorderLoggerMock{ + EventFunc: func(_ client.Object, _, _, _ string) {}, + } + + handler := NewLifeCycleHandler(recorder, nil, &sourcesMock, nil) ctx := logger.ToContext(context.TODO(), slog.Default()) diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/resizing.go b/images/virtualization-artifact/pkg/controller/vd/internal/resizing.go index 4d27642c8..8bd0e476d 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/resizing.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/resizing.go @@ -30,18 +30,22 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/service" "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" + "github.com/deckhouse/virtualization/api/core/v1alpha2" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) type ResizingHandler struct { diskService DiskService + recorder eventrecord.EventRecorderLogger } -func NewResizingHandler(diskService DiskService) *ResizingHandler { +func NewResizingHandler(recorder eventrecord.EventRecorderLogger, diskService DiskService) *ResizingHandler { return &ResizingHandler{ diskService: diskService, + recorder: recorder, } } @@ -119,6 +123,13 @@ func (h ResizingHandler) Handle(ctx context.Context, vd *virtv2.VirtualDisk) (re if vdSpecSize != nil && vdSpecSize.Cmp(pvcSpecSize) == common.CmpGreater { snapshotting, _ := conditions.GetCondition(vdcondition.SnapshottingType, vd.Status.Conditions) if snapshotting.Status == metav1.ConditionTrue { + h.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonVDResizingNotAvailable, + "The virtual disk cannot be selected for resizing as it is currently snapshotting.", + ) + cb. Status(metav1.ConditionFalse). Reason(vdcondition.ResizingNotAvailable). @@ -139,6 +150,14 @@ func (h ResizingHandler) Handle(ctx context.Context, vd *virtv2.VirtualDisk) (re } return reconcile.Result{}, err } + + h.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonVDResizingStarted, + "The virtual disk resizing has started", + ) + case metav1.ConditionFalse: cb. Status(metav1.ConditionFalse). @@ -164,6 +183,13 @@ func (h ResizingHandler) Handle(ctx context.Context, vd *virtv2.VirtualDisk) (re // Expected disk size is NOT GREATER THAN expected pvc size: no resize needed since downsizing is not possible, and resizing to the same value makes no sense. switch condition.Reason { case vdcondition.InProgress.String(), vdcondition.Resized.String(): + h.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonVDResizingCompleted, + "The virtual disk resizing has completed", + ) + cb. Status(metav1.ConditionFalse). Reason(vdcondition.Resized). diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/resizing_test.go b/images/virtualization-artifact/pkg/controller/vd/internal/resizing_test.go index 1956421f5..ca7943d04 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/resizing_test.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/resizing_test.go @@ -25,9 +25,11 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" @@ -88,6 +90,10 @@ var _ = Describe("Resizing handler Run", func() { } }) + recorder := &eventrecord.EventRecorderLoggerMock{ + EventFunc: func(_ client.Object, _, _, _ string) {}, + } + It("Resizing is in progress", func() { vd.Spec.PersistentVolumeClaim.Size = nil diskService.GetPersistentVolumeClaimFunc = func(ctx context.Context, sup *supplements.Generator) (*corev1.PersistentVolumeClaim, error) { @@ -100,7 +106,7 @@ var _ = Describe("Resizing handler Run", func() { return pvc, nil } - h := NewResizingHandler(diskService) + h := NewResizingHandler(recorder, diskService) _, err := h.Handle(testContext(), vd) Expect(err).To(BeNil()) @@ -112,7 +118,7 @@ var _ = Describe("Resizing handler Run", func() { It("Resize is not requested (vd.spec.size == nil)", func() { vd.Spec.PersistentVolumeClaim.Size = nil - h := NewResizingHandler(diskService) + h := NewResizingHandler(recorder, diskService) _, err := h.Handle(testContext(), vd) Expect(err).To(BeNil()) @@ -124,7 +130,7 @@ var _ = Describe("Resizing handler Run", func() { It("Resize is not requested (vd.spec.size < pvc.spec.size)", func() { vd.Spec.PersistentVolumeClaim.Size.Sub(resource.MustParse("1G")) - h := NewResizingHandler(diskService) + h := NewResizingHandler(recorder, diskService) _, err := h.Handle(testContext(), vd) Expect(err).To(BeNil()) @@ -134,7 +140,7 @@ var _ = Describe("Resizing handler Run", func() { }) It("Resize is not requested (vd.spec.size == pvc.spec.size)", func() { - h := NewResizingHandler(diskService) + h := NewResizingHandler(recorder, diskService) _, err := h.Handle(testContext(), vd) Expect(err).To(BeNil()) @@ -146,7 +152,7 @@ var _ = Describe("Resizing handler Run", func() { It("Resize has started (vd.spec.size > pvc.spec.size)", func() { vd.Spec.PersistentVolumeClaim.Size.Add(size) - h := NewResizingHandler(diskService) + h := NewResizingHandler(recorder, diskService) _, err := h.Handle(testContext(), vd) Expect(err).To(BeNil()) @@ -162,7 +168,7 @@ var _ = Describe("Resizing handler Run", func() { Reason: vdcondition.InProgress.String(), }) - h := NewResizingHandler(diskService) + h := NewResizingHandler(recorder, diskService) _, err := h.Handle(testContext(), vd) Expect(err).To(BeNil()) diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/http.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/http.go index f501e97f7..945f8d6b7 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/source/http.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/http.go @@ -40,7 +40,9 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/controller/service" "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" "github.com/deckhouse/virtualization-controller/pkg/dvcr" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" + "github.com/deckhouse/virtualization/api/core/v1alpha2" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) @@ -54,9 +56,11 @@ type HTTPDataSource struct { dvcrSettings *dvcr.Settings storageClassService *service.VirtualDiskStorageClassService client client.Client + recorder eventrecord.EventRecorderLogger } func NewHTTPDataSource( + recorder eventrecord.EventRecorderLogger, statService *service.StatService, importerService *service.ImporterService, diskService *service.DiskService, @@ -71,6 +75,7 @@ func NewHTTPDataSource( dvcrSettings: dvcrSettings, storageClassService: storageClassService, client: client, + recorder: recorder, } } @@ -128,7 +133,12 @@ func (ds HTTPDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (reco case object.AnyTerminating(pod, dv, pvc): log.Info("Waiting for supplements to be terminated") case pod == nil: - log.Info("Start import to DVCR") + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "The HTTP DataSource import to DVCR has started", + ) vd.Status.Progress = "0%" @@ -146,6 +156,7 @@ func (ds HTTPDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (reco case err == nil: // OK. case common.ErrQuotaExceeded(err): + ds.recorder.Event(vd, corev1.EventTypeWarning, virtv2.ReasonDataSourceQuotaExceeded, "DataSource quota exceed") return setQuotaExceededPhaseCondition(cb, &vd.Status.Phase, err, vd.CreationTimestamp), nil default: setPhaseConditionToFailed(cb, &vd.Status.Phase, fmt.Errorf("unexpected error: %w", err)) @@ -160,7 +171,12 @@ func (ds HTTPDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (reco return reconcile.Result{Requeue: true}, nil case !podutil.IsPodComplete(pod): - log.Info("Provisioning to DVCR is in progress", "podPhase", pod.Status.Phase) + ds.recorder.Eventf( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "Provisioning to DVCR is in progress", "podPhase", pod.Status.Phase, + ) err = ds.statService.CheckPod(pod) if err != nil { @@ -181,7 +197,12 @@ func (ds HTTPDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (reco vd.Status.Progress = ds.statService.GetProgress(vd.GetUID(), pod, vd.Status.Progress, service.NewScaleOption(0, 50)) vd.Status.DownloadSpeed = ds.statService.GetDownloadSpeed(vd.GetUID(), pod) case dv == nil: - log.Info("Start import to PVC") + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "The HTTP DataSource import to PVC has started", + ) err = ds.statService.CheckPod(pod) if err != nil { @@ -189,6 +210,7 @@ func (ds HTTPDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (reco switch { case errors.Is(err, service.ErrProvisioningFailed): + ds.recorder.Event(vd, corev1.EventTypeWarning, virtv2.ReasonDataSourceDiskProvisioningFailed, "Disk provisioning failed") cb. Status(metav1.ConditionFalse). Reason(vdcondition.ProvisioningFailed). @@ -250,6 +272,13 @@ func (ds HTTPDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (reco case ds.diskService.IsImportDone(dv, pvc): log.Info("Import has completed", "dvProgress", dv.Status.Progress, "dvPhase", dv.Status.Phase, "pvcPhase", pvc.Status.Phase) + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncCompleted, + "The HTTP DataSource import has completed", + ) + vd.Status.Phase = virtv2.DiskReady cb. Status(metav1.ConditionTrue). diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref.go index 5019c723c..c5e380bd0 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref.go @@ -26,6 +26,7 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/common/annotations" "github.com/deckhouse/virtualization-controller/pkg/controller/service" "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" ) @@ -40,6 +41,7 @@ type ObjectRefDataSource struct { } func NewObjectRefDataSource( + recorder eventrecord.EventRecorderLogger, statService *service.StatService, diskService *service.DiskService, client client.Client, @@ -47,10 +49,10 @@ func NewObjectRefDataSource( ) *ObjectRefDataSource { return &ObjectRefDataSource{ diskService: diskService, - vdSnapshotSyncer: NewObjectRefVirtualDiskSnapshot(diskService), - viDVCRSyncer: NewObjectRefVirtualImageDVCR(statService, diskService, storageClassService, client), - viPVCSyncer: NewObjectRefVirtualImagePVC(diskService, storageClassService, client), - cviSyncer: NewObjectRefClusterVirtualImage(statService, diskService, storageClassService, client), + vdSnapshotSyncer: NewObjectRefVirtualDiskSnapshot(recorder, diskService), + viDVCRSyncer: NewObjectRefVirtualImageDVCR(recorder, statService, diskService, storageClassService, client), + viPVCSyncer: NewObjectRefVirtualImagePVC(recorder, diskService, storageClassService, client), + cviSyncer: NewObjectRefClusterVirtualImage(recorder, statService, diskService, storageClassService, client), } } diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_cvi.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_cvi.go index 3d0bba460..92517f718 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_cvi.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_cvi.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" cdiv1 "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1" @@ -36,7 +37,9 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/service" "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" + "github.com/deckhouse/virtualization/api/core/v1alpha2" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) @@ -46,9 +49,11 @@ type ObjectRefClusterVirtualImage struct { diskService *service.DiskService storageClassService *service.VirtualDiskStorageClassService client client.Client + recorder eventrecord.EventRecorderLogger } func NewObjectRefClusterVirtualImage( + recorder eventrecord.EventRecorderLogger, statService *service.StatService, diskService *service.DiskService, storageClassService *service.VirtualDiskStorageClassService, @@ -59,6 +64,7 @@ func NewObjectRefClusterVirtualImage( diskService: diskService, storageClassService: storageClassService, client: client, + recorder: recorder, } } @@ -118,7 +124,12 @@ func (ds ObjectRefClusterVirtualImage) Sync(ctx context.Context, vd *virtv2.Virt case object.AnyTerminating(dv, pvc): log.Info("Waiting for supplements to be terminated") case dv == nil: - log.Info("Start import to PVC") + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "The ObjectRef DataSource import to PVC has started", + ) vd.Status.Progress = "0%" vd.Status.SourceUID = pointer.GetPointer(cvi.GetUID()) @@ -170,6 +181,12 @@ func (ds ObjectRefClusterVirtualImage) Sync(ctx context.Context, vd *virtv2.Virt return reconcile.Result{Requeue: true}, nil case ds.diskService.IsImportDone(dv, pvc): log.Info("Import has completed", "dvProgress", dv.Status.Progress, "dvPhase", dv.Status.Phase, "pvcPhase", pvc.Status.Phase) + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncCompleted, + "The ObjectRef DataSource import has completed", + ) vd.Status.Phase = virtv2.DiskReady cb. diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vdsnapshot.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vdsnapshot.go index 81f5339f2..f11d1f5b6 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vdsnapshot.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vdsnapshot.go @@ -33,18 +33,22 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/service" "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" + "github.com/deckhouse/virtualization/api/core/v1alpha2" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) type ObjectRefVirtualDiskSnapshot struct { diskService *service.DiskService + recorder eventrecord.EventRecorderLogger } -func NewObjectRefVirtualDiskSnapshot(diskService *service.DiskService) *ObjectRefVirtualDiskSnapshot { +func NewObjectRefVirtualDiskSnapshot(recorder eventrecord.EventRecorderLogger, diskService *service.DiskService) *ObjectRefVirtualDiskSnapshot { return &ObjectRefVirtualDiskSnapshot{ diskService: diskService, + recorder: recorder, } } @@ -90,7 +94,12 @@ func (ds ObjectRefVirtualDiskSnapshot) Sync(ctx context.Context, vd *virtv2.Virt log.Info("Waiting for supplements to be terminated") return reconcile.Result{Requeue: true}, nil case pvc == nil: - log.Info("Start import to PVC") + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "The ObjectRef DataSource import has started", + ) namespacedName := supplements.NewGenerator(annotations.VDShortName, vd.Name, vd.Namespace, vd.UID).PersistentVolumeClaim() @@ -158,6 +167,13 @@ func (ds ObjectRefVirtualDiskSnapshot) Sync(ctx context.Context, vd *virtv2.Virt return reconcile.Result{}, nil case pvc.Status.Phase == corev1.ClaimBound: + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncCompleted, + "The ObjectRef DataSource import has completed", + ) + vd.Status.Phase = virtv2.DiskReady cb. Status(metav1.ConditionTrue). diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vi_dvcr.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vi_dvcr.go index 893a416bb..40084881e 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vi_dvcr.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vi_dvcr.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" cdiv1 "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1" @@ -36,7 +37,9 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/service" "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" + "github.com/deckhouse/virtualization/api/core/v1alpha2" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) @@ -46,9 +49,11 @@ type ObjectRefVirtualImageDVCR struct { diskService *service.DiskService storageClassService *service.VirtualDiskStorageClassService client client.Client + recorder eventrecord.EventRecorderLogger } func NewObjectRefVirtualImageDVCR( + recorder eventrecord.EventRecorderLogger, statService *service.StatService, diskService *service.DiskService, storageClassService *service.VirtualDiskStorageClassService, @@ -59,6 +64,7 @@ func NewObjectRefVirtualImageDVCR( diskService: diskService, storageClassService: storageClassService, client: client, + recorder: recorder, } } @@ -117,7 +123,12 @@ func (ds ObjectRefVirtualImageDVCR) Sync(ctx context.Context, vd *virtv2.Virtual case object.AnyTerminating(dv, pvc): log.Info("Waiting for supplements to be terminated") case dv == nil: - log.Info("Start import to PVC") + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "The ObjectRef DataSource import to DVCR has started", + ) vd.Status.Progress = "0%" vd.Status.SourceUID = pointer.GetPointer(vi.GetUID()) @@ -169,6 +180,12 @@ func (ds ObjectRefVirtualImageDVCR) Sync(ctx context.Context, vd *virtv2.Virtual return reconcile.Result{Requeue: true}, nil case ds.diskService.IsImportDone(dv, pvc): log.Info("Import has completed", "dvProgress", dv.Status.Progress, "dvPhase", dv.Status.Phase, "pvcPhase", pvc.Status.Phase) + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncCompleted, + "The ObjectRef DataSource import has completed", + ) vd.Status.Phase = virtv2.DiskReady cb. diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vi_pvc.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vi_pvc.go index 8b56da3ab..16034ac82 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vi_pvc.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/object_ref_vi_pvc.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" cdiv1 "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1" @@ -35,7 +36,9 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/service" "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" + "github.com/deckhouse/virtualization/api/core/v1alpha2" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) @@ -44,9 +47,11 @@ type ObjectRefVirtualImagePVC struct { diskService *service.DiskService storageClassService *service.VirtualDiskStorageClassService client client.Client + recorder eventrecord.EventRecorderLogger } func NewObjectRefVirtualImagePVC( + recorder eventrecord.EventRecorderLogger, diskService *service.DiskService, storageClassService *service.VirtualDiskStorageClassService, client client.Client, @@ -55,6 +60,7 @@ func NewObjectRefVirtualImagePVC( diskService: diskService, storageClassService: storageClassService, client: client, + recorder: recorder, } } @@ -113,7 +119,12 @@ func (ds ObjectRefVirtualImagePVC) Sync(ctx context.Context, vd *virtv2.VirtualD case object.AnyTerminating(dv, pvc): log.Info("Waiting for supplements to be terminated") case dv == nil: - log.Info("Start import to PVC") + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "The ObjectRef DataSource import to PVC has started", + ) vd.Status.Progress = "0%" vd.Status.SourceUID = pointer.GetPointer(vi.GetUID()) @@ -170,6 +181,12 @@ func (ds ObjectRefVirtualImagePVC) Sync(ctx context.Context, vd *virtv2.VirtualD return reconcile.Result{Requeue: true}, nil case ds.diskService.IsImportDone(dv, pvc): log.Info("Import has completed", "dvProgress", dv.Status.Progress, "dvPhase", dv.Status.Phase, "pvcPhase", pvc.Status.Phase) + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncCompleted, + "The ObjectRef DataSource import has completed", + ) vd.Status.Phase = virtv2.DiskReady cb. diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/registry.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/registry.go index 6767caad4..ecd9fef78 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/source/registry.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/registry.go @@ -41,7 +41,9 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/controller/service" "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" "github.com/deckhouse/virtualization-controller/pkg/dvcr" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" + "github.com/deckhouse/virtualization/api/core/v1alpha2" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) @@ -55,9 +57,11 @@ type RegistryDataSource struct { dvcrSettings *dvcr.Settings client client.Client storageClassService *service.VirtualDiskStorageClassService + recorder eventrecord.EventRecorderLogger } func NewRegistryDataSource( + recorder eventrecord.EventRecorderLogger, statService *service.StatService, importerService *service.ImporterService, diskService *service.DiskService, @@ -72,6 +76,7 @@ func NewRegistryDataSource( dvcrSettings: dvcrSettings, client: client, storageClassService: storageClassService, + recorder: recorder, } } @@ -129,7 +134,12 @@ func (ds RegistryDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) ( case object.AnyTerminating(pod, dv, pvc): log.Info("Waiting for supplements to be terminated") case pod == nil: - log.Info("Start import to DVCR") + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "The Registry DataSource import to DVCR has started", + ) vd.Status.Progress = "0%" @@ -147,6 +157,7 @@ func (ds RegistryDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) ( case err == nil: // OK. case common.ErrQuotaExceeded(err): + ds.recorder.Event(vd, corev1.EventTypeWarning, virtv2.ReasonDataSourceQuotaExceeded, "DataSource quota exceed") return setQuotaExceededPhaseCondition(cb, &vd.Status.Phase, err, vd.CreationTimestamp), nil default: setPhaseConditionToFailed(cb, &vd.Status.Phase, fmt.Errorf("unexpected error: %w", err)) @@ -161,7 +172,12 @@ func (ds RegistryDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) ( return reconcile.Result{Requeue: true}, nil case !podutil.IsPodComplete(pod): - log.Info("Provisioning to DVCR is in progress", "podPhase", pod.Status.Phase) + ds.recorder.Eventf( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "Provisioning to DVCR is in progress", "podPhase", pod.Status.Phase, + ) err = ds.statService.CheckPod(pod) if err != nil { @@ -181,7 +197,12 @@ func (ds RegistryDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) ( return reconcile.Result{}, err } case dv == nil: - log.Info("Start import to PVC") + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "The Registry DataSource import to PVC has started", + ) err = ds.statService.CheckPod(pod) if err != nil { @@ -189,6 +210,7 @@ func (ds RegistryDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) ( switch { case errors.Is(err, service.ErrProvisioningFailed): + ds.recorder.Event(vd, corev1.EventTypeWarning, virtv2.ReasonDataSourceDiskProvisioningFailed, "Disk provisioning failed") cb. Status(metav1.ConditionFalse). Reason(vdcondition.ProvisioningFailed). @@ -248,6 +270,13 @@ func (ds RegistryDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) ( case ds.diskService.IsImportDone(dv, pvc): log.Info("Import has completed", "dvProgress", dv.Status.Progress, "dvPhase", dv.Status.Phase, "pvcPhase", pvc.Status.Phase) + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncCompleted, + "The Registry DataSource import has completed", + ) + vd.Status.Phase = virtv2.DiskReady cb. Status(metav1.ConditionTrue). diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/upload.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/upload.go index d4b210811..e0b10438f 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/source/upload.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/upload.go @@ -40,7 +40,9 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" "github.com/deckhouse/virtualization-controller/pkg/controller/uploader" "github.com/deckhouse/virtualization-controller/pkg/dvcr" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" + "github.com/deckhouse/virtualization/api/core/v1alpha2" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) @@ -53,10 +55,12 @@ type UploadDataSource struct { diskService *service.DiskService dvcrSettings *dvcr.Settings storageClassService *service.VirtualDiskStorageClassService + recorder eventrecord.EventRecorderLogger client client.Client } func NewUploadDataSource( + recorder eventrecord.EventRecorderLogger, statService *service.StatService, uploaderService *service.UploaderService, diskService *service.DiskService, @@ -71,6 +75,7 @@ func NewUploadDataSource( dvcrSettings: dvcrSettings, storageClassService: storageClassService, client: client, + recorder: recorder, } } @@ -136,7 +141,12 @@ func (ds UploadDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (re case object.AnyTerminating(pod, svc, ing, dv, pvc): log.Info("Waiting for supplements to be terminated") case pod == nil || svc == nil || ing == nil: - log.Info("Start import to DVCR") + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "The Upload DataSource import to DVCR has started", + ) vd.Status.Progress = "0%" @@ -154,6 +164,7 @@ func (ds UploadDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (re case err == nil: // OK. case common.ErrQuotaExceeded(err): + ds.recorder.Event(vd, corev1.EventTypeWarning, virtv2.ReasonDataSourceQuotaExceeded, "DataSource quota exceed") return setQuotaExceededPhaseCondition(cb, &vd.Status.Phase, err, vd.CreationTimestamp), nil default: setPhaseConditionToFailed(cb, &vd.Status.Phase, fmt.Errorf("unexpected error: %w", err)) @@ -215,7 +226,12 @@ func (ds UploadDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (re return reconcile.Result{}, err } case dv == nil: - log.Info("Start import to PVC") + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncStarted, + "The Upload DataSource import to PVC has started", + ) err = ds.statService.CheckPod(pod) if err != nil { @@ -223,6 +239,7 @@ func (ds UploadDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (re switch { case errors.Is(err, service.ErrProvisioningFailed): + ds.recorder.Event(vd, corev1.EventTypeWarning, virtv2.ReasonDataSourceDiskProvisioningFailed, "Disk provisioning failed") cb. Status(metav1.ConditionFalse). Reason(vdcondition.ProvisioningFailed). @@ -277,6 +294,13 @@ func (ds UploadDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (re case ds.diskService.IsImportDone(dv, pvc): log.Info("Import has completed", "dvProgress", dv.Status.Progress, "dvPhase", dv.Status.Phase, "pvcPhase", pvc.Status.Phase) + ds.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonDataSourceSyncCompleted, + "The Upload DataSource import has completed", + ) + vd.Status.Phase = virtv2.DiskReady cb. Status(metav1.ConditionTrue). diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/storageclass_ready.go b/images/virtualization-artifact/pkg/controller/vd/internal/storageclass_ready.go index 19534e387..185b1914a 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/storageclass_ready.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/storageclass_ready.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -28,17 +29,21 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/service" "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" + "github.com/deckhouse/virtualization/api/core/v1alpha2" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) type StorageClassReadyHandler struct { - service DiskService + service DiskService + recorder eventrecord.EventRecorderLogger } -func NewStorageClassReadyHandler(diskService DiskService) *StorageClassReadyHandler { +func NewStorageClassReadyHandler(recorder eventrecord.EventRecorderLogger, diskService DiskService) *StorageClassReadyHandler { return &StorageClassReadyHandler{ - service: diskService, + service: diskService, + recorder: recorder, } } @@ -94,11 +99,25 @@ func (h StorageClassReadyHandler) Handle(ctx context.Context, vd *virtv2.Virtual Reason(vdcondition.StorageClassReady). Message("") case hasNoStorageClassInSpec: + h.recorder.Event( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonVDStorageClassNotFound, + "The default storage class was not found in cluster. Please specify the storage class name in the virtual disk specification.", + ) + cb. Status(metav1.ConditionFalse). Reason(vdcondition.StorageClassNotFound). Message("The default storage class was not found in cluster. Please specify the storage class name in the virtual disk specification.") default: + h.recorder.Eventf( + vd, + corev1.EventTypeNormal, + v1alpha2.ReasonVDStorageClassNotFound, + "Storage class %q not found", *vd.Spec.PersistentVolumeClaim.StorageClass, + ) + cb. Status(metav1.ConditionFalse). Reason(vdcondition.StorageClassNotFound). diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/storageclass_ready_test.go b/images/virtualization-artifact/pkg/controller/vd/internal/storageclass_ready_test.go index 544a31657..de65beae3 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/storageclass_ready_test.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/storageclass_ready_test.go @@ -25,9 +25,11 @@ import ( storagev1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/ptr" + "sigs.k8s.io/controller-runtime/pkg/client" "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/supplements" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" "github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition" ) @@ -35,7 +37,10 @@ import ( var _ = Describe("StorageClassHandler Run", func() { DescribeTable("Check StorageClass handler", func(args handlerTestArgs) { - handler := NewStorageClassReadyHandler(newDiskServiceMock(args.StorageClassExistedInCluster, args.StorageClassInExistedPVC)) + recorder := &eventrecord.EventRecorderLoggerMock{ + EventFunc: func(_ client.Object, _, _, _ string) {}, + } + handler := NewStorageClassReadyHandler(recorder, newDiskServiceMock(args.StorageClassExistedInCluster, args.StorageClassInExistedPVC)) _, err := handler.Handle(context.TODO(), args.VirtualDisk) Expect(err).To(BeNil()) diff --git a/images/virtualization-artifact/pkg/controller/vd/vd_controller.go b/images/virtualization-artifact/pkg/controller/vd/vd_controller.go index 02e8069e1..cb30f79a9 100644 --- a/images/virtualization-artifact/pkg/controller/vd/vd_controller.go +++ b/images/virtualization-artifact/pkg/controller/vd/vd_controller.go @@ -33,6 +33,7 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/controller/vd/internal" "github.com/deckhouse/virtualization-controller/pkg/controller/vd/internal/source" "github.com/deckhouse/virtualization-controller/pkg/dvcr" + "github.com/deckhouse/virtualization-controller/pkg/eventrecord" "github.com/deckhouse/virtualization-controller/pkg/logger" vdcolelctor "github.com/deckhouse/virtualization-controller/pkg/monitoring/metrics/vd" virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2" @@ -65,22 +66,23 @@ func NewController( uploader := service.NewUploaderService(dvcr, mgr.GetClient(), uploaderImage, requirements, PodPullPolicy, PodVerbose, ControllerName, protection) disk := service.NewDiskService(mgr.GetClient(), dvcr, protection) scService := service.NewVirtualDiskStorageClassService(storageClassSettings) + recorder := eventrecord.NewEventRecorderLogger(mgr, ControllerName) blank := source.NewBlankDataSource(stat, disk, scService, mgr.GetClient()) sources := source.NewSources() - sources.Set(virtv2.DataSourceTypeHTTP, source.NewHTTPDataSource(stat, importer, disk, dvcr, scService, mgr.GetClient())) - sources.Set(virtv2.DataSourceTypeContainerImage, source.NewRegistryDataSource(stat, importer, disk, dvcr, mgr.GetClient(), scService)) - sources.Set(virtv2.DataSourceTypeObjectRef, source.NewObjectRefDataSource(stat, disk, mgr.GetClient(), scService)) - sources.Set(virtv2.DataSourceTypeUpload, source.NewUploadDataSource(stat, uploader, disk, dvcr, scService, mgr.GetClient())) + sources.Set(virtv2.DataSourceTypeHTTP, source.NewHTTPDataSource(recorder, stat, importer, disk, dvcr, scService, mgr.GetClient())) + sources.Set(virtv2.DataSourceTypeContainerImage, source.NewRegistryDataSource(recorder, stat, importer, disk, dvcr, mgr.GetClient(), scService)) + sources.Set(virtv2.DataSourceTypeObjectRef, source.NewObjectRefDataSource(recorder, stat, disk, mgr.GetClient(), scService)) + sources.Set(virtv2.DataSourceTypeUpload, source.NewUploadDataSource(recorder, stat, uploader, disk, dvcr, scService, mgr.GetClient())) reconciler := NewReconciler( mgr.GetClient(), - internal.NewStorageClassReadyHandler(disk), - internal.NewDatasourceReadyHandler(blank, sources), - internal.NewLifeCycleHandler(blank, sources, mgr.GetClient()), + internal.NewStorageClassReadyHandler(recorder, disk), + internal.NewDatasourceReadyHandler(recorder, blank, sources), + internal.NewLifeCycleHandler(recorder, blank, sources, mgr.GetClient()), internal.NewSnapshottingHandler(disk), - internal.NewResizingHandler(disk), + internal.NewResizingHandler(recorder, disk), internal.NewDeletionHandler(sources), internal.NewAttacheeHandler(mgr.GetClient()), internal.NewStatsHandler(stat, importer, uploader), diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go index 6d4bfbf12..907cd86f6 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go @@ -90,11 +90,6 @@ func (ds ObjectRefVirtualDisk) StoreToDVCR(ctx context.Context, vi *virtv2.Virtu case isDiskProvisioningFinished(cb.Condition()): log.Info("Virtual image provisioning finished: clean up") - cb. - Status(metav1.ConditionTrue). - Reason(vicondition.Ready). - Message("") - vi.Status.Phase = virtv2.ImageReady err = ds.importerService.Unprotect(ctx, pod)