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