package org.ovirt.engine.api.restapi.resource;
import java.util.List;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.junit.Test;
import org.ovirt.engine.api.model.Cluster;
import org.ovirt.engine.api.model.Host;
import org.ovirt.engine.api.model.HostStatus;
import org.ovirt.engine.core.common.action.AddVdsActionParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdsActionParameters;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.VdsStatistics;
import org.ovirt.engine.core.common.interfaces.SearchType;
import org.ovirt.engine.core.common.queries.GetVdsByVdsIdParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import static org.easymock.EasyMock.expect;
public class BackendHostsResourceTest
extends AbstractBackendCollectionResourceTest<Host, VDS, BackendHostsResource> {
protected static final String[] ADDRESSES = { "10.11.12.13", "13.12.11.10", "10.01.10.01" };
protected static final VDSStatus[] VDS_STATUS = { VDSStatus.Up, VDSStatus.Down, VDSStatus.Up };
protected static final HostStatus[] HOST_STATUS = { HostStatus.UP, HostStatus.DOWN,
HostStatus.UP };
protected static final String ROOT_PASSWORD = "s3CR3t";
public BackendHostsResourceTest() {
super(new BackendHostsResource(), SearchType.VDS, "Hosts : ");
}
@Test
public void testListIncludeStatistics() throws Exception {
try {
accepts.add("application/xml; detail=statistics");
UriInfo uriInfo = setUpUriExpectations(null);
setUpQueryExpectations("");
collection.setUriInfo(uriInfo);
List<Host> hosts = getCollection();
assertTrue(hosts.get(0).isSetStatistics());
verifyCollection(hosts);
} finally {
accepts.clear();
}
}
@Test
public void testRemove() throws Exception {
setUpGetEntityExpectations();
setUriInfo(setUpActionExpectations(VdcActionType.RemoveVds,
VdsActionParameters.class,
new String[] { "VdsId" },
new Object[] { GUIDS[0] },
true,
true));
verifyRemove(collection.remove(GUIDS[0].toString()));
}
@Test
public void testRemoveNonExistant() throws Exception{
setUpGetEntityExpectations(VdcQueryType.GetVdsByVdsId,
GetVdsByVdsIdParameters.class,
new String[] { "VdsId" },
new Object[] { NON_EXISTANT_GUID },
null);
control.replay();
try {
collection.remove(NON_EXISTANT_GUID.toString());
fail("expected WebApplicationException");
} catch (WebApplicationException wae) {
assertNotNull(wae.getResponse());
assertEquals(404, wae.getResponse().getStatus());
}
}
private void setUpGetEntityExpectations() throws Exception {
VDS vds = new VDS();
vds.setvds_id(GUIDS[0]);
setUpGetEntityExpectations(VdcQueryType.GetVdsByVdsId,
GetVdsByVdsIdParameters.class,
new String[] { "VdsId" },
new Object[] { GUIDS[0] },
vds);
}
@Test
public void testRemoveCantDo() throws Exception {
setUpGetEntityExpectations();
doTestBadRemove(false, true, CANT_DO);
}
@Test
public void testRemoveFailed() throws Exception {
setUpGetEntityExpectations();
doTestBadRemove(true, false, FAILURE);
}
protected void doTestBadRemove(boolean canDo, boolean success, String detail) throws Exception {
setUriInfo(setUpActionExpectations(VdcActionType.RemoveVds,
VdsActionParameters.class,
new String[] { "VdsId" },
new Object[] { GUIDS[0] },
canDo,
success));
try {
collection.remove(GUIDS[0].toString());
fail("expected WebApplicationException");
} catch (WebApplicationException wae) {
verifyFault(wae, detail);
}
}
@Test
public void testAddHost() throws Exception {
setUriInfo(setUpBasicUriExpectations());
setUpGetEntityExpectations("Cluster: name=Default",
SearchType.Cluster,
setUpVDSGroup(GUIDS[1]));
setUpCreationExpectations(VdcActionType.AddVds,
AddVdsActionParameters.class,
new String[] { "RootPassword" },
new Object[] { ROOT_PASSWORD },
true,
true,
GUIDS[0],
VdcQueryType.GetVdsByVdsId,
GetVdsByVdsIdParameters.class,
new String[] { "VdsId" },
new Object[] { GUIDS[0] },
getEntity(0));
Host model = getModel(0);
Response response = collection.add(model);
assertEquals(201, response.getStatus());
assertTrue(response.getEntity() instanceof Host);
verifyModel((Host) response.getEntity(), 0);
}
@Test
public void testAddHostClusterByName() throws Exception {
setUriInfo(setUpBasicUriExpectations());
setUpGetEntityExpectations("Cluster: name=" + NAMES[1],
SearchType.Cluster,
setUpVDSGroup(GUIDS[1]));
setUpCreationExpectations(VdcActionType.AddVds,
AddVdsActionParameters.class,
new String[] { "RootPassword" },
new Object[] { ROOT_PASSWORD },
true,
true,
GUIDS[0],
VdcQueryType.GetVdsByVdsId,
GetVdsByVdsIdParameters.class,
new String[] { "VdsId" },
new Object[] { GUIDS[0] },
getEntity(0));
Host model = getModel(0);
model.setCluster(new Cluster());
model.getCluster().setName(NAMES[1]);
Response response = collection.add(model);
assertEquals(201, response.getStatus());
assertTrue(response.getEntity() instanceof Host);
verifyModel((Host) response.getEntity(), 0);
}
@Test
public void testAddHostClusterById() throws Exception {
setUriInfo(setUpBasicUriExpectations());
setUpCreationExpectations(VdcActionType.AddVds,
AddVdsActionParameters.class,
new String[] { "RootPassword" },
new Object[] { ROOT_PASSWORD },
true,
true,
GUIDS[0],
VdcQueryType.GetVdsByVdsId,
GetVdsByVdsIdParameters.class,
new String[] { "VdsId" },
new Object[] { GUIDS[0] },
getEntity(0));
Host model = getModel(0);
model.setCluster(new Cluster());
model.getCluster().setId(GUIDS[1].toString());
Response response = collection.add(model);
assertEquals(201, response.getStatus());
assertTrue(response.getEntity() instanceof Host);
verifyModel((Host) response.getEntity(), 0);
}
@Test
public void testAddIncompleteParameters() throws Exception {
Host model = new Host();
model.setName(NAMES[0]);
setUriInfo(setUpBasicUriExpectations());
control.replay();
try {
collection.add(model);
fail("expected WebApplicationException on incomplete parameters");
} catch (WebApplicationException wae) {
verifyIncompleteException(wae, "Host", "add", "address", "rootPassword");
}
}
@Test
public void testAddHostCantDo() throws Exception {
doTestBadAddHost(false, true, CANT_DO);
}
@Test
public void testAddHostFailure() throws Exception {
doTestBadAddHost(true, false, FAILURE);
}
private void doTestBadAddHost(boolean canDo, boolean success, String detail) throws Exception {
setUpGetEntityExpectations("Cluster: name=Default",
SearchType.Cluster,
setUpVDSGroup(GUIDS[1]));
setUriInfo(setUpActionExpectations(VdcActionType.AddVds,
AddVdsActionParameters.class,
new String[] { "RootPassword" },
new Object[] { ROOT_PASSWORD },
canDo,
success));
Host model = getModel(0);
try {
collection.add(model);
fail("expected WebApplicationException");
} catch (WebApplicationException wae) {
verifyFault(wae, detail);
}
}
protected VDS getEntity(int index) {
return setUpEntityExpectations(control.createMock(VDS.class), control.createMock(VdsStatistics.class), index);
}
static VDS setUpEntityExpectations(VDS entity, int index) {
return setUpEntityExpectations(entity, null, index);
}
static VDS setUpEntityExpectations(VDS entity, VdsStatistics statistics, int index) {
expect(entity.getvds_id()).andReturn(GUIDS[index]).anyTimes();
expect(entity.getvds_name()).andReturn(NAMES[index]).anyTimes();
expect(entity.gethost_name()).andReturn(ADDRESSES[index]).anyTimes();
expect(entity.getstatus()).andReturn(VDS_STATUS[index]).anyTimes();
if (statistics != null) {
setUpStatisticalEntityExpectations(entity, statistics);
}
return entity;
}
static VDS setUpStatisticalEntityExpectations(VDS entity, VdsStatistics statistics) {
expect(entity.getphysical_mem_mb()).andReturn(5120).anyTimes();
expect(entity.getStatisticsData()).andReturn(statistics).anyTimes();
expect(statistics.getusage_mem_percent()).andReturn(20).anyTimes();
expect(statistics.getswap_free()).andReturn(25L).anyTimes();
expect(statistics.getswap_total()).andReturn(30L).anyTimes();
expect(statistics.getmem_available()).andReturn(35L).anyTimes();
expect(statistics.getksm_cpu_percent()).andReturn(40).anyTimes();
expect(statistics.getcpu_user()).andReturn(45.0).anyTimes();
expect(statistics.getcpu_sys()).andReturn(50.0).anyTimes();
expect(statistics.getcpu_idle()).andReturn(55.0).anyTimes();
expect(statistics.getcpu_load()).andReturn(0.60).anyTimes();
return entity;
}
protected List<Host> getCollection() {
return collection.list().getHosts();
}
static Host getModel(int index) {
Host model = new Host();
model.setName(NAMES[index]);
model.setAddress(ADDRESSES[index]);
model.setRootPassword(ROOT_PASSWORD);
return model;
}
protected void verifyModel(Host model, int index) {
verifyModelSpecific(model, index);
verifyLinks(model);
}
static void verifyModelSpecific(Host model, int index) {
assertEquals(GUIDS[index].toString(), model.getId());
assertEquals(NAMES[index], model.getName());
assertEquals(ADDRESSES[index], model.getAddress());
assertEquals(HOST_STATUS[index].value(), model.getStatus().getState());
}
}