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 00967f275..5592bfb3d 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/source/http.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/http.go @@ -85,6 +85,16 @@ func (ds HTTPDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (bool return false, err } + clusterDefaultSC, err := ds.diskService.GetDefaultStorageClass(ctx) + if updated, err := setConditionFromStorageClassError(err, vd, &condition); err != nil || updated { + return false, err + } + + sc, err := ds.storageClassService.GetStorageClass(vd.Spec.PersistentVolumeClaim.StorageClass, clusterDefaultSC.Name) + if updated, err := setConditionFromStorageClassError(err, vd, &condition); err != nil || updated { + return false, err + } + switch { case isDiskProvisioningFinished(condition): log.Debug("Disk provisioning finished: clean up") @@ -200,16 +210,6 @@ func (ds HTTPDataSource) Sync(ctx context.Context, vd *virtv2.VirtualDisk) (bool source := ds.getSource(supgen, ds.statService.GetDVCRImageName(pod)) - clusterDefaultSC, err := ds.diskService.GetDefaultStorageClass(ctx) - if updated, err := setPhaseConditionFromStorageError(err, vd, &condition); err != nil || updated { - return false, err - } - - sc, err := ds.storageClassService.GetStorageClass(vd.Spec.PersistentVolumeClaim.StorageClass, clusterDefaultSC.Name) - if updated, err := setPhaseConditionFromStorageError(err, vd, &condition); err != nil || updated { - return false, err - } - err = ds.diskService.Start(ctx, diskSize, sc, source, vd, supgen) if updated, err := setPhaseConditionFromStorageError(err, vd, &condition); err != nil || updated { return false, err diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/source/sources.go b/images/virtualization-artifact/pkg/controller/vd/internal/source/sources.go index 5b2c1192b..8545dc3ad 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/source/sources.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/source/sources.go @@ -127,6 +127,25 @@ type CheckImportProcess interface { CheckImportProcess(ctx context.Context, dv *cdiv1.DataVolume, pvc *corev1.PersistentVolumeClaim) error } +func setConditionFromStorageClassError(err error, vd *virtv2.VirtualDisk, condition *metav1.Condition) (bool, error) { + switch { + case err == nil: + return false, nil + case errors.Is(err, service.ErrDefaultStorageClassNotFound): + condition.Status = metav1.ConditionFalse + condition.Reason = vdcondition.ProvisioningFailed + condition.Message = "Default StorageClass not found in the cluster: please provide a StorageClass name or set a default StorageClass." + return true, nil + case errors.Is(err, service.ErrStorageClassNotAvailable): + condition.Status = metav1.ConditionFalse + condition.Reason = vdcondition.ProvisioningFailed + condition.Message = "Provided StorageClass not available." + return true, nil + default: + return false, err + } +} + func setPhaseConditionFromStorageError(err error, vd *virtv2.VirtualDisk, condition *metav1.Condition) (bool, error) { switch { case err == nil: