You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by su...@apache.org on 2016/03/08 16:35:14 UTC

knox git commit: KNOX-66 Ambari REST API support

Repository: knox
Updated Branches:
  refs/heads/master 3ddb28ea3 -> c2635885d


KNOX-66 Ambari REST API support


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

Branch: refs/heads/master
Commit: c2635885dddf6cfb4db85cfe16dbe5dfd476cbb5
Parents: 3ddb28e
Author: Sumit Gupta <su...@apache.org>
Authored: Tue Mar 8 10:34:39 2016 -0500
Committer: Sumit Gupta <su...@apache.org>
Committed: Tue Mar 8 10:35:07 2016 -0500

----------------------------------------------------------------------
 .../api/UrlRewriteFilterContentDescriptor.java  |   4 +
 .../UrlRewriteFilterContentDescriptorImpl.java  |  24 +-
 .../filter/rewrite/impl/UrlRewriteResponse.java |   7 +
 .../impl/xml/XmlRewriteRulesDigester.java       |   7 +-
 .../resources/services/ambari/2.2.0/rewrite.xml |  30 +++
 .../resources/services/ambari/2.2.0/service.xml |  24 ++
 .../dispatch/AbstractGatewayDispatch.java       |  25 +-
 .../gateway/dispatch/DefaultDispatch.java       |   1 +
 .../dispatch/PassAllHeadersDispatch.java        |  34 +++
 .../gateway/AmbariServiceDefinitionTest.java    | 239 ++++++++++++++++++
 .../clusters-response-expected.json             |  13 +
 .../clusters-response.json                      |  13 +
 .../history-server-response-expected.json       | 250 +++++++++++++++++++
 .../history-server-response.json                | 250 +++++++++++++++++++
 .../test-svcs/readme.txt                        |  18 ++
 .../test-topology.xml                           |  34 +++
 16 files changed, 964 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteFilterContentDescriptor.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteFilterContentDescriptor.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteFilterContentDescriptor.java
index a101b77..73ea970 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteFilterContentDescriptor.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteFilterContentDescriptor.java
@@ -21,8 +21,12 @@ public interface UrlRewriteFilterContentDescriptor extends UrlRewriteFilterGroup
 
   String type();
 
+  String asType();
+
   UrlRewriteFilterContentDescriptor type( String type );
 
+  UrlRewriteFilterContentDescriptor asType( String type );
+
   UrlRewriteFilterBufferDescriptor addBuffer( String path );
 
 }

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteFilterContentDescriptorImpl.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteFilterContentDescriptorImpl.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteFilterContentDescriptorImpl.java
index 83b41b2..3d42537 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteFilterContentDescriptorImpl.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteFilterContentDescriptorImpl.java
@@ -17,7 +17,6 @@
  */
 package org.apache.hadoop.gateway.filter.rewrite.impl;
 
-import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteFilterApplyDescriptor;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteFilterBufferDescriptor;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteFilterContentDescriptor;
 
@@ -27,6 +26,8 @@ public class UrlRewriteFilterContentDescriptorImpl
 
   private String type;
 
+  private String asType;
+
   public UrlRewriteFilterContentDescriptorImpl() {
   }
 
@@ -36,12 +37,23 @@ public class UrlRewriteFilterContentDescriptorImpl
   }
 
   @Override
+  public String asType() {
+    return asType;
+  }
+
+  @Override
   public UrlRewriteFilterContentDescriptor type( String type ) {
     this.type = type;
     return this;
   }
 
-  public void setType( String type ) {
+  @Override
+  public UrlRewriteFilterContentDescriptor asType( String type ) {
+    asType = type;
+    return this;
+  }
+
+  public void setType(String type ) {
     type( type );
   }
 
@@ -49,6 +61,14 @@ public class UrlRewriteFilterContentDescriptorImpl
     return type;
   }
 
