package org.ovirt.engine.core.bll.validator.storage;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat;
import org.ovirt.engine.core.common.businessentities.storage.VolumeType;
@RunWith(Parameterized.class)
public class StorageDomainValidatorFreeSpaceTest {
@Parameterized.Parameter(0)
public DiskImage disk;
@Parameterized.Parameter(1)
public StorageDomain sd;
@Parameterized.Parameter(2)
public boolean isValidForCloned;
@Parameterized.Parameter(3)
public boolean isValidForNew;
@Parameterized.Parameter(4)
public boolean isValidForSnapshots;
@Parameterized.Parameters
public static Collection<Object[]> createParams() {
List<Object[]> params = new ArrayList<>();
for (StorageType storageType : StorageType.values()) {
if (storageType.isConcreteStorageType() && !storageType.isCinderDomain()) {
List<VolumeType> volumeTypes =
storageType.isFileDomain() ? Arrays.asList(VolumeType.Preallocated, VolumeType.Sparse)
: Collections.singletonList(VolumeType.Preallocated);
for (VolumeType volumeType : volumeTypes) {
for (VolumeFormat volumeFormat : new VolumeFormat[] { VolumeFormat.COW, VolumeFormat.RAW }) {
DiskImage disk = new DiskImage();
disk.setVolumeFormat(volumeFormat);
disk.setVolumeType(volumeType);
disk.getSnapshots().add(disk);
disk.setSizeInGigabytes(200);
disk.setActualSize(100); // GB
StorageDomain sd = new StorageDomain();
sd.setStorageType(storageType);
sd.setAvailableDiskSize(107); // GB
params.add(new Object[] { disk, sd,
volumeFormat == VolumeFormat.RAW && volumeType == VolumeType.Sparse,
volumeFormat == VolumeFormat.COW || volumeType == VolumeType.Sparse,
volumeFormat == VolumeFormat.RAW && volumeType == VolumeType.Sparse
});
}
}
}
}
return params;
}
@Test
public void testValidateDiskWithSnapshots() {
StorageDomainValidator sdValidator = new StorageDomainValidator(sd);
assertEquals(disk.getVolumeFormat() + ", " + disk.getVolumeType() + ", " + sd.getStorageType(),
isValidForSnapshots,
sdValidator.hasSpaceForDiskWithSnapshots(disk).isValid());
}
@Test
public void testValidateClonedDisk() {
StorageDomainValidator sdValidator = new StorageDomainValidator(sd);
assertEquals(disk.getVolumeFormat() + ", " + disk.getVolumeType() + ", " + sd.getStorageType(),
isValidForCloned,
sdValidator.hasSpaceForClonedDisk(disk).isValid());
}
@Test
public void testValidateNewDisk() {
StorageDomainValidator sdValidator = new StorageDomainValidator(sd);
assertEquals(disk.getVolumeFormat() + ", " + disk.getVolumeType() + ", " + sd.getStorageType(),
isValidForNew,
sdValidator.hasSpaceForNewDisk(disk).isValid());
}
@Test
public void testValidateAllDisks() {
StorageDomainValidator sdValidator = new StorageDomainValidator(sd);
String assertData = disk.getVolumeFormat() + ", " + disk.getVolumeType() + ", " + sd.getStorageType();
List<DiskImage> disksList = Collections.singletonList(disk);
assertEquals(assertData,
isValidForNew,
sdValidator.hasSpaceForAllDisks(disksList, null).isValid());
assertEquals(assertData,
isValidForCloned,
sdValidator.hasSpaceForAllDisks(null, disksList).isValid());
assertEquals(assertData,
isValidForNew && isValidForCloned,
sdValidator.hasSpaceForAllDisks(disksList, disksList).isValid());
}
}