package org.ovirt.engine.core.bll; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.ovirt.engine.core.common.businessentities.OriginType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmDevice; import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType; import org.ovirt.engine.core.common.businessentities.VmDeviceId; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.storage.Disk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType; import org.ovirt.engine.core.common.businessentities.storage.ImageStatus; import org.ovirt.engine.core.common.businessentities.storage.LunDisk; import org.ovirt.engine.core.common.utils.VmDeviceType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.utils.RandomUtils; public class VmHandlerTest { private VmHandler vmHandler = new VmHandler(); @Before public void setUp() { vmHandler.init(); } @Test public void testUpdateFieldsNameInStatusUp() { VmStatic src = new VmStatic(); src.setName(RandomUtils.instance().nextString(10)); src.setInterfaces(new ArrayList<>(2)); VmStatic dest = new VmStatic(); dest.setName(RandomUtils.instance().nextString(10)); assertFalse("Update should not be valid for different names", vmHandler.isUpdateValid(src, dest)); } @Test public void filterDisksForVmDiskSnapshots() { DiskImage snapshotDisk1 = createDiskImage(false); DiskImage snapshotDisk2 = createDiskImage(false); VM vm = new VM(); vm.setId(Guid.newGuid()); List<Disk> disks = new LinkedList<>(); disks.add(snapshotDisk1); disks.add(snapshotDisk2); populateVmWithDisks(disks, vm); vmHandler.filterImageDisksForVM(vm); assertTrue(vm.getDiskList().isEmpty()); assertTrue(vm.getManagedVmDeviceMap().isEmpty()); } @Test public void filterDisksForVmMixedDiskTypes() { DiskImage snapshotDisk = createDiskImage(false); DiskImage regularDisk = createDiskImage(true); LunDisk lunDisk = createLunDisk(); VM vm = new VM(); vm.setId(Guid.newGuid()); populateVmWithDisks(Arrays.asList(snapshotDisk, regularDisk, lunDisk), vm); vmHandler.filterImageDisksForVM(vm); assertFalse(vm.getDiskList().contains(snapshotDisk)); assertTrue(vm.getDiskList().contains(regularDisk)); assertTrue(vm.getManagedVmDeviceMap().containsKey(regularDisk.getId())); assertFalse(vm.getManagedVmDeviceMap().containsKey(lunDisk.getId())); assertFalse(vm.getManagedVmDeviceMap().containsKey(snapshotDisk.getId())); } private void populateVmWithDisks(List<Disk> disks, VM vm) { vmHandler.updateDisksForVm(vm, disks); for (Disk disk : disks) { VmDevice device = new VmDevice(new VmDeviceId(disk.getId(), vm.getId()), VmDeviceGeneralType.DISK, VmDeviceType.DISK.getName(), "", null, true, true, false, "", null, disk.getDiskStorageType() == DiskStorageType.IMAGE ? ((DiskImage)disk).getSnapshotId() : null, null); vm.getManagedVmDeviceMap().put(disk.getId(), device); } } private LunDisk createLunDisk() { LunDisk lunDisk = new LunDisk(); lunDisk.setId(Guid.newGuid()); return lunDisk; } private static DiskImage createDiskImage(boolean active) { DiskImage di = new DiskImage(); di.setActive(active); di.setId(Guid.newGuid()); di.setImageId(Guid.newGuid()); di.setParentId(Guid.newGuid()); di.setImageStatus(ImageStatus.OK); return di; } @Test public void testInvalidUpdateOfNonEditableFieldOnRunningVm() { // Given VmStatic src = new VmStatic(); src.setId(Guid.newGuid()); VmStatic dest = new VmStatic(); dest.setId(Guid.newGuid()); // When boolean updateIsValid = vmHandler.isUpdateValid(src, dest); // Then assertFalse("Update should be invalid for different IDs", updateIsValid); } @Test public void testValidUpdateOfEditableFieldOnDownVm() { // Given VmStatic src = new VmStatic(); src.setClusterId(Guid.newGuid()); VmStatic dest = new VmStatic(); dest.setClusterId(Guid.newGuid()); // When boolean updateIsValid = vmHandler.isUpdateValid(src, dest, VMStatus.Down, false); // Then assertTrue("Update should be valid for different cluster IDs in the down state", updateIsValid); } @Test public void testInValidUpdateOfStatusRestrictedEditableFieldOnRunningVm() { // Given VmStatic src = new VmStatic(); src.setSingleQxlPci(true); VmStatic dest = new VmStatic(); dest.setSingleQxlPci(false); // When boolean updateIsValid = vmHandler.isUpdateValid(src, dest, VMStatus.Up, false); // Then assertFalse("Update should be invalid for different single QXL PCI statuses on a running VM", updateIsValid); } @Test public void testValidUpdateOfHostedEngineEditableFieldOnRunningVm() { // Given VmStatic src = new VmStatic(); src.setOrigin(OriginType.MANAGED_HOSTED_ENGINE); src.setDescription(RandomUtils.instance().nextString(10)); VmStatic dest = new VmStatic(); dest.setOrigin(OriginType.MANAGED_HOSTED_ENGINE); dest.setDescription(RandomUtils.instance().nextString(10)); // When boolean updateIsValid = vmHandler.isUpdateValid(src, dest, VMStatus.Up, false); // Then assertTrue("Update should be valid for different descriptions on a running, hosted engine VM", updateIsValid); } @Test public void testInvalidUpdateOfHostedEngineNonEditableFieldOnRunningVm() { // Given VmStatic src = new VmStatic(); src.setOrigin(OriginType.MANAGED_HOSTED_ENGINE); src.setName(RandomUtils.instance().nextString(10)); VmStatic dest = new VmStatic(); dest.setOrigin(OriginType.MANAGED_HOSTED_ENGINE); dest.setName(RandomUtils.instance().nextString(10)); // When boolean updateIsValid = vmHandler.isUpdateValid(src, dest, VMStatus.Up, false); // Then assertFalse("Update should be invalid for different names on a running, hosted engine VM", updateIsValid); } @Test public void testValidUpdateOfHotSetEditableFieldOnRunningVm() { // Given int srcNumOfSockets = 2; int destNumOfSockets = 4; VmStatic src = new VmStatic(); src.setNumOfSockets(srcNumOfSockets); VmStatic dest = new VmStatic(); dest.setNumOfSockets(destNumOfSockets); // When boolean updateIsValid = vmHandler.isUpdateValid(src, dest, VMStatus.Up, true); // Then assertTrue("Update should be valid for different number of sockets on a running VM", updateIsValid); } }