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

Reply via email to