You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by js...@apache.org on 2014/06/19 16:14:32 UTC

git commit: AMBARI-6201. Fix /stacks api sub-resource names.

Repository: ambari
Updated Branches:
  refs/heads/trunk 2ce73d7c0 -> 6b2412da2


AMBARI-6201.  Fix /stacks api sub-resource names.


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

Branch: refs/heads/trunk
Commit: 6b2412da23c368ea4f5163c3ea5bc2e5463dc3d0
Parents: 2ce73d7
Author: John Speidel <js...@hortonworks.com>
Authored: Wed Jun 18 21:40:06 2014 -0400
Committer: John Speidel <js...@hortonworks.com>
Committed: Thu Jun 19 10:14:20 2014 -0400

----------------------------------------------------------------------
 .../resources/BaseStacksResourceDefinition.java |  36 +++-
 .../resources/RepositoryResourceDefinition.java |   2 +-
 .../server/api/services/StacksService.java      | 174 +++++++++++++++++--
 .../apache/ambari/server/api/util/TreeNode.java |   9 +
 .../ambari/server/api/util/TreeNodeImpl.java    |   5 +
 .../server/api/services/BaseServiceTest.java    |  31 ++--
 .../server/api/services/StacksServiceTest.java  |  11 ++
 7 files changed, 237 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6b2412da/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinition.java
index 63b1ca7..2177513 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinition.java
@@ -28,7 +28,7 @@ import java.util.List;
 /**
  * Abstract base class for all stacks related resource definitions.
  * Because we cloned /stacks from /stacks2 and changed the endpoint names in stacks,
- * this class is a temporary mechanism to deviate from the standard /stacks2 endpoint names.
+ * this class is a TEMPORARY mechanism to deviate from the standard /stacks2 endpoint names.
  *
  */
 public abstract class BaseStacksResourceDefinition extends BaseResourceDefinition {
@@ -54,9 +54,43 @@ public abstract class BaseStacksResourceDefinition extends BaseResourceDefinitio
         nodeHref = nodeHref.replace("stackServices", "services");
         nodeHref = nodeHref.replace("serviceComponents", "components");
         nodeHref = nodeHref.replace("operatingSystems", "operating_systems");
+
+        // The UI currently expects the old sub-resource names so don't do replacement
+        // if the href contains "_=" as only the UI uses this syntax.
+        if (! href.contains("_=")) {
+          renameChildren(resultNode);
+        }
       }
 
       resultNode.setProperty("href", nodeHref);
     }
+
+    /**
+     * Rename child nodes.
+     *
+     * @param resultNode result node
+     */
+    private void renameChildren(TreeNode<Resource> resultNode) {
+      TreeNode<Resource> childNode = resultNode.removeChild("stackServices");
+      if (childNode != null) {
+        childNode.setName("services");
+        resultNode.addChild(childNode);
+        renameChildren(childNode);
+      }
+
+      childNode = resultNode.removeChild("serviceComponents");
+      if (childNode != null) {
+        childNode.setName("components");
+        resultNode.addChild(childNode);
+        renameChildren(childNode);
+      }
+
+      childNode = resultNode.removeChild("operatingSystems");
+      if (childNode != null) {
+        childNode.setName("operating_systems");
+        resultNode.addChild(childNode);
+        renameChildren(childNode);
+      }
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b2412da/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RepositoryResourceDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RepositoryResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RepositoryResourceDefinition.java
index 2aff429..b045e69 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RepositoryResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RepositoryResourceDefinition.java
@@ -20,7 +20,7 @@ package org.apache.ambari.server.api.resources;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
 
-public class RepositoryResourceDefinition extends BaseResourceDefinition {
+public class RepositoryResourceDefinition extends BaseStacksResourceDefinition {
 
   public RepositoryResourceDefinition(Type resourceType) {
     super(Resource.Type.Repository);

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b2412da/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
index ddad6bf..0218139 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
@@ -18,8 +18,13 @@
 
 package org.apache.ambari.server.api.services;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLDecoder;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.ws.rs.GET;
@@ -29,9 +34,13 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.PathSegment;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
 
+import org.apache.ambari.server.api.predicate.QueryLexer;
 import org.apache.ambari.server.api.resources.ResourceInstance;
 import org.apache.ambari.server.controller.spi.Resource;
 
@@ -55,7 +64,7 @@ public class StacksService extends BaseService {
   public Response getStack(@Context HttpHeaders headers, @Context UriInfo ui,
                            @PathParam("stackName") String stackName) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createStackResource(stackName));
   }
 
@@ -65,7 +74,7 @@ public class StacksService extends BaseService {
   public Response getStackVersions(@Context HttpHeaders headers,
                                    @Context UriInfo ui, @PathParam("stackName") String stackName) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createStackVersionResource(stackName, null));
   }
 
@@ -76,7 +85,7 @@ public class StacksService extends BaseService {
                                   @Context UriInfo ui, @PathParam("stackName") String stackName,
                                   @PathParam("stackVersion") String stackVersion) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createStackVersionResource(stackName, stackVersion));
   }
 
