package org.ovirt.engine.core.bll.validator.storage;
import static org.hamcrest.CoreMatchers.both;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.isValid;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.replacements;
import java.util.ArrayList;
import org.junit.Before;
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.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
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.DiskInterface;
import org.ovirt.engine.core.common.businessentities.storage.DiskVmElement;
import org.ovirt.engine.core.common.businessentities.storage.ScsiGenericIO;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.osinfo.OsRepository;
import org.ovirt.engine.core.common.utils.SimpleDependencyInjector;
import org.ovirt.engine.core.compat.Guid;
@RunWith(MockitoJUnitRunner.class)
public class DiskVmElementValidatorTest {
@Mock
private OsRepository osRepository;
private static final int OS_WITH_SUPPORTED_INTERFACES = 1;
private static final int OS_WITH_NO_SUPPORTED_INTERFACES = 2;
private Disk disk;
private DiskVmElement dve;
private DiskVmElementValidator validator;
@Before
public void setUp() {
initializeOsRepository(DiskInterface.VirtIO);
disk = new DiskImage();
dve = new DiskVmElement();
validator = new DiskVmElementValidator(disk, dve);
}
@Test
public void readOnlyIsNotSupportedByDiskInterface() {
dve.setReadOnly(true);
dve.setDiskInterface(DiskInterface.IDE);
assertThat(validator.isReadOnlyPropertyCompatibleWithInterface(),
both(failsWith(EngineMessage.ACTION_TYPE_FAILED_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR)).
and(replacements(hasItem(String.format("$interface %1$s", DiskInterface.IDE)))));
dve.setReadOnly(true);
disk.setSgio(ScsiGenericIO.FILTERED);
dve.setDiskInterface(DiskInterface.VirtIO_SCSI);
assertThat(validator.isReadOnlyPropertyCompatibleWithInterface(),
failsWith(EngineMessage.SCSI_PASSTHROUGH_IS_NOT_SUPPORTED_FOR_READ_ONLY_DISK));
}
@Test
public void readOnlyIsSupportedByDiskInterface() {
dve.setReadOnly(true);
DiskVmElement dve = new DiskVmElement();
dve.setDiskInterface(DiskInterface.VirtIO);
assertThat(validator.isReadOnlyPropertyCompatibleWithInterface(), isValid());
dve.setDiskInterface(DiskInterface.VirtIO_SCSI);
assertThat(validator.isReadOnlyPropertyCompatibleWithInterface(), isValid());
dve.setReadOnly(false);
dve.setDiskInterface(DiskInterface.IDE);
assertThat(validator.isReadOnlyPropertyCompatibleWithInterface(), isValid());
dve.setReadOnly(true);
dve.setDiskInterface(DiskInterface.VirtIO);
assertThat(validator.isReadOnlyPropertyCompatibleWithInterface(), isValid());
dve.setReadOnly(false);
dve.setDiskInterface(DiskInterface.VirtIO_SCSI);
assertThat(validator.isReadOnlyPropertyCompatibleWithInterface(), isValid());
dve.setDiskInterface(DiskInterface.IDE);
assertThat(validator.isReadOnlyPropertyCompatibleWithInterface(), isValid());
}
@Test
public void diskInterfaceSupportedByOs() {
VM vm = createVM(OS_WITH_SUPPORTED_INTERFACES);
initializeOsRepository(DiskInterface.VirtIO);
dve.setDiskInterface(DiskInterface.VirtIO);
assertThat(validator.isDiskInterfaceSupported(vm), isValid());
}
@Test
public void diskInterfaceNotSupportedByOs() {
VM vm = createVM(OS_WITH_NO_SUPPORTED_INTERFACES);
initializeOsRepository(DiskInterface.VirtIO);
dve.setDiskInterface(DiskInterface.VirtIO);
assertThat(validator.isDiskInterfaceSupported(vm), failsWith(EngineMessage.ACTION_TYPE_DISK_INTERFACE_UNSUPPORTED));
}
private void initializeOsRepository(DiskInterface diskInterface) {
ArrayList<String> supportedDiskInterfaces = new ArrayList<>();
supportedDiskInterfaces.add(diskInterface.name());
when(osRepository.getDiskInterfaces(OS_WITH_SUPPORTED_INTERFACES, null)).thenReturn(supportedDiskInterfaces);
// init the injector with the osRepository instance
SimpleDependencyInjector.getInstance().bind(OsRepository.class, osRepository);
}
private static VM createVM(int vmOs) {
VM vm = new VM();
vm.setStatus(VMStatus.Down);
vm.setId(Guid.newGuid());
vm.setVmOs(vmOs);
return vm;
}
}