Modified: incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/update-services.md URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/update-services.md?rev=1487638&r1=1487637&r2=1487638&view=diff ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/update-services.md (original) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/update-services.md Wed May 29 20:46:31 2013 @@ -1,3 +1,4 @@ + <!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with
Added: incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflow-resources.md URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflow-resources.md?rev=1487638&view=auto ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflow-resources.md (added) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflow-resources.md Wed May 29 20:46:31 2013 @@ -0,0 +1,22 @@ +<!--- +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. +--> + +# Workflow Resources + + +- [List workflows](workflows.md) +- [View workflow information](workflows-workflow.md) Added: incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflows-workflow.md URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflows-workflow.md?rev=1487638&view=auto ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflows-workflow.md (added) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflows-workflow.md Wed May 29 20:46:31 2013 @@ -0,0 +1,57 @@ +<!--- +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. +--> + +View Workflow Information +===== + +[Back to Resources](index.md#resources) + +Returns information about a single workflow in a given cluster. + + GET /clusters/:name/workflows/:workflowid + +**Response** + + 200 OK + { + "href" : "http://your.ambari.server/api/v1/clusters/c1/workflows/mr_201305061943_0001", + "Workflow" : { + "cluster_name" : "c1", + "workflow_id" : "mr_201305061943_0001" + "last_update_time" : 1367883887044, + "input_bytes" : 2009, + "output_bytes" : 1968, + "user_name" : "ambari-qa", + "elapsed_time" : 25734, + "num_jobs_total" : 1, + "num_jobs_completed" : 1, + "name" : "word count", + "context" : "{\"workflowId\":null,\"workflowName\":null,\"workflowDag\":{\"entries\":[{\"source\":\"X\",\"targets\":[]}]},\"parentWorkflowContext\":null,\"workflowEntityName\":null}", + "start_time" : 1367883861310, + "parent_id" : null + }, + "jobs" : [ + { + "href" : "http://your.ambari.server/api/v1/clusters/c1/workflows/mr_201305061943_0001/jobs/job_201305061943_0001", + "Job" : { + "cluster_name" : "c1", + "workflow_id" : "mr_201305061943_0001", + "job_id" : "job_201305061943_0001" + } + } + ] + } Added: incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflows.md URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflows.md?rev=1487638&view=auto ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflows.md (added) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/docs/api/v1/workflows.md Wed May 29 20:46:31 2013 @@ -0,0 +1,48 @@ +<!--- +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. +--> + +List Workflows +===== + +[Back to Resources](index.md#resources) + +Returns a collection of all workflows in a given cluster. + + GET /clusters/:name/workflows + +**Response** + + 200 OK + { + "href" : "http://your.ambari.server/api/v1/clusters/c1/workflows", + "items" : [ + { + "href" : "http://your.ambari.server/api/v1/clusters/c1/workflows/mr_201305061943_0001", + "Workflow" : { + "cluster_name" : "c1", + "workflow_id" : "mr_201305061943_0001" + } + }, + { + "href" : "http://your.ambari.server/api/v1/clusters/c1/workflows/mr_201305061943_0002", + "Workflow" : { + "cluster_name" : "c1", + "workflow_id" : "mr_201305061943_0002" + } + } + ] + } Modified: incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/Role.java URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/Role.java?rev=1487638&r1=1487637&r2=1487638&view=diff ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/Role.java (original) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/Role.java Wed May 29 20:46:31 2013 @@ -40,6 +40,7 @@ public enum Role { HADOOP_CLIENT, JOBTRACKER_SERVICE_CHECK, MAPREDUCE_SERVICE_CHECK, + MAPREDUCE2_SERVICE_CHECK, ZOOKEEPER_SERVICE_CHECK, ZOOKEEPER_QUORUM_SERVICE_CHECK, HBASE_SERVICE_CHECK, Modified: incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java?rev=1487638&r1=1487637&r2=1487638&view=diff ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java (original) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java Wed May 29 20:46:31 2013 @@ -119,11 +119,11 @@ public class HeartbeatMonitor implements } catch (AmbariException e) { LOG.warn("Exception in getting host object; Is it fatal?", e); } - if (lastHeartbeat + 2*threadWakeupInterval < now) { - LOG.warn("Hearbeat lost from host "+host); + if (lastHeartbeat + 2 * threadWakeupInterval < now) { + LOG.warn("Heartbeat lost from host " + host); //Heartbeat is expired hostObj.handleEvent(new HostHeartbeatLostEvent(host)); - + // mark all components that are not clients with unknown status for (Cluster cluster : fsm.getClustersForHost(hostObj.getHostName())) { for (ServiceComponentHost sch : cluster.getServiceComponentHosts(hostObj.getHostName())) { @@ -134,14 +134,17 @@ public class HeartbeatMonitor implements !sch.getState().equals(State.INSTALLING) && !sch.getState().equals(State.INSTALL_FAILED) && !sch.getState().equals(State.UNINSTALLED)) { + LOG.warn("Setting component state to UNKNOWN for component " + sc.getName() + " on " + host); sch.setState(State.UNKNOWN); } } } - + // hbase - if(hostState != hostObj.getState() && scanner != null) scanner.updateHBaseMaster(hostObj); - + if (hostState != hostObj.getState() && scanner != null) { + scanner.updateHBaseMaster(hostObj); + } + //Purge action queue actionQueue.dequeueAll(host); //notify action manager @@ -149,7 +152,7 @@ public class HeartbeatMonitor implements } if (hostState == HostState.WAITING_FOR_HOST_STATUS_UPDATES) { long timeSpentInState = hostObj.getTimeInState(); - if (timeSpentInState + 5*threadWakeupInterval < now) { + if (timeSpentInState + 5 * threadWakeupInterval < now) { //Go back to init, the agent will be asked to register again in the next heartbeat LOG.warn("timeSpentInState + 5*threadWakeupInterval < now, Go back to init"); hostObj.setState(HostState.INIT); @@ -159,7 +162,7 @@ public class HeartbeatMonitor implements // Get status of service components List<StatusCommand> cmds = generateStatusCommands(hostname); LOG.trace("Generated " + cmds.size() + " status commands for host: " + - hostname); + hostname); if (cmds.isEmpty()) { // Nothing to do } else { Modified: incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java?rev=1487638&r1=1487637&r2=1487638&view=diff ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java (original) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java Wed May 29 20:46:31 2013 @@ -25,12 +25,14 @@ import org.apache.ambari.server.controll import org.apache.ambari.server.controller.ganglia.GangliaReportPropertyProvider; import org.apache.ambari.server.controller.ganglia.GangliaHostProvider; import org.apache.ambari.server.controller.jmx.JMXHostProvider; +import org.apache.ambari.server.controller.jmx.JMXVersioningPropertyProvider; import org.apache.ambari.server.controller.jmx.JMXPropertyProvider; import org.apache.ambari.server.controller.spi.*; import org.apache.ambari.server.controller.utilities.PredicateBuilder; import org.apache.ambari.server.controller.utilities.PropertyHelper; import org.apache.ambari.server.controller.AmbariManagementController; import com.google.inject.Inject; +import org.apache.ambari.server.controller.utilities.StreamProvider; import org.apache.ambari.server.state.Service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,6 +48,7 @@ public abstract class AbstractProviderMo private static final int PROPERTY_REQUEST_READ_TIMEOUT = 10000; private static final String CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("Clusters", "cluster_name"); + private static final String CLUSTER_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("Clusters", "version"); private static final String HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("HostRoles", "cluster_name"); private static final String HOST_COMPONENT_HOST_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("HostRoles", "host_name"); private static final String HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("HostRoles", "component_name"); @@ -97,6 +100,12 @@ public abstract class AbstractProviderMo private AmbariManagementController managementController; /** + * Cluster versions. + */ + private final Map<String, PropertyHelper.JMXMetricsVersion> clusterVersionsMap = + new HashMap<String, PropertyHelper.JMXMetricsVersion>(); + + /** * The map of host components. */ private Map<String, Map<String, String>> clusterHostComponentMap; @@ -156,8 +165,11 @@ public abstract class AbstractProviderMo public void update(ResourceProviderEvent event) { Resource.Type type = event.getResourceType(); - if (type == Resource.Type.Cluster || - type == Resource.Type.Host || + if (type == Resource.Type.Cluster) { + resetInit(); + updateClusterVersion(); + } + if (type == Resource.Type.Host || type == Resource.Type.HostComponent) { resetInit(); } @@ -235,7 +247,7 @@ public abstract class AbstractProviderMo } protected void putResourceProvider(Resource.Type type, ResourceProvider resourceProvider) { - resourceProviders.put( type , resourceProvider); + resourceProviders.put(type, resourceProvider); } protected void putPropertyProviders(Resource.Type type, List<PropertyProvider> providers) { @@ -267,8 +279,8 @@ public abstract class AbstractProviderMo )); break; case Component : - providers.add(new JMXPropertyProvider( - PropertyHelper.getJMXPropertyIds(type), + providers.add(createJMXPropertyProvider( + type, streamProvider, this, PropertyHelper.getPropertyId("ServiceComponentInfo", "cluster_name"), @@ -285,8 +297,8 @@ public abstract class AbstractProviderMo PropertyHelper.getPropertyId("ServiceComponentInfo", "component_name"))); break; case HostComponent: - providers.add(new JMXPropertyProvider( - PropertyHelper.getJMXPropertyIds(type), + providers.add(createJMXPropertyProvider( + type, streamProvider, this, PropertyHelper.getPropertyId("HostRoles", "cluster_name"), @@ -329,7 +341,39 @@ public abstract class AbstractProviderMo } } - private void initProviderMaps() throws SystemException{ + /** + * Update a map of known cluster names to version of JMX metrics. The JMX metrics version is based on the + * HDP version of the cluster. + */ + private void updateClusterVersion() { + synchronized (clusterVersionsMap) { + clusterVersionsMap.clear(); + + ResourceProvider provider = getResourceProvider(Resource.Type.Cluster); + Request request = PropertyHelper.getReadRequest(CLUSTER_NAME_PROPERTY_ID, CLUSTER_VERSION_PROPERTY_ID); + + try { + Set<Resource> clusters = provider.getResources(request, null); + + for (Resource cluster : clusters) { + String clusterVersion = (String) cluster.getPropertyValue(CLUSTER_VERSION_PROPERTY_ID); + + PropertyHelper.JMXMetricsVersion version = clusterVersion.startsWith("HDP-2") ? + PropertyHelper.JMXMetricsVersion.Two : PropertyHelper.JMXMetricsVersion.One; + + clusterVersionsMap.put( + (String) cluster.getPropertyValue(CLUSTER_NAME_PROPERTY_ID), + version); + } + } catch (Exception e) { + if (LOG.isErrorEnabled()) { + LOG.error("Caught exception while trying to get the cluster versions.", e); + } + } + } + } + + private void initProviderMaps() throws SystemException { ResourceProvider provider = getResourceProvider(Resource.Type.Cluster); Request request = PropertyHelper.getReadRequest(CLUSTER_NAME_PROPERTY_ID); @@ -465,4 +509,28 @@ public abstract class AbstractProviderMo } return mConfigs; } + + /** + * Create the JMX property provider for the given type. + */ + private PropertyProvider createJMXPropertyProvider( Resource.Type type, StreamProvider streamProvider, + JMXHostProvider jmxHostProvider, + String clusterNamePropertyId, + String hostNamePropertyId, + String componentNamePropertyId, + String statePropertyId, + Set<String> healthyStates) { + updateClusterVersion(); + + Map<PropertyHelper.JMXMetricsVersion, JMXPropertyProvider> providers = + new HashMap<PropertyHelper.JMXMetricsVersion, JMXPropertyProvider>(); + + for (PropertyHelper.JMXMetricsVersion version : PropertyHelper.JMXMetricsVersion.values()) { + + providers.put(version, new JMXPropertyProvider(PropertyHelper.getJMXPropertyIds(type, version), streamProvider, + jmxHostProvider, clusterNamePropertyId, hostNamePropertyId, componentNamePropertyId, statePropertyId, healthyStates)); + } + + return new JMXVersioningPropertyProvider(clusterVersionsMap, providers, clusterNamePropertyId); + } } Modified: incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java?rev=1487638&r1=1487637&r2=1487638&view=diff ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java (original) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java Wed May 29 20:46:31 2013 @@ -260,28 +260,28 @@ public class ClusterControllerImpl imple Iterable<Resource> resources = getResources(type, readRequest, predicate); PredicateBuilder pb = new PredicateBuilder(); - PredicateBuilder.PredicateBuilderPredicate pbPredicate = null; + PredicateBuilder.PredicateBuilderWithPredicate pbWithPredicate = null; for (Resource resource : resources) { - if (pbPredicate != null) { - pb = pbPredicate.or(); + if (pbWithPredicate != null) { + pb = pbWithPredicate.or(); } - pb = pb.begin(); - pbPredicate = null; + pb = pb.begin(); + pbWithPredicate = null; for (String keyPropertyId : keyPropertyIds) { - if (pbPredicate != null) { - pb = pbPredicate.and(); + if (pbWithPredicate != null) { + pb = pbWithPredicate.and(); } - pbPredicate = + pbWithPredicate = pb.property(keyPropertyId).equals((Comparable) resource.getPropertyValue(keyPropertyId)); } - if (pbPredicate != null) { - pbPredicate = pbPredicate.end(); + if (pbWithPredicate != null) { + pbWithPredicate = pbWithPredicate.end(); } } - return pbPredicate == null ? null : pbPredicate.toPredicate(); + return pbWithPredicate == null ? null : pbWithPredicate.toPredicate(); } /** Added: incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXVersioningPropertyProvider.java URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXVersioningPropertyProvider.java?rev=1487638&view=auto ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXVersioningPropertyProvider.java (added) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXVersioningPropertyProvider.java Wed May 29 20:46:31 2013 @@ -0,0 +1,108 @@ +/** + * 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.controller.jmx; + +import org.apache.ambari.server.controller.internal.BaseProvider; +import org.apache.ambari.server.controller.spi.Predicate; +import org.apache.ambari.server.controller.spi.PropertyProvider; +import org.apache.ambari.server.controller.spi.Request; +import org.apache.ambari.server.controller.spi.Resource; +import org.apache.ambari.server.controller.spi.SystemException; +import org.apache.ambari.server.controller.utilities.PropertyHelper; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * A JMX property manager that delegates to other JMX Property managers based on the + * JMX metrics version of the cluster associated with the resources being populated. + */ +public class JMXVersioningPropertyProvider extends BaseProvider implements PropertyProvider { + + private final Map<String, PropertyHelper.JMXMetricsVersion> clusterVersions; + private final Map<PropertyHelper.JMXMetricsVersion, JMXPropertyProvider> providers; + private final String clusterNamePropertyId; + + /** + * Create a version aware JMX property provider. + */ + public JMXVersioningPropertyProvider(Map<String, PropertyHelper.JMXMetricsVersion> clusterVersions, + Map<PropertyHelper.JMXMetricsVersion, JMXPropertyProvider> providers, + String clusterNamePropertyId) { + super(getComponentMetrics(providers)); + + this.clusterVersions = clusterVersions; + this.providers = providers; + this.clusterNamePropertyId = clusterNamePropertyId; + } + + @Override + public Set<Resource> populateResources(Set<Resource> resources, Request request, Predicate predicate) + throws SystemException { + + Set<Resource> keepers = new HashSet<Resource>(); + + // divide up the given resources according to their associated clusters + Map<String, Set<Resource>> resourcesByCluster = new HashMap<String, Set<Resource>>(); + + for (Resource resource : resources) { + String clusterName = (String) resource.getPropertyValue(clusterNamePropertyId); + + Set<Resource> resourceSet = resourcesByCluster.get(clusterName); + + if (resourceSet == null) { + resourceSet = new HashSet<Resource>(); + resourcesByCluster.put(clusterName, resourceSet); + } + resourceSet.add(resource); + } + + // give each set of resources to the underlying JMX provider that matches the + // JMX metrics version of the associated cluster + for (Map.Entry<String, Set<Resource>> entry : resourcesByCluster.entrySet()) { + String clusterName = entry.getKey(); + Set<Resource> resourceSet = entry.getValue(); + + PropertyHelper.JMXMetricsVersion version = clusterVersions.get(clusterName); + + if (version != null) { + + JMXPropertyProvider provider = providers.get(version); + if (provider != null) { + keepers.addAll(provider.populateResources(resourceSet, request, predicate)); + } + } + } + return keepers; + } + + // ----- helper methods ---------------------------------------------------- + + private static Set<String> getComponentMetrics(Map<PropertyHelper.JMXMetricsVersion, JMXPropertyProvider> providers) { + + Set<String> propertyIds = new HashSet<String>(); + + for (JMXPropertyProvider provider : providers.values()) { + propertyIds.addAll(provider.getPropertyIds()); + } + return propertyIds; + } +} Modified: incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PredicateBuilder.java URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PredicateBuilder.java?rev=1487638&r1=1487637&r2=1487638&view=diff ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PredicateBuilder.java (original) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PredicateBuilder.java Wed May 29 20:46:31 2013 @@ -32,65 +32,6 @@ import java.util.List; /** * Builder for predicates. - * <p/> - * The builder enforces a domain specific language according to the following - * grammar : - * <p/> - * <predicate> ::= <property_name> <relational_operator> <value> - * <predicate> ::= NOT <predicate> - * <predicate> ::= ( <predicate> ) - * <predicate> ::= <predicate> AND <predicate> - * <predicate> ::= <predicate> OR <predicate> - * - * <relational_operator> ::= =|>|<|>=|<= - * <p/> - * The predicate builder uses the normal method chaining of the builder pattern - * along with intermediate objects. The use of intermediate objects allows - * for compiler checked constraints. - * <p/> - * For example, the predicate builder can be used to build a predicate where - * property1=="foo" && property2=="bar". - * - * <pre> - * {@code - * PredicateBuilder builder = new PredicateBuilder(); - * - * Predicate predicate = builder.property(property1).equals("foo"). - * and().property(property2).equals("bar").toPredicate(); - * } - * </pre> - * - * In this example, we are starting with an instance of {@link PredicateBuilder}. - * Calling the method {@link PredicateBuilder#property(String)} returns an - * instance of {@link PredicateBuilderProperty} which exposes methods for attaching - * a relational operator to the property to form a simple predicate. - * <p/> - * Notice that the method {@link PredicateBuilderProperty#equals(Comparable)} - * returns an instance of {@link PredicateBuilderPredicate} which exposes methods - * for using predicates with logical operators to create complex predicates. - * <p/> - * Calling the method {@link PredicateBuilderPredicate#and()} returns an instance - * of {@link PredicateBuilder} which allows us to start over building the predicate - * for property2. - * <p/> - * The reason for having these intermediate return objects is that they only - * expose the methods that make sense for that point in the building process. - * In other words, we can use the compiler to check the syntax of our DSL - * grammar at compile time rather than having a single builder class with a - * bunch of runtime checks. - * <p/> - * For example, if the user tries to make an inappropriate call to the and() - * method ... - * - * <pre> - * {@code - * - * Predicate predicate = builder.property(property1).and(). - * property(property2).equals("bar").toPredicate(); - * } - * </pre> - * - * ... the compiler will flag it as an error and the code will simply not compile. */ public class PredicateBuilder { @@ -101,122 +42,47 @@ public class PredicateBuilder { private boolean done = false; private boolean not = false; - - // ----- Constructors ------------------------------------------------------ - - /** - * Construct a predicate builder. - */ public PredicateBuilder() { this.outer = null; } - /** - * Construct a predicate builder within another predicate builder. - * - * @param outer the outer predicate builder - */ private PredicateBuilder(PredicateBuilder outer) { this.outer = outer; } - - // ----- enums ------------------------------------------------------ - - /** - * Logical operators - */ private enum Operator { And, Or } - - // ----- PredicateBuilder -------------------------------------------------- - - /** - * Create a property from the given property id. This supports method - * chaining by returning an instance of {@link PredicateBuilderProperty} - * which is an intermediate object that represents the property in the DSL. - * - * @param id the property id - * - * @return a property that can be used in the building of the predicate. - * - * @throws IllegalStateException if an attempt is made to reuse a predicate builder - */ - public PredicateBuilderProperty property(String id) { + public PredicateBuilderWithProperty property(String id) { checkDone(); propertyId = id; - return new PredicateBuilderProperty(); + return new PredicateBuilderWithProperty(); } - /** - * Set the builder to negate the predicate being built. This supports method - * chaining by returning an instance of {@link PredicateBuilder} which can be - * used to continue building the predicate. - * - * For example, the following shows a usage of the not() method to - * produce a predicate where property "p1" does not equal "foo". - * - * <pre> - * {@code - * Predicate predicate = builder.not().property("p1").equals("foo").toPredicate(); - * } - * </pre> - * - * @return a builder to be used to continue building the predicate - */ public PredicateBuilder not() { not = true; return this; } - /** - * Set the builder to begin a block around the predicate being built. Calling this - * method is the equivalent of using a left parenthesis. This supports method - * chaining by returning an instance of {@link PredicateBuilder} which can be - * used to continue building the predicate. - * - * For example, the following shows a usage of the begin() method to - * produce a predicate where p1==foo && (p2==bar || p3 == cat). - * - * <pre> - * {@code - * Predicate predicate = builder.property("p1").equals("foo").and(). - * begin().property("p2").equals("bar").or().property("p3").equals("cat").end(). - * toPredicate(); - * } - * </pre> - * - * @return a builder to be used to continue building the predicate - * - * @throws IllegalStateException if an attempt is made to reuse a predicate builder - */ public PredicateBuilder begin() { checkDone(); return new PredicateBuilder(this); } - /** - * Produce a {@link Predicate} object from the builder. - * - * @return the predicate object - */ public Predicate toPredicate() { return getPredicate(); } - // ----- helper methods ---------------------------------------------------- - private void checkDone() { if (done) { throw new IllegalStateException("Can't reuse a predicate builder."); } } - private PredicateBuilderPredicate getPredicateBuilderWithPredicate() { - return new PredicateBuilderPredicate(); + private PredicateBuilderWithPredicate getPredicateBuilderWithPredicate() { + return new PredicateBuilderWithPredicate(); } private void addPredicate(Predicate predicate) { @@ -261,212 +127,60 @@ public class PredicateBuilder { throw new IllegalStateException("Can't return a predicate."); } - // ----- inner classes ----------------------------------------------------- - - // ----- PredicateBuilderProperty ------------------------------------------ + public class PredicateBuilderWithProperty { - /** - * A builder object that represents the property portion of the predicate being built. - * The PredicateBuilderProperty is itself a builder object that may be returned for - * method chaining of the predicate builder methods. - */ - public class PredicateBuilderProperty { - - /** - * Create a {@link PredicateBuilderPredicate} representing an equals - * predicate for the property represented by this builder for the given - * value. This supports method chaining by returning an instance of - * {@link PredicateBuilderPredicate} which can be used to continue building - * the predicate. - * - * For example, the following shows a usage of the equals() method to - * produce a predicate where p1==foo. - * - * <pre> - * {@code - * Predicate predicate = builder.property("p1").equals("foo"). - * toPredicate(); - * } - * </pre> - * - * @param value the right operand (value) of the = operator - * @param <T> the type of the property - * - * @return a new builder representing an equals predicate - * - * @throws IllegalStateException if no property name was specified on this builder - */ - public <T>PredicateBuilderPredicate equals(Comparable<T> value) { + // ----- Equals ----- + public <T>PredicateBuilderWithPredicate equals(Comparable<T> value) { if (propertyId == null) { throw new IllegalStateException("No property."); } addPredicate(new EqualsPredicate<T>(propertyId, value)); - return new PredicateBuilderPredicate(); + return new PredicateBuilderWithPredicate(); } - /** - * Create a {@link PredicateBuilderPredicate} representing an greater than - * predicate for the property represented by this builder for the given - * value. This supports method chaining by returning an instance of - * {@link PredicateBuilderPredicate} which can be used to continue building - * the predicate. - * - * For example, the following shows a usage of the greaterThan() method to - * produce a predicate where p1 > 5. - * - * <pre> - * {@code - * Predicate predicate = builder.property("p1").greaterThan(5). - * toPredicate(); - * } - * </pre> - * - * @param value the right operand (value) of the > operator - * @param <T> the type of the property - * - * @return a new builder representing a greater than predicate - * - * @throws IllegalStateException if no property name was specified on this builder - */ - public <T>PredicateBuilderPredicate greaterThan(Comparable<T> value) { + // ----- Greater than ----- + public <T>PredicateBuilderWithPredicate greaterThan(Comparable<T> value) { if (propertyId == null) { throw new IllegalStateException("No property."); } addPredicate(new GreaterPredicate<T>(propertyId, value)); - return new PredicateBuilderPredicate(); + return new PredicateBuilderWithPredicate(); } - /** - * Create a {@link PredicateBuilderPredicate} representing a - * greater than or equals predicate for the property represented by this - * builder for the given value. This supports method chaining by returning - * an instance of {@link PredicateBuilderPredicate} which can be used to - * continue building the predicate. - * - * For example, the following shows a usage of the greaterThanEqualTo() - * method to produce a predicate where p1 >= 5. - * - * <pre> - * {@code - * Predicate predicate = builder.property("p1").greaterThanEqualTo(5). - * toPredicate(); - * } - * </pre> - * - * @param value the right operand (value) of the >= operator - * @param <T> the type of the property - * - * @return a new builder representing a greater than or equals predicate - * - * @throws IllegalStateException if no property name was specified on this builder - */ - public <T>PredicateBuilderPredicate greaterThanEqualTo(Comparable<T> value) { + // ----- Greater than equal to ----- + public <T>PredicateBuilderWithPredicate greaterThanEqualTo(Comparable<T> value) { if (propertyId == null) { throw new IllegalStateException("No property."); } addPredicate(new GreaterEqualsPredicate<T>(propertyId, value)); - return new PredicateBuilderPredicate(); + return new PredicateBuilderWithPredicate(); } - /** - * Create a {@link PredicateBuilderPredicate} representing a - * less than predicate for the property represented by this builder - * for the given value. This supports method chaining by returning - * an instance of {@link PredicateBuilderPredicate} which can be used to - * continue building the predicate. - * - * For example, the following shows a usage of the lessThan() - * method to produce a predicate where p1 < 5. - * - * <pre> - * {@code - * Predicate predicate = builder.property("p1").lessThan(5). - * toPredicate(); - * } - * </pre> - * - * @param value the right operand (value) of the < operator - * @param <T> the type of the property - * - * @return a new builder representing a less than predicate - * - * @throws IllegalStateException if no property name was specified on this builder - */ - public <T>PredicateBuilderPredicate lessThan(Comparable<T> value) { + // ----- Less than ----- + public <T>PredicateBuilderWithPredicate lessThan(Comparable<T> value) { if (propertyId == null) { throw new IllegalStateException("No property."); } addPredicate(new LessPredicate<T>(propertyId, value)); - return new PredicateBuilderPredicate(); + return new PredicateBuilderWithPredicate(); } - /** - * Create a {@link PredicateBuilderPredicate} representing a - * less than or equals predicate for the property represented by this - * builder for the given value. This supports method chaining by returning - * an instance of {@link PredicateBuilderPredicate} which can be used to - * continue building the predicate. - * - * For example, the following shows a usage of the lessThanEqualTo() - * method to produce a predicate where p1 <= 5. - * - * <pre> - * {@code - * Predicate predicate = builder.property("p1").lessThanEqualTo(5). - * toPredicate(); - * } - * </pre> - * - * @param value the right operand (value) of the <= operator - * @param <T> the type of the property - * - * @return a new builder representing a less than or equals predicate - * - * @throws IllegalStateException if no property name was specified on this builder - */ - public <T>PredicateBuilderPredicate lessThanEqualTo(Comparable<T> value) { + // ----- Less than equal to ----- + public <T>PredicateBuilderWithPredicate lessThanEqualTo(Comparable<T> value) { if (propertyId == null) { throw new IllegalStateException("No property."); } addPredicate(new LessEqualsPredicate<T>(propertyId, value)); - return new PredicateBuilderPredicate(); + return new PredicateBuilderWithPredicate(); } } - // ----- PredicateBuilderPredicate ----------------------------------------- - - /** - * A builder object that represents an inner predicate portion of the predicate being built. - * Note that the predicate represented by an instance of PredicateBuilderPredicate may be - * part of a larger complex predicate being built by the predicate builder. The - * PredicateBuilderPredicate is itself a builder object that may be returned for method - * chaining of the predicate builder methods. - */ - public class PredicateBuilderPredicate { - - /** - * Get a {@link PredicateBuilder} object that can be used to build a - * predicate that will be ANDed with the predicate represented by this - * PredicateBuilderPredicate. - * - * For example, the following shows a usage of the and() method to - * produce a predicate where p1==foo && p2==bar. - * - * <pre> - * {@code - * Predicate predicate = builder.property(p1).equals("foo"). - * and().property(p2).equals("bar").toPredicate(); - * } - * </pre> - * - * @return a new predicate builder that should be used to build the predicate - * being ANDed with the predicate from this builder - */ + public class PredicateBuilderWithPredicate { public PredicateBuilder and() { if (operator != Operator.And) { @@ -476,24 +190,6 @@ public class PredicateBuilder { return PredicateBuilder.this; } - /** - * Get a {@link PredicateBuilder} object that can be used to build a - * predicate that will be ORed with the predicate represented by this - * PredicateBuilderPredicate. - * - * For example, the following shows a usage of the and() method to - * produce a predicate where p1==foo || p2==bar. - * - * <pre> - * {@code - * Predicate predicate = builder.property(p1).equals("foo"). - * or().property(p2).equals("bar").toPredicate(); - * } - * </pre> - * - * @return a new predicate builder that should be used to build the predicate - * being ORed with the predicate from this builder - */ public PredicateBuilder or() { if (operator != Operator.Or) { @@ -503,13 +199,6 @@ public class PredicateBuilder { return PredicateBuilder.this; } - /** - * Produce a {@link Predicate} object from the builder. - * - * @return the predicate object - * - * @throws IllegalStateException if the block is unbalanced (missing end call) - */ public Predicate toPredicate() { if (outer != null) { throw new IllegalStateException("Unbalanced block - missing end."); @@ -518,28 +207,7 @@ public class PredicateBuilder { return getPredicate(); } - /** - * Set the builder to end a block around the predicate being built. Calling this - * method is the equivalent of using a right parenthesis. This supports method - * chaining by returning an instance of {@link PredicateBuilderPredicate} which can - * be used to continue building the predicate. - * - * For example, the following shows a usage of the end() method to - * produce a predicate where p1==foo && (p2==bar || p3 == cat). - * - * <pre> - * {@code - * Predicate predicate = builder.property("p1").equals("foo").and(). - * begin().property("p2").equals("bar").or().property("p3").equals("cat").end(). - * toPredicate(); - * } - * </pre> - * - * @return a builder to be used to continue building the predicate - * - * @throws IllegalStateException if the block is unbalanced (missing end call) - */ - public PredicateBuilderPredicate end() { + public PredicateBuilderWithPredicate end() { if (outer == null) { throw new IllegalStateException("Unbalanced block - missing begin."); } Modified: incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PropertyHelper.java URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PropertyHelper.java?rev=1487638&r1=1487637&r2=1487638&view=diff ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PropertyHelper.java (original) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PropertyHelper.java Wed May 29 20:46:31 2013 @@ -41,14 +41,24 @@ public class PropertyHelper { private static final String PROPERTIES_FILE = "properties.json"; private static final String GANGLIA_PROPERTIES_FILE = "ganglia_properties.json"; private static final String JMX_PROPERTIES_FILE = "jmx_properties.json"; + private static final String JMX_PROPERTIES_FILE_2 = "jmx_properties_2.json"; private static final String KEY_PROPERTIES_FILE = "key_properties.json"; private static final char EXTERNAL_PATH_SEP = '/'; private static final Map<Resource.Type, Set<String>> PROPERTY_IDS = readPropertyIds(PROPERTIES_FILE); private static final Map<Resource.Type, Map<String, Map<String, PropertyInfo>>> JMX_PROPERTY_IDS = readPropertyProviderIds(JMX_PROPERTIES_FILE); + private static final Map<Resource.Type, Map<String, Map<String, PropertyInfo>>> JMX_PROPERTY_IDS_2 = readPropertyProviderIds(JMX_PROPERTIES_FILE_2); private static final Map<Resource.Type, Map<String, Map<String, PropertyInfo>>> GANGLIA_PROPERTY_IDS = readPropertyProviderIds(GANGLIA_PROPERTIES_FILE); private static final Map<Resource.Type, Map<Resource.Type, String>> KEY_PROPERTY_IDS = readKeyPropertyIds(KEY_PROPERTIES_FILE); + /** + * JMX metrics versions. + */ + public enum JMXMetricsVersion { + One, // HDP-1.x + Two // HDP-2.x + } + public static String getPropertyId(String category, String name) { String propertyId = (category == null || category.isEmpty())? name : (name == null || name.isEmpty()) ? category : category + EXTERNAL_PATH_SEP + name; @@ -85,8 +95,14 @@ public class PropertyHelper { return GANGLIA_PROPERTY_IDS.get(resourceType); } - public static Map<String, Map<String, PropertyInfo>> getJMXPropertyIds(Resource.Type resourceType) { - return JMX_PROPERTY_IDS.get(resourceType); + public static Map<String, Map<String, PropertyInfo>> getJMXPropertyIds(Resource.Type resourceType, JMXMetricsVersion version) { + + switch (version) { + case Two: + return JMX_PROPERTY_IDS_2.get(resourceType); + default: + return JMX_PROPERTY_IDS.get(resourceType); + } } public static Map<Resource.Type, String> getKeyPropertyIds(Resource.Type resourceType) { Modified: incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java URL: http://svn.apache.org/viewvc/incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java?rev=1487638&r1=1487637&r2=1487638&view=diff ============================================================================== --- incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java (original) +++ incubator/ambari/branches/branch-1.4.0/ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java Wed May 29 20:46:31 2013 @@ -155,6 +155,8 @@ public class RoleCommandOrder { RoleCommand.START); addDependency(Role.HDFS_SERVICE_CHECK, RoleCommand.EXECUTE, Role.DATANODE, RoleCommand.START); + addDependency(Role.HDFS_SERVICE_CHECK, RoleCommand.EXECUTE, Role.SECONDARY_NAMENODE, + RoleCommand.START); addDependency(Role.MAPREDUCE_SERVICE_CHECK, RoleCommand.EXECUTE, Role.JOBTRACKER, RoleCommand.START); addDependency(Role.MAPREDUCE_SERVICE_CHECK, RoleCommand.EXECUTE, @@ -179,6 +181,10 @@ public class RoleCommandOrder { Role.JOBTRACKER, RoleCommand.START); addDependency(Role.PIG_SERVICE_CHECK, RoleCommand.EXECUTE, Role.TASKTRACKER, RoleCommand.START); + addDependency(Role.PIG_SERVICE_CHECK, RoleCommand.EXECUTE, + Role.RESOURCEMANAGER, RoleCommand.START); + addDependency(Role.PIG_SERVICE_CHECK, RoleCommand.EXECUTE, + Role.NODEMANAGER, RoleCommand.START); addDependency(Role.SQOOP_SERVICE_CHECK, RoleCommand.EXECUTE, Role.JOBTRACKER, RoleCommand.START); addDependency(Role.SQOOP_SERVICE_CHECK, RoleCommand.EXECUTE,
