|
@@ -0,0 +1,346 @@
|
|
|
+/**
|
|
|
+ * 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.internal;
|
|
|
+
|
|
|
+import org.apache.ambari.server.controller.AmbariServer;
|
|
|
+import org.apache.ambari.server.controller.ganglia.GangliaComponentPropertyProvider;
|
|
|
+import org.apache.ambari.server.controller.ganglia.GangliaHostComponentPropertyProvider;
|
|
|
+import org.apache.ambari.server.controller.ganglia.GangliaHostPropertyProvider;
|
|
|
+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.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.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.LinkedList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+/**
|
|
|
+ * An abstract provider module implementation.
|
|
|
+ */
|
|
|
+public abstract class AbstractProviderModule implements ProviderModule, ResourceProviderObserver, JMXHostProvider, GangliaHostProvider {
|
|
|
+
|
|
|
+ private static final String HOST_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("Hosts", "cluster_name");
|
|
|
+ private static final String HOST_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("Hosts", "host_name");
|
|
|
+ private static final String HOST_IP_PROPERTY_ID = PropertyHelper.getPropertyId("Hosts", "ip");
|
|
|
+ private static final String CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("Clusters", "cluster_name");
|
|
|
+ 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");
|
|
|
+ private static final String GANGLIA_SERVER = "GANGLIA_SERVER";
|
|
|
+ private static final String GANGLIA_MONITOR = "GANGLIA_MONITOR";
|
|
|
+ private static final String GANGLIA_SERVER_OLD = "GANGLIA_MONITOR_SERVER";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The map of resource providers.
|
|
|
+ */
|
|
|
+ private final Map<Resource.Type, ResourceProvider> resourceProviders = new HashMap<Resource.Type, ResourceProvider>();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The map of lists of property providers.
|
|
|
+ */
|
|
|
+ private final Map<Resource.Type,List<PropertyProvider>> propertyProviders = new HashMap<Resource.Type, List<PropertyProvider>>();
|
|
|
+
|
|
|
+ @Inject
|
|
|
+ private AmbariManagementController managementController;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The map of hosts.
|
|
|
+ */
|
|
|
+ private Map<String, Map<String, String>> clusterHostMap;
|
|
|
+
|
|
|
+ private Map<String, Map<String, String>> clusterHostComponentMap;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The host name of the Ganglia collector.
|
|
|
+ */
|
|
|
+ private Map<String, String> clusterGangliaCollectorMap;
|
|
|
+
|
|
|
+ private volatile boolean initialized = false;
|
|
|
+
|
|
|
+ protected final static Logger LOG =
|
|
|
+ LoggerFactory.getLogger(AbstractProviderModule.class);
|
|
|
+
|
|
|
+
|
|
|
+ // ----- Constructors ------------------------------------------------------
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Create a default provider module.
|
|
|
+ */
|
|
|
+ public AbstractProviderModule() {
|
|
|
+ if (managementController == null) {
|
|
|
+ managementController = AmbariServer.getController();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // ----- ProviderModule ----------------------------------------------------
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResourceProvider getResourceProvider(Resource.Type type) {
|
|
|
+ if (!propertyProviders.containsKey(type)) {
|
|
|
+ registerResourceProvider(type);
|
|
|
+ }
|
|
|
+ return resourceProviders.get(type);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<PropertyProvider> getPropertyProviders(Resource.Type type) {
|
|
|
+
|
|
|
+ if (!propertyProviders.containsKey(type)) {
|
|
|
+ createPropertyProviders(type);
|
|
|
+ }
|
|
|
+ return propertyProviders.get(type);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // ----- ResourceProviderObserver ------------------------------------------
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void update(ResourceProviderEvent event) {
|
|
|
+ Resource.Type type = event.getResourceType();
|
|
|
+
|
|
|
+ if (type == Resource.Type.Cluster ||
|
|
|
+ type == Resource.Type.Host ||
|
|
|
+ type == Resource.Type.HostComponent) {
|
|
|
+ resetInit();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // ----- JMXHostProvider ---------------------------------------------------
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getHostName(String clusterName, String componentName) throws SystemException {
|
|
|
+ checkInit();
|
|
|
+ return clusterHostComponentMap.get(clusterName).get(componentName);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, String> getHostMapping(String clusterName) throws SystemException {
|
|
|
+ checkInit();
|
|
|
+ return clusterHostMap.get(clusterName);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // ----- GangliaHostProvider -----------------------------------------------
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getGangliaCollectorHostName(String clusterName) throws SystemException {
|
|
|
+ checkInit();
|
|
|
+ return clusterGangliaCollectorMap.get(clusterName);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // ----- utility methods ---------------------------------------------------
|
|
|
+
|
|
|
+ protected abstract ResourceProvider createResourceProvider(Resource.Type type);
|
|
|
+
|
|
|
+ protected void registerResourceProvider(Resource.Type type) {
|
|
|
+ ResourceProvider resourceProvider = createResourceProvider(type);
|
|
|
+
|
|
|
+ if (resourceProvider instanceof ObservableResourceProvider) {
|
|
|
+ ((ObservableResourceProvider)resourceProvider).addObserver(this);
|
|
|
+ }
|
|
|
+
|
|
|
+ putResourceProvider(type, resourceProvider);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected void putResourceProvider(Resource.Type type, ResourceProvider resourceProvider) {
|
|
|
+ resourceProviders.put( type , resourceProvider);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected void putPropertyProviders(Resource.Type type, List<PropertyProvider> providers) {
|
|
|
+ propertyProviders.put(type, providers);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected void createPropertyProviders(Resource.Type type) {
|
|
|
+
|
|
|
+ List<PropertyProvider> providers = new LinkedList<PropertyProvider>();
|
|
|
+
|
|
|
+ URLStreamProvider streamProvider = new URLStreamProvider();
|
|
|
+
|
|
|
+ switch (type){
|
|
|
+ case Cluster :
|
|
|
+ providers.add(new GangliaReportPropertyProvider(
|
|
|
+ PropertyHelper.getGangliaPropertyIds(type).get("*"),
|
|
|
+ streamProvider,
|
|
|
+ this,
|
|
|
+ PropertyHelper.getPropertyId("Clusters", "cluster_name")));
|
|
|
+ break;
|
|
|
+ case Host :
|
|
|
+ providers.add(new GangliaHostPropertyProvider(
|
|
|
+ PropertyHelper.getGangliaPropertyIds(type),
|
|
|
+ streamProvider,
|
|
|
+ this,
|
|
|
+ PropertyHelper.getPropertyId("Hosts", "cluster_name"),
|
|
|
+ PropertyHelper.getPropertyId("Hosts", "host_name")
|
|
|
+ ));
|
|
|
+ break;
|
|
|
+ case Component :
|
|
|
+ providers.add(new JMXPropertyProvider(
|
|
|
+ PropertyHelper.getJMXPropertyIds(type),
|
|
|
+ streamProvider,
|
|
|
+ this,
|
|
|
+ PropertyHelper.getPropertyId("ServiceComponentInfo", "cluster_name"),
|
|
|
+ null,
|
|
|
+ PropertyHelper.getPropertyId("ServiceComponentInfo", "component_name")));
|
|
|
+
|
|
|
+ providers.add(new GangliaComponentPropertyProvider(
|
|
|
+ PropertyHelper.getGangliaPropertyIds(type),
|
|
|
+ streamProvider,
|
|
|
+ this,
|
|
|
+ PropertyHelper.getPropertyId("ServiceComponentInfo", "cluster_name"),
|
|
|
+ PropertyHelper.getPropertyId("ServiceComponentInfo", "component_name")));
|
|
|
+ break;
|
|
|
+ case HostComponent:
|
|
|
+ providers.add(new JMXPropertyProvider(
|
|
|
+ PropertyHelper.getJMXPropertyIds(type),
|
|
|
+ streamProvider,
|
|
|
+ this,
|
|
|
+ PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
|
|
|
+ PropertyHelper.getPropertyId("HostRoles", "host_name"),
|
|
|
+ PropertyHelper.getPropertyId("HostRoles", "component_name")));
|
|
|
+
|
|
|
+ providers.add(new GangliaHostComponentPropertyProvider(
|
|
|
+ PropertyHelper.getGangliaPropertyIds(type),
|
|
|
+ streamProvider,
|
|
|
+ this,
|
|
|
+ PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
|
|
|
+ PropertyHelper.getPropertyId("HostRoles", "host_name"),
|
|
|
+ PropertyHelper.getPropertyId("HostRoles", "component_name")));
|
|
|
+ break;
|
|
|
+ default :
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ putPropertyProviders(type, providers);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void checkInit() throws SystemException{
|
|
|
+ if (!initialized) {
|
|
|
+ synchronized (this) {
|
|
|
+ if (!initialized) {
|
|
|
+ initProviderMaps();
|
|
|
+ initialized = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void resetInit() {
|
|
|
+ if (initialized) {
|
|
|
+ synchronized (this) {
|
|
|
+ initialized = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void initProviderMaps() throws SystemException{
|
|
|
+ ResourceProvider provider = getResourceProvider(Resource.Type.Cluster);
|
|
|
+ Request request = PropertyHelper.getReadRequest(CLUSTER_NAME_PROPERTY_ID);
|
|
|
+
|
|
|
+ try {
|
|
|
+ Set<Resource> clusters = provider.getResources(request, null);
|
|
|
+
|
|
|
+ clusterHostMap = new HashMap<String, Map<String, String>>();
|
|
|
+ clusterHostComponentMap = new HashMap<String, Map<String, String>>();
|
|
|
+ clusterGangliaCollectorMap = new HashMap<String, String>();
|
|
|
+
|
|
|
+ for (Resource cluster : clusters) {
|
|
|
+
|
|
|
+ String clusterName = (String) cluster.getPropertyValue(CLUSTER_NAME_PROPERTY_ID);
|
|
|
+
|
|
|
+ // initialize the host map from the known hosts...
|
|
|
+ provider = getResourceProvider(Resource.Type.Host);
|
|
|
+ request = PropertyHelper.getReadRequest(HOST_NAME_PROPERTY_ID, HOST_IP_PROPERTY_ID);
|
|
|
+
|
|
|
+ Predicate predicate = new PredicateBuilder().property(HOST_CLUSTER_NAME_PROPERTY_ID).
|
|
|
+ equals(clusterName).toPredicate();
|
|
|
+
|
|
|
+ Set<Resource> hosts = provider.getResources(request, predicate);
|
|
|
+ Map<String, String> hostMap = clusterHostMap.get(clusterName);
|
|
|
+
|
|
|
+ if (hostMap == null) {
|
|
|
+ hostMap = new HashMap<String, String>();
|
|
|
+ clusterHostMap.put(clusterName, hostMap);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (Resource host : hosts) {
|
|
|
+ String hostName = (String) host.getPropertyValue(HOST_NAME_PROPERTY_ID);
|
|
|
+ String hostIp = (String) host.getPropertyValue(HOST_IP_PROPERTY_ID);
|
|
|
+ hostMap.put(hostName, hostIp == null ? hostName : hostIp);
|
|
|
+ }
|
|
|
+
|
|
|
+ // initialize the host component map and Ganglia server from the known hosts components...
|
|
|
+ provider = getResourceProvider(Resource.Type.HostComponent);
|
|
|
+
|
|
|
+ request = PropertyHelper.getReadRequest(HOST_COMPONENT_HOST_NAME_PROPERTY_ID,
|
|
|
+ HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID);
|
|
|
+
|
|
|
+ predicate = new PredicateBuilder().property(HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID).
|
|
|
+ equals(clusterName).toPredicate();
|
|
|
+
|
|
|
+ Set<Resource> hostComponents = provider.getResources(request, predicate);
|
|
|
+ Map<String, String> hostComponentMap = clusterHostComponentMap.get(clusterName);
|
|
|
+
|
|
|
+ if (hostComponentMap == null) {
|
|
|
+ hostComponentMap = new HashMap<String, String>();
|
|
|
+ clusterHostComponentMap.put(clusterName, hostComponentMap);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (Resource hostComponent : hostComponents) {
|
|
|
+ String componentName = (String) hostComponent.getPropertyValue(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID);
|
|
|
+ String hostName = (String) hostComponent.getPropertyValue(HOST_COMPONENT_HOST_NAME_PROPERTY_ID);
|
|
|
+
|
|
|
+ hostComponentMap.put(componentName, hostMap.get(hostName));
|
|
|
+
|
|
|
+ // record the Ganglia server for the current cluster
|
|
|
+ if (componentName.equals(GANGLIA_SERVER) || componentName.equals(GANGLIA_MONITOR) ||componentName.equals(GANGLIA_SERVER_OLD)) {
|
|
|
+ clusterGangliaCollectorMap.put(clusterName, clusterHostMap.get(clusterName).get(hostName));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (UnsupportedPropertyException e) {
|
|
|
+ if (LOG.isErrorEnabled()) {
|
|
|
+ LOG.error("Caught UnsupportedPropertyException while trying to get the host mappings.", e);
|
|
|
+ }
|
|
|
+ throw new SystemException("An exception occurred while initializing the host mappings: " + e, e);
|
|
|
+ } catch (NoSuchResourceException e) {
|
|
|
+ if (LOG.isErrorEnabled()) {
|
|
|
+ LOG.error("Caught NoSuchResourceException exception while trying to get the host mappings.", e);
|
|
|
+ }
|
|
|
+ throw new SystemException("An exception occurred while initializing the host mappings: " + e, e);
|
|
|
+ } catch (NoSuchParentResourceException e) {
|
|
|
+ if (LOG.isErrorEnabled()) {
|
|
|
+ LOG.error("Caught NoSuchParentResourceException exception while trying to get the host mappings.", e);
|
|
|
+ }
|
|
|
+ throw new SystemException("An exception occurred while initializing the host mappings: " + e, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|