Liron Ar has uploaded a new change for review.

Change subject: core: fail deletion of template disk with derived disks
......................................................................

core: fail deletion of template disk with derived disks

When a template disk has derived disks on the selected domain for
deletion, the delete should fail with a proper message.

Change-Id: Ifca48993f40f3c5f7b603f33add7049e78e6c4e9
Signed-off-by: Liron Aravot <lara...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.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
9 files changed, 95 insertions(+), 28 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/28/22428/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
index c7e874b..fc56f9c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
@@ -180,7 +180,7 @@
             return 
failCanDoAction(VdcBllMessages.VM_TEMPLATE_IMAGE_LAST_DOMAIN);
         }
 
-        if (!checkDerivedVmFromTemplateExists(diskImage)){
+        if (!checkDerivedVmFromTemplateExists(diskImage) || 
!checkDerivedDisksFromDiskNotExist(diskImage)){
             return false;
         }
 
@@ -197,6 +197,14 @@
         return true;
     }
 
+    private DiskImagesValidator createDiskImagesValidator(DiskImage disk) {
+      return new DiskImagesValidator(Arrays.asList(disk));
+    }
+
+    private boolean checkDerivedDisksFromDiskNotExist(DiskImage diskImage) {
+        return 
validate(createDiskImagesValidator(diskImage).diskImagesHaveNoDerivedDisks(getParameters().getStorageDomainId()));
+    }
+
     private List<String> getNamesOfDerivedVmsFromTemplate(DiskImage diskImage) 
{
         List<String> result = new ArrayList<String>();
         for (VM vm : getVmDAO().getAllWithTemplate(getVmTemplateId())) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmTemplateCommand.java
index 368caec..629af6b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmTemplateCommand.java
@@ -4,7 +4,6 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -15,6 +14,7 @@
 import org.ovirt.engine.core.bll.quota.QuotaStorageConsumptionParameter;
 import org.ovirt.engine.core.bll.quota.QuotaStorageDependent;
 import org.ovirt.engine.core.bll.storage.StoragePoolValidator;
+import org.ovirt.engine.core.bll.validator.DiskImagesValidator;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.VdcActionType;
@@ -154,28 +154,11 @@
             return false;
         }
 
-        return checkNoDisksBasedOnTemplateDisks();
+        return validate(checkNoDisksBasedOnTemplateDisks());
     }
 
-    private boolean checkNoDisksBasedOnTemplateDisks() {
-        List<String> disksInfo = null;
-        for (DiskImage diskImage : imageTemplates) {
-            List<DiskImage> basedDisks = 
getDiskImageDAO().getAllSnapshotsForParent(diskImage.getImageId());
-            for (DiskImage basedDisk : basedDisks) {
-                if (disksInfo == null) {
-                    disksInfo = new LinkedList<>();
-                }
-                disksInfo.add(String.format("%s  (%s) ", 
basedDisk.getDiskAlias(), basedDisk.getId()));
-            }
-        }
-
-        if (disksInfo != null) {
-            return 
failCanDoAction(VdcBllMessages.VMT_CANNOT_REMOVE_DETECTED_DERIVED_DISKS,
-                    String.format("$disksInfo %s",
-                            String.format(StringUtils.join(disksInfo, "%n"))));
-        }
-
-        return true;
+    private ValidationResult checkNoDisksBasedOnTemplateDisks() {
+        return new 
DiskImagesValidator(imageTemplates).diskImagesHaveNoDerivedDisks(null);
     }
 
     private void fetchImageTemplates() {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java
index a0ccb68..eccf567 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java
@@ -14,6 +14,7 @@
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.DiskImageDAO;
 import org.ovirt.engine.core.dao.SnapshotDao;
 import org.ovirt.engine.core.dao.VmDAO;
 import org.ovirt.engine.core.dao.VmDeviceDAO;
@@ -128,6 +129,32 @@
         return ValidationResult.VALID;
     }
 
+
+    public ValidationResult diskImagesHaveNoDerivedDisks(Guid storageDomainId) 
{
+        List<String> disksInfo = null;
+        for (DiskImage diskImage : diskImages) {
+            if (diskImage.getVmEntityType() != null && 
diskImage.getVmEntityType().isTemplateType()) {
+                List<DiskImage> basedDisks = 
getDiskImageDAO().getAllSnapshotsForParent(diskImage.getImageId());
+                for (DiskImage basedDisk : basedDisks) {
+                    if (storageDomainId == null || 
basedDisk.getStorageIds().contains(storageDomainId)) {
+                        if (disksInfo == null) {
+                            disksInfo = new LinkedList<>();
+                        }
+                        disksInfo.add(String.format("%s  (%s) ", 
basedDisk.getDiskAlias(), basedDisk.getId()));
+                    }
+                }
+            }
+        }
+
+        if (disksInfo != null) {
+            return new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DETECTED_DERIVED_DISKS,
+                    String.format("$disksInfo %s",
+                            String.format(StringUtils.join(disksInfo, "%n"))));
+        }
+
+        return ValidationResult.VALID;
+    }
+
     private DbFacade getDbFacade() {
        return DbFacade.getInstance();
     }
