You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by tb...@apache.org on 2016/04/08 20:44:55 UTC

ambari git commit: AMBARI-15733 - Atlas Integration : Support Atlas HA

Repository: ambari
Updated Branches:
  refs/heads/trunk 2817ce67e -> 84214c5ae


AMBARI-15733 - Atlas Integration : Support Atlas HA


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/84214c5a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/84214c5a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/84214c5a

Branch: refs/heads/trunk
Commit: 84214c5ae1ba107931a735a685951239fc0c9a1e
Parents: 2817ce6
Author: tbeerbower <tb...@hortonworks.com>
Authored: Fri Apr 8 14:44:43 2016 -0400
Committer: tbeerbower <tb...@hortonworks.com>
Committed: Fri Apr 8 14:44:43 2016 -0400

----------------------------------------------------------------------
 .../internal/AbstractProviderModule.java        |  15 ++
 .../AtlasServerHttpPropertyRequest.java         |  72 ++++++
 .../internal/HostComponentResourceProvider.java |  26 --
 .../internal/HttpPropertyProvider.java          | 212 +++++++++++++++
 .../internal/HttpProxyPropertyProvider.java     | 256 -------------------
 .../internal/JsonHttpPropertyRequest.java       |  97 +++++++
 .../ResourceManagerHttpPropertyRequest.java     | 122 +++++++++
 .../ATLAS/0.1.0.2.3/package/scripts/params.py   |  20 ++
 .../configuration/application-properties.xml    |  45 ++++
 .../stacks/HDP/2.5/services/ATLAS/metainfo.xml  |   1 +
 .../AtlasServerHttpPropertyRequestTest.java     |  81 ++++++
 .../internal/HttpPropertyProviderTest.java      | 160 ++++++++----
 12 files changed, 777 insertions(+), 330 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
index b77fda2..ca491f2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
@@ -93,6 +93,8 @@ public abstract class AbstractProviderModule implements ProviderModule,
   private static final Map<Service.Type, Map<String, String[]>> serviceDesiredProperties = new EnumMap<Service.Type, Map<String, String[]>>(Service.Type.class);
   private static final Map<String, Service.Type> componentServiceMap = new HashMap<String, Service.Type>();
 
+  private static final Map<String, List<HttpPropertyProvider.HttpPropertyRequest>> HTTP_PROPERTY_REQUESTS = new HashMap<>();
+
   private static final String PROPERTY_HDFS_HTTP_POLICY_VALUE_HTTPS_ONLY = "HTTPS_ONLY";
 
   private static final String COLLECTOR_DEFAULT_PORT = "6188";
@@ -171,6 +173,12 @@ public abstract class AbstractProviderModule implements ProviderModule,
     initPropMap.put("datanode", new String[]{"dfs.namenode.servicerpc-address.%s.%s"});
     initPropMap.put("healthcheck", new String[]{"dfs.namenode.lifeline.rpc-address.%s.%s"});
     jmxDesiredRpcSuffixProperties.put("NAMENODE-HA", initPropMap);
+
+    HTTP_PROPERTY_REQUESTS.put("RESOURCEMANAGER",
+        Collections.<HttpPropertyProvider.HttpPropertyRequest>singletonList(new ResourceManagerHttpPropertyRequest()));
+
+    HTTP_PROPERTY_REQUESTS.put("ATLAS_SERVER",
+        Collections.<HttpPropertyProvider.HttpPropertyRequest>singletonList(new AtlasServerHttpPropertyRequest()));
   }
 
   /**
@@ -790,6 +798,13 @@ public abstract class AbstractProviderModule implements ProviderModule,
               PropertyHelper.getPropertyId("HostRoles", "state"),
               jpp,
               gpp));
+
+          providers.add(new HttpPropertyProvider(streamProvider,
+              managementController.getClusters(),
+              PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
+              PropertyHelper.getPropertyId("HostRoles", "host_name"),
+              PropertyHelper.getPropertyId("HostRoles", "component_name"),
+              HTTP_PROPERTY_REQUESTS));
         }
         break;
         case RootServiceComponent:

http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AtlasServerHttpPropertyRequest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AtlasServerHttpPropertyRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AtlasServerHttpPropertyRequest.java
new file mode 100644
index 0000000..e94e01b
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AtlasServerHttpPropertyRequest.java
@@ -0,0 +1,72 @@
+/**
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.spi.SystemException;
+import org.apache.ambari.server.state.Cluster;
+
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Atlas server specific HTTP property request.
+ */
+public class AtlasServerHttpPropertyRequest extends JsonHttpPropertyRequest {
+
+  private static final String PROPERTY_ENABLE_TLS = "atlas.enableTLS";
+  private static final String PROPERTY_SERVER_HTTPS_PORT = "atlas.server.https.port";
+  private static final String PROPERTY_SERVER_HTTP_PORT = "atlas.server.http.port";
+  private static final String CONFIG_APPLICATION_PROPERTIES = "application-properties";
+  private static final String URL_TEMPLATE = "%s://%s:%s/api/atlas/admin/status";
+
+  private static final Map<String, String> PROPERTY_MAPPINGS =
+      Collections.singletonMap("Status", "HostRoles/ha_state");
+
+
+  // ----- Constructors ----------------------------------------------------
+
+  public AtlasServerHttpPropertyRequest() {
+    super(PROPERTY_MAPPINGS);
+  }
+
+
+  // ----- PropertyRequest -------------------------------------------------
+
+  @Override
+  public String getUrl(Cluster cluster, String hostName)
+      throws SystemException {
+
+    Map<String, String> atlasConfig = cluster.getDesiredConfigByType(CONFIG_APPLICATION_PROPERTIES).getProperties();
+
+    boolean useHttps = Boolean.parseBoolean(getConfigValue(atlasConfig, PROPERTY_ENABLE_TLS, "false"));
+
+    String port = useHttps ?
+        getConfigValue(atlasConfig, PROPERTY_SERVER_HTTPS_PORT, "21443") :
+        getConfigValue(atlasConfig, PROPERTY_SERVER_HTTP_PORT, "21000");
+
+    return String.format(URL_TEMPLATE, useHttps ? "https" : "http", hostName, port);
+  }
+
+
+  // ----- helper methods --------------------------------------------------
+
+  // get a configuration property value
+  private String getConfigValue(Map<String, String> atlasConfig, String property, String defaultValue) {
+    return atlasConfig.containsKey(property) ? atlasConfig.get(property) : defaultValue;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
index 11db913..39a09a6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
@@ -111,11 +111,6 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro
       = PropertyHelper.getPropertyId("HostRoles", "hdp_version");
   public static final String HOST_COMPONENT_UPGRADE_STATE_PROPERTY_ID = "HostRoles/upgrade_state";
 
-  //Component name mappings
-  private final Map<String, PropertyProvider> HOST_COMPONENT_PROPERTIES_PROVIDER = new HashMap<String, PropertyProvider>();
-  private static final int HOST_COMPONENT_HTTP_PROPERTY_REQUEST_CONNECT_TIMEOUT = 1500;   //milliseconds
-  private static final int HOST_COMPONENT_HTTP_PROPERTY_REQUEST_READ_TIMEOUT = 10000;  //milliseconds
-
   //Parameters from the predicate
   private static final String QUERY_PARAMETERS_RUN_SMOKE_TEST_ID = "params/run_smoke_test";
   private static Set<String> pkPropertyIds =
@@ -149,19 +144,6 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro
                                        @Assisted AmbariManagementController managementController,
                                        Injector injector) {
     super(propertyIds, keyPropertyIds, managementController);
-    ComponentSSLConfiguration configuration = ComponentSSLConfiguration.instance();
-    URLStreamProvider streamProvider = new URLStreamProvider(
-            HOST_COMPONENT_HTTP_PROPERTY_REQUEST_CONNECT_TIMEOUT,
-            HOST_COMPONENT_HTTP_PROPERTY_REQUEST_READ_TIMEOUT,
-            configuration.getTruststorePath(), configuration.getTruststorePassword(), configuration.getTruststoreType());
-
-    HttpProxyPropertyProvider httpPropertyProvider = new HttpProxyPropertyProvider(streamProvider,
-            configuration, injector,
-            PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
-            PropertyHelper.getPropertyId("HostRoles", "host_name"),
-            PropertyHelper.getPropertyId("HostRoles", "component_name"));
-
-    HOST_COMPONENT_PROPERTIES_PROVIDER.put("RESOURCEMANAGER", httpPropertyProvider);
 
     setRequiredCreateAuthorizations(EnumSet.of(RoleAuthorization.SERVICE_ADD_DELETE_SERVICES,RoleAuthorization.HOST_ADD_DELETE_COMPONENTS));
     setRequiredDeleteAuthorizations(EnumSet.of(RoleAuthorization.SERVICE_ADD_DELETE_SERVICES,RoleAuthorization.HOST_ADD_DELETE_COMPONENTS));
@@ -281,14 +263,6 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro
                 response.getMaintenanceState(), requestedIds);
       }
 
