# HG changeset patch # User Severin Gehwolf # Date 1509026851 -7200 # Node ID 8ecf97835acd2a28d81fe8c9b2d3d1c74d9629c3 # Parent d28b7994e59e5ba53b0e595347ba146eb6de16a4 [commands] Bring version in line with others. Reviewed-by: neugens Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2017-October/025543.html diff -r d28b7994e59e -r 8ecf97835acd services/commands/src/main/java/com/redhat/thermostat/gateway/service/commands/http/handlers/StaticResourcesHandler.java --- a/services/commands/src/main/java/com/redhat/thermostat/gateway/service/commands/http/handlers/StaticResourcesHandler.java Thu Oct 26 12:20:51 2017 +0200 +++ b/services/commands/src/main/java/com/redhat/thermostat/gateway/service/commands/http/handlers/StaticResourcesHandler.java Thu Oct 26 16:07:31 2017 +0200 @@ -38,20 +38,24 @@ import java.io.IOException; +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.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import com.redhat.thermostat.gateway.common.core.servlet.BasicResourceHandler; +import com.redhat.thermostat.gateway.common.core.servlet.GlobalConstants; -@Path("{fileName: .+(\\.(yaml|html))}") -@Produces({MediaType.TEXT_PLAIN, MediaType.TEXT_HTML}) +@Path("/") public class StaticResourcesHandler extends BasicResourceHandler { + @Path("{fileName: .+(\\.(yaml|html))}") @GET + @Produces({MediaType.TEXT_PLAIN, MediaType.TEXT_HTML}) public Response getFileAsTextOrHtml(@PathParam("fileName") String fileName) throws IOException { MediaType type = MediaType.TEXT_PLAIN_TYPE; if (fileName.endsWith(".html")) { @@ -59,4 +63,14 @@ } return getFileAsResponse(StaticResourcesHandler.class.getClassLoader(), fileName, type); } + + // "version" is mapped to this servlet and comes here as '/' + @Path("/") + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response getVersion(@Context ServletContext context) throws IOException { + String version = context.getInitParameter(GlobalConstants.SERVICE_VERSION_KEY); + String response = "{ \"version\": \"" + version + "\" }"; + return Response.ok(response).build(); + } } diff -r d28b7994e59e -r 8ecf97835acd services/commands/src/main/resources/agent.html --- a/services/commands/src/main/resources/agent.html Thu Oct 26 12:20:51 2017 +0200 +++ b/services/commands/src/main/resources/agent.html Thu Oct 26 16:07:31 2017 +0200 @@ -117,9 +117,9 @@ query_string = "?access_token=" + token; } if (window.location.protocol == 'http:') { - CmdChan.connect('ws://' + window.location.host + '/commands/v1/systems/ignored_system/agents/testAgent' + query_string); + CmdChan.connect('ws://' + window.location.host + '/commands/0.0.1/systems/ignored_system/agents/testAgent' + query_string); } else { - CmdChan.connect('wss://' + window.location.host + '/commands/v1/systems/ignored_system/agents/testAgent' + query_string); + CmdChan.connect('wss://' + window.location.host + '/commands/0.0.1/systems/ignored_system/agents/testAgent' + query_string); } }; diff -r d28b7994e59e -r 8ecf97835acd services/commands/src/main/resources/agent2.html --- a/services/commands/src/main/resources/agent2.html Thu Oct 26 12:20:51 2017 +0200 +++ b/services/commands/src/main/resources/agent2.html Thu Oct 26 16:07:31 2017 +0200 @@ -117,9 +117,9 @@ query_string = "?access_token=" + token; } if (window.location.protocol == 'http:') { - CmdChan.connect('ws://' + window.location.host + '/commands/v1/systems/ignored_system/agents/otherAgent' + query_string); + CmdChan.connect('ws://' + window.location.host + '/commands/0.0.1/systems/ignored_system/agents/otherAgent' + query_string); } else { - CmdChan.connect('wss://' + window.location.host + '/commands/v1/systems/ignored_system/agents/otherAgent' + query_string); + CmdChan.connect('wss://' + window.location.host + '/commands/0.0.1/systems/ignored_system/agents/otherAgent' + query_string); } }; diff -r d28b7994e59e -r 8ecf97835acd services/commands/src/main/resources/index.html --- a/services/commands/src/main/resources/index.html Thu Oct 26 12:20:51 2017 +0200 +++ b/services/commands/src/main/resources/index.html Thu Oct 26 16:07:31 2017 +0200 @@ -122,7 +122,7 @@ if (token != null) { query_string = "?access_token=" + token; } - url = url + '/commands/v1/actions/' + action + '/systems/' + systemId + '/agents/' + agent + '/jvms/' + jvmId +'/sequence/' + CmdChan.sequence++ + query_string; + url = url + '/commands/0.0.1/actions/' + action + '/systems/' + systemId + '/agents/' + agent + '/jvms/' + jvmId +'/sequence/' + CmdChan.sequence++ + query_string; CmdChan.connect( url, clientRequest ); document.getElementById('cmd-chan').value = ''; diff -r d28b7994e59e -r 8ecf97835acd services/commands/src/main/webapp/WEB-INF/web.xml --- a/services/commands/src/main/webapp/WEB-INF/web.xml Thu Oct 26 12:20:51 2017 +0200 +++ b/services/commands/src/main/webapp/WEB-INF/web.xml Thu Oct 26 16:07:31 2017 +0200 @@ -54,11 +54,15 @@ StaticResourcesServlet - /v1/static/* + /0.0.1/static/* StaticResourcesServlet - /v1/doc/* + /0.0.1/doc/* + + + StaticResourcesServlet + /version @@ -66,15 +70,15 @@ - com.redhat.thermostat.gateway.SERVICE_VERSION - v1 + com.redhat.thermostat.gateway.SERVICE_VERSION + 0.0.1 - - Version - /version + + Version + /version @@ -82,7 +86,7 @@ Swagger API SPEC YAML File - /v1/doc/@com.redhat.thermostat.gateway.SERVICE_NAME@-swagger.yaml + /0.0.1/doc/@com.redhat.thermostat.gateway.SERVICE_NAME@-swagger.yaml diff -r d28b7994e59e -r 8ecf97835acd services/commands/src/test/java/com/redhat/thermostat/gateway/service/commands/channel/endpoints/AuthBasicCoreServerTest.java --- a/services/commands/src/test/java/com/redhat/thermostat/gateway/service/commands/channel/endpoints/AuthBasicCoreServerTest.java Thu Oct 26 12:20:51 2017 +0200 +++ b/services/commands/src/test/java/com/redhat/thermostat/gateway/service/commands/channel/endpoints/AuthBasicCoreServerTest.java Thu Oct 26 16:07:31 2017 +0200 @@ -80,7 +80,7 @@ private static final int TEST_PORT = 32039; private static final String TEST_ADDRESS = "127.0.0.1"; protected WebSocketClient client; - protected final String baseUrl = "ws://" + TEST_ADDRESS + ":" + TEST_PORT + CONTEXT_NAME +"/v1/"; + protected final String baseUrl = "ws://" + TEST_ADDRESS + ":" + TEST_PORT + CONTEXT_NAME +"/0.0.1/"; private static Thread thread; private static Server server; @@ -208,10 +208,10 @@ Configuration serviceConfig = mock(Configuration.class); when(serviceConfig.asMap()).thenReturn(serviceConfigMap); ServerEndpointConfig agentConf = configFactory.createEndpointConfig(CommandChannelAgentEndpointHandler.class, - "/v1" + CommandChannelAgentEndpointHandler.PATH, + "/0.0.1" + CommandChannelAgentEndpointHandler.PATH, serviceConfig); ServerEndpointConfig clientConf = configFactory.createEndpointConfig(CommandChannelClientEndpointHandler.class, - "/v1" + CommandChannelClientEndpointHandler.PATH, + "/0.0.1" + CommandChannelClientEndpointHandler.PATH, serviceConfig); container.addEndpoint(agentConf); container.addEndpoint(clientConf); diff -r d28b7994e59e -r 8ecf97835acd tests/integration-tests/src/test/java/com/redhat/thermostat/gateway/service/commands/CommandsServiceIntegrationTest.java --- a/tests/integration-tests/src/test/java/com/redhat/thermostat/gateway/service/commands/CommandsServiceIntegrationTest.java Thu Oct 26 12:20:51 2017 +0200 +++ b/tests/integration-tests/src/test/java/com/redhat/thermostat/gateway/service/commands/CommandsServiceIntegrationTest.java Thu Oct 26 16:07:31 2017 +0200 @@ -41,7 +41,7 @@ public class CommandsServiceIntegrationTest extends ServiceIntegrationTest { private static final String SERVICE_NAME = "commands"; - private static final String SERVICE_VERSION = "v1"; + private static final String SERVICE_VERSION = "0.0.1"; public CommandsServiceIntegrationTest() { super("ignore-me"); diff -r d28b7994e59e -r 8ecf97835acd tests/integration-tests/src/test/java/com/redhat/thermostat/gateway/service/schema/SchemaIntegrationTest.java --- a/tests/integration-tests/src/test/java/com/redhat/thermostat/gateway/service/schema/SchemaIntegrationTest.java Thu Oct 26 12:20:51 2017 +0200 +++ b/tests/integration-tests/src/test/java/com/redhat/thermostat/gateway/service/schema/SchemaIntegrationTest.java Thu Oct 26 16:07:31 2017 +0200 @@ -36,31 +36,29 @@ package com.redhat.thermostat.gateway.service.schema; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.redhat.thermostat.common.json.JsonUtil; -import com.redhat.thermostat.common.yaml.YamlToJson; -import com.redhat.thermostat.gateway.tests.integration.ServiceIntegrationTest; -import org.eclipse.jetty.http.HttpMethod; -import org.eclipse.jetty.client.api.ContentResponse; -import org.junit.Assert; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import org.eclipse.jetty.client.api.ContentResponse; +import org.eclipse.jetty.http.HttpMethod; +import org.eclipse.jetty.http.HttpStatus; +import org.junit.Test; -public class SchemaIntegrationTest extends ServiceIntegrationTest { +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.redhat.thermostat.common.json.JsonUtil; +import com.redhat.thermostat.common.yaml.YamlToJson; +import com.redhat.thermostat.gateway.tests.integration.IntegrationTest; + +public class SchemaIntegrationTest extends IntegrationTest { private static final String serviceName = "schema"; - private static final String versionString = ""; - private static final int HTTP_200_OK = 200; - private static final int HTTP_404_NOTFOUND = 404; public SchemaIntegrationTest() { super(serviceName); @@ -92,33 +90,18 @@ @Test public void testBad() throws InterruptedException, ExecutionException, TimeoutException { - final ContentResponse resp = getBad("/fullapi-swagge.yaml"); + getBad("/fullapi-swagge.yaml"); } protected ContentResponse get(final String path) throws InterruptedException, ExecutionException, TimeoutException { ContentResponse response = client.newRequest(resourceUrl + path).method(HttpMethod.GET).send(); - assertEquals(HTTP_200_OK, response.getStatus()); + assertEquals(HttpStatus.OK_200, response.getStatus()); return response; } protected ContentResponse getBad(final String path) throws InterruptedException, ExecutionException, TimeoutException { ContentResponse response = client.newRequest(resourceUrl + path).method(HttpMethod.GET).send(); - assertEquals(HTTP_404_NOTFOUND, response.getStatus()); + assertEquals(HttpStatus.NOT_FOUND_404, response.getStatus()); return response; } - - @Override - public String getServiceVersion() { - return versionString; - } - - @Override - public String getServiceName() { - return serviceName; - } - - @Override - protected String getDocUrl() { - return baseUrl + "/" + getServiceName() + "/doc/" + getServiceName() + "-swagger.yaml"; - } } \ No newline at end of file diff -r d28b7994e59e -r 8ecf97835acd tests/integration-tests/src/test/java/com/redhat/thermostat/gateway/tests/integration/ServiceIntegrationTest.java --- a/tests/integration-tests/src/test/java/com/redhat/thermostat/gateway/tests/integration/ServiceIntegrationTest.java Thu Oct 26 12:20:51 2017 +0200 +++ b/tests/integration-tests/src/test/java/com/redhat/thermostat/gateway/tests/integration/ServiceIntegrationTest.java Thu Oct 26 16:07:31 2017 +0200 @@ -41,21 +41,25 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeoutException; - import org.eclipse.jetty.client.api.ContentResponse; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.http.HttpStatus; import org.junit.Test; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + /** * Base class for integration tests with swagger API docs. * */ public abstract class ServiceIntegrationTest extends IntegrationTest { + private static final JsonParser jsonParser = new JsonParser(); + private static final String VERSION_ELEM = "version"; + public ServiceIntegrationTest(String serviceUrl) { super(serviceUrl); } @@ -65,24 +69,66 @@ public abstract String getServiceName(); @Test(timeout = 5000) - public void verifySwaggerYamlAccessible() throws ExecutionException, InterruptedException, TimeoutException { + public void verifySwaggerYamlAccessible() throws Exception { + TestCallback test = new TestCallback() { + @Override + public void performTest() throws Exception { + final String swaggerDocsUrl = getDocUrl(); + final Request request = client.newRequest(swaggerDocsUrl); + final ContentResponse response = request.method(HttpMethod.GET).send(); + assertEquals("Expected OK response (no auth should be required). URL was: " + swaggerDocsUrl, HttpStatus.OK_200, response.getStatus()); + final String actual = response.getContentAsString(); + assertNotNull(actual); + assertFalse(actual.isEmpty()); + assertTrue("service name expected to be part of swagger spec", actual.contains(getServiceName())); + assertTrue("service version expected to be part of swagger spec", actual.contains(getServiceVersion())); + } + }; + wrapUnauthenticated(test); + } + + @Test(timeout = 5000) + public void verifyVersionEndpoint() throws Exception { + final String serviceVersion = getServiceVersion(); + TestCallback test = new TestCallback() { + @Override + public void performTest() throws Exception { + final String versionUrl = getVersionUrl(); + final Request request = client.newRequest(versionUrl); + final ContentResponse response = request.method(HttpMethod.GET).send(); + assertEquals("Expected OK response (no auth should be required). URL was: " + versionUrl, HttpStatus.OK_200, response.getStatus()); + final String versionJson = response.getContentAsString(); + assertNotNull(versionJson); + assertEquals(serviceVersion, getVersionFromJson(versionJson)); + } + }; + wrapUnauthenticated(test); + } + + private void wrapUnauthenticated(TestCallback actualTest) throws Exception { try { removeAuthentication(client); // be sure to perform get with no authentication - final String swaggerDocsUrl = getDocUrl(); - final Request request = client.newRequest(swaggerDocsUrl); - final ContentResponse response = request.method(HttpMethod.GET).send(); - assertEquals("Expected OK response (no auth should be required). URL was: " + swaggerDocsUrl, HttpStatus.OK_200, response.getStatus()); - final String actual = response.getContentAsString(); - assertNotNull(actual); - assertFalse(actual.isEmpty()); - assertTrue("service name expected to be part of swagger spec", actual.contains(getServiceName())); - assertTrue("service version expected to be part of swagger spec", actual.contains(getServiceVersion())); + actualTest.performTest(); } finally { addAuthentication(client); } } + private String getVersionFromJson(String json) { + JsonObject versionObj = (JsonObject)jsonParser.parse(json); + JsonElement versionElem = versionObj.get(VERSION_ELEM); + return versionElem.getAsString(); + } + + protected String getVersionUrl() { + return baseUrl + "/" + getServiceName() + "/version"; + } + protected String getDocUrl() { return baseUrl + "/" + getServiceName() + "/" + getServiceVersion() + "/doc/" + getServiceName() + "-swagger.yaml"; } + + static interface TestCallback { + void performTest() throws Exception; + } }