package org.ovirt.engine.api.restapi.resource;
import static org.ovirt.engine.api.restapi.resource.AbstractBackendNicsResourceTest.PARENT_ID;
import static org.ovirt.engine.api.restapi.resource.AbstractBackendNicsResourceTest.setUpEntityExpectations;
import static org.ovirt.engine.api.restapi.resource.AbstractBackendNicsResourceTest.verifyModelSpecific;
import static org.easymock.EasyMock.expect;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.WebApplicationException;
import org.junit.Test;
import org.ovirt.engine.api.model.MAC;
import org.ovirt.engine.api.model.NIC;
import org.ovirt.engine.api.model.Network;
import org.ovirt.engine.api.model.Nics;
import org.ovirt.engine.api.model.Statistic;
import org.ovirt.engine.api.resource.NicResource;
import org.ovirt.engine.api.restapi.resource.BaseBackendResource.WebFaultException;
import org.ovirt.engine.core.common.action.AddVmInterfaceParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VmNetworkInterface;
import org.ovirt.engine.core.common.businessentities.VmNetworkStatistics;
import org.ovirt.engine.core.common.businessentities.network;
import org.ovirt.engine.core.common.queries.GetVmByVmIdParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.common.queries.VdsGroupQueryParamenters;
import org.ovirt.engine.core.compat.Guid;
public class BackendVmNicResourceTest
extends AbstractBackendSubResourceTest<NIC, VmNetworkInterface, BackendDeviceResource<NIC, Nics, VmNetworkInterface>> {
protected static final Guid NIC_ID = GUIDS[1];
protected static BackendVmNicsResource collection;
public BackendVmNicResourceTest() {
super((BackendVmNicResource)getCollection().getDeviceSubResource(NIC_ID.toString()));
}
protected static BackendVmNicsResource getCollection() {
return new BackendVmNicsResource(PARENT_ID);
}
@Override
protected void init() {
super.init();
initResource(resource.getCollection());
}
@Test
public void testGetNotFound() throws Exception {
setUriInfo(setUpBasicUriExpectations());
setUpEntityQueryExpectations(VdcQueryType.GetVmInterfacesByVmId,
GetVmByVmIdParameters.class,
new String[] { "Id" },
new Object[] { PARENT_ID },
new ArrayList<VmNetworkInterface>());
control.replay();
try {
resource.get();
fail("expected WebApplicationException");
} catch (WebApplicationException wae) {
verifyNotFoundException(wae);
}
}
@Test
public void testGet() throws Exception {
setUriInfo(setUpBasicUriExpectations());
setUpEntityQueryExpectations(1);
setGetVmQueryExpectations(1);
setGetNetworksQueryExpectations(1);
control.replay();
NIC nic = resource.get();
verifyModelSpecific(nic, 1);
verifyLinks(nic);
}
@Test
public void testGetIncludeStatistics() throws Exception {
try {
accepts.add("application/xml; detail=statistics");
setUriInfo(setUpBasicUriExpectations());
setUpEntityQueryExpectations(1);
setGetVmQueryExpectations(1);
setGetNetworksQueryExpectations(1);
control.replay();
NIC nic = resource.get();
assertTrue(nic.isSetStatistics());
verifyModelSpecific(nic, 1);
verifyLinks(nic);
} finally {
accepts.clear();
}
}
@Test
public void testUpdateNotFound() throws Exception {
setUriInfo(setUpBasicUriExpectations());
setUpEntityQueryExpectations(VdcQueryType.GetVmInterfacesByVmId,
GetVmByVmIdParameters.class,
new String[] { "Id" },
new Object[] { PARENT_ID },
new ArrayList<VmNetworkInterface>());
control.replay();
try {
resource.update(getUpdate(false));
fail("expected WebApplicationException");
} catch (WebApplicationException wae) {
verifyNotFoundException(wae);
}
}
@Test
public void testUpdate() throws Exception {
setUpGetEntityExpectations(2);
setGetVmQueryExpectations(1);
setGetNetworksQueryExpectations(1);
setUriInfo(setUpActionExpectations(VdcActionType.UpdateVmInterface,
AddVmInterfaceParameters.class,
new String[] { "VmId", "Interface.Id" },
new Object[] { PARENT_ID, GUIDS[1] },
true,
true));
NIC nic = resource.update(getUpdate(false));
assertNotNull(nic);
}
@Test(expected=WebFaultException.class)
public void testUpdateWithNonExistingNetwork() throws Exception {
setGetVmQueryExpectations(1);
setGetNetworksQueryExpectations(1);
control.replay();
NIC nic = resource.update(getUpdate(true));
assertNotNull(nic);
}
@Test
public void testUpdateWithExistingNetwork() throws Exception {
setUpGetEntityExpectations(2);
setGetVmQueryExpectations(2);
setGetNetworksQueryExpectations(2);
setUriInfo(setUpActionExpectations(VdcActionType.UpdateVmInterface,
AddVmInterfaceParameters.class,
new String[] { "VmId", "Interface.Id" },
new Object[] { PARENT_ID, GUIDS[1] },
true,
true));
NIC nic = resource.update(getUpdate(true));
assertNotNull(nic);
}
@Test
public void testStatisticalQuery() throws Exception {
VmNetworkInterface entity = setUpStatisticalExpectations();
@SuppressWarnings("unchecked")
BackendStatisticsResource<NIC, VmNetworkInterface> statisticsResource =
(BackendStatisticsResource<NIC, VmNetworkInterface>)((NicResource) resource).getStatisticsResource();
assertNotNull(statisticsResource);
verifyQuery(statisticsResource.getQuery(), entity);
}
protected void setGetVmQueryExpectations(int times) throws Exception {
while (times-- > 0) {
VM vm = new VM();
vm.setvds_group_id(GUIDS[0]);
setUpEntityQueryExpectations(VdcQueryType.GetVmByVmId,
GetVmByVmIdParameters.class,
new String[] { "Id" },
new Object[] { PARENT_ID },
vm);
}
}
protected void setGetNetworksQueryExpectations(int times) throws Exception {
while (times-- > 0) {
ArrayList<network> networks = new ArrayList<network>();
network network = new network();
network.setId(GUIDS[0]);
network.setname("orcus");
networks.add(network);
setUpEntityQueryExpectations(VdcQueryType.GetAllNetworksByClusterId,
VdsGroupQueryParamenters.class,
new String[] { "VdsGroupId" },
new Object[] { GUIDS[0] },
networks);
}
}
protected VmNetworkInterface setUpStatisticalExpectations() throws Exception {
VmNetworkStatistics stats = control.createMock(VmNetworkStatistics.class);
VmNetworkInterface entity = control.createMock(VmNetworkInterface.class);
expect(entity.getStatistics()).andReturn(stats);
expect(entity.getId()).andReturn(NIC_ID).anyTimes();
expect(stats.getReceiveRate()).andReturn(10D);
expect(stats.getTransmitRate()).andReturn(20D);
expect(stats.getReceiveDropRate()).andReturn(30D);
expect(stats.getTransmitDropRate()).andReturn(40D);
List<VmNetworkInterface> ifaces = new ArrayList<VmNetworkInterface>();
ifaces.add(entity);
setUpEntityQueryExpectations(VdcQueryType.GetVmInterfacesByVmId,
GetVmByVmIdParameters.class,
new String[] { "Id" },
new Object[] { PARENT_ID },
ifaces);
control.replay();
return entity;
}
protected void verifyQuery(AbstractStatisticalQuery<NIC, VmNetworkInterface> query, VmNetworkInterface entity) throws Exception {
assertEquals(NIC.class, query.getParentType());
assertSame(entity, query.resolve(NIC_ID));
List<Statistic> statistics = query.getStatistics(entity);
verifyStatistics(statistics,
new String[] {"data.current.rx", "data.current.tx", "errors.total.rx", "errors.total.tx"},
new BigDecimal[] {asDec(10), asDec(20), asDec(30), asDec(40)});
Statistic adopted = query.adopt(new Statistic());
assertTrue(adopted.isSetNic());
assertEquals(NIC_ID.toString(), adopted.getNic().getId());
assertTrue(adopted.getNic().isSetVm());
assertEquals(PARENT_ID.toString(), adopted.getNic().getVm().getId());
}
protected NIC getUpdate(boolean withNetwork) {
NIC update = new NIC();
update.setMac(new MAC());
update.getMac().setAddress("00:1a:4a:16:85:18");
if (withNetwork) {
Network network = new Network();
network.setId(GUIDS[0].toString());
update.setNetwork(network);
}
return update;
}
@Override
protected VmNetworkInterface getEntity(int index) {
return setUpEntityExpectations(control.createMock(VmNetworkInterface.class),
control.createMock(VmNetworkStatistics.class),
index);
}
protected List<VmNetworkInterface> getEntityList() {
List<VmNetworkInterface> entities = new ArrayList<VmNetworkInterface>();
for (int i = 0; i < NAMES.length; i++) {
entities.add(getEntity(i));
}
return entities;
}
protected void setUpEntityQueryExpectations(int times) throws Exception {
while (times-- > 0) {
setUpEntityQueryExpectations(VdcQueryType.GetVmInterfacesByVmId,
GetVmByVmIdParameters.class,
new String[] { "Id" },
new Object[] { PARENT_ID },
getEntityList());
}
}
protected void setUpGetEntityExpectations(int times) throws Exception {
setUpGetEntityExpectations(times, getEntity(1));
}
protected void setUpGetEntityExpectations(int times, VmNetworkInterface entity) throws Exception {
while (times-- > 0) {
setUpGetEntityExpectations(VdcQueryType.GetVmInterfacesByVmId,
GetVmByVmIdParameters.class,
new String[] { "Id" },
new Object[] { PARENT_ID },
entity);
}
}
}