You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by lm...@apache.org on 2017/09/20 00:01:02 UTC

knox git commit: KNOX-1049 - Default Service or App Context for Topologies

Repository: knox
Updated Branches:
  refs/heads/KNOX-1049 [created] 3a411555f


KNOX-1049 - Default Service or App Context for Topologies

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

Branch: refs/heads/KNOX-1049
Commit: 3a411555fa9a89965281604c4e56709325abf743
Parents: a5a8825
Author: Larry McCay <lm...@hortonworks.com>
Authored: Tue Sep 19 20:00:24 2017 -0400
Committer: Larry McCay <lm...@hortonworks.com>
Committed: Tue Sep 19 20:00:24 2017 -0400

----------------------------------------------------------------------
 .../apache/hadoop/gateway/GatewayFilter.java    | 64 +++++++++++++++++++-
 .../builder/BeanPropertyTopologyBuilder.java    | 11 ++++
 .../xml/KnoxFormatXmlTopologyRules.java         |  2 +
 .../src/main/resources/conf/topology-v1.xsd     |  1 +
 .../service/admin/TopologiesResource.java       | 11 ++++
 .../service/admin/beans/BeanConverter.java      |  2 +
 .../gateway/service/admin/beans/Topology.java   | 11 ++++
 .../hadoop/gateway/topology/Topology.java       |  9 +++
 .../gateway/topology/topology_binding-xml.xml   |  3 +-
 9 files changed, 112 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/knox/blob/3a411555/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayFilter.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayFilter.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayFilter.java
index c92ebfe..2885fe3 100644
--- a/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayFilter.java
+++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayFilter.java
@@ -31,6 +31,7 @@ import org.apache.hadoop.gateway.config.GatewayConfig;
 import org.apache.hadoop.gateway.filter.AbstractGatewayFilter;
 import org.apache.hadoop.gateway.i18n.messages.MessagesFactory;
 import org.apache.hadoop.gateway.i18n.resources.ResourcesFactory;
+import org.apache.hadoop.gateway.topology.Topology;
 import org.apache.hadoop.gateway.util.urltemplate.Matcher;
 import org.apache.hadoop.gateway.util.urltemplate.Parser;
 import org.apache.hadoop.gateway.util.urltemplate.Template;
@@ -43,6 +44,7 @@ import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
 import javax.servlet.http.HttpServletResponse;
 
 import java.io.IOException;
@@ -122,7 +124,35 @@ public class GatewayFilter implements Filter {
         AbstractGatewayFilter.SOURCE_REQUEST_CONTEXT_URL_ATTRIBUTE_NAME, contextWithPathAndQuery );
 
     Matcher<Chain>.Match match = chains.match( pathWithQueryTemplate );
-    
+
+    // if there was no match then look for a default service for the topology
+    if (match == null) {
+      Topology topology = (Topology) servletRequest.getServletContext().getAttribute("org.apache.hadoop.gateway.topology");
+      String defaultServicePath = topology.getDefaultServicePath();
+      if (defaultServicePath != null) {
+        try {
+          String newPathWithQuery = defaultServicePath + "/" + pathWithQueryTemplate;
+          match = chains.match(Parser.parseLiteral(newPathWithQuery));
+          String origUrl = ((HttpServletRequest) servletRequest).getRequestURL().toString();
+          String url = origUrl;
+          if (path.equals("/")) {
+            url += defaultServicePath;
+          }
+          else {
+            int index = origUrl.indexOf(path);
+            url = origUrl.substring(0, index) + "/" + defaultServicePath + path;
+          }
+          String contextPath = defaultServicePath;
+          servletRequest = new ForwardedRequest((HttpServletRequest) servletRequest, 
+              contextPath, 
+              url);
+        } catch (URISyntaxException e) {
+          throw new ServletException( e );
+        }
+//        ((HttpServletRequest) servletRequest).getRequestURL();
+      }
+    }
+
     assignCorrelationRequestId();
     // Populate Audit/correlation parameters
     AuditContext auditContext = auditService.getContext();
