package org.ovirt.engine.core.common.utils; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.doReturn; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.ovirt.engine.core.common.businessentities.BootSequence; import org.ovirt.engine.core.common.businessentities.VM; 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.network.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.storage.DiskVmElement; import org.ovirt.engine.core.compat.Guid; @RunWith(MockitoJUnitRunner.class) public class VmDeviceCommonUtilsTest { private static final String NIC_1_NAME = "nic1"; private static final String NIC_2_NAME = "nic2"; @Mock private VM vm; @Test public void testUpdateVmDevicesBootOrder() { Map<VmDeviceId, DiskVmElement> idToDiskElement = new HashMap<>(); List<VmNetworkInterface> interfaces = new LinkedList<>(); VmDevice nic1 = createNetworkInterface(true, NIC_1_NAME, interfaces); VmDevice unmanagedNic = createUnmanagedNetworkInterface(true); VmDevice nic2 = createNetworkInterface(true, NIC_2_NAME, interfaces); VmDevice nonBootableNic = createNetworkInterface(false, "", interfaces); VmDevice bootableDisk = createDiskDevice(true, idToDiskElement); VmDevice nonBootableDisk = createDiskDevice(false, idToDiskElement); VmDevice cd = createCdRomDevice(); doReturn(BootSequence.DNC).when(vm).getDefaultBootSequence(); // it is important that nic2 will be before nic1 to ensure their boot order is // ordered according to their names and not according to their position in the list VmDeviceCommonUtils.updateVmDevicesBootOrder( vm.getDefaultBootSequence(), Arrays.asList(bootableDisk, nic2, cd, nic1, nonBootableDisk, unmanagedNic), interfaces, idToDiskElement); int index = 1; assertEquals("Wrong boot order for CD", index++, cd.getBootOrder()); assertEquals("Wrong boot order for nic1", index++, nic1.getBootOrder()); assertEquals("Wrong boot order for nic2", index++, nic2.getBootOrder()); assertEquals("Wrong boot order for non bootable nic", 0, nonBootableNic.getBootOrder()); assertEquals("Wrong boot order for unmanaged nic", 0, unmanagedNic.getBootOrder()); assertEquals("Wrong boot order for bootable disk", index++, bootableDisk.getBootOrder()); assertEquals("Wrong boot order for non bootable disk", 0, nonBootableDisk.getBootOrder()); } private VmDevice createNetworkInterface(boolean plugged, String name, List<VmNetworkInterface> interfaces) { Guid id = Guid.newGuid(); VmNetworkInterface vmNic = new VmNetworkInterface(); vmNic.setId(id); vmNic.setName(name); interfaces.add(vmNic); VmDevice device = createNetworkInterfaceDevice(plugged, id); device.setManaged(true); return device; } private VmDevice createUnmanagedNetworkInterface(boolean plugged) { VmDevice device = createNetworkInterfaceDevice(plugged, Guid.newGuid()); device.setManaged(false); return device; } private VmDevice createNetworkInterfaceDevice(boolean plugged, Guid id) { VmDevice device = new VmDevice(); device.setType(VmDeviceGeneralType.INTERFACE); device.setDevice(VmDeviceType.BRIDGE.getName()); device.setPlugged(plugged); device.setId(new VmDeviceId(id, null)); return device; } private VmDevice createDiskDevice(boolean boot, Map<VmDeviceId, DiskVmElement> idToDiskElement) { Guid id = Guid.newGuid(); VmDevice device = new VmDevice(); device.setType(VmDeviceGeneralType.DISK); device.setDevice(VmDeviceType.DISK.getName()); device.setId(new VmDeviceId(id, null)); DiskVmElement dve = new DiskVmElement(new VmDeviceId(id, null)); dve.setBoot(boot); idToDiskElement.put(dve.getId(), dve); return device; } private VmDevice createCdRomDevice() { Guid id = Guid.newGuid(); VmDevice device = new VmDevice(); device.setType(VmDeviceGeneralType.DISK); device.setDevice(VmDeviceType.CDROM.getName()); device.setPlugged(true); device.setId(new VmDeviceId(id, null)); return device; } }