package org.ovirt.engine.api.restapi.resource;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.core.UriInfo;
import org.junit.Ignore;
import org.junit.Test;
import org.ovirt.engine.api.model.HostNic;
import org.ovirt.engine.api.resource.HostNicResource;
import org.ovirt.engine.api.restapi.types.HostNicMapper;
import org.ovirt.engine.api.restapi.types.Ipv4BootProtocolMapper;
import org.ovirt.engine.api.restapi.types.Ipv6BootProtocolMapper;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.network.InterfaceStatus;
import org.ovirt.engine.core.common.businessentities.network.Ipv4BootProtocol;
import org.ovirt.engine.core.common.businessentities.network.Ipv6BootProtocol;
import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
import org.ovirt.engine.core.common.businessentities.network.VdsNetworkStatistics;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
public class BackendHostNicsResourceTest
extends AbstractBackendCollectionResourceTest<HostNic, VdsNetworkInterface, BackendHostNicsResource> {
public static final Guid PARENT_GUID = GUIDS[0];
public static final String NETWORK_NAME = "skynet";
public static final Ipv4BootProtocol IPV4_BOOT_PROTOCOL = Ipv4BootProtocol.STATIC_IP;
public static final Ipv6BootProtocol IPV6_BOOT_PROTOCOL = Ipv6BootProtocol.AUTOCONF;
public static final Guid MASTER_GUID = new Guid("99999999-9999-9999-9999-999999999999");
public static final String MASTER_NAME = "master";
private static final Guid SLAVE_GUID = new Guid("66666666-6666-6666-6666-666666666666");
private static final String SLAVE_NAME = "slave";
private static final int SINGLE_NIC_IDX = GUIDS.length - 2;
private static final Integer NIC_SPEED = 100;
private static final InterfaceStatus NIC_STATUS = InterfaceStatus.UP;
public BackendHostNicsResourceTest() {
super(new BackendHostNicsResource(PARENT_GUID.toString()), null, null);
}
@Test
@Ignore
@Override
public void testQuery() throws Exception {
}
@Test
public void testGet() throws Exception {
HostNicResource subresource = collection.getNicResource(GUIDS[SINGLE_NIC_IDX].toString());
setGetVdsQueryExpectations(1);
setGetNetworksQueryExpectations(1);
setUriInfo(setUpBasicUriExpectations());
setUpQueryExpectations("");
verifyModel(subresource.get(), SINGLE_NIC_IDX);
}
@Test
public void testListIncludeStatistics() throws Exception {
try {
accepts.add("application/xml; detail=statistics");
UriInfo uriInfo = setUpBasicUriExpectations();
setGetVdsQueryExpectations(1);
setGetNetworksQueryExpectations(1);
setUpQueryExpectations("");
collection.setUriInfo(uriInfo);
List<HostNic> nics = getCollection();
assertTrue(nics.get(0).isSetStatistics());
verifyCollection(nics);
} finally {
accepts.clear();
}
}
@Override
@Test
public void testList() throws Exception {
UriInfo uriInfo = setUpBasicUriExpectations();
setGetVdsQueryExpectations(1);
setGetNetworksQueryExpectations(1);
setUpQueryExpectations("");
collection.setUriInfo(uriInfo);
verifyCollection(getCollection());
}
@Override
protected void setUpQueryExpectations(String query, Object failure) throws Exception {
assertEquals("", query);
setUpEntityQueryExpectations(VdcQueryType.GetVdsInterfacesByVdsId,
IdQueryParameters.class,
new String[] { "Id" },
new Object[] { PARENT_GUID },
setUpInterfaces(),
failure);
}
public static List<VdsNetworkInterface> setUpInterfaces() {
List<VdsNetworkInterface> ifaces = new ArrayList<>();
for (int i = 0; i < NAMES.length; i++) {
ifaces.add(getEntitySpecific(i));
}
ifaces.add(getMaster());
ifaces.add(getSlave());
return ifaces;
}
@Override
protected VdsNetworkInterface getEntity(int index) {
return getEntitySpecific(index);
}
public static VdsNetworkInterface getEntitySpecific(int index) {
VdsNetworkInterface entity = new VdsNetworkInterface();
entity.setId(GUIDS[index]);
entity.setName(NAMES[index]);
entity.setNetworkName(NETWORK_NAME);
entity.setSpeed(NIC_SPEED);
entity = setUpStatistics(entity, GUIDS[index]);
entity.getStatistics().setStatus(NIC_STATUS);
entity.setIpv4BootProtocol(IPV4_BOOT_PROTOCOL);
entity.setIpv6BootProtocol(IPV6_BOOT_PROTOCOL);
return entity;
}
public static VdsNetworkInterface getMaster() {
VdsNetworkInterface entity = new VdsNetworkInterface();
entity.setId(MASTER_GUID);
entity.setName(MASTER_NAME);
entity.setNetworkName(NETWORK_NAME);
entity.setSpeed(NIC_SPEED);
entity.setBonded(true);
entity.setIpv4BootProtocol(IPV4_BOOT_PROTOCOL);
entity.setIpv6BootProtocol(IPV6_BOOT_PROTOCOL);
return setUpStatistics(entity, MASTER_GUID);
}
public static VdsNetworkInterface getSlave() {
VdsNetworkInterface entity = new VdsNetworkInterface();
entity.setId(SLAVE_GUID);
entity.setName(SLAVE_NAME);
entity.setNetworkName(NETWORK_NAME);
entity.setSpeed(NIC_SPEED);
entity.setBondName(MASTER_NAME);
entity.setIpv4BootProtocol(IPV4_BOOT_PROTOCOL);
entity.setIpv6BootProtocol(IPV6_BOOT_PROTOCOL);
return setUpStatistics(entity, SLAVE_GUID);
}
public static VdsNetworkInterface setUpStatistics(VdsNetworkInterface entity, Guid id) {
VdsNetworkStatistics statistics = new VdsNetworkStatistics();
statistics.setId(null);
statistics.setReceiveDropRate(1D);
statistics.setReceiveRate(2D);
statistics.setTransmitDropRate(3D);
statistics.setTransmitRate(4D);
statistics.setReceivedBytes(5L);
statistics.setTransmittedBytes(6L);
statistics.setVdsId(id);
statistics.setStatus(null);
entity.setStatistics(statistics);
return entity;
}
@Override
protected void verifyModel(HostNic model, int index) {
verifyModelSpecific(model, index);
verifyLinks(model);
}
public void verifyModelSpecific(HostNic model, int index) {
assertEquals(GUIDS[index].toString(), model.getId());
assertEquals(NAMES[index], model.getName());
assertNotNull(model.getNetwork());
assertEquals(NETWORK_NAME, model.getNetwork().getName());
assertEquals(calcSpeed(NIC_SPEED), model.getSpeed());
assertNotNull(model.getStatus());
assertEquals(HostNicMapper.mapNicStatus(NIC_STATUS), model.getStatus());
assertEquals(Ipv4BootProtocolMapper.map(IPV4_BOOT_PROTOCOL), model.getBootProtocol());
assertEquals(Ipv6BootProtocolMapper.map(IPV6_BOOT_PROTOCOL), model.getIpv6BootProtocol());
}
private Long calcSpeed(Integer nicSpeed) {
return nicSpeed == 0 ?
null
:
nicSpeed * 1000L * 1000;
}
protected void verifyMaster(HostNic model) {
assertEquals(MASTER_GUID.toString(), model.getId());
assertEquals(MASTER_NAME, model.getName());
assertNotNull(model.getNetwork());
assertEquals(NETWORK_NAME, model.getNetwork().getName());
assertNotNull(model.getBonding());
assertNotNull(model.getBonding().getSlaves());
assertEquals(1, model.getBonding().getSlaves().getHostNics().size());
assertEquals(SLAVE_GUID.toString(), model.getBonding().getSlaves().getHostNics().get(0).getId());
assertNotNull(model.getBonding().getSlaves().getHostNics().get(0).getHref());
}
protected void verifySlave(HostNic model) {
assertEquals(SLAVE_GUID.toString(), model.getId());
assertEquals(SLAVE_NAME, model.getName());
assertNotNull(model.getNetwork());
assertEquals(NETWORK_NAME, model.getNetwork().getName());
assertEquals(4, model.getLinks().size());
assertTrue("master".equals(model.getLinks().get(0).getRel()) ||
"master".equals(model.getLinks().get(1).getRel()));
assertNotNull(model.getLinks().get(0).getHref());
}
@Override
protected void verifyCollection(List<HostNic> collection) throws Exception {
assertNotNull(collection);
assertEquals(NAMES.length + 2, collection.size());
for (int i = 0; i < NAMES.length; i++) {
verifyModel(collection.get(i), i);
}
verifyMaster(collection.get(NAMES.length));
verifySlave(collection.get(NAMES.length + 1));
}
@Override
protected List<HostNic> getCollection() {
return collection.list().getHostNics();
}
protected void setGetVdsQueryExpectations(int times) throws Exception {
while (times-- > 0) {
VDS vds = new VDS();
vds.setClusterId(GUIDS[0]);
setUpEntityQueryExpectations(VdcQueryType.GetVdsByVdsId,
IdQueryParameters.class,
new String[] { "Id" },
new Object[] { PARENT_GUID },
vds);
}
}
protected void setGetNetworksQueryExpectations(int times) throws Exception {
while (times-- > 0) {
ArrayList<org.ovirt.engine.core.common.businessentities.network.Network> networks = new ArrayList<>();
org.ovirt.engine.core.common.businessentities.network.Network network = new org.ovirt.engine.core.common.businessentities.network.Network();
network.setId(GUIDS[0]);
network.setName("orcus");
networks.add(network);
setUpEntityQueryExpectations(VdcQueryType.GetAllNetworksByClusterId,
IdQueryParameters.class,
new String[] { "Id" },
new Object[] { GUIDS[0] },
networks);
}
}
}