package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import org.junit.Test; import org.ovirt.engine.api.model.CPU; import org.ovirt.engine.api.model.Cluster; import org.ovirt.engine.api.model.DataCenter; import org.ovirt.engine.api.model.Version; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.GetVdsGroupByIdParameters; import org.ovirt.engine.core.common.queries.StoragePoolQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdsGroupOperationParameters; import org.ovirt.engine.core.common.action.VdsGroupParametersBase; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.storage_pool; import org.ovirt.engine.core.compat.Guid; import static org.easymock.classextension.EasyMock.expect; public class BackendClustersResourceTest extends AbstractBackendCollectionResourceTest<Cluster, VDSGroup, BackendClustersResource> { public BackendClustersResourceTest() { super(new BackendClustersResource(), SearchType.Cluster, "Clusters : "); } @Test public void testRemove() throws Exception { setUpGetEntityExpectations(); setUriInfo(setUpActionExpectations(VdcActionType.RemoveVdsGroup, VdsGroupParametersBase.class, new String[] { "VdsGroupId" }, new Object[] { GUIDS[0] }, true, true)); verifyRemove(collection.remove(GUIDS[0].toString())); } @Test public void testRemoveNonExistant() throws Exception{ setUpGetEntityExpectations(NON_EXISTANT_GUID, true); 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(Guid entityId, Boolean returnNull) throws Exception { setUpGetEntityExpectations(VdcQueryType.GetVdsGroupById, GetVdsGroupByIdParameters.class, new String[] { "VdsId" }, new Object[] { entityId }, returnNull ? null : getEntity(0)); } private void setUpGetEntityExpectations() throws Exception { setUpGetEntityExpectations(GUIDS[0], false); } @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.RemoveVdsGroup, VdsGroupParametersBase.class, new String[] { "VdsGroupId" }, new Object[] { GUIDS[0] }, canDo, success)); try { collection.remove(GUIDS[0].toString()); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyFault(wae, detail); } } @Test public void testAddClusterFallbackVersion() throws Exception { setUriInfo(setUpBasicUriExpectations()); setUpGetEntityExpectations(VdcQueryType.GetStoragePoolById, StoragePoolQueryParametersBase.class, new String[] { "StoragePoolId" }, new Object[] { GUIDS[1] }, setUpStoragePool(-1)); setUpCreationExpectations(VdcActionType.AddVdsGroup, VdsGroupOperationParameters.class, new String[] { "VdsGroup.compatibility_version" }, new Object[] { new org.ovirt.engine.core.compat.Version(2, 2) }, true, true, GUIDS[0], VdcQueryType.GetVdsGroupById, GetVdsGroupByIdParameters.class, new String[] { "VdsId" }, new Object[] { GUIDS[0] }, getEntity(0)); Cluster model = getModel(0); model.getDataCenter().setId(GUIDS[1].toString()); Response response = collection.add(model); assertEquals(201, response.getStatus()); assertTrue(response.getEntity() instanceof Cluster); verifyModel((Cluster) response.getEntity(), 0); } @Test public void testAddClusterSpecificVersion() throws Exception { setUriInfo(setUpBasicUriExpectations()); setUpGetEntityExpectations(VdcQueryType.GetStoragePoolById, StoragePoolQueryParametersBase.class, new String[] { "StoragePoolId" }, new Object[] { GUIDS[1] }, setUpStoragePool(-1)); setUpCreationExpectations(VdcActionType.AddVdsGroup, VdsGroupOperationParameters.class, new String[] { "VdsGroup.compatibility_version" }, new Object[] { new org.ovirt.engine.core.compat.Version(2, 3) }, true, true, GUIDS[0], VdcQueryType.GetVdsGroupById, GetVdsGroupByIdParameters.class, new String[] { "VdsId" }, new Object[] { GUIDS[0] }, getEntity(0)); Cluster model = getModel(0); model.getDataCenter().setId(GUIDS[1].toString()); model.setVersion(new Version()); model.getVersion().setMajor(2); model.getVersion().setMinor(3); Response response = collection.add(model); assertEquals(201, response.getStatus()); assertTrue(response.getEntity() instanceof Cluster); verifyModel((Cluster) response.getEntity(), 0); } @Test public void testAddClusterCantDo() throws Exception { doTestBadAddCluster(false, true, CANT_DO); } @Test public void testAddClusterFailure() throws Exception { doTestBadAddCluster(true, false, FAILURE); } private void doTestBadAddCluster(boolean canDo, boolean success, String detail) throws Exception { setUpGetEntityExpectations(VdcQueryType.GetStoragePoolById, StoragePoolQueryParametersBase.class, new String[] { "StoragePoolId" }, new Object[] { GUIDS[1] }, setUpStoragePool(-1)); setUriInfo(setUpActionExpectations(VdcActionType.AddVdsGroup, VdsGroupOperationParameters.class, new String[] {}, new Object[] {}, canDo, success)); Cluster model = getModel(0); model.getDataCenter().setId(GUIDS[1].toString()); try { collection.add(model); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyFault(wae, detail); } } @Test public void testAddClusterNamedDataCenter() throws Exception { setUriInfo(setUpBasicUriExpectations()); setUpGetEntityExpectations("Datacenter: name=" + NAMES[1], SearchType.StoragePool, setUpStoragePool(1)); setUpCreationExpectations(VdcActionType.AddVdsGroup, VdsGroupOperationParameters.class, new String[] {}, new Object[] {}, true, true, GUIDS[0], VdcQueryType.GetVdsGroupById, GetVdsGroupByIdParameters.class, new String[] { "VdsId" }, new Object[] { GUIDS[0] }, getEntity(0)); Cluster model = getModel(0); model.getDataCenter().setName(NAMES[1]); Response response = collection.add(model); assertEquals(201, response.getStatus()); assertTrue(response.getEntity() instanceof Cluster); verifyModel((Cluster) response.getEntity(), 0); } @Test public void testAddClusterCantDoNamedDataCenter() throws Exception { doTestBadAddClusterNamedDataCenter(false, true, CANT_DO); } @Test public void testAddClusterFailureNamedDataCenter() throws Exception { doTestBadAddClusterNamedDataCenter(true, false, FAILURE); } private void doTestBadAddClusterNamedDataCenter(boolean canDo, boolean success, String detail) throws Exception { setUpGetEntityExpectations("Datacenter: name=" + NAMES[1], SearchType.StoragePool, setUpStoragePool(1)); setUriInfo(setUpActionExpectations(VdcActionType.AddVdsGroup, VdsGroupOperationParameters.class, new String[] {}, new Object[] {}, canDo, success)); Cluster model = getModel(0); model.getDataCenter().setName(NAMES[1]); try { collection.add(model); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyFault(wae, detail); } } @Test public void testAddIncompleteParameters() throws Exception { Cluster model = new Cluster(); model.setName(NAMES[0]); setUriInfo(setUpBasicUriExpectations()); control.replay(); try { collection.add(model); fail("expected WebApplicationException on incomplete parameters"); } catch (WebApplicationException wae) { verifyIncompleteException(wae, "Cluster", "add", "dataCenter.name|id"); } } protected storage_pool setUpStoragePool(int index) { storage_pool pool = control.createMock(storage_pool.class); org.ovirt.engine.core.compat.Version version = new org.ovirt.engine.core.compat.Version(2, 2); if (index != -1) { expect(pool.getId()).andReturn(GUIDS[index]).anyTimes(); } expect(pool.getcompatibility_version()).andReturn(version).anyTimes(); return pool; } protected VDSGroup getEntity(int index) { return setUpEntityExpectations(control.createMock(VDSGroup.class), index); } static VDSGroup setUpEntityExpectations(VDSGroup entity, int index) { expect(entity.getID()).andReturn(GUIDS[index]).anyTimes(); expect(entity.getname()).andReturn(NAMES[index]).anyTimes(); expect(entity.getdescription()).andReturn(DESCRIPTIONS[index]).anyTimes(); return entity; } static Cluster getModel(int index) { Cluster model = new Cluster(); model.setName(NAMES[index]); model.setDescription(DESCRIPTIONS[index]); model.setDataCenter(new DataCenter()); model.setCpu(new CPU()); model.getCpu().setId("Intel Xeon"); return model; } protected List<Cluster> getCollection() { return collection.list().getClusters(); } }