Maor Lipchuk has uploaded a new change for review. Change subject: core: Adding cinder snapshot capacity validation. ......................................................................
core: Adding cinder snapshot capacity validation. Adding a validation for snapshot capacity using the new private Change-Id: Icf8c0a6b59753a1aee6b562c44a9a83cc791e091 Bug-Url: https://bugzilla.redhat.com/1185826 Signed-off-by: Maor Lipchuk <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/CinderDisksValidator.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java M frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties M frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties 6 files changed, 72 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/63/41463/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/CinderDisksValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/CinderDisksValidator.java index 7aa08ab..b511ef5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/CinderDisksValidator.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/CinderDisksValidator.java @@ -4,6 +4,7 @@ import com.woorea.openstack.cinder.model.Limits; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -25,6 +26,7 @@ private Iterable<CinderDisk> cinderDisks; private Map<Guid, OpenStackVolumeProviderProxy> diskProxyMap; + private Map<Guid, CinderStorageRelatedDisksAndProxy> cinderStorageToRelatedDisks; private enum CinderVolumeType { Volume, Snapshot @@ -68,6 +70,63 @@ return ValidationResult.VALID; } }); + } + + public ValidationResult validateCinderDiskSnapshotsLimits() { + return validate(new Callable<ValidationResult>() { + @Override + public ValidationResult call() { + Map<Guid, CinderStorageRelatedDisksAndProxy> relatedCinderDisksByStorageMap = + getRelatedCinderDisksToStorageDomainMap(); + Collection<CinderStorageRelatedDisksAndProxy> relatedCinderDisksByStorageCollection = + relatedCinderDisksByStorageMap.values(); + for (CinderStorageRelatedDisksAndProxy relatedCinderDisksByStorage : relatedCinderDisksByStorageCollection) { + Limits limits = relatedCinderDisksByStorage.getProxy().getLimits(); + int numOfDisks = relatedCinderDisksByStorage.getCinderDisks().size(); + if (isLimitExceeded(limits, CinderVolumeType.Snapshot, numOfDisks)) { + String storageName = + getStorageDomainDao().get(relatedCinderDisksByStorage.getStorageDomainId()) + .getStorageName(); + return new ValidationResult(VdcBllMessages.CANNOT_ADD_CINDER_DISK_SNAPSHOT_LIMIT_EXCEEDED, + String.format("$maxTotalSnapshots %d", limits.getAbsolute().getMaxTotalVolumes()), + String.format("$storageName %s", storageName)); + } + } + return ValidationResult.VALID; + } + }); + } + + private boolean isLimitExceeded(Limits limits, CinderVolumeType cinderType, int diskCount) { + if (cinderType == CinderVolumeType.Snapshot) { + return (limits.getAbsolute().getTotalSnapshotsUsed() + diskCount >= limits.getAbsolute().getMaxTotalSnapshots()); + } + if (cinderType == CinderVolumeType.Volume) { + return (limits.getAbsolute().getTotalVolumesUsed() + diskCount >= limits.getAbsolute().getMaxTotalVolumes()); + } + return false; + } + + private Map<Guid, CinderStorageRelatedDisksAndProxy> getRelatedCinderDisksToStorageDomainMap() { + if (cinderStorageToRelatedDisks == null) { + cinderStorageToRelatedDisks = new HashMap<>(); + for (CinderDisk cinderDisk : cinderDisks) { + Guid storageDomainId = cinderDisk.getStorageIds().get(0); + CinderStorageRelatedDisksAndProxy cinderRelatedDisksAndProxy = + cinderStorageToRelatedDisks.get(storageDomainId); + if (cinderRelatedDisksAndProxy == null) { + List cinderDisks = new ArrayList(); + cinderDisks.add(cinderDisk); + OpenStackVolumeProviderProxy proxy = diskProxyMap.get(cinderDisk.getId()); + CinderStorageRelatedDisksAndProxy newCinderRelatedDisksAndProxy = + new CinderStorageRelatedDisksAndProxy(storageDomainId, cinderDisks, proxy); + cinderStorageToRelatedDisks.put(storageDomainId, newCinderRelatedDisksAndProxy); + } else { + cinderRelatedDisksAndProxy.getCinderDisks().add(cinderDisk); + } + } + } + return cinderStorageToRelatedDisks; } private class CinderStorageRelatedDisksAndProxy { @@ -144,4 +203,9 @@ protected DiskDao getDiskDao() { return DbFacade.getInstance().getDiskDao(); } + + protected StorageDomainDAO getStorageDomainDao() { + return DbFacade.getInstance().getStorageDomainDao(); + } + } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java index 38902b9..8b1ef97 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java @@ -1223,6 +1223,8 @@ ACTION_TYPE_FAILED_PROVIDER_NOT_SUPPORTED(ErrorType.NOT_SUPPORTED), ACTION_TYPE_FAILED_CINDER(ErrorType.INTERNAL_ERROR), CANNOT_ADD_CINDER_DISK_VOLUME_LIMIT_EXCEEDED(ErrorType.CONFLICT), + CANNOT_ADD_CINDER_DISK_SNAPSHOT_LIMIT_EXCEEDED(ErrorType.CONFLICT), + CINDER_DISK_ALREADY_REGISTERED(ErrorType.CONFLICT), ERROR_CANNOT_DETACH_CINDER_PROVIDER_WITH_IMAGES(ErrorType.CONFLICT), diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index d3487d4..101fe57 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -1418,6 +1418,7 @@ ACTION_TYPE_FAILED_PROVIDER_NOT_SUPPORTED=Cannot ${action} ${type}. The current type ${providerType} is not supported. ACTION_TYPE_FAILED_CINDER=Cannot ${action} ${type}. An error occurred on Cinder - '${cinderException}'. CANNOT_ADD_CINDER_DISK_VOLUME_LIMIT_EXCEEDED=Cannot ${action} ${type}. Maximum number of volumes allowed (${maxTotalVolumes}) exceeded - could not create Cinder disk ${diskAlias}. +CANNOT_ADD_CINDER_DISK_SNAPSHOT_LIMIT_EXCEEDED=Cannot ${action} ${type}. Maximum number of snapshots allowed (${maxTotalSnapshots}) exceeded - could not create Cinder disk snapshot on Storage ${storageName}. CINDER_DISK_ALREADY_REGISTERED=Cannot ${action} ${type}. Cinder disk is already registered (${diskAlias}). ERROR_CANNOT_DETACH_CINDER_PROVIDER_WITH_IMAGES=Cannot detach a non empty Cinder provider.\n\ -Please remove all VMs / Templates / Disks and try again. diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java index 3bd8209..829befc 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java @@ -3794,6 +3794,9 @@ @DefaultStringValue("Cannot ${action} ${type}. Maximum number of volumes allowed (${maxTotalVolumes}) exceeded - could not create Cinder disk ${diskAlias}.") String CANNOT_ADD_CINDER_DISK_VOLUME_LIMIT_EXCEEDED(); + @DefaultStringValue("Cannot ${action} ${type}. Maximum number of snapshots allowed (${maxTotalSnapshots}) exceeded - could not create Cinder disk snapshot on Storage ${storageName}.") + String CANNOT_ADD_CINDER_DISK_SNAPSHOT_LIMIT_EXCEEDED(); + @DefaultStringValue("Cannot ${action} ${type}. Cinder disk is already registered (${diskAlias}).") String CINDER_DISK_ALREADY_REGISTERED(); diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index 6762f16..2f22322 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -1097,6 +1097,7 @@ ACTION_TYPE_FAILED_PROVIDER_NOT_SUPPORTED=Cannot ${action} ${type}. The current type ${providerType} is not supported. ACTION_TYPE_FAILED_CINDER=Cannot ${action} ${type}. An error occurred on Cinder - '${cinderException}'. CANNOT_ADD_CINDER_DISK_VOLUME_LIMIT_EXCEEDED=Cannot ${action} ${type}. Maximum number of volumes allowed (${maxTotalVolumes}) exceeded - could not create Cinder disk ${diskAlias}. +CANNOT_ADD_CINDER_DISK_SNAPSHOT_LIMIT_EXCEEDED=Cannot ${action} ${type}. Maximum number of snapshots allowed (${maxTotalSnapshots}) exceeded - could not create Cinder disk snapshot on Storage ${storageName}. CINDER_DISK_ALREADY_REGISTERED=Cannot ${action} ${type}. Cinder disk is already registered (${diskAlias}). ACTION_TYPE_FAILED_VM_USES_SCSI_RESERVATION=Cannot ${action} ${type}. VM uses SCSI reservation. diff --git a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index 8748d94..26aa7d1 100644 --- a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -1363,6 +1363,7 @@ ACTION_TYPE_FAILED_PROVIDER_NOT_SUPPORTED=Cannot ${action} ${type}. The current type ${providerType} is not supported. ACTION_TYPE_FAILED_CINDER=Cannot ${action} ${type}. An error occurred on Cinder - '${cinderException}'. CANNOT_ADD_CINDER_DISK_VOLUME_LIMIT_EXCEEDED=Cannot ${action} ${type}. Maximum number of volumes allowed (${maxTotalVolumes}) exceeded - could not create Cinder disk ${diskAlias}. +CANNOT_ADD_CINDER_DISK_SNAPSHOT_LIMIT_EXCEEDED=Cannot ${action} ${type}. Maximum number of snapshots allowed (${maxTotalSnapshots}) exceeded - could not create Cinder disk snapshot on Storage ${storageName}. CINDER_DISK_ALREADY_REGISTERED=Cannot ${action} ${type}. Cinder disk is already registered (${diskAlias}). ERROR_CANNOT_DETACH_CINDER_PROVIDER_WITH_IMAGES=Cannot detach a non empty Cinder provider.\n\ -Please remove all VMs / Templates / Disks and try again. -- To view, visit https://gerrit.ovirt.org/41463 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Icf8c0a6b59753a1aee6b562c44a9a83cc791e091 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Maor Lipchuk <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
