From 77a4b014e6407ad7d0f6110a6ac96e9d31b1a4e8 Mon Sep 17 00:00:00 2001 From: Zhijie Shen Date: Fri, 29 Aug 2014 09:40:39 -0700 Subject: [PATCH] YARN-2449. Fixed the bug that TimelineAuthenticationFilterInitializer is not automatically added when hadoop.http.filter.initializers is not configured. Contributed by Varun Vasudev. (cherry picked from commit 4bd0194e6be68421eb1dc87f9f031626112e4c50) --- hadoop-yarn-project/CHANGES.txt | 4 +++ .../ApplicationHistoryServer.java | 5 ++- .../TestApplicationHistoryServer.java | 35 +++++++++++++------ 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index ba70867502e..5fba3bc1c1f 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -231,6 +231,10 @@ Release 2.6.0 - UNRELEASED YARN-2405. NPE in FairSchedulerAppsBlock. (Tsuyoshi Ozawa via kasha) + YARN-2449. Fixed the bug that TimelineAuthenticationFilterInitializer + is not automatically added when hadoop.http.filter.initializers is not + configured. (Varun Vasudev via zjshen) + Release 2.5.1 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/ApplicationHistoryServer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/ApplicationHistoryServer.java index c61b80e1993..6ec0d4221f0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/ApplicationHistoryServer.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/ApplicationHistoryServer.java @@ -197,6 +197,7 @@ public class ApplicationHistoryServer extends CompositeService { // the customized filter will be loaded by the timeline server to do Kerberos // + DT authentication. String initializers = conf.get("hadoop.http.filter.initializers"); + boolean modifiedInitialiers = false; initializers = initializers == null || initializers.length() == 0 ? "" : initializers; @@ -206,6 +207,7 @@ public class ApplicationHistoryServer extends CompositeService { initializers = TimelineAuthenticationFilterInitializer.class.getName() + "," + initializers; + modifiedInitialiers = true; } String[] parts = initializers.split(","); @@ -214,13 +216,14 @@ public class ApplicationHistoryServer extends CompositeService { filterInitializer = filterInitializer.trim(); if (filterInitializer.equals(AuthenticationFilterInitializer.class .getName())) { + modifiedInitialiers = true; continue; } target.add(filterInitializer); } String actualInitializers = org.apache.commons.lang.StringUtils.join(target, ","); - if (!actualInitializers.equals(initializers)) { + if (modifiedInitialiers) { conf.set("hadoop.http.filter.initializers", actualInitializers); } String bindAddress = WebAppUtils.getWebAppBindURL(conf, diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestApplicationHistoryServer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestApplicationHistoryServer.java index bcd8e454c5e..807d2df3c8f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestApplicationHistoryServer.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestApplicationHistoryServer.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.http.lib.StaticUserWebFilter; import org.apache.hadoop.security.AuthenticationFilterInitializer; import org.apache.hadoop.service.Service.STATE; import org.apache.hadoop.util.ExitUtil; @@ -33,6 +34,9 @@ import org.junit.After; import org.junit.Assert; import org.junit.Test; +import java.util.HashMap; +import java.util.Map; + public class TestApplicationHistoryServer { ApplicationHistoryServer historyServer = null; @@ -75,23 +79,32 @@ public class TestApplicationHistoryServer { @Test(timeout = 50000) public void testFilteOverrides() throws Exception { - String[] filterInitializers = - { - AuthenticationFilterInitializer.class.getName(), - TimelineAuthenticationFilterInitializer.class.getName(), - AuthenticationFilterInitializer.class.getName() + "," - + TimelineAuthenticationFilterInitializer.class.getName(), - AuthenticationFilterInitializer.class.getName() + ", " - + TimelineAuthenticationFilterInitializer.class.getName() }; - for (String filterInitializer : filterInitializers) { + HashMap driver = new HashMap(); + driver.put("", TimelineAuthenticationFilterInitializer.class.getName()); + driver.put(StaticUserWebFilter.class.getName(), + TimelineAuthenticationFilterInitializer.class.getName() + "," + + StaticUserWebFilter.class.getName()); + driver.put(AuthenticationFilterInitializer.class.getName(), + TimelineAuthenticationFilterInitializer.class.getName()); + driver.put(TimelineAuthenticationFilterInitializer.class.getName(), + TimelineAuthenticationFilterInitializer.class.getName()); + driver.put(AuthenticationFilterInitializer.class.getName() + "," + + TimelineAuthenticationFilterInitializer.class.getName(), + TimelineAuthenticationFilterInitializer.class.getName()); + driver.put(AuthenticationFilterInitializer.class.getName() + ", " + + TimelineAuthenticationFilterInitializer.class.getName(), + TimelineAuthenticationFilterInitializer.class.getName()); + + for (Map.Entry entry : driver.entrySet()) { + String filterInitializer = entry.getKey(); + String expectedValue = entry.getValue(); historyServer = new ApplicationHistoryServer(); Configuration config = new YarnConfiguration(); config.set("hadoop.http.filter.initializers", filterInitializer); historyServer.init(config); historyServer.start(); Configuration tmp = historyServer.getConfig(); - assertEquals(TimelineAuthenticationFilterInitializer.class.getName(), - tmp.get("hadoop.http.filter.initializers")); + assertEquals(expectedValue, tmp.get("hadoop.http.filter.initializers")); historyServer.stop(); AHSWebApp.resetInstance(); }