Skip to content

Commit

Permalink
refactor(cvi): add events
Browse files Browse the repository at this point in the history
Signed-off-by: Daniil Antoshin <[email protected]>

comment

Signed-off-by: Daniil Antoshin <[email protected]>

fix

Signed-off-by: Daniil Antoshin <[email protected]>

add quota exceed

Signed-off-by: Daniil Antoshin <[email protected]>

fix

Signed-off-by: Daniil Antoshin <[email protected]>
  • Loading branch information
danilrwx committed Dec 26, 2024
1 parent 008c2ee commit ff7e63e
Show file tree
Hide file tree
Showing 8 changed files with 107 additions and 10 deletions.
2 changes: 0 additions & 2 deletions api/core/v1alpha2/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,6 @@ const (
// 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.
ReasonVDStorageClassNotFound = "VirtualDiskStorageClassNotFound"
// ReasonVDSpecChanged is event reason that VDStorageClass is chanded.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
"github.com/deckhouse/virtualization-controller/pkg/controller/cvi/internal/source"
"github.com/deckhouse/virtualization-controller/pkg/controller/service"
"github.com/deckhouse/virtualization-controller/pkg/dvcr"
"github.com/deckhouse/virtualization-controller/pkg/eventrecord"
"github.com/deckhouse/virtualization-controller/pkg/logger"
virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2"
)
Expand Down Expand Up @@ -60,12 +61,13 @@ func NewController(
protection := service.NewProtectionService(mgr.GetClient(), virtv2.FinalizerCVIProtection)
importer := service.NewImporterService(dvcr, mgr.GetClient(), importerImage, requirements, PodPullPolicy, PodVerbose, ControllerName, protection)
uploader := service.NewUploaderService(dvcr, mgr.GetClient(), uploaderImage, requirements, PodPullPolicy, PodVerbose, ControllerName, protection)
recorder := eventrecord.NewEventRecorderLogger(mgr, ControllerName)

sources := source.NewSources()
sources.Set(virtv2.DataSourceTypeHTTP, source.NewHTTPDataSource(stat, importer, dvcr, ns))
sources.Set(virtv2.DataSourceTypeContainerImage, source.NewRegistryDataSource(stat, importer, dvcr, mgr.GetClient(), ns))
sources.Set(virtv2.DataSourceTypeObjectRef, source.NewObjectRefDataSource(stat, importer, dvcr, mgr.GetClient(), ns))
sources.Set(virtv2.DataSourceTypeUpload, source.NewUploadDataSource(stat, uploader, dvcr, ns))
sources.Set(virtv2.DataSourceTypeHTTP, source.NewHTTPDataSource(recorder, stat, importer, dvcr, ns))
sources.Set(virtv2.DataSourceTypeContainerImage, source.NewRegistryDataSource(recorder, stat, importer, dvcr, mgr.GetClient(), ns))
sources.Set(virtv2.DataSourceTypeObjectRef, source.NewObjectRefDataSource(recorder, stat, importer, dvcr, mgr.GetClient(), ns))
sources.Set(virtv2.DataSourceTypeUpload, source.NewUploadDataSource(recorder, stat, uploader, dvcr, ns))

reconciler := NewReconciler(
mgr.GetClient(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -34,6 +35,7 @@ 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"
virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2"
"github.com/deckhouse/virtualization/api/core/v1alpha2/cvicondition"
Expand All @@ -44,9 +46,11 @@ type HTTPDataSource struct {
importerService Importer
dvcrSettings *dvcr.Settings
controllerNamespace string
recorder eventrecord.EventRecorderLogger
}

func NewHTTPDataSource(
recorder eventrecord.EventRecorderLogger,
statService Stat,
importerService Importer,
dvcrSettings *dvcr.Settings,
Expand All @@ -57,6 +61,7 @@ func NewHTTPDataSource(
importerService: importerService,
dvcrSettings: dvcrSettings,
controllerNamespace: controllerNamespace,
recorder: recorder,
}
}

Expand Down Expand Up @@ -100,6 +105,13 @@ func (ds HTTPDataSource) Sync(ctx context.Context, cvi *virtv2.ClusterVirtualIma

log.Info("Cleaning up...")
case pod == nil:
ds.recorder.Event(
cvi,
corev1.EventTypeNormal,
virtv2.ReasonDataSourceSyncStarted,
"The HTTP DataSource import has started",
)

cvi.Status.Progress = ds.statService.GetProgress(cvi.GetUID(), pod, cvi.Status.Progress)

envSettings := ds.getEnvSettings(cvi, supgen)
Expand All @@ -108,6 +120,7 @@ func (ds HTTPDataSource) Sync(ctx context.Context, cvi *virtv2.ClusterVirtualIma
case err == nil:
// OK.
case common.ErrQuotaExceeded(err):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceQuotaExceeded, "DataSource quota exceed")
return setQuotaExceededPhaseCondition(cb, &cvi.Status.Phase, err, cvi.CreationTimestamp), nil
default:
setPhaseConditionToFailed(cb, &cvi.Status.Phase, fmt.Errorf("unexpected error: %w", err))
Expand All @@ -129,6 +142,7 @@ func (ds HTTPDataSource) Sync(ctx context.Context, cvi *virtv2.ClusterVirtualIma

switch {
case errors.Is(err, service.ErrProvisioningFailed):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceDiskProvisioningFailed, "Disk provisioning failed")
cb.Status(metav1.ConditionFalse).
Reason(cvicondition.ProvisioningFailed).
Message(service.CapitalizeFirstLetter(err.Error() + "."))
Expand All @@ -138,6 +152,13 @@ func (ds HTTPDataSource) Sync(ctx context.Context, cvi *virtv2.ClusterVirtualIma
}
}

ds.recorder.Event(
cvi,
corev1.EventTypeNormal,
virtv2.ReasonDataSourceSyncCompleted,
"The HTTP DataSource import has completed",
)

cb.Status(metav1.ConditionTrue).
Reason(cvicondition.Ready).
Message("")
Expand All @@ -163,6 +184,7 @@ func (ds HTTPDataSource) Sync(ctx context.Context, cvi *virtv2.ClusterVirtualIma
Message(service.CapitalizeFirstLetter(err.Error() + "."))
return reconcile.Result{}, nil
case errors.Is(err, service.ErrProvisioningFailed):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceDiskProvisioningFailed, "Disk provisioning failed")
cb.Status(metav1.ConditionFalse).
Reason(cvicondition.ProvisioningFailed).
Message(service.CapitalizeFirstLetter(err.Error() + "."))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"errors"
"fmt"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
Expand All @@ -37,6 +38,7 @@ 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"
virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2"
"github.com/deckhouse/virtualization/api/core/v1alpha2/cvicondition"
Expand All @@ -48,12 +50,14 @@ type ObjectRefDataSource struct {
dvcrSettings *dvcr.Settings
client client.Client
controllerNamespace string
recorder eventrecord.EventRecorderLogger

viOnPvcSyncer *ObjectRefVirtualImageOnPvc
vdSyncer *ObjectRefVirtualDisk
}

func NewObjectRefDataSource(
recorder eventrecord.EventRecorderLogger,
statService Stat,
importerService Importer,
dvcrSettings *dvcr.Settings,
Expand All @@ -66,9 +70,10 @@ func NewObjectRefDataSource(
dvcrSettings: dvcrSettings,
client: client,
controllerNamespace: controllerNamespace,
recorder: recorder,

viOnPvcSyncer: NewObjectRefVirtualImageOnPvc(importerService, dvcrSettings, statService),
vdSyncer: NewObjectRefVirtualDisk(importerService, client, controllerNamespace, dvcrSettings, statService),
viOnPvcSyncer: NewObjectRefVirtualImageOnPvc(recorder, importerService, dvcrSettings, statService),
vdSyncer: NewObjectRefVirtualDisk(recorder, importerService, client, controllerNamespace, dvcrSettings, statService),
}
}

Expand Down Expand Up @@ -142,6 +147,12 @@ func (ds ObjectRefDataSource) Sync(ctx context.Context, cvi *virtv2.ClusterVirtu

log.Info("Cleaning up...")
case pod == nil:
ds.recorder.Event(
cvi,
corev1.EventTypeNormal,
virtv2.ReasonDataSourceSyncStarted,
"The ObjectRef DataSource import has started",
)
var dvcrDataSource controller.DVCRDataSource
dvcrDataSource, err = controller.NewDVCRDataSourcesForCVMI(ctx, cvi.Spec.DataSource, ds.client)
if err != nil {
Expand All @@ -159,6 +170,7 @@ func (ds ObjectRefDataSource) Sync(ctx context.Context, cvi *virtv2.ClusterVirtu
case err == nil:
// OK.
case common.ErrQuotaExceeded(err):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceQuotaExceeded, "DataSource quota exceed")
return setQuotaExceededPhaseCondition(cb, &cvi.Status.Phase, err, cvi.CreationTimestamp), nil
default:
setPhaseConditionToFailed(cb, &cvi.Status.Phase, fmt.Errorf("unexpected error: %w", err))
Expand All @@ -181,6 +193,7 @@ func (ds ObjectRefDataSource) Sync(ctx context.Context, cvi *virtv2.ClusterVirtu

switch {
case errors.Is(err, service.ErrProvisioningFailed):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceDiskProvisioningFailed, "Disk provisioning failed")
cb.
Status(metav1.ConditionFalse).
Reason(cvicondition.ProvisioningFailed).
Expand Down Expand Up @@ -232,6 +245,7 @@ func (ds ObjectRefDataSource) Sync(ctx context.Context, cvi *virtv2.ClusterVirtu
Message(service.CapitalizeFirstLetter(err.Error() + "."))
return reconcile.Result{}, nil
case errors.Is(err, service.ErrProvisioningFailed):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceDiskProvisioningFailed, "Disk provisioning failed")
cb.
Status(metav1.ConditionFalse).
Reason(cvicondition.ProvisioningFailed).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"errors"
"fmt"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
Expand All @@ -36,6 +37,7 @@ 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"
virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2"
"github.com/deckhouse/virtualization/api/core/v1alpha2/cvicondition"
Expand All @@ -48,15 +50,17 @@ type ObjectRefVirtualDisk struct {
statService Stat
dvcrSettings *dvcr.Settings
controllerNamespace string
recorder eventrecord.EventRecorderLogger
}

func NewObjectRefVirtualDisk(importerService Importer, client client.Client, controllerNamespace string, dvcrSettings *dvcr.Settings, statService Stat) *ObjectRefVirtualDisk {
func NewObjectRefVirtualDisk(recorder eventrecord.EventRecorderLogger, importerService Importer, client client.Client, controllerNamespace string, dvcrSettings *dvcr.Settings, statService Stat) *ObjectRefVirtualDisk {
return &ObjectRefVirtualDisk{
importerService: importerService,
statService: statService,
dvcrSettings: dvcrSettings,
client: client,
controllerNamespace: controllerNamespace,
recorder: recorder,
}
}

Expand Down Expand Up @@ -91,6 +95,12 @@ func (ds ObjectRefVirtualDisk) Sync(ctx context.Context, cvi *virtv2.ClusterVirt

log.Info("Cleaning up...")
case pod == nil:
ds.recorder.Event(
cvi,
corev1.EventTypeNormal,
virtv2.ReasonDataSourceSyncStarted,
"The ObjectRef DataSource import has started",
)
cvi.Status.Progress = ds.statService.GetProgress(cvi.GetUID(), pod, cvi.Status.Progress)
cvi.Status.Target.RegistryURL = ds.statService.GetDVCRImageName(pod)

Expand All @@ -103,6 +113,7 @@ func (ds ObjectRefVirtualDisk) Sync(ctx context.Context, cvi *virtv2.ClusterVirt
case err == nil:
// OK.
case common.ErrQuotaExceeded(err):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceQuotaExceeded, "DataSource quota exceed")
return setQuotaExceededPhaseCondition(cb, &cvi.Status.Phase, err, cvi.CreationTimestamp), nil
default:
setPhaseConditionToFailed(cb, &cvi.Status.Phase, fmt.Errorf("unexpected error: %w", err))
Expand All @@ -125,6 +136,7 @@ func (ds ObjectRefVirtualDisk) Sync(ctx context.Context, cvi *virtv2.ClusterVirt

switch {
case errors.Is(err, service.ErrProvisioningFailed):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceDiskProvisioningFailed, "Disk provisioning failed")
cb.
Status(metav1.ConditionFalse).
Reason(cvicondition.ProvisioningFailed).
Expand Down Expand Up @@ -161,6 +173,7 @@ func (ds ObjectRefVirtualDisk) Sync(ctx context.Context, cvi *virtv2.ClusterVirt
Message(service.CapitalizeFirstLetter(err.Error() + "."))
return reconcile.Result{}, nil
case errors.Is(err, service.ErrProvisioningFailed):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceDiskProvisioningFailed, "Disk provisioning failed")
cb.
Status(metav1.ConditionFalse).
Reason(cvicondition.ProvisioningFailed).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -34,6 +35,7 @@ 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"
virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2"
"github.com/deckhouse/virtualization/api/core/v1alpha2/cvicondition"
Expand All @@ -45,13 +47,15 @@ type ObjectRefVirtualImageOnPvc struct {
importerService Importer
statService Stat
dvcrSettings *dvcr.Settings
recorder eventrecord.EventRecorderLogger
}

func NewObjectRefVirtualImageOnPvc(importerService Importer, dvcrSettings *dvcr.Settings, statService Stat) *ObjectRefVirtualImageOnPvc {
func NewObjectRefVirtualImageOnPvc(recorder eventrecord.EventRecorderLogger, importerService Importer, dvcrSettings *dvcr.Settings, statService Stat) *ObjectRefVirtualImageOnPvc {
return &ObjectRefVirtualImageOnPvc{
importerService: importerService,
statService: statService,
dvcrSettings: dvcrSettings,
recorder: recorder,
}
}

Expand Down Expand Up @@ -86,6 +90,12 @@ func (ds ObjectRefVirtualImageOnPvc) Sync(ctx context.Context, cvi *virtv2.Clust

log.Info("Cleaning up...")
case pod == nil:
ds.recorder.Event(
cvi,
corev1.EventTypeNormal,
virtv2.ReasonDataSourceSyncStarted,
"The ObjectRef DataSource import has started",
)
cvi.Status.Progress = ds.statService.GetProgress(cvi.GetUID(), pod, cvi.Status.Progress)
cvi.Status.Target.RegistryURL = ds.statService.GetDVCRImageName(pod)

Expand All @@ -98,6 +108,7 @@ func (ds ObjectRefVirtualImageOnPvc) Sync(ctx context.Context, cvi *virtv2.Clust
case err == nil:
// OK.
case common.ErrQuotaExceeded(err):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceQuotaExceeded, "DataSource quota exceed")
return setQuotaExceededPhaseCondition(cb, &cvi.Status.Phase, err, cvi.CreationTimestamp), nil
default:
setPhaseConditionToFailed(cb, &cvi.Status.Phase, fmt.Errorf("unexpected error: %w", err))
Expand All @@ -120,6 +131,7 @@ func (ds ObjectRefVirtualImageOnPvc) Sync(ctx context.Context, cvi *virtv2.Clust

switch {
case errors.Is(err, service.ErrProvisioningFailed):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceDiskProvisioningFailed, "Disk provisioning failed")
cb.
Status(metav1.ConditionFalse).
Reason(cvicondition.ProvisioningFailed).
Expand Down Expand Up @@ -156,6 +168,7 @@ func (ds ObjectRefVirtualImageOnPvc) Sync(ctx context.Context, cvi *virtv2.Clust
Message(service.CapitalizeFirstLetter(err.Error() + "."))
return reconcile.Result{}, nil
case errors.Is(err, service.ErrProvisioningFailed):
ds.recorder.Event(cvi, corev1.EventTypeWarning, virtv2.ReasonDataSourceDiskProvisioningFailed, "Disk provisioning failed")
cb.
Status(metav1.ConditionFalse).
Reason(cvicondition.ProvisioningFailed).
Expand Down
Loading

0 comments on commit ff7e63e

Please sign in to comment.