package org.ovirt.engine.api.restapi.resource; import java.util.ArrayList; import java.util.List; import org.junit.Ignore; import org.junit.Test; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.ovirt.engine.api.model.StorageDomain; import org.ovirt.engine.core.common.action.DetachStorageDomainFromPoolParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.StorageType; import org.ovirt.engine.core.common.businessentities.storage_domains; import org.ovirt.engine.core.common.businessentities.storage_server_connections; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.StorageDomainAndPoolQueryParameters; import org.ovirt.engine.core.common.queries.StoragePoolQueryParametersBase; import org.ovirt.engine.core.common.queries.StorageServerConnectionQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.classextension.EasyMock.expect; import static org.ovirt.engine.api.restapi.test.util.TestHelper.eqQueryParams; public class BackendAttachedStorageDomainsResourceTest extends AbstractBackendCollectionResourceTest<StorageDomain, storage_domains, BackendAttachedStorageDomainsResource> { public BackendAttachedStorageDomainsResourceTest() { super(new BackendAttachedStorageDomainsResource(GUIDS[NAMES.length-1].toString()), null, null); } @Test @Ignore public void testQuery() throws Exception { } @Test public void testAdd() throws Exception { setUriInfo(setUpBasicUriExpectations()); setUpGetEntityExpectations(VdcQueryType.GetStorageServerConnectionById, StorageServerConnectionQueryParametersBase.class, new String[] { "ServerConnectionId" }, new Object[] { GUIDS[0].toString() }, setUpStorageServerConnection()); setUpCreationExpectations(VdcActionType.AttachStorageDomainToPool, DetachStorageDomainFromPoolParameters.class, new String[] { "StorageDomainId", "StoragePoolId" }, new Object[] { GUIDS[0], GUIDS[NAMES.length-1] }, true, true, null, VdcQueryType.GetStorageDomainByIdAndStoragePoolId, StorageDomainAndPoolQueryParameters.class, new String[] { "StorageDomainId", "StoragePoolId" }, new Object[] { GUIDS[0], GUIDS[NAMES.length-1] }, getEntity(0)); StorageDomain model = new StorageDomain(); model.setId(GUIDS[0].toString()); Response response = collection.add(model); assertEquals(201, response.getStatus()); assertTrue(response.getEntity() instanceof StorageDomain); verifyModel((StorageDomain) response.getEntity(), 0); } static storage_server_connections setUpStorageServerConnection() { storage_server_connections cnx = new storage_server_connections(); cnx.setid(GUIDS[0].toString()); cnx.setconnection("10.11.12.13" + ":" + "/1"); return cnx; } @Test public void testAddByName() throws Exception { setUriInfo(setUpBasicUriExpectations()); setUpGetEntityExpectations(VdcQueryType.GetStorageServerConnectionById, StorageServerConnectionQueryParametersBase.class, new String[] { "ServerConnectionId" }, new Object[] { GUIDS[0].toString() }, setUpStorageServerConnection()); setUpGetEntityExpectations("Storage: name=" + NAMES[0], SearchType.StorageDomain, getEntity(0)); setUpCreationExpectations(VdcActionType.AttachStorageDomainToPool, DetachStorageDomainFromPoolParameters.class, new String[] { "StorageDomainId", "StoragePoolId" }, new Object[] { GUIDS[0], GUIDS[NAMES.length-1] }, true, true, null, VdcQueryType.GetStorageDomainByIdAndStoragePoolId, StorageDomainAndPoolQueryParameters.class, new String[] { "StorageDomainId", "StoragePoolId" }, new Object[] { GUIDS[0], GUIDS[NAMES.length-1] }, getEntity(0)); StorageDomain model = new StorageDomain(); model.setName(NAMES[0]); Response response = collection.add(model); assertEquals(201, response.getStatus()); assertTrue(response.getEntity() instanceof StorageDomain); verifyModel((StorageDomain) response.getEntity(), 0); } @Test public void testAddCantDo() throws Exception { doTestBadAdd(false, true, CANT_DO); } @Test public void testAddFailure() throws Exception { doTestBadAdd(true, false, FAILURE); } private void doTestBadAdd(boolean canDo, boolean success, String detail) throws Exception { setUriInfo(setUpActionExpectations(VdcActionType.AttachStorageDomainToPool, DetachStorageDomainFromPoolParameters.class, new String[] { "StorageDomainId", "StoragePoolId" }, new Object[] { GUIDS[0], GUIDS[NAMES.length-1] }, canDo, success)); StorageDomain model = new StorageDomain(); model.setId(GUIDS[0].toString()); try { collection.add(model); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyFault(wae, detail); } } @Test public void testAddIncompleteParameters() throws Exception { StorageDomain model = new StorageDomain(); setUriInfo(setUpBasicUriExpectations()); control.replay(); try { collection.add(model); fail("expected WebApplicationException on incomplete parameters"); } catch (WebApplicationException wae) { verifyIncompleteException(wae, "StorageDomain", "add", "id|name"); } } @Test public void testRemove() throws Exception { setUpGetEntityExpectations(VdcQueryType.GetStorageServerConnectionById, StorageServerConnectionQueryParametersBase.class, new String[] { "ServerConnectionId" }, new Object[] { GUIDS[0].toString() }, setUpStorageServerConnection()); setUpGetEntityExpectations(GUIDS[0]); setUriInfo(setUpActionExpectations(VdcActionType.DetachStorageDomainFromPool, DetachStorageDomainFromPoolParameters.class, new String[] { "StorageDomainId", "StoragePoolId" }, new Object[] { GUIDS[0], GUIDS[NAMES.length-1] }, true, true)); verifyRemove(collection.remove(GUIDS[0].toString())); } private void setUpGetEntityExpectations(Guid guid) throws Exception { setUpGetEntityExpectations(guid, false); } @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(wae.getResponse().getStatus(), 404); } } private void setUpGetEntityExpectations(Guid entityId, boolean returnNull) throws Exception { setUpGetEntityExpectations(VdcQueryType.GetStorageDomainByIdAndStoragePoolId, StorageDomainAndPoolQueryParameters.class, new String[] { "StorageDomainId", "StoragePoolId" }, new Object[] { entityId, GUIDS[NAMES.length-1] }, returnNull ? null : getEntity(0)); } @Test public void testRemoveCantDo() throws Exception { doTestBadRemove(false, true, CANT_DO); } @Test public void testRemoveFailed() throws Exception { doTestBadRemove(true, false, FAILURE); } @Override @Test public void testList() throws Exception { UriInfo uriInfo = setUpUriExpectations(null); String[] paramNames = new String[] { "ServerConnectionId" }; Object[] paramValues = new Object[] { GUIDS[0].toString() }; VdcQueryReturnValue queryResult = control.createMock(VdcQueryReturnValue.class); expect(backend.RunQuery(eq(VdcQueryType.GetStorageServerConnectionById), eqQueryParams(StorageServerConnectionQueryParametersBase.class, addSession(paramNames), addSession(paramValues)))) .andReturn(queryResult).anyTimes(); expect(queryResult.getSucceeded()).andReturn(true).anyTimes(); expect(queryResult.getReturnValue()).andReturn(setUpStorageServerConnection()).anyTimes(); setUpQueryExpectations(""); collection.setUriInfo(uriInfo); verifyCollection(getCollection()); } protected void doTestBadRemove(boolean canDo, boolean success, String detail) throws Exception { setUpGetEntityExpectations(VdcQueryType.GetStorageServerConnectionById, StorageServerConnectionQueryParametersBase.class, new String[] { "ServerConnectionId" }, new Object[] { GUIDS[0].toString() }, setUpStorageServerConnection()); setUpGetEntityExpectations(GUIDS[0]); setUriInfo(setUpActionExpectations(VdcActionType.DetachStorageDomainFromPool, DetachStorageDomainFromPoolParameters.class, new String[] { "StorageDomainId", "StoragePoolId" }, new Object[] { GUIDS[0], GUIDS[NAMES.length-1] }, canDo, success)); try { collection.remove(GUIDS[0].toString()); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyFault(wae, detail); } } protected void setUpQueryExpectations(String query, Object failure) throws Exception { assert (query.equals("")); setUpEntityQueryExpectations(VdcQueryType.GetStorageDomainsByStoragePoolId, StoragePoolQueryParametersBase.class, new String[] { "StoragePoolId" }, new Object[] { GUIDS[NAMES.length-1] }, setUpStorageDomains(), failure); control.replay(); } protected List<storage_domains> setUpStorageDomains() { List<storage_domains> entities = new ArrayList<storage_domains>(); for (int i = 0; i < NAMES.length; i++) { entities.add(getEntity(i)); } return entities; } protected storage_domains getEntity(int index) { storage_domains entity = control.createMock(storage_domains.class); return setUpEntityExpectations(entity, index); } static storage_domains setUpEntityExpectations(storage_domains entity, int index) { expect(entity.getid()).andReturn(GUIDS[index]).anyTimes(); expect(entity.getstatus()).andReturn(StorageDomainStatus.Active).anyTimes(); expect(entity.getstorage_domain_type()).andReturn(StorageDomainType.Master).anyTimes(); expect(entity.getstorage_type()).andReturn(StorageType.NFS).anyTimes(); expect(entity.getstorage()).andReturn(GUIDS[0].toString()).anyTimes(); return entity; } protected void verifyModel(StorageDomain model, int index) { verifyStorageDomain(model, index); verifyLinks(model); } static void verifyStorageDomain(StorageDomain model, int index) { assertEquals(GUIDS[index].toString(), model.getId()); assertNotNull(model.getDataCenter()); assertEquals(GUIDS[NAMES.length-1].toString(), model.getDataCenter().getId()); assertEquals(org.ovirt.engine.api.model.StorageDomainStatus.ACTIVE.value(), model.getStatus().getState()); assertEquals(true, model.isMaster()); } protected List<StorageDomain> getCollection() { return collection.list().getStorageDomains(); } }