You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by vb...@apache.org on 2014/02/07 09:38:29 UTC
git commit: AMBARI-4549. Remove /api/v1 from Pass Through
API.(vbrodetskyi)
Updated Branches:
refs/heads/trunk db991df50 -> 3f2a76b1e
AMBARI-4549. Remove /api/v1 from Pass Through API.(vbrodetskyi)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/3f2a76b1
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/3f2a76b1
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/3f2a76b1
Branch: refs/heads/trunk
Commit: 3f2a76b1e02dfc123488e98a240580c695849733
Parents: db991df
Author: Vitaly Brodetskyi <vb...@hortonworks.com>
Authored: Fri Feb 7 10:37:09 2014 +0200
Committer: Vitaly Brodetskyi <vb...@hortonworks.com>
Committed: Fri Feb 7 10:37:09 2014 +0200
----------------------------------------------------------------------
.../server/api/services/ProxyService.java | 108 ----------
.../ambari/server/controller/AmbariServer.java | 22 +-
.../ambari/server/proxy/ProxyService.java | 108 ++++++++++
.../server/api/services/ProxyServiceTest.java | 214 ------------------
.../ambari/server/proxy/ProxyServiceTest.java | 215 +++++++++++++++++++
5 files changed, 341 insertions(+), 326 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2a76b1/ambari-server/src/main/java/org/apache/ambari/server/api/services/ProxyService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ProxyService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ProxyService.java
deleted file mode 100644
index 9e457c6..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ProxyService.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * 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.ambari.server.api.services;
-
-import com.google.gson.Gson;
-import org.apache.ambari.server.controller.internal.URLStreamProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
-import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
-import javax.ws.rs.Path;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.util.List;
-import java.util.Map;
-
-@Path("/proxy/")
-public class ProxyService {
-
- private static final int REPO_URL_CONNECT_TIMEOUT = 3000;
- private static final int REPO_URL_READ_TIMEOUT = 1000;
- private static final int HTTP_ERROR_RANGE_START = 400;
-
- private static final String REQUEST_TYPE_GET = "GET";
- private static final String REQUEST_TYPE_POST = "POST";
- private static final String REQUEST_TYPE_PUT = "PUT";
- private static final String REQUEST_TYPE_DELETE = "DELETE";
- private static final String QUERY_PARAMETER_URL = "url";
- private static final String ERROR_PROCESSING_URL = "Error occurred during processing URL ";
-
- private final static Logger LOG = LoggerFactory.getLogger(ProxyService.class);
-
- @GET
- public Response processGetRequestForwarding(@Context HttpHeaders headers, @Context UriInfo ui) {
- return handleRequest(REQUEST_TYPE_GET, ui, null, APPLICATION_FORM_URLENCODED);
- }
-
- @POST
- public Response processPostRequestForwarding(Object body, @Context HttpHeaders headers, @Context UriInfo ui) {
- return handleRequest(REQUEST_TYPE_POST, ui, body, headers.getMediaType().toString());
- }
-
- @PUT
- public Response processPutRequestForwarding(Object body, @Context HttpHeaders headers, @Context UriInfo ui) {
- return handleRequest(REQUEST_TYPE_PUT, ui, body, headers.getMediaType().toString());
- }
-
- @DELETE
- public Response processDeleteRequestForwarding(@Context HttpHeaders headers, @Context UriInfo ui) {
- return handleRequest(REQUEST_TYPE_DELETE, ui, null, APPLICATION_FORM_URLENCODED);
- }
-
- private Response handleRequest(String requestType, UriInfo ui, Object body, String mediaType) {
- URLStreamProvider urlStreamProvider = new URLStreamProvider(REPO_URL_CONNECT_TIMEOUT,
- REPO_URL_READ_TIMEOUT, null, null, null);
- List<String> urlsToForward = ui.getQueryParameters().get(QUERY_PARAMETER_URL);
- if (!urlsToForward.isEmpty()) {
- String url = urlsToForward.get(0);
- try {
- HttpURLConnection connection = urlStreamProvider.processURL(url, requestType, body, mediaType);
- int responseCode = connection.getResponseCode();
- if (responseCode >= HTTP_ERROR_RANGE_START) {
- throw new WebApplicationException(connection.getResponseCode());
- }
- String contentType = connection.getContentType();
- Response.ResponseBuilder rb = Response.status(responseCode);
- if (contentType.indexOf(APPLICATION_JSON) != -1) {
- rb.entity(new Gson().fromJson(new InputStreamReader(connection.getInputStream()), Map.class));
- } else {
- rb.entity(connection.getInputStream());
- }
- return rb.type(contentType).build();
- } catch (IOException e) {
- LOG.error(ERROR_PROCESSING_URL + url, e);
- }
- }
- return null;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2a76b1/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
index faaf0ee..d480aee 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
@@ -203,12 +203,14 @@ public class AmbariServer {
//session-per-request strategy for api and agents
root.addFilter(new FilterHolder(injector.getInstance(AmbariPersistFilter.class)), "/api/*", 1);
+ root.addFilter(new FilterHolder(injector.getInstance(AmbariPersistFilter.class)), "/proxy/*", 1);
agentroot.addFilter(new FilterHolder(injector.getInstance(AmbariPersistFilter.class)), "/agent/*", 1);
agentroot.addFilter(SecurityFilter.class, "/*", 1);
if (configs.getApiAuthentication()) {
root.addFilter(new FilterHolder(springSecurityFilter), "/api/*", 1);
+ root.addFilter(new FilterHolder(springSecurityFilter), "/proxy/*", 1);
}
@@ -272,10 +274,6 @@ public class AmbariServer {
"org.apache.ambari.server.api");
sh.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature",
"true");
- if (configs.csrfProtectionEnabled()) {
- sh.setInitParameter("com.sun.jersey.spi.container.ContainerRequestFilters",
- "com.sun.jersey.api.container.filter.CsrfProtectionFilter");
- }
root.addServlet(sh, "/api/v1/*");
sh.setInitOrder(2);
@@ -301,6 +299,15 @@ public class AmbariServer {
agentroot.addServlet(cert, "/*");
cert.setInitOrder(4);
+ ServletHolder proxy = new ServletHolder(ServletContainer.class);
+ proxy.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
+ "com.sun.jersey.api.core.PackagesResourceConfig");
+ proxy.setInitParameter("com.sun.jersey.config.property.packages",
+ "org.apache.ambari.server.proxy");
+ proxy.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true");
+ root.addServlet(proxy, "/proxy/*");
+ proxy.setInitOrder(5);
+
ServletHolder resources = new ServletHolder(ServletContainer.class);
resources.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
"com.sun.jersey.api.core.PackagesResourceConfig");
@@ -311,6 +318,13 @@ public class AmbariServer {
root.addServlet(resources, "/resources/*");
resources.setInitOrder(6);
+ if (configs.csrfProtectionEnabled()) {
+ sh.setInitParameter("com.sun.jersey.spi.container.ContainerRequestFilters",
+ "com.sun.jersey.api.container.filter.CsrfProtectionFilter");
+ proxy.setInitParameter("com.sun.jersey.spi.container.ContainerRequestFilters",
+ "com.sun.jersey.api.container.filter.CsrfProtectionFilter");
+ }
+
//Set jetty thread pool
serverForAgent.setThreadPool(new QueuedThreadPool(25));
server.setThreadPool(new QueuedThreadPool(25));
http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2a76b1/ambari-server/src/main/java/org/apache/ambari/server/proxy/ProxyService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/proxy/ProxyService.java b/ambari-server/src/main/java/org/apache/ambari/server/proxy/ProxyService.java
new file mode 100644
index 0000000..9f7f108
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/proxy/ProxyService.java
@@ -0,0 +1,108 @@
+/**
+ * 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.ambari.server.proxy;
+
+import com.google.gson.Gson;
+import org.apache.ambari.server.controller.internal.URLStreamProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+import javax.ws.rs.Path;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.util.List;
+import java.util.Map;
+
+@Path("/")
+public class ProxyService {
+
+ private static final int REPO_URL_CONNECT_TIMEOUT = 3000;
+ private static final int REPO_URL_READ_TIMEOUT = 1000;
+ private static final int HTTP_ERROR_RANGE_START = 400;
+
+ private static final String REQUEST_TYPE_GET = "GET";
+ private static final String REQUEST_TYPE_POST = "POST";
+ private static final String REQUEST_TYPE_PUT = "PUT";
+ private static final String REQUEST_TYPE_DELETE = "DELETE";
+ private static final String QUERY_PARAMETER_URL = "url";
+ private static final String ERROR_PROCESSING_URL = "Error occurred during processing URL ";
+
+ private final static Logger LOG = LoggerFactory.getLogger(ProxyService.class);
+
+ @GET
+ public Response processGetRequestForwarding(@Context HttpHeaders headers, @Context UriInfo ui) {
+ return handleRequest(REQUEST_TYPE_GET, ui, null, APPLICATION_FORM_URLENCODED);
+ }
+
+ @POST
+ public Response processPostRequestForwarding(Object body, @Context HttpHeaders headers, @Context UriInfo ui) {
+ return handleRequest(REQUEST_TYPE_POST, ui, body, headers.getMediaType().toString());
+ }
+
+ @PUT
+ public Response processPutRequestForwarding(Object body, @Context HttpHeaders headers, @Context UriInfo ui) {
+ return handleRequest(REQUEST_TYPE_PUT, ui, body, headers.getMediaType().toString());
+ }
+
+ @DELETE
+ public Response processDeleteRequestForwarding(@Context HttpHeaders headers, @Context UriInfo ui) {
+ return handleRequest(REQUEST_TYPE_DELETE, ui, null, APPLICATION_FORM_URLENCODED);
+ }
+
+ private Response handleRequest(String requestType, UriInfo ui, Object body, String mediaType) {
+ URLStreamProvider urlStreamProvider = new URLStreamProvider(REPO_URL_CONNECT_TIMEOUT,
+ REPO_URL_READ_TIMEOUT, null, null, null);
+ List<String> urlsToForward = ui.getQueryParameters().get(QUERY_PARAMETER_URL);
+ if (!urlsToForward.isEmpty()) {
+ String url = urlsToForward.get(0);
+ try {
+ HttpURLConnection connection = urlStreamProvider.processURL(url, requestType, body, mediaType);
+ int responseCode = connection.getResponseCode();
+ if (responseCode >= HTTP_ERROR_RANGE_START) {
+ throw new WebApplicationException(connection.getResponseCode());
+ }
+ String contentType = connection.getContentType();
+ Response.ResponseBuilder rb = Response.status(responseCode);
+ if (contentType.indexOf(APPLICATION_JSON) != -1) {
+ rb.entity(new Gson().fromJson(new InputStreamReader(connection.getInputStream()), Map.class));
+ } else {
+ rb.entity(connection.getInputStream());
+ }
+ return rb.type(contentType).build();
+ } catch (IOException e) {
+ LOG.error(ERROR_PROCESSING_URL + url, e);
+ }
+ }
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2a76b1/ambari-server/src/test/java/org/apache/ambari/server/api/services/ProxyServiceTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/ProxyServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/ProxyServiceTest.java
deleted file mode 100644
index 3f219dd..0000000
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/ProxyServiceTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/**
- * 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.ambari.server.api.services;
-
-import com.google.gson.Gson;
-import com.sun.jersey.core.spi.factory.ResponseBuilderImpl;
-import com.sun.jersey.core.spi.factory.ResponseImpl;
-import com.sun.jersey.core.util.MultivaluedMapImpl;
-
-import org.apache.ambari.server.controller.internal.URLStreamProvider;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import static org.junit.Assert.assertSame;
-import org.powermock.api.easymock.PowerMock;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-
-import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
-import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED_TYPE;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.util.Map;
-import java.util.List;
-import java.util.Collections;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ ProxyServiceTest.class, ProxyService.class, URLStreamProvider.class, Response.class, ResponseBuilderImpl.class })
-class ProxyServiceTest extends BaseServiceTest {
-
- @Test
- public void testProxyGetRequest() throws Exception {
- ProxyService ps = new ProxyService();
- URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
- HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
- MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
- Response.ResponseBuilder responseBuilderMock = PowerMock.createMock(ResponseBuilderImpl.class);
- Response responseMock = createMock(ResponseImpl.class);
- queryParams.add("url","testurl");
- InputStream is = new ByteArrayInputStream("test".getBytes());
- PowerMock.mockStatic(Response.class);
- expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
- expect(streamProviderMock.processURL("testurl", "GET", null, APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
- expect(urlConnectionMock.getResponseCode()).andReturn(200);
- expect(urlConnectionMock.getContentType()).andReturn("text/plain");
- expect(urlConnectionMock.getInputStream()).andReturn(is);
- PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
- expect(Response.status(200)).andReturn(responseBuilderMock);
- expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
- expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
- expect(responseBuilderMock.build()).andReturn(responseMock);
- PowerMock.replay(streamProviderMock, URLStreamProvider.class, Response.class, responseBuilderMock);
- replay(getUriInfo(), urlConnectionMock);
- Response resultForGetRequest = ps.processGetRequestForwarding(getHttpHeaders(),getUriInfo());
- assertSame(resultForGetRequest, responseMock);
- }
-
- @Test
- public void testProxyPostRequest() throws Exception {
- ProxyService ps = new ProxyService();
- URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
- HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
- MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
- Response.ResponseBuilder responseBuilderMock = PowerMock.createMock(ResponseBuilderImpl.class);
- Response responseMock = createMock(ResponseImpl.class);
- queryParams.add("url","testurl");
- InputStream is = new ByteArrayInputStream("test".getBytes());
- PowerMock.mockStatic(Response.class);
- expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
- expect(getHttpHeaders().getMediaType()).andReturn(APPLICATION_FORM_URLENCODED_TYPE);
- expect(streamProviderMock.processURL("testurl", "POST", "testbody", APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
- expect(urlConnectionMock.getResponseCode()).andReturn(200);
- expect(urlConnectionMock.getContentType()).andReturn("text/plain");
- expect(urlConnectionMock.getInputStream()).andReturn(is);
- PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
- expect(Response.status(200)).andReturn(responseBuilderMock);
- expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
- expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
- expect(responseBuilderMock.build()).andReturn(responseMock);
- PowerMock.replay(streamProviderMock, URLStreamProvider.class, Response.class, responseBuilderMock);
- replay(getUriInfo(), urlConnectionMock, getHttpHeaders());
- Response resultForPostRequest = ps.processPostRequestForwarding("testbody", getHttpHeaders(), getUriInfo());
- assertSame(resultForPostRequest, responseMock);
- }
-
- @Test
- public void testProxyPutRequest() throws Exception {
- ProxyService ps = new ProxyService();
- URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
- HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
- MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
- Response.ResponseBuilder responseBuilderMock = PowerMock.createMock(ResponseBuilderImpl.class);
- Response responseMock = createMock(ResponseImpl.class);
- queryParams.add("url","testurl");
- InputStream is = new ByteArrayInputStream("test".getBytes());
- PowerMock.mockStatic(Response.class);
- expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
- expect(getHttpHeaders().getMediaType()).andReturn(APPLICATION_FORM_URLENCODED_TYPE);
- expect(streamProviderMock.processURL("testurl", "PUT", "testbody", APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
- expect(urlConnectionMock.getResponseCode()).andReturn(200);
- expect(urlConnectionMock.getContentType()).andReturn("text/plain");
- expect(urlConnectionMock.getInputStream()).andReturn(is);
- PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
- expect(Response.status(200)).andReturn(responseBuilderMock);
- expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
- expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
- expect(responseBuilderMock.build()).andReturn(responseMock);
- PowerMock.replay(streamProviderMock, URLStreamProvider.class, Response.class, responseBuilderMock);
- replay(getUriInfo(), urlConnectionMock, getHttpHeaders());
- Response resultForPutRequest = ps.processPutRequestForwarding("testbody", getHttpHeaders(), getUriInfo());
- assertSame(resultForPutRequest, responseMock);
- }
-
- @Test
- public void testProxyDeleteRequest() throws Exception {
- ProxyService ps = new ProxyService();
- URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
- HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
- MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
- Response.ResponseBuilder responseBuilderMock = PowerMock.createMock(ResponseBuilderImpl.class);
- Response responseMock = createMock(ResponseImpl.class);
- queryParams.add("url","testurl");
- InputStream is = new ByteArrayInputStream("test".getBytes());
- PowerMock.mockStatic(Response.class);
- expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
- expect(streamProviderMock.processURL("testurl", "DELETE", null, APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
- expect(urlConnectionMock.getResponseCode()).andReturn(200);
- expect(urlConnectionMock.getContentType()).andReturn("text/plain");
- expect(urlConnectionMock.getInputStream()).andReturn(is);
- PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
- expect(Response.status(200)).andReturn(responseBuilderMock);
- expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
- expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
- expect(responseBuilderMock.build()).andReturn(responseMock);
- PowerMock.replay(streamProviderMock, URLStreamProvider.class, Response.class, responseBuilderMock);
- replay(getUriInfo(), urlConnectionMock);
- Response resultForDeleteRequest = ps.processDeleteRequestForwarding(getHttpHeaders(), getUriInfo());
- assertSame(resultForDeleteRequest, responseMock);
- }
-
- @Test(expected = WebApplicationException.class)
- public void testResponseWithError() throws Exception {
- ProxyService ps = new ProxyService();
- URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
- HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
- MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
- queryParams.add("url","testurl");
- expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
- expect(streamProviderMock.processURL("testurl", "GET", null, APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
- expect(urlConnectionMock.getResponseCode()).andReturn(405).times(2);
- PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
- PowerMock.replay(streamProviderMock, URLStreamProvider.class);
- replay(getUriInfo(), urlConnectionMock);
- ps.processGetRequestForwarding(getHttpHeaders(),getUriInfo());
- }
-
- @Test
- public void testProxyWithJSONResponse() throws Exception {
- ProxyService ps = new ProxyService();
- URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
- HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
- MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
- Response.ResponseBuilder responseBuilderMock = PowerMock.createMock(ResponseBuilderImpl.class);
- Response responseMock = createMock(ResponseImpl.class);
- queryParams.add("url","testurl");
- Map map = new Gson().fromJson(new InputStreamReader(new ByteArrayInputStream("{ \"test\":\"test\" }".getBytes())), Map.class);
- PowerMock.mockStatic(Response.class);
- expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
- expect(streamProviderMock.processURL("testurl", "GET", null, APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
- expect(urlConnectionMock.getResponseCode()).andReturn(200);
- expect(urlConnectionMock.getContentType()).andReturn("application/json");
- expect(urlConnectionMock.getInputStream()).andReturn(new ByteArrayInputStream("{ \"test\":\"test\" }".getBytes()));
- PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
- expect(Response.status(200)).andReturn(responseBuilderMock);
- expect(responseBuilderMock.entity(map)).andReturn(responseBuilderMock);
- expect(responseBuilderMock.type("application/json")).andReturn(responseBuilderMock);
- expect(responseBuilderMock.build()).andReturn(responseMock);
- PowerMock.replay(streamProviderMock, URLStreamProvider.class, Response.class, responseBuilderMock);
- replay(getUriInfo(), urlConnectionMock);
- Response resultForGetRequest = ps.processGetRequestForwarding(getHttpHeaders(),getUriInfo());
- assertSame(resultForGetRequest, responseMock);
- }
-
- @Override
- public List<ServiceTestInvocation> getTestInvocations() throws Exception {
- return Collections.emptyList();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2a76b1/ambari-server/src/test/java/org/apache/ambari/server/proxy/ProxyServiceTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/proxy/ProxyServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/proxy/ProxyServiceTest.java
new file mode 100644
index 0000000..80c5c7d
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/proxy/ProxyServiceTest.java
@@ -0,0 +1,215 @@
+/**
+ * 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.ambari.server.proxy;
+
+import com.google.gson.Gson;
+import com.sun.jersey.core.spi.factory.ResponseBuilderImpl;
+import com.sun.jersey.core.spi.factory.ResponseImpl;
+import com.sun.jersey.core.util.MultivaluedMapImpl;
+
+import org.apache.ambari.server.api.services.BaseServiceTest;
+import org.apache.ambari.server.controller.internal.URLStreamProvider;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import static org.junit.Assert.assertSame;
+import org.powermock.api.easymock.PowerMock;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
+import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED_TYPE;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.util.Map;
+import java.util.List;
+import java.util.Collections;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ ProxyServiceTest.class, ProxyService.class, URLStreamProvider.class, Response.class, ResponseBuilderImpl.class })
+class ProxyServiceTest extends BaseServiceTest {
+
+ @Test
+ public void testProxyGetRequest() throws Exception {
+ ProxyService ps = new ProxyService();
+ URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
+ HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
+ MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
+ Response.ResponseBuilder responseBuilderMock = PowerMock.createMock(ResponseBuilderImpl.class);
+ Response responseMock = createMock(ResponseImpl.class);
+ queryParams.add("url","testurl");
+ InputStream is = new ByteArrayInputStream("test".getBytes());
+ PowerMock.mockStatic(Response.class);
+ expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
+ expect(streamProviderMock.processURL("testurl", "GET", null, APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
+ expect(urlConnectionMock.getResponseCode()).andReturn(200);
+ expect(urlConnectionMock.getContentType()).andReturn("text/plain");
+ expect(urlConnectionMock.getInputStream()).andReturn(is);
+ PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
+ expect(Response.status(200)).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.build()).andReturn(responseMock);
+ PowerMock.replay(streamProviderMock, URLStreamProvider.class, Response.class, responseBuilderMock);
+ replay(getUriInfo(), urlConnectionMock);
+ Response resultForGetRequest = ps.processGetRequestForwarding(getHttpHeaders(),getUriInfo());
+ assertSame(resultForGetRequest, responseMock);
+ }
+
+ @Test
+ public void testProxyPostRequest() throws Exception {
+ ProxyService ps = new ProxyService();
+ URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
+ HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
+ MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
+ Response.ResponseBuilder responseBuilderMock = PowerMock.createMock(ResponseBuilderImpl.class);
+ Response responseMock = createMock(ResponseImpl.class);
+ queryParams.add("url","testurl");
+ InputStream is = new ByteArrayInputStream("test".getBytes());
+ PowerMock.mockStatic(Response.class);
+ expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
+ expect(getHttpHeaders().getMediaType()).andReturn(APPLICATION_FORM_URLENCODED_TYPE);
+ expect(streamProviderMock.processURL("testurl", "POST", "testbody", APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
+ expect(urlConnectionMock.getResponseCode()).andReturn(200);
+ expect(urlConnectionMock.getContentType()).andReturn("text/plain");
+ expect(urlConnectionMock.getInputStream()).andReturn(is);
+ PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
+ expect(Response.status(200)).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.build()).andReturn(responseMock);
+ PowerMock.replay(streamProviderMock, URLStreamProvider.class, Response.class, responseBuilderMock);
+ replay(getUriInfo(), urlConnectionMock, getHttpHeaders());
+ Response resultForPostRequest = ps.processPostRequestForwarding("testbody", getHttpHeaders(), getUriInfo());
+ assertSame(resultForPostRequest, responseMock);
+ }
+
+ @Test
+ public void testProxyPutRequest() throws Exception {
+ ProxyService ps = new ProxyService();
+ URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
+ HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
+ MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
+ Response.ResponseBuilder responseBuilderMock = PowerMock.createMock(ResponseBuilderImpl.class);
+ Response responseMock = createMock(ResponseImpl.class);
+ queryParams.add("url","testurl");
+ InputStream is = new ByteArrayInputStream("test".getBytes());
+ PowerMock.mockStatic(Response.class);
+ expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
+ expect(getHttpHeaders().getMediaType()).andReturn(APPLICATION_FORM_URLENCODED_TYPE);
+ expect(streamProviderMock.processURL("testurl", "PUT", "testbody", APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
+ expect(urlConnectionMock.getResponseCode()).andReturn(200);
+ expect(urlConnectionMock.getContentType()).andReturn("text/plain");
+ expect(urlConnectionMock.getInputStream()).andReturn(is);
+ PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
+ expect(Response.status(200)).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.build()).andReturn(responseMock);
+ PowerMock.replay(streamProviderMock, URLStreamProvider.class, Response.class, responseBuilderMock);
+ replay(getUriInfo(), urlConnectionMock, getHttpHeaders());
+ Response resultForPutRequest = ps.processPutRequestForwarding("testbody", getHttpHeaders(), getUriInfo());
+ assertSame(resultForPutRequest, responseMock);
+ }
+
+ @Test
+ public void testProxyDeleteRequest() throws Exception {
+ ProxyService ps = new ProxyService();
+ URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
+ HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
+ MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
+ Response.ResponseBuilder responseBuilderMock = PowerMock.createMock(ResponseBuilderImpl.class);
+ Response responseMock = createMock(ResponseImpl.class);
+ queryParams.add("url","testurl");
+ InputStream is = new ByteArrayInputStream("test".getBytes());
+ PowerMock.mockStatic(Response.class);
+ expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
+ expect(streamProviderMock.processURL("testurl", "DELETE", null, APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
+ expect(urlConnectionMock.getResponseCode()).andReturn(200);
+ expect(urlConnectionMock.getContentType()).andReturn("text/plain");
+ expect(urlConnectionMock.getInputStream()).andReturn(is);
+ PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
+ expect(Response.status(200)).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.entity(is)).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.type("text/plain")).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.build()).andReturn(responseMock);
+ PowerMock.replay(streamProviderMock, URLStreamProvider.class, Response.class, responseBuilderMock);
+ replay(getUriInfo(), urlConnectionMock);
+ Response resultForDeleteRequest = ps.processDeleteRequestForwarding(getHttpHeaders(), getUriInfo());
+ assertSame(resultForDeleteRequest, responseMock);
+ }
+
+ @Test(expected = WebApplicationException.class)
+ public void testResponseWithError() throws Exception {
+ ProxyService ps = new ProxyService();
+ URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
+ HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
+ MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
+ queryParams.add("url","testurl");
+ expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
+ expect(streamProviderMock.processURL("testurl", "GET", null, APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
+ expect(urlConnectionMock.getResponseCode()).andReturn(405).times(2);
+ PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
+ PowerMock.replay(streamProviderMock, URLStreamProvider.class);
+ replay(getUriInfo(), urlConnectionMock);
+ ps.processGetRequestForwarding(getHttpHeaders(),getUriInfo());
+ }
+
+ @Test
+ public void testProxyWithJSONResponse() throws Exception {
+ ProxyService ps = new ProxyService();
+ URLStreamProvider streamProviderMock = PowerMock.createNiceMock(URLStreamProvider.class);
+ HttpURLConnection urlConnectionMock = createMock(HttpURLConnection.class);
+ MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
+ Response.ResponseBuilder responseBuilderMock = PowerMock.createMock(ResponseBuilderImpl.class);
+ Response responseMock = createMock(ResponseImpl.class);
+ queryParams.add("url","testurl");
+ Map map = new Gson().fromJson(new InputStreamReader(new ByteArrayInputStream("{ \"test\":\"test\" }".getBytes())), Map.class);
+ PowerMock.mockStatic(Response.class);
+ expect(getUriInfo().getQueryParameters()).andReturn(queryParams);
+ expect(streamProviderMock.processURL("testurl", "GET", null, APPLICATION_FORM_URLENCODED)).andReturn(urlConnectionMock);
+ expect(urlConnectionMock.getResponseCode()).andReturn(200);
+ expect(urlConnectionMock.getContentType()).andReturn("application/json");
+ expect(urlConnectionMock.getInputStream()).andReturn(new ByteArrayInputStream("{ \"test\":\"test\" }".getBytes()));
+ PowerMock.expectNew(URLStreamProvider.class, 3000, 1000, null, null, null).andReturn(streamProviderMock);
+ expect(Response.status(200)).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.entity(map)).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.type("application/json")).andReturn(responseBuilderMock);
+ expect(responseBuilderMock.build()).andReturn(responseMock);
+ PowerMock.replay(streamProviderMock, URLStreamProvider.class, Response.class, responseBuilderMock);
+ replay(getUriInfo(), urlConnectionMock);
+ Response resultForGetRequest = ps.processGetRequestForwarding(getHttpHeaders(),getUriInfo());
+ assertSame(resultForGetRequest, responseMock);
+ }
+
+ @Override
+ public List<ServiceTestInvocation> getTestInvocations() throws Exception {
+ return Collections.emptyList();
+ }
+
+}