Browse Source

YARN-10218. [GPG] Support HTTPS in GPG. (#5945) Contributed by Shilun Fan.

Reviewed-by: Inigo Goiri <inigoiri@apache.org>
Signed-off-by: Shilun Fan <slfan1989@apache.org>
slfan1989 1 năm trước cách đây
mục cha
commit
ff1570acfa

+ 17 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/GPGUtils.java

@@ -19,13 +19,20 @@
 package org.apache.hadoop.yarn.server.globalpolicygenerator;
 
 import static javax.servlet.http.HttpServletResponse.SC_OK;
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWSConsts.RM_WEB_SERVICE_PATH;
+import static org.apache.hadoop.yarn.webapp.util.WebAppUtils.HTTPS_PREFIX;
+import static org.apache.hadoop.yarn.webapp.util.WebAppUtils.HTTP_PREFIX;
 
+import java.net.InetSocketAddress;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
 import javax.ws.rs.core.MediaType;
 
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.net.NetUtils;
+import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
 import org.apache.hadoop.yarn.server.federation.store.records.SubClusterId;
 import org.apache.hadoop.yarn.server.federation.store.records.SubClusterIdInfo;
@@ -51,16 +58,23 @@ public final class GPGUtils {
    * @param webAddr WebAddress.
    * @param path url path.
    * @param returnType return type.
+   * @param conf configuration.
    * @return response entity.
    */
-  public static <T> T invokeRMWebService(String webAddr, String path, final Class<T> returnType) {
+  public static <T> T invokeRMWebService(String webAddr, String path, final Class<T> returnType,
+      Configuration conf) {
     Client client = Client.create();
     T obj;
 
-    WebResource webResource = client.resource(webAddr);
+    // webAddr stores the form of host:port in subClusterInfo
+    InetSocketAddress socketAddress = NetUtils
+        .getConnectAddress(NetUtils.createSocketAddr(webAddr));
+    String scheme = YarnConfiguration.useHttps(conf) ? HTTPS_PREFIX : HTTP_PREFIX;
+    String webAddress = scheme + socketAddress.getHostName() + ":" + socketAddress.getPort();
+    WebResource webResource = client.resource(webAddress);
     ClientResponse response = null;
     try {
-      response = webResource.path("ws/v1/cluster").path(path)
+      response = webResource.path(RM_WEB_SERVICE_PATH).path(path)
           .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
       if (response.getStatus() == SC_OK) {
         obj = response.getEntity(returnType);

+ 3 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/GlobalPolicyGenerator.java

@@ -49,6 +49,7 @@ import org.apache.hadoop.yarn.server.globalpolicygenerator.webapp.GPGWebApp;
 import org.apache.hadoop.yarn.webapp.WebApp;
 import org.apache.hadoop.yarn.webapp.WebApps;
 import org.apache.hadoop.yarn.webapp.util.WebAppUtils;
+import org.apache.hadoop.yarn.webapp.util.WebServiceClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -131,6 +132,7 @@ public class GlobalPolicyGenerator extends CompositeService {
 
     // super.serviceInit after all services are added
     super.serviceInit(conf);
+    WebServiceClient.initialize(conf);
   }
 
   @Override
@@ -207,6 +209,7 @@ public class GlobalPolicyGenerator extends CompositeService {
     }
     DefaultMetricsSystem.shutdown();
     super.serviceStop();
+    WebServiceClient.destroy();
   }
 
   public String getName() {

+ 3 - 4
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/policygenerator/PolicyGenerator.java

@@ -159,7 +159,7 @@ public class PolicyGenerator implements Runnable, Configurable {
           clusterInfo.put(sci.getSubClusterId(), new HashMap<>());
         }
         Object ret = GPGUtils.invokeRMWebService(sci.getRMWebServiceAddress(),
-            e.getValue(), e.getKey());
+            e.getValue(), e.getKey(), getConf());
         clusterInfo.get(sci.getSubClusterId()).put(e.getKey(), ret);
       }
     }
@@ -181,12 +181,11 @@ public class PolicyGenerator implements Runnable, Configurable {
     for (SubClusterInfo sci : activeSubClusters.values()) {
       SchedulerTypeInfo sti = GPGUtils
           .invokeRMWebService(sci.getRMWebServiceAddress(),
-              RMWSConsts.SCHEDULER, SchedulerTypeInfo.class);
+              RMWSConsts.SCHEDULER, SchedulerTypeInfo.class, getConf());
       if(sti != null){
         schedInfo.put(sci.getSubClusterId(), sti.getSchedulerInfo());
       } else {
-        LOG.warn("Skipped null scheduler info from SubCluster " + sci
-            .getSubClusterId().toString());
+        LOG.warn("Skipped null scheduler info from SubCluster {}.", sci.getSubClusterId());
       }
     }
     return schedInfo;

+ 11 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/test/java/org/apache/hadoop/yarn/server/globalpolicygenerator/policygenerator/TestPolicyGenerator.java

@@ -22,6 +22,7 @@ import com.sun.jersey.api.json.JSONConfiguration;
 import com.sun.jersey.api.json.JSONJAXBContext;
 import com.sun.jersey.api.json.JSONUnmarshaller;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.net.NetUtils;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.exceptions.YarnException;
 import org.apache.hadoop.yarn.server.federation.policies.manager.FederationPolicyManager;
@@ -60,6 +61,7 @@ import org.mockito.ArgumentCaptor;
 import javax.xml.bind.JAXBException;
 import java.io.IOException;
 import java.io.StringReader;
+import java.net.InetSocketAddress;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -294,8 +296,10 @@ public class TestPolicyGenerator {
     resourceManager.start();
 
     String rmAddress = WebAppUtils.getRMWebAppURLWithScheme(this.conf);
-    SchedulerTypeInfo sti = GPGUtils.invokeRMWebService(rmAddress, RMWSConsts.SCHEDULER,
-        SchedulerTypeInfo.class);
+    String webAppAddress = getServiceAddress(NetUtils.createSocketAddr(rmAddress));
+
+    SchedulerTypeInfo sti = GPGUtils.invokeRMWebService(webAppAddress, RMWSConsts.SCHEDULER,
+        SchedulerTypeInfo.class, this.conf);
 
     Assert.assertNotNull(sti);
     SchedulerInfo schedulerInfo = sti.getSchedulerInfo();
@@ -346,6 +350,11 @@ public class TestPolicyGenerator {
     Assert.assertEquals(20f, queueB3.getCapacity(), 0.00001);
   }
 
+  private String getServiceAddress(InetSocketAddress address) {
+    InetSocketAddress socketAddress = NetUtils.getConnectAddress(address);
+    return socketAddress.getAddress().getHostAddress() + ":" + socketAddress.getPort();
+  }
+
   /**
    * Testable policy generator overrides the methods that communicate
    * with the RM REST endpoint, allowing us to inject faked responses.