package org.ovirt.engine.api.restapi.resource; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.ovirt.engine.api.restapi.test.util.TestHelper.eqParams; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.ovirt.engine.api.model.Api; import org.ovirt.engine.api.model.Link; import org.ovirt.engine.api.model.SpecialObjects; import org.ovirt.engine.api.restapi.invocation.Current; import org.ovirt.engine.api.restapi.invocation.CurrentManager; import org.ovirt.engine.api.restapi.invocation.VersionSource; import org.ovirt.engine.api.restapi.logging.MessageBundle; import org.ovirt.engine.core.common.businessentities.aaa.DbUser; import org.ovirt.engine.core.common.interfaces.BackendLocal; import org.ovirt.engine.core.common.mode.ApplicationMode; import org.ovirt.engine.core.common.queries.ConfigurationValues; import org.ovirt.engine.core.common.queries.GetConfigurationValueParameters; import org.ovirt.engine.core.common.queries.GetSystemStatisticsQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; public class BackendApiResourceTest { private static final String ROOT_TAG_HREF = "/ovirt-engine/api/tags/00000000-0000-0000-0000-000000000000"; private static final String BLANK_TEMPLATE_HREF = "/ovirt-engine/api/templates/00000000-0000-0000-0000-000000000000"; protected BackendApiResource resource; protected BackendLocal backend; protected Current current; protected DbUser currentUser; protected HttpHeaders httpHeaders; protected static final String USER = "Aladdin"; protected static final String DOMAIN = "Maghreb"; protected static final String URI_ROOT = "http://localhost:8099"; protected static final String BASE_PATH = "/ovirt-engine/api"; protected static final String BUNDLE_PATH = "org/ovirt/engine/api/restapi/logging/Messages"; protected static final String SESSION_ID = Guid.newGuid().toString(); private static final String USER_FILTER_HEADER = "filter"; protected static final int MAJOR = 11; protected static final int MINOR = 0; protected static final int BUILD = 99; protected static final int REVISION = 13; protected static final String SYSTEM_VERSION = Integer.toString(MAJOR) + "." + Integer.toString(MINOR) + "." + Integer.toString(BUILD) + "." + Integer.toString(REVISION); protected static int TOTAL_VMS = 123456; protected static int ACTIVE_VMS = 23456; protected static int TOTAL_HOSTS = 23456; protected static int ACTIVE_HOSTS = 3456; protected static int TOTAL_USERS = 3456; protected static int ACTIVE_USERS = 456; protected static int TOTAL_STORAGE_DOMAINS = 56; protected static int ACTIVE_STORAGE_DOMAINS = 6; private static final String[] relationships = { "clusters", "clusters/search", "datacenters", "datacenters/search", "events", "events/search", "hosts", "hosts/search", "networks", "networks/search", "roles", "storagedomains", "storagedomains/search", "tags", "bookmarks", "icons", "templates", "templates/search", "instancetypes", "instancetypes/search", "users", "users/search", "groups", "groups/search", "domains", "vmpools", "vmpools/search", "vms", "vms/search", "disks", "disks/search", "jobs", "storageconnections", "vnicprofiles", "diskprofiles", "cpuprofiles", "schedulingpolicyunits", "schedulingpolicies", "permissions", "macpools", "networkfilters", "operatingsystems", "externalhostproviders", "openstackimageproviders", "openstackvolumeproviders", "openstacknetworkproviders", "katelloerrata", "affinitylabels", "clusterlevels", "imagetransfers", "externalvmimports" }; private static final String[] relationshipsGlusterOnly = { "clusters", "clusters/search", "events", "events/search", "hosts", "hosts/search", "networks", "networks/search", "roles", "tags", "users", "users/search", "groups", "groups/search", "domains", }; private static final String[] hrefs = { BASE_PATH + "/clusters", BASE_PATH + "/clusters?search={query}", BASE_PATH + "/datacenters", BASE_PATH + "/datacenters?search={query}", BASE_PATH + "/events", BASE_PATH + "/events;from={event_id}?search={query}", BASE_PATH + "/hosts", BASE_PATH + "/hosts?search={query}", BASE_PATH + "/networks", BASE_PATH + "/networks?search={query}", BASE_PATH + "/roles", BASE_PATH + "/storagedomains", BASE_PATH + "/storagedomains?search={query}", BASE_PATH + "/tags", BASE_PATH + "/bookmarks", BASE_PATH + "/icons", BASE_PATH + "/templates", BASE_PATH + "/templates?search={query}", BASE_PATH + "/instancetypes", BASE_PATH + "/instancetypes?search={query}", BASE_PATH + "/users", BASE_PATH + "/users?search={query}", BASE_PATH + "/groups", BASE_PATH + "/groups?search={query}", BASE_PATH + "/domains", BASE_PATH + "/vmpools", BASE_PATH + "/vmpools?search={query}", BASE_PATH + "/vms", BASE_PATH + "/vms?search={query}", BASE_PATH + "/disks", BASE_PATH + "/disks?search={query}", BASE_PATH + "/jobs", BASE_PATH + "/storageconnections", BASE_PATH + "/vnicprofiles", BASE_PATH + "/diskprofiles", BASE_PATH + "/cpuprofiles", BASE_PATH + "/schedulingpolicyunits", BASE_PATH + "/schedulingpolicies", BASE_PATH + "/permissions", BASE_PATH + "/macpools", BASE_PATH + "/networkfilters", BASE_PATH + "/operatingsystems", BASE_PATH + "/externalhostproviders", BASE_PATH + "/openstackimageproviders", BASE_PATH + "/openstackvolumeproviders", BASE_PATH + "/openstacknetworkproviders", BASE_PATH + "/katelloerrata", BASE_PATH + "/affinitylabels", BASE_PATH + "/clusterlevels", BASE_PATH + "/imagetransfers", BASE_PATH + "/externalvmimports" }; private static final String[] hrefsGlusterOnly = { BASE_PATH + "/clusters", BASE_PATH + "/clusters?search={query}", BASE_PATH + "/events", BASE_PATH + "/events;from={event_id}?search={query}", BASE_PATH + "/hosts", BASE_PATH + "/hosts?search={query}", BASE_PATH + "/networks", BASE_PATH + "/networks?search={query}", BASE_PATH + "/roles", BASE_PATH + "/tags", BASE_PATH + "/users", BASE_PATH + "/users?search={query}", BASE_PATH + "/groups", BASE_PATH + "/groups?search={query}", BASE_PATH + "/domains", }; public BackendApiResourceTest() { resource = new BackendApiResource(); } @Before public void setUp() { backend = mock(BackendLocal.class); currentUser = new DbUser(); currentUser.setLoginName(USER); currentUser.setDomain(DOMAIN); current = new Current(); current.setUser(currentUser); current.setSessionId(SESSION_ID); current.setRoot(URI_ROOT); current.setPrefix(BASE_PATH); current.setPath(""); current.setVersion("4"); current.setVersionSource(VersionSource.DEFAULT); current.setBackend(backend); CurrentManager.put(current); MessageBundle messageBundle = new MessageBundle(); messageBundle.setPath(BUNDLE_PATH); messageBundle.populate(); resource.setMessageBundle(messageBundle); httpHeaders = mock(HttpHeaders.class); List<Locale> locales = new ArrayList<>(); when(httpHeaders.getAcceptableLanguages()).thenReturn(locales); List<String> filterValue = new ArrayList<>(); filterValue.add("false"); when(httpHeaders.getRequestHeader(USER_FILTER_HEADER)).thenReturn(filterValue); resource.setHttpHeaders(httpHeaders); } @After public void tearDown() { CurrentManager.remove(); } @Test public void testGet() { doTestGet(ApplicationMode.AllModes); } @Test public void testGetVirtOnly() { doTestGet(ApplicationMode.VirtOnly); } @Test public void testGetWithTrailingSlash() { doTestGet(ApplicationMode.AllModes); } @Test public void testGetWithTrailingSlashVirtOnly() { doTestGet(ApplicationMode.VirtOnly); } @Test public void testGetGlusterOnly() { doTestGlusterOnlyGet(); } protected void doTestGet(ApplicationMode appMode) { setupExpectations(appMode); verifyResponse(resource.get()); } private void setupExpectations(ApplicationMode appMode) { current.setApplicationMode(appMode); resource.setUriInfo(setUpUriInfo()); setUpGetSystemVersionExpectations(); setUpGetSystemStatisticsExpectations(); } protected void doTestGlusterOnlyGet() { setupExpectations(ApplicationMode.GlusterOnly); verifyResponseGlusterOnly(resource.get()); } protected HashMap<String, Integer> setUpStats() { HashMap<String, Integer> stats = new HashMap<>(); stats.put("total_vms", TOTAL_VMS); stats.put("active_vms", ACTIVE_VMS); stats.put("total_vds", TOTAL_HOSTS); stats.put("active_vds", ACTIVE_HOSTS); stats.put("total_users", TOTAL_USERS); stats.put("active_users", ACTIVE_USERS); stats.put("total_storage_domains", TOTAL_STORAGE_DOMAINS); stats.put("active_storage_domains", ACTIVE_STORAGE_DOMAINS); return stats; } protected void verifyResponse(Response response) { assertEquals(200, response.getStatus()); assertTrue(response.getEntity() instanceof Api); verifyApi((Api) response.getEntity()); } protected void verifyResponseGlusterOnly(Response response) { assertEquals(200, response.getStatus()); assertTrue(response.getEntity() instanceof Api); verifyApiGlusterOnly((Api) response.getEntity()); } protected void verifyApi(Api api) { assertNotNull(api); assertNotNull(api.getTime()); assertNotNull(api.getLinks()); assertEquals(relationships.length, api.getLinks().size()); for (int i = 0; i < relationships.length; i++) { Link l = api.getLinks().get(i); assertNotNull(l); assertEquals(relationships[i], l.getRel()); assertEquals(hrefs[i], l.getHref()); } assertNotNull(api.getSpecialObjects()); assertContainsRootTag(api.getSpecialObjects()); assertContainsBlankTemplate(api.getSpecialObjects()); assertNotNull(api.getProductInfo()); assertNotNull(api.getProductInfo().getVersion()); assertNotNull(api.getProductInfo().getVersion().getFullVersion()); assertEquals(MAJOR, api.getProductInfo().getVersion().getMajor().intValue()); assertEquals(MINOR, api.getProductInfo().getVersion().getMinor().intValue()); assertEquals(BUILD, api.getProductInfo().getVersion().getBuild().intValue()); assertEquals(REVISION, api.getProductInfo().getVersion().getRevision().intValue()); assertNotNull(api.getSummary()); assertEquals(TOTAL_VMS, api.getSummary().getVms().getTotal().intValue()); assertEquals(ACTIVE_VMS, api.getSummary().getVms().getActive().intValue()); assertEquals(TOTAL_HOSTS, api.getSummary().getHosts().getTotal().intValue()); assertEquals(ACTIVE_HOSTS, api.getSummary().getHosts().getActive().intValue()); assertEquals(TOTAL_USERS, api.getSummary().getUsers().getTotal().intValue()); assertEquals(ACTIVE_USERS, api.getSummary().getUsers().getActive().intValue()); assertEquals(TOTAL_STORAGE_DOMAINS, api.getSummary().getStorageDomains().getTotal().intValue()); assertEquals(ACTIVE_STORAGE_DOMAINS, api.getSummary().getStorageDomains().getActive().intValue()); } protected void verifyApiGlusterOnly(Api api) { assertNotNull(api); assertNotNull(api.getTime()); assertNotNull(api.getLinks()); assertEquals(relationshipsGlusterOnly.length, api.getLinks().size()); for (int i = 0; i < relationshipsGlusterOnly.length; i++) { Link l = api.getLinks().get(i); assertNotNull(l); assertEquals(relationshipsGlusterOnly[i], l.getRel()); assertEquals(hrefsGlusterOnly[i], l.getHref()); } assertNotNull(api.getSpecialObjects()); assertContainsRootTag(api.getSpecialObjects()); assertNotNull(api.getProductInfo()); assertNotNull(api.getProductInfo().getVersion()); assertEquals(MAJOR, api.getProductInfo().getVersion().getMajor().intValue()); assertEquals(MINOR, api.getProductInfo().getVersion().getMinor().intValue()); assertEquals(BUILD, api.getProductInfo().getVersion().getBuild().intValue()); assertEquals(REVISION, api.getProductInfo().getVersion().getRevision().intValue()); assertNotNull(api.getSummary()); assertEquals(TOTAL_HOSTS, api.getSummary().getHosts().getTotal().intValue()); assertEquals(ACTIVE_HOSTS, api.getSummary().getHosts().getActive().intValue()); assertEquals(TOTAL_USERS, api.getSummary().getUsers().getTotal().intValue()); assertEquals(ACTIVE_USERS, api.getSummary().getUsers().getActive().intValue()); } private static void assertContainsBlankTemplate(SpecialObjects objs) { assertNotNull(objs.getBlankTemplate()); assertEquals(BLANK_TEMPLATE_HREF, objs.getBlankTemplate().getHref()); } private static void assertContainsRootTag(SpecialObjects objs) { assertNotNull(objs.getRootTag()); assertEquals(ROOT_TAG_HREF, objs.getRootTag().getHref()); } protected UriInfo setUpUriInfo() { UriBuilder uriBuilder = mock(UriBuilder.class); when(uriBuilder.clone()).thenReturn(uriBuilder); UriInfo uriInfo = mock(UriInfo.class); when(uriInfo.getQueryParameters()).thenReturn(null); when(uriInfo.getPathSegments()).thenReturn(null); return uriInfo; } protected void setUpGetSystemVersionExpectations() { VdcQueryReturnValue productRpmQueryResult = mock(VdcQueryReturnValue.class); when(productRpmQueryResult.getSucceeded()).thenReturn(true); when(productRpmQueryResult.getReturnValue()).thenReturn(SYSTEM_VERSION); when(backend.runQuery(eq(VdcQueryType.GetConfigurationValue), getProductRPMVersionParams())).thenReturn(productRpmQueryResult); VdcQueryReturnValue productVersionQueryResult = mock(VdcQueryReturnValue.class); when(productVersionQueryResult.getSucceeded()).thenReturn(true); when(productVersionQueryResult.getReturnValue()).thenReturn(new Version(MAJOR, MINOR, BUILD, REVISION)); when(backend.runQuery(eq(VdcQueryType.GetProductVersion), getProductVersionParams())).thenReturn(productVersionQueryResult); } private VdcQueryParametersBase getProductVersionParams() { return eqParams(VdcQueryParametersBase.class, new String[0], new Object[0]); } protected void setUpGetSystemStatisticsExpectations() { VdcQueryReturnValue queryResult = mock(VdcQueryReturnValue.class); when(backend.runQuery(eq(VdcQueryType.GetSystemStatistics), queryParams())).thenReturn(queryResult); when(queryResult.getSucceeded()).thenReturn(true); when(queryResult.getReturnValue()).thenReturn(setUpStats()); } protected VdcQueryParametersBase getProductRPMVersionParams() { return eqParams(GetConfigurationValueParameters.class, new String[] { "SessionId", "ConfigValue" }, new Object[] { SESSION_ID, ConfigurationValues.ProductRPMVersion }); } protected VdcQueryParametersBase queryParams() { return eqParams(GetSystemStatisticsQueryParameters.class, new String[] { "SessionId" }, new Object[] { SESSION_ID }); } }