You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by br...@apache.org on 2021/02/18 08:59:32 UTC

[hadoop] branch branch-3.3 updated: YARN-10361. Make custom DAO classes configurable into RMWebApp#JAXBContextResolver.

This is an automated email from the ASF dual-hosted git repository.

brahma pushed a commit to branch branch-3.3
in repository https://gitbox.apache.org/repos/asf/hadoop.git


The following commit(s) were added to refs/heads/branch-3.3 by this push:
     new 72904c0  YARN-10361. Make custom DAO classes configurable into RMWebApp#JAXBContextResolver.
72904c0 is described below

commit 72904c014d9139322d8f2920fe7747fb45242e0b
Author: Prabhu Joseph <pr...@apache.org>
AuthorDate: Wed Aug 5 20:51:04 2020 +0530

    YARN-10361. Make custom DAO classes configurable into RMWebApp#JAXBContextResolver.
    
    Contributed by Bilwa ST.
    
    (cherry picked from commit c7e71a6c0beb2748988b339a851a129b5e57f8c4)
---
 .../apache/hadoop/yarn/conf/YarnConfiguration.java |  8 ++-
 .../src/main/resources/yarn-default.xml            | 18 ++++++-
 .../webapp/JAXBContextResolver.java                | 58 ++++++++++++++++++++--
 3 files changed, 78 insertions(+), 6 deletions(-)

diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java
index b725222..14aa00a 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java
@@ -2454,7 +2454,13 @@ public class YarnConfiguration extends Configuration {
       "yarn.http.rmwebapp.external.classes";
 
   public static final String YARN_HTTP_WEBAPP_SCHEDULER_PAGE =
-      "hadoop.http.rmwebapp.scheduler.page.class";
+      "yarn.http.rmwebapp.scheduler.page.class";
+
+  public static final String YARN_HTTP_WEBAPP_CUSTOM_DAO_CLASSES =
+      "yarn.http.rmwebapp.custom.dao.classes";
+
+  public static final String YARN_HTTP_WEBAPP_CUSTOM_UNWRAPPED_DAO_CLASSES =
+      "yarn.http.rmwebapp.custom.unwrapped.dao.classes";
 
   /**
    * Whether or not users are allowed to request that Docker containers honor
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml
index 4c0aca9..8f0de6b 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml
@@ -3444,10 +3444,26 @@
     <description>
     Used to specify custom scheduler page
     </description>
-    <name>hadoop.http.rmwebapp.scheduler.page.class</name>
+    <name>yarn.http.rmwebapp.scheduler.page.class</name>
     <value></value>
   </property>
 
+  <property>
+    <description>
+    Used to specify custom DAO classes used by custom web services.
+    </description>
+    <name>yarn.http.rmwebapp.custom.dao.classes</name>
+    <value></value>
+  </property>
+
+  <property>
+    <description>
+    Used to specify custom DAO classes used by custom web services which requires
+    root unwrapping.
+    </description>
+    <name>yarn.http.rmwebapp.custom.unwrapped.dao.classes</name>
+    <value></value>
+  </property>
 
   <property>
     <description>The Node Label script to run. Script output Line starting with
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/JAXBContextResolver.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/JAXBContextResolver.java
index f6eb2ad..a31434b 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/JAXBContextResolver.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/JAXBContextResolver.java
@@ -18,6 +18,7 @@
 
 package org.apache.hadoop.yarn.server.resourcemanager.webapp;
 
+import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.sun.jersey.api.json.JSONConfiguration;
 import com.sun.jersey.api.json.JSONJAXBContext;
@@ -28,6 +29,10 @@ import javax.ws.rs.ext.ContextResolver;
 import javax.ws.rs.ext.Provider;
 import javax.xml.bind.JAXBContext;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.UserInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.*;
 import org.apache.hadoop.yarn.webapp.RemoteExceptionData;
@@ -36,9 +41,17 @@ import org.apache.hadoop.yarn.webapp.RemoteExceptionData;
 @Provider
 public class JAXBContextResolver implements ContextResolver<JAXBContext> {
 
+  private static final Log LOG =
+      LogFactory.getLog(JAXBContextResolver.class.getName());
+
   private final Map<Class, JAXBContext> typesContextMap;
 
   public JAXBContextResolver() throws Exception {
+    this(new Configuration());
+  }
+
+  @Inject
+  public JAXBContextResolver(Configuration conf) throws Exception {
 
     JAXBContext context;
     JAXBContext unWrappedRootContext;
@@ -65,17 +78,54 @@ public class JAXBContextResolver implements ContextResolver<JAXBContext> {
             DelegationToken.class, AppQueue.class, AppPriority.class,
             ResourceOptionInfo.class };
 
+    ArrayList<Class> finalcTypesList = new ArrayList<>();
+    ArrayList<Class> finalRootUnwrappedTypesList = new ArrayList<>();
+
+    Collections.addAll(finalcTypesList, cTypes);
+    Collections.addAll(finalRootUnwrappedTypesList, rootUnwrappedTypes);
+
+    // Add Custom DAO Classes
+    Class[] daoClasses = null;
+    Class[] unwrappedDaoClasses = null;
+    boolean loadCustom = true;
+    try {
+      daoClasses = conf
+          .getClasses(YarnConfiguration.YARN_HTTP_WEBAPP_CUSTOM_DAO_CLASSES);
+      unwrappedDaoClasses = conf.getClasses(
+          YarnConfiguration.YARN_HTTP_WEBAPP_CUSTOM_UNWRAPPED_DAO_CLASSES);
+    } catch (Exception e) {
+      LOG.warn("Failed to load custom dao class: " + e);
+      loadCustom = false;
+    }
+
+    if (loadCustom) {
+      if (daoClasses != null) {
+        Collections.addAll(finalcTypesList, daoClasses);
+        LOG.debug("Added custom dao classes: " + Arrays.toString(daoClasses));
+      }
+      if (unwrappedDaoClasses != null) {
+        Collections.addAll(finalRootUnwrappedTypesList, unwrappedDaoClasses);
+        LOG.debug("Added custom Unwrapped dao classes: "
+            + Arrays.toString(unwrappedDaoClasses));
+      }
+    }
+
+    final Class[] finalcTypes = finalcTypesList
+        .toArray(new Class[finalcTypesList.size()]);
+    final Class[] finalRootUnwrappedTypes = finalRootUnwrappedTypesList
+        .toArray(new Class[finalRootUnwrappedTypesList.size()]);
+
     this.typesContextMap = new HashMap<Class, JAXBContext>();
     context =
         new JSONJAXBContext(JSONConfiguration.natural().rootUnwrapping(false)
-          .build(), cTypes);
+          .build(), finalcTypes);
     unWrappedRootContext =
         new JSONJAXBContext(JSONConfiguration.natural().rootUnwrapping(true)
-          .build(), rootUnwrappedTypes);
-    for (Class type : cTypes) {
+          .build(), finalRootUnwrappedTypes);
+    for (Class type : finalcTypes) {
       typesContextMap.put(type, context);
     }
-    for (Class type : rootUnwrappedTypes) {
+    for (Class type : finalRootUnwrappedTypes) {
       typesContextMap.put(type, unWrappedRootContext);
     }
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org