You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by km...@apache.org on 2013/09/17 03:54:14 UTC

git commit: Switch WebHdfsDeploymentContributor to using file based rules. Change based WebHdfs URL to exclude version number.

Updated Branches:
  refs/heads/master 1c2727cc2 -> 5467a33da


Switch WebHdfsDeploymentContributor to using file based rules.
Change based WebHdfs URL to exclude version number.


Project: http://git-wip-us.apache.org/repos/asf/incubator-knox/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-knox/commit/5467a33d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-knox/tree/5467a33d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-knox/diff/5467a33d

Branch: refs/heads/master
Commit: 5467a33da724eb0e01aa4285e413ae1a82514b1b
Parents: 1c2727c
Author: Kevin Minder <ke...@hortonworks.com>
Authored: Mon Sep 16 21:53:48 2013 -0400
Committer: Kevin Minder <ke...@hortonworks.com>
Committed: Mon Sep 16 21:54:09 2013 -0400

----------------------------------------------------------------------
 .../src/main/resources/clusters/demo.xml        |   2 +-
 .../rewrite/api/UrlRewriteServletFilter.java    |  13 ++
 .../filter/rewrite/impl/UrlRewriteRequest.java  |  22 +--
 .../filter/rewrite/impl/UrlRewriteResponse.java |  18 +--
 .../gateway/filter/rewrite/impl/rewrite.xml     |  14 +-
 gateway-release/home/INSTALL                    |   4 +-
 gateway-release/home/deployments/sample.xml     |   2 +-
 gateway-release/home/templates/sample.conf      |   2 +-
 gateway-release/home/templates/sample.xml       |   2 +-
 .../hadoop/gateway/filter/JaasLoginFilter.java  |   3 -
 .../src/main/resources/cluster-sample.xml       |   2 +-
 .../builder/PropertyTopologyBuilderTest.java    |   2 +-
 .../topology/xml/TopologyRulesModuleTest.java   |   4 +-
 .../gateway/topology/file/topology-one.xml      |   2 +-
 .../gateway/topology/file/topology-three.xml    |   2 +-
 .../gateway/topology/file/topology-two.xml      |   2 +-
 .../xml/simple-topology-ambari-format.conf      |   2 +-
 .../xml/simple-topology-knox-format.xml         |   2 +-
 .../hdfs/WebHdfsDeploymentContributor.java      | 137 +++++++++++--------
 .../WebHdfsDeploymentContributor/rewrite.xml    |  62 +++++++++
 .../oozie/OozieDeploymentContributor.java       |   2 +-
 .../ServiceDeploymentContributorBase.java       |  18 ++-
 .../hadoop/gateway/GatewayBasicFuncTest.java    |  62 ++++-----
 .../hadoop/gateway/GatewayFuncTestDriver.java   |  38 ++---
 .../deploy/DeploymentFactoryFuncTest.java       |   2 +-
 hsso-release/home/deployments/sample.xml        |   2 +-
 hsso-release/home/templates/topology.xml        |   2 +-
 pom.xml                                         |   5 +
 28 files changed, 263 insertions(+), 167 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-demo/src/main/resources/clusters/demo.xml
----------------------------------------------------------------------
diff --git a/gateway-demo/src/main/resources/clusters/demo.xml b/gateway-demo/src/main/resources/clusters/demo.xml
index ea66063..dec7ea4 100644
--- a/gateway-demo/src/main/resources/clusters/demo.xml
+++ b/gateway-demo/src/main/resources/clusters/demo.xml
@@ -20,6 +20,6 @@
 <topology>
     <service>
         <role>WEBHDFS</role>
-        <url>http://vm.home:50070/webhdfs/v1</url>
+        <url>http://vm.home:50070/webhdfs</url>
     </service>
 </topology>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteServletFilter.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteServletFilter.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteServletFilter.java
index 4405009..74ac67a 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteServletFilter.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteServletFilter.java
@@ -20,7 +20,9 @@ package org.apache.hadoop.gateway.filter.rewrite.api;
 import org.apache.hadoop.gateway.filter.AbstractGatewayFilter;
 import org.apache.hadoop.gateway.filter.rewrite.impl.UrlRewriteRequest;
 import org.apache.hadoop.gateway.filter.rewrite.impl.UrlRewriteResponse;
+import org.apache.hadoop.gateway.util.MimeTypes;
 
