package org.ovirt.engine.core.bll.network.cluster;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
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 java.util.Collections;
import org.hamcrest.Matcher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner.Strict;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.dao.gluster.GlusterBrickDao;
@RunWith(Strict.class)
public class UpdateNetworkClusterValidatorTest extends NetworkClusterValidatorTestBase<UpdateNetworkClusterValidator> {
private NetworkCluster oldNetworkCluster;
@Mock
private GlusterBrickDao brickDao;
@Override
protected UpdateNetworkClusterValidator createValidator() {
oldNetworkCluster = new NetworkCluster();
return new UpdateNetworkClusterValidator(interfaceDao, networkDao, vdsDao, networkCluster, oldNetworkCluster);
}
@Test
public void managementNetworkChangeValidManagementNoChangeNonEmptyCluster() {
testUpdateManagementNetworkChange(true, true, false, isValid());
}
@Test
public void managementNetworkChangeValidNoChangeNonEmptyCluster() {
testUpdateManagementNetworkChange(false, false, false, isValid());
}
@Test
public void managementNetworkChangeValidNoChangeEmptyCluster() {
testUpdateManagementNetworkChange(false, false, true, isValid());
}
@Test
public void managementNetworkChangeValidManagementNoChangeEmptyCluster() {
testUpdateManagementNetworkChange(true, true, true, isValid());
}
@Test
public void managementNetworkChangeValidEmptyClusterSetManagementNet() {
testUpdateManagementNetworkChange(false, true, true, isValid());
}
@Test
public void managementNetworkChangeUnsetManagementNet() {
testUpdateManagementNetworkChange(true, false, false, isValid());
}
@Test
public void managementNetworkUnsetInvalid() {
testManagementNetworkUnset(true, false, failsWith(EngineMessage.ACTION_TYPE_FAILED_MANAGEMENT_NETWORK_UNSET));
}
@Test
public void managementNetworkUnsetValidNonManagementNoChange() {
testManagementNetworkUnset(false, false, isValid());
}
@Test
public void managementNetworkUnsetValidManagementNoChange() {
testManagementNetworkUnset(true, true, isValid());
}
@Test
public void managementNetworkUnsetValidBecomeManagement() {
testManagementNetworkUnset(false, true, isValid());
}
private void testManagementNetworkUnset(boolean managementBefore,
boolean managementAfter,
Matcher<ValidationResult> expectedResult) {
oldNetworkCluster.setManagement(managementBefore);
networkCluster.setManagement(managementAfter);
assertThat(validator.managementNetworkUnset(), expectedResult);
}
@Test
public void managementNetworkChangeInvalidNonEmptyClusterSetManagementNet() {
testUpdateManagementNetworkChange(
false,
true,
false,
failsWith(EngineMessage.ACTION_TYPE_FAILED_MANAGEMENT_NETWORK_CANNOT_BE_CHANGED));
}
private void testUpdateManagementNetworkChange(boolean managementBefore,
boolean managementAfter,
boolean emptyCluster,
Matcher<ValidationResult> expectedResult) {
oldNetworkCluster.setManagement(managementBefore);
networkCluster.setManagement(managementAfter);
when(vdsDao.getAllForCluster(TEST_CLUSTER_ID)).thenReturn(emptyCluster ?
Collections.emptyList() :
Collections.singletonList(null));
assertThat(validator.managementNetworkChange(), expectedResult);
}
@Test
public void glusterNetworkWhenNoGlusterService() {
testGlusterNetworkInUseAndUnset(true, true, false, true, isValid());
}
@Test
public void glusterNetworkWhenGlusterServiceNoChange() {
testGlusterNetworkInUseAndUnset(true, true, true, true, isValid());
}
@Test
public void glusterNetworkWhenGlusterServiceChangeNoBricks() {
testGlusterNetworkInUseAndUnset(true, false, true, false, isValid());
}
@Test
public void glusterNetworkWhenGlusterServiceChangeWithBricks() {
testGlusterNetworkInUseAndUnset(true,
false,
true,
true,
failsWith(EngineMessage.ACTION_TYPE_FAILED_GLUSTER_NETWORK_INUSE));
}
private void testGlusterNetworkInUseAndUnset(boolean glusterNetworkBefore,
boolean glusterNetworkAfter,
boolean glusterService,
boolean hasBricks,
Matcher<ValidationResult> expectedResult) {
oldNetworkCluster.setGluster(glusterNetworkBefore);
networkCluster.setGluster(glusterNetworkAfter);
cluster.setGlusterService(glusterService);
doReturn(brickDao).when(validator).getGlusterBrickDao();
when(brickDao.getAllByClusterAndNetworkId(any(), any())).thenReturn(hasBricks ?
Collections.singletonList(null) : Collections.emptyList());
assertThat(validator.glusterNetworkInUseAndUnset(cluster), expectedResult);
}
}