package org.ovirt.engine.core.vdsbroker.monitoring;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.NonOperationalReason;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.VmRngDevice;
import org.ovirt.engine.core.common.scheduling.ClusterPolicy;
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.VdsDao;
public class VirtMonitoringStrategyTest {
private Guid vdsId = Guid.newGuid();
private Guid clusterId = Guid.newGuid();
private VDS vdsFromDb;
private Cluster cluster;
@Before
public void setUp() {
vdsFromDb = new VDS();
vdsFromDb.setId(vdsId);
vdsFromDb.setClusterId(clusterId);
virtStrategy = spy(new VirtMonitoringStrategy(mockCluster(), mockVdsDao(), null));
doNothing().when(virtStrategy).vdsNonOperational(any(VDS.class), any(NonOperationalReason.class), any());
}
private VirtMonitoringStrategy virtStrategy;
@Test
public void testVirtCanMoveToMaintenance() {
VDS vds = new VDS();
vds.setStatus(VDSStatus.PreparingForMaintenance);
vds.setVmCount(1);
vds.setId(vdsId);
vds.setClusterId(clusterId);
assertFalse(virtStrategy.canMoveToMaintenance(vds));
vds.setVmCount(0);
doReturn(false).when(virtStrategy).isAnyVmRunOnVdsInDb(vdsId);
assertTrue(virtStrategy.canMoveToMaintenance(vds));
doReturn(true).when(virtStrategy).isAnyVmRunOnVdsInDb(vdsId);
assertFalse(virtStrategy.canMoveToMaintenance(vds));
}
@Test
public void testVirtIsMonitoringNeeded() {
VDS vds = new VDS();
vds.setStatus(VDSStatus.NonOperational);
assertTrue(virtStrategy.isMonitoringNeeded(vds));
vds.setStatus(VDSStatus.Up);
assertTrue(virtStrategy.isMonitoringNeeded(vds));
}
@Test
public void testProcessSpecialSoftwareCapabilities() {
VDS vds = createBaseVds();
vds.setHostOs("Fedora - 20 - 3");
vds.setId(vdsId);
vds.setClusterId(clusterId);
virtStrategy.processSoftwareCapabilities(vds);
assertEquals(VDSStatus.Up, vds.getStatus());
vds.setKvmEnabled(Boolean.TRUE);
virtStrategy.processSoftwareCapabilities(vds);
assertEquals(VDSStatus.Up, vds.getStatus());
vds.setKvmEnabled(Boolean.FALSE);
virtStrategy.processSoftwareCapabilities(vds);
assertEquals(VDSStatus.NonOperational, vds.getStatus());
vds.setKvmEnabled(Boolean.TRUE);
vds.setStatus(VDSStatus.Up);
virtStrategy.processSoftwareCapabilities(vds);
assertEquals(VDSStatus.Up, vds.getStatus());
vds.getSupportedRngSources().clear();
virtStrategy.processSoftwareCapabilities(vds);
assertEquals(VDSStatus.NonOperational, vds.getStatus());
}
@Test
public void testProtectRhel7InRhel6() {
VDS vds = createBaseVds();
vdsFromDb.setHostOs("RHEL - 6Server - 6.5.0.1.el6");
vds.setHostOs("RHEL - 7Server - 1.el7");
virtStrategy.processSoftwareCapabilities(vds);
assertEquals(VDSStatus.NonOperational, vds.getStatus());
}
@Test
public void testProtectRhel6InRhel7() {
VDS vds = createBaseVds();
vdsFromDb.setHostOs("RHEL - 7Server - 1.el7");
vds.setHostOs("RHEL - 6Server - 6.5.0.1.el6");
virtStrategy.processSoftwareCapabilities(vds);
assertEquals(VDSStatus.NonOperational, vds.getStatus());
}
@Test
public void testAllowRhel7InRhel6() {
VDS vds = createBaseVds();
vdsFromDb.setHostOs("RHEL - 6Server - 6.5.0.1.el6");
vds.setHostOs("RHEL - 7Server - 1.el7");
cluster.setClusterPolicyId(ClusterPolicy.UPGRADE_POLICY_GUID);
virtStrategy.processSoftwareCapabilities(vds);
assertFalse(vds.getStatus().equals(VDSStatus.NonOperational));
}
@Test
public void testAllowRhel6InRhel7() {
VDS vds = createBaseVds();
vdsFromDb.setHostOs("RHEL - 7Server - 1.el7");
vds.setHostOs("RHEL - 6Server - 6.5.0.1.el6");
cluster.setClusterPolicyId(ClusterPolicy.UPGRADE_POLICY_GUID);
virtStrategy.processSoftwareCapabilities(vds);
assertFalse(vds.getStatus().equals(VDSStatus.NonOperational));
}
private VDS createBaseVds() {
VDS vds = new VDS();
vds.setSupportedEmulatedMachines("pc-1.0");
vds.getSupportedRngSources().add(VmRngDevice.Source.URANDOM);
vds.setStatus(VDSStatus.Up);
vds.setId(vdsId);
vds.setClusterId(clusterId);
return vds;
}
@Test
public void testNeedToProcessHardwareCapsFalse() {
VDS oldVds = new VDS();
oldVds.setClusterId(Guid.newGuid());
oldVds.setId(Guid.newGuid());
oldVds.setCpuFlags("flag1");
VDS newVds = oldVds.clone();
assertFalse(virtStrategy.processHardwareCapabilitiesNeeded(oldVds, newVds));
}
@Test
public void testNeedToProcessHardwareCapsTrue() {
VDS oldVds = new VDS();
oldVds.setClusterId(Guid.newGuid());
oldVds.setId(Guid.newGuid());
oldVds.setCpuFlags("flag1");
VDS newVds = oldVds.clone();
newVds.setCpuFlags("flag2");
assertTrue(virtStrategy.processHardwareCapabilitiesNeeded(oldVds, newVds));
}
private ClusterDao mockCluster() {
ClusterDao mock = mock(ClusterDao.class);
cluster = new Cluster();
cluster.setEmulatedMachine("pc-1.0");
cluster.setCompatibilityVersion(Version.getLast());
cluster.setClusterId(clusterId);
when(mock.get(clusterId)).thenReturn(cluster);
return mock;
}
private VdsDao mockVdsDao() {
VdsDao mock = mock(VdsDao.class);
when(mock.getFirstUpRhelForCluster(clusterId)).thenReturn(vdsFromDb);
return mock;
}
}