package org.ovirt.engine.core.bll.storage.disk.image; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import org.junit.Before; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.ovirt.engine.core.bll.BaseCommandTest; import org.ovirt.engine.core.common.action.RemoveImageParameters; import org.ovirt.engine.core.common.businessentities.OriginType; import org.ovirt.engine.core.common.businessentities.Snapshot; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmBase; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskInterface; import org.ovirt.engine.core.common.businessentities.storage.DiskVmElement; import org.ovirt.engine.core.common.businessentities.storage.ImageStatus; import org.ovirt.engine.core.common.businessentities.storage.QcowCompat; import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat; import org.ovirt.engine.core.common.businessentities.storage.VolumeType; import org.ovirt.engine.core.common.osinfo.OsRepository; import org.ovirt.engine.core.common.queries.VmIconIdSizePair; import org.ovirt.engine.core.common.utils.SimpleDependencyInjector; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.utils.MockConfigRule; import org.ovirt.engine.core.utils.RandomUtils; import org.ovirt.engine.core.utils.RandomUtilsSeedingRule; import org.ovirt.engine.core.utils.ovf.OvfManager; import org.ovirt.engine.core.utils.ovf.OvfReaderException; import org.ovirt.engine.core.utils.ovf.OvfVmIconDefaultsProvider; public class RemoveImageCommandTest extends BaseCommandTest { @ClassRule public static MockConfigRule mcr = new MockConfigRule(); @Rule public RandomUtilsSeedingRule rusr = new RandomUtilsSeedingRule(); @Mock OsRepository osRepository; @Mock private OvfVmIconDefaultsProvider iconDefaultsProvider; @Spy @InjectMocks private OvfManager ovfManager = new OvfManager(); /** The command to test */ @Spy private RemoveImageCommand<RemoveImageParameters> cmd = new RemoveImageCommand<>(new RemoveImageParameters(Guid.newGuid()), null); @SuppressWarnings("serial") @Before public void setUp() { when(iconDefaultsProvider.getVmIconDefaults()).thenReturn(new HashMap<Integer, VmIconIdSizePair>(){{ put(0, new VmIconIdSizePair( Guid.createGuidFromString("00000000-0000-0000-0000-00000000000a"), Guid.createGuidFromString("00000000-0000-0000-0000-00000000000b"))); }}); doNothing().when(ovfManager).updateBootOrderOnDevices(any(VmBase.class), anyBoolean()); SimpleDependencyInjector.getInstance().bind(OsRepository.class, osRepository); } @Test public void testRemoveImageFromSnapshotConfiguration() throws OvfReaderException { Guid vmId = Guid.newGuid(); VM vm = new VM(); vm.setId(vmId); vm.setStoragePoolId(Guid.newGuid()); vm.setVmtName(RandomUtils.instance().nextString(10)); vm.setOrigin(OriginType.OVIRT); vm.setDbGeneration(1L); Guid vmSnapshotId = Guid.newGuid(); DiskImage disk1 = addTestDisk(vm, vmSnapshotId); DiskVmElement dve1 = new DiskVmElement(disk1.getId(), vm.getId()); dve1.setDiskInterface(DiskInterface.VirtIO); disk1.setDiskVmElements(Collections.singletonList(dve1)); DiskImage disk2 = addTestDisk(vm, vmSnapshotId); DiskVmElement dve2 = new DiskVmElement(disk2.getId(), vm.getId()); dve2.setDiskInterface(DiskInterface.IDE); disk2.setDiskVmElements(Collections.singletonList(dve2)); ArrayList<DiskImage> disks = new ArrayList<>(Arrays.asList(disk1, disk2)); String ovf = ovfManager.exportVm(vm, disks, Version.getLast()); Snapshot snap = new Snapshot(); snap.setVmConfiguration(ovf); snap.setId(vmSnapshotId); doReturn(disk2).when(cmd).getDiskImage(); doReturn(disk2).when(cmd).getImage(); doReturn(disk2.getId()).when(cmd).getImageId(); Snapshot actual = ImagesHandler.prepareSnapshotConfigWithAlternateImage(snap, disk2.getImageId(), null, ovfManager); String actualOvf = actual.getVmConfiguration(); ArrayList<DiskImage> actualImages = new ArrayList<>(); ovfManager.importVm(actualOvf, new VM(), actualImages, new ArrayList<>()); assertEquals("Wrong number of disks", 1, actualImages.size()); assertEquals("Wrong disk", disk1, actualImages.get(0)); } private static DiskImage addTestDisk(VM vm, Guid snapshotId) { Guid imageId = Guid.newGuid(); DiskImage disk = new DiskImage(); disk.setImageId(imageId); disk.setId(Guid.newGuid()); disk.setVolumeType(VolumeType.Sparse); disk.setVolumeFormat(VolumeFormat.COW); disk.setQcowCompat(QcowCompat.QCOW2_V3); disk.setStoragePoolId(vm.getStoragePoolId()); disk.setActive(Boolean.TRUE); disk.setPlugged(Boolean.TRUE); disk.setVmSnapshotId(snapshotId); disk.setImageStatus(ImageStatus.OK); disk.setAppList(""); disk.setDescription(""); vm.getDiskList().add(disk); vm.getDiskMap().put(imageId, disk); return disk; } }