package org.ovirt.engine.core.bll.storage.disk.image;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.ovirt.engine.core.bll.storage.disk.image.DisksFilter.ONLY_ACTIVE;
import static org.ovirt.engine.core.bll.storage.disk.image.DisksFilter.ONLY_NOT_SHAREABLE;
import static org.ovirt.engine.core.bll.storage.disk.image.DisksFilter.ONLY_PLUGGED;
import static org.ovirt.engine.core.bll.storage.disk.image.DisksFilter.ONLY_SNAPABLE;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.ovirt.engine.core.common.businessentities.storage.CinderDisk;
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.LunDisk;
public class DisksFilterTest {
@Test
public void testFilterNonImageDisks() {
Disk lunDisk = createDisk(DiskStorageType.LUN, false, false, false, false);
Disk imageDisk = createDisk(DiskStorageType.IMAGE, false, false, true, false);
Disk cinderDisk = createDisk(DiskStorageType.CINDER, false, false, true, false);
List<Disk> disksList = Arrays.asList(lunDisk, imageDisk, cinderDisk);
List<DiskImage> filteredList = DisksFilter.filterImageDisks(disksList);
assertEquals(1, filteredList.size());
assertThat(filteredList, containsInAnyOrder(imageDisk));
}
@Test
public void testFilterNonLunDisks() {
Disk lunDisk = createDisk(DiskStorageType.LUN, false, false, false, false);
Disk imageDisk = createDisk(DiskStorageType.IMAGE, false, false, true, false);
Disk cinderDisk = createDisk(DiskStorageType.CINDER, false, false, true, false);
List<Disk> disksList = Arrays.asList(lunDisk, imageDisk, cinderDisk);
List<LunDisk> filteredList = DisksFilter.filterLunDisks(disksList);
assertEquals(1, filteredList.size());
assertThat(filteredList, containsInAnyOrder(lunDisk));
}
@Test
public void testFilterNonCinderDisks() {
Disk lunDisk = createDisk(DiskStorageType.LUN, false, false, false, false);
Disk imageDisk = createDisk(DiskStorageType.IMAGE, false, false, true, false);
Disk cinderDisk = createDisk(DiskStorageType.CINDER, false, false, true, false);
List<Disk> disksList = Arrays.asList(lunDisk, imageDisk, cinderDisk);
List<CinderDisk> filteredList = DisksFilter.filterCinderDisks(disksList);
assertEquals(1, filteredList.size());
assertThat(filteredList, containsInAnyOrder(cinderDisk));
}
@Test
public void testFilterShareableDisks() {
Disk shareableDisk1 = createDisk(DiskStorageType.IMAGE, true, true, false, false);
Disk shareableDisk2 = createDisk(DiskStorageType.IMAGE, false, true, false, false);
Disk nonShareableDisk1 = createDisk(DiskStorageType.IMAGE, true, false, true, false);
Disk nonShareableDisk2 = createDisk(DiskStorageType.IMAGE, false, false, true, false);
List<Disk> disksList = Arrays.asList(shareableDisk1, nonShareableDisk1, shareableDisk2, nonShareableDisk2);
List<DiskImage> filteredList = DisksFilter.filterImageDisks(disksList, ONLY_NOT_SHAREABLE);
assertEquals(2, filteredList.size());
assertThat(filteredList, containsInAnyOrder(nonShareableDisk1, nonShareableDisk2));
}
@Test
public void testFilterNonActiveDisks() {
Disk activeDisk1 = createDisk(DiskStorageType.IMAGE, true, true, false, false);
Disk activeDisk2 = createDisk(DiskStorageType.IMAGE, true, false, true, false);
Disk nonActiveDisk1 = createDisk(DiskStorageType.IMAGE, false, true, false, false);
Disk nonActiveDisk2 = createDisk(DiskStorageType.IMAGE, false, false, true, false);
List<Disk> disksList = Arrays.asList(activeDisk1, nonActiveDisk1, activeDisk2, nonActiveDisk2);
List<DiskImage> filteredList = DisksFilter.filterImageDisks(disksList, ONLY_ACTIVE);
assertEquals(2, filteredList.size());
assertThat(filteredList, containsInAnyOrder(activeDisk1, activeDisk2));
}
@Test
public void testFilterNonSnapableDisks() {
Disk snapableDisk1 = createDisk(DiskStorageType.IMAGE, true, false, true, false);
Disk snapableDisk2 = createDisk(DiskStorageType.IMAGE, false, false, true, false);
Disk nonSnapableDisk1 = createDisk(DiskStorageType.IMAGE, true, true, false, false);
Disk nonSnapableDisk2 = createDisk(DiskStorageType.IMAGE, false, true, false, false);
List<Disk> disksList = Arrays.asList(snapableDisk1, nonSnapableDisk1, snapableDisk2, nonSnapableDisk2);
List<DiskImage> filteredList = DisksFilter.filterImageDisks(disksList, ONLY_SNAPABLE);
assertEquals(2, filteredList.size());
assertThat(filteredList, containsInAnyOrder(snapableDisk1, snapableDisk2));
}
@Test
public void testFilterUnpluggedDisks() {
Disk pluggedDisk1 = createDisk(DiskStorageType.IMAGE, true, false, true, true);
Disk pluggedDisk2 = createDisk(DiskStorageType.IMAGE, false, false, true, true);
Disk unpluggedDisk1 = createDisk(DiskStorageType.IMAGE, true, true, false, false);
Disk unpluggedDisk2 = createDisk(DiskStorageType.IMAGE, false, true, false, false);
List<Disk> disksList = Arrays.asList(pluggedDisk1, unpluggedDisk1, pluggedDisk2, unpluggedDisk2);
List<DiskImage> filteredList = DisksFilter.filterImageDisks(disksList, ONLY_PLUGGED);
assertEquals(2, filteredList.size());
assertThat(filteredList, containsInAnyOrder(pluggedDisk1, pluggedDisk2));
}
private Disk createDisk
(DiskStorageType type, boolean isActive, boolean isShareable, boolean isSnapable, boolean isPlugged) {
Disk disk = null;
switch (type) {
case IMAGE:
disk = new DiskImage();
setDiskImageProperties((DiskImage) disk, isActive, isShareable, isSnapable);
break;
case LUN:
if (isSnapable) {
throw new IllegalArgumentException("A LUN disk cannot be snapable");
}
disk = new LunDisk();
break;
case CINDER:
disk = new CinderDisk();
setDiskImageProperties((DiskImage) disk, isActive, isShareable, isSnapable);
break;
}
disk.setPlugged(isPlugged);
return disk;
}
private void setDiskImageProperties(DiskImage disk, boolean isActive, boolean isShareable, boolean isSnapable) {
if (isShareable == isSnapable) {
throw new IllegalArgumentException("An image disk cannot be both sharable and snapable or vice versa");
}
disk.setActive(isActive);
disk.setShareable(isShareable);
}
}