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

Reply via email to