package org.ovirt.engine.core.bll; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import org.junit.Before; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.ovirt.engine.core.bll.network.macpool.MacPoolPerCluster; import org.ovirt.engine.core.bll.utils.VmDeviceUtils; import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator; import org.ovirt.engine.core.common.businessentities.ArchitectureType; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmDynamic; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.ImageStatus; import org.ovirt.engine.core.common.osinfo.OsRepository; 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.dao.ClusterDao; import org.ovirt.engine.core.dao.DiskImageDao; import org.ovirt.engine.core.dao.SnapshotDao; import org.ovirt.engine.core.dao.StorageDomainDao; import org.ovirt.engine.core.dao.VmDao; import org.ovirt.engine.core.dao.VmDeviceDao; import org.ovirt.engine.core.dao.VmStaticDao; import org.ovirt.engine.core.dao.VmTemplateDao; public abstract class AddVmCommandTestBase<T extends AddVmCommand<?>> extends BaseCommandTest { protected static final int TOTAL_NUM_DOMAINS = 2; private static final Guid STORAGE_DOMAIN_ID_1 = Guid.newGuid(); private static final Guid STORAGE_DOMAIN_ID_2 = Guid.newGuid(); private static final Guid STORAGE_POOL_ID = Guid.newGuid(); private static final int NUM_DISKS_STORAGE_DOMAIN_1 = 3; private static final int NUM_DISKS_STORAGE_DOMAIN_2 = 3; protected static final String CPU_ID = "0"; private static final int MAX_MEMORY_SIZE = 4096; @Mock CpuFlagsManagerHandler cpuFlagsManagerHandler; @Mock OsRepository osRepository; @Mock VmDeviceUtils vmDeviceUtils; @Mock MacPoolPerCluster macPoolPerCluster; @Mock protected StorageDomainValidator storageDomainValidator; private VmTemplate vmTemplate; protected VM vm; protected Cluster cluster; protected StoragePool storagePool; @Mock SnapshotDao snapshotDao; @Mock StorageDomainDao sdDao; @Mock VmTemplateDao vmTemplateDao; @Mock VmDao vmDao; @Mock VmStaticDao vmStaticDao; @Mock ClusterDao clusterDao; @Mock VmDeviceDao vmDeviceDao; @Mock DiskImageDao diskImageDao; @Spy @InjectMocks VmHandler vmHandler; @Spy @InjectMocks protected T cmd = createCommand(); protected abstract T createCommand(); private void initOsRepository() { SimpleDependencyInjector.getInstance().bind(OsRepository.class, osRepository); } @Before public void setUp() { initOsRepository(); vmHandler.init(); initVmTemplate(); cmd.setVmTemplate(vmTemplate); cmd.setVmTemplateId(vmTemplate.getId()); initCluster(); cmd.setClusterId(cluster.getId()); cmd.setCluster(cluster); initStoragePool(); cmd.setStoragePoolId(STORAGE_POOL_ID); cmd.setStoragePool(storagePool); mockOtherDependencies(); } protected void mockOtherDependencies() { doReturn(storageDomainValidator).when(cmd).createStorageDomainValidator(any(StorageDomain.class)); } protected void generateStorageToDisksMap() { cmd.storageToDisksMap = new HashMap<>(); cmd.storageToDisksMap.put(STORAGE_DOMAIN_ID_1, generateDisksList(NUM_DISKS_STORAGE_DOMAIN_1)); cmd.storageToDisksMap.put(STORAGE_DOMAIN_ID_2, generateDisksList(NUM_DISKS_STORAGE_DOMAIN_2)); } private static List<DiskImage> generateDisksList(int size) { List<DiskImage> disksList = new ArrayList<>(); for (int i = 0; i < size; ++i) { DiskImage diskImage = createDiskImage(); disksList.add(diskImage); } return disksList; } protected static DiskImage createDiskImage() { DiskImage diskImage = new DiskImage(); diskImage.setId(Guid.newGuid()); diskImage.setImageId(Guid.newGuid()); diskImage.setStorageIds(new ArrayList<>(Collections.singletonList(STORAGE_DOMAIN_ID_1))); return diskImage; } private List<DiskImage> createDiskSnapshot(Guid diskId, int numOfImages) { List<DiskImage> disksList = new ArrayList<>(); for (int i = 0; i < numOfImages; ++i) { DiskImage diskImage = new DiskImage(); diskImage.setActive(false); diskImage.setId(diskId); diskImage.setImageId(Guid.newGuid()); diskImage.setParentId(Guid.newGuid()); diskImage.setImageStatus(ImageStatus.OK); disksList.add(diskImage); } return disksList; } protected void initDestSDs() { StorageDomain sd1 = new StorageDomain(); StorageDomain sd2 = new StorageDomain(); sd1.setId(STORAGE_DOMAIN_ID_1); sd2.setId(STORAGE_DOMAIN_ID_2); sd1.setStatus(StorageDomainStatus.Active); sd2.setStatus(StorageDomainStatus.Active); cmd.destStorages.put(STORAGE_DOMAIN_ID_1, sd1); cmd.destStorages.put(STORAGE_DOMAIN_ID_2, sd2); } protected void initVM() { vm = new VM(); VmDynamic dynamic = new VmDynamic(); VmStatic stat = new VmStatic(); stat.setVmtGuid(Guid.newGuid()); stat.setName("testVm"); stat.setPriority(1); stat.setMaxMemorySizeMb(MAX_MEMORY_SIZE); vm.setStaticData(stat); vm.setDynamicData(dynamic); vm.setSingleQxlPci(false); } protected void initVmTemplate() { vmTemplate = new VmTemplate(); vmTemplate.setStoragePoolId(STORAGE_POOL_ID); DiskImage image = createDiskImageTemplate(); vmTemplate.getDiskTemplateMap().put(image.getImageId(), image); HashMap<Guid, DiskImage> diskImageMap = new HashMap<>(); DiskImage diskImage = createDiskImage(); diskImageMap.put(diskImage.getId(), diskImage); vmTemplate.setDiskImageMap(diskImageMap); } protected void initCluster() { cluster = new Cluster(); cluster.setClusterId(Guid.newGuid()); cluster.setCompatibilityVersion(Version.v4_0); cluster.setCpuName("Intel Conroe Family"); cluster.setArchitecture(ArchitectureType.x86_64); cluster.setStoragePoolId(STORAGE_POOL_ID); } protected void initStoragePool() { storagePool = new StoragePool(); storagePool.setId(STORAGE_POOL_ID); storagePool.setStatus(StoragePoolStatus.Up); } private static DiskImage createDiskImageTemplate() { DiskImage i = new DiskImage(); i.setImageId(Guid.newGuid()); i.setStorageIds(new ArrayList<>(Collections.singletonList(STORAGE_DOMAIN_ID_1))); return i; } protected void initCommandMethods() { doReturn(true).when(cmd).canAddVm(anyList(), anyString(), any(Guid.class), anyInt()); } protected void mockStorageDomainDaoGetAllForStoragePool() { when(sdDao.getAllForStoragePool(any(Guid.class))).thenReturn(Collections.singletonList(createStorageDomain())); } protected StorageDomain createStorageDomain() { StorageDomain sd = new StorageDomain(); sd.setStorageDomainType(StorageDomainType.Master); sd.setStatus(StorageDomainStatus.Active); sd.setId(STORAGE_DOMAIN_ID_1); return sd; } protected void mockGetAllSnapshots() { doAnswer(invocation -> { Object[] args = invocation.getArguments(); Guid arg = (Guid) args[0]; return createDiskSnapshot(arg, 3); }).when(diskImageDao).getAllSnapshotsForLeaf(any(Guid.class)); } }