@@ -89,7 +98,7 @@ public class StacksService extends BaseService {
                                   @PathParam("stackVersion") String stackVersion,
                                   @PathParam("osType") String osType) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createRepositoryResource(stackName, stackVersion, osType, null));
   }
 
@@ -102,7 +111,7 @@ public class StacksService extends BaseService {
                                 @PathParam("osType") String osType,
                                 @PathParam("repoId") String repoId) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createRepositoryResource(stackName, stackVersion, osType, repoId));
   }
 
@@ -115,7 +124,7 @@ public class StacksService extends BaseService {
                                    @PathParam("osType") String osType,
                                    @PathParam("repoId") String repoId) {
 
-    return handleRequest(headers, body, ui, Request.Type.PUT,
+    return handleRequest(headers, body, new StackUriInfo(ui), Request.Type.PUT,
         createRepositoryResource(stackName, stackVersion, osType, repoId));
   }
 
@@ -127,7 +136,7 @@ public class StacksService extends BaseService {
                                    @Context UriInfo ui, @PathParam("stackName") String stackName,
                                    @PathParam("stackVersion") String stackVersion) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createStackServiceResource(stackName, stackVersion, null));
   }
 
@@ -139,7 +148,7 @@ public class StacksService extends BaseService {
                                   @PathParam("stackVersion") String stackVersion,
                                   @PathParam("serviceName") String serviceName) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createStackServiceResource(stackName, stackVersion, serviceName));
   }
 
@@ -152,7 +161,7 @@ public class StacksService extends BaseService {
                                          @PathParam("stackVersion") String stackVersion,
                                          @PathParam("serviceName") String serviceName) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createStackConfigurationResource(stackName, stackVersion, serviceName, null));
   }
 
@@ -166,7 +175,7 @@ public class StacksService extends BaseService {
                                         @PathParam("serviceName") String serviceName,
                                         @PathParam("propertyName") String propertyName) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createStackConfigurationResource(stackName, stackVersion, serviceName, propertyName));
   }
 
@@ -178,7 +187,7 @@ public class StacksService extends BaseService {
                                        @PathParam("stackVersion") String stackVersion,
                                        @PathParam("serviceName") String serviceName) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createStackServiceComponentResource(stackName, stackVersion, serviceName, null));
   }
 
@@ -191,7 +200,7 @@ public class StacksService extends BaseService {
                                                   @PathParam("serviceName") String serviceName,
                                                   @PathParam("componentName") String componentName) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createStackServiceComponentDependencyResource(stackName, stackVersion, serviceName, componentName, null));
   }
 
@@ -205,7 +214,7 @@ public class StacksService extends BaseService {
                                       @PathParam("componentName") String componentName,
                                       @PathParam("dependencyName") String dependencyName) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createStackServiceComponentDependencyResource(stackName, stackVersion, serviceName, componentName, dependencyName));
   }
 
