Return-Path: X-Original-To: apmail-brooklyn-commits-archive@minotaur.apache.org Delivered-To: apmail-brooklyn-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 9C11119C20 for ; Thu, 7 Apr 2016 11:14:08 +0000 (UTC) Received: (qmail 74310 invoked by uid 500); 7 Apr 2016 11:14:08 -0000 Delivered-To: apmail-brooklyn-commits-archive@brooklyn.apache.org Received: (qmail 74247 invoked by uid 500); 7 Apr 2016 11:14:08 -0000 Mailing-List: contact commits-help@brooklyn.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@brooklyn.apache.org Delivered-To: mailing list commits@brooklyn.apache.org Received: (qmail 74116 invoked by uid 99); 7 Apr 2016 11:14:08 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 07 Apr 2016 11:14:08 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 24184E78B1; Thu, 7 Apr 2016 11:14:08 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sjcorbett@apache.org To: commits@brooklyn.apache.org Date: Thu, 07 Apr 2016 11:14:12 -0000 Message-Id: <86dc5164dd6647fd90e75a111298fe40@git.apache.org> In-Reply-To: <6d41aa182047453995921ba897d804c0@git.apache.org> References: <6d41aa182047453995921ba897d804c0@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [6/9] brooklyn-server git commit: Remove jersey compatibility http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/filter/SwaggerFilter.java ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/filter/SwaggerFilter.java b/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/filter/SwaggerFilter.java deleted file mode 100644 index ce8b747..0000000 --- a/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/filter/SwaggerFilter.java +++ /dev/null @@ -1,76 +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.brooklyn.rest.filter; - -import java.io.IOException; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; - -import org.apache.brooklyn.rest.apidoc.RestApiResourceScanner; - -import io.swagger.config.ScannerFactory; -import io.swagger.models.Info; -import io.swagger.models.License; -import io.swagger.models.Swagger; - -/** - * Bootstraps swagger. - *

- * Swagger was intended to run as a servlet. - * - * @author Ciprian Ciubotariu - */ -public class SwaggerFilter implements Filter { - - static Info info = new Info() - .title("Brooklyn API Documentation") - .version("v1") // API version, not BROOKLYN_VERSION - .license(new License() - .name("Apache 2.0") - .url("http://www.apache.org/licenses/LICENSE-2.0.html")); - - @Override - public void init(FilterConfig filterConfig) throws ServletException { -// ReflectiveJaxrsScanner scanner = new ReflectiveJaxrsScanner(); -// scanner.setResourcePackage("org.apache.brooklyn.rest.api,org.apache.brooklyn.rest.apidoc,org.apache.brooklyn.rest.resources"); -// ScannerFactory.setScanner(scanner); - ScannerFactory.setScanner(new RestApiResourceScanner()); - - ServletContext context = filterConfig.getServletContext(); - Swagger swagger = new Swagger() - .info(info); - context.setAttribute("swagger", swagger); - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - chain.doFilter(request, response); - } - - @Override - public void destroy() { - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/resources/ApiListingResource.java ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/resources/ApiListingResource.java b/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/resources/ApiListingResource.java deleted file mode 100644 index 74f8426..0000000 --- a/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/resources/ApiListingResource.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright 2015 The Apache Software Foundation. - * - * Licensed 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.brooklyn.rest.resources; - -import com.sun.jersey.spi.container.servlet.WebConfig; -import io.swagger.annotations.ApiOperation; -import io.swagger.config.FilterFactory; -import io.swagger.config.Scanner; -import io.swagger.config.ScannerFactory; -import io.swagger.config.SwaggerConfig; -import io.swagger.core.filter.SpecFilter; -import io.swagger.core.filter.SwaggerSpecFilter; -import io.swagger.jaxrs.Reader; -import io.swagger.jaxrs.config.JaxrsScanner; -import io.swagger.jaxrs.config.ReaderConfigUtils; -import io.swagger.jaxrs.listing.SwaggerSerializers; -import io.swagger.models.Swagger; -import io.swagger.util.Yaml; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Application; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Cookie; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; - -import org.apache.brooklyn.util.text.Strings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * ApiListingResource usable within a jersey servlet filter. - * - * Taken from io.swagger:swagger-jaxrs, class - * io.swagger.jaxrs.listing.ApiListingResource, which can only be used within a - * servlet context. We are here using a filter, but jersey has a WebConfig class - * that can substitute ServletConfig and FilterConfig. - * - * @todo Remove when the rest-server is no longer running within a filter (e.g. - * as a standalone OSGi http service) - * - * @author Ciprian Ciubotariu - */ -public class ApiListingResource { - - static Logger LOGGER = LoggerFactory.getLogger(ApiListingResource.class); - - @Context - ServletContext context; - - boolean initialized = false; - - private static class ServletConfigAdapter implements ServletConfig { - - private final WebConfig webConfig; - - private ServletConfigAdapter(WebConfig webConfig) { - this.webConfig = webConfig; - } - - @Override - public String getServletName() { - return webConfig.getName(); - } - - @Override - public ServletContext getServletContext() { - return webConfig.getServletContext(); - } - - @Override - public String getInitParameter(String name) { - return webConfig.getInitParameter(name); - } - - @Override - public Enumeration getInitParameterNames() { - return webConfig.getInitParameterNames(); - } - - } - - protected synchronized Swagger scan(Application app, WebConfig sc) { - Swagger swagger = null; - Scanner scanner = ScannerFactory.getScanner(); - LOGGER.debug("using scanner " + scanner); - - if (scanner != null) { - SwaggerSerializers.setPrettyPrint(scanner.getPrettyPrint()); - swagger = (Swagger) context.getAttribute("swagger"); - - Set> classes; - if (scanner instanceof JaxrsScanner) { - JaxrsScanner jaxrsScanner = (JaxrsScanner) scanner; - classes = jaxrsScanner.classesFromContext(app, new ServletConfigAdapter(sc)); - } else { - classes = scanner.classes(); - } - if (classes != null) { - Reader reader = new Reader(swagger, ReaderConfigUtils.getReaderConfig(context)); - swagger = reader.read(classes); - if (scanner instanceof SwaggerConfig) { - swagger = ((SwaggerConfig) scanner).configure(swagger); - } else { - SwaggerConfig configurator = (SwaggerConfig) context.getAttribute("reader"); - if (configurator != null) { - LOGGER.debug("configuring swagger with " + configurator); - configurator.configure(swagger); - } else { - LOGGER.debug("no configurator"); - } - } - context.setAttribute("swagger", swagger); - } - } - initialized = true; - return swagger; - } - - private Swagger process( - Application app, - WebConfig sc, - HttpHeaders headers, - UriInfo uriInfo) { - Swagger swagger = (Swagger) context.getAttribute("swagger"); - if (!initialized) { - swagger = scan(app, sc); - } - if (swagger != null) { - SwaggerSpecFilter filterImpl = FilterFactory.getFilter(); - if (filterImpl != null) { - SpecFilter f = new SpecFilter(); - swagger = f.filter(swagger, filterImpl, getQueryParams(uriInfo.getQueryParameters()), getCookies(headers), - getHeaders(headers)); - } - } - return swagger; - } - - @GET - @Produces({MediaType.APPLICATION_JSON, "application/yaml"}) - @ApiOperation(value = "The swagger definition in either JSON or YAML", hidden = true) - @Path("/swagger.{type:json|yaml}") - public Response getListing( - @Context Application app, - @Context WebConfig sc, - @Context HttpHeaders headers, - @Context UriInfo uriInfo, - @PathParam("type") String type) { - if (Strings.isNonBlank(type) && type.trim().equalsIgnoreCase("yaml")) { - return getListingYaml(app, sc, headers, uriInfo); - } else { - return getListingJson(app, sc, headers, uriInfo); - } - } - - @GET - @Produces({MediaType.APPLICATION_JSON}) - @Path("/swagger") - @ApiOperation(value = "The swagger definition in JSON", hidden = true) - public Response getListingJson( - @Context Application app, - @Context WebConfig sc, - @Context HttpHeaders headers, - @Context UriInfo uriInfo) { - Swagger swagger = process(app, sc, headers, uriInfo); - - if (swagger != null) { - return Response.ok().entity(swagger).build(); - } else { - return Response.status(404).build(); - } - } - - @GET - @Produces("application/yaml") - @Path("/swagger") - @ApiOperation(value = "The swagger definition in YAML", hidden = true) - public Response getListingYaml( - @Context Application app, - @Context WebConfig sc, - @Context HttpHeaders headers, - @Context UriInfo uriInfo) { - Swagger swagger = process(app, sc, headers, uriInfo); - try { - if (swagger != null) { - String yaml = Yaml.mapper().writeValueAsString(swagger); - StringBuilder b = new StringBuilder(); - String[] parts = yaml.split("\n"); - for (String part : parts) { - b.append(part); - b.append("\n"); - } - return Response.ok().entity(b.toString()).type("application/yaml").build(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return Response.status(404).build(); - } - - protected Map> getQueryParams(MultivaluedMap params) { - Map> output = new HashMap<>(); - if (params != null) { - for (String key : params.keySet()) { - List values = params.get(key); - output.put(key, values); - } - } - return output; - } - - protected Map getCookies(HttpHeaders headers) { - Map output = new HashMap<>(); - if (headers != null) { - for (String key : headers.getCookies().keySet()) { - Cookie cookie = headers.getCookies().get(key); - output.put(key, cookie.getValue()); - } - } - return output; - } - - protected Map> getHeaders(HttpHeaders headers) { - Map> output = new HashMap<>(); - if (headers != null) { - for (String key : headers.getRequestHeaders().keySet()) { - List values = headers.getRequestHeaders().get(key); - output.put(key, values); - } - } - return output; - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/resources/ApidocResource.java ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/resources/ApidocResource.java b/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/resources/ApidocResource.java deleted file mode 100644 index 1cf6523..0000000 --- a/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/resources/ApidocResource.java +++ /dev/null @@ -1,33 +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.brooklyn.rest.resources; - - -import javax.ws.rs.Path; - -import io.swagger.annotations.Api; - -/** - * @author Ciprian Ciubotariu - */ -@Api("API Documentation") -@Path("/apidoc") -public class ApidocResource extends ApiListingResource { - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/util/FormMapProvider.java ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/util/FormMapProvider.java b/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/util/FormMapProvider.java deleted file mode 100644 index 2b5c19b..0000000 --- a/rest/rest-server-jersey/src/main/java/org/apache/brooklyn/rest/util/FormMapProvider.java +++ /dev/null @@ -1,81 +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.brooklyn.rest.util; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.annotation.Annotation; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; -import javax.ws.rs.Consumes; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; - -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.sun.jersey.core.impl.provider.entity.FormMultivaluedMapProvider; -import com.sun.jersey.core.util.MultivaluedMapImpl; - -/** - * A MessageBodyReader producing a Map<String, Object>, where Object - * is either a String, a List<String> or null. - */ -@Provider -@Consumes(MediaType.APPLICATION_FORM_URLENCODED) -public class FormMapProvider implements MessageBodyReader> { - - @Override - public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { - if (!Map.class.equals(type) || !(genericType instanceof ParameterizedType)) { - return false; - } - ParameterizedType parameterized = (ParameterizedType) genericType; - return parameterized.getActualTypeArguments().length == 2 && - parameterized.getActualTypeArguments()[0] == String.class && - parameterized.getActualTypeArguments()[1] == Object.class; - } - - @Override - public Map readFrom(Class> type, Type genericType, Annotation[] annotations, - MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) - throws IOException, WebApplicationException { - FormMultivaluedMapProvider delegate = new FormMultivaluedMapProvider(); - MultivaluedMap multi = new MultivaluedMapImpl(); - multi = delegate.readFrom(multi, mediaType, entityStream); - - Map map = Maps.newHashMapWithExpectedSize(multi.keySet().size()); - for (String key : multi.keySet()) { - List value = multi.get(key); - if (value.size() > 1) { - map.put(key, Lists.newArrayList(value)); - } else if (value.size() == 1) { - map.put(key, Iterables.getOnlyElement(value)); - } else { - map.put(key, null); - } - } - return map; - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/main/resources/build-metadata.properties ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/main/resources/build-metadata.properties b/rest/rest-server-jersey/src/main/resources/build-metadata.properties deleted file mode 100644 index eab85ef..0000000 --- a/rest/rest-server-jersey/src/main/resources/build-metadata.properties +++ /dev/null @@ -1,18 +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. -git-sha-1 = ${buildNumber} -git-branch-name = ${scmBranch} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/main/webapp/WEB-INF/web.xml b/rest/rest-server-jersey/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 40fb79f..0000000 --- a/rest/rest-server-jersey/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,149 +0,0 @@ - - - - Brooklyn REST API v1 - - - Brooklyn Request Tagging Filter - org.apache.brooklyn.rest.filter.RequestTaggingFilter - - - Brooklyn Request Tagging Filter - /* - - - - Brooklyn Properties Authentication Filter - org.apache.brooklyn.rest.filter.BrooklynPropertiesSecurityFilter - - - Brooklyn Properties Authentication Filter - /* - - - - Brooklyn Logging Filter - org.apache.brooklyn.rest.filter.LoggingFilter - - - Brooklyn Logging Filter - /* - - - - Brooklyn HA Master Filter - org.apache.brooklyn.rest.filter.HaMasterCheckFilter - - - Brooklyn HA Master Filter - /* - - - - Brooklyn Swagger Bootstrap - org.apache.brooklyn.rest.filter.SwaggerFilter - - - Brooklyn Swagger Bootstrap - /* - - - - - Brooklyn REST API v1 Filter - com.sun.jersey.spi.container.servlet.ServletContainer - - - - com.sun.jersey.config.property.resourceConfigClass - com.sun.jersey.api.core.ClassNamesResourceConfig - - - com.sun.jersey.config.property.classnames - - io.swagger.jaxrs.listing.SwaggerSerializers; - org.apache.brooklyn.rest.util.FormMapProvider; - com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; - org.apache.brooklyn.rest.filter.RequestTaggingRsFilter; - org.apache.brooklyn.rest.filter.NoCacheFilter; - org.apache.brooklyn.rest.filter.HaHotCheckResourceFilter; - org.apache.brooklyn.rest.filter.EntitlementContextFilter; - org.apache.brooklyn.rest.util.ManagementContextProvider; - org.apache.brooklyn.rest.resources.AccessResource; - org.apache.brooklyn.rest.resources.ActivityResource; - org.apache.brooklyn.rest.resources.ApidocResource; - org.apache.brooklyn.rest.resources.ApplicationResource; - org.apache.brooklyn.rest.resources.CatalogResource; - org.apache.brooklyn.rest.resources.EffectorResource; - org.apache.brooklyn.rest.resources.EntityConfigResource; - org.apache.brooklyn.rest.resources.EntityResource; - org.apache.brooklyn.rest.resources.LocationResource; - org.apache.brooklyn.rest.resources.PolicyConfigResource; - org.apache.brooklyn.rest.resources.PolicyResource; - org.apache.brooklyn.rest.resources.ScriptResource; - org.apache.brooklyn.rest.resources.SensorResource; - org.apache.brooklyn.rest.resources.ServerResource; - org.apache.brooklyn.rest.resources.UsageResource; - org.apache.brooklyn.rest.resources.VersionResource; - - - - - com.sun.jersey.api.json.POJOMappingFeature - true - - - - - com.sun.jersey.config.feature.DisableWADL - true - - - - com.sun.jersey.config.feature.FilterContextPath - /v1 - - - - - Brooklyn REST API v1 Filter - /v1/* - - - http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynPropertiesSecurityFilterTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynPropertiesSecurityFilterTest.java b/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynPropertiesSecurityFilterTest.java deleted file mode 100644 index e855841..0000000 --- a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynPropertiesSecurityFilterTest.java +++ /dev/null @@ -1,151 +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.brooklyn.rest; - -import static org.testng.Assert.assertTrue; - -import java.net.URI; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.http.HttpHeaders; -import org.apache.http.NameValuePair; -import org.apache.http.client.HttpClient; -import org.apache.http.client.utils.URLEncodedUtils; -import org.apache.http.entity.ContentType; -import org.apache.http.message.BasicNameValuePair; -import org.eclipse.jetty.server.Server; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.Test; -import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.http.HttpTool; -import org.apache.brooklyn.util.http.HttpToolResponse; -import org.apache.brooklyn.util.time.Time; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Charsets; -import com.google.common.base.Stopwatch; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; - -public class BrooklynPropertiesSecurityFilterTest extends BrooklynRestApiLauncherTestFixture { - - private static final Logger LOG = LoggerFactory.getLogger(BrooklynPropertiesSecurityFilterTest.class); - - /* - Exception java.lang.AssertionError - - Message: error creating app. response code=400 expected [true] but found [false] - Stacktrace: - - - at org.testng.Assert.fail(Assert.java:94) - at org.testng.Assert.failNotEquals(Assert.java:494) - at org.testng.Assert.assertTrue(Assert.java:42) - at org.apache.brooklyn.rest.BrooklynPropertiesSecurityFilterTest.startAppAtNode(BrooklynPropertiesSecurityFilterTest.java:94) - at org.apache.brooklyn.rest.BrooklynPropertiesSecurityFilterTest.testInteractionOfSecurityFilterAndFormMapProvider(BrooklynPropertiesSecurityFilterTest.java:64) - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) - at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) - at java.lang.reflect.Method.invoke(Method.java:606) - at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) - at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) - at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) - at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) - at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) - at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) - at org.testng.TestRunner.privateRun(TestRunner.java:767) - at org.testng.TestRunner.run(TestRunner.java:617) - at org.testng.SuiteRunner.runTest(SuiteRunner.java:348) - at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:343) - at org.testng.SuiteRunner.privateRun(SuiteRunner.java:305) - at org.testng.SuiteRunner.run(SuiteRunner.java:254) - at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) - at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) - at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224) - at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) - at org.testng.TestNG.run(TestNG.java:1057) - at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:115) - at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:205) - at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:108) - at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:111) - at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203) - at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155) - at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) - */ - // Would be great for this to be a unit test but it takes almost ten seconds. - @Test(groups = {"Integration","Broken"}) - public void testInteractionOfSecurityFilterAndFormMapProvider() throws Exception { - Stopwatch stopwatch = Stopwatch.createStarted(); - try { - Server server = useServerForTest(BrooklynRestApiLauncher.launcher() - .securityProvider(AnyoneSecurityProvider.class) - .forceUseOfDefaultCatalogWithJavaClassPath(true) - .withoutJsgui() - .start()); - String appId = startAppAtNode(server); - String entityId = getTestEntityInApp(server, appId); - HttpClient client = HttpTool.httpClientBuilder() - .uri(getBaseUri(server)) - .build(); - List nvps = Lists.newArrayList( - new BasicNameValuePair("arg", "bar")); - String effector = String.format("/v1/applications/%s/entities/%s/effectors/identityEffector", appId, entityId); - HttpToolResponse response = HttpTool.httpPost(client, URI.create(getBaseUri() + effector), - ImmutableMap.of(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_FORM_URLENCODED.getMimeType()), - URLEncodedUtils.format(nvps, Charsets.UTF_8).getBytes()); - - LOG.info("Effector response: {}", response.getContentAsString()); - assertTrue(HttpTool.isStatusCodeHealthy(response.getResponseCode()), "response code=" + response.getResponseCode()); - } finally { - LOG.info("testInteractionOfSecurityFilterAndFormMapProvider complete in " + Time.makeTimeStringRounded(stopwatch)); - } - } - - private String startAppAtNode(Server server) throws Exception { - String blueprint = "name: TestApp\n" + - "location: localhost\n" + - "services:\n" + - "- type: org.apache.brooklyn.test.entity.TestEntity"; - HttpClient client = HttpTool.httpClientBuilder() - .uri(getBaseUri(server)) - .build(); - HttpToolResponse response = HttpTool.httpPost(client, URI.create(getBaseUri() + "/v1/applications"), - ImmutableMap.of(HttpHeaders.CONTENT_TYPE, "application/x-yaml"), - blueprint.getBytes()); - assertTrue(HttpTool.isStatusCodeHealthy(response.getResponseCode()), "error creating app. response code=" + response.getResponseCode()); - @SuppressWarnings("unchecked") - Map body = new ObjectMapper().readValue(response.getContent(), HashMap.class); - return (String) body.get("entityId"); - } - - @SuppressWarnings("rawtypes") - private String getTestEntityInApp(Server server, String appId) throws Exception { - HttpClient client = HttpTool.httpClientBuilder() - .uri(getBaseUri(server)) - .build(); - List entities = new ObjectMapper().readValue( - HttpTool.httpGet(client, URI.create(getBaseUri() + "/v1/applications/" + appId + "/entities"), MutableMap.of()).getContent(), List.class); - LOG.info((String) ((Map) entities.get(0)).get("id")); - return (String) ((Map) entities.get(0)).get("id"); - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java b/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java deleted file mode 100644 index 8b67b12..0000000 --- a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java +++ /dev/null @@ -1,498 +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.brooklyn.rest; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.util.EnumSet; -import java.util.List; - -import javax.servlet.DispatcherType; -import javax.servlet.Filter; - -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.camp.brooklyn.BrooklynCampPlatformLauncherAbstract; -import org.apache.brooklyn.camp.brooklyn.BrooklynCampPlatformLauncherNoServer; -import org.apache.brooklyn.core.internal.BrooklynProperties; -import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; -import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; -import org.apache.brooklyn.core.server.BrooklynServerConfig; -import org.apache.brooklyn.core.server.BrooklynServiceAttributes; -import org.apache.brooklyn.rest.filter.BrooklynPropertiesSecurityFilter; -import org.apache.brooklyn.rest.filter.HaMasterCheckFilter; -import org.apache.brooklyn.rest.filter.LoggingFilter; -import org.apache.brooklyn.rest.filter.NoCacheFilter; -import org.apache.brooklyn.rest.filter.RequestTaggingFilter; -import org.apache.brooklyn.rest.filter.SwaggerFilter; -import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider; -import org.apache.brooklyn.rest.security.provider.SecurityProvider; -import org.apache.brooklyn.rest.util.ManagementContextProvider; -import org.apache.brooklyn.rest.util.ServerStoppingShutdownHandler; -import org.apache.brooklyn.rest.util.ShutdownHandlerProvider; -import org.apache.brooklyn.util.core.osgi.Compat; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.guava.Maybe; -import org.apache.brooklyn.util.net.Networking; -import org.apache.brooklyn.util.text.WildcardGlobs; -import org.eclipse.jetty.server.NetworkConnector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.ContextHandler; -import org.eclipse.jetty.servlet.FilterHolder; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.webapp.WebAppContext; -import org.reflections.util.ClasspathHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.annotations.Beta; -import com.google.common.base.Charsets; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.google.common.io.Files; -import com.sun.jersey.api.core.DefaultResourceConfig; -import com.sun.jersey.api.core.ResourceConfig; -import com.sun.jersey.spi.container.servlet.ServletContainer; - -/** Convenience and demo for launching programmatically. Also used for automated tests. - *

- * BrooklynLauncher has a more full-featured CLI way to start, - * but if you want more control you can: - *

  • take the WAR this project builds (REST API) -- NB probably want the unshaded one (containing all deps) - *
  • take the WAR from the brooklyn-jsgui project (brooklyn-ui repo) _and_ this WAR and combine them - * (this one should run as a filter on the others, _not_ as a ResourceCollection where they fight over who's got root) - *
  • programmatically install things, following the examples herein; - * in particular {@link #installAsServletFilter(ServletContextHandler)} is quite handy! - *

    - * You can also just run this class. In most installs it just works, assuming your IDE or maven-fu gives you the classpath. - * Add more apps and entities on the classpath and they'll show up in the catalog. - **/ -public class BrooklynRestApiLauncher { - - private static final Logger log = LoggerFactory.getLogger(BrooklynRestApiLauncher.class); - final static int FAVOURITE_PORT = 8081; - public static final String SCANNING_CATALOG_BOM_URL = "classpath://brooklyn/scanning.catalog.bom"; - - enum StartMode { - FILTER, SERVLET, /** web-xml is not fully supported */ @Beta WEB_XML - } - - public static final List> DEFAULT_FILTERS = ImmutableList.of( - RequestTaggingFilter.class, - BrooklynPropertiesSecurityFilter.class, - LoggingFilter.class, - HaMasterCheckFilter.class, - SwaggerFilter.class); - - private boolean forceUseOfDefaultCatalogWithJavaClassPath = false; - private Class securityProvider; - private List> filters = DEFAULT_FILTERS; - private StartMode mode = StartMode.FILTER; - private ManagementContext mgmt; - private ContextHandler customContext; - private boolean deployJsgui = true; - private boolean disableHighAvailability = true; - private ServerStoppingShutdownHandler shutdownListener; - - protected BrooklynRestApiLauncher() {} - - public BrooklynRestApiLauncher managementContext(ManagementContext mgmt) { - this.mgmt = mgmt; - return this; - } - - public BrooklynRestApiLauncher forceUseOfDefaultCatalogWithJavaClassPath(boolean forceUseOfDefaultCatalogWithJavaClassPath) { - this.forceUseOfDefaultCatalogWithJavaClassPath = forceUseOfDefaultCatalogWithJavaClassPath; - return this; - } - - public BrooklynRestApiLauncher securityProvider(Class securityProvider) { - this.securityProvider = securityProvider; - return this; - } - - /** - * Runs the server with the given set of filters. - * Overrides any previously supplied set (or {@link #DEFAULT_FILTERS} which is used by default). - */ - public BrooklynRestApiLauncher filters(@SuppressWarnings("unchecked") Class... filters) { - this.filters = Lists.newArrayList(filters); - return this; - } - - public BrooklynRestApiLauncher mode(StartMode mode) { - this.mode = checkNotNull(mode, "mode"); - return this; - } - - /** Overrides start mode to use an explicit context */ - public BrooklynRestApiLauncher customContext(ContextHandler customContext) { - this.customContext = checkNotNull(customContext, "customContext"); - return this; - } - - public BrooklynRestApiLauncher withJsgui() { - this.deployJsgui = true; - return this; - } - - public BrooklynRestApiLauncher withoutJsgui() { - this.deployJsgui = false; - return this; - } - - public BrooklynRestApiLauncher disableHighAvailability(boolean value) { - this.disableHighAvailability = value; - return this; - } - - public Server start() { - if (this.mgmt == null) { - mgmt = new LocalManagementContext(); - } - BrooklynCampPlatformLauncherAbstract platform = new BrooklynCampPlatformLauncherNoServer() - .useManagementContext(mgmt) - .launch(); - ((LocalManagementContext)mgmt).noteStartupComplete(); - log.debug("started "+platform); - - ContextHandler context; - String summary; - if (customContext == null) { - switch (mode) { - case SERVLET: - context = servletContextHandler(mgmt); - summary = "programmatic Jersey ServletContainer servlet"; - break; - case WEB_XML: - context = webXmlContextHandler(mgmt); - summary = "from WAR at " + ((WebAppContext) context).getWar(); - break; - case FILTER: - default: - context = filterContextHandler(mgmt); - summary = "programmatic Jersey ServletContainer filter on webapp at " + ((WebAppContext) context).getWar(); - break; - } - } else { - context = customContext; - summary = (context instanceof WebAppContext) - ? "from WAR at " + ((WebAppContext) context).getWar() - : "from custom context"; - } - - if (securityProvider != null) { - ((BrooklynProperties) mgmt.getConfig()).put( - BrooklynWebConfig.SECURITY_PROVIDER_CLASSNAME, securityProvider.getName()); - } - - if (forceUseOfDefaultCatalogWithJavaClassPath) { - // sets URLs for a surefire - ((BrooklynProperties) mgmt.getConfig()).put(BrooklynServerConfig.BROOKLYN_CATALOG_URL, SCANNING_CATALOG_BOM_URL); - ((LocalManagementContext) mgmt).setBaseClassPathForScanning(ClasspathHelper.forJavaClassPath()); - } else { - // don't use any catalog.xml which is set - ((BrooklynProperties) mgmt.getConfig()).put(BrooklynServerConfig.BROOKLYN_CATALOG_URL, ManagementContextInternal.EMPTY_CATALOG_URL); - } - - Server server = startServer(mgmt, context, summary, disableHighAvailability); - if (shutdownListener!=null) { - // not available in some modes, eg webapp - shutdownListener.setServer(server); - } - return server; - } - - private ContextHandler filterContextHandler(ManagementContext mgmt) { - WebAppContext context = new WebAppContext(); - context.setAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT, mgmt); - context.setContextPath("/"); - installWar(context); - installAsServletFilter(context, this.filters); - return context; - } - - private void installWar(WebAppContext context) { - // here we run with the JS GUI, for convenience, if we can find it, else set up an empty dir - // TODO pretty sure there is an option to monitor this dir and load changes to static content - // NOTE: When running Brooklyn from an IDE (i.e. by launching BrooklynJavascriptGuiLauncher.main()) - // you will need to ensure that the working directory is set to the brooklyn-ui repo folder. For IntelliJ, - // set the 'Working directory' of the Run/Debug Configuration to $MODULE_DIR$/brooklyn-server/launcher. - // For Eclipse, use the default option of ${workspace_loc:brooklyn-launcher}. - // If the working directory is not set correctly, Brooklyn will be unable to find the jsgui .war - // file and the 'gui not available' message will be shown. - context.setWar(this.deployJsgui && findJsguiWebappInSource().isPresent() - ? findJsguiWebappInSource().get() - : createTempWebDirWithIndexHtml("Brooklyn REST API

    (gui not available)")); - } - - private ContextHandler servletContextHandler(ManagementContext managementContext) { - ResourceConfig config = new DefaultResourceConfig(); - for (Object r: BrooklynRestApi.getAllResources()) - config.getSingletons().add(r); - config.getSingletons().add(new ManagementContextProvider()); - addShutdownListener(config, mgmt); - - - WebAppContext context = new WebAppContext(); - context.setAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT, managementContext); - ServletHolder servletHolder = new ServletHolder(new ServletContainer(config)); - context.addServlet(servletHolder, "/v1/*"); - context.setContextPath("/"); - - installWar(context); - installBrooklynFilters(context, this.filters); - return context; - } - - /** NB: not fully supported; use one of the other {@link StartMode}s */ - private ContextHandler webXmlContextHandler(ManagementContext mgmt) { - // TODO add security to web.xml - WebAppContext context; - if (findMatchingFile("src/main/webapp")!=null) { - // running in source mode; need to use special classpath - context = new WebAppContext("src/main/webapp", "/"); - context.setExtraClasspath("./target/classes"); - } else if (findRestApiWar()!=null) { - context = new WebAppContext(findRestApiWar(), "/"); - } else { - throw new IllegalStateException("Cannot find WAR for REST API. Expected in target/*.war, Maven repo, or in source directories."); - } - context.setAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT, mgmt); - // TODO shutdown hook - - return context; - } - - /** starts a server, on all NICs if security is configured, - * otherwise (no security) only on loopback interface - * @deprecated since 0.9.0 becoming private */ - @Deprecated - public static Server startServer(ManagementContext mgmt, ContextHandler context, String summary, boolean disableHighAvailability) { - // TODO this repeats code in BrooklynLauncher / WebServer. should merge the two paths. - boolean secure = mgmt != null && !BrooklynWebConfig.hasNoSecurityOptions(mgmt.getConfig()); - if (secure) { - log.debug("Detected security configured, launching server on all network interfaces"); - } else { - log.debug("Detected no security configured, launching server on loopback (localhost) network interface only"); - if (mgmt!=null) { - log.debug("Detected no security configured, running on loopback; disabling authentication"); - ((BrooklynProperties)mgmt.getConfig()).put(BrooklynWebConfig.SECURITY_PROVIDER_CLASSNAME, AnyoneSecurityProvider.class.getName()); - } - } - if (mgmt != null && disableHighAvailability) - mgmt.getHighAvailabilityManager().disabled(); - InetSocketAddress bindLocation = new InetSocketAddress( - secure ? Networking.ANY_NIC : Networking.LOOPBACK, - Networking.nextAvailablePort(FAVOURITE_PORT)); - return startServer(context, summary, bindLocation); - } - - /** @deprecated since 0.9.0 becoming private */ - @Deprecated - public static Server startServer(ContextHandler context, String summary, InetSocketAddress bindLocation) { - Server server = new Server(bindLocation); - - server.setHandler(context); - try { - server.start(); - } catch (Exception e) { - throw Exceptions.propagate(e); - } - log.info("Brooklyn REST server started ("+summary+") on"); - log.info(" http://localhost:"+((NetworkConnector)server.getConnectors()[0]).getLocalPort()+"/"); - - return server; - } - - public static BrooklynRestApiLauncher launcher() { - return new BrooklynRestApiLauncher(); - } - - public static void main(String[] args) throws Exception { - startRestResourcesViaFilter(); - log.info("Press Ctrl-C to quit."); - } - - public static Server startRestResourcesViaFilter() { - return new BrooklynRestApiLauncher() - .mode(StartMode.FILTER) - .start(); - } - - public static Server startRestResourcesViaServlet() throws Exception { - return new BrooklynRestApiLauncher() - .mode(StartMode.SERVLET) - .start(); - } - - public static Server startRestResourcesViaWebXml() throws Exception { - return new BrooklynRestApiLauncher() - .mode(StartMode.WEB_XML) - .start(); - } - - public void installAsServletFilter(ServletContextHandler context) { - installAsServletFilter(context, DEFAULT_FILTERS); - } - - private void installAsServletFilter(ServletContextHandler context, List> filters) { - installBrooklynFilters(context, filters); - - // now set up the REST servlet resources - ResourceConfig config = new DefaultResourceConfig(); - // load all our REST API modules, JSON, and Swagger - for (Object r: BrooklynRestApi.getAllResources()) - config.getSingletons().add(r); - - // disable caching for dynamic content - config.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, NoCacheFilter.class.getName()); - // Checks if appropriate request given HA status - config.getProperties().put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES, org.apache.brooklyn.rest.filter.HaHotCheckResourceFilter.class.getName()); - // configure to match empty path, or any thing which looks like a file path with /assets/ and extension html, css, js, or png - // and treat that as static content - config.getProperties().put(ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX, "(/?|[^?]*/assets/[^?]+\\.[A-Za-z0-9_]+)"); - // and anything which is not matched as a servlet also falls through (but more expensive than a regex check?) - config.getFeatures().put(ServletContainer.FEATURE_FILTER_FORWARD_ON_404, true); - // finally create this as a _filter_ which falls through to a web app or something (optionally) - FilterHolder filterHolder = new FilterHolder(new ServletContainer(config)); - // Let the filter know the context path where it lives - filterHolder.setInitParameter(ServletContainer.PROPERTY_FILTER_CONTEXT_PATH, "/v1"); - context.addFilter(filterHolder, "/v1/*", EnumSet.allOf(DispatcherType.class)); - - ManagementContext mgmt = getManagementContext(context); - config.getSingletons().add(new ManagementContextProvider()); - addShutdownListener(config, mgmt); - } - - protected synchronized void addShutdownListener(ResourceConfig config, ManagementContext mgmt) { - if (shutdownListener!=null) throw new IllegalStateException("Can only retrieve one shutdown listener"); - shutdownListener = new ServerStoppingShutdownHandler(mgmt); - config.getSingletons().add(new ShutdownHandlerProvider(shutdownListener)); - } - - private static void installBrooklynFilters(ServletContextHandler context, List> filters) { - for (Class filter : filters) { - context.addFilter(filter, "/*", EnumSet.allOf(DispatcherType.class)); - } - } - - /** - * Starts the server on all nics (even if security not enabled). - * @deprecated since 0.6.0; use {@link #launcher()} and set a custom context - */ - @Deprecated - public static Server startServer(ContextHandler context, String summary) { - return BrooklynRestApiLauncher.startServer(context, summary, - new InetSocketAddress(Networking.ANY_NIC, Networking.nextAvailablePort(FAVOURITE_PORT))); - } - - /** look for the JS GUI webapp in common source places, returning path to it if found, or null. - * assumes `brooklyn-ui` is checked out as a sibling to `brooklyn-server`, and both are 2, 3, 1, or 0 - * levels above the CWD. */ - @Beta - public static Maybe findJsguiWebappInSource() { - // normally up 2 levels to where brooklyn-* folders are, then into ui - // (but in rest projects it might be 3 up, and in some IDEs we might run from parent dirs.) - // TODO could also look in maven repo ? - return findFirstMatchingFile( - "../../brooklyn-ui/src/main/webapp", - "../../../brooklyn-ui/src/main/webapp", - "../brooklyn-ui/src/main/webapp", - "./brooklyn-ui/src/main/webapp", - "../../brooklyn-ui/target/*.war", - "../../..brooklyn-ui/target/*.war", - "../brooklyn-ui/target/*.war", - "./brooklyn-ui/target/*.war"); - } - - /** look for the REST WAR file in common places, returning path to it if found, or null */ - private static String findRestApiWar() { - // don't look at src/main/webapp here -- because classes won't be there! - // could also look in maven repo ? - // TODO looks like this stopped working at runtime a long time ago; - // only needed for WEB_XML mode, and not used, but should remove or check? - // (probably will be superseded by CXF/OSGi work however) - return findMatchingFile("../rest/target/*.war").orNull(); - } - - /** as {@link #findMatchingFile(String)} but finding the first */ - public static Maybe findFirstMatchingFile(String ...filenames) { - for (String f: filenames) { - Maybe result = findMatchingFile(f); - if (result.isPresent()) return result; - } - return Maybe.absent(); - } - - /** returns the supplied filename if it exists (absolute or relative to the current directory); - * supports globs in the filename portion only, in which case it returns the _newest_ matching file. - *

    - * otherwise returns null */ - @Beta // public because used in dependent test projects - public static Maybe findMatchingFile(String filename) { - final File f = new File(filename); - if (f.exists()) return Maybe.of(filename); - File dir = f.getParentFile(); - File result = null; - if (dir.exists()) { - File[] matchingFiles = dir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return WildcardGlobs.isGlobMatched(f.getName(), name); - } - }); - for (File mf: matchingFiles) { - if (result==null || mf.lastModified() > result.lastModified()) result = mf; - } - } - if (result==null) return Maybe.absent(); - return Maybe.of(result.getAbsolutePath()); - } - - /** create a directory with a simple index.html so we have some content being served up */ - private static String createTempWebDirWithIndexHtml(String indexHtmlContent) { - File dir = Files.createTempDir(); - dir.deleteOnExit(); - try { - Files.write(indexHtmlContent, new File(dir, "index.html"), Charsets.UTF_8); - } catch (IOException e) { - Exceptions.propagate(e); - } - return dir.getAbsolutePath(); - } - - /** - * Compatibility methods between karaf launcher and monolithic launcher. - * - * @todo Remove after transition to karaf launcher. - */ - static ManagementContext getManagementContext(ContextHandler jettyServerHandler) { - ManagementContext managementContext = Compat.getInstance().getManagementContext(); - if (managementContext == null && jettyServerHandler != null) { - managementContext = (ManagementContext) jettyServerHandler.getAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT); - } - return managementContext; - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java b/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java deleted file mode 100644 index 1a65f2c..0000000 --- a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java +++ /dev/null @@ -1,77 +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.brooklyn.rest; - -import static org.apache.brooklyn.rest.BrooklynRestApiLauncher.StartMode.FILTER; -import static org.apache.brooklyn.rest.BrooklynRestApiLauncher.StartMode.SERVLET; -import static org.apache.brooklyn.rest.BrooklynRestApiLauncher.StartMode.WEB_XML; - -import java.util.concurrent.Callable; - -import org.apache.brooklyn.entity.brooklynnode.BrooklynNode; -import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider; -import org.apache.brooklyn.test.Asserts; -import org.apache.brooklyn.util.http.HttpAsserts; -import org.apache.brooklyn.util.http.HttpTool; -import org.apache.http.HttpStatus; -import org.eclipse.jetty.server.NetworkConnector; -import org.eclipse.jetty.server.Server; -import org.testng.annotations.Test; - -public class BrooklynRestApiLauncherTest extends BrooklynRestApiLauncherTestFixture { - - @Test(enabled = false) // to be deleted - public void testFilterStart() throws Exception { - checkRestCatalogEntities(useServerForTest(baseLauncher().mode(FILTER).start())); - } - - @Test(enabled = false) // to be deleted - public void testServletStart() throws Exception { - checkRestCatalogEntities(useServerForTest(baseLauncher().mode(SERVLET).start())); - } - - @Test(enabled = false) // to be deleted - public void testWebAppStart() throws Exception { - checkRestCatalogEntities(useServerForTest(baseLauncher().mode(WEB_XML).start())); - } - - private BrooklynRestApiLauncher baseLauncher() { - return BrooklynRestApiLauncher.launcher() - .securityProvider(AnyoneSecurityProvider.class) - .forceUseOfDefaultCatalogWithJavaClassPath(true); - } - - private static void checkRestCatalogEntities(Server server) throws Exception { - final String rootUrl = "http://localhost:"+((NetworkConnector)server.getConnectors()[0]).getLocalPort(); - int code = Asserts.succeedsEventually(new Callable() { - @Override - public Integer call() throws Exception { - int code = HttpTool.getHttpStatusCode(rootUrl+"/v1/catalog/entities"); - if (code == HttpStatus.SC_FORBIDDEN) { - throw new RuntimeException("Retry request"); - } else { - return code; - } - } - }); - HttpAsserts.assertHealthyStatusCode(code); - HttpAsserts.assertContentContainsText(rootUrl+"/v1/catalog/entities", BrooklynNode.class.getSimpleName()); - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTestFixture.java ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTestFixture.java b/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTestFixture.java deleted file mode 100644 index c894f3e..0000000 --- a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTestFixture.java +++ /dev/null @@ -1,109 +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.brooklyn.rest; - -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.entity.Entities; -import org.apache.brooklyn.core.internal.BrooklynProperties; -import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; -import org.apache.brooklyn.core.server.BrooklynServerConfig; -import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.eclipse.jetty.server.NetworkConnector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.ContextHandler; -import org.reflections.util.ClasspathHelper; -import org.testng.Assert; -import org.testng.annotations.AfterMethod; - -public abstract class BrooklynRestApiLauncherTestFixture { - - Server server = null; - - @AfterMethod(alwaysRun=true) - public void stopServer() throws Exception { - if (server!=null) { - ManagementContext mgmt = getManagementContextFromJettyServerAttributes(server); - server.stop(); - if (mgmt!=null) Entities.destroyAll(mgmt); - server = null; - } - } - - protected Server newServer() { - try { - Server server = BrooklynRestApiLauncher.launcher() - .forceUseOfDefaultCatalogWithJavaClassPath(true) - .securityProvider(AnyoneSecurityProvider.class) - .start(); - return server; - } catch (Exception e) { - throw Exceptions.propagate(e); - } - } - - protected Server useServerForTest(Server server) { - if (this.server!=null) { - Assert.fail("Test only meant for single server; already have "+this.server+" when checking "+server); - } else { - this.server = server; - } - return server; - } - - protected String getBaseUri() { - return getBaseUri(server); - } - public static String getBaseUri(Server server) { - return "http://localhost:"+((NetworkConnector)server.getConnectors()[0]).getLocalPort(); - } - - public static void forceUseOfDefaultCatalogWithJavaClassPath(Server server) { - ManagementContext mgmt = getManagementContextFromJettyServerAttributes(server); - forceUseOfDefaultCatalogWithJavaClassPath(mgmt); - } - - public static void forceUseOfDefaultCatalogWithJavaClassPath(ManagementContext manager) { - // TODO duplication with BrooklynRestApiLauncher ? - - // don't use any catalog.xml which is set - ((BrooklynProperties)manager.getConfig()).put(BrooklynServerConfig.BROOKLYN_CATALOG_URL, BrooklynRestApiLauncher.SCANNING_CATALOG_BOM_URL); - // sets URLs for a surefire - ((LocalManagementContext)manager).setBaseClassPathForScanning(ClasspathHelper.forJavaClassPath()); - // this also works -// ((LocalManagementContext)manager).setBaseClassPathForScanning(ClasspathHelper.forPackage("brooklyn")); - // but this (near-default behaviour) does not -// ((LocalManagementContext)manager).setBaseClassLoader(getClass().getClassLoader()); - } - - public static void enableAnyoneLogin(Server server) { - ManagementContext mgmt = getManagementContextFromJettyServerAttributes(server); - enableAnyoneLogin(mgmt); - } - - public static void enableAnyoneLogin(ManagementContext mgmt) { - ((BrooklynProperties)mgmt.getConfig()).put(BrooklynWebConfig.SECURITY_PROVIDER_CLASSNAME, - AnyoneSecurityProvider.class.getName()); - } - - public static ManagementContext getManagementContextFromJettyServerAttributes(Server server) { - return BrooklynRestApiLauncher.getManagementContext((ContextHandler) server.getHandler()); - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/HaHotCheckTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/HaHotCheckTest.java b/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/HaHotCheckTest.java deleted file mode 100644 index 044e54d..0000000 --- a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/HaHotCheckTest.java +++ /dev/null @@ -1,160 +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.brooklyn.rest; - -import static org.testng.Assert.assertEquals; - -import javax.ws.rs.core.MediaType; - -import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityManager; -import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityMode; -import org.apache.brooklyn.api.mgmt.ha.ManagementNodeState; -import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; -import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; -import org.apache.brooklyn.rest.filter.HaHotCheckResourceFilter; -import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest; -import org.apache.brooklyn.rest.util.TestingHaHotStateCheckClassResource; -import org.apache.brooklyn.rest.util.TestingHaHotStateCheckResource; -import org.apache.brooklyn.rest.util.TestingHaMasterCheckResource; -import org.apache.brooklyn.rest.util.ManagementContextProvider; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.WebResource.Builder; -import com.sun.jersey.api.core.ResourceConfig; - -public class HaHotCheckTest extends BrooklynRestResourceTest { - - // setup and teardown before/after each method - - @BeforeMethod(alwaysRun = true) - public void setUp() throws Exception { super.setUp(); } - - @AfterMethod(alwaysRun = true) - public void tearDown() throws Exception { super.tearDown(); } - - @Override - protected void addBrooklynResources() { - config.getProperties().put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES, - new HaHotCheckResourceFilter(new ManagementContextProvider(getManagementContext()))); - addResource(new TestingHaHotStateCheckResource()); - addResource(new TestingHaHotStateCheckClassResource()); - addResource(new TestingHaMasterCheckResource()); - - ((LocalManagementContext)getManagementContext()).noteStartupComplete(); - } - - @Test - public void testHaCheck() { - HighAvailabilityManager ha = getManagementContext().getHighAvailabilityManager(); - assertEquals(ha.getNodeState(), ManagementNodeState.MASTER); - testResourceFetch("/v1/ha/method/ok", 200); - testResourceFetch("/v1/ha/method/fail", 200); - testResourceFetch("/v1/ha/class/fail", 200); - testResourcePost("/v1/ha/post", 204); - testResourcePost("/v1/server/shutdown", 204); - - getManagementContext().getHighAvailabilityManager().changeMode(HighAvailabilityMode.STANDBY); - assertEquals(ha.getNodeState(), ManagementNodeState.STANDBY); - - testResourceFetch("/v1/ha/method/ok", 200); - testResourceFetch("/v1/ha/method/fail", 403); - testResourceFetch("/v1/ha/class/fail", 403); - testResourcePost("/v1/ha/post", 403); - testResourcePost("/v1/server/shutdown", 204); - - ((ManagementContextInternal)getManagementContext()).terminate(); - assertEquals(ha.getNodeState(), ManagementNodeState.TERMINATED); - - testResourceFetch("/v1/ha/method/ok", 200); - testResourceFetch("/v1/ha/method/fail", 403); - testResourceFetch("/v1/ha/class/fail", 403); - testResourcePost("/v1/ha/post", 403); - testResourcePost("/v1/server/shutdown", 204); - } - - @Test - public void testHaCheckForce() { - HighAvailabilityManager ha = getManagementContext().getHighAvailabilityManager(); - assertEquals(ha.getNodeState(), ManagementNodeState.MASTER); - testResourceForcedFetch("/v1/ha/method/ok", 200); - testResourceForcedFetch("/v1/ha/method/fail", 200); - testResourceForcedFetch("/v1/ha/class/fail", 200); - testResourceForcedPost("/v1/ha/post", 204); - testResourceForcedPost("/v1/server/shutdown", 204); - - getManagementContext().getHighAvailabilityManager().changeMode(HighAvailabilityMode.STANDBY); - assertEquals(ha.getNodeState(), ManagementNodeState.STANDBY); - - testResourceForcedFetch("/v1/ha/method/ok", 200); - testResourceForcedFetch("/v1/ha/method/fail", 200); - testResourceForcedFetch("/v1/ha/class/fail", 200); - testResourceForcedPost("/v1/ha/post", 204); - testResourceForcedPost("/v1/server/shutdown", 204); - - ((ManagementContextInternal)getManagementContext()).terminate(); - assertEquals(ha.getNodeState(), ManagementNodeState.TERMINATED); - - testResourceForcedFetch("/v1/ha/method/ok", 200); - testResourceForcedFetch("/v1/ha/method/fail", 200); - testResourceForcedFetch("/v1/ha/class/fail", 200); - testResourceForcedPost("/v1/ha/post", 204); - testResourceForcedPost("/v1/server/shutdown", 204); - } - - - private void testResourceFetch(String resourcePath, int code) { - testResourceFetch(resourcePath, false, code); - } - - private void testResourcePost(String resourcePath, int code) { - testResourcePost(resourcePath, false, code); - } - - private void testResourceForcedFetch(String resourcePath, int code) { - testResourceFetch(resourcePath, true, code); - } - - private void testResourceForcedPost(String resourcePath, int code) { - testResourcePost(resourcePath, true, code); - } - - private void testResourceFetch(String resourcePath, boolean force, int code) { - Builder resource = client().resource(resourcePath) - .accept(MediaType.APPLICATION_JSON_TYPE); - if (force) { - resource.header(HaHotCheckResourceFilter.SKIP_CHECK_HEADER, "true"); - } - ClientResponse response = resource - .get(ClientResponse.class); - assertEquals(response.getStatus(), code); - } - - private void testResourcePost(String resourcePath, boolean force, int code) { - Builder resource = client().resource(resourcePath) - .accept(MediaType.APPLICATION_JSON_TYPE); - if (force) { - resource.header(HaHotCheckResourceFilter.SKIP_CHECK_HEADER, "true"); - } - ClientResponse response = resource.post(ClientResponse.class); - assertEquals(response.getStatus(), code); - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/HaMasterCheckFilterTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/HaMasterCheckFilterTest.java b/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/HaMasterCheckFilterTest.java deleted file mode 100644 index 424c0c1..0000000 --- a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/HaMasterCheckFilterTest.java +++ /dev/null @@ -1,218 +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.brooklyn.rest; - -import static org.testng.Assert.assertEquals; - -import java.io.File; -import java.net.URI; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeoutException; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.mgmt.EntityManager; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityMode; -import org.apache.brooklyn.api.mgmt.ha.ManagementNodeState; -import org.apache.brooklyn.camp.brooklyn.BrooklynCampPlatformLauncherNoServer; -import org.apache.brooklyn.core.entity.Entities; -import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils; -import org.apache.brooklyn.entity.stock.BasicApplication; -import org.apache.http.HttpStatus; -import org.apache.http.client.HttpClient; -import org.eclipse.jetty.server.Server; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.Test; -import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider; -import org.apache.brooklyn.test.Asserts; -import org.apache.brooklyn.util.http.HttpTool; -import org.apache.brooklyn.util.http.HttpToolResponse; -import org.apache.brooklyn.util.os.Os; -import org.apache.brooklyn.util.time.Duration; - -import com.google.common.base.Predicates; -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; - -public class HaMasterCheckFilterTest extends BrooklynRestApiLauncherTestFixture { - private static final Duration TIMEOUT = Duration.THIRTY_SECONDS; - - private File mementoDir; - private ManagementContext writeMgmt; - private ManagementContext readMgmt; - private String appId; - private Server server; - private HttpClient client; - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { -System.err.println("TEAR DOWN"); - server.stop(); - Entities.destroyAll(writeMgmt); - Entities.destroyAll(readMgmt); - Os.deleteRecursively(mementoDir); - } - - @Test(groups = "Integration") - public void testEntitiesExistOnDisabledHA() throws Exception { - initHaCluster(HighAvailabilityMode.DISABLED, HighAvailabilityMode.DISABLED); - assertReadIsMaster(); - assertEntityExists(new ReturnCodeCheck()); - } - - @Test(groups = "Integration") - public void testEntitiesExistOnMasterPromotion() throws Exception { - initHaCluster(HighAvailabilityMode.AUTO, HighAvailabilityMode.AUTO); - stopWriteNode(); - assertEntityExists(new ReturnCodeCheck()); - assertReadIsMaster(); - } - - @Test(groups = "Integration") - public void testEntitiesExistOnHotStandbyAndPromotion() throws Exception { - initHaCluster(HighAvailabilityMode.AUTO, HighAvailabilityMode.HOT_STANDBY); - assertEntityExists(new ReturnCodeCheck()); - stopWriteNode(); - assertEntityExists(new ReturnCodeAndNodeState()); - assertReadIsMaster(); - } - - @Test(groups = "Integration") - public void testEntitiesExistOnHotBackup() throws Exception { - initHaCluster(HighAvailabilityMode.AUTO, HighAvailabilityMode.HOT_BACKUP); - Asserts.continually( - ImmutableMap.of( - "timeout", Duration.THIRTY_SECONDS, - "period", Duration.ZERO), - new ReturnCodeSupplier(), - Predicates.or(Predicates.equalTo(200), Predicates.equalTo(403))); - } - - private HttpClient getClient(Server server) { - HttpClient client = HttpTool.httpClientBuilder() - .uri(getBaseUri(server)) - .build(); - return client; - } - - private int getAppResponseCode() { - HttpToolResponse response = HttpTool.httpGet( - client, URI.create(getBaseUri(server) + "/v1/applications/" + appId), - ImmutableMap.of()); - return response.getResponseCode(); - } - - private String createApp(ManagementContext mgmt) { - EntityManager entityMgr = mgmt.getEntityManager(); - Entity app = entityMgr.createEntity(EntitySpec.create(BasicApplication.class)); - entityMgr.manage(app); - return app.getId(); - } - - private ManagementContext createManagementContext(File mementoDir, HighAvailabilityMode mode) { - ManagementContext mgmt = RebindTestUtils.managementContextBuilder(mementoDir, getClass().getClassLoader()) - .persistPeriodMillis(1) - .forLive(false) - .emptyCatalog(true) - .buildUnstarted(); - - if (mode == HighAvailabilityMode.DISABLED) { - mgmt.getHighAvailabilityManager().disabled(); - } else { - mgmt.getHighAvailabilityManager().start(mode); - } - - new BrooklynCampPlatformLauncherNoServer() - .useManagementContext(mgmt) - .launch(); - - return mgmt; - } - - private void initHaCluster(HighAvailabilityMode writeMode, HighAvailabilityMode readMode) throws InterruptedException, TimeoutException { - mementoDir = Os.newTempDir(getClass()); - - writeMgmt = createManagementContext(mementoDir, writeMode); - appId = createApp(writeMgmt); - writeMgmt.getRebindManager().waitForPendingComplete(TIMEOUT, true); - - if (readMode == HighAvailabilityMode.DISABLED) { - //no HA, one node only - readMgmt = writeMgmt; - } else { - readMgmt = createManagementContext(mementoDir, readMode); - } - - server = useServerForTest(BrooklynRestApiLauncher.launcher() - .managementContext(readMgmt) - .securityProvider(AnyoneSecurityProvider.class) - .forceUseOfDefaultCatalogWithJavaClassPath(true) - .withoutJsgui() - .disableHighAvailability(false) - .start()); - client = getClient(server); - } - - private void assertEntityExists(Callable c) { - assertEquals((int)Asserts.succeedsEventually(c), 200); - } - - private void assertReadIsMaster() { - assertEquals(readMgmt.getHighAvailabilityManager().getNodeState(), ManagementNodeState.MASTER); - } - - private void stopWriteNode() { - writeMgmt.getHighAvailabilityManager().stop(); - } - - private class ReturnCodeCheck implements Callable { - @Override - public Integer call() { - int retCode = getAppResponseCode(); - if (retCode == 403) { - throw new RuntimeException("Not ready, retry. Response - " + retCode); - } else { - return retCode; - } - } - } - - private class ReturnCodeAndNodeState extends ReturnCodeCheck { - @Override - public Integer call() { - Integer ret = super.call(); - if (ret == HttpStatus.SC_OK) { - ManagementNodeState state = readMgmt.getHighAvailabilityManager().getNodeState(); - if (state != ManagementNodeState.MASTER) { - throw new RuntimeException("Not master yet " + state); - } - } - return ret; - } - } - - private class ReturnCodeSupplier implements Supplier { - @Override - public Integer get() { - return getAppResponseCode(); - } - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3be4fe11/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/domain/AbstractDomainTest.java ---------------------------------------------------------------------- diff --git a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/domain/AbstractDomainTest.java b/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/domain/AbstractDomainTest.java deleted file mode 100644 index dc1131d..0000000 --- a/rest/rest-server-jersey/src/test/java/org/apache/brooklyn/rest/domain/AbstractDomainTest.java +++ /dev/null @@ -1,44 +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.brooklyn.rest.domain; - -import java.io.IOException; - -import org.testng.annotations.Test; - -import static org.apache.brooklyn.rest.util.RestApiTestUtils.asJson; -import static org.apache.brooklyn.rest.util.RestApiTestUtils.fromJson; -import static org.apache.brooklyn.rest.util.RestApiTestUtils.jsonFixture; -import static org.testng.Assert.assertEquals; - -public abstract class AbstractDomainTest { - - protected abstract String getPath(); - protected abstract Object getDomainObject(); - - @Test - public void testSerializeToJSON() throws IOException { - assertEquals(asJson(getDomainObject()), jsonFixture(getPath())); - } - - @Test - public void testDeserializeFromJSON() throws IOException { - assertEquals(fromJson(jsonFixture(getPath()), getDomainObject().getClass()), getDomainObject()); - } -}