package org.ovirt.engine.core.bll.network.cluster;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
import org.ovirt.engine.core.common.businessentities.network.NetworkClusterId;
import org.ovirt.engine.core.common.businessentities.network.NetworkStatus;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.VdsDynamicDao;
import org.ovirt.engine.core.dao.VdsStaticDao;
import org.ovirt.engine.core.dao.network.NetworkAttachmentDao;
import org.ovirt.engine.core.dao.network.NetworkClusterDao;
@RunWith(MockitoJUnitRunner.class)
public class NetworkClusterHelperTest {
private static final Guid CLUSTER_ID = Guid.newGuid();
private static final Guid MANAGEMENT_NETWORK_ID = Guid.newGuid();
private static final Guid NETWORK_ID1 = Guid.newGuid();
private static final Guid NETWORK_ID2 = Guid.newGuid();
private static final String MANAGEMENT_NETWORK_NAME = "management network name";
private static final String NETWORK_NAME1 = "network name 1";
private static final String NETWORK_NAME2 = "network name 2";
@Mock
private NetworkClusterDao networkClusterDao;
@Mock
private NetworkAttachmentDao networkAttachmentDao;
@Mock
private VdsStaticDao vdsStaticDao;
@Mock
private VdsDynamicDao vdsDynamicDao;
@Mock
private ManagementNetworkUtil managementNetworkUtil;
@InjectMocks
private NetworkClusterHelper underTest;
private NetworkCluster networkCluster;
private Network managementNetwork;
private NetworkCluster managementNetworkCluster;
@Before
public void setUp() {
networkCluster = createNetworkCluster(CLUSTER_ID, NETWORK_ID1);
when(networkClusterDao.get(networkCluster.getId())).thenReturn(networkCluster);
managementNetworkCluster = createNetworkCluster(CLUSTER_ID, MANAGEMENT_NETWORK_ID);
managementNetwork = createNetwork(MANAGEMENT_NETWORK_ID, MANAGEMENT_NETWORK_NAME);
when(managementNetworkUtil.getManagementNetwork(CLUSTER_ID)).thenReturn(managementNetwork);
when(networkClusterDao.get(new NetworkClusterId(CLUSTER_ID, MANAGEMENT_NETWORK_ID)))
.thenReturn(managementNetworkCluster);
when(vdsDynamicDao.checkIfExistsHostWithStatusInCluster(CLUSTER_ID, VDSStatus.Up)).thenReturn(true);
}
@Test
public void testRemoveNetworkAndReassignRolesNoReassign() {
testRemoveNetworkAndReassignRoles();
verify(networkClusterDao, never()).update(same(managementNetworkCluster));
assertFalse(managementNetworkCluster.isDisplay());
assertFalse(managementNetworkCluster.isMigration());
}
@Test
public void testRemoveNetworkAndReassignRolesDisplay() {
networkCluster.setDisplay(true);
testRemoveNetworkAndReassignRoles();
verify(networkClusterDao).update(same(managementNetworkCluster));
assertTrue(managementNetworkCluster.isDisplay());
}
@Test
public void testRemoveNetworkAndReassignRolesMigration() {
networkCluster.setMigration(true);
testRemoveNetworkAndReassignRoles();
verify(networkClusterDao).update(same(managementNetworkCluster));
assertTrue(managementNetworkCluster.isMigration());
}
@Test
public void testSetStatusForRequiredNetworkAbsentOnHost() {
networkCluster.setStatus(NetworkStatus.OPERATIONAL);
when(vdsStaticDao.checkIfExistsHostThatMissesNetworkInCluster(CLUSTER_ID, NETWORK_NAME1, VDSStatus.Up))
.thenReturn(true);
underTest.setStatus(CLUSTER_ID, singletonList(createNetwork(NETWORK_ID1, NETWORK_NAME1)));
verify(networkClusterDao).updateStatus(same(networkCluster));
assertThat(networkCluster.getStatus(), is(NetworkStatus.NON_OPERATIONAL));
}
@Test
public void testSetStatusForRequiredNetworksAbsentOnHost() {
networkCluster.setStatus(NetworkStatus.OPERATIONAL);
final List<Network> networks = asList(
createNetwork(NETWORK_ID1, NETWORK_NAME1),
createNetwork(NETWORK_ID2, NETWORK_NAME2));
when(vdsStaticDao.checkIfExistsHostThatMissesNetworkInCluster(CLUSTER_ID, NETWORK_NAME1, VDSStatus.Up))
.thenReturn(true);
underTest.setStatus(CLUSTER_ID, networks);
verify(networkClusterDao).updateStatus(same(networkCluster));
assertThat(networkCluster.getStatus(), is(NetworkStatus.NON_OPERATIONAL));
}
@Test
public void testSetStatusForRequiredNetworkPresentOnHost() {
networkCluster.setStatus(NetworkStatus.OPERATIONAL);
underTest.setStatus(CLUSTER_ID, singletonList(createNetwork(NETWORK_ID1, NETWORK_NAME1)));
verify(vdsStaticDao).checkIfExistsHostThatMissesNetworkInCluster(CLUSTER_ID, NETWORK_NAME1, VDSStatus.Up);
verify(networkClusterDao, never()).updateStatus(same(networkCluster));
assertThat(networkCluster.getStatus(), is(NetworkStatus.OPERATIONAL));
}
@Test
public void testSetStatusForNonRequiredNetworkUpdated() {
networkCluster.setRequired(false);
networkCluster.setStatus(NetworkStatus.NON_OPERATIONAL);
underTest.setStatus(CLUSTER_ID, createNetwork(NETWORK_ID1, NETWORK_NAME1));
verify(networkClusterDao).updateStatus(same(networkCluster));
assertThat(networkCluster.getStatus(), is(NetworkStatus.OPERATIONAL));
}
@Test
public void testSetStatusForNonRequiredNetworkAlreadyOperational() {
networkCluster.setRequired(false);
networkCluster.setStatus(NetworkStatus.OPERATIONAL);
underTest.setStatus(CLUSTER_ID, createNetwork(NETWORK_ID1, NETWORK_NAME1));
verify(networkClusterDao, never()).updateStatus(same(networkCluster));
}
private void testRemoveNetworkAndReassignRoles() {
underTest.removeNetworkAndReassignRoles(networkCluster);
verify(networkClusterDao).remove(CLUSTER_ID, NETWORK_ID1);
verify(networkAttachmentDao).removeByNetworkId(NETWORK_ID1);
}
private NetworkCluster createNetworkCluster(Guid clusterId, Guid networkId) {
NetworkCluster result = new NetworkCluster();
result.setId(new NetworkClusterId(clusterId, networkId));
return result;
}
private Network createNetwork(Guid networkId, String networkName) {
final Network result = new Network();
result.setId(networkId);
result.setName(networkName);
return result;
}
}