package org.ovirt.engine.core.vdsbroker;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.network.AnonymousHostNetworkQos;
import org.ovirt.engine.core.common.businessentities.network.HostNetworkQos;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment;
import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
import org.ovirt.engine.core.common.network.SwitchType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.ClusterDao;
import org.ovirt.engine.core.dao.VdsDao;
import org.ovirt.engine.core.dao.network.HostNetworkQosDao;
import org.ovirt.engine.core.dao.network.NetworkAttachmentDao;
import org.ovirt.engine.core.utils.MockConfigRule;
import org.ovirt.engine.core.utils.RandomUtils;
import org.ovirt.engine.core.utils.RandomUtilsSeedingRule;
public abstract class BaseNetworkImplementationDetailsUtilsTest {
private NetworkImplementationDetailsUtils networkImplementationDetailsUtils;
@Rule
public RandomUtilsSeedingRule rusr = new RandomUtilsSeedingRule();
@Rule
public MockConfigRule mcr = new MockConfigRule();
@Mock
private HostNetworkQosDao hostNetworkQosDaoMock;
@Mock
private NetworkAttachmentDao networkAttachmentDaoMock;
@Mock
private ClusterDao clusterDaoMock;
@Mock
private VdsDao vdsDaoMock;
@Mock CalculateBaseNic calculateBaseNic;
private Guid VDS_ID = Guid.newGuid();
private Guid CLUSTER_ID = Guid.newGuid();
private VDS vds;
private Cluster cluster;
private VdsNetworkInterface testIface;
protected HostNetworkQos qosA;
protected HostNetworkQos qosB;
protected HostNetworkQos unlimitedHostNetworkQos;
protected final String networkName = RandomUtils.instance().nextString(10);
@Before
public void setUpBefore() throws Exception {
qosA = createAndMockQos(30, 30, 30);
qosB = createAndMockQos(60, 60, 60);
unlimitedHostNetworkQos = createQos(null, null, null);
vds = new VDS();
vds.setId(VDS_ID);
vds.setClusterId(CLUSTER_ID);
cluster = new Cluster();
cluster.setId(CLUSTER_ID);
when(vdsDaoMock.get(eq(VDS_ID))).thenReturn(vds);
when(clusterDaoMock.get(eq(CLUSTER_ID))).thenReturn(cluster);
EffectiveHostNetworkQos effectiveHostNetworkQos = new EffectiveHostNetworkQos(hostNetworkQosDaoMock);
networkImplementationDetailsUtils = new NetworkImplementationDetailsUtils(effectiveHostNetworkQos,
networkAttachmentDaoMock,
vdsDaoMock,
clusterDaoMock,
calculateBaseNic);
}
@Test
public void calculateNetworkImplementationDetailsUnmanagedNetwork() throws Exception {
calculateNetworkImplementationDetailsAndAssertManaged(testIface, false, null);
}
@Test
public void calculateNetworkImplementationDetailsManagedNetwork() throws Exception {
Network network = createNetwork(testIface.isBridged(), testIface.getMtu(), testIface.getVlanId());
calculateNetworkImplementationDetailsAndAssertManaged(testIface, true, network);
}
@Test
public void calculateNetworkImplementationDetailsNetworkIsSync() throws Exception {
Network network = createNetwork(testIface.isBridged(), testIface.getMtu(), testIface.getVlanId());
calculateNetworkImplementationDetailsAndAssertSync(testIface, true, qosA, network);
}
@Test
public void calculateNetworkImplementationDetailsNetworkDefaultMtuAndVmNetworkOutOfSync() throws Exception {
Network network = createNetwork(!testIface.isBridged(), 0, RandomUtils.instance().nextInt());
calculateNetworkImplementationDetailsAndAssertSync(testIface, false, qosA, network);
}
@Test
public void caluculateNetworkImplementationDetailsNetworkInSyncWithoutQos() throws Exception {
testIface.setQos(null);
Network network = createNetwork(testIface.isBridged(), testIface.getMtu(), testIface.getVlanId());
calculateNetworkImplementationDetailsAndAssertSync(testIface, true, null, network);
}
@Test
public void calculateNetworkImplementationDetailsNetworkMtuOutOfSync() throws Exception {
Network network = createNetwork(testIface.isBridged(), testIface.getMtu() + 1, testIface.getVlanId());
calculateNetworkImplementationDetailsAndAssertSync(testIface, false, qosA, network);
}
@Test
public void calculateNetworkImplementationDetailsNetworkVmNetworkOutOfSync() throws Exception {
Network network = createNetwork(!testIface.isBridged(), testIface.getMtu(), testIface.getVlanId());
calculateNetworkImplementationDetailsAndAssertSync(testIface, false, qosA, network);
}
@Test
public void calculateNetworkImplementationDetailsInterfaceQosMissing() throws Exception {
testIface.setQos(null);
Network network = createNetwork(testIface.isBridged(), testIface.getMtu(), testIface.getVlanId());
calculateNetworkImplementationDetailsAndAssertSync(testIface, false, qosA, network);
}
@Test
public void calculateNetworkImplementationDetailsNetworkQosMissing() throws Exception {
Network network = createNetwork(testIface.isBridged(), testIface.getMtu(), testIface.getVlanId());
calculateNetworkImplementationDetailsAndAssertSync(testIface, false, null, network);
}
@Test
public void calculateNetworkImplementationDetailsNetworkQosOutOfSync() throws Exception {
HostNetworkQos qos = qosB;
Network network = createNetwork(testIface.isBridged(), testIface.getMtu(), testIface.getVlanId());
calculateNetworkImplementationDetailsAndAssertSync(testIface, false, qos, network);
}
@Test
public void calculateNetworkImplementationDetailsOverriddenQosOutOfSync() throws Exception {
HostNetworkQos qos = qosB;
Network network = createNetwork(testIface.isBridged(), testIface.getMtu(), testIface.getVlanId());
network.setQosId(qos.getId());
when(hostNetworkQosDaoMock.get(qos.getId())).thenReturn(qos);
calculateNetworkImplementationDetailsAndAssertSync(testIface, false, null, network);
}
@Test
public void calculateNetworkImplementationDetailsNetworkQosOverridden() throws Exception {
Network network = createNetwork(testIface.isBridged(), testIface.getMtu(), testIface.getVlanId());
calculateNetworkImplementationDetailsAndAssertSync(testIface, false, unlimitedHostNetworkQos, network);
}
@Test
public void calculateNetworkImplementationDetailsNoNetworkName() throws Exception {
testIface.setNetworkName(null);
assertNull("Network implementation details should not be filled.",
initMocksForNetworkImplementationDetailsUtils(null, null, testIface).calculateNetworkImplementationDetails(
testIface, null));
}
@Test
public void calculateNetworkImplementationDetailsEmptyNetworkName() throws Exception {
testIface.setNetworkName("");
assertNull("Network implementation details should not be filled.",
initMocksForNetworkImplementationDetailsUtils(null, null, testIface).calculateNetworkImplementationDetails(
testIface,
null));
}
@Test
public void calculateNetworkImplementationDetailsNetworkDefaultMtuOutOfSync() throws Exception {
Network network = createNetwork(testIface.isBridged(), 0, testIface.getVlanId());
calculateNetworkImplementationDetailsAndAssertSync(testIface, false, qosA, network);
}
@Test
public void calculateNetworkImplementationDetailsNetworkQosOverriddenBackToUnlimited() throws Exception {
testIface.setQos(unlimitedHostNetworkQos);
Network network = createNetwork(testIface.isBridged(), testIface.getMtu(), testIface.getVlanId());
network.setQosId(qosA.getId());
calculateNetworkImplementationDetailsAndAssertSync(testIface, true, unlimitedHostNetworkQos,
network);
}
private void calculateNetworkImplementationDetailsAndAssertManaged(VdsNetworkInterface iface,
boolean expectManaged,
Network network) {
VdsNetworkInterface.NetworkImplementationDetails networkImplementationDetails =
initMocksForNetworkImplementationDetailsUtils(network, null, testIface)
.calculateNetworkImplementationDetails(iface, network);
assertNotNull("Network implementation details should be filled.", networkImplementationDetails);
assertEquals("Network implementation details should be " + (expectManaged ? "" : "un") + "managed.",
expectManaged,
networkImplementationDetails.isManaged());
}
protected void calculateNetworkImplementationDetailsAndAssertSync(VdsNetworkInterface iface,
boolean expectSync,
HostNetworkQos qos,
Network network) {
VdsNetworkInterface.NetworkImplementationDetails networkImplementationDetails =
initMocksForNetworkImplementationDetailsUtils(network, qos, testIface)
.calculateNetworkImplementationDetails(iface, network);
assertNotNull("Network implementation details should be filled.", networkImplementationDetails);
assertEquals("Network implementation details should be " + (expectSync ? "in" : "out of") + " sync.",
expectSync,
networkImplementationDetails.isInSync());
}
protected Network createNetwork(boolean vmNetwork,
int mtu,
Integer vlanId) {
Network network = new Network();
network.setId(Guid.newGuid());
network.setVmNetwork(vmNetwork);
network.setMtu(mtu);
network.setVlanId(vlanId);
return network;
}
private HostNetworkQos createAndMockQos(int outAverageLinkshare, int outAverageUpperlimit, int outAverageRealtime) {
HostNetworkQos qos = createQos(outAverageLinkshare, outAverageUpperlimit, outAverageRealtime);
when(hostNetworkQosDaoMock.get(qos.getId())).thenReturn(qos);
return qos;
}
private HostNetworkQos createQos(Integer outAverageLinkshare,
Integer outAverageUpperlimit,
Integer outAverageRealtime) {
HostNetworkQos qos = new HostNetworkQos();
qos.setId(Guid.newGuid());
qos.setOutAverageLinkshare(outAverageLinkshare);
qos.setOutAverageUpperlimit(outAverageUpperlimit);
qos.setOutAverageRealtime(outAverageRealtime);
return qos;
}
private NetworkImplementationDetailsUtils initMocksForNetworkImplementationDetailsUtils(Network network,
HostNetworkQos qos, VdsNetworkInterface testIface) {
final VdsNetworkInterface baseIface = this.calculateBaseNic.getBaseNic(testIface);
Guid baseIfaceId = baseIface.getId();
Guid networkId = network == null ? null : network.getId();
if (baseIfaceId != null && networkId != null) {
when(networkAttachmentDaoMock.getNetworkAttachmentByNicIdAndNetworkId(eq(baseIfaceId), eq(networkId)))
.thenReturn(createNetworkAttachment(qos, baseIface));
}
return this.networkImplementationDetailsUtils;
}
private NetworkAttachment createNetworkAttachment(HostNetworkQos qos, VdsNetworkInterface baseIface) {
NetworkAttachment networkAttachment = new NetworkAttachment();
networkAttachment.setId(Guid.newGuid());
networkAttachment.setNicId(baseIface.getId());
networkAttachment.setNicName(baseIface.getName());
networkAttachment.setHostNetworkQos(AnonymousHostNetworkQos.fromHostNetworkQos(qos));
return networkAttachment;
}
protected VdsNetworkInterface createBaseInterface(HostNetworkQos qos, String networkName) {
VdsNetworkInterface baseInterface = new VdsNetworkInterface();
baseInterface.setId(Guid.newGuid());
baseInterface.setNetworkName(networkName);
baseInterface.setName("eth");
baseInterface.setQos(qos);
baseInterface.setVdsId(VDS_ID);
return baseInterface;
}
protected VdsNetworkInterface createVlanInterface(VdsNetworkInterface baseIface, String networkName,
HostNetworkQos qos) {
VdsNetworkInterface vlanIface = new VdsNetworkInterface();
vlanIface.setNetworkName(networkName);
vlanIface.setBridged(RandomUtils.instance().nextBoolean());
vlanIface.setMtu(100);
vlanIface.setVlanId(100);
vlanIface.setBaseInterface(baseIface.getName());
vlanIface.setName(vlanIface.getBaseInterface() + "_" + vlanIface.getVlanId());
vlanIface.setQos(qos);
vlanIface.setVdsId(VDS_ID);
return vlanIface;
}
public VdsNetworkInterface getTestIface() {
return testIface;
}
public void setTestIface(VdsNetworkInterface testIface) {
this.testIface = testIface;
this.testIface.setReportedSwitchType(SwitchType.LEGACY);
}
}