package org.ovirt.engine.core.bll.validator;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith;
import java.util.ArrayList;
import java.util.List;
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.bll.ValidationResult;
import org.ovirt.engine.core.common.businessentities.IscsiBond;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
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.storage.StorageType;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.dao.IscsiBondDao;
import org.ovirt.engine.core.dao.StorageServerConnectionDao;
import org.ovirt.engine.core.dao.network.NetworkClusterDao;
import org.ovirt.engine.core.dao.network.NetworkDao;
@RunWith(MockitoJUnitRunner.class)
public class IscsiBondValidatorTest {
@Mock
private DbFacade dbFacade;
@Mock
private IscsiBondDao iscsiBondDao;
@Mock
private NetworkDao networkDao;
@Mock
private NetworkClusterDao networkClusterDao;
@Mock
private StorageServerConnectionDao storageServerConnectionDao;
private IscsiBondValidator validator;
@Before
public void setUp() {
validator = spy(new IscsiBondValidator());
doReturn(dbFacade).when(validator).getDBFacade();
doReturn(iscsiBondDao).when(dbFacade).getIscsiBondDao();
doReturn(networkDao).when(dbFacade).getNetworkDao();
doReturn(networkClusterDao).when(dbFacade).getNetworkClusterDao();
doReturn(storageServerConnectionDao).when(dbFacade).getStorageServerConnectionDao();
}
@Test
public void iscsiBondExists() {
assertEquals(ValidationResult.VALID, validator.isIscsiBondExist(new IscsiBond()));
}
@Test
public void iscsiBondDoesNotExist() {
ValidationResult res = validator.isIscsiBondExist(null);
assertThat(res, failsWith(EngineMessage.ISCSI_BOND_NOT_EXIST));
}
@Test
public void iscsiBondWithTheSameNameExistsInDataCenter() {
List<IscsiBond> iscsiBonds = new ArrayList<>();
Guid dataCenterId = Guid.newGuid();
iscsiBonds.add(createIscsiBond("First", dataCenterId));
iscsiBonds.add(createIscsiBond("Second", dataCenterId));
doReturn(iscsiBonds).when(iscsiBondDao).getAllByStoragePoolId(any(Guid.class));
ValidationResult res = validator.iscsiBondWithTheSameNameExistInDataCenter(createIscsiBond("Second", dataCenterId));
assertThat(res, failsWith(EngineMessage.ISCSI_BOND_WITH_SAME_NAME_EXIST_IN_DATA_CENTER));
}
@Test
public void iscsiBondWithTheSameNameDoesNotExistInDataCenter() {
List<IscsiBond> iscsiBonds = new ArrayList<>();
Guid dataCenterId = Guid.newGuid();
iscsiBonds.add(createIscsiBond("First", dataCenterId));
iscsiBonds.add(createIscsiBond("Second", dataCenterId));
doReturn(iscsiBonds).when(iscsiBondDao).getAllByStoragePoolId(any(Guid.class));
assertEquals(ValidationResult.VALID,
validator.iscsiBondWithTheSameNameExistInDataCenter(createIscsiBond("Third", dataCenterId)));
}
@Test
public void addedLogicalNetworkBelongToAnotherDatacenter() {
IscsiBond iscsiBond = createIscsiBond("First", Guid.newGuid());
List<Network> networks = new ArrayList<>();
networks.add(createNetwork(iscsiBond.getStoragePoolId()));
doReturn(networks).when(networkDao).getAllForDataCenter(iscsiBond.getStoragePoolId());
iscsiBond.getNetworkIds().add(networks.get(0).getId());
iscsiBond.getNetworkIds().add(Guid.newGuid());
ValidationResult res = validator.validateAddedLogicalNetworks(iscsiBond);
assertThat(res, failsWith(EngineMessage.NETWORKS_DONT_EXIST_IN_DATA_CENTER));
assertEquals(2, res.getVariableReplacements().size());
assertEquals("$networkIds " + iscsiBond.getNetworkIds().get(1).toString(), res.getVariableReplacements().get(0));
assertEquals("$dataCenterId " + iscsiBond.getStoragePoolId().toString(), res.getVariableReplacements().get(1));
}
@Test
public void addedLogicalNetworkBelongToAnotherDatacenter2() {
Guid dataCenterId = Guid.newGuid();
IscsiBond before = createIscsiBond("Before", dataCenterId);
IscsiBond after = createIscsiBond("After", dataCenterId);
List<Network> networks = new ArrayList<>();
networks.add(createNetwork(dataCenterId));
doReturn(networks).when(networkDao).getAllForDataCenter(dataCenterId);
before.getNetworkIds().add(networks.get(0).getId());
after.getNetworkIds().add(networks.get(0).getId());
after.getNetworkIds().add(Guid.newGuid());
ValidationResult res = validator.validateAddedLogicalNetworks(after, before);
assertThat(res, failsWith(EngineMessage.NETWORKS_DONT_EXIST_IN_DATA_CENTER));
assertEquals(2, res.getVariableReplacements().size());
assertEquals("$networkIds " + after.getNetworkIds().get(1).toString(), res.getVariableReplacements().get(0));
assertEquals("$dataCenterId " + after.getStoragePoolId().toString(), res.getVariableReplacements().get(1));
}
@Test
public void addedLogicalNetworkBelongToSameDatacenter() {
IscsiBond iscsiBond = createIscsiBond("First", Guid.newGuid());
List<Network> networks = new ArrayList<>();
networks.add(createNetwork(iscsiBond.getStoragePoolId()));
networks.add(createNetwork(iscsiBond.getStoragePoolId()));
doReturn(networks).when(networkDao).getAllForDataCenter(iscsiBond.getStoragePoolId());
for (Network network : networks) {
iscsiBond.getNetworkIds().add(network.getId());
}
List<NetworkCluster> networkClusters = new ArrayList<>();
networkClusters.add(createNetworkCluster(false));
doReturn(networkClusters).when(networkClusterDao).getAllForNetwork(any(Guid.class));
assertEquals(ValidationResult.VALID, validator.validateAddedLogicalNetworks(iscsiBond));
}
@Test
public void addedRequiredLogicalNetworks() {
IscsiBond iscsiBond = createIscsiBond("First", Guid.newGuid());
List<Network> networks = new ArrayList<>();
networks.add(createNetwork(iscsiBond.getStoragePoolId()));
networks.add(createNetwork(iscsiBond.getStoragePoolId()));
doReturn(networks).when(networkDao).getAllForDataCenter(iscsiBond.getStoragePoolId());
for (Network network : networks) {
iscsiBond.getNetworkIds().add(network.getId());
}
List<NetworkCluster> networkClusters = new ArrayList<>();
networkClusters.add(createNetworkCluster(true));
doReturn(networkClusters).when(networkClusterDao).getAllForNetwork(any(Guid.class));
ValidationResult res = validator.validateAddedLogicalNetworks(iscsiBond);
assertThat(res, failsWith(EngineMessage.ACTION_TYPE_FAILED_ISCSI_BOND_NETWORK_CANNOT_BE_REQUIRED));
}
@Test
public void successfullyAddedStorageConnections() {
IscsiBond iscsiBond = createIscsiBond("First", Guid.newGuid());
List<StorageServerConnections> conns = new ArrayList<>();
conns.add(createStorageConnection());
conns.add(createStorageConnection());
doReturn(conns).when(storageServerConnectionDao).getConnectableStorageConnectionsByStorageType(iscsiBond.getStoragePoolId(), StorageType.ISCSI);
iscsiBond.getStorageConnectionIds().add(conns.get(0).getId());
iscsiBond.getStorageConnectionIds().add(conns.get(1).getId());
assertEquals(ValidationResult.VALID, validator.validateAddedStorageConnections(iscsiBond));
}
@Test
public void someAddedStorageConnectionsAreNotAnIscsi() {
IscsiBond iscsiBond = createIscsiBond("First", Guid.newGuid());
List<StorageServerConnections> conns = new ArrayList<>();
conns.add(createStorageConnection());
doReturn(conns).when(storageServerConnectionDao).getConnectableStorageConnectionsByStorageType(iscsiBond.getStoragePoolId(), StorageType.ISCSI);
iscsiBond.getStorageConnectionIds().add(conns.get(0).getId());
iscsiBond.getStorageConnectionIds().add(Guid.newGuid().toString());
ValidationResult res = validator.validateAddedStorageConnections(iscsiBond);
assertThat(res, failsWith(EngineMessage.ACTION_TYPE_FAILED_STORAGE_CONNECTIONS_CANNOT_BE_ADDED_TO_ISCSI_BOND));
assertEquals(1, res.getVariableReplacements().size());
assertEquals("$connectionIds " + iscsiBond.getStorageConnectionIds().get(1).toString(), res.getVariableReplacements().get(0));
}
private IscsiBond createIscsiBond(String name, Guid dataCenterId) {
IscsiBond iscsiBond = new IscsiBond();
iscsiBond.setId(Guid.newGuid());
iscsiBond.setStoragePoolId(dataCenterId);
iscsiBond.setName(name);
return iscsiBond;
}
private Network createNetwork(Guid dataCenterId) {
Network network = new Network();
network.setId(Guid.newGuid());
network.setDataCenterId(dataCenterId);
return network;
}
private NetworkCluster createNetworkCluster(boolean isRequired) {
NetworkCluster networkCluster = new NetworkCluster();
networkCluster.setRequired(isRequired);
return networkCluster;
}
private StorageServerConnections createStorageConnection() {
StorageServerConnections conn = new StorageServerConnections();
conn.setId(Guid.newGuid().toString());
return conn;
}
}