+import javax.activation.MimeType;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
@@ -33,6 +35,17 @@ import java.io.IOException;
  */
 public class UrlRewriteServletFilter extends AbstractGatewayFilter {
 
+  public static final String REQUEST_URL_RULE_PARAM = "request.url";
+  public static final String REQUEST_HEADERS_FILTER_PARAM = "request.headers";
+  public static final String REQUEST_COOKIES_FILTER_PARAM = "request.cookies";
+  public static final String REQUEST_BODY_FILTER_PARAM = "request.body";
+  public static final String RESPONSE_HEADERS_FILTER_PARAM = "response.headers";
+  public static final String RESPONSE_COOKIES_FILTER_PARAM = "response.cookies";
+  public static final String RESPONSE_BODY_FILTER_PARAM = "response.body";
+
+  public static final MimeType HEADERS_MIME_TYPE = MimeTypes.create( "application/x-http-headers", null );
+  public static final MimeType COOKIES_MIME_TYPE = MimeTypes.create( "application/x-http-cookies", null );
+
   @Override
   public void init( FilterConfig filterConfig ) throws ServletException {
     super.init( filterConfig );

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
index 6e513ec..a12fc24 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteRequest.java
@@ -23,11 +23,11 @@ import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteFilterContentDescr
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteFilterDescriptor;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteRulesDescriptor;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletContextListener;
+import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletFilter;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteStreamFilterFactory;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriter;
 import org.apache.hadoop.gateway.filter.rewrite.i18n.UrlRewriteMessages;
 import org.apache.hadoop.gateway.i18n.messages.MessagesFactory;
-import org.apache.hadoop.gateway.util.MimeTypes;
 import org.apache.hadoop.gateway.util.urltemplate.Parser;
 import org.apache.hadoop.gateway.util.urltemplate.Resolver;
 import org.apache.hadoop.gateway.util.urltemplate.Template;
@@ -51,14 +51,6 @@ public class UrlRewriteRequest extends GatewayRequestWrapper implements Resolver
 
   private static final UrlRewriteMessages LOG = MessagesFactory.get( UrlRewriteMessages.class );
 
-  private static final String REQUEST_URL_RULE_PARAM = "request.url";
-  private static final String REQUEST_BODY_FILTER_PARAM = "request.body";
-  private static final String REQUEST_HEADERS_FILTER_PARAM = "request.headers";
-  private static final String REQUEST_COOKIES_FILTER_PARAM = "request.cookies";
-
-  private static final MimeType HEADERS_MIME_TYPE = MimeTypes.create( "application/x-http-headers", null );
-  private static final MimeType COOKIES_MIME_TYPE = MimeTypes.create( "application/x-http-cookies", null );
-
   private UrlRewriter rewriter;
   private String urlRuleName;
   private String bodyFilterName;
@@ -75,12 +67,12 @@ public class UrlRewriteRequest extends GatewayRequestWrapper implements Resolver
   public UrlRewriteRequest( FilterConfig config, HttpServletRequest request ) throws IOException {
     super( request );
     this.rewriter = UrlRewriteServletContextListener.getUrlRewriter( config.getServletContext() );
-    this.urlRuleName = config.getInitParameter( REQUEST_URL_RULE_PARAM );
-    this.bodyFilterName = config.getInitParameter( REQUEST_BODY_FILTER_PARAM );
-    this.headersFilterName = config.getInitParameter( REQUEST_HEADERS_FILTER_PARAM );
-    this.headersFilterConfig = getRewriteFilterConfig( headersFilterName, HEADERS_MIME_TYPE );
-    this.cookiesFilterName = config.getInitParameter( REQUEST_COOKIES_FILTER_PARAM );
-    this.cookiesFilterConfig = getRewriteFilterConfig( cookiesFilterName, COOKIES_MIME_TYPE );
+    this.urlRuleName = config.getInitParameter( UrlRewriteServletFilter.REQUEST_URL_RULE_PARAM );
+    this.bodyFilterName = config.getInitParameter( UrlRewriteServletFilter.REQUEST_BODY_FILTER_PARAM );
+    this.headersFilterName = config.getInitParameter( UrlRewriteServletFilter.REQUEST_HEADERS_FILTER_PARAM );
+    this.headersFilterConfig = getRewriteFilterConfig( headersFilterName, UrlRewriteServletFilter.HEADERS_MIME_TYPE );
+    this.cookiesFilterName = config.getInitParameter( UrlRewriteServletFilter.REQUEST_COOKIES_FILTER_PARAM );
+    this.cookiesFilterConfig = getRewriteFilterConfig( cookiesFilterName, UrlRewriteServletFilter.COOKIES_MIME_TYPE );
   }
 
   private Template getSourceUrl() {

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteResponse.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteResponse.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteResponse.java
index 2c14b9f..a263a55 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteResponse.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteResponse.java
@@ -21,11 +21,11 @@ import org.apache.hadoop.gateway.filter.GatewayResponseWrapper;
 import org.apache.hadoop.gateway.filter.ResponseStreamer;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteFilterContentDescriptor;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletContextListener;
+import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletFilter;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteStreamFilterFactory;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriter;
 import org.apache.hadoop.gateway.filter.rewrite.i18n.UrlRewriteMessages;
 import org.apache.hadoop.gateway.i18n.messages.MessagesFactory;
-import org.apache.hadoop.gateway.util.MimeTypes;
 import org.apache.hadoop.gateway.util.Urls;
 import org.apache.hadoop.gateway.util.urltemplate.Params;
 import org.apache.hadoop.gateway.util.urltemplate.Parser;
@@ -64,15 +64,9 @@ public class UrlRewriteResponse extends GatewayResponseWrapper implements Params
     IGNORE_HEADER_NAMES.add( "Content-Length" );
   }
 
-  private static final MimeType HEADERS_MIME_TYPE = MimeTypes.create( "application/x-http-headers", null );
-  private static final MimeType COOKIES_MIME_TYPE = MimeTypes.create( "application/x-http-cookies", null );
-
   private static final String REQUEST_PARAM_PREFIX = "request.";
   private static final String CLUSTER_PARAM_PREFIX = "cluster.";
   private static final String GATEWAY_PARAM_PREFIX = "gateway.";
-  private static final String RESPONSE_BODY_FILTER_PARAM = "response.body";
-  private static final String RESPONSE_HEADERS_FILTER_PARAM = "response.headers";
-  private static final String RESPONSE_COOKIES_FILTER_PARAM = "response.cookies";
 
   private UrlRewriter rewriter;
   private FilterConfig config;
@@ -93,11 +87,11 @@ public class UrlRewriteResponse extends GatewayResponseWrapper implements Params
     this.request = request;
     this.response = response;
     this.output = null;
-    this.bodyFilterName = config.getInitParameter( RESPONSE_BODY_FILTER_PARAM );
-    this.headersFilterName = config.getInitParameter( RESPONSE_HEADERS_FILTER_PARAM );
-    this.headersFilterConfig = getRewriteFilterConfig( rewriter.getConfig(), headersFilterName, HEADERS_MIME_TYPE );
-    this.cookiesFilterName = config.getInitParameter( RESPONSE_COOKIES_FILTER_PARAM );
-    this.cookiesFilterConfig = getRewriteFilterConfig( rewriter.getConfig(), cookiesFilterName, COOKIES_MIME_TYPE );
+    this.bodyFilterName = config.getInitParameter( UrlRewriteServletFilter.RESPONSE_BODY_FILTER_PARAM );
+    this.headersFilterName = config.getInitParameter( UrlRewriteServletFilter.RESPONSE_HEADERS_FILTER_PARAM );
+    this.headersFilterConfig = getRewriteFilterConfig( rewriter.getConfig(), headersFilterName, UrlRewriteServletFilter.HEADERS_MIME_TYPE );
+    this.cookiesFilterName = config.getInitParameter( UrlRewriteServletFilter.RESPONSE_COOKIES_FILTER_PARAM );
+    this.cookiesFilterConfig = getRewriteFilterConfig( rewriter.getConfig(), cookiesFilterName, UrlRewriteServletFilter.COOKIES_MIME_TYPE );
   }
 
   protected boolean ignoreHeader( String name ) {

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/rewrite.xml
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/rewrite.xml b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/rewrite.xml
index 162251f..65ee022 100644
--- a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/rewrite.xml
+++ b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/rewrite.xml
@@ -77,20 +77,20 @@
     ContentPathParser
     -->
 
-    <rule dir="IN" name="WEBHDFS/webhdfs/namenode/root/inbound" pattern="*://*:*/**/namenode/api/v1/?{**}">
-        <rewrite template="http://vm:50070/webhdfs/v1/?{**}"/>
+    <rule dir="IN" name="WEBHDFS/webhdfs/namenode/root/inbound" pattern="*://*:*/**/namenode/api/{version}/?{**}">
+        <rewrite template="http://vm:50070/webhdfs/{version}/?{**}"/>
     </rule>
-    <rule dir="IN" name="WEBHDFS/webhdfs/namenode/file/inbound" pattern="*://*:*/**/namenode/api/v1/{path=**}?{**}">
-        <rewrite template="http://vm:50070/webhdfs/v1/{path=**}?{**}"/>
+    <rule dir="IN" name="WEBHDFS/webhdfs/namenode/file/inbound" pattern="*://*:*/**/namenode/api/{version}/{path=**}?{**}">
+        <rewrite template="http://vm:50070/webhdfs/{version}/{path=**}?{**}"/>
     </rule>
-    <rule dir="IN" name="WEBHDFS/webhdfs/datanode/inbound" pattern="*://*:*/**/datanode/api/v1/{path=**}?**">
+    <rule dir="IN" name="WEBHDFS/webhdfs/datanode/inbound" pattern="*://*:*/**/datanode/api/{version}/{path=**}?**">
         <decode-query/>
-        <match pattern="*://*:*/**/datanode/api/v1/{path=**}?{host}&amp;{port}&amp;{**}"/>
+        <match pattern="*://*:*/**/datanode/api/{version}/{path=**}?{host}&amp;{port}&amp;{**}"/>
         <rewrite template="http://{host}:{port}/{path=**}?{**}"/>
     </rule>
     <rule dir="OUT" name="WEBHDFS/webhdfs/datanode/outbound" pattern="*://*:*/**?**">
         <match pattern="*://{host}:{port}/{path=**}?{**}"/>
-        <rewrite template="{gateway.url}/datanode/api/v1/{path=**}?{host}&amp;{port}&amp;{**}"/>
+        <rewrite template="{gateway.url}/datanode/api/{version}/{path=**}?{host}&amp;{port}&amp;{**}"/>
         <encode-query/>
     </rule>
     <rule dir="IN" name="TEMPLETON/templeton/templeton/request" pattern="*://*:*/**/templeton/api/v1/{path=**}?{**}">

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-release/home/INSTALL
----------------------------------------------------------------------
diff --git a/gateway-release/home/INSTALL b/gateway-release/home/INSTALL
index f198704..d972b2e 100644
--- a/gateway-release/home/INSTALL
+++ b/gateway-release/home/INSTALL
@@ -212,8 +212,8 @@ and the cluster topology descriptors
 (e.g. {GATEWAY_HOME}/deployments/<cluster-name>.xml).
 
   HDFS (NameNode)
-    Gateway: http://<gateway-host>:<gateway-port>/<gateway-path>/<cluster-name>/namenode/api/v1
-    Cluster: http://<namenode-host>:50070/webhdfs/v1
+    Gateway: http://<gateway-host>:<gateway-port>/<gateway-path>/<cluster-name>/namenode/api
+    Cluster: http://<namenode-host>:50070/webhdfs
   WebHCat (Templeton)
     Gateway: http://<gateway-host>:<gateway-port>/<gateway-path>/<cluster-name>/templeton/api/v1
     Cluster: http://<templeton-host>:50111/templeton/v1

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-release/home/deployments/sample.xml
----------------------------------------------------------------------
diff --git a/gateway-release/home/deployments/sample.xml b/gateway-release/home/deployments/sample.xml
index 0bc585f..54723a2 100644
--- a/gateway-release/home/deployments/sample.xml
+++ b/gateway-release/home/deployments/sample.xml
@@ -66,7 +66,7 @@
     </service>
     <service>
         <role>WEBHDFS</role>
-        <url>http://localhost:50070/webhdfs/v1</url>
+        <url>http://localhost:50070/webhdfs</url>
     </service>
     <service>
         <role>TEMPLETON</role>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-release/home/templates/sample.conf
----------------------------------------------------------------------
diff --git a/gateway-release/home/templates/sample.conf b/gateway-release/home/templates/sample.conf
index d12345d..e495270 100644
--- a/gateway-release/home/templates/sample.conf
+++ b/gateway-release/home/templates/sample.conf
@@ -58,7 +58,7 @@
     </property>
     <property>
         <name>topology.service.WEBHDFS..url</name>
-        <value>http://localhost:50070/webhdfs/v1</value>
+        <value>http://localhost:50070/webhdfs</value>
     </property>
     <property>
         <name>topology.service.TEMPLETON..url</name>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-release/home/templates/sample.xml
----------------------------------------------------------------------
diff --git a/gateway-release/home/templates/sample.xml b/gateway-release/home/templates/sample.xml
index 199c23f..0d1292e 100644
--- a/gateway-release/home/templates/sample.xml
+++ b/gateway-release/home/templates/sample.xml
@@ -52,7 +52,7 @@
 
     <service>
         <role>WEBHDFS</role>
-        <url>http://localhost:50070/webhdfs/v1</url>
+        <url>http://localhost:50070/webhdfs</url>
     </service>
     <service>
         <role>TEMPLETON</role>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-server/src/main/java/org/apache/hadoop/gateway/filter/JaasLoginFilter.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/filter/JaasLoginFilter.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/filter/JaasLoginFilter.java
index 5fb2ee8..8a4cf60 100644
--- a/gateway-server/src/main/java/org/apache/hadoop/gateway/filter/JaasLoginFilter.java
+++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/filter/JaasLoginFilter.java
@@ -83,7 +83,4 @@ public class JaasLoginFilter extends AbstractGatewayFilter {
 //    AuthenticatedURL.Token token = new AuthenticatedURL.Token();
 //    Authenticator authenticator = null; // url, token
 //    HttpURLConnection conn = new AuthenticatedURL( authenticator ).openConnection();
-
-    // http://org.apache.hadoop-secure.home:50070/webhdfs/v1/horton/readme?op=OPEN
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-server/src/main/resources/cluster-sample.xml
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/resources/cluster-sample.xml b/gateway-server/src/main/resources/cluster-sample.xml
index bc279e5..09719e1 100644
--- a/gateway-server/src/main/resources/cluster-sample.xml
+++ b/gateway-server/src/main/resources/cluster-sample.xml
@@ -21,7 +21,7 @@ limitations under the License.
     <!--
     <service>
         <role>NAMENODE</role>
-        <url>http://localhost:50070/webhdfs/v1</url>
+        <url>http://localhost:50070/webhdfs</url>
     </service>
     -->
 </topology>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/builder/PropertyTopologyBuilderTest.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/builder/PropertyTopologyBuilderTest.java b/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/builder/PropertyTopologyBuilderTest.java
index 5d50ed2..10629fd 100644
--- a/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/builder/PropertyTopologyBuilderTest.java
+++ b/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/builder/PropertyTopologyBuilderTest.java
@@ -140,7 +140,7 @@ public class PropertyTopologyBuilderTest {
     @Test(expected = IllegalArgumentException.class)
     public void testBuildSuccessfulForServiceProperty() {
         PropertyTopologyBuilder propertyTopologyBuilder = new PropertyTopologyBuilder();
-        propertyTopologyBuilder.addProperty(new Property("topology.gateway.service.WEBHDFS..url", "http://host:50070/webhdfs/v1"));
+        propertyTopologyBuilder.addProperty(new Property("topology.gateway.service.WEBHDFS..url", "http://host:50070/webhdfs"));
         Topology topology = propertyTopologyBuilder.build();
 
         assertThat(topology, notNullValue());

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/xml/TopologyRulesModuleTest.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/xml/TopologyRulesModuleTest.java b/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/xml/TopologyRulesModuleTest.java
index 7b88aa9..3b9b53b 100644
--- a/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/xml/TopologyRulesModuleTest.java
+++ b/gateway-server/src/test/java/org/apache/hadoop/gateway/topology/xml/TopologyRulesModuleTest.java
@@ -71,7 +71,7 @@ public class TopologyRulesModuleTest {
     Service comp = topology.getServices().iterator().next();
     assertThat( comp, notNullValue() );
     assertThat( comp.getRole(), is( "WEBHDFS" ) );
-    assertThat( comp.getUrl(), is( "http://host:80/webhdfs/v1" ) );
+    assertThat( comp.getUrl(), is( "http://host:80/webhdfs" ) );
 
     Provider provider = topology.getProviders().iterator().next();
     assertThat( provider, notNullValue() );
@@ -101,7 +101,7 @@ public class TopologyRulesModuleTest {
     assertThat( namenodeService, notNullValue() );
     assertThat( namenodeService.getRole(), is( "WEBHDFS" ) );
     assertThat( namenodeService.getName(), nullValue() );
-    assertThat( namenodeService.getUrl(), is( "http://host:50070/webhdfs/v1" ) );
+    assertThat( namenodeService.getUrl(), is( "http://host:50070/webhdfs" ) );
 
     Service templetonService = topology.getService( "TEMPLETON", null );
     assertThat( templetonService, notNullValue() );

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-one.xml
----------------------------------------------------------------------
diff --git a/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-one.xml b/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-one.xml
index a231a1a..8255da1 100644
--- a/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-one.xml
+++ b/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-one.xml
@@ -7,6 +7,6 @@
     -->
     <service>
         <role>WEBHDFS</role>
-        <url>http://host-one:80/webhdfs/v1</url>
+        <url>http://host-one:80/webhdfs</url>
     </service>
 </topology>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-three.xml
----------------------------------------------------------------------
diff --git a/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-three.xml b/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-three.xml
index 488c618..c80b1a3 100644
--- a/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-three.xml
+++ b/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-three.xml
@@ -7,6 +7,6 @@
     -->
     <service>
         <role>WEBHDFS</role>
-        <url>http://host-three:80/webhdfs/v1</url>
+        <url>http://host-three:80/webhdfs</url>
     </service>
 </topology>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-two.xml
----------------------------------------------------------------------
diff --git a/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-two.xml b/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-two.xml
index 0529599..67c0149 100644
--- a/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-two.xml
+++ b/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/file/topology-two.xml
@@ -7,6 +7,6 @@
     -->
     <service>
         <role>WEBHDFS</role>
-        <url>http://host-two:80/webhdfs/v1</url>
+        <url>http://host-two:80/webhdfs</url>
     </service>
 </topology>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/xml/simple-topology-ambari-format.conf
----------------------------------------------------------------------
diff --git a/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/xml/simple-topology-ambari-format.conf b/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/xml/simple-topology-ambari-format.conf
index 51b1073..394b3c0 100644
--- a/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/xml/simple-topology-ambari-format.conf
+++ b/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/xml/simple-topology-ambari-format.conf
@@ -58,7 +58,7 @@
     </property>
     <property>
         <name>topology.service.WEBHDFS..url</name>
-        <value>http://host:50070/webhdfs/v1</value>
+        <value>http://host:50070/webhdfs</value>
     </property>
     <property>
         <name>topology.service.TEMPLETON..url</name>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/xml/simple-topology-knox-format.xml
----------------------------------------------------------------------
diff --git a/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/xml/simple-topology-knox-format.xml b/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/xml/simple-topology-knox-format.xml
index 8a6f0ad..a7c90a0 100644
--- a/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/xml/simple-topology-knox-format.xml
+++ b/gateway-server/src/test/resources/org/apache/hadoop/gateway/topology/xml/simple-topology-knox-format.xml
@@ -63,6 +63,6 @@
 
     <service>
         <role>WEBHDFS</role>
-        <url>http://host:80/webhdfs/v1</url>
+        <url>http://host:80/webhdfs</url>
     </service>
 </topology>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-service-hdfs/src/main/java/org/apache/hadoop/gateway/hdfs/WebHdfsDeploymentContributor.java
----------------------------------------------------------------------
diff --git a/gateway-service-hdfs/src/main/java/org/apache/hadoop/gateway/hdfs/WebHdfsDeploymentContributor.java b/gateway-service-hdfs/src/main/java/org/apache/hadoop/gateway/hdfs/WebHdfsDeploymentContributor.java
index ff85835..f39912d 100644
--- a/gateway-service-hdfs/src/main/java/org/apache/hadoop/gateway/hdfs/WebHdfsDeploymentContributor.java
+++ b/gateway-service-hdfs/src/main/java/org/apache/hadoop/gateway/hdfs/WebHdfsDeploymentContributor.java
@@ -21,24 +21,26 @@ import org.apache.hadoop.gateway.deploy.DeploymentContext;
 import org.apache.hadoop.gateway.deploy.ServiceDeploymentContributorBase;
 import org.apache.hadoop.gateway.descriptor.FilterParamDescriptor;
 import org.apache.hadoop.gateway.descriptor.ResourceDescriptor;
-import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteFilterContentDescriptor;
-import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteFilterDescriptor;
-import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteRuleDescriptor;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteRulesDescriptor;
-import org.apache.hadoop.gateway.filter.rewrite.ext.UrlRewriteActionRewriteDescriptorExt;
-import org.apache.hadoop.gateway.filter.rewrite.ext.UrlRewriteMatchDescriptor;
+import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteRulesDescriptorFactory;
+import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletFilter;
 import org.apache.hadoop.gateway.topology.Service;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.List;
 
 public class WebHdfsDeploymentContributor extends ServiceDeploymentContributorBase {
 
+  private static final String RULES_RESOURCE = WebHdfsDeploymentContributor.class.getName().replace( '.', '/' ) + "/rewrite.xml";
   private static final String WEBHDFS_EXTERNAL_PATH = "/namenode/api/v1";
-  private static final String DATANODE_INTERNAL_PATH = "/webhdfs/v1";
   private static final String DATANODE_EXTERNAL_PATH = "/datanode/api/v1";
-  private static final String CLUSTER_URL_FUNCTION = "{gateway.url}";
+//  private static final String WEBHDFS_INTERNAL_PATH = "/webhdfs";
+//  private static final String CLUSTER_URL_FUNCTION = "{gateway.url}";
 
   @Override
   public String getRole() {
@@ -57,55 +59,63 @@ public class WebHdfsDeploymentContributor extends ServiceDeploymentContributorBa
     contributeDataNodeResource( context, service );
   }
 
-  private void contributeRewriteRules( DeploymentContext context, Service service ) throws URISyntaxException {
-    UrlRewriteRulesDescriptor rules = context.getDescriptor( "rewrite" );
-    UrlRewriteRuleDescriptor rule;
-    UrlRewriteActionRewriteDescriptorExt rewrite;
-    UrlRewriteMatchDescriptor match;
-
-    rule = rules.addRule( getQualifiedName() + "/namenode/root/inbound" )
-        .directions( "inbound" )
-        .pattern( "*://*:*/**" + WEBHDFS_EXTERNAL_PATH + "/?{**}" );
-    rewrite = rule.addStep( "rewrite" );
-    //rewrite.template( service.getUrl().toExternalForm() + "/?user.name={$username}&{**}" );
-    rewrite.template( service.getUrl() + "/?{**}" );
-
-    rule = rules.addRule( getQualifiedName() + "/namenode/file/inbound" )
-        .directions( "inbound" )
-        .pattern( "*://*:*/**" + WEBHDFS_EXTERNAL_PATH + "/{path=**}?{**}" );
-    rewrite = rule.addStep( "rewrite" );
-    //rewrite.template( service.getUrl().toExternalForm() + "/{path=**}?user.name={$username}&{**}" );
-    rewrite.template( service.getUrl() + "/{path=**}?{**}" );
-
-    rule = rules.addRule( getQualifiedName() + "/datanode/inbound" )
-        .directions( "inbound" )
-        .pattern( "*://*:*/**" + DATANODE_EXTERNAL_PATH + "/{path=**}?**" );
-    //TODO: If the input type is wrong it throws a NPE.
-    rule.addStep( "decode-query" );
-    match = rule.addStep( "match" );
-    match.pattern( "*://*:*/**" + DATANODE_EXTERNAL_PATH + "/{path=**}?{host}&{port}&{**}" );
-    rewrite = rule.addStep( "rewrite" );
-    rewrite.template( "http://{host}:{port}/{path=**}?{**}" );
-
-    rule = rules.addRule( getQualifiedName() + "/datanode/outbound" )
-        .directions( "outbound" );
-    match = rule.addStep( "match" );
-    match.pattern( "*://{host}:{port}/{path=**}?{**}" );
-    rewrite = rule.addStep( "rewrite" );
-    rewrite.template( CLUSTER_URL_FUNCTION + DATANODE_EXTERNAL_PATH + "/{path=**}?host={$hostmap(host)}&{port}&{**}" );
-    rule.addStep( "encode-query" );
-
-    UrlRewriteFilterDescriptor filter = rules.addFilter( getQualifiedName() + "/outbound" );
-    UrlRewriteFilterContentDescriptor content = filter.addContent( "application/x-http-headers" );
-    content.addApply( "Location", getQualifiedName() + "/datanode/outbound" );
+  private void contributeRewriteRules( DeploymentContext context, Service service ) throws URISyntaxException, IOException {
+    UrlRewriteRulesDescriptor serviceRules = loadRulesFromClassPath();
+    UrlRewriteRulesDescriptor clusterRules = context.getDescriptor( "rewrite" );
+    clusterRules.addRules( serviceRules );
+
+//    UrlRewriteRulesDescriptor rules = context.getDescriptor( "rewrite" );
+//    UrlRewriteRuleDescriptor rule;
+//    UrlRewriteActionRewriteDescriptorExt rewrite;
+//    UrlRewriteMatchDescriptor match;
+//
+//    rule = rules.addRule( getQualifiedName() + "/namenode/root/inbound" )
+//        .directions( "inbound" )
+//        .pattern( "*://*:*/**" + WEBHDFS_EXTERNAL_PATH + "/?{**}" );
+//    rewrite = rule.addStep( "rewrite" );
+//    //rewrite.template( service.getUrl().toExternalForm() + "/?user.name={$username}&{**}" );
+//    rewrite.template( service.getUrl() + "/?{**}" );
+//
+//    rule = rules.addRule( getQualifiedName() + "/namenode/file/inbound" )
+//        .directions( "inbound" )
+//        .pattern( "*://*:*/**" + WEBHDFS_EXTERNAL_PATH + "/{path=**}?{**}" );
+//    rewrite = rule.addStep( "rewrite" );
+//    //rewrite.template( service.getUrl().toExternalForm() + "/{path=**}?user.name={$username}&{**}" );
+//    rewrite.template( service.getUrl() + "/{path=**}?{**}" );
+//
+//    rule = rules.addRule( getQualifiedName() + "/datanode/inbound" )
+//        .directions( "inbound" )
+//        .pattern( "*://*:*/**" + DATANODE_EXTERNAL_PATH + "/{path=**}?**" );
+//    //TODO: If the input type is wrong it throws a NPE.
+//    rule.addStep( "decode-query" );
+//    match = rule.addStep( "match" );
+//    match.pattern( "*://*:*/**" + DATANODE_EXTERNAL_PATH + "/{path=**}?{host}&{port}&{**}" );
+//    rewrite = rule.addStep( "rewrite" );
+//    rewrite.template( "http://{host}:{port}/{path=**}?{**}" );
+//
+//    rule = rules.addRule( getQualifiedName() + "/datanode/outbound" )
+//        .directions( "outbound" );
+//    match = rule.addStep( "match" );
+//    match.pattern( "*://{host}:{port}/{path=**}?{**}" );
+//    rewrite = rule.addStep( "rewrite" );
+//    rewrite.template( CLUSTER_URL_FUNCTION + DATANODE_EXTERNAL_PATH + "/{path=**}?host={$hostmap(host)}&{port}&{**}" );
+//    rule.addStep( "encode-query" );
+//
+//    UrlRewriteFilterDescriptor filter = rules.addFilter( getQualifiedName() + "/outbound" );
+//    UrlRewriteFilterContentDescriptor content = filter.addContent( "application/x-http-headers" );
+//    content.addApply( "Location", getQualifiedName() + "/datanode/outbound" );
   }
 
   public void contributeNameNodeResource( DeploymentContext context, Service service ) throws URISyntaxException {
+    List<FilterParamDescriptor> params;
     ResourceDescriptor rootResource = context.getGatewayDescriptor().addResource();
     rootResource.role( service.getRole() );
     rootResource.pattern( WEBHDFS_EXTERNAL_PATH + "/?**" );
     addAuthenticationFilter( context, service, rootResource );
-    addRewriteFilter( context, service, rootResource );
+    params = new ArrayList<FilterParamDescriptor>();
+    params.add( rootResource.createFilterParam().
+        name( UrlRewriteServletFilter.REQUEST_URL_RULE_PARAM ).value( getQualifiedName() + "/inbound/namenode/root" ) );
+    addRewriteFilter( context, service, rootResource, params );
     addIdentityAssertionFilter( context, service, rootResource );
     addAuthorizationFilter( context, service, rootResource );
     addDispatchFilter( context, service, rootResource, "dispatch", null );
@@ -114,32 +124,43 @@ public class WebHdfsDeploymentContributor extends ServiceDeploymentContributorBa
     fileResource.role( service.getRole() );
     fileResource.pattern( WEBHDFS_EXTERNAL_PATH + "/**?**" );
     addAuthenticationFilter( context, service, fileResource );
-    addRewriteFilter( context, service, fileResource );
+    params = new ArrayList<FilterParamDescriptor>();
+    params.add( fileResource.createFilterParam().
+        name( UrlRewriteServletFilter.REQUEST_URL_RULE_PARAM ).value( getQualifiedName() + "/inbound/namenode/file" ) );
+    params.add( fileResource.createFilterParam().
+        name( UrlRewriteServletFilter.RESPONSE_HEADERS_FILTER_PARAM ).value( getQualifiedName() + "/outbound/namenode/headers" ) );
+    addRewriteFilter( context, service, fileResource, params );
     addIdentityAssertionFilter( context, service, fileResource );
     addAuthorizationFilter( context, service, fileResource );
     addDispatchFilter( context, service, fileResource, "dispatch", null );
   }
 
   public void contributeDataNodeResource( DeploymentContext context, Service service ) throws URISyntaxException {
+    List<FilterParamDescriptor> params;
     ResourceDescriptor fileResource = context.getGatewayDescriptor().addResource();
     fileResource.role( service.getRole() );
     fileResource.pattern( DATANODE_EXTERNAL_PATH + "/**?**" );
     addAuthenticationFilter( context, service, fileResource );
     addIdentityAssertionFilter( context, service, fileResource );
     addAuthorizationFilter( context, service, fileResource );
-    addRewriteFilter( context, service, fileResource );
+    params = new ArrayList<FilterParamDescriptor>();
+    params.add( fileResource.createFilterParam().
+        name( UrlRewriteServletFilter.REQUEST_URL_RULE_PARAM ).value( getQualifiedName() + "/inbound/datanode" ) );
+    addRewriteFilter( context, service, fileResource, params );
     addDispatchFilter( context, service, fileResource, "dispatch", null );
   }
 
-  private void addRewriteFilter(
-      DeploymentContext context, Service service, ResourceDescriptor resource ) throws URISyntaxException {
-    List<FilterParamDescriptor> params = new ArrayList<FilterParamDescriptor>();
-    params.add( resource.createFilterParam().name( "response.headers" ).value( getQualifiedName() + "/outbound" ) );
-    context.contributeFilter( service, resource, "rewrite", null, params );
+  String getQualifiedName() {
+    return getRole() + "/" + getName();
   }
 
-  private String getQualifiedName() {
-    return getRole() + "/" + getName();
+  UrlRewriteRulesDescriptor loadRulesFromClassPath() throws IOException {
+    InputStream stream = this.getClass().getClassLoader().getResourceAsStream( RULES_RESOURCE );
+    Reader reader = new InputStreamReader( stream );
+    UrlRewriteRulesDescriptor rules = UrlRewriteRulesDescriptorFactory.load( "xml", reader );
+    reader.close();
+    stream.close();
+    return rules;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-service-hdfs/src/main/resources/org/apache/hadoop/gateway/hdfs/WebHdfsDeploymentContributor/rewrite.xml
----------------------------------------------------------------------
diff --git a/gateway-service-hdfs/src/main/resources/org/apache/hadoop/gateway/hdfs/WebHdfsDeploymentContributor/rewrite.xml b/gateway-service-hdfs/src/main/resources/org/apache/hadoop/gateway/hdfs/WebHdfsDeploymentContributor/rewrite.xml
new file mode 100644
index 0000000..db6069b
--- /dev/null
+++ b/gateway-service-hdfs/src/main/resources/org/apache/hadoop/gateway/hdfs/WebHdfsDeploymentContributor/rewrite.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+   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.
+-->
+<rules>
+
+    <rule dir="OUT" name="WEBHDFS/webhdfs/outbound" pattern="hdfs://*:*/{path=**}?{**}">
+        <rewrite template="{gateway.url}/namenode/api/v1/{path=**}?{**}"/>
+    </rule>
+
+    <rule dir="OUT" name="WEBHDFS/webhdfs/outbound" pattern="webhdfs://*:*/{path=**}?{**}">
+        <rewrite template="{gateway.url}/namenode/api/v1/{path=**}?{**}"/>
+    </rule>
+
+    <rule dir="OUT" name="WEBHDFS/webhdfs/outbound/namenode/headers/location">
+        <match pattern="{scheme}://{host}:{port}/{path=**}?{**}"/>
+        <rewrite template="{gateway.url}/datanode/api/v1/{path=**}?{scheme}?host={$hostmap(host)}?{port}?{**}"/>
+        <encrypt-query/>
+    </rule>
+
+    <rule dir="IN" name="WEBHDFS/webhdfs/inbound/hdfs" pattern="hdfs:/{path=**}?{**}">
+        <rewrite template="{$serviceUrl[NAMENODE]}/{path=**}?{**}"/>
+    </rule>
+
+    <rule dir="IN" name="WEBHDFS/webhdfs/inbound/webhdfs" pattern="webhdfs:/{path=**}?{**}">
+        <rewrite template="{$serviceUrl[WEBHDFS]}/{path=**}?{**}"/>
+    </rule>
+
+    <rule dir="IN" name="WEBHDFS/webhdfs/inbound/namenode/root" pattern="*://*:*/**/namenode/api/{version}/?{**}">
+        <rewrite template="{$serviceUrl[WEBHDFS]}/{version}/?{**}"/>
+    </rule>
+
+    <rule dir="IN" name="WEBHDFS/webhdfs/inbound/namenode/file" pattern="*://*:*/**/namenode/api/{version}/{path=**}?{**}">
+        <rewrite template="{$serviceUrl[WEBHDFS]}/{version}/{path=**}?{**}"/>
+    </rule>
+
+    <rule dir="IN" name="WEBHDFS/webhdfs/inbound/datanode">
+        <decrypt-query/>
+        <match pattern="*://*:*/**/datanode/api/*/{path=**}?{scheme}?{host}?{port}?{**}"/>
+        <rewrite template="{scheme}://{host}:{port}/{path=**}?{**}"/>
+    </rule>
+
+    <filter name="WEBHDFS/webhdfs/outbound/namenode/headers">
+        <content type="application/x-http-headers">
+            <apply path="Location" rule="WEBHDFS/webhdfs/outbound/namenode/headers/location"/>
+        </content>
+    </filter>
+
+</rules>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-service-oozie/src/main/java/org/apache/hadoop/gateway/oozie/OozieDeploymentContributor.java
----------------------------------------------------------------------
diff --git a/gateway-service-oozie/src/main/java/org/apache/hadoop/gateway/oozie/OozieDeploymentContributor.java b/gateway-service-oozie/src/main/java/org/apache/hadoop/gateway/oozie/OozieDeploymentContributor.java
index 3f5f212..6933ba3 100644
--- a/gateway-service-oozie/src/main/java/org/apache/hadoop/gateway/oozie/OozieDeploymentContributor.java
+++ b/gateway-service-oozie/src/main/java/org/apache/hadoop/gateway/oozie/OozieDeploymentContributor.java
@@ -35,8 +35,8 @@ import java.util.List;
 
 public class OozieDeploymentContributor extends ServiceDeploymentContributorBase {
 
-  private static final String EXTERNAL_PATH = "/oozie/api";
   private static final String RULES_RESOURCE = OozieDeploymentContributor.class.getName().replace( '.', '/' ) + "/rewrite.xml";
+  private static final String EXTERNAL_PATH = "/oozie/api";
 
   @Override
   public String getRole() {

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-spi/src/main/java/org/apache/hadoop/gateway/deploy/ServiceDeploymentContributorBase.java
----------------------------------------------------------------------
diff --git a/gateway-spi/src/main/java/org/apache/hadoop/gateway/deploy/ServiceDeploymentContributorBase.java b/gateway-spi/src/main/java/org/apache/hadoop/gateway/deploy/ServiceDeploymentContributorBase.java
index 4edfde8..95d72e2 100644
--- a/gateway-spi/src/main/java/org/apache/hadoop/gateway/deploy/ServiceDeploymentContributorBase.java
+++ b/gateway-spi/src/main/java/org/apache/hadoop/gateway/deploy/ServiceDeploymentContributorBase.java
@@ -17,12 +17,15 @@
  */
 package org.apache.hadoop.gateway.deploy;
 
-import java.util.Collection;
-
+import org.apache.hadoop.gateway.descriptor.FilterParamDescriptor;
 import org.apache.hadoop.gateway.descriptor.ResourceDescriptor;
 import org.apache.hadoop.gateway.topology.Provider;
 import org.apache.hadoop.gateway.topology.Service;
 
+import java.net.URISyntaxException;
+import java.util.Collection;
+import java.util.List;
+
 public abstract class ServiceDeploymentContributorBase extends DeploymentContributorBase implements ServiceDeploymentContributor {
 
   public void initializeContribution( DeploymentContext context ) {
@@ -69,7 +72,16 @@ public abstract class ServiceDeploymentContributorBase extends DeploymentContrib
     }
   }
 
+  protected void addRewriteFilter(
+      DeploymentContext context,
+      Service service,
+      ResourceDescriptor resource,
+      List<FilterParamDescriptor> params ) throws URISyntaxException {
+    context.contributeFilter( service, resource, "rewrite", null, params );
+  }
+
   protected void addDispatchFilter(DeploymentContext context, Service service, ResourceDescriptor resource, String role, String name ) {
     context.contributeFilter( service, resource, role, name, null );
-  }  
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-test/src/test/java/org/apache/hadoop/gateway/GatewayBasicFuncTest.java
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/java/org/apache/hadoop/gateway/GatewayBasicFuncTest.java b/gateway-test/src/test/java/org/apache/hadoop/gateway/GatewayBasicFuncTest.java
index 941a1ff..c1f18ef 100644
--- a/gateway-test/src/test/java/org/apache/hadoop/gateway/GatewayBasicFuncTest.java
+++ b/gateway-test/src/test/java/org/apache/hadoop/gateway/GatewayBasicFuncTest.java
@@ -117,9 +117,9 @@ public class GatewayBasicFuncTest {
     config.setGatewayPath( "gateway" );
     driver.setResourceBase( GatewayBasicFuncTest.class );
     driver.setupLdap( findFreePort() );
-    driver.setupService( "WEBHDFS", "http://" + TEST_HOST + ":50070/webhdfs/v1", "/cluster/namenode/api/v1", USE_MOCK_SERVICES );
+    driver.setupService( "WEBHDFS", "http://" + TEST_HOST + ":50070/webhdfs", "/cluster/namenode/api", USE_MOCK_SERVICES );
     driver.setupService( "NAMENODE", "hdfs://" + TEST_HOST + ":8020", null, USE_MOCK_SERVICES );
-    driver.setupService( "DATANODE", "http://" + TEST_HOST + ":50075/webhdfs/v1", "/cluster/datanode/api/v1", USE_MOCK_SERVICES );
+    driver.setupService( "DATANODE", "http://" + TEST_HOST + ":50075/webhdfs", "/cluster/datanode/api", USE_MOCK_SERVICES );
     driver.setupService( "JOBTRACKER", "thrift://" + TEST_HOST + ":8021", null, USE_MOCK_SERVICES );
     driver.setupService( "TEMPLETON", "http://" + TEST_HOST + ":50111/templeton/v1", "/cluster/templeton/api/v1", USE_MOCK_SERVICES );
     driver.setupService( "OOZIE", "http://" + TEST_HOST + ":11000/oozie", "/cluster/oozie/api", USE_MOCK_SERVICES );
@@ -229,7 +229,7 @@ public class GatewayBasicFuncTest {
     driver.getMock( "WEBHDFS" )
         .expect()
         .method( "PUT" )
-        .pathInfo( root + "/dir" )
+        .pathInfo( "/v1" + root + "/dir" )
         .queryParam( "op", "MKDIRS" )
         .queryParam( "user.name", username )
         .respond()
@@ -245,7 +245,7 @@ public class GatewayBasicFuncTest {
         .statusCode( HttpStatus.SC_OK )
         .contentType( "application/json" )
         .content( "boolean", is( true ) )
-        .when().put( driver.getUrl( "WEBHDFS" ) + root + "/dir" );
+        .when().put( driver.getUrl( "WEBHDFS" ) + "/v1" + root + "/dir" );
     driver.assertComplete();
   }
 
@@ -259,12 +259,12 @@ public class GatewayBasicFuncTest {
     driver.getMock( "WEBHDFS" )
         .expect()
         .method( "PUT" )
-        .pathInfo( root + "/dir/file" )
+        .pathInfo( "/v1" + root + "/dir/file" )
         .queryParam( "op", "CREATE" )
         .queryParam( "user.name", username )
         .respond()
         .status( HttpStatus.SC_TEMPORARY_REDIRECT )
-        .header( "Location", driver.getRealUrl( "DATANODE" ) + root + "/dir/file?op=CREATE&user.name=hdfs" );
+        .header( "Location", driver.getRealUrl( "DATANODE" ) + "/v1" + root + "/dir/file?op=CREATE&user.name=hdfs" );
     Response response = given()
         //.log().all()
         .auth().preemptive().basic( username, password )
@@ -272,7 +272,7 @@ public class GatewayBasicFuncTest {
         .expect()
             //.log().ifError()
         .statusCode( HttpStatus.SC_TEMPORARY_REDIRECT )
-        .when().put( driver.getUrl("WEBHDFS") + root + "/dir/file" );
+        .when().put( driver.getUrl("WEBHDFS") + "/v1" + root + "/dir/file" );
     String location = response.getHeader( "Location" );
     //System.out.println( location );
     log.debug( "Redirect location: " + response.getHeader( "Location" ) );
@@ -297,7 +297,7 @@ public class GatewayBasicFuncTest {
     driver.getMock( "WEBHDFS" )
         .expect()
         .method( "DELETE" )
-        .pathInfo( root )
+        .pathInfo( "/v1" + root )
         .queryParam( "op", "DELETE" )
         .queryParam( "user.name", username )
         .queryParam( "recursive", "true" )
@@ -310,7 +310,7 @@ public class GatewayBasicFuncTest {
         .expect()
         //.log().all();
         .statusCode( HttpStatus.SC_OK )
-        .when().delete( driver.getUrl( "WEBHDFS" ) + root + ( driver.isUseGateway() ? "" : "?user.name=" + username ) );
+        .when().delete( driver.getUrl( "WEBHDFS" ) + "/v1" + root + ( driver.isUseGateway() ? "" : "?user.name=" + username ) );
     driver.assertComplete();
 
     /* Create a directory.
@@ -326,7 +326,7 @@ public class GatewayBasicFuncTest {
     driver.getMock( "WEBHDFS" )
         .expect()
         .method( "PUT" )
-        .pathInfo( root + "/dir" )
+        .pathInfo( "/v1" + root + "/dir" )
         .queryParam( "op", "MKDIRS" )
         .queryParam( "user.name", username )
         .respond()
@@ -342,13 +342,13 @@ public class GatewayBasicFuncTest {
         .statusCode( HttpStatus.SC_OK )
         .contentType( "application/json" )
         .content( "boolean", is( true ) )
-        .when().put( driver.getUrl( "WEBHDFS" ) + root + "/dir" );
+        .when().put( driver.getUrl( "WEBHDFS" ) + "/v1" + root + "/dir" );
     driver.assertComplete();
 
     driver.getMock( "WEBHDFS" )
         .expect()
         .method( "GET" )
-        .pathInfo( root )
+        .pathInfo( "/v1" + root )
         .queryParam( "op", "LISTSTATUS" )
         .queryParam( "user.name", username )
         .respond()
@@ -363,7 +363,7 @@ public class GatewayBasicFuncTest {
         //.log().ifError()
         .statusCode( HttpStatus.SC_OK )
         .content( "FileStatuses.FileStatus[0].pathSuffix", is( "dir" ) )
-        .when().get( driver.getUrl( "WEBHDFS" ) + root );
+        .when().get( driver.getUrl( "WEBHDFS" ) + "/v1" + root );
     driver.assertComplete();
 
     //NEGATIVE: Test a bad password.
@@ -371,10 +371,10 @@ public class GatewayBasicFuncTest {
         //.log().all()
         .auth().preemptive().basic( username, "invalid-password" )
         .queryParam( "op", "LISTSTATUS" )
-    .expect()
+        .expect()
         //.log().ifError()
         .statusCode( HttpStatus.SC_UNAUTHORIZED )
-    .when().get( driver.getUrl( "WEBHDFS" ) + root );
+        .when().get( driver.getUrl( "WEBHDFS" ) + "/v1" + root );
     driver.assertComplete();
 
     //NEGATIVE: Test a bad user.
@@ -382,10 +382,10 @@ public class GatewayBasicFuncTest {
         //.log().all()
         .auth().preemptive().basic( "hdfs-user", "hdfs-password" )
         .queryParam( "op", "LISTSTATUS" )
-    .expect()
+        .expect()
         //.log().ifError()
         .statusCode( HttpStatus.SC_UNAUTHORIZED )
-    .when().get( driver.getUrl( "WEBHDFS" ) + root );
+        .when().get( driver.getUrl( "WEBHDFS" ) + "/v1" + root );
     driver.assertComplete();
 
     //NEGATIVE: Test a valid but unauthorized user.
@@ -393,10 +393,10 @@ public class GatewayBasicFuncTest {
       //.log().all()
       .auth().preemptive().basic( "mapred-user", "mapred-password" )
       .queryParam( "op", "LISTSTATUS" )
-   .expect()
+      .expect()
       //.log().ifError()
       .statusCode( HttpStatus.SC_UNAUTHORIZED )
-   .when().get( driver.getUrl( "WEBHDFS" ) + root );
+      .when().get( driver.getUrl( "WEBHDFS" ) + "/v1" + root );
 
     /* Add a file.
     curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=CREATE
@@ -419,16 +419,16 @@ public class GatewayBasicFuncTest {
     driver.getMock( "WEBHDFS" )
         .expect()
         .method( "PUT" )
-        .pathInfo( root + "/dir/file" )
+        .pathInfo( "/v1" + root + "/dir/file" )
         .queryParam( "op", "CREATE" )
         .queryParam( "user.name", username )
         .respond()
         .status( HttpStatus.SC_TEMPORARY_REDIRECT )
-        .header( "Location", driver.getRealUrl( "DATANODE" ) + root + "/dir/file?op=CREATE&user.name=hdfs" );
+        .header( "Location", driver.getRealUrl( "DATANODE" ) + "/v1" + root + "/dir/file?op=CREATE&user.name=hdfs" );
     driver.getMock( "DATANODE" )
         .expect()
         .method( "PUT" )
-        .pathInfo( root + "/dir/file" )
+        .pathInfo( "/v1" + root + "/dir/file" )
         .queryParam( "op", "CREATE" )
         .queryParam( "user.name", username )
         .contentType( "text/plain" )
@@ -436,7 +436,7 @@ public class GatewayBasicFuncTest {
             //.content( driver.gerResourceBytes( "hadoop-examples.jar" ) )
         .respond()
         .status( HttpStatus.SC_CREATED )
-        .header( "Location", "webhdfs://" + driver.getRealAddr( "DATANODE" ) + root + "/dir/file" );
+        .header( "Location", "webhdfs://" + driver.getRealAddr( "DATANODE" ) + "/v1" + root + "/dir/file" );
     Response response = given()
         //.log().all()
         .auth().preemptive().basic( username, password )
@@ -444,7 +444,7 @@ public class GatewayBasicFuncTest {
         .expect()
         //.log().ifError()
         .statusCode( HttpStatus.SC_TEMPORARY_REDIRECT )
-        .when().put( driver.getUrl("WEBHDFS") + root + "/dir/file" );
+        .when().put( driver.getUrl("WEBHDFS") + "/v1" + root + "/dir/file" );
     String location = response.getHeader( "Location" );
     log.debug( "Redirect location: " + response.getHeader( "Location" ) );
     if( driver.isUseGateway() ) {
@@ -489,16 +489,16 @@ public class GatewayBasicFuncTest {
     driver.getMock( "WEBHDFS" )
         .expect()
         .method( "GET" )
-        .pathInfo( root + "/dir/file" )
+        .pathInfo( "/v1" + root + "/dir/file" )
         .queryParam( "op", "OPEN" )
         .queryParam( "user.name", username )
         .respond()
         .status( HttpStatus.SC_TEMPORARY_REDIRECT )
-        .header( "Location", driver.getRealUrl( "DATANODE" ) + root + "/dir/file?op=OPEN&user.name=hdfs" );
+        .header( "Location", driver.getRealUrl( "DATANODE" ) + "/v1" + root + "/dir/file?op=OPEN&user.name=hdfs" );
     driver.getMock( "DATANODE" )
         .expect()
         .method( "GET" )
-        .pathInfo( root + "/dir/file" )
+        .pathInfo( "/v1" + root + "/dir/file" )
         .queryParam( "op", "OPEN" )
         .queryParam( "user.name", username )
         .respond()
@@ -513,7 +513,7 @@ public class GatewayBasicFuncTest {
         //.log().ifError()
         .statusCode( HttpStatus.SC_OK )
         .content( is( "TEST" ) )
-        .when().get( driver.getUrl("WEBHDFS") + root + "/dir/file" );
+        .when().get( driver.getUrl("WEBHDFS") + "/v1" + root + "/dir/file" );
     driver.assertComplete();
 
     /* Delete the directory.
@@ -531,7 +531,7 @@ public class GatewayBasicFuncTest {
     driver.getMock( "WEBHDFS" )
         .expect()
         .method( "DELETE" )
-        .pathInfo( root )
+        .pathInfo( "/v1" + root )
         .queryParam( "op", "DELETE" )
         .queryParam( "user.name", username )
         .queryParam( "recursive", "true" )
@@ -544,7 +544,7 @@ public class GatewayBasicFuncTest {
         .expect()
         //.log().ifError()
         .statusCode( HttpStatus.SC_OK )
-        .when().delete( driver.getUrl( "WEBHDFS" ) + root );
+        .when().delete( driver.getUrl( "WEBHDFS" ) + "/v1" + root );
     driver.assertComplete();
   }
 
@@ -638,7 +638,7 @@ public class GatewayBasicFuncTest {
           .expect()
           //.log().all()
           .statusCode( HttpStatus.SC_UNAUTHORIZED )
-          .when().get( driver.getUrl("WEBHDFS") + root + "/dirA700/fileA700" );
+          .when().get( driver.getUrl("WEBHDFS") + "/v1" + root + "/dirA700/fileA700" );
     }
     driver.assertComplete();
 

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-test/src/test/java/org/apache/hadoop/gateway/GatewayFuncTestDriver.java
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/java/org/apache/hadoop/gateway/GatewayFuncTestDriver.java b/gateway-test/src/test/java/org/apache/hadoop/gateway/GatewayFuncTestDriver.java
index cc3d792..eafaf60 100644
--- a/gateway-test/src/test/java/org/apache/hadoop/gateway/GatewayFuncTestDriver.java
+++ b/gateway-test/src/test/java/org/apache/hadoop/gateway/GatewayFuncTestDriver.java
@@ -280,7 +280,7 @@ public class GatewayFuncTestDriver {
       getMock( "WEBHDFS" )
           .expect()
           .method( "PUT" )
-          .pathInfo( file )
+          .pathInfo( "/v1" + file )
           .queryParam( "user.name", user )
           .queryParam( "op", "CREATE" )
           .respond()
@@ -290,7 +290,7 @@ public class GatewayFuncTestDriver {
       getMock( "WEBHDFS" )
           .expect()
           .method( "PUT" )
-          .pathInfo( file )
+          .pathInfo( "/v1" + file )
           .queryParam( "user.name", user )
           .queryParam( "op", "CREATE" )
           .respond()
@@ -305,7 +305,7 @@ public class GatewayFuncTestDriver {
         .expect()
         //.log().all()
         .statusCode( status )
-        .when().put( getUrl( "WEBHDFS" ) + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
+        .when().put( getUrl( "WEBHDFS" ) + "/v1" + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
     String location = response.getHeader( "Location" );
     log.trace( "Redirect location: " + response.getHeader( "Location" ) );
     return location;
@@ -323,7 +323,7 @@ public class GatewayFuncTestDriver {
           .content( getResourceBytes( resource ) )
           .respond()
           .status( status )
-          .header( "Location", "webhdfs://" + getRealAddr( "DATANODE" ) + path );
+          .header( "Location", "webhdfs://" + getRealAddr( "DATANODE" ) + "/v1" + path );
     } else {
       getMock( "DATANODE" )
           .expect()
@@ -369,7 +369,7 @@ public class GatewayFuncTestDriver {
     getMock( "WEBHDFS" )
         .expect()
         .method( "GET" )
-        .pathInfo( file )
+        .pathInfo( "/v1" + file )
         .queryParam( "user.name", user )
         .queryParam( "op", "OPEN" )
         .respond()
@@ -403,7 +403,7 @@ public class GatewayFuncTestDriver {
         .expect()
         //.log().all()
         .statusCode( status )
-        .when().get( getUrl("WEBHDFS") + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
+        .when().get( getUrl("WEBHDFS") + "/v1" + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
     if( response.getStatusCode() == HttpStatus.SC_OK ) {
       String actualContent = response.asString();
       String expectedContent = getResourceString( resource, Charset.forName("UTF-8") );
@@ -416,7 +416,7 @@ public class GatewayFuncTestDriver {
     getMock( "WEBHDFS" )
         .expect()
         .method( "PUT" )
-        .pathInfo( file )
+        .pathInfo( "/v1" + file )
         .queryParam( "op", "SETOWNER" )
         .queryParam( "user.name", user )
         .queryParam( "owner", owner )
@@ -432,7 +432,7 @@ public class GatewayFuncTestDriver {
         .expect()
         //.log().all()
         .statusCode( status )
-        .when().put( getUrl("WEBHDFS") + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
+        .when().put( getUrl("WEBHDFS") + "/v1" + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
     assertComplete();
   }
 
@@ -440,7 +440,7 @@ public class GatewayFuncTestDriver {
     getMock( "WEBHDFS" )
         .expect()
         .method( "PUT" )
-        .pathInfo( file )
+        .pathInfo( "/v1" + file )
         .queryParam( "op", "SETPERMISSION" )
         .queryParam( "user.name", user )
         .queryParam( "permission", permsOctal )
@@ -454,7 +454,7 @@ public class GatewayFuncTestDriver {
         .expect()
         //.log().all()
         .statusCode( status )
-        .when().put( getUrl("WEBHDFS") + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
+        .when().put( getUrl("WEBHDFS") + "/v1" + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
     assertComplete();
   }
 
@@ -473,7 +473,7 @@ public class GatewayFuncTestDriver {
       getMock( "WEBHDFS" )
           .expect()
           .method( "PUT" )
-          .pathInfo( file )
+          .pathInfo( "/v1" + file )
           .queryParam( "op", "CREATE" )
           .queryParam( "user.name", user )
           .queryParam( "overwrite", "true" )
@@ -484,7 +484,7 @@ public class GatewayFuncTestDriver {
       getMock( "WEBHDFS" )
           .expect()
           .method( "PUT" )
-          .pathInfo( file )
+          .pathInfo( "v1" + file )
           .queryParam( "user.name", user )
           .queryParam( "op", "CREATE" )
           .respond()
@@ -499,7 +499,7 @@ public class GatewayFuncTestDriver {
         .expect()
         //.log().all()
         .statusCode( status )
-        .when().put( getUrl("WEBHDFS") + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
+        .when().put( getUrl("WEBHDFS") + "/v1" + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
     String location = response.getHeader( "Location" );
     log.trace( "Redirect location: " + response.getHeader( "Location" ) );
     return location;
@@ -517,7 +517,7 @@ public class GatewayFuncTestDriver {
           .content( getResourceBytes( resource ) )
           .respond()
           .status( status )
-          .header( "Location", "webhdfs://" + getRealAddr( "DATANODE" ) + path );
+          .header( "Location", "webhdfs://" + getRealAddr( "DATANODE" ) + "/v1" + path );
     } else {
       getMock( "DATANODE" )
           .expect()
@@ -547,7 +547,7 @@ public class GatewayFuncTestDriver {
     getMock( "WEBHDFS" )
         .expect()
         .method( "DELETE" )
-        .pathInfo( file )
+        .pathInfo( "/v1" + file )
         .queryParam( "user.name", user )
         .queryParam( "op", "DELETE" )
         .queryParam( "recursive", recursive )
@@ -561,7 +561,7 @@ public class GatewayFuncTestDriver {
         //.log().all()
         .statusCode( isIn( ArrayUtils.toObject( status ) ) )
         .when()
-        .delete( getUrl( "WEBHDFS" ) + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
+        .delete( getUrl( "WEBHDFS" ) + "/v1" + file + ( isUseGateway() ? "" : "?user.name=" + user ) );
     assertComplete();
   }
 
@@ -569,7 +569,7 @@ public class GatewayFuncTestDriver {
     getMock( "WEBHDFS" )
         .expect()
         .method( "PUT" )
-        .pathInfo( dir )
+        .pathInfo( "/v1" + dir )
         .queryParam( "op", "MKDIRS" )
         .queryParam( "user.name", user )
         .queryParam( "permission", permsOctal )
@@ -588,7 +588,7 @@ public class GatewayFuncTestDriver {
         .contentType( "application/json" )
         .content( "boolean", equalTo( true ) )
         .when()
-        .put( getUrl("WEBHDFS") + dir + ( isUseGateway() ? "" : "?user.name=" + user ) );
+        .put( getUrl("WEBHDFS") + "/v1" + dir + ( isUseGateway() ? "" : "?user.name=" + user ) );
     String location = response.getHeader( "Location" );
     return location;
   }
@@ -611,7 +611,7 @@ public class GatewayFuncTestDriver {
         .statusCode( status )
         .content( equalTo( "TODO" ) )
         .when()
-        .get( getUrl( "WEBHDFS" ) + dir );
+        .get( getUrl( "WEBHDFS" ) + "/v1" + dir );
   }
 
   public String submitJava( String user, String password, String jar, String main, String input, String output, int status ) {

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/gateway-test/src/test/java/org/apache/hadoop/gateway/deploy/DeploymentFactoryFuncTest.java
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/java/org/apache/hadoop/gateway/deploy/DeploymentFactoryFuncTest.java b/gateway-test/src/test/java/org/apache/hadoop/gateway/deploy/DeploymentFactoryFuncTest.java
index c50090b..fb58d0d 100644
--- a/gateway-test/src/test/java/org/apache/hadoop/gateway/deploy/DeploymentFactoryFuncTest.java
+++ b/gateway-test/src/test/java/org/apache/hadoop/gateway/deploy/DeploymentFactoryFuncTest.java
@@ -49,7 +49,7 @@ public class DeploymentFactoryFuncTest {
     topology.setName( "test-cluster" );
     Service service = new Service();
     service.setRole( "WEBHDFS" );
-    service.setUrl( "http://localhost:50070/webhdfs/v1" );
+    service.setUrl( "http://localhost:50070/webhdfs" );
     topology.addService( service );
     Provider provider = new Provider();
     provider.setRole( "authentication" );

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/hsso-release/home/deployments/sample.xml
----------------------------------------------------------------------
diff --git a/hsso-release/home/deployments/sample.xml b/hsso-release/home/deployments/sample.xml
index fff18f6..6b86296 100644
--- a/hsso-release/home/deployments/sample.xml
+++ b/hsso-release/home/deployments/sample.xml
@@ -32,7 +32,7 @@
 
     <service>
         <role>WEBHDFS</role>
-        <url>http://localhost:50070/webhdfs/v1</url>
+        <url>http://localhost:50070/webhdfs</url>
     </service>
     <service>
         <role>TEMPLETON</role>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/hsso-release/home/templates/topology.xml
----------------------------------------------------------------------
diff --git a/hsso-release/home/templates/topology.xml b/hsso-release/home/templates/topology.xml
index 7e431af..d10a43b 100644
--- a/hsso-release/home/templates/topology.xml
+++ b/hsso-release/home/templates/topology.xml
@@ -52,7 +52,7 @@
 
     <service>
         <role>WEBHDFS</role>
-        <url>http://localhost:50070/webhdfs/v1</url>
+        <url>http://localhost:50070/webhdfs</url>
     </service>
     <service>
         <role>TEMPLETON</role>

http://git-wip-us.apache.org/repos/asf/incubator-knox/blob/5467a33d/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 5a2e985..607eadf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -187,6 +187,11 @@
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>2.6</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>3.0</version>
                 <configuration>