package org.ovirt.engine.api.restapi.resource; import java.util.ArrayList; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import org.junit.Test; import org.ovirt.engine.api.model.Network; import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.network; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.queries.GetAllNetworkQueryParamenters; import org.ovirt.engine.core.common.queries.GetVdsGroupByIdParameters; import org.ovirt.engine.core.common.queries.GetVdsGroupByVdsGroupIdParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.common.queries.VdsGroupQueryParamenters; import org.ovirt.engine.core.compat.Guid; import static org.easymock.classextension.EasyMock.expect; public class BackendClusterNetworksResourceTest extends AbstractBackendNetworksResourceTest { static final Guid CLUSTER_ID = GUIDS[1]; public BackendClusterNetworksResourceTest() { super(new BackendClusterNetworksResource(CLUSTER_ID.toString())); } @Test public void testRemoveNotFound() throws Exception { setUpEntityQueryExpectations(VdcQueryType.GetAllNetworksByClusterId, VdsGroupQueryParamenters.class, new String[] { "VdsGroupId" }, new Object[] { CLUSTER_ID }, new ArrayList<network>()); control.replay(); try { collection.remove(GUIDS[0].toString()); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyNotFoundException(wae); } } @Test public void testRemove() throws Exception { VDSGroup vdsGroup = setUpVDSGroupExpectations(CLUSTER_ID); setUpEntityQueryExpectations(2); setUriInfo(setUpActionExpectations(VdcActionType.DetachNetworkToVdsGroup, AttachNetworkToVdsGroupParameter.class, new String[] { "VdsGroup" }, new Object[] { vdsGroup }, true, true)); verifyRemove(collection.remove(GUIDS[0].toString())); } @Test public void testRemoveCantDo() throws Exception { doTestBadRemove(false, true, CANT_DO); } @Test public void testRemoveFailed() throws Exception { doTestBadRemove(true, false, FAILURE); } protected void doTestBadRemove(boolean canDo, boolean success, String detail) throws Exception { VDSGroup vdsGroup = setUpVDSGroupExpectations(CLUSTER_ID); setUpEntityQueryExpectations(2); setUriInfo(setUpActionExpectations(VdcActionType.DetachNetworkToVdsGroup, AttachNetworkToVdsGroupParameter.class, new String[] { "VdsGroup" }, new Object[] { vdsGroup }, canDo, success)); try { collection.remove(GUIDS[0].toString()); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyFault(wae, detail); } } @Test public void testAddNetwork() throws Exception { VDSGroup vdsGroup = setUpVDSGroupExpectations(CLUSTER_ID); setUriInfo(setUpBasicUriExpectations()); setUpCreationExpectations(VdcActionType.AttachNetworkToVdsGroup, AttachNetworkToVdsGroupParameter.class, new String[] { "VdsGroup" }, new Object[] { vdsGroup }, true, true, null, VdcQueryType.GetAllNetworksByClusterId, VdsGroupQueryParamenters.class, new String[] { "VdsGroupId" }, new Object[] { CLUSTER_ID }, asList(getEntity(0))); Network model = getModel(0); Response response = ((BackendClusterNetworksResource)collection).add(model); assertEquals(201, response.getStatus()); assertTrue(response.getEntity() instanceof Network); verifyModel((Network) response.getEntity(), 0); } @Test public void testAddNetworkCantDo() throws Exception { doTestBadAddNetwork(false, true, CANT_DO); } @Test public void testAddNetworkFailure() throws Exception { doTestBadAddNetwork(true, false, FAILURE); } private void doTestBadAddNetwork(boolean canDo, boolean success, String detail) throws Exception { VDSGroup vdsGroup = setUpVDSGroupExpectations(CLUSTER_ID); setUriInfo(setUpActionExpectations(VdcActionType.AttachNetworkToVdsGroup, AttachNetworkToVdsGroupParameter.class, new String[] { "VdsGroup" }, new Object[] { vdsGroup }, canDo, success)); Network model = getModel(0); try { ((BackendClusterNetworksResource)collection).add(model); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyFault(wae, detail); } } @Test public void testAddNameSuppliedButNoId() throws Exception { setUriInfo(setUpBasicUriExpectations()); Network model = new Network(); model.setName("orcus"); model.setDescription(DESCRIPTIONS[0]); setUpEntityQueryExpectations(1, null); setUpGetClusterExpectations(); setUpGetNetworksByDataCenterExpectations(1, null); VDSGroup vdsGroup = setUpVDSGroupExpectations(CLUSTER_ID); setUpActionExpectations(VdcActionType.AttachNetworkToVdsGroup, AttachNetworkToVdsGroupParameter.class, new String[] { "VdsGroup" }, new Object[] { vdsGroup }, true, true); ((BackendClusterNetworksResource)collection).add(model); } @Test public void testAddIncompleteParameters_noName() throws Exception { Network model = new Network(); model.setId(GUIDS[0].toString()); model.setDescription(DESCRIPTIONS[0]); setUriInfo(setUpBasicUriExpectations()); control.replay(); try { ((BackendClusterNetworksResource)collection).add(model); fail("expected WebApplicationException on incomplete parameters"); } catch (WebApplicationException wae) { verifyIncompleteException(wae, "Network", "add", "name"); } } protected void setUpEntityQueryExpectations(int times, Object failure) throws Exception { while (times-- > 0) { setUpEntityQueryExpectations(VdcQueryType.GetAllNetworksByClusterId, VdsGroupQueryParamenters.class, new String[] { "VdsGroupId" }, new Object[] { CLUSTER_ID }, getEntityList(), failure); } } protected VDSGroup setUpVDSGroupExpectations(Guid id) { VDSGroup group = control.createMock(VDSGroup.class); expect(group.getID()).andReturn(id).anyTimes(); setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupByVdsGroupId, GetVdsGroupByVdsGroupIdParameters.class, new String[] { "VdsGroupId" }, new Object[] { id }, group); return group; } protected void setUpGetNetworksByDataCenterExpectations(int times, Object failure) throws Exception { while (times-- > 0) { setUpEntityQueryExpectations(VdcQueryType.GetAllNetworks, GetAllNetworkQueryParamenters.class, new String[] { "StoragePoolId" }, new Object[] { GUIDS[2] }, getEntityList(), failure); } } protected void setUpGetClusterExpectations() { VDSGroup cluster = new VDSGroup(); cluster.setstorage_pool_id(GUIDS[2]); setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupById, GetVdsGroupByIdParameters.class, new String[] { "VdsId" }, new Object[] { CLUSTER_ID }, cluster, null); } }