Maor Lipchuk has uploaded a new change for review. Change subject: core: refactor Cinder Validator and adding snapshot count validation. ......................................................................
core: refactor Cinder Validator and adding snapshot count validation. 1. Adding a private class CinderStorageRelatedDisksAndProxy which encapsulate the relation between Storage Domain id, list of disks and CinderProxy. 2. Adding an enum of the Cinder type which being validated (Volume or Snapshot) 3. Adding a validation for snapshot capacity using the new private class. Change-Id: Iab98e97d26a22fc3275b1a2393fbaab6701b0745 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, 114 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/32/41132/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 04be14f..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 @@ -3,8 +3,11 @@ import com.woorea.openstack.base.client.OpenStackResponseException; 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; import java.util.Map; import java.util.concurrent.Callable; @@ -23,6 +26,11 @@ private Iterable<CinderDisk> cinderDisks; private Map<Guid, OpenStackVolumeProviderProxy> diskProxyMap; + private Map<Guid, CinderStorageRelatedDisksAndProxy> cinderStorageToRelatedDisks; + private enum CinderVolumeType { + Volume, + Snapshot + } public CinderDisksValidator(Iterable<CinderDisk> cinderDisks) { this.cinderDisks = cinderDisks; @@ -64,6 +72,99 @@ }); } + 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 { + private Guid storageDomainId; + private List<CinderDisk> cinderDisks = new ArrayList<>(); + private OpenStackVolumeProviderProxy proxy; + + public CinderStorageRelatedDisksAndProxy(Guid storageDomainId, List<CinderDisk> cinderDisks, OpenStackVolumeProviderProxy proxy) { + setStorageDomainId(storageDomainId); + setCinderDisks(cinderDisks); + setProxy(proxy); + } + + public Guid getStorageDomainId() { + return storageDomainId; + } + + public void setStorageDomainId(Guid storageDomainId) { + this.storageDomainId = storageDomainId; + } + + public List<CinderDisk> getCinderDisks() { + return cinderDisks; + } + + public void setCinderDisks(List<CinderDisk> cinderDisks) { + this.cinderDisks = cinderDisks; + } + + public OpenStackVolumeProviderProxy getProxy() { + return proxy; + } + + public void setProxy(OpenStackVolumeProviderProxy proxy) { + this.proxy = proxy; + } + } + public ValidationResult validateCinderDisksAlreadyRegistered() { return validate(new Callable<ValidationResult>() { @Override @@ -102,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 d92e9a4..7fa8799 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 51c5fba..55c553b 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 8eba193..ee737c5 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 28223ab..f767384 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 0928b92..d6a1de5 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/41132 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iab98e97d26a22fc3275b1a2393fbaab6701b0745 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