@@ -220,7 +229,7 @@ public class StacksService extends BaseService {
                                       @PathParam("serviceName") String serviceName,
                                       @PathParam("componentName") String componentName) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createStackServiceComponentResource(stackName, stackVersion, serviceName, componentName));
   }
 
@@ -232,7 +241,7 @@ public class StacksService extends BaseService {
                                       @Context UriInfo ui, @PathParam("stackName") String stackName,
                                       @PathParam("stackVersion") String stackVersion) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createOperatingSystemResource(stackName, stackVersion, null));
   }
 
@@ -244,7 +253,7 @@ public class StacksService extends BaseService {
                                      @PathParam("stackVersion") String stackVersion,
                                      @PathParam("osType") String osType) {
 
-    return handleRequest(headers, null, ui, Request.Type.GET,
+    return handleRequest(headers, null, new StackUriInfo(ui), Request.Type.GET,
         createOperatingSystemResource(stackName, stackVersion, osType));
   }
 
@@ -334,5 +343,138 @@ public class StacksService extends BaseService {
         Collections.singletonMap(Resource.Type.Stack, stackName));
 
   }
+
+  /**
+   * Temporary UriInfo implementation which is used to convert old property names.
+   * Because both the /stacks and /stacks2 api use the same underlying classes, we
+   * need to convert the new corrected property names to the old names for the back end.
+   * This should be removed when /stacks2 is removed and we can change the property names
+   * in the resource definitions to the new form.
+   */
+  private static class StackUriInfo implements UriInfo {
+    private UriInfo m_delegate;
+
+    private StackUriInfo(UriInfo delegate) {
+      m_delegate = delegate;
+    }
+    @Override
+    public String getPath() {
+      return m_delegate.getPath();
+    }
+
+    @Override
+    public String getPath(boolean b) {
+      return m_delegate.getPath(b);
+    }
+
+    @Override
+    public List<PathSegment> getPathSegments() {
+      return m_delegate.getPathSegments();
+    }
+
+    @Override
+    public List<PathSegment> getPathSegments(boolean b) {
+      return m_delegate.getPathSegments(b);
+    }
+
+    @Override
+    public URI getRequestUri() {
+      String uri;
+      try {
+        uri = URLDecoder.decode(m_delegate.getRequestUri().toASCIIString(), "UTF-8");
+      } catch (UnsupportedEncodingException e) {
+        throw new RuntimeException("Unable to decode URI: " + e, e);
+      }
+      uri = uri.replaceAll("services/", "stackServices/");
+      uri = uri.replaceAll("components/", "serviceComponents/");
+      uri = uri.replaceAll("operating_systems/", "operatingSystems/");
+
+      try {
+        return new URI(uri);
+      } catch (URISyntaxException e) {
+        throw new RuntimeException("Unable to create modified stacks URI: " + e, e);
+      }
+    }
+
+    @Override
+    public UriBuilder getRequestUriBuilder() {
+      return m_delegate.getRequestUriBuilder();
+    }
+
+    @Override
+    public URI getAbsolutePath() {
+      return m_delegate.getAbsolutePath();
+    }
+
+    @Override
+    public UriBuilder getAbsolutePathBuilder() {
+      return m_delegate.getAbsolutePathBuilder();
+    }
+
+    @Override
+    public URI getBaseUri() {
+      return m_delegate.getBaseUri();
+    }
+
+    @Override
+    public UriBuilder getBaseUriBuilder() {
+      return m_delegate.getBaseUriBuilder();
+    }
+
+    @Override
+    public MultivaluedMap<String, String> getPathParameters() {
+      return m_delegate.getPathParameters();
+    }
+
+    @Override
+    public MultivaluedMap<String, String> getPathParameters(boolean b) {
+      return m_delegate.getPathParameters(b);
+    }
+
+    @Override
+    public MultivaluedMap<String, String> getQueryParameters() {
+      MultivaluedMap<String, String> queryParams = m_delegate.getQueryParameters();
+
+      if (queryParams.containsKey(QueryLexer.QUERY_FIELDS)) {
+        String fields = queryParams.getFirst(QueryLexer.QUERY_FIELDS);
+        queryParams.putSingle(QueryLexer.QUERY_FIELDS, convertToOldPropertyNames(fields));
+      }
+
+      if (queryParams.containsKey(QueryLexer.QUERY_SORT)) {
+        String sortBy = queryParams.getFirst(QueryLexer.QUERY_SORT);
+        queryParams.putSingle(QueryLexer.QUERY_SORT, convertToOldPropertyNames(sortBy));
+      }
+
+      return queryParams;
+    }
+
+    @Override
+    public MultivaluedMap<String, String> getQueryParameters(boolean b) {
+      return m_delegate.getQueryParameters(b);
+    }
+
+    @Override
+    public List<String> getMatchedURIs() {
+      return m_delegate.getMatchedURIs();
+    }
+
+    @Override
+    public List<String> getMatchedURIs(boolean b) {
+      return m_delegate.getMatchedURIs(b);
+    }
+
+    @Override
+    public List<Object> getMatchedResources() {
+      return m_delegate.getMatchedResources();
+    }
+
+    private String convertToOldPropertyNames(String str) {
+      str = str.replaceAll("services", "stackServices");
+      str = str.replaceAll("components", "serviceComponents");
+      str = str.replaceAll("operating_systems", "operatingSystems");
+
+      return str;
+    }
+  }
 }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b2412da/ambari-server/src/main/java/org/apache/ambari/server/api/util/TreeNode.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/util/TreeNode.java b/ambari-server/src/main/java/org/apache/ambari/server/api/util/TreeNode.java
