/** * 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.view; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Properties; import java.util.Set; import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.controller.internal.TemporalInfoImpl; import org.apache.ambari.server.controller.predicate.AlwaysPredicate; import org.apache.ambari.server.controller.spi.Predicate; import org.apache.ambari.server.controller.spi.Request; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.spi.TemporalInfo; import org.apache.ambari.server.controller.utilities.PredicateBuilder; import org.apache.ambari.server.controller.utilities.PropertyHelper; import org.apache.ambari.server.orm.entities.ViewEntity; import org.apache.ambari.server.view.configuration.ViewConfig; import org.apache.ambari.server.view.configuration.ViewConfigTest; import org.apache.ambari.view.NoSuchResourceException; import org.apache.ambari.view.ReadRequest; import org.apache.ambari.view.ResourceAlreadyExistsException; import org.apache.ambari.view.ResourceProvider; import org.apache.ambari.view.SystemException; import org.apache.ambari.view.UnsupportedPropertyException; import org.junit.Assert; import org.junit.Test; /** * ViewSubResourceProvider tests. */ public class ViewSubResourceProviderTest { private static String xml = "<view>\n" + " <name>MY_VIEW</name>\n" + " <label>My View!</label>\n" + " <version>1.0.0</version>\n" + " <resource>\n" + " <name>resource</name>\n" + " <plural-name>resources</plural-name>\n" + " <id-property>id</id-property>\n" + " <resource-class>org.apache.ambari.server.view.ViewSubResourceProviderTest$MyResource</resource-class>\n" + " <provider-class>org.apache.ambari.server.view.ViewSubResourceProviderTest$MyResourceProvider</provider-class>\n" + " <service-class>org.apache.ambari.server.view.ViewSubResourceProviderTest$MyResourceService</service-class>\n" + " </resource>\n" + " <instance>\n" + " <name>INSTANCE1</name>\n" + " </instance>\n" + "</view>"; @Test public void testGetResources() throws Exception { Properties properties = new Properties(); properties.put("p1", "v1"); Configuration ambariConfig = new Configuration(properties); ViewConfig config = ViewConfigTest.getConfig(xml); ViewEntity viewEntity = ViewRegistryTest.getViewEntity(config, ambariConfig, getClass().getClassLoader(), ""); ViewRegistryTest.getViewInstanceEntity(viewEntity, config.getInstances().get(0)); Map<Resource.Type, ViewSubResourceDefinition> resourceDefinitions = viewEntity.getResourceDefinitions(); Assert.assertEquals(1, resourceDefinitions.size()); Resource.Type type = resourceDefinitions.keySet().iterator().next(); ViewSubResourceProvider viewSubResourceProvider = new ViewSubResourceProvider(type, MyResource.class, "id", viewEntity); Request request = PropertyHelper.getReadRequest("id", "properties", "metrics/myMetric"); Predicate predicate = new AlwaysPredicate(); Set<Resource> resources = viewSubResourceProvider.getResources(request, predicate); Assert.assertEquals(2, resources.size()); predicate = new PredicateBuilder().property("metrics/myMetric").greaterThan(1).toPredicate(); resources = viewSubResourceProvider.getResources(request, predicate); Assert.assertEquals(1, resources.size()); Assert.assertTrue(((Integer) resources.iterator().next().getPropertyValue("metrics/myMetric")) > 1); } @Test public void testGetResources_temporal() throws Exception { Properties properties = new Properties(); properties.put("p1", "v1"); Configuration ambariConfig = new Configuration(properties); ViewConfig config = ViewConfigTest.getConfig(xml); ViewEntity viewEntity = ViewRegistryTest.getViewEntity(config, ambariConfig, getClass().getClassLoader(), ""); ViewRegistryTest.getViewInstanceEntity(viewEntity, config.getInstances().get(0)); Map<Resource.Type, ViewSubResourceDefinition> resourceDefinitions = viewEntity.getResourceDefinitions(); Assert.assertEquals(1, resourceDefinitions.size()); Resource.Type type = resourceDefinitions.keySet().iterator().next(); ViewSubResourceProvider viewSubResourceProvider = new ViewSubResourceProvider(type, MyResource.class, "id", viewEntity); Set<String> requestProperties = new HashSet<>(); requestProperties.add("metrics/myMetric"); Map<String, TemporalInfo> temporalInfoMap = new HashMap<>(); TemporalInfo temporalInfo = new TemporalInfoImpl(1000L, 1100L, 10L); temporalInfoMap.put("metrics/myMetric", temporalInfo); Request request = PropertyHelper.getReadRequest(requestProperties, temporalInfoMap); Predicate predicate = new AlwaysPredicate(); Set<Resource> resources = viewSubResourceProvider.getResources(request, predicate); Assert.assertEquals(2, resources.size()); } public static class MyResource { private String id; private String property; private Map<String, Object> metrics; public MyResource() { } public MyResource(String id, String property, Map<String, Object> metrics) { this.id = id; this.property = property; this.metrics = metrics; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } public Map<String, Object> getMetrics() { return metrics; } public void setMetrics(Map<String, Object> metrics) { this.metrics = metrics; } } public static class MyResourceProvider implements ResourceProvider<MyResource> { @Override public MyResource getResource(String resourceId, Set<String> properties) throws SystemException, NoSuchResourceException, UnsupportedPropertyException { return null; } @Override public Set<MyResource> getResources(ReadRequest request) throws SystemException, NoSuchResourceException, UnsupportedPropertyException { Set<MyResource> resources = new HashSet<>(); resources.add(new MyResource("1", "foo", getMetricsValue(1, request, "myMetric"))); resources.add(new MyResource("2", "bar", getMetricsValue(2, request, "myMetric"))); return resources; } private Map<String, Object> getMetricsValue(Number value, ReadRequest request, String metricName) { ReadRequest.TemporalInfo temporalInfo = request.getTemporalInfo("metrics/" + metricName); if (temporalInfo != null) { int steps = (int) ((temporalInfo.getEndTime() - temporalInfo.getStartTime()) / temporalInfo.getStep()); Number[][] datapointsArray = new Number[steps][2]; for (int i = 0; i < steps; ++i) { datapointsArray[i][0] = temporalInfo.getStartTime() + i * temporalInfo.getStep(); datapointsArray[i][1] = value; } return Collections.<String, Object>singletonMap(metricName, datapointsArray); } return Collections.<String, Object>singletonMap(metricName, value); } @Override public void createResource(String resourceId, Map<String, Object> properties) throws SystemException, ResourceAlreadyExistsException, NoSuchResourceException, UnsupportedPropertyException { } @Override public boolean updateResource(String resourceId, Map<String, Object> properties) throws SystemException, NoSuchResourceException, UnsupportedPropertyException { return false; } @Override public boolean deleteResource(String resourceId) throws SystemException, NoSuchResourceException, UnsupportedPropertyException { return false; } } public static class MyResourceService { // nothing } }