@@ -387,4 +417,36 @@ public class GatewayFilter implements Filter {
 
   }
 
+  /**
+   * A request wrapper class that wraps a request and adds the context path if
+   * needed.
+   */
+  static class ForwardedRequest extends HttpServletRequestWrapper {
+
+    private String newURL;
+    private String contextpath;
+
+    public ForwardedRequest(final HttpServletRequest request,
+        final String contextpath, final String newURL) {
+      super(request);
+      this.newURL = newURL;
+      this.contextpath = contextpath;
+    }
+
+    @Override
+    public StringBuffer getRequestURL() {
+      return new StringBuffer(newURL);
+    }
+
+    @Override
+    public String getRequestURI() {
+      return newURL;
+    }
+
+    @Override
+    public String getContextPath() {
+      return super.getContextPath() + "/" + this.contextpath;
+    }
+
+  }
 }

http://git-wip-us.apache.org/repos/asf/knox/blob/3a411555/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/builder/BeanPropertyTopologyBuilder.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/builder/BeanPropertyTopologyBuilder.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/builder/BeanPropertyTopologyBuilder.java
index b5e80d2..b33e52c 100644
--- a/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/builder/BeanPropertyTopologyBuilder.java
+++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/builder/BeanPropertyTopologyBuilder.java
@@ -27,6 +27,7 @@ import org.apache.hadoop.gateway.topology.Topology;
 public class BeanPropertyTopologyBuilder implements TopologyBuilder {
 
     private String name;
+    private String defaultService;
     private List<Provider> providers;
     private List<Service> services;
     private List<Application> applications;
@@ -46,6 +47,15 @@ public class BeanPropertyTopologyBuilder implements TopologyBuilder {
         return name;
     }
 
+    public BeanPropertyTopologyBuilder defaultService(String defaultService) {
+      this.defaultService = defaultService;
+      return this;
+    }
+
+    public String defaultService() {
+      return defaultService;
+    }
+
     public BeanPropertyTopologyBuilder addProvider(Provider provider) {
         providers.add(provider);
         return this;
@@ -76,6 +86,7 @@ public class BeanPropertyTopologyBuilder implements TopologyBuilder {
     public Topology build() {
         Topology topology = new Topology();
         topology.setName(name);
+        topology.setDefaultServicePath(defaultService);
 
           for (Provider provider : providers) {
             topology.addProvider(provider);

http://git-wip-us.apache.org/repos/asf/knox/blob/3a411555/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/xml/KnoxFormatXmlTopologyRules.java
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/xml/KnoxFormatXmlTopologyRules.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/xml/KnoxFormatXmlTopologyRules.java
index e573d63..e221507 100644
--- a/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/xml/KnoxFormatXmlTopologyRules.java
+++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/topology/xml/KnoxFormatXmlTopologyRules.java
@@ -32,6 +32,7 @@ public class KnoxFormatXmlTopologyRules extends AbstractRulesModule {
   private static final String ROOT_TAG = "topology";
   private static final String NAME_TAG = "name";
   private static final String VERSION_TAG = "version";
+  private static final String DEFAULT_SERVICE_TAG = "default-service";
   private static final String APPLICATION_TAG = "application";
   private static final String SERVICE_TAG = "service";
   private static final String ROLE_TAG = "role";
@@ -48,6 +49,7 @@ public class KnoxFormatXmlTopologyRules extends AbstractRulesModule {
     forPattern( ROOT_TAG ).createObject().ofType( BeanPropertyTopologyBuilder.class );
     forPattern( ROOT_TAG + "/" + NAME_TAG ).callMethod("name").usingElementBodyAsArgument();
     forPattern( ROOT_TAG + "/" + VERSION_TAG ).callMethod("version").usingElementBodyAsArgument();
+    forPattern( ROOT_TAG + "/" + DEFAULT_SERVICE_TAG ).callMethod("defaultService").usingElementBodyAsArgument();
 
     forPattern( ROOT_TAG + "/" + APPLICATION_TAG ).createObject().ofType( Application.class ).then().setNext( "addApplication" );
     forPattern( ROOT_TAG + "/" + APPLICATION_TAG + "/" + ROLE_TAG ).setBeanProperty();

http://git-wip-us.apache.org/repos/asf/knox/blob/3a411555/gateway-server/src/main/resources/conf/topology-v1.xsd
----------------------------------------------------------------------
diff --git a/gateway-server/src/main/resources/conf/topology-v1.xsd b/gateway-server/src/main/resources/conf/topology-v1.xsd
index 9e3bed6..ab07caa 100644
--- a/gateway-server/src/main/resources/conf/topology-v1.xsd
+++ b/gateway-server/src/main/resources/conf/topology-v1.xsd
@@ -21,6 +21,7 @@ limitations under the License.
             <h:sequence maxOccurs="1">
 
                 <h:element name="name" minOccurs="0" maxOccurs="1"/>
+                <h:element name="default-service" minOccurs="0" maxOccurs="1"/>
 
                 <h:element name="gateway" minOccurs="0" maxOccurs="1">
                     <h:complexType>

http://git-wip-us.apache.org/repos/asf/knox/blob/3a411555/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/TopologiesResource.java
----------------------------------------------------------------------
diff --git a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/TopologiesResource.java b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/TopologiesResource.java
index 1504eca..4748047 100644
--- a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/TopologiesResource.java
+++ b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/TopologiesResource.java
@@ -245,6 +245,8 @@ public class TopologiesResource {
     @XmlElement
     private String timestamp;
     @XmlElement
+    private String defaultServicePath;
+    @XmlElement
     private String uri;
     @XmlElement
     private String href;
@@ -254,6 +256,7 @@ public class TopologiesResource {
     public SimpleTopology(org.apache.hadoop.gateway.topology.Topology t, String uri, String href) {
       this.name = t.getName();
       this.timestamp = Long.toString(t.getTimestamp());
+      this.defaultServicePath = t.getDefaultServicePath();
       this.uri = uri;
       this.href = href;
     }
@@ -270,6 +273,14 @@ public class TopologiesResource {
       return timestamp;
     }
 
+    public void setDefaultService(String defaultServicePath) {
+      this.defaultServicePath = defaultServicePath;
+    }
+
+    public String getDefaultService() {
+      return defaultServicePath;
+    }
+
     public void setTimestamp(String timestamp) {
       this.timestamp = timestamp;
     }

http://git-wip-us.apache.org/repos/asf/knox/blob/3a411555/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/BeanConverter.java
----------------------------------------------------------------------
diff --git a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/BeanConverter.java b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/BeanConverter.java
index e0c9d06..ac3b19c 100644
--- a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/BeanConverter.java
+++ b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/BeanConverter.java
@@ -27,6 +27,7 @@ public class BeanConverter {
     Topology topologyResource = new Topology();
     topologyResource.setName(topology.getName());
     topologyResource.setTimestamp(topology.getTimestamp());
+    topologyResource.setDefaultService(topology.getDefaultServicePath());
     topologyResource.setUri(topology.getUri());
     for ( org.apache.hadoop.gateway.topology.Provider provider : topology.getProviders() ) {
       topologyResource.getProviders().add( getProvider(provider) );
@@ -44,6 +45,7 @@ public class BeanConverter {
     org.apache.hadoop.gateway.topology.Topology deploymentTopology = new org.apache.hadoop.gateway.topology.Topology();
     deploymentTopology.setName(topology.getName());
     deploymentTopology.setTimestamp(topology.getTimestamp());
+    deploymentTopology.setDefaultServicePath(topology.getDefaultService());
     deploymentTopology.setUri(topology.getUri());
     for ( Provider provider : topology.getProviders() ) {
       deploymentTopology.addProvider( getProvider(provider) );

http://git-wip-us.apache.org/repos/asf/knox/blob/3a411555/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/Topology.java
----------------------------------------------------------------------
diff --git a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/Topology.java b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/Topology.java
index 6e85b7a..8bc5fa7 100644
--- a/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/Topology.java
+++ b/gateway-service-admin/src/main/java/org/apache/hadoop/gateway/service/admin/beans/Topology.java
@@ -34,6 +34,9 @@ public class Topology {
   private String name;
 
   @XmlElement
+  private String defaultServicePath;
+
+  @XmlElement
   private long timestamp;
 
   @XmlElement(name="provider")
@@ -69,6 +72,14 @@ public class Topology {
     return timestamp;
   }
 
+  public void setDefaultService( String defaultServicePath ) {
+    this.defaultServicePath = defaultServicePath;
+  }
+
+  public String getDefaultService() {
+    return defaultServicePath;
+  }
+
   public void setTimestamp( long timestamp ) {
     this.timestamp = timestamp;
   }

http://git-wip-us.apache.org/repos/asf/knox/blob/3a411555/gateway-spi/src/main/java/org/apache/hadoop/gateway/topology/Topology.java
----------------------------------------------------------------------
diff --git a/gateway-spi/src/main/java/org/apache/hadoop/gateway/topology/Topology.java b/gateway-spi/src/main/java/org/apache/hadoop/gateway/topology/Topology.java
index 7f37336..c366421 100644
--- a/gateway-spi/src/main/java/org/apache/hadoop/gateway/topology/Topology.java
+++ b/gateway-spi/src/main/java/org/apache/hadoop/gateway/topology/Topology.java
@@ -31,6 +31,7 @@ public class Topology {
 
   private URI uri;
   private String name;
+  private String defaultServicePath = null;
   private long timestamp;
   public List<Provider> providerList = new ArrayList<Provider>();
   private Map<String,Map<String,Provider>> providerMap = new HashMap<>();
@@ -67,6 +68,14 @@ public class Topology {
     this.timestamp = timestamp;
   }
 
+  public String getDefaultServicePath() {
+    return defaultServicePath;
+  }
+
+  public void setDefaultServicePath(String servicePath) {
+    defaultServicePath = servicePath;
+  }
+
   public Collection<Service> getServices() {
     return services;
   }

http://git-wip-us.apache.org/repos/asf/knox/blob/3a411555/gateway-spi/src/main/resources/org/apache/hadoop/gateway/topology/topology_binding-xml.xml
----------------------------------------------------------------------
diff --git a/gateway-spi/src/main/resources/org/apache/hadoop/gateway/topology/topology_binding-xml.xml b/gateway-spi/src/main/resources/org/apache/hadoop/gateway/topology/topology_binding-xml.xml
index 50d8d58..8c54ed7 100644
--- a/gateway-spi/src/main/resources/org/apache/hadoop/gateway/topology/topology_binding-xml.xml
+++ b/gateway-spi/src/main/resources/org/apache/hadoop/gateway/topology/topology_binding-xml.xml
@@ -24,10 +24,11 @@ or more contributor license agreements.  See the NOTICE file
         element-form-default="QUALIFIED"/>
     <java-types>
         <java-type name="Topology" xml-accessor-type="NONE">
-            <xml-type prop-order="name providers services applications"/>
+            <xml-type prop-order="name defaultServicePath providers services applications"/>
             <xml-root-element/>
             <java-attributes>
                 <xml-element java-attribute="name" name="name"/>
+                <xml-element java-attribute="defaultServicePath" name="default-service"/>
                 <xml-elements java-attribute="providers">
                     <xml-element name="provider"/>
                     <xml-element-wrapper name="gateway"/>