-      String componentName = (String) resource.getPropertyValue(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID);
-      PropertyProvider propertyProvider = HOST_COMPONENT_PROPERTIES_PROVIDER.get(componentName);
-      if (propertyProvider != null) {
-        Set<Resource> resourcesToPopulate = new HashSet<Resource>();
-        resourcesToPopulate.add(resource);
-        propertyProvider.populateResources(resourcesToPopulate, request, predicate);
-      }
-
       resources.add(resource);
     }
     return resources;

http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HttpPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HttpPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HttpPropertyProvider.java
new file mode 100644
index 0000000..c53df3f
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HttpPropertyProvider.java
@@ -0,0 +1,212 @@
+/**
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.AmbariException;
+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.StreamProvider;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Property provider for host component resources that is used to read HTTP data from another server.
+ */
+public class HttpPropertyProvider extends BaseProvider implements PropertyProvider {
+
+  protected final static Logger LOG = LoggerFactory.getLogger(HttpPropertyProvider.class);
+
+  private final StreamProvider streamProvider;
+  private final String clusterNamePropertyId;
+  private final String hostNamePropertyId;
+  private final String componentNamePropertyId;
+  private final Clusters clusters;
+  private final Map<String, List<HttpPropertyRequest>> httpPropertyRequests;
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  public HttpPropertyProvider(
+      StreamProvider stream,
+      Clusters clusters,
+      String clusterNamePropertyId,
+      String hostNamePropertyId,
+      String componentNamePropertyId,
+      Map<String, List<HttpPropertyRequest>> httpPropertyRequests) {
+
+    super(getSupportedProperties(httpPropertyRequests));
+    this.streamProvider = stream;
+    this.clusterNamePropertyId = clusterNamePropertyId;
+    this.hostNamePropertyId = hostNamePropertyId;
+    this.componentNamePropertyId = componentNamePropertyId;
+    this.clusters = clusters;
+    this.httpPropertyRequests = httpPropertyRequests;
+  }
+
+
+  // ----- PropertyProvider --------------------------------------------------
+
+  // get the complete set of Ambari properties that can be set by this property provider.
+  private static Set<String> getSupportedProperties(Map<String, List<HttpPropertyRequest>> httpPropertyRequests) {
+    Set<String> supportedProperties = new HashSet<>();
+
+    for (List<HttpPropertyRequest> httpPropertyRequestList : httpPropertyRequests.values()) {
+      for (HttpPropertyRequest httpPropertyRequest : httpPropertyRequestList) {
+        supportedProperties.addAll(httpPropertyRequest.getSupportedProperties());
+      }
+    }
+    return Collections.unmodifiableSet(supportedProperties);
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  @Override
+  public Set<Resource> populateResources(Set<Resource> resources,
+                                         Request request, Predicate predicate) throws SystemException {
+
+    Set<String> ids = getRequestPropertyIds(request, predicate);
+
+    if (ids.size() == 0) {
+      return resources;
+    }
+
+    for (Resource resource : resources) {
+      String clusterName = (String) resource.getPropertyValue(clusterNamePropertyId);
+      String hostName = (String) resource.getPropertyValue(hostNamePropertyId);
+      String componentName = (String) resource.getPropertyValue(componentNamePropertyId);
+
+      if (clusterName != null && hostName != null && componentName != null &&
+          httpPropertyRequests.containsKey(componentName)) {
+
+        try {
+          Cluster cluster = clusters.getCluster(clusterName);
+
+          List<HttpPropertyRequest> httpPropertyRequestList = httpPropertyRequests.get(componentName);
+
+          for (HttpPropertyRequest httpPropertyRequest : httpPropertyRequestList) {
+            populateResource(httpPropertyRequest, resource, cluster, hostName);
+          }
+        } catch (AmbariException e) {
+          String msg = String.format("Could not load cluster with name %s.", clusterName);
+          LOG.debug(msg, e);
+          throw new SystemException(msg, e);
+        }
+      }
+    }
+    return resources;
+  }
+
+  // populate the given resource from the given HTTP property request.
+  private void populateResource(HttpPropertyRequest httpPropertyRequest, Resource resource,
+                                Cluster cluster, String hostName) throws SystemException {
+
+    String url = httpPropertyRequest.getUrl(cluster, hostName);
+
+    try {
+      InputStream inputStream = streamProvider.readFrom(url);
+
+      try {
+        httpPropertyRequest.populateResource(resource, inputStream);
+      } finally {
+        try {
+          inputStream.close();
+        } catch (IOException ioe) {
+          LOG.error(String.format("Error closing HTTP response stream %s", url), ioe);
+        }
+      }
+    } catch (Exception e) {
+      LOG.debug(String.format("Error reading HTTP response from %s", url), e);
+    }
+  }
+
+
+  // ----- inner class : HttpPropertyRequest ---------------------------------
+
+  /**
+   * Represents an HTTP request to another server for properties to be
+   * used to populate an Ambari resource.
+   */
+  public static abstract class HttpPropertyRequest {
+
+    private final Map<String, String> propertyMappings;
+
+
+    // ----- Constructors ----------------------------------------------------
+
+    protected HttpPropertyRequest(Map<String, String> propertyMappings) {
+      this.propertyMappings = propertyMappings;
+    }
+
+
+    // ----- PropertyRequest -------------------------------------------------
+
+    /**
+     * Get the names of the Ambari properties that can be set by this HTTP property request.
+     *
+     * @return the supported property names
+     */
+    public Collection<String> getSupportedProperties() {
+      return propertyMappings.values();
+    }
+
+    /**
+     * Get the property name mappings from source property to Ambari property.
+     *
+     * @return the source to Ambari property name mappings
+     */
+    protected Map<String, String> getPropertyMappings() {
+      return propertyMappings;
+    }
+
+    /**
+     * Get the URL used to make the HTTP request.
+     *
+     * @param cluster        the cluster of the resource being populated
+     * @param hostName       the host name of the resource being populated
+     * @return the URL to make the HTTP request
+     *
+     * @throws SystemException if the URL can not be obtained
+     */
+    public abstract String getUrl(Cluster cluster, String hostName) throws SystemException;
+
+    /**
+     * Populate the given resource from the given input stream.
+     *
+     * @param resource     the Ambari resource to populate
+     * @param inputStream  the input stream from the HTTP request
+     *
+     * @throws SystemException  if the resource can not be populated
+     */
+    public abstract void populateResource(Resource resource, InputStream inputStream) throws SystemException;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HttpProxyPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HttpProxyPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HttpProxyPropertyProvider.java
deleted file mode 100644
index e92536c..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HttpProxyPropertyProvider.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/**
- * 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 java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Type;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import com.google.gson.JsonSyntaxException;
-import com.google.inject.Injector;
-import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
-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 org.apache.ambari.server.controller.utilities.StreamProvider;
-import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.state.Clusters;
-import org.apache.commons.io.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-
-/**
- * Property provider that is used to read HTTP data from another server.
- */
-public class HttpProxyPropertyProvider extends BaseProvider implements PropertyProvider {
-
-  protected final static Logger LOG =
-      LoggerFactory.getLogger(HttpProxyPropertyProvider.class);
-
-  private static final Map<String, String> URL_TEMPLATES = new HashMap<String, String>();
-  private static final Map<String, String> MAPPINGS = new HashMap<String, String>();
-  private static final Map<String, String> PROPERTIES_TO_FILTER = new HashMap<String, String>();
-
-  private static final String COMPONENT_RESOURCEMANAGER = "RESOURCEMANAGER";
-  private static final String CONFIG_YARN_SITE = "yarn-site";
-  private static final String CONFIG_CORE_SITE = "core-site";
-  private static final String PROPERTY_YARN_HTTP_POLICY = "yarn.http.policy";
-  private static final String PROPERTY_HADOOP_SSL_ENABLED = "hadoop.ssl.enabled";
-  private static final String PROPERTY_YARN_HTTP_POLICY_VALUE_HTTPS_ONLY = "HTTPS_ONLY";
-  private static final String PROPERTY_HADOOP_SSL_ENABLED_VALUE_TRUE = "true";
-
-
-  private static final String PROPERTY_RESOURCEMANAGER_WEBAPP_ADDRESS = "yarn.resourcemanager.webapp.address";
-  private static final String PROPERTY_RESOURCEMANAGER_WEBAPP_HTTPS_ADDRESS = "yarn.resourcemanager.webapp.https.address";
-  // resource manager HA properties
-
-  private static final String PROPERTY_RESOURCEMANAGER_HA_RM_IDS = "yarn.resourcemanager.ha.rm-ids";
-  private static final String PROPERTY_RESOURCEMANAGER_HOSTNAME_TEMPLATE = "yarn.resourcemanager.hostname.%s";
-  private static final String PROPERTY_RESOURCEMANAGER_WEBAPP_ADDRESS_TEMPLATE = "yarn.resourcemanager.webapp.address.%s";
-  private static final String PROPERTY_RESOURCEMANAGER_WEBAPP_HTTPS_ADDRESS_TEMPLATE = "yarn.resourcemanager.webapp.https.address.%s";
-
-  static {
-    URL_TEMPLATES.put(COMPONENT_RESOURCEMANAGER, "http://%s:%s/ws/v1/cluster/info");
-    
-    MAPPINGS.put(COMPONENT_RESOURCEMANAGER, PropertyHelper.getPropertyId("HostRoles", "ha_state"));
-
-    PROPERTIES_TO_FILTER.put(COMPONENT_RESOURCEMANAGER, "clusterInfo/haState");
-  }
-
-  private final ComponentSSLConfiguration configuration;
-
-  private StreamProvider streamProvider = null;
-  // !!! not yet used, but make consistent
-  private String clusterNamePropertyId = null;
-  private String hostNamePropertyId = null;
-  private String componentNamePropertyId = null;
-
-  private Injector injector;
-  private Clusters clusters;
-  
-  public HttpProxyPropertyProvider(
-      StreamProvider stream,
-      ComponentSSLConfiguration configuration,
-      Injector inject,
-      String clusterNamePropertyId,
-      String hostNamePropertyId,
-      String componentNamePropertyId) {
-
-    super(new HashSet<String>(MAPPINGS.values()));
-    this.streamProvider = stream;
-    this.configuration = configuration;
-    this.clusterNamePropertyId = clusterNamePropertyId;
-    this.hostNamePropertyId = hostNamePropertyId;
-    this.componentNamePropertyId = componentNamePropertyId;
-    this.injector = inject;
-    this.clusters = injector.getInstance(Clusters.class);
-  }
-
-  /**
-   * This method only checks if an HTTP-type property should be fulfilled.  No
-   * modification is performed on the resources.
-   */
-  @Override
-  public Set<Resource> populateResources(Set<Resource> resources,
-      Request request, Predicate predicate) throws SystemException {
-    
-    Set<String> ids = getRequestPropertyIds(request, predicate);
-    
-    if (0 == ids.size())
-      return resources;
-
-    for (Resource resource : resources) {
-      
-      Object hostName = resource.getPropertyValue(hostNamePropertyId);
-      Object componentName = resource.getPropertyValue(componentNamePropertyId);
-      Object clusterName = resource.getPropertyValue(clusterNamePropertyId);
-
-      if (null != hostName && null != componentName &&
-          MAPPINGS.containsKey(componentName.toString()) &&
-          URL_TEMPLATES.containsKey(componentName.toString())) {
-        
-        String template = getTemplate(componentName.toString(), clusterName.toString(), hostName.toString());
-        String propertyId = MAPPINGS.get(componentName.toString());
-        String url = String.format(template, hostName);
-        
-        getHttpResponse(resource, url, propertyId);
-      }
-    }
-    
-    return resources;
-  }
-
-  private String getTemplate(String componentName, String clusterName, String hostName) throws SystemException {
-    String template = URL_TEMPLATES.get(componentName);
-
-    if (componentName.equals(COMPONENT_RESOURCEMANAGER)) {
-      try {
-        Cluster cluster = this.clusters.getCluster(clusterName);
-        Map<String, String> yarnConfigProperties = cluster.getDesiredConfigByType(CONFIG_YARN_SITE).getProperties();
-        Map<String, String> coreConfigProperties = cluster.getDesiredConfigByType(CONFIG_CORE_SITE).getProperties();
-        String yarnHttpPolicy = yarnConfigProperties.get(PROPERTY_YARN_HTTP_POLICY);
-        String hadoopSslEnabled = coreConfigProperties.get(PROPERTY_HADOOP_SSL_ENABLED);
-        boolean useHttps = (yarnHttpPolicy != null && yarnHttpPolicy.equals(PROPERTY_YARN_HTTP_POLICY_VALUE_HTTPS_ONLY)) ||
-            hadoopSslEnabled != null && hadoopSslEnabled.equals(PROPERTY_HADOOP_SSL_ENABLED_VALUE_TRUE);
-        if (useHttps) {
-          template = template.replace("http", "https");
-        }
-        // determine correct port, we don't want to use hardcoded one
-        String port;
-        if(!yarnConfigProperties.containsKey(PROPERTY_RESOURCEMANAGER_HA_RM_IDS)) {
-          //non ha mode
-          if(useHttps) {
-            port = getPortFromProperty(yarnConfigProperties, PROPERTY_RESOURCEMANAGER_WEBAPP_HTTPS_ADDRESS, "8090");
-          } else {
-            port = getPortFromProperty(yarnConfigProperties, PROPERTY_RESOURCEMANAGER_WEBAPP_ADDRESS, "8088");
-          }
-        } else {
-          // ha mode
-          String rmId = null;
-          for(String id : yarnConfigProperties.get(PROPERTY_RESOURCEMANAGER_HA_RM_IDS).split(",")) {
-            String hostNameProperty = String.format(PROPERTY_RESOURCEMANAGER_HOSTNAME_TEMPLATE, id);
-            String hostNameById =  yarnConfigProperties.get(hostNameProperty);
-            if(hostNameById.equals(hostName)){
-              rmId = id;
-              break;
-            }
-          }
-          if(useHttps) {
-            String httpsAddressPoperty = String.format(PROPERTY_RESOURCEMANAGER_WEBAPP_HTTPS_ADDRESS_TEMPLATE, rmId);
-            port = getPortFromProperty(yarnConfigProperties, httpsAddressPoperty, "8090");
-          } else {
-            String httpAddressPoperty = String.format(PROPERTY_RESOURCEMANAGER_WEBAPP_ADDRESS_TEMPLATE, rmId);
-            port = getPortFromProperty(yarnConfigProperties, httpAddressPoperty, "8088");
-          }
-
-        }
-        template = String.format(template, "%s", port);
-      } catch (AmbariException e) {
-          LOG.debug(String.format("Could not load cluster with name %s. %s", clusterName, e.getMessage()));
-          throw new SystemException(String.format("Could not load cluster with name %s.", clusterName),e);
-      }
-    }
-    return template;
-  }
-
-  private String getPortFromProperty(Map<String, String> propertyMap, String property, String defaultValue) {
-    if(propertyMap.containsKey(property))
-      return propertyMap.get(property).split(":")[1];
-    else
-      return defaultValue;
-  }
-
-  private Object getPropertyValueToSet(Map<String, Object> propertyValueFromJson, Object componentName) throws SystemException {
-    Object result = propertyValueFromJson;
-    //TODO need refactoring for universalization
-    try {
-      if (PROPERTIES_TO_FILTER.get(componentName) != null) {
-        for (String key : PROPERTIES_TO_FILTER.get(componentName).split("/")) {
-          result = ((Map)result).get(key);
-        }
-      }
-    } catch (ClassCastException e) {
-        LOG.error(String.format("Error getting property value for %s. %s", PROPERTIES_TO_FILTER.get(componentName),
-              e.getMessage()));
-        throw new SystemException(String.format("Error getting property value for %s.",
-                PROPERTIES_TO_FILTER.get(componentName)),e);
-    }
-    return result;
-  }
-
-  private void getHttpResponse(Resource r, String url, String propertyIdToSet) throws SystemException {
-    InputStream in = null;
-    try {
-      in = streamProvider.readFrom(url);
-      Type mapType = new TypeToken<Map<String, Object>>(){}.getType();
-      Map<String, Object> propertyValueFromJson = new Gson().fromJson(IOUtils.toString(in, "UTF-8"), mapType);
-      Object propertyValueToSet = getPropertyValueToSet(propertyValueFromJson,
-              r.getPropertyValue(componentNamePropertyId));
-      r.setProperty(propertyIdToSet, propertyValueToSet);
-    }
-    catch (IOException ioe) {
-      LOG.debug("Error reading HTTP response from " + url);
-      r.setProperty(propertyIdToSet, null);
-    } catch (JsonSyntaxException jse) {
-      LOG.error("Error parsing HTTP response from " + url);
-      r.setProperty(propertyIdToSet, null);
-    } finally {
-      if (in != null) {
-        try {
-          in.close();
-        }
-        catch (IOException ioe) {
-          LOG.error("Error closing HTTP response stream " + url);
-        }
-      }
-    }
-    
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/JsonHttpPropertyRequest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/JsonHttpPropertyRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/JsonHttpPropertyRequest.java
new file mode 100644
index 0000000..6a93b4b
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/JsonHttpPropertyRequest.java
@@ -0,0 +1,97 @@
+/**
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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 com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Type;
+import java.util.Map;
+
+/**
+ * Represents an HTTP request to another server for properties to be used to populate an Ambari resource.
+ * The server response is expected to be JSON that can be deserialized into a <code>Map<String, Object>></code>
+ * instance.
+ */
+public abstract class JsonHttpPropertyRequest extends HttpPropertyProvider.HttpPropertyRequest {
+  protected final static Logger LOG = LoggerFactory.getLogger(JsonHttpPropertyRequest.class);
+
+  private static final Type MAP_TYPE = new TypeToken<Map<String, Object>>() {}.getType();
+
+  private static final Gson GSON = new Gson();
+
+
+  // ----- Constructors ----------------------------------------------------
+
+  /**
+   * Create a property request.
+   *
+   * @param propertyMappings  the property name mapping
+   */
+  public JsonHttpPropertyRequest(Map<String, String> propertyMappings) {
+    super(propertyMappings);
+  }
+
+
+  // ----- PropertyRequest -------------------------------------------------
+
+  @Override
+  public void populateResource(Resource resource, InputStream inputStream) throws SystemException {
+
+    try {
+      Map<String, Object> responseMap = GSON.fromJson(IOUtils.toString(inputStream, "UTF-8"), MAP_TYPE);
+
+      for (Map.Entry<String, String> entry : getPropertyMappings().entrySet()) {
+        Object propertyValueToSet = getPropertyValue(responseMap, entry.getKey());
+        resource.setProperty(entry.getValue(), propertyValueToSet);
+      }
+    } catch (IOException e) {
+      throw new SystemException("Error setting properties.", e);
+    }
+  }
+
+
+  // ----- helper methods --------------------------------------------------
+
+  // get the property value from the response map for the given property name
+  private Object getPropertyValue(Map<String, Object> responseMap, String property) throws SystemException {
+    if (property == null) {
+      return null;
+    }
+
+    Object result = responseMap;
+
+    try {
+      for (String key : property.split("/")) {
+        result = ((Map) result).get(key);
+      }
+    } catch (ClassCastException e) {
+      String msg = String.format("Error getting property value for %s.", property);
+      LOG.error(msg, e);
+      throw new SystemException(msg, e);
+    }
+    return result;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ResourceManagerHttpPropertyRequest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ResourceManagerHttpPropertyRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ResourceManagerHttpPropertyRequest.java
new file mode 100644
index 0000000..a74622a
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ResourceManagerHttpPropertyRequest.java
@@ -0,0 +1,122 @@
+/**
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.spi.SystemException;
+import org.apache.ambari.server.state.Cluster;
+
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Resource manager specific HTTP property request.
+ */
+public class ResourceManagerHttpPropertyRequest extends JsonHttpPropertyRequest {
+
+  private static final String CONFIG_YARN_SITE = "yarn-site";
+  private static final String CONFIG_CORE_SITE = "core-site";
+
+  private static final String PROPERTY_YARN_HTTP_POLICY = "yarn.http.policy";
+  private static final String PROPERTY_HADOOP_SSL_ENABLED = "hadoop.ssl.enabled";
+  private static final String PROPERTY_YARN_HTTP_POLICY_VALUE_HTTPS_ONLY = "HTTPS_ONLY";
+  private static final String PROPERTY_HADOOP_SSL_ENABLED_VALUE_TRUE = "true";
+
+  // resource manager properties
+  private static final String PROPERTY_WEBAPP_ADDRESS = "yarn.resourcemanager.webapp.address";
+  private static final String PROPERTY_WEBAPP_HTTPS_ADDRESS = "yarn.resourcemanager.webapp.https.address";
+
+  // resource manager HA properties
+  private static final String PROPERTY_HA_RM_IDS = "yarn.resourcemanager.ha.rm-ids";
+  private static final String PROPERTY_HOSTNAME_TEMPLATE = "yarn.resourcemanager.hostname.%s";
+  private static final String PROPERTY_WEBAPP_ADDRESS_TEMPLATE = "yarn.resourcemanager.webapp.address.%s";
+  private static final String PROPERTY_WEBAPP_HTTPS_ADDRESS_TEMPLATE = "yarn.resourcemanager.webapp.https.address.%s";
+
+  private static final String URL_TEMPLATE = "%s://%s:%s/ws/v1/cluster/info";
+
+  private static final Map<String, String> PROPERTY_MAPPINGS =
+      Collections.singletonMap("clusterInfo/haState", "HostRoles/ha_state");
+
+
+  // ----- Constructors ----------------------------------------------------
+
+  public ResourceManagerHttpPropertyRequest() {
+    super(PROPERTY_MAPPINGS);
+  }
+
+
+  // ----- PropertyRequest -------------------------------------------------
+
+  @Override
+  public String getUrl(Cluster cluster, String hostName)
+      throws SystemException {
+    Map<String, String> yarnConfig = cluster.getDesiredConfigByType(CONFIG_YARN_SITE).getProperties();
+    Map<String, String> coreConfig = cluster.getDesiredConfigByType(CONFIG_CORE_SITE).getProperties();
+
+    String yarnHttpPolicy = yarnConfig.get(PROPERTY_YARN_HTTP_POLICY);
+    String hadoopSslEnabled = coreConfig.get(PROPERTY_HADOOP_SSL_ENABLED);
+
+    boolean useHttps =
+        (yarnHttpPolicy != null && yarnHttpPolicy.equals(PROPERTY_YARN_HTTP_POLICY_VALUE_HTTPS_ONLY)) ||
+            (hadoopSslEnabled != null && hadoopSslEnabled.equals(PROPERTY_HADOOP_SSL_ENABLED_VALUE_TRUE));
+
+    return String.format(URL_TEMPLATE, getProtocol(useHttps), hostName, getPort(hostName, yarnConfig, useHttps));
+  }
+
+
+  // ----- helper methods --------------------------------------------------
+
+  // get the protocal - http or https
+  private String getProtocol(boolean useHttps) {
+    return useHttps ? "https" : "http";
+  }
+
+  // get the port for the HTTP request from the given config
+  private String getPort(String hostName, Map<String, String> yarnConfig, boolean useHttps) {
+    if (yarnConfig.containsKey(PROPERTY_HA_RM_IDS)) {
+      // ha mode
+      String rmId = getConfigResourceManagerId(yarnConfig, hostName);
+      return useHttps ?
+          getConfigPortValue(yarnConfig, String.format(PROPERTY_WEBAPP_HTTPS_ADDRESS_TEMPLATE, rmId), "8090") :
+          getConfigPortValue(yarnConfig, String.format(PROPERTY_WEBAPP_ADDRESS_TEMPLATE, rmId), "8088");
+    }
+    //non ha mode
+    return useHttps ?
+        getConfigPortValue(yarnConfig, PROPERTY_WEBAPP_HTTPS_ADDRESS, "8090") :
+        getConfigPortValue(yarnConfig, PROPERTY_WEBAPP_ADDRESS, "8088");
+  }
+
+  // get the resource manager id from the given config
+  private String getConfigResourceManagerId(Map<String, String> yarnConfig, String hostName) {
+
+    for (String id : yarnConfig.get(PROPERTY_HA_RM_IDS).split(",")) {
+
+      String hostNameProperty = String.format(PROPERTY_HOSTNAME_TEMPLATE, id);
+      String hostNameById = yarnConfig.get(hostNameProperty);
+
+      if (hostNameById.equals(hostName)) {
+        return id;
+      }
+    }
+    return null;
+  }
+
+  // get the port for the HTTP request by splitting off of the property specifed from the given config
+  private String getConfigPortValue(Map<String, String> yarnConfig, String property, String defaultValue) {
+    return yarnConfig.containsKey(property) ? yarnConfig.get(property).split(":")[1] : defaultValue;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py b/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py
index b377757..8c7872a 100644
--- a/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py
@@ -127,3 +127,23 @@ if not len(kafka_broker_hosts) == 0:
   kafka_bootstrap_servers = kafka_broker_hosts[0] + ":" + str(kafka_broker_port)
 
 kafka_zookeeper_connect = default("/configurations/kafka-broker/zookeeper.connect", None)
+
+# atlas HA
+atlas_hosts = sorted(default('/clusterHostInfo/atlas_server_hosts', []))
+
+id = 1
+server_ids = ""
+server_hosts = ""
+first_id = True
+for host in atlas_hosts:
+  server_id = "id" + str(id)
+  server_host = host + ":" + metadata_port
+  if first_id:
+    server_ids = server_id
+    server_hosts = server_host
+  else:
+    server_ids += "," + server_id
+    server_hosts += "\n" + "atlas.server.host." + server_id + "=" + server_host
+
+  id += 1
+  first_id = False

http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/main/resources/stacks/HDP/2.5/services/ATLAS/configuration/application-properties.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.5/services/ATLAS/configuration/application-properties.xml b/ambari-server/src/main/resources/stacks/HDP/2.5/services/ATLAS/configuration/application-properties.xml
new file mode 100644
index 0000000..09cb987
--- /dev/null
+++ b/ambari-server/src/main/resources/stacks/HDP/2.5/services/ATLAS/configuration/application-properties.xml
@@ -0,0 +1,45 @@
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration supports_final="false">
+  <property>
+    <name>atlas.server.ha.enabled</name>
+    <value>false</value>
+    <description>Atlas high availability feature toggle.</description>
+  </property>
+  <property>
+    <name>atlas.server.ids</name>
+    <value>{{server_ids}}</value>
+    <description>List of Atlas server ids for HA feature.</description>
+    <value-attributes>
+      <overridable>false</overridable>
+      <visible>false</visible>
+    </value-attributes>
+  </property>
+  <property>
+    <name>atlas.server.host.id1</name>
+    <value>{{server_hosts}}</value>
+    <description>Mapping of Atlas server ids to hosts.</description>
+    <value-attributes>
+      <overridable>false</overridable>
+      <visible>false</visible>
+    </value-attributes>
+  </property>
+</configuration>

http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/main/resources/stacks/HDP/2.5/services/ATLAS/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.5/services/ATLAS/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.5/services/ATLAS/metainfo.xml
index 7061d6b..a25c2ae 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.5/services/ATLAS/metainfo.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.5/services/ATLAS/metainfo.xml
@@ -24,6 +24,7 @@
       <components>
         <component>
           <name>ATLAS_SERVER</name>
+          <cardinality>1+</cardinality>
           <configFile>
             <type>properties</type>
             <fileName>atlas-application.properties</fileName>

http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AtlasServerHttpPropertyRequestTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AtlasServerHttpPropertyRequestTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AtlasServerHttpPropertyRequestTest.java
new file mode 100644
index 0000000..70a6a9d
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AtlasServerHttpPropertyRequestTest.java
@@ -0,0 +1,81 @@
+/**
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.state.Cluster;
+import org.apache.ambari.server.state.Config;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+/**
+ * AtlasServerHttpPropertyRequest tests.
+ */
+public class AtlasServerHttpPropertyRequestTest {
+
+  @Test
+  public void testGetUrl() throws Exception {
+
+    Cluster cluster = createNiceMock(Cluster.class);
+    Config config = createNiceMock(Config.class);
+
+    Map<String, String> map = new HashMap<>();
+    map.put("atlas.enableTLS", "false");
+    map.put("atlas.server.http.port", "21000");
+
+    expect(cluster.getDesiredConfigByType("application-properties")).andReturn(config).anyTimes();
+    expect(config.getProperties()).andReturn(map).anyTimes();
+
+    replay(cluster, config);
+
+    AtlasServerHttpPropertyRequest propertyRequest = new AtlasServerHttpPropertyRequest();
+
+    String url = propertyRequest.getUrl(cluster, "host1");
+
+    Assert.assertEquals("http://host1:21000/api/atlas/admin/status", url);
+  }
+
+  @Test
+  public void testGetUrl_https() throws Exception {
+
+    Cluster cluster = createNiceMock(Cluster.class);
+    Config config = createNiceMock(Config.class);
+
+    Map<String, String> map = new HashMap<>();
+    map.put("atlas.enableTLS", "true");
+    map.put("atlas.server.https.port", "21443");
+
+    expect(cluster.getDesiredConfigByType("application-properties")).andReturn(config).anyTimes();
+    expect(config.getProperties()).andReturn(map).anyTimes();
+
+    replay(cluster, config);
+
+    AtlasServerHttpPropertyRequest propertyRequest = new AtlasServerHttpPropertyRequest();
+
+    String url = propertyRequest.getUrl(cluster, "host1");
+
+    Assert.assertEquals("https://host1:21443/api/atlas/admin/status", url);
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/84214c5a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HttpPropertyProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HttpPropertyProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HttpPropertyProviderTest.java
index b622728..c4fcca0 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HttpPropertyProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HttpPropertyProviderTest.java
@@ -25,15 +25,12 @@ import static org.easymock.EasyMock.replay;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
-import org.apache.ambari.server.configuration.ComponentSSLConfigurationTest;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
@@ -43,12 +40,7 @@ import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.junit.Assert;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
 
-import com.google.inject.Injector;
-
-@RunWith(Parameterized.class)
 public class HttpPropertyProviderTest {
   private static final String PROPERTY_ID_CLUSTER_NAME = PropertyHelper.getPropertyId("HostRoles", "cluster_name");
   private static final String PROPERTY_ID_HOST_NAME = PropertyHelper.getPropertyId("HostRoles", "host_name");
@@ -57,26 +49,14 @@ public class HttpPropertyProviderTest {
   private static final String PROPERTY_ID_STALE_CONFIGS = PropertyHelper.getPropertyId(
       "HostRoles", "stale_configs");
 
-  private ComponentSSLConfiguration configuration;
-
-  @Parameterized.Parameters
-  public static Collection<Object[]> configs() {
-    ComponentSSLConfiguration configuration1 = ComponentSSLConfigurationTest.getConfiguration(
-        "tspath", "tspass", "tstype", false);
-
-    ComponentSSLConfiguration configuration2 = ComponentSSLConfigurationTest.getConfiguration(
-        "tspath", "tspass", "tstype", true);
-
-    ComponentSSLConfiguration configuration3 = ComponentSSLConfigurationTest.getConfiguration(
-        "tspath", "tspass", "tstype", false);
-
-    return Arrays.asList(new Object[][] { { configuration1 },
-        { configuration2 }, { configuration3 } });
-  }
+  private static final Map<String, List<HttpPropertyProvider.HttpPropertyRequest>> HTTP_PROPERTY_REQUESTS = new HashMap<>();
 
+  static {
+    HTTP_PROPERTY_REQUESTS.put("RESOURCEMANAGER",
+        Collections.<HttpPropertyProvider.HttpPropertyRequest>singletonList(new ResourceManagerHttpPropertyRequest()));
 
-  public HttpPropertyProviderTest(ComponentSSLConfiguration configuration) {
-    this.configuration = configuration;
+    HTTP_PROPERTY_REQUESTS.put("ATLAS_SERVER",
+        Collections.<HttpPropertyProvider.HttpPropertyRequest>singletonList(new AtlasServerHttpPropertyRequest()));
   }
 
   @Test
@@ -85,29 +65,28 @@ public class HttpPropertyProviderTest {
     TestStreamProvider streamProvider = new TestStreamProvider(false);
     Clusters clusters = createNiceMock(Clusters.class);
     Cluster cluster = createNiceMock(Cluster.class);
-    Injector injector = createNiceMock(Injector.class);
     Config config1 = createNiceMock(Config.class);
     Config config2 = createNiceMock(Config.class);
 
-    Map<String, String> map = new HashMap<String, String>();
+    Map<String, String> map = new HashMap<>();
     map.put("yarn.http.policy", "HTTPS_ONLY");
     map.put("yarn.resourcemanager.webapp.https.address", "ec2-54-234-33-50.compute-1.amazonaws.com:8999");
     map.put("yarn.resourcemanager.webapp.address", "ec2-54-234-33-50.compute-1.amazonaws.com:8088");
 
-    expect(injector.getInstance(Clusters.class)).andReturn(clusters);
     expect(clusters.getCluster("testCluster")).andReturn(cluster);
     expect(cluster.getDesiredConfigByType("yarn-site")).andReturn(config1).anyTimes();
     expect(cluster.getDesiredConfigByType("core-site")).andReturn(config2).anyTimes();
     expect(config1.getProperties()).andReturn(map).anyTimes();
     expect(config2.getProperties()).andReturn(new HashMap<String, String>()).anyTimes();
 
-    replay(injector, clusters, cluster, config1, config2);
+    replay(clusters, cluster, config1, config2);
 
-    HttpProxyPropertyProvider propProvider = new HttpProxyPropertyProvider(
-            streamProvider, configuration, injector,
+    HttpPropertyProvider propProvider = new HttpPropertyProvider(
+            streamProvider, clusters,
             PROPERTY_ID_CLUSTER_NAME,
             PROPERTY_ID_HOST_NAME,
-            PROPERTY_ID_COMPONENT_NAME);
+            PROPERTY_ID_COMPONENT_NAME,
+            HTTP_PROPERTY_REQUESTS);
 
     Resource resource = new ResourceImpl(Resource.Type.HostComponent);
 
@@ -130,11 +109,10 @@ public class HttpPropertyProviderTest {
     TestStreamProvider streamProvider = new TestStreamProvider(false);
     Clusters clusters = createNiceMock(Clusters.class);
     Cluster cluster = createNiceMock(Cluster.class);
-    Injector injector = createNiceMock(Injector.class);
     Config config1 = createNiceMock(Config.class);
     Config config2 = createNiceMock(Config.class);
 
-    Map<String, String> map = new HashMap<String, String>();
+    Map<String, String> map = new HashMap<>();
     map.put("yarn.http.policy", "HTTPS_ONLY");
     map.put("yarn.resourcemanager.ha.rm-ids", "rm1,rm2");
     map.put("yarn.resourcemanager.hostname.rm1", "lc6402.ambari.apache.org");
@@ -144,20 +122,20 @@ public class HttpPropertyProviderTest {
     map.put("yarn.resourcemanager.webapp.https.address.rm1", "lc6402.ambari.apache.org:8066");
     map.put("yarn.resourcemanager.webapp.https.address.rm2", "lc6403.ambari.apache.org:8066");
 
-    expect(injector.getInstance(Clusters.class)).andReturn(clusters);
     expect(clusters.getCluster("testCluster")).andReturn(cluster);
     expect(cluster.getDesiredConfigByType("yarn-site")).andReturn(config1).anyTimes();
     expect(cluster.getDesiredConfigByType("core-site")).andReturn(config2).anyTimes();
     expect(config1.getProperties()).andReturn(map).anyTimes();
     expect(config2.getProperties()).andReturn(new HashMap<String, String>()).anyTimes();
 
-    replay(injector, clusters, cluster, config1, config2);
+    replay(clusters, cluster, config1, config2);
 
-    HttpProxyPropertyProvider propProvider = new HttpProxyPropertyProvider(
-        streamProvider, configuration, injector,
+    HttpPropertyProvider propProvider = new HttpPropertyProvider(
+        streamProvider, clusters,
         PROPERTY_ID_CLUSTER_NAME,
         PROPERTY_ID_HOST_NAME,
-        PROPERTY_ID_COMPONENT_NAME);
+        PROPERTY_ID_COMPONENT_NAME,
+        HTTP_PROPERTY_REQUESTS);
 
     Resource resource = new ResourceImpl(Resource.Type.HostComponent);
 
@@ -174,6 +152,85 @@ public class HttpPropertyProviderTest {
         "/ws/v1/cluster/info"));
   }
 
+  @Test
+  public void testPopulateResources_atlasServer() throws Exception {
+
+    TestStreamProvider streamProvider = new TestStreamProvider("{\"Status\":\"ACTIVE\"}", false);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    Config config1 = createNiceMock(Config.class);
+
+    Map<String, String> map = new HashMap<>();
+    map.put("atlas.enableTLS", "false");
+    map.put("atlas.server.http.port", "21000");
+
+    expect(clusters.getCluster("testCluster")).andReturn(cluster);
+    expect(cluster.getDesiredConfigByType("application-properties")).andReturn(config1).anyTimes();
+    expect(config1.getProperties()).andReturn(map).anyTimes();
+
+    replay(clusters, cluster, config1);
+
+    HttpPropertyProvider propProvider = new HttpPropertyProvider(
+        streamProvider, clusters,
+        PROPERTY_ID_CLUSTER_NAME,
+        PROPERTY_ID_HOST_NAME,
+        PROPERTY_ID_COMPONENT_NAME,
+        HTTP_PROPERTY_REQUESTS);
+
+    Resource resource = new ResourceImpl(Resource.Type.HostComponent);
+
+    resource.setProperty(PROPERTY_ID_CLUSTER_NAME, "testCluster");
+    resource.setProperty(PROPERTY_ID_HOST_NAME, "ec2-54-234-33-50.compute-1.amazonaws.com");
+    resource.setProperty(PROPERTY_ID_COMPONENT_NAME, "ATLAS_SERVER");
+
+    Request request = PropertyHelper.getReadRequest(Collections.<String>emptySet());
+
+    propProvider.populateResources(Collections.singleton(resource), request, null);
+
+    Assert.assertEquals("ACTIVE", resource.getPropertiesMap().get("HostRoles").get("ha_state"));
+    Assert.assertEquals("http://ec2-54-234-33-50.compute-1.amazonaws.com:21000/api/atlas/admin/status",
+        streamProvider.getLastSpec());
+  }
+
+  @Test
+  public void testPopulateResources_atlasServer_https() throws Exception {
+
+    TestStreamProvider streamProvider = new TestStreamProvider("{\"Status\":\"ACTIVE\"}", false);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    Config config1 = createNiceMock(Config.class);
+
+    Map<String, String> map = new HashMap<>();
+    map.put("atlas.enableTLS", "true");
+    map.put("atlas.server.https.port", "21443");
+
+    expect(clusters.getCluster("testCluster")).andReturn(cluster);
+    expect(cluster.getDesiredConfigByType("application-properties")).andReturn(config1).anyTimes();
+    expect(config1.getProperties()).andReturn(map).anyTimes();
+
+    replay(clusters, cluster, config1);
+
+    HttpPropertyProvider propProvider = new HttpPropertyProvider(
+        streamProvider, clusters,
+        PROPERTY_ID_CLUSTER_NAME,
+        PROPERTY_ID_HOST_NAME,
+        PROPERTY_ID_COMPONENT_NAME,
+        HTTP_PROPERTY_REQUESTS);
+
+    Resource resource = new ResourceImpl(Resource.Type.HostComponent);
+
+    resource.setProperty(PROPERTY_ID_CLUSTER_NAME, "testCluster");
+    resource.setProperty(PROPERTY_ID_HOST_NAME, "ec2-54-234-33-50.compute-1.amazonaws.com");
+    resource.setProperty(PROPERTY_ID_COMPONENT_NAME, "ATLAS_SERVER");
+
+    Request request = PropertyHelper.getReadRequest(Collections.<String>emptySet());
+
+    propProvider.populateResources(Collections.singleton(resource), request, null);
+
+    Assert.assertEquals("ACTIVE", resource.getPropertiesMap().get("HostRoles").get("ha_state"));
+    Assert.assertEquals("https://ec2-54-234-33-50.compute-1.amazonaws.com:21443/api/atlas/admin/status",
+        streamProvider.getLastSpec());
+  }
 
   @Test
   public void testReadGangliaServer() throws Exception {
@@ -186,13 +243,14 @@ public class HttpPropertyProviderTest {
 
   private Resource doPopulate(String componentName,
       Set<String> requestProperties, StreamProvider streamProvider) throws Exception {
-    Injector injector = createNiceMock(Injector.class);
+    Clusters clusters = createNiceMock(Clusters.class);
 
-    HttpProxyPropertyProvider propProvider = new HttpProxyPropertyProvider(
-       streamProvider, configuration, injector,
+    HttpPropertyProvider propProvider = new HttpPropertyProvider(
+       streamProvider, clusters,
        PROPERTY_ID_CLUSTER_NAME,
        PROPERTY_ID_HOST_NAME,
-       PROPERTY_ID_COMPONENT_NAME);
+       PROPERTY_ID_COMPONENT_NAME,
+       HTTP_PROPERTY_REQUESTS);
 
     Resource resource = new ResourceImpl(Resource.Type.HostComponent);
 
@@ -211,11 +269,18 @@ public class HttpPropertyProviderTest {
     private boolean throwError = false;
     private String lastSpec = null;
     private boolean isLastSpecUpdated;
+    private String responseStr = "{\"alerts\": [{\"Alert Body\": \"Body\"}],\"clusterInfo\": {\"haState\": \"ACTIVE\"},"
+        + " \"hostcounts\": {\"up_hosts\":\"1\", \"down_hosts\":\"0\"}}";
 
     private TestStreamProvider(boolean throwErr) {
       throwError = throwErr;
     }
 
+    private TestStreamProvider(String responseStr, boolean throwErr) {
+      this.responseStr = responseStr;
+      throwError = throwErr;
+    }
+
     @Override
     public InputStream readFrom(String spec) throws IOException {
       if (!isLastSpecUpdated) {
@@ -228,9 +293,8 @@ public class HttpPropertyProviderTest {
         throw new IOException("Fake error");
       }
 
-      String responseStr = "{\"alerts\": [{\"Alert Body\": \"Body\"}],\"clusterInfo\": {\"haState\": \"ACTIVE\"},"
-          + " \"hostcounts\": {\"up_hosts\":\"1\", \"down_hosts\":\"0\"}}";
-        return new ByteArrayInputStream(responseStr.getBytes("UTF-8"));
+
+      return new ByteArrayInputStream(responseStr.getBytes("UTF-8"));
     }
 
     public String getLastSpec() {