You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sr...@apache.org on 2015/11/03 19:09:47 UTC

ambari git commit: AMBARI-13693. Ambari Blueprint sets inconsistent Yarn RM values (DIPAYAN BHOWMICK via srimanth)

Repository: ambari
Updated Branches:
  refs/heads/branch-2.1 30855f280 -> 80d36ec7c


AMBARI-13693. Ambari Blueprint sets inconsistent Yarn RM values (DIPAYAN BHOWMICK via srimanth)


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

Branch: refs/heads/branch-2.1
Commit: 80d36ec7c0f2ccf51a2f62253bfb60b9234ba1ce
Parents: 30855f2
Author: Srimanth Gunturi <sg...@hortonworks.com>
Authored: Tue Nov 3 10:09:32 2015 -0800
Committer: Srimanth Gunturi <sg...@hortonworks.com>
Committed: Tue Nov 3 10:09:32 2015 -0800

----------------------------------------------------------------------
 .../ambari/view/utils/ambari/Services.java      | 67 +++++++++++--------
 .../ambari/view/utils/ambari/ServicesTest.java  | 70 ++++++++++++++++++++
 2 files changed, 111 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/80d36ec7/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/ambari/Services.java
----------------------------------------------------------------------
diff --git a/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/ambari/Services.java b/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/ambari/Services.java
index 421a365..8a50012 100644
--- a/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/ambari/Services.java
+++ b/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/ambari/Services.java
@@ -45,6 +45,11 @@ public class Services {
   private static final String YARN_RESOURCEMANAGER_HA_RM_IDS_KEY = "yarn.resourcemanager.ha.rm-ids";
   private static final String YARN_RESOURCEMANAGER_HTTP_HA_PARTIAL_KEY = "yarn.resourcemanager.webapp.address.";
   private static final String YARN_RESOURCEMANAGER_HTTPS_HA_PARTIAL_KEY = "yarn.resourcemanager.webapp.https.address.";
+  private static final String YARN_RESOURCEMANAGER_HOSTNAME_KEY = "yarn.resourcemanager.hostname";
+  private static final String YARN_RESOURCEMANAGER_HOSTNAME_PARTIAL_KEY = YARN_RESOURCEMANAGER_HOSTNAME_KEY + ".";
+  private static final String YARN_RESOURCEMANAGER_DEFAULT_HTTP_PORT = "8088";
+  private static final String YARN_RESOURCEMANAGER_DEFAULT_HTTPS_PORT = "8090";
+
 
   private static final String YARN_ATS_URL = "yarn.timeline-server.url";
   private final static String YARN_TIMELINE_WEBAPP_HTTP_ADDRESS_KEY = "yarn.timeline-service.webapp.address";
@@ -80,10 +85,9 @@ public class Services {
 
   private String getRMUrlFromClusterConfig() {
     String url;
-    String protocol;
 
-    String haEnabled = ambariApi.getCluster().getConfigurationValue(YARN_SITE, YARN_RESOURCEMANAGER_HA_ENABLED);
-    String httpPolicy = ambariApi.getCluster().getConfigurationValue(YARN_SITE, YARN_HTTP_POLICY);
+    String haEnabled = getYarnConfig(YARN_RESOURCEMANAGER_HA_ENABLED);
+    String httpPolicy = getYarnConfig(YARN_HTTP_POLICY);
 
     if (!(HTTP_ONLY.equals(httpPolicy) || HTTPS_ONLY.equals(httpPolicy))) {
       LOG.error(String.format("RA030 Unknown value %s of yarn-site/yarn.http.policy. HTTP_ONLY assumed.", httpPolicy));
@@ -94,34 +98,32 @@ public class Services {
       String[] urls = getRMHAUrls(httpPolicy);
       url = getActiveRMUrl(urls);
     } else {
-      if (httpPolicy.equals(HTTPS_ONLY)) {
-        protocol = "https";
-        url = ambariApi.getCluster().getConfigurationValue(YARN_SITE, YARN_RESOURCEMANAGER_HTTPS_KEY);
-      } else {
-        protocol = "http";
-        url = ambariApi.getCluster().getConfigurationValue(YARN_SITE, YARN_RESOURCEMANAGER_HTTP_KEY);
+      url =  (httpPolicy.equals(HTTPS_ONLY)) ? getYarnConfig(YARN_RESOURCEMANAGER_HTTPS_KEY)
+        : getYarnConfig(YARN_RESOURCEMANAGER_HTTP_KEY);
+
+      if (url == null || url.isEmpty()) {
+        url = getYarnConfig(YARN_RESOURCEMANAGER_HOSTNAME_KEY).trim() + ":" + getDefaultRMPort(httpPolicy);
       }
-      url = addProtocolIfMissing(url, protocol);
+
+      url = addProtocolIfMissing(url, getProtocol(httpPolicy));
     }
     return url;
   }
 
   private String[] getRMHAUrls(String httpPolicy) {
-    String haRmIds = ambariApi.getCluster().getConfigurationValue(YARN_SITE, YARN_RESOURCEMANAGER_HA_RM_IDS_KEY);
+    String haRmIds = getYarnConfig(YARN_RESOURCEMANAGER_HA_RM_IDS_KEY);
     String[] ids = haRmIds.split(",");
     int index = 0;
     String[] urls = new String[ids.length];
     for (String id : ids) {
-      String url, protocol;
-      if (HTTPS_ONLY.equals(httpPolicy)) {
-        url = ambariApi.getCluster().getConfigurationValue(YARN_SITE, YARN_RESOURCEMANAGER_HTTPS_HA_PARTIAL_KEY + id);
-        protocol = "https";
-      } else {
-        url = ambariApi.getCluster().getConfigurationValue(YARN_SITE, YARN_RESOURCEMANAGER_HTTP_HA_PARTIAL_KEY + id);
-        protocol = "http";
+      String url = (HTTPS_ONLY.equals(httpPolicy)) ? getYarnConfig(YARN_RESOURCEMANAGER_HTTPS_HA_PARTIAL_KEY + id)
+        : getYarnConfig(YARN_RESOURCEMANAGER_HTTP_HA_PARTIAL_KEY + id);
+
+      if (url == null || url.isEmpty()) {
+        url = getYarnConfig(YARN_RESOURCEMANAGER_HOSTNAME_PARTIAL_KEY + id).trim() + ":" + getDefaultRMPort(httpPolicy);
       }
 
-      urls[index++] = addProtocolIfMissing(url.trim(), protocol);
+      urls[index++] = addProtocolIfMissing(url.trim(), getProtocol(httpPolicy));
     }
     return urls;
   }
@@ -267,9 +269,8 @@ public class Services {
 
   private String getATSUrlFromCluster() {
     String url;
-    String protocol;
 
-    String httpPolicy = ambariApi.getCluster().getConfigurationValue(YARN_SITE, YARN_HTTP_POLICY);
+    String httpPolicy = getYarnConfig(YARN_HTTP_POLICY);
 
     if (!(HTTP_ONLY.equals(httpPolicy) || HTTPS_ONLY.equals(httpPolicy))) {
       LOG.error(String.format("RA030 Unknown value %s of yarn-site/yarn.http.policy. HTTP_ONLY assumed.", httpPolicy));
@@ -277,13 +278,11 @@ public class Services {
     }
 
     if (httpPolicy.equals(HTTPS_ONLY)) {
-      protocol = "https";
-      url = ambariApi.getCluster().getConfigurationValue(YARN_SITE, YARN_TIMELINE_WEBAPP_HTTPS_ADDRESS_KEY);
+      url = getYarnConfig(YARN_TIMELINE_WEBAPP_HTTPS_ADDRESS_KEY);
     } else {
-      protocol = "http";
-      url = ambariApi.getCluster().getConfigurationValue(YARN_SITE, YARN_TIMELINE_WEBAPP_HTTP_ADDRESS_KEY);
+      url = getYarnConfig(YARN_TIMELINE_WEBAPP_HTTP_ADDRESS_KEY);
     }
-    url = addProtocolIfMissing(url, protocol);
+    url = addProtocolIfMissing(url, getProtocol(httpPolicy));
 
     return url;
   }
@@ -317,4 +316,20 @@ public class Services {
   public static boolean hasProtocol(String url) {
     return url.matches("^[^:]+://.*$");
   }
+
+  private String getProtocol(String yarnHttpPolicyConfig) {
+    return HTTPS_ONLY.equals(yarnHttpPolicyConfig) ? "https" : "http";
+  }
+
+  private String getYarnConfig(String key) {
+    return ambariApi.getCluster().getConfigurationValue(YARN_SITE, key);
+  }
+
+  /**
+   * @param yarnHttpPolicy - The HTTP Policy configured in YARN site file
+   * @return The default resource manager port depending on the http policy
+   */
+  private String getDefaultRMPort(String yarnHttpPolicy) {
+    return (HTTPS_ONLY.equals(yarnHttpPolicy)) ? YARN_RESOURCEMANAGER_DEFAULT_HTTPS_PORT : YARN_RESOURCEMANAGER_DEFAULT_HTTP_PORT;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/80d36ec7/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/ambari/ServicesTest.java
----------------------------------------------------------------------
diff --git a/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/ambari/ServicesTest.java b/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/ambari/ServicesTest.java
index 5d8918d..1cf5747 100644
--- a/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/ambari/ServicesTest.java
+++ b/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/ambari/ServicesTest.java
@@ -41,6 +41,8 @@ public class ServicesTest extends EasyMockSupport {
   private static final String HTTP_RM_URL2 = "http://c2.ambari.apache.org:8088";
   private static final String HTTPS_RM_URL1 = "https://c1.ambari.apache.org:8088";
   private static final String HTTPS_RM_URL2 = "https://c2.ambari.apache.org:8088";
+  private static final String RM_URL1_HOST = "c1.ambari.apache.org";
+  private static final String RM_URL2_HOST = "c2.ambari.apache.org";
   private static final String RM_URL1_HOST_PORT = "c1.ambari.apache.org:8088";
   private static final String RM_URL2_HOST_PORT = "c2.ambari.apache.org:8088";
   private static final String RM_INFO_API_ENDPOINT = Services.RM_INFO_API_ENDPOINT;
@@ -274,6 +276,59 @@ public class ServicesTest extends EasyMockSupport {
   }
 
   @Test
+  public void shouldConnectToDefaultHostPortInClusterModeWhenWebaddressConfigIsEmpty() throws Exception {
+    ViewContext viewContext = getViewContext(new HashMap<String, String>());
+    AmbariApi ambariApi = createNiceMock(AmbariApi.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+
+    expect(ambariApi.isClusterAssociated()).andReturn(true).anyTimes();
+    setClusterExpectationWithEmptyWebappConfig(cluster, "HTTP_ONLY");
+    expect(ambariApi.getCluster()).andReturn(cluster).anyTimes();
+
+    Services services = new Services(ambariApi, viewContext);
+
+    replayAll();
+    assertEquals("http://" + RM_URL1_HOST + ":8088", services.getRMUrl());
+
+    reset(cluster);
+    setClusterExpectationWithEmptyWebappConfig(cluster, "HTTPS_ONLY");
+    replay(cluster);
+
+    assertEquals("https://" + RM_URL1_HOST + ":8090", services.getRMUrl());
+
+  }
+
+  @Test
+  public void shouldConnectToDefaultHostPortInClusterModeWithHAWhenWebaddressConfigIsEmpty() throws Exception {
+    ViewContext viewContext = getViewContext(new HashMap<String, String>());
+    AmbariApi ambariApi = createNiceMock(AmbariApi.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    URLStreamProvider urlStreamProvider = createNiceMock(URLStreamProvider.class);
+
+    expect(ambariApi.isClusterAssociated()).andReturn(true).anyTimes();
+    setClusterExpectationInHAWithEmptyWebappConfig(cluster, "HTTP_ONLY");
+    expect(ambariApi.getCluster()).andReturn(cluster).anyTimes();
+
+    Services services = new Services(ambariApi, viewContext);
+
+    InputStream inputStream = IOUtils.toInputStream("{\"clusterInfo\": {\"haState\": \"ACTIVE\"}}");
+    expect(viewContext.getURLStreamProvider()).andReturn(urlStreamProvider).anyTimes();
+    expect(urlStreamProvider.readFrom(eq("http://" + RM_URL1_HOST + ":8088" + RM_INFO_API_ENDPOINT), eq("GET"), anyString(), EasyMock.<Map<String, String>>anyObject())).andReturn(inputStream);
+
+    replayAll();
+    assertEquals("http://" + RM_URL1_HOST + ":8088", services.getRMUrl());
+
+    reset(cluster, urlStreamProvider);
+    setClusterExpectationInHAWithEmptyWebappConfig(cluster, "HTTPS_ONLY");
+    inputStream = IOUtils.toInputStream("{\"clusterInfo\": {\"haState\": \"ACTIVE\"}}");
+    expect(urlStreamProvider.readFrom(eq("https://" + RM_URL1_HOST + ":8090" + RM_INFO_API_ENDPOINT), eq("GET"), anyString(), EasyMock.<Map<String, String>>anyObject())).andReturn(inputStream);
+    replay(cluster, urlStreamProvider);
+
+    assertEquals("https://" + RM_URL1_HOST + ":8090", services.getRMUrl());
+
+  }
+
+  @Test
   public void shouldFetchRMUrlsWhileHAEnabledInClusterMode() throws Exception {
     ViewContext viewContext = getViewContext(new HashMap<String, String>());
     AmbariApi ambariApi = createNiceMock(AmbariApi.class);
@@ -341,6 +396,21 @@ public class ServicesTest extends EasyMockSupport {
     expect(cluster.getConfigurationValue("yarn-site", "yarn.resourcemanager.webapp.https.address.rm2")).andReturn(RM_URL2_HOST_PORT);
   }
 
+  private void setClusterExpectationInHAWithEmptyWebappConfig(Cluster cluster, String httpPolicy) {
+    expect(cluster.getConfigurationValue("yarn-site", "yarn.resourcemanager.ha.enabled")).andReturn("true");
+    expect(cluster.getConfigurationValue("yarn-site", "yarn.http.policy")).andReturn(httpPolicy);
+    expect(cluster.getConfigurationValue("yarn-site", "yarn.resourcemanager.ha.rm-ids")).andReturn("rm1,rm2");
+    expect(cluster.getConfigurationValue("yarn-site", "yarn.resourcemanager.hostname.rm1")).andReturn(RM_URL1_HOST);
+    expect(cluster.getConfigurationValue("yarn-site", "yarn.resourcemanager.hostname.rm2")).andReturn(RM_URL2_HOST);
+
+  }
+
+  private void setClusterExpectationWithEmptyWebappConfig(Cluster cluster, String httpPolicy) {
+    expect(cluster.getConfigurationValue("yarn-site", "yarn.resourcemanager.ha.enabled")).andReturn("false");
+    expect(cluster.getConfigurationValue("yarn-site", "yarn.http.policy")).andReturn(httpPolicy);
+    expect(cluster.getConfigurationValue("yarn-site", "yarn.resourcemanager.hostname")).andReturn(RM_URL1_HOST);
+  }
+
   private ViewContext getViewContext(Map<String, String> map) {
     ViewContext viewContextMock = createNiceMock(ViewContext.class);
     expect(viewContextMock.getProperties()).andReturn(map);