@@ -143,4 +170,8 @@
     protected SnapshotDao getSnapshotDAO() {
         return getDbFacade().getSnapshotDao();
     }
+
+    protected DiskImageDAO getDiskImageDAO() {
+        return getDbFacade().getDiskImageDao();
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java
index 5a271ff..bcaca58 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java
@@ -15,6 +15,7 @@
 import static 
org.ovirt.engine.core.bll.validator.ValidationResultMatchers.isValid;
 import static 
org.ovirt.engine.core.bll.validator.ValidationResultMatchers.replacements;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -32,8 +33,10 @@
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VmDevice;
 import org.ovirt.engine.core.common.businessentities.VmDeviceId;
+import org.ovirt.engine.core.common.businessentities.VmEntityType;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dao.DiskImageDAO;
 import org.ovirt.engine.core.dao.SnapshotDao;
 import org.ovirt.engine.core.dao.VmDAO;
 import org.ovirt.engine.core.dao.VmDeviceDAO;
@@ -58,6 +61,9 @@
     @Mock
     private SnapshotDao snapshotDao;
 
+    @Mock
+    private DiskImageDAO diskImageDao;
+
     @Before
     public void setUp() {
         disk1 = createDisk();
@@ -68,6 +74,7 @@
         doReturn(vmDAO).when(validator).getVmDAO();
         doReturn(vmDeviceDAO).when(validator).getVmDeviceDAO();
         doReturn(snapshotDao).when(validator).getSnapshotDAO();
+        doReturn(diskImageDao).when(validator).getDiskImageDAO();
     }
 
     private static DiskImage createDisk() {
@@ -182,6 +189,44 @@
     }
 
     @Test
+    public void diskImagesHasDerivedDisksNoStorageDomainSpecifiedSuccess() {
+        disk1.setVmEntityType(VmEntityType.TEMPLATE);
+        
when(diskImageDao.getAllSnapshotsForParent(disk1.getImageId())).thenReturn(Collections.<DiskImage>emptyList());
+        assertThat(validator.diskImagesHaveNoDerivedDisks(null),
+                isValid());
+    }
+
+    @Test
+    public void diskImagesHasDerivedDisksNoStorageDomainSpecifiedFailure() {
+        disk1.setVmEntityType(VmEntityType.TEMPLATE);
+        
when(diskImageDao.getAllSnapshotsForParent(disk1.getImageId())).thenReturn(Arrays.asList(disk2));
+        assertThat(validator.diskImagesHaveNoDerivedDisks(null),
+                
failsWith(VdcBllMessages.ACTION_TYPE_FAILED_DETECTED_DERIVED_DISKS));
+    }
+
+    @Test
+    public void diskImagesHasDerivedDisksOnStorageDomain() {
+        Guid storageDomainId = Guid.Empty;
+        disk1.setVmEntityType(VmEntityType.TEMPLATE);
+        ArrayList<Guid> storageDomainIds = new ArrayList<>();
+        storageDomainIds.add(storageDomainId);
+        disk2.setStorageIds(storageDomainIds);
+        
when(diskImageDao.getAllSnapshotsForParent(disk1.getImageId())).thenReturn(Arrays.asList(disk2));
+        assertThat(validator.diskImagesHaveNoDerivedDisks(storageDomainId),
+                
failsWith(VdcBllMessages.ACTION_TYPE_FAILED_DETECTED_DERIVED_DISKS));
+    }
+
+    @Test
+    public void diskImagesNoDerivedDisksOnStorageDomain() {
+        disk1.setVmEntityType(VmEntityType.TEMPLATE);
+        ArrayList<Guid> storageDomainIds = new ArrayList<>();
+        storageDomainIds.add(Guid.newGuid());
+        disk2.setStorageIds(storageDomainIds);
+        
when(diskImageDao.getAllSnapshotsForParent(disk1.getImageId())).thenReturn(Arrays.asList(disk2));
+        assertThat(validator.diskImagesHaveNoDerivedDisks(Guid.Empty), 
isValid());
+    }
+
+    @Test
     public void 
diskImagesSnapshotsNotAttachedToOtherVmsOneDiskSnapshotAttached() {
         List<VmDevice> createdDevices = 
prepareForCheckingIfDisksSnapshotsAttachedToOtherVms();
         createdDevices.get(1).setSnapshotId(Guid.newGuid());
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 4cc803a..4e76593 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
@@ -353,7 +353,7 @@
     // internal const string VMT_CANNOT_REMOVE_DETECTED_DERIVED_VM =
     // "Cannot delete the template, there are desktop(s) created from 
template";
     VMT_CANNOT_REMOVE_DETECTED_DERIVED_VM(ErrorType.CONFLICT),
-    VMT_CANNOT_REMOVE_DETECTED_DERIVED_DISKS(ErrorType.CONFLICT),
+    ACTION_TYPE_FAILED_DETECTED_DERIVED_DISKS(ErrorType.CONFLICT),
     VMT_CANNOT_CREATE_TEMPLATE_FROM_DOWN_VM(ErrorType.CONFLICT),
     VMT_CANNOT_REMOVE_BLANK_TEMPLATE(ErrorType.CONFLICT),
     VMT_CANNOT_EDIT_BLANK_TEMPLATE(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 027402f..8f7974e 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -10,7 +10,7 @@
 IRS_RESPONSE_ERROR=Storage Manager response error.
 MAC_POOL_NOT_ENOUGH_MAC_ADDRESSES=Not enough MAC addresses left in MAC Address 
Pool.
 VMT_CANNOT_REMOVE_DETECTED_DERIVED_VM=Cannot delete Template. Template is 
being used by the following VMs: ${vmsList}.
-VMT_CANNOT_REMOVE_DETECTED_DERIVED_DISKS=Cannot delete Template. The following 
Disk(s) are based on the Template disk(s): \n ${disksInfo}
+ACTION_TYPE_FAILED_DETECTED_DERIVED_DISKS=Cannot ${action} ${type}. The 
following Disk(s) are based on it: \n ${disksInfo}.
 VMT_CANNOT_REMOVE_DOMAINS_LIST_MISMATCH=Cannot delete Template. The Template 
does not exist on the following Storage Domains: ${domainsList}.\nEither verify 
that Template exists on all Storage Domains listed on the domains list,\nor do 
not send domains list in order to delete all instances of the Template from the 
system.
 ACTION_TYPE_FAILED_VM_IMAGE_DOES_NOT_EXIST=Cannot ${action} ${type}. VM's 
Image does not exist.
 ACTION_TYPE_FAILED_VM_SNAPSHOT_DOES_NOT_EXIST=Cannot ${action} ${type}. VM's 
Snapshot does not exist.
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 598dead..d6522ef 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
@@ -40,8 +40,8 @@
     @DefaultStringValue("Cannot delete Template. Template is being used by the 
following VMs: ${vmsList}.")
     String VMT_CANNOT_REMOVE_DETECTED_DERIVED_VM();
 
-    @DefaultStringValue("Cannot delete Template. The following Disk(s) are 
based on the Template disk(s): \n ${disksInfo}")
-    String VMT_CANNOT_REMOVE_DETECTED_DERIVED_DISKS();
+    @DefaultStringValue("Cannot ${action} ${type}. The following Disk(s) are 
based on it: \n ${disksInfo}.")
+    String ACTION_TYPE_FAILED_DETECTED_DERIVED_DISKS();
 
     @DefaultStringValue("Cannot delete Template. The Template does not exist 
on the following Storage Domains: ${domainsList}.\nEither verify that Template 
exists on all Storage Domains listed on the domains list,\nor do not send 
domains list in order to delete all instances of the Template from the system.")
     String VMT_CANNOT_REMOVE_DOMAINS_LIST_MISMATCH();
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 8b6fc7b..c63e704 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
@@ -10,7 +10,7 @@
 IRS_RESPONSE_ERROR=Storage Manager response error.
 MAC_POOL_NOT_ENOUGH_MAC_ADDRESSES=Not enough MAC addresses left in MAC Address 
Pool.
 VMT_CANNOT_REMOVE_DETECTED_DERIVED_VM=Cannot delete Template. Template is 
being used by the following VMs: ${vmsList}.
-VMT_CANNOT_REMOVE_DETECTED_DERIVED_DISKS=Cannot delete Template. The following 
Disk(s) are based on the Template disk(s): \n ${disksInfo}
+ACTION_TYPE_FAILED_DETECTED_DERIVED_DISKS=Cannot ${action} ${type}. The 
following Disk(s) are based on it: \n ${disksInfo}.
 VMT_CANNOT_REMOVE_DOMAINS_LIST_MISMATCH=Cannot delete Template. The Template 
does not exist on the following Storage Domains: ${domainsList}.\nEither verify 
that Template exists on all Storage Domains listed on the domains list,\nor do 
not send domains list in order to delete all instances of the Template from the 
system.
 ACTION_TYPE_FAILED_VM_IMAGE_DOES_NOT_EXIST=Cannot ${action} ${type}. VM's 
Image does not exist.
 ACTION_TYPE_FAILED_VM_SNAPSHOT_DOES_NOT_EXIST=Cannot ${action} ${type}. VM's 
Snapshot does not exist.
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 8b8047d..eee490b 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
@@ -10,7 +10,7 @@
 IRS_RESPONSE_ERROR=Storage Manager response error.
 MAC_POOL_NOT_ENOUGH_MAC_ADDRESSES=Not enough MAC addresses left in MAC Address 
Pool.
 VMT_CANNOT_REMOVE_DETECTED_DERIVED_VM=Cannot delete Template. Template is 
being used by the following VMs: ${vmsList}.
-VMT_CANNOT_REMOVE_DETECTED_DERIVED_DISKS=Cannot delete Template. The following 
Disk(s) are based on the Template disk(s): \n ${disksInfo}
+ACTION_TYPE_FAILED_DETECTED_DERIVED_DISKS=Cannot ${action} ${type}. The 
following Disk(s) are based on it: \n ${disksInfo}.
 VMT_CANNOT_REMOVE_DOMAINS_LIST_MISMATCH=Cannot delete Template. The Template 
does not exist on the following Storage Domains: ${domainsList}.\nEither verify 
that Template exists on all Storage Domains listed on the domains list,\nor do 
not send domains list in order to delete all instances of the Template from the 
system.
 ACTION_TYPE_FAILED_VM_IMAGE_DOES_NOT_EXIST=Cannot ${action} ${type}. VM's 
Image does not exist.
 ACTION_TYPE_FAILED_VM_SNAPSHOT_DOES_NOT_EXIST=Cannot ${action} ${type}. VM's 
Snapshot does not exist.


-- 
To view, visit http://gerrit.ovirt.org/22428
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifca48993f40f3c5f7b603f33add7049e78e6c4e9
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Liron Ar <lara...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to