Hello Fred Rolland,

I'd like you to do a code review.  Please visit

    http://gerrit.ovirt.org/37514

to review the following change.

Change subject: engine:Check dependent VMs when removing template
......................................................................

engine:Check dependent VMs when removing template

When removing a backup template from an export domain, we now check if
no dependent backup VMs exits.
If such exists, the remove operation fill no be performed and a message
will be prompt to the user with the name of the VM.

Change-Id: I8cba5df5a41973741a855ae0c9efddd56100d2fd
Bug-Url: https://bugzilla.redhat.com/1162532
Signed-off-by: Fred Rolland <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmTemplateFromImportExportCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidator.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidatorTest.java
3 files changed, 94 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/14/37514/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmTemplateFromImportExportCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmTemplateFromImportExportCommand.java
index d301d6b..1244629 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmTemplateFromImportExportCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmTemplateFromImportExportCommand.java
@@ -78,6 +78,11 @@
             retVal = false;
         }
         if (retVal) {
+            // Check if we have Backup VMs on storage that are thin 
provisioned and based on this template
+            StorageDomainValidator validator = new 
StorageDomainValidator(getStorageDomain());
+            retVal = 
validate(validator.isTemplateInUseByVmInStorageDomain(getVmTemplate()));
+        }
+        if (retVal) {
             // we fectch from db and not using VmTmplate property becase
             // VmTemplate is the one from export domain and not from database
             VmTemplate tmpl = 
DbFacade.getInstance().getVmTemplateDao().get(getVmTemplateId());
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidator.java
index 47724d3..4e08f3d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidator.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidator.java
@@ -1,9 +1,14 @@
 package org.ovirt.engine.core.bll.validator.storage;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 
+import org.apache.commons.lang.StringUtils;
+import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.bll.ValidationResult;
+import org.ovirt.engine.core.bll.interfaces.BackendInternal;
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
 import org.ovirt.engine.core.common.businessentities.StorageDomainDynamic;
@@ -13,11 +18,16 @@
 import org.ovirt.engine.core.common.businessentities.StorageFormatType;
 import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
 import org.ovirt.engine.core.common.businessentities.StorageType;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VmTemplate;
 import org.ovirt.engine.core.common.businessentities.VolumeFormat;
 import org.ovirt.engine.core.common.businessentities.VolumeType;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import 
org.ovirt.engine.core.common.queries.GetAllFromExportDomainQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
 
 public class StorageDomainValidator {
 
@@ -242,6 +252,7 @@
         return totalSizeForDisks;
     }
 
+
     private static interface SizeAssessment {
         public double getSizeForDisk(DiskImage diskImage);
     }
@@ -296,4 +307,37 @@
         }
         return ValidationResult.VALID;
     }
+
+    public ValidationResult isTemplateInUseByVmInStorageDomain(VmTemplate 
vmTemplate) {
+        List<VM> vmsInExportDomain = getVmsFromExportDomain(storageDomain);
+        List<String> problematicVmNames = new ArrayList<String>();
+        for (VM vm : vmsInExportDomain) {
+            if (vmTemplate.getId().equals(vm.getVmtGuid())) {
+                problematicVmNames.add(vm.getName());
+            }
+        }
+
+        if (!problematicVmNames.isEmpty()) {
+            return new 
ValidationResult(VdcBllMessages.VMT_CANNOT_REMOVE_DETECTED_DERIVED_VM,
+                    String.format("$vmsList %1$s", 
StringUtils.join(problematicVmNames, ",")));
+        }
+        return ValidationResult.VALID;
+    }
+
+    protected List<VM> getVmsFromExportDomain(StorageDomain storageDomain) {
+        List<VM> vms = new ArrayList<VM>();
+        GetAllFromExportDomainQueryParameters queryParams =
+                new 
GetAllFromExportDomainQueryParameters(storageDomain.getStoragePoolId(), 
storageDomain.getId());
+        VdcQueryReturnValue retVal = 
getBackend().runInternalQuery(VdcQueryType.GetVmsFromExportDomain, queryParams);
+
+        if (retVal != null && retVal.getReturnValue() != null && 
retVal.getSucceeded()) {
+            vms = retVal.getReturnValue();
+        }
+        return vms;
+    }
+
+    protected BackendInternal getBackend() {
+        return Backend.getInstance();
+    }
+
 }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidatorTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidatorTest.java
index f293d69..63d1751 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidatorTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/storage/StorageDomainValidatorTest.java
@@ -3,7 +3,13 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
 import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -13,8 +19,11 @@
 import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus;
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.StorageType;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VmTemplate;
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.utils.MockConfigRule;
 
 /**
@@ -85,6 +94,42 @@
                         
.equals(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL));
     }
 
+    @Test
+    public void testNoVmsUsingTemplateInDomain() {
+        VmTemplate template = new VmTemplate();
+        StorageDomainValidator validator = spy(new 
StorageDomainValidator(domain));
+        
doReturn(Collections.emptyList()).when(validator).getVmsFromExportDomain(domain);
+        assertTrue("No VM should be referencing the template", 
validator.isTemplateInUseByVmInStorageDomain(template)
+                .isValid());
+    }
+
+    @Test
+    public void testNoDependentVmsUsingTemplateInDomain() {
+        VmTemplate template = new VmTemplate();
+        template.setId(Guid.newGuid());
+        StorageDomainValidator validator = spy(new 
StorageDomainValidator(domain));
+        List<VM> vms = new ArrayList<VM>();
+        vms.add(new VM());
+        doReturn(vms).when(validator).getVmsFromExportDomain(domain);
+        assertTrue("The independent VM should no be referencing the template",
+                
validator.isTemplateInUseByVmInStorageDomain(template).isValid());
+    }
+
+    @Test
+    public void testDependentVmsUsingTemplateInDomain() {
+        VmTemplate template = new VmTemplate();
+        Guid templateGuid = Guid.newGuid();
+        template.setId(templateGuid);
+        StorageDomainValidator validator = spy(new 
StorageDomainValidator(domain));
+        List<VM> vms = new ArrayList<VM>();
+        VM vm = new VM();
+        vm.setVmtGuid(templateGuid);
+        vms.add(vm);
+        doReturn(vms).when(validator).getVmsFromExportDomain(domain);
+        assertFalse("The dependent VM should be referencing the template",
+                
validator.isTemplateInUseByVmInStorageDomain(template).isValid());
+    }
+
     private static StorageDomain mockStorageDomain(int availableSize, int 
usedSize, StorageType storageType) {
         StorageDomain sd = new StorageDomain();
         sd.setAvailableDiskSize(availableSize);


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8cba5df5a41973741a855ae0c9efddd56100d2fd
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Freddy Rolland <[email protected]>
Gerrit-Reviewer: Fred Rolland <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to