package org.ovirt.engine.api.restapi.resource.gluster; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.isA; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.ovirt.engine.api.restapi.resource.gluster.BackendGlusterVolumesResourceTest.setUpEntityExpectations; 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.Action; import org.ovirt.engine.api.model.Cluster; import org.ovirt.engine.api.model.GlusterVolume; import org.ovirt.engine.api.model.Option; import org.ovirt.engine.api.resource.ClusterResource; import org.ovirt.engine.api.restapi.resource.AbstractBackendSubResourceTest; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeActionParameters; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeOptionParameters; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeParameters; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeRebalanceParameters; import org.ovirt.engine.core.common.action.gluster.ResetGlusterVolumeOptionsParameters; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; 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 BackendGlusterVolumeResourceTest extends AbstractBackendSubResourceTest<GlusterVolume, GlusterVolumeEntity, BackendGlusterVolumeResource> { private static final Guid clusterId = GUIDS[0]; private static final String defaultClusterName = "Default"; private ClusterResource clusterResourceMock; private BackendGlusterVolumesResource volumesResourceMock; public BackendGlusterVolumeResourceTest() { super(new BackendGlusterVolumeResource(GUIDS[0].toString())); } @Test public void testGet() throws Exception { setupParentExpectations(); setUriInfo(setUpBasicUriExpectations()); setUpGetEntityExpectations(1); resource.setParent(volumesResourceMock); verifyModel(resource.get(), 0); } @Test public void testGetNotFound() throws Exception { setUriInfo(setUpBasicUriExpectations()); setUpGetEntityExpectations(1, true); try { resource.get(); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyNotFoundException(wae); } } @Test public void testStart() throws Exception { setupParentExpectations(); resource.setParent(volumesResourceMock); setUriInfo(setUpActionExpectations(VdcActionType.StartGlusterVolume, GlusterVolumeActionParameters.class, new String[] { "VolumeId" }, new Object[] { GUIDS[0] })); verifyActionResponse(resource.start(new Action())); } @Test public void testStop() throws Exception { setupParentExpectations(); resource.setParent(volumesResourceMock); setUriInfo(setUpActionExpectations(VdcActionType.StopGlusterVolume, GlusterVolumeActionParameters.class, new String[] { "VolumeId" }, new Object[] { GUIDS[0] })); verifyActionResponse(resource.stop(new Action())); } @Test public void testRebalance() throws Exception { setupParentExpectations(); resource.setParent(volumesResourceMock); setUriInfo(setUpActionExpectations(VdcActionType.StartRebalanceGlusterVolume, GlusterVolumeRebalanceParameters.class, new String[] { "VolumeId" }, new Object[] { GUIDS[0] })); verifyActionResponse(resource.rebalance(new Action())); } @Test public void testStopRebalance() throws Exception { setupParentExpectations(); resource.setParent(volumesResourceMock); setUriInfo(setUpActionExpectations(VdcActionType.StopRebalanceGlusterVolume, GlusterVolumeRebalanceParameters.class, new String[] { "VolumeId" }, new Object[] { GUIDS[0] })); verifyActionResponse(resource.stopRebalance(new Action())); } @Test public void testSetOptionInvalidParams() throws Exception { setUriInfo(setUpBasicUriExpectations()); resource.setUriInfo(setUpBasicUriExpectations()); try { Action action = new Action(); action.setOption(new Option()); resource.setOption(action); fail("expected WebApplicationException on incomplete parameters"); } catch (WebApplicationException wae) { verifyIncompleteException(wae, "Option", "setOption", "name, value"); } } @Test public void testSetOption() throws Exception { setupParentExpectations(); resource.setParent(volumesResourceMock); setUriInfo(setUpActionExpectations(VdcActionType.SetGlusterVolumeOption, GlusterVolumeOptionParameters.class, new String[] { "VolumeId" }, new Object[] { GUIDS[0] })); Action action = new Action(); action.setOption(new Option()); action.getOption().setName("auth.allow"); action.getOption().setValue("*"); verifyActionResponse(resource.setOption(action)); } @Test public void testResetOptionInvalidParams() throws Exception { setUriInfo(setUpBasicUriExpectations()); resource.setUriInfo(setUpBasicUriExpectations()); try { Action action = new Action(); action.setOption(new Option()); resource.resetOption(action); fail("expected WebApplicationException on incomplete parameters"); } catch (WebApplicationException wae) { verifyIncompleteException(wae, "Option", "resetOption", "name"); } } @Test public void testResetOption() throws Exception { setupParentExpectations(); resource.setParent(volumesResourceMock); setUriInfo(setUpActionExpectations(VdcActionType.ResetGlusterVolumeOptions, ResetGlusterVolumeOptionsParameters.class, new String[] { "VolumeId" }, new Object[] { GUIDS[0] })); Action action = new Action(); action.setOption(new Option()); action.getOption().setName("auth.allow"); verifyActionResponse(resource.resetOption(action)); } @Test public void testResetAllOptions() throws Exception { setupParentExpectations(); resource.setParent(volumesResourceMock); setUriInfo(setUpActionExpectations(VdcActionType.ResetGlusterVolumeOptions, ResetGlusterVolumeOptionsParameters.class, new String[] { "VolumeId" }, new Object[] { GUIDS[0] })); verifyActionResponse(resource.resetAllOptions(new Action())); } @Test public void testRemove() throws Exception { setupParentExpectations(); setUpGetEntityExpectations(1); setUriInfo( setUpActionExpectations( VdcActionType.DeleteGlusterVolume, GlusterVolumeParameters.class, new String[] { "VolumeId" }, new Object[] { GUIDS[0] }, true, true ) ); resource.setParent(volumesResourceMock); verifyRemove(resource.remove()); } protected UriInfo setUpActionExpectations(VdcActionType task, Class<? extends VdcActionParametersBase> clz, String[] names, Object[] values) { return setUpActionExpectations(task, clz, names, values, true, true, null, null, true); } private void verifyActionResponse(Response r) throws Exception { verifyActionResponse(r, "glustervolumes/" + GUIDS[0], false); } @Override protected GlusterVolumeEntity getEntity(int index) { return setUpEntityExpectations(mock(GlusterVolumeEntity.class), index); } /** * Overridden as {@link GlusterVolumeEntity} does not have description field */ @Override protected void verifyModel(GlusterVolume model, int index) { assertEquals(GUIDS[index].toString(), model.getId()); assertEquals(NAMES[index], model.getName()); assertEquals(org.ovirt.engine.api.model.GlusterVolumeType.DISTRIBUTE, model.getVolumeType()); assertEquals(clusterId.toString(), model.getCluster().getId()); verifyLinks(model); } protected void setUpGetEntityExpectations(int times) throws Exception { setUpGetEntityExpectations(times, false); } protected void setUpGetEntityExpectations(int times, boolean notFound) throws Exception { while (times-- > 0) { setUpGetEntityExpectations(VdcQueryType.GetGlusterVolumeById, IdQueryParameters.class, new String[] { "Id" }, new Object[] { GUIDS[0] }, notFound ? null : getEntity(0)); } } private void setupParentExpectations() { Cluster cluster = new Cluster(); cluster.setName(defaultClusterName); cluster.setId(clusterId.toString()); clusterResourceMock = mock(ClusterResource.class); when(clusterResourceMock.get()).thenReturn(cluster); volumesResourceMock = mock(BackendGlusterVolumesResource.class); when(volumesResourceMock.getParent()).thenReturn(clusterResourceMock); doAnswer(invocation -> { GlusterVolume model = (GlusterVolume) invocation.getArguments()[0]; Cluster clusterModel = new Cluster(); clusterModel.setId(clusterId.toString()); model.setCluster(clusterModel); return model; }).when(volumesResourceMock).addParents(isA(GlusterVolume.class)); } }