+  public String getAsType() {
+    return asType;
+  }
+
+  public void setAsType(String asType) {
+    this.asType = asType;
+  }
+
   @Override
   public UrlRewriteFilterBufferDescriptor addBuffer( String path ) {
     UrlRewriteFilterBufferDescriptor descriptor = new UrlRewriteFilterBufferDescriptorImpl();

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/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 792605e..3a85516 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
@@ -26,6 +26,7 @@ import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteStreamFilterFactor
 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;
@@ -171,6 +172,12 @@ public class UrlRewriteResponse extends GatewayResponseWrapper implements Params
     MimeType mimeType = getMimeType();
     UrlRewriteFilterContentDescriptor filterContentConfig =
         getRewriteFilterConfig( rewriter.getConfig(), bodyFilterName, mimeType );
+    if (filterContentConfig != null) {
+      String asType = filterContentConfig.asType();
+      if ( asType != null && asType.trim().length() > 0 ) {
+        mimeType = MimeTypes.create(asType, getCharacterEncoding());
+      }
+    }
     InputStream filteredInput = UrlRewriteStreamFilterFactory.create(
         mimeType, null, inStream, rewriter, this, UrlRewriter.Direction.OUT, filterContentConfig );
     outStream = (isGzip) ? new GZIPOutputStream(output) : output;

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlRewriteRulesDigester.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlRewriteRulesDigester.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlRewriteRulesDigester.java
index ddd5d00..d4aa7ea 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlRewriteRulesDigester.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlRewriteRulesDigester.java
@@ -21,6 +21,7 @@ import org.apache.commons.digester3.Digester;
 import org.apache.commons.digester3.Rule;
 import org.apache.commons.digester3.SetPropertiesRule;
 import org.apache.commons.digester3.binder.AbstractRulesModule;
+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.UrlRewriteFilterGroupDescriptor;
 import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteFilterPathDescriptor;
@@ -135,7 +136,11 @@ public class XmlRewriteRulesDigester extends AbstractRulesModule implements XmlR
     @Override
     public Object create( String namespace, String name, Attributes attributes ) {
       UrlRewriteFilterDescriptor parent = getDigester().peek();
-      return parent.addContent( attributes.getValue( "type" ) );
+      UrlRewriteFilterContentDescriptor descriptor = parent.addContent( attributes.getValue( "type" ) );
+      if (attributes.getValue( "asType" ) != null) {
+        descriptor = descriptor.asType(attributes.getValue( "asType" ));
+      }
+      return descriptor;
     }
   }
 

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/rewrite.xml
----------------------------------------------------------------------
diff --git a/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/rewrite.xml b/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/rewrite.xml
new file mode 100644
index 0000000..68f2791
--- /dev/null
+++ b/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/rewrite.xml
@@ -0,0 +1,30 @@
+<!--
+   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="IN" name="AMBARI/ambari/inbound" pattern="*://*:*/**/ambari/api/v1/{path=**}?{**}">
+        <rewrite template="{$serviceUrl[AMBARI]}/api/v1/{path=**}?{**}"/>
+    </rule>
+    <rule dir="OUT" name="AMBARI/ambari/href/outbound">
+        <match pattern="*://*:*/api/{**}"/>
+        <rewrite template="{$frontend[url]}/ambari/api/{**}"/>
+    </rule>
+    <filter name="AMBARI/ambari/api/outbound">
+        <content type="text/plain" asType="application/json">
+            <apply path="$.**.href" rule="AMBARI/ambari/href/outbound"/>
+        </content>
+    </filter>
+</rules>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/service.xml
----------------------------------------------------------------------
diff --git a/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/service.xml b/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/service.xml
new file mode 100644
index 0000000..0bd2150
--- /dev/null
+++ b/gateway-service-definitions/src/main/resources/services/ambari/2.2.0/service.xml
@@ -0,0 +1,24 @@
+<!--
+   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.
+-->
+<service role="AMBARI" name="ambari" version="2.7.0">
+    <routes>
+        <route path="/ambari/api/v1/**">
+            <rewrite apply="AMBARI/ambari/api/outbound" to="response.body"/>
+        </route>
+    </routes>
+    <dispatch classname="org.apache.hadoop.gateway.dispatch.PassAllHeadersDispatch"/>
+</service>

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/AbstractGatewayDispatch.java
----------------------------------------------------------------------
diff --git a/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/AbstractGatewayDispatch.java b/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/AbstractGatewayDispatch.java
index f578bbb..2cc1dc0 100644
--- a/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/AbstractGatewayDispatch.java
+++ b/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/AbstractGatewayDispatch.java
@@ -29,18 +29,27 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.util.Arrays;
 import java.util.Enumeration;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 
 public abstract class AbstractGatewayDispatch implements Dispatch {
 
   private static int STREAM_COPY_BUFFER_SIZE = 4096;
-  private static final List<String> EXCLUDE_HEADERS = Arrays.asList( "Host", "Authorization", "Content-Length", "Transfer-Encoding" );
+  private static Set<String> REQUEST_EXCLUDE_HEADERS;
 
   protected  HttpClient client;
 
-  protected void writeResponse( HttpServletRequest request, HttpServletResponse response, InputStream stream )
+  @Override
+  public void init() {
+    REQUEST_EXCLUDE_HEADERS = new HashSet<>();
+    REQUEST_EXCLUDE_HEADERS.add("Host");
+    REQUEST_EXCLUDE_HEADERS.add("Authorization");
+    REQUEST_EXCLUDE_HEADERS.add("Content-Length");
+    REQUEST_EXCLUDE_HEADERS.add("Transfer-Encoding");
+  }
+
+  protected void writeResponse(HttpServletRequest request, HttpServletResponse response, InputStream stream )
       throws IOException {
 //    ResponseStreamer streamer =
 //        (ResponseStreamer)request.getAttribute( RESPONSE_STREAMER_ATTRIBUTE_NAME );
@@ -93,17 +102,21 @@ public abstract class AbstractGatewayDispatch implements Dispatch {
     response.sendError( HttpServletResponse.SC_METHOD_NOT_ALLOWED );
   }
   
-  public static void copyRequestHeaderFields(HttpUriRequest outboundRequest,
+  public void copyRequestHeaderFields(HttpUriRequest outboundRequest,
       HttpServletRequest inboundRequest) {
     Enumeration<String> headerNames = inboundRequest.getHeaderNames();
     while( headerNames.hasMoreElements() ) {
       String name = headerNames.nextElement();
       if ( !outboundRequest.containsHeader( name )
-          && !EXCLUDE_HEADERS.contains( name ) ) {
+          && !getOutboundRequestExcludeHeaders().contains( name ) ) {
         String value = inboundRequest.getHeader( name );
         outboundRequest.addHeader( name, value );
       }
     }
   }
 
+  public Set<String> getOutboundRequestExcludeHeaders() {
+    return REQUEST_EXCLUDE_HEADERS;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/DefaultDispatch.java
----------------------------------------------------------------------
diff --git a/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/DefaultDispatch.java b/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/DefaultDispatch.java
index 9f3cfd3..992a1a6 100644
--- a/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/DefaultDispatch.java
+++ b/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/DefaultDispatch.java
@@ -73,6 +73,7 @@ public class DefaultDispatch extends AbstractGatewayDispatch {
 
   @Override
   public void init() {
+    super.init();
     outboundResponseExcludeHeaders = new HashSet<>();
     outboundResponseExcludeHeaders.add(SET_COOKIE);
     outboundResponseExcludeHeaders.add(WWW_AUTHENTICATE);

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/PassAllHeadersDispatch.java
----------------------------------------------------------------------
diff --git a/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/PassAllHeadersDispatch.java b/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/PassAllHeadersDispatch.java
new file mode 100644
index 0000000..7b8260d
--- /dev/null
+++ b/gateway-spi/src/main/java/org/apache/hadoop/gateway/dispatch/PassAllHeadersDispatch.java
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+package org.apache.hadoop.gateway.dispatch;
+
+import java.util.Collections;
+import java.util.Set;
+
+public class PassAllHeadersDispatch extends DefaultDispatch {
+
+  @Override
+  public Set<String> getOutboundResponseExcludeHeaders() {
+    return Collections.EMPTY_SET;
+  }
+
+  @Override
+  public Set<String> getOutboundRequestExcludeHeaders() {
+    return Collections.EMPTY_SET;
+  }
+}

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-test/src/test/java/org/apache/hadoop/gateway/AmbariServiceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/java/org/apache/hadoop/gateway/AmbariServiceDefinitionTest.java b/gateway-test/src/test/java/org/apache/hadoop/gateway/AmbariServiceDefinitionTest.java
new file mode 100644
index 0000000..11563d1
--- /dev/null
+++ b/gateway-test/src/test/java/org/apache/hadoop/gateway/AmbariServiceDefinitionTest.java
@@ -0,0 +1,239 @@
+/**
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.
+ */
+package org.apache.hadoop.gateway;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.hadoop.gateway.services.DefaultGatewayServices;
+import org.apache.hadoop.gateway.services.GatewayServices;
+import org.apache.hadoop.gateway.services.ServiceLifecycleException;
+import org.apache.hadoop.gateway.services.topology.TopologyService;
+import org.apache.hadoop.test.TestUtils;
+import org.apache.hadoop.test.mock.MockServer;
+import org.apache.http.HttpStatus;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.runtime.RuntimeConstants;
+import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
+import org.hamcrest.MatcherAssert;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.UUID;
+
+import static com.jayway.restassured.RestAssured.given;
+import static org.apache.hadoop.test.TestUtils.LOG_ENTER;
+import static org.apache.hadoop.test.TestUtils.LOG_EXIT;
+import static org.hamcrest.CoreMatchers.*;
+import static uk.co.datumedge.hamcrest.json.SameJSONAs.sameJSONAs;
+
+public class AmbariServiceDefinitionTest {
+
+  private static Logger LOG = LoggerFactory.getLogger( AmbariServiceDefinitionTest.class );
+  private static Class DAT = AmbariServiceDefinitionTest.class;
+
+  private static GatewayTestConfig config;
+  private static DefaultGatewayServices services;
+  private static GatewayServer gateway;
+  private static int gatewayPort;
+  private static String gatewayUrl;
+  private static String clusterUrl;
+  private static Properties params;
+  private static TopologyService topos;
+  private static MockServer mockAmbari;
+
+  private static VelocityEngine velocity;
+  private static VelocityContext context;
+
+  @BeforeClass
+  public static void setupSuite() throws Exception {
+    LOG_ENTER();
+    setupGateway();
+    String topoStr = TestUtils.merge( DAT, "test-topology.xml", params );
+    File topoFile = new File( config.getGatewayTopologyDir(), "test-topology.xml" );
+    FileUtils.writeStringToFile( topoFile, topoStr );
+    topos.reloadTopologies();
+    LOG_EXIT();
+  }
+
+  @AfterClass
+  public static void cleanupSuite() throws Exception {
+    LOG_ENTER();
+    gateway.stop();
+    FileUtils.deleteQuietly( new File( config.getGatewayHomeDir() ) );
+    LOG_EXIT();
+  }
+
+  @After
+  public void cleanupTest() throws Exception {
+    FileUtils.cleanDirectory( new File( config.getGatewayTopologyDir() ) );
+    FileUtils.cleanDirectory( new File( config.getGatewayDeploymentDir() ) );
+  }
+
+  public static void setupGateway() throws Exception {
+    File targetDir = new File( System.getProperty( "user.dir" ), "target" );
+    File gatewayDir = new File( targetDir, "gateway-home-" + UUID.randomUUID() );
+    gatewayDir.mkdirs();
+
+    config = new GatewayTestConfig();
+    config.setGatewayHomeDir( gatewayDir.getAbsolutePath() );
+
+    URL svcsFileUrl = TestUtils.getResourceUrl( DAT, "test-svcs/readme.txt" );
+    File svcsFile = new File( svcsFileUrl.getFile() );
+    File svcsDir = svcsFile.getParentFile();
+    config.setGatewayServicesDir( svcsDir.getAbsolutePath() );
+
+    String pathToStacksSource = "gateway-service-definitions/src/main/resources/services";
+    File stacksSourceDir = new File( targetDir.getParent(), pathToStacksSource);
+    if (!stacksSourceDir.exists()) {
+      stacksSourceDir = new File( targetDir.getParentFile().getParent(), pathToStacksSource);
+    }
+    if (stacksSourceDir.exists()) {
+      FileUtils.copyDirectoryToDirectory(stacksSourceDir, svcsDir);
+    }
+
+    File topoDir = new File( config.getGatewayTopologyDir() );
+    topoDir.mkdirs();
+
+    File deployDir = new File( config.getGatewayDeploymentDir() );
+    deployDir.mkdirs();
+
+    setupMockServers();
+    startGatewayServer();
+  }
+
+  public static void setupMockServers() throws Exception {
+    mockAmbari = new MockServer( "AMBARI", true );
+  }
+
+  public static void startGatewayServer() throws Exception {
+    services = new DefaultGatewayServices();
+    Map<String,String> options = new HashMap<String,String>();
+    options.put( "persist-master", "false" );
+    options.put( "master", "password" );
+    try {
+      services.init( config, options );
+    } catch ( ServiceLifecycleException e ) {
+      e.printStackTrace(); // I18N not required.
+    }
+    topos = services.getService(GatewayServices.TOPOLOGY_SERVICE);
+
+    gateway = GatewayServer.startGateway( config, services );
+    MatcherAssert.assertThat( "Failed to start gateway.", gateway, notNullValue() );
+
+    gatewayPort = gateway.getAddresses()[0].getPort();
+    gatewayUrl = "http://localhost:" + gatewayPort + "/" + config.getGatewayPath();
+    clusterUrl = gatewayUrl + "/test-topology";
+
+    LOG.info( "Gateway port = " + gateway.getAddresses()[ 0 ].getPort() );
+
+    params = new Properties();
+    params.put( "AMBARI_URL", "http://localhost:" + mockAmbari.getPort() );
+
+    velocity = new VelocityEngine();
+    velocity.setProperty( RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.NullLogSystem" );
+    velocity.setProperty( RuntimeConstants.RESOURCE_LOADER, "classpath" );
+    velocity.setProperty( "classpath.resource.loader.class", ClasspathResourceLoader.class.getName() );
+    velocity.init();
+
+    context = new VelocityContext();
+    context.put( "cluster_url", clusterUrl );
+
+  }
+
+  @Test( timeout = TestUtils.MEDIUM_TIMEOUT )
+  public void clusters() throws Exception {
+    LOG_ENTER();
+
+    String username = "guest";
+    String password = "guest-password";
+    String serviceUrl =  clusterUrl + "/ambari/api/v1/clusters";
+
+    mockAmbari.expect()
+        .method( "GET" )
+        .pathInfo( "/api/v1/clusters" )
+        .respond()
+        .status( HttpStatus.SC_OK )
+        .content( TestUtils.getResourceStream( DAT, "clusters-response.json" ) )
+        .contentType( "text/plain" );
+
+    String body = given()
+//        .log().all()
+        .auth().preemptive().basic( username, password )
+        .expect()
+//        .log().all()
+        .statusCode( HttpStatus.SC_OK )
+        .contentType( "text/plain" )
+        .when().get( serviceUrl ).asString();
+
+
+    String name = TestUtils.getResourceName( this.getClass(), "clusters-response-expected.json" );
+    Template template = velocity.getTemplate( name );
+    StringWriter sw = new StringWriter();
+    template.merge( context, sw );
+    String expected = sw.toString();
+
+    MatcherAssert.assertThat(body, sameJSONAs(expected));
+    LOG_EXIT();
+  }
+
+  @Test( timeout = TestUtils.MEDIUM_TIMEOUT )
+  public void historyServer() throws Exception {
+    LOG_ENTER();
+
+    String username = "guest";
+    String password = "guest-password";
+    String serviceUrl =  clusterUrl + "/ambari/api/v1/clusters/test/hosts/c6401.ambari.apache.org/host_components/HISTORYSERVER";
+
+    mockAmbari.expect()
+        .method( "GET" )
+        .pathInfo( "/api/v1/clusters/test/hosts/c6401.ambari.apache.org/host_components/HISTORYSERVER" )
+        .respond()
+        .status( HttpStatus.SC_OK )
+        .content( TestUtils.getResourceStream( DAT, "history-server-response.json" ) )
+        .contentType( "text/plain" );
+
+    String body = given()
+        .auth().preemptive().basic( username, password )
+        .expect()
+        .statusCode( HttpStatus.SC_OK )
+        .contentType( "text/plain" )
+        .when().get( serviceUrl ).asString();
+
+
+    String name = TestUtils.getResourceName( this.getClass(), "history-server-response-expected.json" );
+    Template template = velocity.getTemplate( name );
+    StringWriter sw = new StringWriter();
+    template.merge( context, sw );
+    String expected = sw.toString();
+
+    MatcherAssert.assertThat(body, sameJSONAs(expected));
+    LOG_EXIT();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/clusters-response-expected.json
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/clusters-response-expected.json b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/clusters-response-expected.json
new file mode 100644
index 0000000..7618e36
--- /dev/null
+++ b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/clusters-response-expected.json
@@ -0,0 +1,13 @@
+{
+  "href": "$cluster_url/ambari/api/v1/clusters",
+  "items": [
+    {
+      "href": "$cluster_url/ambari/api/v1/clusters/test",
+      "Clusters": {
+        "cluster_name": "test",
+        "version": "HDP-2.3"
+      }
+    }
+  ]
+}
+

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/clusters-response.json
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/clusters-response.json b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/clusters-response.json
new file mode 100644
index 0000000..692eca3
--- /dev/null
+++ b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/clusters-response.json
@@ -0,0 +1,13 @@
+
+{
+  "href" : "http://c6401.ambari.apache.org:8080/api/v1/clusters",
+  "items" : [
+    {
+      "href" : "http://c6401.ambari.apache.org:8080/api/v1/clusters/test",
+      "Clusters" : {
+        "cluster_name" : "test",
+        "version" : "HDP-2.3"
+      }
+    }
+  ]
+}

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/history-server-response-expected.json
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/history-server-response-expected.json b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/history-server-response-expected.json
new file mode 100644
index 0000000..7a86ebc
--- /dev/null
+++ b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/history-server-response-expected.json
@@ -0,0 +1,250 @@
+{
+  "href" : "$cluster_url/ambari/api/v1/clusters/test/hosts/c6401.ambari.apache.org/host_components/HISTORYSERVER",
+  "HostRoles" : {
+    "cluster_name" : "test",
+    "component_name" : "HISTORYSERVER",
+    "desired_stack_id" : "HDP-2.3",
+    "desired_state" : "STARTED",
+    "hdp_version" : "HDP-2.3.4.0-3485",
+    "host_name" : "c6401.ambari.apache.org",
+    "maintenance_state" : "OFF",
+    "service_name" : "MAPREDUCE2",
+    "stack_id" : "HDP-2.3",
+    "stale_configs" : false,
+    "state" : "UNKNOWN",
+    "upgrade_state" : "NONE",
+    "actual_configs" : {
+      "admin-properties" : {
+        "default" : "version1454604858144"
+      },
+      "capacity-scheduler" : {
+        "default" : "version1455118418013"
+      },
+      "cluster-env" : {
+        "default" : "version1455118418522"
+      },
+      "core-site" : {
+        "default" : "version1455118418648"
+      },
+      "gateway-log4j" : {
+        "default" : "version1"
+      },
+      "gateway-site" : {
+        "default" : "version1455118418151"
+      },
+      "hadoop-env" : {
+        "default" : "version1453930080957"
+      },
+      "hadoop-policy" : {
+        "default" : "version1"
+      },
+      "hbase-env" : {
+        "default" : "version1454359592877"
+      },
+      "hbase-log4j" : {
+        "default" : "version1454359591233"
+      },
+      "hbase-policy" : {
+        "default" : "version1454359591233"
+      },
+      "hbase-site" : {
+        "default" : "version1455118418258"
+      },
+      "hcat-env" : {
+        "default" : "version1"
+      },
+      "hdfs-log4j" : {
+        "default" : "version1"
+      },
+      "hdfs-site" : {
+        "default" : "version1455118417916"
+      },
+      "hive-env" : {
+        "default" : "version1"
+      },
+      "hive-exec-log4j" : {
+        "default" : "version1"
+      },
+      "hive-log4j" : {
+        "default" : "version1"
+      },
+      "hive-site" : {
+        "default" : "version1455118418323"
+      },
+      "hiveserver2-site" : {
+        "default" : "version1453995823280"
+      },
+      "kerberos-env" : {
+        "default" : "version1453929906086"
+      },
+      "knox-env" : {
+        "default" : "version1453930080890"
+      },
+      "krb5-conf" : {
+        "default" : "version1453929906086"
+      },
+      "ldap-log4j" : {
+        "default" : "version1"
+      },
+      "mapred-env" : {
+        "default" : "version1"
+      },
+      "mapred-site" : {
+        "default" : "version1453930080915"
+      },
+      "oozie-env" : {
+        "default" : "version1454359591233"
+      },
+      "oozie-log4j" : {
+        "default" : "version1454359591233"
+      },
+      "oozie-site" : {
+        "default" : "version1455118418401"
+      },
+      "pig-env" : {
+        "default" : "version1"
+      },
+      "pig-log4j" : {
+        "default" : "version1"
+      },
+      "pig-properties" : {
+        "default" : "version1"
+      },
+      "ranger-admin-site" : {
+        "default" : "version1454619167059"
+      },
+      "ranger-env" : {
+        "default" : "version1454606224810"
+      },
+      "ranger-hbase-audit" : {
+        "default" : "version1454604858137"
+      },
+      "ranger-hbase-plugin-properties" : {
+        "default" : "version1454604858136"
+      },
+      "ranger-hbase-policymgr-ssl" : {
+        "default" : "version1454604858137"
+      },
+      "ranger-hbase-security" : {
+        "default" : "version1454604858136"
+      },
+      "ranger-hdfs-audit" : {
+        "default" : "version1454604858129"
+      },
+      "ranger-hdfs-plugin-properties" : {
+        "default" : "version1454606224830"
+      },
+      "ranger-hdfs-policymgr-ssl" : {
+        "default" : "version1454604858132"
+      },
+      "ranger-hdfs-security" : {
+        "default" : "version1454604858129"
+      },
+      "ranger-hive-audit" : {
+        "default" : "version1454604858135"
+      },
+      "ranger-hive-plugin-properties" : {
+        "default" : "version1454604858135"
+      },
+      "ranger-hive-policymgr-ssl" : {
+        "default" : "version1454604858136"
+      },
+      "ranger-hive-security" : {
+        "default" : "version1454604858135"
+      },
+      "ranger-knox-audit" : {
+        "default" : "version1454604858138"
+      },
+      "ranger-knox-plugin-properties" : {
+        "default" : "version1454606224851"
+      },
+      "ranger-knox-policymgr-ssl" : {
+        "default" : "version1454604858138"
+      },
+      "ranger-knox-security" : {
+        "default" : "version1454604858138"
+      },
+      "ranger-site" : {
+        "default" : "version1454604858144"
+      },
+      "ranger-ugsync-site" : {
+        "default" : "version1454604858144"
+      },
+      "ranger-yarn-audit" : {
+        "default" : "version1454604858134"
+      },
+      "ranger-yarn-plugin-properties" : {
+        "default" : "version1454604858133"
+      },
+      "ranger-yarn-policymgr-ssl" : {
+        "default" : "version1454604858134"
+      },
+      "ranger-yarn-security" : {
+        "default" : "version1454604858133"
+      },
+      "ssl-client" : {
+        "default" : "version1"
+      },
+      "ssl-server" : {
+        "default" : "version1"
+      },
+      "tez-env" : {
+        "default" : "version1"
+      },
+      "tez-site" : {
+        "default" : "version1455118418459"
+      },
+      "topology" : {
+        "default" : "version1454606224851"
+      },
+      "users-ldif" : {
+        "default" : "version1"
+      },
+      "usersync-properties" : {
+        "default" : "version1454604858144"
+      },
+      "webhcat-env" : {
+        "default" : "version1"
+      },
+      "webhcat-log4j" : {
+        "default" : "version1"
+      },
+      "webhcat-site" : {
+        "default" : "version1455118418562"
+      },
+      "yarn-env" : {
+        "default" : "version1"
+      },
+      "yarn-log4j" : {
+        "default" : "version1"
+      },
+      "yarn-site" : {
+        "default" : "version1455118418065"
+      },
+      "zoo.cfg" : {
+        "default" : "version1"
+      },
+      "zookeeper-env" : {
+        "default" : "version1453930081017"
+      },
+      "zookeeper-log4j" : {
+        "default" : "version1"
+      }
+    }
+  },
+  "host" : {
+    "href" : "$cluster_url/ambari/api/v1/clusters/test/hosts/c6401.ambari.apache.org"
+  },
+  "component" : [
+    {
+      "href" : "$cluster_url/ambari/api/v1/clusters/test/services/MAPREDUCE2/components/HISTORYSERVER",
+      "ServiceComponentInfo" : {
+        "cluster_name" : "test",
+        "component_name" : "HISTORYSERVER",
+        "service_name" : "MAPREDUCE2"
+      }
+    }
+  ],
+  "processes" : [ ]
+}
+

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/history-server-response.json
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/history-server-response.json b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/history-server-response.json
new file mode 100644
index 0000000..d6064bd
--- /dev/null
+++ b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/history-server-response.json
@@ -0,0 +1,250 @@
+{
+  "href" : "http://c6401.ambari.apache.org:8080/api/v1/clusters/test/hosts/c6401.ambari.apache.org/host_components/HISTORYSERVER",
+  "HostRoles" : {
+    "cluster_name" : "test",
+    "component_name" : "HISTORYSERVER",
+    "desired_stack_id" : "HDP-2.3",
+    "desired_state" : "STARTED",
+    "hdp_version" : "HDP-2.3.4.0-3485",
+    "host_name" : "c6401.ambari.apache.org",
+    "maintenance_state" : "OFF",
+    "service_name" : "MAPREDUCE2",
+    "stack_id" : "HDP-2.3",
+    "stale_configs" : false,
+    "state" : "UNKNOWN",
+    "upgrade_state" : "NONE",
+    "actual_configs" : {
+      "admin-properties" : {
+        "default" : "version1454604858144"
+      },
+      "capacity-scheduler" : {
+        "default" : "version1455118418013"
+      },
+      "cluster-env" : {
+        "default" : "version1455118418522"
+      },
+      "core-site" : {
+        "default" : "version1455118418648"
+      },
+      "gateway-log4j" : {
+        "default" : "version1"
+      },
+      "gateway-site" : {
+        "default" : "version1455118418151"
+      },
+      "hadoop-env" : {
+        "default" : "version1453930080957"
+      },
+      "hadoop-policy" : {
+        "default" : "version1"
+      },
+      "hbase-env" : {
+        "default" : "version1454359592877"
+      },
+      "hbase-log4j" : {
+        "default" : "version1454359591233"
+      },
+      "hbase-policy" : {
+        "default" : "version1454359591233"
+      },
+      "hbase-site" : {
+        "default" : "version1455118418258"
+      },
+      "hcat-env" : {
+        "default" : "version1"
+      },
+      "hdfs-log4j" : {
+        "default" : "version1"
+      },
+      "hdfs-site" : {
+        "default" : "version1455118417916"
+      },
+      "hive-env" : {
+        "default" : "version1"
+      },
+      "hive-exec-log4j" : {
+        "default" : "version1"
+      },
+      "hive-log4j" : {
+        "default" : "version1"
+      },
+      "hive-site" : {
+        "default" : "version1455118418323"
+      },
+      "hiveserver2-site" : {
+        "default" : "version1453995823280"
+      },
+      "kerberos-env" : {
+        "default" : "version1453929906086"
+      },
+      "knox-env" : {
+        "default" : "version1453930080890"
+      },
+      "krb5-conf" : {
+        "default" : "version1453929906086"
+      },
+      "ldap-log4j" : {
+        "default" : "version1"
+      },
+      "mapred-env" : {
+        "default" : "version1"
+      },
+      "mapred-site" : {
+        "default" : "version1453930080915"
+      },
+      "oozie-env" : {
+        "default" : "version1454359591233"
+      },
+      "oozie-log4j" : {
+        "default" : "version1454359591233"
+      },
+      "oozie-site" : {
+        "default" : "version1455118418401"
+      },
+      "pig-env" : {
+        "default" : "version1"
+      },
+      "pig-log4j" : {
+        "default" : "version1"
+      },
+      "pig-properties" : {
+        "default" : "version1"
+      },
+      "ranger-admin-site" : {
+        "default" : "version1454619167059"
+      },
+      "ranger-env" : {
+        "default" : "version1454606224810"
+      },
+      "ranger-hbase-audit" : {
+        "default" : "version1454604858137"
+      },
+      "ranger-hbase-plugin-properties" : {
+        "default" : "version1454604858136"
+      },
+      "ranger-hbase-policymgr-ssl" : {
+        "default" : "version1454604858137"
+      },
+      "ranger-hbase-security" : {
+        "default" : "version1454604858136"
+      },
+      "ranger-hdfs-audit" : {
+        "default" : "version1454604858129"
+      },
+      "ranger-hdfs-plugin-properties" : {
+        "default" : "version1454606224830"
+      },
+      "ranger-hdfs-policymgr-ssl" : {
+        "default" : "version1454604858132"
+      },
+      "ranger-hdfs-security" : {
+        "default" : "version1454604858129"
+      },
+      "ranger-hive-audit" : {
+        "default" : "version1454604858135"
+      },
+      "ranger-hive-plugin-properties" : {
+        "default" : "version1454604858135"
+      },
+      "ranger-hive-policymgr-ssl" : {
+        "default" : "version1454604858136"
+      },
+      "ranger-hive-security" : {
+        "default" : "version1454604858135"
+      },
+      "ranger-knox-audit" : {
+        "default" : "version1454604858138"
+      },
+      "ranger-knox-plugin-properties" : {
+        "default" : "version1454606224851"
+      },
+      "ranger-knox-policymgr-ssl" : {
+        "default" : "version1454604858138"
+      },
+      "ranger-knox-security" : {
+        "default" : "version1454604858138"
+      },
+      "ranger-site" : {
+        "default" : "version1454604858144"
+      },
+      "ranger-ugsync-site" : {
+        "default" : "version1454604858144"
+      },
+      "ranger-yarn-audit" : {
+        "default" : "version1454604858134"
+      },
+      "ranger-yarn-plugin-properties" : {
+        "default" : "version1454604858133"
+      },
+      "ranger-yarn-policymgr-ssl" : {
+        "default" : "version1454604858134"
+      },
+      "ranger-yarn-security" : {
+        "default" : "version1454604858133"
+      },
+      "ssl-client" : {
+        "default" : "version1"
+      },
+      "ssl-server" : {
+        "default" : "version1"
+      },
+      "tez-env" : {
+        "default" : "version1"
+      },
+      "tez-site" : {
+        "default" : "version1455118418459"
+      },
+      "topology" : {
+        "default" : "version1454606224851"
+      },
+      "users-ldif" : {
+        "default" : "version1"
+      },
+      "usersync-properties" : {
+        "default" : "version1454604858144"
+      },
+      "webhcat-env" : {
+        "default" : "version1"
+      },
+      "webhcat-log4j" : {
+        "default" : "version1"
+      },
+      "webhcat-site" : {
+        "default" : "version1455118418562"
+      },
+      "yarn-env" : {
+        "default" : "version1"
+      },
+      "yarn-log4j" : {
+        "default" : "version1"
+      },
+      "yarn-site" : {
+        "default" : "version1455118418065"
+      },
+      "zoo.cfg" : {
+        "default" : "version1"
+      },
+      "zookeeper-env" : {
+        "default" : "version1453930081017"
+      },
+      "zookeeper-log4j" : {
+        "default" : "version1"
+      }
+    }
+  },
+  "host" : {
+    "href" : "http://c6401.ambari.apache.org:8080/api/v1/clusters/test/hosts/c6401.ambari.apache.org"
+  },
+  "component" : [
+    {
+      "href" : "http://c6401.ambari.apache.org:8080/api/v1/clusters/test/services/MAPREDUCE2/components/HISTORYSERVER",
+      "ServiceComponentInfo" : {
+        "cluster_name" : "test",
+        "component_name" : "HISTORYSERVER",
+        "service_name" : "MAPREDUCE2"
+      }
+    }
+  ],
+  "processes" : [ ]
+}
+

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/test-svcs/readme.txt
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/test-svcs/readme.txt b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/test-svcs/readme.txt
new file mode 100644
index 0000000..cd2eef8
--- /dev/null
+++ b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/test-svcs/readme.txt
@@ -0,0 +1,18 @@
+##########################################################################
+# 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.
+##########################################################################
+This file is here to help the tests find the parent directory.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/knox/blob/c2635885/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/test-topology.xml
----------------------------------------------------------------------
diff --git a/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/test-topology.xml b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/test-topology.xml
new file mode 100644
index 0000000..519d426
--- /dev/null
+++ b/gateway-test/src/test/resources/org/apache/hadoop/gateway/AmbariServiceDefinitionTest/test-topology.xml
@@ -0,0 +1,34 @@
+<!--
+   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.
+-->
+<topology>
+    <gateway>
+        <provider>
+            <role>authentication</role>
+            <name>Anonymous</name>
+            <enabled>true</enabled>
+        </provider>
+        <provider>
+            <role>identity-assertion</role>
+            <name>Default</name>
+            <enabled>false</enabled>
+        </provider>
+    </gateway>
+    <service>
+        <role>AMBARI</role>
+        <url>$AMBARI_URL</url>
+    </service>
+</topology>