/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ambari.server.api.query; import static org.easymock.EasyMock.anyBoolean; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.capture; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import org.apache.ambari.server.api.query.render.DefaultRenderer; import org.apache.ambari.server.api.query.render.Renderer; import org.apache.ambari.server.api.resources.ClusterResourceDefinition; import org.apache.ambari.server.api.resources.HostResourceDefinition; import org.apache.ambari.server.api.resources.ResourceDefinition; import org.apache.ambari.server.api.resources.ResourceInstance; import org.apache.ambari.server.api.resources.StackResourceDefinition; import org.apache.ambari.server.api.resources.StackVersionResourceDefinition; import org.apache.ambari.server.api.resources.SubResourceDefinition; import org.apache.ambari.server.api.services.Result; import org.apache.ambari.server.api.util.TreeNode; import org.apache.ambari.server.api.util.TreeNodeImpl; import org.apache.ambari.server.controller.internal.ClusterControllerImpl; import org.apache.ambari.server.controller.internal.ClusterControllerImplTest; import org.apache.ambari.server.controller.internal.PageRequestImpl; import org.apache.ambari.server.controller.spi.ClusterController; import org.apache.ambari.server.controller.spi.NoSuchParentResourceException; import org.apache.ambari.server.controller.spi.NoSuchResourceException; import org.apache.ambari.server.controller.spi.PageRequest; import org.apache.ambari.server.controller.spi.PageResponse; import org.apache.ambari.server.controller.spi.Predicate; import org.apache.ambari.server.controller.spi.QueryResponse; import org.apache.ambari.server.controller.spi.Request; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.spi.Schema; import org.apache.ambari.server.controller.spi.SchemaFactory; import org.apache.ambari.server.controller.spi.SortRequest; import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.controller.spi.UnsupportedPropertyException; import org.apache.ambari.server.controller.utilities.PredicateBuilder; import org.apache.ambari.server.controller.utilities.PropertyHelper; import org.easymock.Capture; import org.easymock.EasyMock; import org.easymock.EasyMockSupport; import org.junit.Assert; import org.junit.Test; /** * QueryImpl unit tests. */ public class QueryImplTest { @Test public void testIsCollection__True() { ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class); Map<Resource.Type, String> mapIds = new HashMap<>(); mapIds.put(Resource.Type.Cluster, "cluster"); mapIds.put(Resource.Type.Service, null); // expectations expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes(); expect(resourceDefinition.getSubResourceDefinitions()).andReturn(Collections.<SubResourceDefinition>emptySet()).anyTimes(); replay(resourceDefinition); //test ResourceInstance instance = new TestQuery(mapIds, resourceDefinition); assertTrue(instance.isCollectionResource()); verify(resourceDefinition); } @Test public void testIsCollection__False() { ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class); Map<Resource.Type, String> mapIds = new HashMap<>(); mapIds.put(Resource.Type.Cluster, "cluster"); mapIds.put(Resource.Type.Service, "service"); // expectations expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes(); expect(resourceDefinition.getSubResourceDefinitions()).andReturn(Collections.<SubResourceDefinition>emptySet()).anyTimes(); replay(resourceDefinition); //test ResourceInstance instance = new TestQuery(mapIds, resourceDefinition); assertFalse(instance.isCollectionResource()); verify(resourceDefinition); } @Test public void testExecute__Cluster_instance_noSpecifiedProps() throws Exception { ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class); Map<Resource.Type, String> mapIds = new HashMap<>(); mapIds.put(Resource.Type.Cluster, "cluster"); // expectations expect(resourceDefinition.getType()).andReturn(Resource.Type.Cluster).anyTimes(); Set<SubResourceDefinition> setChildren = new HashSet<>(); setChildren.add(new SubResourceDefinition(Resource.Type.Host)); expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes(); replay(resourceDefinition); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); Result result = instance.execute(); verify(resourceDefinition); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(1, tree.getChildren().size()); TreeNode<Resource> clusterNode = tree.getChild("Cluster:1"); Assert.assertEquals("Cluster:1", clusterNode.getName()); Assert.assertEquals(Resource.Type.Cluster, clusterNode.getObject().getType()); Assert.assertEquals(1, clusterNode.getChildren().size()); TreeNode<Resource> hostNode = clusterNode.getChild("hosts"); Assert.assertEquals(4, hostNode.getChildren().size()); } @Test public void testExecute__Stack_instance_noSpecifiedProps() throws Exception { ResourceDefinition resourceDefinition = new StackResourceDefinition(); Map<Resource.Type, String> mapIds = new HashMap<>(); mapIds.put(Resource.Type.Stack, "HDP"); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); Result result = instance.execute(); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(1, tree.getChildren().size()); TreeNode<Resource> stackNode = tree.getChild("Stack:1"); Assert.assertEquals("Stack:1", stackNode.getName()); Assert.assertEquals(Resource.Type.Stack, stackNode.getObject().getType()); Assert.assertEquals(1, stackNode.getChildren().size()); TreeNode<Resource> versionsNode = stackNode.getChild("versions"); Assert.assertEquals(3, versionsNode.getChildren().size()); } @Test public void testGetJoinedResourceProperties() throws Exception { ResourceDefinition resourceDefinition = new StackResourceDefinition(); Map<Resource.Type, String> mapIds = new HashMap<>(); mapIds.put(Resource.Type.Stack, "HDP"); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); instance.addProperty("versions/*", null); instance.addProperty("versions/operating_systems/*", null); instance.addProperty("versions/operating_systems/repositories/*", null); instance.execute(); Set<String> propertyIds = new HashSet<>(); propertyIds.add("versions/operating_systems/repositories/Repositories/repo_id"); propertyIds.add("versions/operating_systems/OperatingSystems/os_type"); Map<Resource, Set<Map<String, Object>>> resourcePropertiesMap = instance.getJoinedResourceProperties(propertyIds, null, null); Set<Map<String, Object>> propertyMaps = null; for (Map.Entry<Resource, Set<Map<String, Object>>> resourceSetEntry : resourcePropertiesMap.entrySet()) { Assert.assertEquals(Resource.Type.Stack, resourceSetEntry.getKey().getType()); propertyMaps = resourceSetEntry.getValue(); } if (propertyMaps == null) { fail("No property maps found!"); } Assert.assertEquals(6, propertyMaps.size()); for (Map<String, Object> map : propertyMaps) { Assert.assertEquals(2, map.size()); Assert.assertTrue(map.containsKey("versions/operating_systems/OperatingSystems/os_type")); Assert.assertTrue(map.containsKey("versions/operating_systems/repositories/Repositories/repo_id")); } } @Test public void testExecute_subResourcePredicate() throws Exception { ResourceDefinition resourceDefinition = new StackResourceDefinition(); Map<Resource.Type, String> mapIds = new HashMap<>(); mapIds.put(Resource.Type.Stack, "HDP"); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); PredicateBuilder pb = new PredicateBuilder(); Predicate predicate = pb.property("versions/operating_systems/OperatingSystems/os_type").equals("centos5").toPredicate(); instance.setUserPredicate(predicate); Result result = instance.execute(); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(1, tree.getChildren().size()); TreeNode<Resource> stackNode = tree.getChild("Stack:1"); Assert.assertEquals("Stack:1", stackNode.getName()); Assert.assertEquals(Resource.Type.Stack, stackNode.getObject().getType()); Assert.assertEquals(1, stackNode.getChildren().size()); TreeNode<Resource> versionsNode = stackNode.getChild("versions"); Assert.assertEquals(3, versionsNode.getChildren().size()); TreeNode<Resource> versionNode = versionsNode.getChild("StackVersion:1"); Assert.assertEquals("StackVersion:1", versionNode.getName()); Assert.assertEquals(Resource.Type.StackVersion, versionNode.getObject().getType()); Assert.assertEquals(1, versionNode.getChildren().size()); TreeNode<Resource> opSystemsNode = versionNode.getChild("operating_systems"); Assert.assertEquals(1, opSystemsNode.getChildren().size()); TreeNode<Resource> opSystemNode = opSystemsNode.getChild("OperatingSystem:1"); Assert.assertEquals("OperatingSystem:1", opSystemNode.getName()); Resource osResource = opSystemNode.getObject(); Assert.assertEquals(Resource.Type.OperatingSystem, opSystemNode.getObject().getType()); Assert.assertEquals("centos5", osResource.getPropertyValue("OperatingSystems/os_type")); } @Test public void testExecute_NoSuchResourceException() throws Exception { ResourceDefinition resourceDefinition = new ClusterResourceDefinition(); Map<Resource.Type, String> mapIds = new HashMap<>(); mapIds.put(Resource.Type.Cluster, "c1"); ClusterController clusterController = createNiceMock(ClusterController.class); QueryResponse queryResponse = createNiceMock(QueryResponse.class); Schema schema = createNiceMock(Schema.class); Renderer renderer = createNiceMock(Renderer.class); expect(clusterController.getSchema(Resource.Type.Cluster)).andReturn(schema).anyTimes(); expect(clusterController.getResources(eq(Resource.Type.Cluster), anyObject(org.apache.ambari.server.controller.spi.Request.class), anyObject(Predicate.class))). andReturn(queryResponse); // Always return an empty set of resources. expect(queryResponse.getResources()).andReturn(Collections.<Resource>emptySet()).anyTimes(); expect(schema.getKeyPropertyId(Resource.Type.Cluster)).andReturn("Clusters/cluster_name").anyTimes(); TreeNode<Set<String>> treeNode = new TreeNodeImpl<>(null, Collections.<String>emptySet(), null); expect(renderer.finalizeProperties(EasyMock.<TreeNode<QueryInfo>>anyObject(), anyBoolean())).andReturn(treeNode).anyTimes(); replay(clusterController, queryResponse, schema, renderer); //test QueryImpl query = new TestQuery(mapIds, resourceDefinition, clusterController); query.setRenderer(renderer); try { query.execute(); fail("Expected NoSuchResourceException!"); } catch (NoSuchResourceException e) { //expected } verify(clusterController, queryResponse, schema, renderer); } @Test public void testExecute_SubResourcePropertyPredicate() throws Exception { ResourceDefinition resourceDefinition = new ClusterResourceDefinition(); Map<Resource.Type, String> mapIds = new HashMap<>(); mapIds.put(Resource.Type.Cluster, "c1"); mapIds.put(Resource.Type.Host, "h1"); ClusterController clusterController = createNiceMock(ClusterController.class); QueryResponse clusterResponse = createNiceMock(QueryResponse.class); QueryResponse hostResponse = createNiceMock(QueryResponse.class); Schema clusterSchema = createNiceMock("ClusterSchema", Schema.class); Schema hostSchema = createNiceMock("HostSchema", Schema.class); Renderer renderer = createNiceMock(Renderer.class); Resource clusterResource = createMock("ClusterResource", Resource.class); Resource hostResource = createMock("HostResource", Resource.class); Set<Resource> clusterResources = Collections.singleton(clusterResource); Set<Resource> hostResources = Collections.singleton(hostResource); Iterable<Resource> iterable = createNiceMock(Iterable.class); Iterator<Resource> iterator = createNiceMock(Iterator.class); expect(clusterController.getSchema(Resource.Type.Cluster)).andReturn(clusterSchema).anyTimes(); expect(clusterController.getSchema(Resource.Type.Host)).andReturn(hostSchema).anyTimes(); expect(clusterController.getResources(eq(Resource.Type.Cluster), anyObject(org.apache.ambari.server.controller.spi.Request.class), anyObject(Predicate.class))). andReturn(clusterResponse); // Expect this call with a predicate passed down expect(clusterController.getResources(eq(Resource.Type.Host), anyObject(org.apache.ambari.server.controller.spi.Request.class), anyObject(Predicate.class))). andReturn(hostResponse); expect(iterable.iterator()).andReturn(iterator).anyTimes(); expect(iterator.hasNext()).andReturn(false).anyTimes(); expect(clusterResponse.getResources()).andReturn(clusterResources).anyTimes(); expect(hostResponse.getResources()).andReturn(hostResources).anyTimes(); expect(clusterResource.getType()).andReturn(Resource.Type.Cluster).anyTimes(); expect(hostResource.getType()).andReturn(Resource.Type.Host).anyTimes(); expect(clusterSchema.getKeyPropertyId(Resource.Type.Cluster)).andReturn("Clusters/cluster_name").anyTimes(); expect(clusterSchema.getKeyTypes()).andReturn(Collections.singleton(Resource.Type.Cluster)).anyTimes(); expect(hostSchema.getKeyPropertyId(Resource.Type.Cluster)).andReturn(null).anyTimes(); expect(hostSchema.getKeyPropertyId(Resource.Type.Host)).andReturn("Hosts/host_name").anyTimes(); expect(hostSchema.getKeyTypes()).andReturn(Collections.singleton(Resource.Type.Host)).anyTimes(); expect(clusterResource.getPropertyValue("Clusters/cluster_name")).andReturn("c1").anyTimes(); TreeNode<Set<String>> treeNode = new TreeNodeImpl<>(null, Collections.<String>emptySet(), null); expect(renderer.finalizeProperties(EasyMock.<TreeNode<QueryInfo>>anyObject(), anyBoolean())).andReturn(treeNode).anyTimes(); expect(clusterController.getIterable(eq(Resource.Type.Cluster), anyObject(QueryResponse.class), anyObject(org.apache.ambari.server.controller.spi.Request.class), anyObject(Predicate.class), anyObject(PageRequest.class), anyObject(SortRequest.class))).andReturn(iterable).anyTimes(); replay(clusterController, clusterResponse, clusterSchema, renderer, hostSchema, clusterResource, hostResource, hostResponse, iterable, iterator); //test QueryImpl query = new TestQuery(mapIds, resourceDefinition, clusterController); query.setUserPredicate(new PredicateBuilder() .property("hosts/Hosts/host_name").equals("h1").and() .property("metrics/boottime").equals("value").toPredicate()); query.setRenderer(renderer); query.execute(); verify(clusterController, clusterResponse, clusterSchema, renderer, hostSchema, clusterResource, hostResource, hostResponse, iterable, iterator); } @Test public void testExecute_collection_NoSuchResourceException() throws Exception { ResourceDefinition resourceDefinition = new ClusterResourceDefinition(); ClusterController clusterController = createNiceMock(ClusterController.class); QueryResponse queryResponse = createNiceMock(QueryResponse.class); Schema schema = createNiceMock(Schema.class); Renderer renderer = createNiceMock(Renderer.class); Iterable<Resource> iterable = createNiceMock(Iterable.class); Iterator<Resource> iterator = createNiceMock(Iterator.class); expect(clusterController.getSchema(Resource.Type.Cluster)).andReturn(schema).anyTimes(); expect(clusterController.getResources(eq(Resource.Type.Cluster), anyObject(org.apache.ambari.server.controller.spi.Request.class), anyObject(Predicate.class))). andReturn(queryResponse); expect(clusterController.getIterable(eq(Resource.Type.Cluster), anyObject(QueryResponse.class), anyObject(org.apache.ambari.server.controller.spi.Request.class), anyObject(Predicate.class), anyObject(PageRequest.class), anyObject(SortRequest.class))).andReturn(iterable).anyTimes(); expect(iterable.iterator()).andReturn(iterator).anyTimes(); expect(iterator.hasNext()).andReturn(false).anyTimes(); // Always return an empty set of resources. expect(queryResponse.getResources()).andReturn(Collections.<Resource>emptySet()).anyTimes(); expect(schema.getKeyPropertyId(Resource.Type.Cluster)).andReturn("Clusters/cluster_name").anyTimes(); TreeNode<Set<String>> treeNode = new TreeNodeImpl<>(null, Collections.<String>emptySet(), null); expect(renderer.finalizeProperties(EasyMock.<TreeNode<QueryInfo>>anyObject(), anyBoolean())).andReturn(treeNode).anyTimes(); Capture<Result> resultCapture = EasyMock.newCapture(); expect(renderer.finalizeResult(capture(resultCapture))).andReturn(null); replay(clusterController, queryResponse, schema, renderer, iterable, iterator); //test QueryImpl query = new TestQuery(new HashMap<Resource.Type, String>(), resourceDefinition, clusterController); query.setRenderer(renderer); query.execute(); TreeNode<Resource> tree = resultCapture.getValue().getResultTree(); Assert.assertEquals(0, tree.getChildren().size()); verify(clusterController, queryResponse, schema, renderer, iterable, iterator); } @Test public void testExecute__Stack_instance_specifiedSubResources() throws Exception { ResourceDefinition resourceDefinition = new StackResourceDefinition(); Map<Resource.Type, String> mapIds = new HashMap<>(); mapIds.put(Resource.Type.Stack, "HDP"); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); instance.addProperty("versions/*", null); instance.addProperty("versions/operating_systems/*", null); instance.addProperty("versions/operating_systems/repositories/*", null); Result result = instance.execute(); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(1, tree.getChildren().size()); TreeNode<Resource> stackNode = tree.getChild("Stack:1"); Assert.assertEquals("Stack:1", stackNode.getName()); Assert.assertEquals(Resource.Type.Stack, stackNode.getObject().getType()); Assert.assertEquals(1, stackNode.getChildren().size()); TreeNode<Resource> versionsNode = stackNode.getChild("versions"); Assert.assertEquals(3, versionsNode.getChildren().size()); TreeNode<Resource> versionNode = versionsNode.getChild("StackVersion:1"); Assert.assertEquals("StackVersion:1", versionNode.getName()); Assert.assertEquals(Resource.Type.StackVersion, versionNode.getObject().getType()); Assert.assertEquals(6, versionNode.getChildren().size()); TreeNode<Resource> opSystemsNode = versionNode.getChild("operating_systems"); Assert.assertEquals(3, opSystemsNode.getChildren().size()); TreeNode<Resource> opSystemNode = opSystemsNode.getChild("OperatingSystem:1"); Assert.assertEquals("OperatingSystem:1", opSystemNode.getName()); Assert.assertEquals(Resource.Type.OperatingSystem, opSystemNode.getObject().getType()); Assert.assertEquals(1, opSystemNode.getChildren().size()); TreeNode<Resource> repositoriesNode = opSystemNode.getChild("repositories"); Assert.assertEquals(2, repositoriesNode.getChildren().size()); TreeNode<Resource> repositoryNode = repositoriesNode.getChild("Repository:1"); Assert.assertEquals("Repository:1", repositoryNode.getName()); Resource repositoryResource = repositoryNode.getObject(); Assert.assertEquals(Resource.Type.Repository, repositoryResource.getType()); Assert.assertEquals("repo1", repositoryResource.getPropertyValue("Repositories/repo_id")); Assert.assertEquals("centos5", repositoryResource.getPropertyValue("Repositories/os_type")); Assert.assertEquals("1.2.1", repositoryResource.getPropertyValue("Repositories/stack_version")); Assert.assertEquals("HDP", repositoryResource.getPropertyValue("Repositories/stack_name")); TreeNode<Resource> artifactsNode = versionNode.getChild("artifacts"); Assert.assertEquals(1, artifactsNode.getChildren().size()); TreeNode<Resource> artifactNode = artifactsNode.getChild("StackArtifact:1"); Assert.assertEquals("StackArtifact:1", artifactNode.getName()); Assert.assertEquals(Resource.Type.StackArtifact, artifactNode.getObject().getType()); } @Test public void testExecute_StackVersionPageResourcePredicate() throws NoSuchParentResourceException, UnsupportedPropertyException, NoSuchResourceException, SystemException { ResourceDefinition resourceDefinition = new StackVersionResourceDefinition(); Map<Resource.Type, String> mapIds = new HashMap<>(); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); PredicateBuilder pb = new PredicateBuilder(); Predicate predicate = pb.property("Versions/stack_version").equals("1.2.1").or() .property("Versions/stack_version").equals("1.2.2").toPredicate(); instance.setUserPredicate(predicate); //First page instance.setPageRequest(new PageRequestImpl(PageRequest.StartingPoint.Beginning, 1, 0, null, null)); Result result = instance.execute(); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(1, tree.getChildren().size()); TreeNode<Resource> stackVersionNode = tree.getChild("StackVersion:1"); Assert.assertEquals("StackVersion:1", stackVersionNode.getName()); Assert.assertEquals(Resource.Type.StackVersion, stackVersionNode.getObject().getType()); Assert.assertEquals("1.2.1", stackVersionNode.getObject().getPropertyValue("Versions/stack_version")); //Second page instance.setPageRequest(new PageRequestImpl(PageRequest.StartingPoint.OffsetStart, 1, 1, null, null)); result = instance.execute(); tree = result.getResultTree(); Assert.assertEquals(1, tree.getChildren().size()); stackVersionNode = tree.getChild("StackVersion:1"); Assert.assertEquals("StackVersion:1", stackVersionNode.getName()); Assert.assertEquals(Resource.Type.StackVersion, stackVersionNode.getObject().getType()); Assert.assertEquals("1.2.2", stackVersionNode.getObject().getPropertyValue("Versions/stack_version")); } @Test public void testExecute_StackVersionPageSubResourcePredicate() throws NoSuchParentResourceException, UnsupportedPropertyException, NoSuchResourceException, SystemException { ResourceDefinition resourceDefinition = new StackVersionResourceDefinition(); Map<Resource.Type, String> mapIds = new HashMap<>(); QueryImpl instance = new TestQuery(mapIds, resourceDefinition); instance.addProperty("operating_systems/*", null); PredicateBuilder pb = new PredicateBuilder(); Predicate predicate = pb.property("operating_systems/OperatingSystems/os_type").equals("centos5").toPredicate(); instance.setUserPredicate(predicate); instance.setPageRequest(new PageRequestImpl(PageRequest.StartingPoint.Beginning, 1, 0, null, null)); Result result = instance.execute(); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(1, tree.getChildren().size()); TreeNode<Resource> stackVersionNode = tree.getChild("StackVersion:1"); Assert.assertEquals("StackVersion:1", stackVersionNode.getName()); Assert.assertEquals(Resource.Type.StackVersion, stackVersionNode.getObject().getType()); Assert.assertEquals("1.2.1", stackVersionNode.getObject().getPropertyValue("Versions/stack_version")); QueryImpl instance2 = new TestQuery(mapIds, resourceDefinition); instance2.addProperty("operating_systems/*", null); instance2.setUserPredicate(predicate); instance2.setPageRequest(new PageRequestImpl(PageRequest.StartingPoint.OffsetStart, 1, 1, null, null)); Result result2 = instance2.execute(); TreeNode<Resource> tree2 = result2.getResultTree(); Assert.assertEquals(1, tree2.getChildren().size()); TreeNode<Resource> stackVersionNode2 = tree2.getChild("StackVersion:1"); Assert.assertEquals("StackVersion:1", stackVersionNode2.getName()); Assert.assertEquals(Resource.Type.StackVersion, stackVersionNode2.getObject().getType()); Assert.assertEquals("1.2.2", stackVersionNode2.getObject().getPropertyValue("Versions/stack_version")); QueryImpl instance3 = new TestQuery(mapIds, resourceDefinition); instance3.addProperty("operating_systems/*", null); instance3.setUserPredicate(predicate); //page_size = 2, offset = 1 instance3.setPageRequest(new PageRequestImpl(PageRequest.StartingPoint.OffsetStart, 2, 1, null, null)); Result result3 = instance3.execute(); TreeNode<Resource> tree3 = result3.getResultTree(); Assert.assertEquals(2, tree3.getChildren().size()); TreeNode<Resource> stackVersionNode3 = tree3.getChild("StackVersion:1"); Assert.assertEquals("StackVersion:1", stackVersionNode3.getName()); Assert.assertEquals(Resource.Type.StackVersion, stackVersionNode3.getObject().getType()); Assert.assertEquals("1.2.2", stackVersionNode3.getObject().getPropertyValue("Versions/stack_version")); stackVersionNode3 = tree3.getChild("StackVersion:2"); Assert.assertEquals("StackVersion:2", stackVersionNode3.getName()); Assert.assertEquals(Resource.Type.StackVersion, stackVersionNode3.getObject().getType()); Assert.assertEquals("2.0.1", stackVersionNode3.getObject().getPropertyValue("Versions/stack_version")); } @Test public void testExecute__Host_collection_noSpecifiedProps() throws Exception { ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class); Map<Resource.Type, String> mapIds = new HashMap<>(); // expectations expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes(); Set<SubResourceDefinition> setChildren = new HashSet<>(); expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes(); replay(resourceDefinition); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); Result result = instance.execute(); verify(resourceDefinition); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(4, tree.getChildren().size()); TreeNode<Resource> hostNode = tree.getChild("Host:1"); Assert.assertEquals("Host:1", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); hostNode = tree.getChild("Host:2"); Assert.assertEquals("Host:2", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); hostNode = tree.getChild("Host:3"); Assert.assertEquals("Host:3", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); hostNode = tree.getChild("Host:4"); Assert.assertEquals("Host:4", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); } @Test public void testExecute__Host_collection_AlertsSummary() throws Exception { ResourceDefinition resourceDefinition = new HostResourceDefinition(); Map<Resource.Type, String> mapIds = new HashMap<>(); final AtomicInteger pageCallCount = new AtomicInteger(0); ClusterControllerImpl clusterControllerImpl = new ClusterControllerImpl(new ClusterControllerImplTest.TestProviderModule()) { @Override public PageResponse getPage(Resource.Type type, QueryResponse queryResponse, Request request, Predicate predicate, PageRequest pageRequest, SortRequest sortRequest) throws UnsupportedPropertyException, SystemException, NoSuchResourceException, NoSuchParentResourceException { pageCallCount.incrementAndGet(); return super.getPage(type, queryResponse, request, predicate, pageRequest, sortRequest); } }; QueryImpl instance = new TestQuery(mapIds, resourceDefinition, clusterControllerImpl); //test 1: No predicate or paging request pageCallCount.set(0); Result result = instance.execute(); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(4, tree.getChildren().size()); Assert.assertEquals(1, pageCallCount.get()); //test 2: Predicate = (alerts_summary/CRITICAL > 0) pageCallCount.set(0); PredicateBuilder pb = new PredicateBuilder(); Predicate predicate = pb.property("alerts_summary/CRITICAL").greaterThan(0).toPredicate(); instance.setUserPredicate(predicate); result = instance.execute(); tree = result.getResultTree(); Assert.assertEquals(2, tree.getChildren().size()); Assert.assertEquals(2, pageCallCount.get()); TreeNode<Resource> hostNode = tree.getChild("Host:1"); Assert.assertEquals("Host:1", hostNode.getName()); Assert.assertEquals("host:0", hostNode.getObject().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name"))); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertEquals("1", hostNode.getObject().getPropertyValue(PropertyHelper.getPropertyId("alerts_summary", "CRITICAL"))); hostNode = tree.getChild("Host:2"); Assert.assertEquals("Host:2", hostNode.getName()); Assert.assertEquals("host:2", hostNode.getObject().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name"))); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertEquals("1", hostNode.getObject().getPropertyValue(PropertyHelper.getPropertyId("alerts_summary", "CRITICAL"))); // test 3: Predicate = (alerts_summary/WARNING > 0) AND Page = (size=1) pageCallCount.set(0); pb = new PredicateBuilder(); predicate = pb.property("alerts_summary/WARNING").greaterThan(0).toPredicate(); instance.setUserPredicate(predicate); instance.setPageRequest(new PageRequestImpl(PageRequest.StartingPoint.Beginning, 1, 0, null, null)); result = instance.execute(); tree = result.getResultTree(); Assert.assertEquals(1, tree.getChildren().size()); Assert.assertEquals(2, pageCallCount.get()); hostNode = tree.getChild("Host:1"); Assert.assertEquals("Host:1", hostNode.getName()); Assert.assertEquals("host:1", hostNode.getObject().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name"))); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertEquals("1", hostNode.getObject().getPropertyValue(PropertyHelper.getPropertyId("alerts_summary", "WARNING"))); // test 4: SubResource Predicate = (alerts_summary/WARNING > 0 | host_components/HostRoles/component_name = DATANODE) pageCallCount.set(0); pb = new PredicateBuilder(); predicate = pb.property("alerts_summary/WARNING").greaterThan(0).or().property("host_components/HostRoles/component_name").equals("DATANODE").toPredicate(); instance.setUserPredicate(predicate); instance.setPageRequest(null); result = instance.execute(); tree = result.getResultTree(); Assert.assertEquals(0, tree.getChildren().size()); Assert.assertEquals(6, pageCallCount.get()); } @Test public void testExecute__collection_nullInternalPredicate_nullUserPredicate() throws Exception { ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class); Map<Resource.Type, String> mapIds = new HashMap<>(); // expectations expect(resourceDefinition.getType()).andReturn(Resource.Type.Cluster).anyTimes(); Set<SubResourceDefinition> setChildren = new HashSet<>(); setChildren.add(new SubResourceDefinition(Resource.Type.Host)); expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes(); replay(resourceDefinition); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); Result result = instance.execute(); verify(resourceDefinition); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(1, tree.getChildren().size()); TreeNode<Resource> clusterNode = tree.getChild("Cluster:1"); Assert.assertEquals("Cluster:1", clusterNode.getName()); Assert.assertEquals(Resource.Type.Cluster, clusterNode.getObject().getType()); Assert.assertEquals(0, clusterNode.getChildren().size()); } @Test public void testExecute__collection_nullInternalPredicate_nonNullUserPredicate() throws Exception { ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class); Map<Resource.Type, String> mapIds = new HashMap<>(); mapIds.put(Resource.Type.Cluster, "cluster"); // expectations expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes(); Set<SubResourceDefinition> setChildren = new HashSet<>(); expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes(); replay(resourceDefinition); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); PredicateBuilder pb = new PredicateBuilder(); Predicate predicate = pb.property("Hosts/host_name").equals("host:2").toPredicate(); instance.setUserPredicate(predicate); Result result = instance.execute(); verify(resourceDefinition); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(1, tree.getChildren().size()); TreeNode<Resource> hostNode = tree.getChild("Host:1"); Assert.assertEquals("Host:1", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertEquals("host:2", hostNode.getObject().getPropertyValue("Hosts/host_name")); } @Test public void testExecute__collection_nonNullInternalPredicate_nonNullUserPredicate() throws Exception { ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class); Map<Resource.Type, String> mapIds = new HashMap<>(); // expectations expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes(); Set<SubResourceDefinition> setChildren = new HashSet<>(); expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes(); replay(resourceDefinition); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); PredicateBuilder pb = new PredicateBuilder(); Predicate predicate = pb.property("Hosts/host_name").equals("host:2").toPredicate(); instance.setUserPredicate(predicate); Result result = instance.execute(); verify(resourceDefinition); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(1, tree.getChildren().size()); TreeNode<Resource> hostNode = tree.getChild("Host:1"); Assert.assertEquals("Host:1", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertEquals("host:2", hostNode.getObject().getPropertyValue("Hosts/host_name")); } @Test public void testAddProperty__localProperty() throws Exception { ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class); Map<Resource.Type, String> mapIds = new HashMap<>(); // expectations expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes(); Set<SubResourceDefinition> setChildren = new HashSet<>(); expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes(); replay(resourceDefinition); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); instance.addLocalProperty("c1/p1"); Result result = instance.execute(); verify(resourceDefinition); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(4, tree.getChildren().size()); TreeNode<Resource> hostNode = tree.getChild("Host:1"); Assert.assertEquals("Host:1", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1")); hostNode = tree.getChild("Host:2"); Assert.assertEquals("Host:2", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1")); hostNode = tree.getChild("Host:3"); Assert.assertEquals("Host:3", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1")); hostNode = tree.getChild("Host:4"); Assert.assertEquals("Host:4", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1")); } @Test public void testAddProperty__allCategoryProperties() throws Exception { ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class); Map<Resource.Type, String> mapIds = new HashMap<>(); // expectations expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes(); Set<SubResourceDefinition> setChildren = new HashSet<>(); expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes(); replay(resourceDefinition); //test QueryImpl instance = new TestQuery(mapIds, resourceDefinition); instance.addLocalProperty("c1"); Result result = instance.execute(); verify(resourceDefinition); TreeNode<Resource> tree = result.getResultTree(); Assert.assertEquals(4, tree.getChildren().size()); TreeNode<Resource> hostNode = tree.getChild("Host:1"); Assert.assertEquals("Host:1", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1")); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p2")); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p3")); hostNode = tree.getChild("Host:2"); Assert.assertEquals("Host:2", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1")); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p2")); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p3")); hostNode = tree.getChild("Host:3"); Assert.assertEquals("Host:3", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1")); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p2")); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p3")); hostNode = tree.getChild("Host:4"); Assert.assertEquals("Host:4", hostNode.getName()); Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType()); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1")); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p2")); Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p3")); } @Test public void testExecute_RendererDoesNotRequirePropertyProviderInput() throws Exception { EasyMockSupport mockSupport = new EasyMockSupport(); ResourceDefinition mockResourceDefinition = mockSupport.createMock(ResourceDefinition.class); SubResourceDefinition mockSubResourceDefinition = mockSupport.createMock(SubResourceDefinition.class); // need to use a default mock here, to verify // that certain methods are called or not called ClusterController mockClusterController = mockSupport.createMock(ClusterController.class); Renderer mockRenderer = mockSupport.createMock(Renderer.class); QueryResponse mockQueryResponse = mockSupport.createMock(QueryResponse.class); QueryResponse mockSubQueryResponse = mockSupport.createMock(QueryResponse.class); Resource mockResource = mockSupport.createMock(Resource.class); Schema mockSchema = mockSupport.createMock(Schema.class); expect(mockResourceDefinition.getType()).andReturn(Resource.Type.Host).atLeastOnce(); expect(mockResourceDefinition.getSubResourceDefinitions()).andReturn(Collections.singleton(mockSubResourceDefinition)).atLeastOnce(); expect(mockSubResourceDefinition.getType()).andReturn(Resource.Type.Configuration).atLeastOnce(); expect(mockSubResourceDefinition.isCollection()).andReturn(false).atLeastOnce(); expect(mockSchema.getKeyPropertyId(isA(Resource.Type.class))).andReturn("test-value").anyTimes(); expect(mockSchema.getKeyTypes()).andReturn(Collections.<Resource.Type>emptySet()).anyTimes(); mockRenderer.init(isA(SchemaFactory.class)); // the mock renderer should return false for requiresPropertyProviderInput, to // simulate the case of a renderer that does not need the property providers to execute // this method should be called twice: once each resource (1 resource, 1 sub-resource in this test) expect(mockRenderer.requiresPropertyProviderInput()).andReturn(false).times(2); expect(mockRenderer.finalizeProperties(isA(TreeNode.class), eq(true))).andReturn(new TreeNodeImpl<>(null, Collections.<String>emptySet(), "test-node")); expect(mockRenderer.finalizeResult(isA(Result.class))).andReturn(null); // note: the expectations for the ClusterController mock are significant to this test. // the ClusterController.populateResources() method should not be called, and so // is not expected here. expect(mockClusterController.getSchema(Resource.Type.Host)).andReturn(mockSchema).anyTimes(); expect(mockClusterController.getSchema(Resource.Type.Configuration)).andReturn(mockSchema).anyTimes(); expect(mockClusterController.getResources(eq(Resource.Type.Host), isA(Request.class), (Predicate)eq(null))).andReturn(mockQueryResponse).atLeastOnce(); expect(mockClusterController.getResources(eq(Resource.Type.Configuration), isA(Request.class), (Predicate)eq(null))).andReturn(mockSubQueryResponse).atLeastOnce(); expect(mockClusterController.getIterable(eq(Resource.Type.Host), isA(QueryResponse.class), isA(Request.class),(Predicate)eq(null), (PageRequest)eq(null), (SortRequest)eq(null))).andReturn(Collections.singleton(mockResource)).atLeastOnce(); expect(mockClusterController.getIterable(eq(Resource.Type.Configuration), isA(QueryResponse.class), isA(Request.class),(Predicate)eq(null), (PageRequest)eq(null), (SortRequest)eq(null))).andReturn(Collections.singleton(mockResource)).atLeastOnce(); expect(mockQueryResponse.getResources()).andReturn(Collections.singleton(mockResource)).atLeastOnce(); expect(mockSubQueryResponse.getResources()).andReturn(Collections.singleton(mockResource)).atLeastOnce(); expect(mockResource.getType()).andReturn(Resource.Type.Host).atLeastOnce(); Map<Resource.Type, String> mapIds = new HashMap<>(); mockSupport.replayAll(); QueryImpl instance = new QueryImpl(mapIds, mockResourceDefinition, mockClusterController); instance.setRenderer(mockRenderer); // call these methods to setup sub resources instance.ensureSubResources(); instance.addProperty("*", null); instance.execute(); mockSupport.verifyAll(); } @Test public void testExecute_RendererRequiresPropertyProviderInput() throws Exception { EasyMockSupport mockSupport = new EasyMockSupport(); ResourceDefinition mockResourceDefinition = mockSupport.createMock(ResourceDefinition.class); SubResourceDefinition mockSubResourceDefinition = mockSupport.createMock(SubResourceDefinition.class); // need to use a default mock here, to verify // that certain methods are called or not called ClusterController mockClusterController = mockSupport.createMock(ClusterController.class); Renderer mockRenderer = mockSupport.createMock(Renderer.class); QueryResponse mockQueryResponse = mockSupport.createMock(QueryResponse.class); QueryResponse mockSubQueryResponse = mockSupport.createMock(QueryResponse.class); Resource mockResource = mockSupport.createMock(Resource.class); Schema mockSchema = mockSupport.createMock(Schema.class); expect(mockResourceDefinition.getType()).andReturn(Resource.Type.Host).atLeastOnce(); expect(mockResourceDefinition.getSubResourceDefinitions()).andReturn(Collections.singleton(mockSubResourceDefinition)).atLeastOnce(); expect(mockSubResourceDefinition.getType()).andReturn(Resource.Type.Configuration).atLeastOnce(); expect(mockSubResourceDefinition.isCollection()).andReturn(false).atLeastOnce(); expect(mockSchema.getKeyPropertyId(isA(Resource.Type.class))).andReturn("test-value").anyTimes(); expect(mockSchema.getKeyTypes()).andReturn(Collections.<Resource.Type>emptySet()).anyTimes(); mockRenderer.init(isA(SchemaFactory.class)); // simulate the case of a renderer that requires the property providers to execute // this method should be called twice: once for each resource (1 resource, 1 sub-resource in this test) expect(mockRenderer.requiresPropertyProviderInput()).andReturn(true).times(2); expect(mockRenderer.finalizeProperties(isA(TreeNode.class), eq(true))).andReturn(new TreeNodeImpl<>(null, Collections.<String>emptySet(), "test-node")); expect(mockRenderer.finalizeResult(isA(Result.class))).andReturn(null); // note: the expectations for the ClusterController mock are significant to this test. expect(mockClusterController.getSchema(Resource.Type.Host)).andReturn(mockSchema).anyTimes(); expect(mockClusterController.getSchema(Resource.Type.Configuration)).andReturn(mockSchema).anyTimes(); expect(mockClusterController.getResources(eq(Resource.Type.Host), isA(Request.class), (Predicate)eq(null))).andReturn(mockQueryResponse).atLeastOnce(); expect(mockClusterController.getResources(eq(Resource.Type.Configuration), isA(Request.class), (Predicate)eq(null))).andReturn(mockSubQueryResponse).atLeastOnce(); expect(mockClusterController.getIterable(eq(Resource.Type.Host), isA(QueryResponse.class), isA(Request.class),(Predicate)eq(null), (PageRequest)eq(null), (SortRequest)eq(null))).andReturn(Collections.singleton(mockResource)).atLeastOnce(); expect(mockClusterController.getIterable(eq(Resource.Type.Configuration), isA(QueryResponse.class), isA(Request.class),(Predicate)eq(null), (PageRequest)eq(null), (SortRequest)eq(null))).andReturn(Collections.singleton(mockResource)).atLeastOnce(); // expect call to activate property providers for Host resource expect(mockClusterController.populateResources(eq(Resource.Type.Host), eq(Collections.singleton(mockResource)), isA(Request.class), (Predicate)eq(null))).andReturn(Collections.<Resource>emptySet()).times(1); // expect call to activate property providers for Configuration sub-resource expect(mockClusterController.populateResources(eq(Resource.Type.Configuration), eq(Collections.singleton(mockResource)), isA(Request.class), (Predicate)eq(null))).andReturn(Collections.<Resource>emptySet()).times(1); expect(mockQueryResponse.getResources()).andReturn(Collections.singleton(mockResource)).atLeastOnce(); expect(mockSubQueryResponse.getResources()).andReturn(Collections.singleton(mockResource)).atLeastOnce(); expect(mockResource.getType()).andReturn(Resource.Type.Host).atLeastOnce(); Map<Resource.Type, String> mapIds = new HashMap<>(); mockSupport.replayAll(); QueryImpl instance = new QueryImpl(mapIds, mockResourceDefinition, mockClusterController); instance.setRenderer(mockRenderer); // call these methods to setup sub resources instance.ensureSubResources(); instance.addProperty("*", null); instance.execute(); mockSupport.verifyAll(); } public static class TestQuery extends QueryImpl { public TestQuery(Map<Resource.Type, String> mapIds, ResourceDefinition resourceDefinition) { super(mapIds, resourceDefinition, new ClusterControllerImpl(new ClusterControllerImplTest.TestProviderModule())); setRenderer(new DefaultRenderer()); } public TestQuery(Map<Resource.Type, String> mapIds, ResourceDefinition resourceDefinition, ClusterController clusterController) { super(mapIds, resourceDefinition, clusterController); setRenderer(new DefaultRenderer()); } } }