index 3f8abdd..796d64f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/util/TreeNode.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/util/TreeNode.java
@@ -84,6 +84,15 @@ public interface TreeNode<T> {
   public TreeNode<T> addChild(TreeNode<T> child);
 
   /**
+   * Remove a child from this resource.
+   *
+   * @param name  name of child to remove
+   *
+   * @return the previous value associated with key, or null if there was no mapping for key
+   */
+  public TreeNode<T> removeChild(String name);
+
+  /**
    * Set a property on the node.
    *
    * @param name  the name of the property

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b2412da/ambari-server/src/main/java/org/apache/ambari/server/api/util/TreeNodeImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/util/TreeNodeImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/util/TreeNodeImpl.java
index 7c90715..1739b88 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/util/TreeNodeImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/util/TreeNodeImpl.java
@@ -112,6 +112,11 @@ public class TreeNodeImpl<T> implements TreeNode<T> {
   }
 
   @Override
+  public TreeNode<T> removeChild(String name) {
+    return m_mapChildren.remove(name);
+  }
+
+  @Override
   public void setProperty(String name, String value) {
     if (m_mapNodeProps == null) {
       m_mapNodeProps = new LinkedHashMap<String, String>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b2412da/ambari-server/src/test/java/org/apache/ambari/server/api/services/BaseServiceTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/BaseServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/BaseServiceTest.java
index ef1b21a..19eeffb 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/BaseServiceTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/BaseServiceTest.java
@@ -47,17 +47,17 @@ import static org.junit.Assert.assertEquals;
  */
 public abstract class BaseServiceTest {
 
-  private ResourceInstance resourceInstance = createNiceMock(ResourceInstance.class);
-  private RequestFactory requestFactory = createStrictMock(RequestFactory.class);
-  private Request request = createNiceMock(Request.class);
-  private HttpHeaders httpHeaders = createNiceMock(HttpHeaders.class);
-  private UriInfo uriInfo = createNiceMock(UriInfo.class);
-  private Result result = createMock(Result.class);
-  private RequestBody requestBody = createNiceMock(RequestBody.class);
-  private RequestBodyParser bodyParser = createStrictMock(RequestBodyParser.class);
-  private ResultStatus status = createNiceMock(ResultStatus.class);
-  private ResultSerializer serializer = createStrictMock(ResultSerializer.class);
-  private Object serializedResult = new Object();
+  protected ResourceInstance resourceInstance = createNiceMock(ResourceInstance.class);
+  protected RequestFactory requestFactory = createStrictMock(RequestFactory.class);
+  protected Request request = createNiceMock(Request.class);
+  protected HttpHeaders httpHeaders = createNiceMock(HttpHeaders.class);
+  protected UriInfo uriInfo = createNiceMock(UriInfo.class);
+  protected Result result = createMock(Result.class);
+  protected RequestBody requestBody = createNiceMock(RequestBody.class);
+  protected RequestBodyParser bodyParser = createStrictMock(RequestBodyParser.class);
+  protected ResultStatus status = createNiceMock(ResultStatus.class);
+  protected ResultSerializer serializer = createStrictMock(ResultSerializer.class);
+  protected Object serializedResult = new Object();
 
   public ResourceInstance getTestResource() {
     return resourceInstance;
@@ -105,7 +105,7 @@ public abstract class BaseServiceTest {
       // needed for compiler
     }
 
-    expect(requestFactory.createRequest(httpHeaders, requestBody, uriInfo, testMethod.getRequestType(), resourceInstance)).andReturn(request);
+    assertCreateRequest(testMethod);
     expect(request.process()).andReturn(result);
     expect(result.getStatus()).andReturn(status).atLeastOnce();
     expect(status.getStatusCode()).andReturn(testMethod.getStatusCode()).atLeastOnce();
@@ -120,6 +120,11 @@ public abstract class BaseServiceTest {
     verifyAndResetMocks();
   }
 
+  protected void assertCreateRequest(ServiceTestInvocation testMethod) {
+    expect(requestFactory.createRequest(httpHeaders, requestBody, uriInfo,
+        testMethod.getRequestType(), resourceInstance)).andReturn(request);
+  }
+
 
 
   private void testMethod_bodyParseException(ServiceTestInvocation testMethod) throws Exception {
@@ -144,7 +149,7 @@ public abstract class BaseServiceTest {
     } catch (BodyParseException e) {
       // needed for compiler
     }
-    expect(requestFactory.createRequest(httpHeaders, requestBody, uriInfo, testMethod.getRequestType(), resourceInstance)).andReturn(request);
+    assertCreateRequest(testMethod);
     expect(request.process()).andReturn(result);
     expect(result.getStatus()).andReturn(status).atLeastOnce();
     expect(status.getStatusCode()).andReturn(400).atLeastOnce();

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b2412da/ambari-server/src/test/java/org/apache/ambari/server/api/services/StacksServiceTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/StacksServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/StacksServiceTest.java
index f8c385f..80b7338 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/StacksServiceTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/StacksServiceTest.java
@@ -21,6 +21,7 @@ package org.apache.ambari.server.api.services;
 import org.apache.ambari.server.api.resources.ResourceInstance;
 import org.apache.ambari.server.api.services.parsers.RequestBodyParser;
 import org.apache.ambari.server.api.services.serializers.ResultSerializer;
+import org.easymock.EasyMock;
 
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.UriInfo;
@@ -29,6 +30,9 @@ import java.util.ArrayList;
 import java.util.List;
 
 
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.notNull;
+import static org.easymock.EasyMock.same;
 import static org.junit.Assert.assertEquals;
 
 /**
@@ -210,4 +214,11 @@ public class StacksServiceTest extends BaseServiceTest {
     }
   }
 
+  //todo: this is necessary for temporary changes to service to support both stacks and stacks2 api.
+  //todo: when stacks2 is removed and stacks doesn't need to wrap the UriInfo, this should be removed.
+  @Override
+  protected void assertCreateRequest(ServiceTestInvocation testMethod) {
+    expect(requestFactory.createRequest(same(httpHeaders), same(requestBody), (UriInfo) notNull(),
+        same(testMethod.getRequestType()), same(resourceInstance))).andReturn(request);
+  }
 }