From feef995c6f1db2a4c82f8c4dd04c4a540c51b8f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Weber?= Date: Wed, 29 May 2024 10:10:47 +0200 Subject: [PATCH 1/5] #49 Fixed bug in QueueBrowser by deleting it. Is deprecated since 2021 --- .../swisspush/gateleen/playground/Server.java | 10 +- .../gateleen/queue/queuing/QueueBrowser.java | 381 ------------------ .../gateleen/runconfig/RunConfig.java | 14 +- .../org/swisspush/gateleen/AbstractTest.java | 5 +- 4 files changed, 8 insertions(+), 402 deletions(-) delete mode 100644 gateleen-queue/src/main/java/org/swisspush/gateleen/queue/queuing/QueueBrowser.java diff --git a/gateleen-playground/src/main/java/org/swisspush/gateleen/playground/Server.java b/gateleen-playground/src/main/java/org/swisspush/gateleen/playground/Server.java index 612a0b0a..4958f46f 100755 --- a/gateleen-playground/src/main/java/org/swisspush/gateleen/playground/Server.java +++ b/gateleen-playground/src/main/java/org/swisspush/gateleen/playground/Server.java @@ -1,6 +1,9 @@ package org.swisspush.gateleen.playground; -import io.vertx.core.*; +import io.vertx.core.AbstractVerticle; +import io.vertx.core.Future; +import io.vertx.core.Handler; +import io.vertx.core.Vertx; import io.vertx.core.http.HttpClient; import io.vertx.core.http.HttpClientOptions; import io.vertx.core.http.HttpServer; @@ -55,7 +58,6 @@ import org.swisspush.gateleen.monitoring.MonitoringHandler; import org.swisspush.gateleen.monitoring.ResetMetricsController; import org.swisspush.gateleen.qos.QoSHandler; -import org.swisspush.gateleen.queue.queuing.QueueBrowser; import org.swisspush.gateleen.queue.queuing.QueueClient; import org.swisspush.gateleen.queue.queuing.QueueProcessor; import org.swisspush.gateleen.queue.queuing.circuitbreaker.QueueCircuitBreaker; @@ -332,8 +334,6 @@ public void start() { queueCircuitBreakerConfigurationResourceManager, requestHandler, circuitBreakerPort); new QueueProcessor(vertx, selfClient, monitoringHandler, queueCircuitBreaker); - final QueueBrowser queueBrowser = new QueueBrowser(vertx, SERVER_ROOT + "/queuing", Address.redisquesAddress(), - monitoringHandler); LogController logController = new LogController(); logController.registerLogConfiguratorMBean(JMX_DOMAIN); @@ -365,7 +365,7 @@ public void start() { .delegateHandler(delegateHandler) .customHttpResponseHandler(customHttpResponseHandler) .contentTypeConstraintHandler(contentTypeConstraintHandler) - .build(vertx, redisProvider, Server.class, router, monitoringHandler, queueBrowser); + .build(vertx, redisProvider, Server.class, router, monitoringHandler); Handler routingContextHandlerrNew = runConfig.buildRoutingContextHandler(); selfClient.setRoutingContexttHandler(routingContextHandlerrNew); diff --git a/gateleen-queue/src/main/java/org/swisspush/gateleen/queue/queuing/QueueBrowser.java b/gateleen-queue/src/main/java/org/swisspush/gateleen/queue/queuing/QueueBrowser.java deleted file mode 100644 index 3bc4ce1a..00000000 --- a/gateleen-queue/src/main/java/org/swisspush/gateleen/queue/queuing/QueueBrowser.java +++ /dev/null @@ -1,381 +0,0 @@ -package org.swisspush.gateleen.queue.queuing; - -import org.swisspush.gateleen.monitoring.MonitoringHandler; -import org.swisspush.gateleen.core.util.StatusCode; -import org.swisspush.gateleen.core.util.StringUtils; -import io.vertx.core.AsyncResult; -import io.vertx.ext.web.Router; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import io.vertx.core.Handler; -import io.vertx.core.MultiMap; -import io.vertx.core.Vertx; -import io.vertx.core.eventbus.EventBus; -import io.vertx.core.eventbus.Message; -import io.vertx.core.http.HttpServerRequest; -import io.vertx.core.http.HttpServerResponse; -import io.vertx.core.json.DecodeException; -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; - -import java.nio.charset.Charset; -import java.util.*; - -import static org.swisspush.redisques.util.RedisquesAPI.*; - -/** - * @author https://github.com/lbovet [Laurent Bovet] - * @deprecated Use http api from vertx-redisques (version greater than v2.2.4) directly. See https://github.com/swisspush/vertx-redisques - */ -public class QueueBrowser implements Handler { - - public static final String APPLICATION_JSON = "application/json"; - public static final String CONTENT_TYPE = "content-type"; - public static final String UTF_8 = "UTF-8"; - public static final String PAYLOAD = "payload"; - private static Logger log = LoggerFactory.getLogger(QueueBrowser.class); - private static final int DEFAULT_QUEUE_NUM = 1000; - private static final int DEFAULT_MAX_QUEUEITEM_COUNT = 49; - private static final String SHOW_EMPTY_QUEUES_PARAM = "showEmptyQueues"; - private EventBus eb; - private final String redisquesAddress; - - private Router router; - - public QueueBrowser(Vertx vertx, String prefix, final String redisquesAddress, final MonitoringHandler monitoringHandler) { - this.router = Router.router(vertx); - this.redisquesAddress = redisquesAddress; - eb = vertx.eventBus(); - - // List queuing features - router.get(prefix + "/").handler(ctx -> { - JsonObject result = new JsonObject(); - JsonArray items = new JsonArray(); - items.add("locks/"); - items.add("monitoring"); - items.add("queues/"); - result.put(lastPart(ctx.request().path(), "/"), items); - ctx.response().putHeader(CONTENT_TYPE, APPLICATION_JSON); - ctx.response().end(result.encode()); - }); - - // List queues - router.get(prefix + "/queues/").handler(ctx -> monitoringHandler.updateQueuesSizesInformation(DEFAULT_QUEUE_NUM, false, new MonitoringHandler.MonitoringCallback() { - @Override - public void onDone(JsonObject result) { - JsonArray array = result.getJsonArray("queues"); - JsonArray resultArray = new JsonArray(); - for (int i = 0; i < array.size(); i++) { - JsonObject arrayEntry = array.getJsonObject(i); - resultArray.add(arrayEntry.getString("name")); - } - result.put(lastPart(ctx.request().path(), "/"), resultArray); - jsonResponse(ctx.response(), result); - } - - @Override - public void onFail(String errorMessage, int statusCode) { - ctx.response().setStatusCode(statusCode); - ctx.response().setStatusMessage(errorMessage); - ctx.response().end(); - } - })); - - // List queue items - router.getWithRegex(prefix + "/queues/[^/]+").handler(ctx -> { - final String queue = lastPart(ctx.request().path(), "/"); - String limitParam = null; - if (ctx.request() != null && ctx.request().params().contains("limit")) { - limitParam = ctx.request().params().get("limit"); - } - eb.request(redisquesAddress, buildGetQueueItemsOperation(queue, limitParam), (Handler>>) reply -> { - JsonObject replyBody = reply.result().body(); - if (OK.equals(replyBody.getString(STATUS))) { - List list = reply.result().body().getJsonArray(VALUE).getList(); - JsonArray items = new JsonArray(); - for (Object item : list.toArray()) { - items.add((String) item); - } - JsonObject result = new JsonObject().put(queue, items); - jsonResponse(ctx.response(), result); - } else { - ctx.response().setStatusCode(StatusCode.NOT_FOUND.getStatusCode()); - ctx.response().end(reply.result().body().getString("message")); - log.warn("Error in routerMatcher.getWithRegEx. Command = '" + (replyBody.getString("command") == null ? "" : replyBody.getString("command")) + "'."); - } - }); - }); - - // Delete all queue items - router.deleteWithRegex(prefix + "/queues/[^/]+").handler(ctx -> { - final String queue = lastPart(ctx.request().path(), "/"); - eb.request(redisquesAddress, buildDeleteAllQueueItemsOperation(queue), reply -> ctx.response().end()); - }); - - // Get item - router.getWithRegex(prefix + "/queues/([^/]+)/[0-9]+").handler(ctx -> { - final String queue = lastPart(ctx.request().path().substring(0, ctx.request().path().length() - 2), "/"); - final int index = Integer.parseInt(lastPart(ctx.request().path(), "/")); - eb.request(redisquesAddress, buildGetQueueItemOperation(queue, index), (Handler>>) reply -> { - JsonObject replyBody = reply.result().body(); - if (OK.equals(replyBody.getString(STATUS))) { - ctx.response().putHeader(CONTENT_TYPE, APPLICATION_JSON); - ctx.response().end(decode(reply.result().body().getString(VALUE))); - } else { - ctx.response().setStatusCode(StatusCode.NOT_FOUND.getStatusCode()); - ctx.response().setStatusMessage(StatusCode.NOT_FOUND.getStatusMessage()); - ctx.response().end("Not Found"); - } - }); - }); - - // Replace item - router.putWithRegex(prefix + "/queues/([^/]+)/[0-9]+").handler(ctx -> { - final String queue = part(ctx.request().path(), "/", 2); - checkLocked(queue, ctx.request(), aVoid -> { - final int index = Integer.parseInt(lastPart(ctx.request().path(), "/")); - ctx.request().bodyHandler(buffer -> { - String strBuffer = encode(buffer.toString()); - eb.request(redisquesAddress, buildReplaceQueueItemOperation(queue, index, strBuffer), - (Handler>>) reply -> checkReply(reply.result(), ctx.request(), StatusCode.NOT_FOUND)); - }); - }); - }); - - // Delete item - router.deleteWithRegex(prefix + "/queues/([^/]+)/[0-9]+").handler(ctx -> { - final String queue = part(ctx.request().path(), "/", 2); - final int index = Integer.parseInt(lastPart(ctx.request().path(), "/")); - checkLocked(queue, ctx.request(), aVoid -> eb.request(redisquesAddress, buildDeleteQueueItemOperation(queue, index), - (Handler>>) reply -> checkReply(reply.result(), ctx.request(), StatusCode.NOT_FOUND))); - }); - - // Add item - router.postWithRegex(prefix + "/queues/([^/]+)/").handler(ctx -> { - final String queue = part(ctx.request().path(), "/", 1); - ctx.request().bodyHandler(buffer -> { - String strBuffer = encode(buffer.toString()); - eb.request(redisquesAddress, buildAddQueueItemOperation(queue, strBuffer), - (Handler>>) reply -> checkReply(reply.result(), ctx.request(), StatusCode.BAD_REQUEST)); - }); - }); - - // get all locks - router.getWithRegex(prefix + "/locks/").handler(ctx -> eb.request(redisquesAddress, buildGetAllLocksOperation(), - (Handler>>) reply -> { - if (OK.equals(reply.result().body().getString(STATUS))) { - jsonResponse(ctx.response(), reply.result().body().getJsonObject(VALUE)); - } else { - ctx.response().setStatusCode(StatusCode.NOT_FOUND.getStatusCode()); - ctx.response().setStatusMessage(StatusCode.NOT_FOUND.getStatusMessage()); - ctx.response().end("Not Found"); - } - })); - - // add lock - router.putWithRegex(prefix + "/locks/[^/]+").handler(ctx -> { - String queue = lastPart(ctx.request().path(), "/"); - eb.request(redisquesAddress, buildPutLockOperation(queue, extractUser(ctx.request())), - (Handler>>) reply -> checkReply(reply.result(), ctx.request(), StatusCode.BAD_REQUEST)); - }); - - // get single lock - router.getWithRegex(prefix + "/locks/[^/]+").handler(ctx -> { - String queue = lastPart(ctx.request().path(), "/"); - eb.request(redisquesAddress, buildGetLockOperation(queue), (Handler>>) reply -> { - if (OK.equals(reply.result().body().getString(STATUS))) { - ctx.response().putHeader(CONTENT_TYPE, APPLICATION_JSON); - ctx.response().end(reply.result().body().getString(VALUE)); - } else { - ctx.response().setStatusCode(StatusCode.NOT_FOUND.getStatusCode()); - ctx.response().setStatusMessage(StatusCode.NOT_FOUND.getStatusMessage()); - ctx.response().end(NO_SUCH_LOCK); - } - }); - }); - - // delete single lock - router.deleteWithRegex(prefix + "/locks/[^/]+").handler(ctx -> { - String queue = lastPart(ctx.request().path(), "/"); - eb.request(redisquesAddress, buildDeleteLockOperation(queue), - (Handler>>) reply -> checkReply(reply.result(), ctx.request(), StatusCode.BAD_REQUEST)); - }); - - // Gathering queues monitoring informations - router.getWithRegex(prefix + "/monitoring/[^/]*").handler(ctx -> { - int numQueues = extractNumOfQueuesValue(ctx.request().path(), "/"); - boolean showEmptyQueues = showEmptyQueues(ctx.request().params()); - monitoringHandler.updateQueuesSizesInformation(numQueues, showEmptyQueues, new MonitoringHandler.MonitoringCallback() { - @Override - public void onDone(JsonObject result) { - jsonResponse(ctx.response(), result); - } - - @Override - public void onFail(String errorMessage, int statusCode) { - ctx.response().setStatusCode(statusCode); - ctx.response().setStatusMessage(errorMessage); - ctx.response().end(); - } - }); - }); - } - - private String extractUser(HttpServerRequest request) { - String user = request.headers().get("x-rp-usr"); - if (user == null) { - user = "Unknown"; - } - return user; - } - - private void checkReply(Message reply, HttpServerRequest request, StatusCode statusCode) { - if (OK.equals(reply.body().getString(STATUS))) { - request.response().end(); - } else { - request.response().setStatusCode(statusCode.getStatusCode()); - request.response().setStatusMessage(statusCode.getStatusMessage()); - request.response().end(statusCode.getStatusMessage()); - } - } - - private String lastPart(String source, String separator) { - String[] tokens = source.split(separator); - return tokens[tokens.length - 1]; - } - - private String part(String source, String separator, int pos) { - String[] tokens = source.split(separator); - return tokens[tokens.length - pos]; - } - - private boolean showEmptyQueues(MultiMap requestParams) { - String showEmptyQueues = StringUtils.getStringOrEmpty(requestParams.get(SHOW_EMPTY_QUEUES_PARAM)); - return showEmptyQueues.equalsIgnoreCase("true") || showEmptyQueues.equals("1"); - } - - private int getMaxQueueItemCountIndex(HttpServerRequest request) { - int defaultMaxIndex = DEFAULT_MAX_QUEUEITEM_COUNT; - if (request != null && request.params().contains("limit")) { - String limitParam = request.params().get("limit"); - try { - int maxIndex = Integer.parseInt(limitParam) - 1; - if (maxIndex >= 0) { - defaultMaxIndex = maxIndex; - } - } catch (NumberFormatException ex) { - log.warn("Invalid limit parameter '{}' configured for max queue item count. Using default {}", limitParam, DEFAULT_MAX_QUEUEITEM_COUNT); - } - } - return defaultMaxIndex; - } - - private int extractNumOfQueuesValue(String source, String separator) { - String numberOfQueuesStr = lastPart(source, separator); - Integer numQueues; - try { - numQueues = Integer.parseInt(numberOfQueuesStr); - } catch (Exception e) { - numQueues = DEFAULT_QUEUE_NUM; - log.warn("Queue size monitoring url was used with wrong or without number of queues param. Using default {}", DEFAULT_QUEUE_NUM); - } - - return numQueues; - } - - public void handle(HttpServerRequest request) { - router.handle(request); - } - - /** - * Encode the payload from a payloadString or payloadObjet. - * - * @param decoded decoded - * @return String - */ - public String encode(String decoded) { - JsonObject object = new JsonObject(decoded); - - String payloadString; - JsonObject payloadObject = object.getJsonObject("payloadObject"); - if (payloadObject != null) { - payloadString = payloadObject.encode(); - } else { - payloadString = object.getString("payloadString"); - } - - if (payloadString != null) { - object.put(PAYLOAD, payloadString.getBytes(Charset.forName(UTF_8))); - object.remove("payloadString"); - object.remove("payloadObject"); - } - - // update the content-length - int length = 0; - if (object.containsKey(PAYLOAD)) { - length = object.getBinary(PAYLOAD).length; - } - JsonArray newHeaders = new JsonArray(); - for (Object headerObj : object.getJsonArray("headers")) { - JsonArray header = (JsonArray) headerObj; - String key = header.getString(0); - if (key.equalsIgnoreCase("content-length")) { - JsonArray contentLengthHeader = new JsonArray(); - contentLengthHeader.add("Content-Length"); - contentLengthHeader.add(Integer.toString(length)); - newHeaders.add(contentLengthHeader); - } else { - newHeaders.add(header); - } - } - object.put("headers", newHeaders); - - return object.toString(); - } - - /** - * Decode the payload if the content-type is text or json. - * - * @param encoded encoded - * @return String - */ - public String decode(String encoded) { - JsonObject object = new JsonObject(encoded); - JsonArray headers = object.getJsonArray("headers"); - for (Object headerObj : headers) { - JsonArray header = (JsonArray) headerObj; - String key = header.getString(0); - String value = header.getString(1); - if (key.equalsIgnoreCase(CONTENT_TYPE) && (value.contains("text/") || value.contains(APPLICATION_JSON))) { - try { - object.put("payloadObject", new JsonObject(new String(object.getBinary(PAYLOAD), Charset.forName(UTF_8)))); - } catch (DecodeException e) { - object.put("payloadString", new String(object.getBinary(PAYLOAD), Charset.forName(UTF_8))); - } - object.remove(PAYLOAD); - break; - } - } - return object.toString(); - } - - private void checkLocked(String queue, final HttpServerRequest request, final Handler handler) { - request.pause(); - eb.request(redisquesAddress, buildGetLockOperation(queue), (Handler>>) reply -> { - if (NO_SUCH_LOCK.equals(reply.result().body().getString(STATUS))) { - request.resume(); - request.response().setStatusCode(StatusCode.CONFLICT.getStatusCode()); - request.response().setStatusMessage("Queue must be locked to perform this operation"); - request.response().end("Queue must be locked to perform this operation"); - } else { - handler.handle(null); - request.resume(); - } - }); - } - - private void jsonResponse(HttpServerResponse response, JsonObject object) { - response.putHeader(CONTENT_TYPE, APPLICATION_JSON); - response.end(object.encode()); - } -} diff --git a/gateleen-runconfig/src/main/java/org/swisspush/gateleen/runconfig/RunConfig.java b/gateleen-runconfig/src/main/java/org/swisspush/gateleen/runconfig/RunConfig.java index 2d904301..a6f9f273 100755 --- a/gateleen-runconfig/src/main/java/org/swisspush/gateleen/runconfig/RunConfig.java +++ b/gateleen-runconfig/src/main/java/org/swisspush/gateleen/runconfig/RunConfig.java @@ -35,7 +35,6 @@ import org.swisspush.gateleen.monitoring.MonitoringHandler; import org.swisspush.gateleen.packing.PackingHandler; import org.swisspush.gateleen.qos.QoSHandler; -import org.swisspush.gateleen.queue.queuing.QueueBrowser; import org.swisspush.gateleen.queue.queuing.QueuingHandler; import org.swisspush.gateleen.queue.queuing.circuitbreaker.configuration.QueueCircuitBreakerConfigurationResourceManager; import org.swisspush.gateleen.queue.queuing.splitter.QueueSplitter; @@ -101,7 +100,6 @@ public class RunConfig { private final ExpansionHandler expansionHandler; private final DeltaHandler deltaHandler; private final MonitoringHandler monitoringHandler; - private final QueueBrowser queueBrowser; private final Authorizer authorizer; private final CopyResourceHandler copyResourceHandler; private final QoSHandler qosHandler; @@ -113,7 +111,7 @@ public class RunConfig { private final CustomHttpResponseHandler customHttpResponseHandler; public RunConfig(Vertx vertx, RedisProvider redisProvider, Class verticleClass, Router router, MonitoringHandler monitoringHandler, - QueueBrowser queueBrowser, CORSHandler corsHandler, SchedulerResourceManager schedulerResourceManager, + CORSHandler corsHandler, SchedulerResourceManager schedulerResourceManager, ValidationResourceManager validationResourceManager, LoggingResourceManager loggingResourceManager, ConfigurationResourceManager configurationResourceManager, QueueCircuitBreakerConfigurationResourceManager queueCircuitBreakerConfigurationResourceManager, @@ -129,7 +127,6 @@ public RunConfig(Vertx vertx, RedisProvider redisProvider, Class verticleClass, this.verticleClass = verticleClass; this.router = router; this.monitoringHandler = monitoringHandler; - this.queueBrowser = queueBrowser; this.corsHandler = corsHandler; this.schedulerResourceManager = schedulerResourceManager; this.validationResourceManager = validationResourceManager; @@ -164,7 +161,6 @@ private RunConfig(RunConfigBuilder builder) { builder.verticleClass, builder.router, builder.monitoringHandler, - builder.queueBrowser, builder.corsHandler, builder.schedulerResourceManager, builder.validationResourceManager, @@ -222,7 +218,6 @@ public static class RunConfigBuilder { private Class verticleClass; private Router router; private MonitoringHandler monitoringHandler; - private QueueBrowser queueBrowser; private CORSHandler corsHandler; private SchedulerResourceManager schedulerResourceManager; private ValidationResourceManager validationResourceManager; @@ -377,13 +372,12 @@ public RunConfigBuilder cacheHandler(CacheHandler cacheHandler) { return this; } - public RunConfig build(Vertx vertx, RedisProvider redisProvider, Class verticleClass, Router router, MonitoringHandler monitoringHandler, QueueBrowser queueBrowser) { + public RunConfig build(Vertx vertx, RedisProvider redisProvider, Class verticleClass, Router router, MonitoringHandler monitoringHandler) { this.vertx = vertx; this.redisProvider = redisProvider; this.verticleClass = verticleClass; this.router = router; this.monitoringHandler = monitoringHandler; - this.queueBrowser = queueBrowser; return new RunConfig(this); } } @@ -633,10 +627,6 @@ private void handleRequest(final RoutingContext ctx) { if (copyResourceHandler != null && copyResourceHandler.handle(request)) { return; } - if (request.path().startsWith(SERVER_ROOT + "/queuing/")) { - queueBrowser.handle(request); - return; - } if (hookHandler != null && hookHandler.handle(ctx)) { return; } diff --git a/gateleen-test/src/test/java/org/swisspush/gateleen/AbstractTest.java b/gateleen-test/src/test/java/org/swisspush/gateleen/AbstractTest.java index b02253c5..3d9f7d1a 100755 --- a/gateleen-test/src/test/java/org/swisspush/gateleen/AbstractTest.java +++ b/gateleen-test/src/test/java/org/swisspush/gateleen/AbstractTest.java @@ -57,7 +57,6 @@ import org.swisspush.gateleen.monitoring.MonitoringHandler; import org.swisspush.gateleen.monitoring.ResetMetricsController; import org.swisspush.gateleen.qos.QoSHandler; -import org.swisspush.gateleen.queue.queuing.QueueBrowser; import org.swisspush.gateleen.queue.queuing.QueueClient; import org.swisspush.gateleen.queue.queuing.QueueProcessor; import org.swisspush.gateleen.queue.queuing.circuitbreaker.QueueCircuitBreaker; @@ -219,8 +218,6 @@ public static void setupBeforeClass(TestContext context) { CIRCUIT_BREAKER_REST_API_PORT); new QueueProcessor(vertx, selfClient, monitoringHandler, queueCircuitBreaker); - final QueueBrowser queueBrowser = new QueueBrowser(vertx, SERVER_ROOT + "/queuing", - Address.redisquesAddress(), monitoringHandler); new CustomRedisMonitor(vertx, redisProvider, "main", "rest-storage", 10).start(); Router router = Router.builder() @@ -266,7 +263,7 @@ public static void setupBeforeClass(TestContext context) { .delegateHandler(delegateHandler) .mergeHandler(mergeHandler) .customHttpResponseHandler(customHttpResponseHandler) - .build(vertx, redisProvider, AbstractTest.class, router, monitoringHandler, queueBrowser); + .build(vertx, redisProvider, AbstractTest.class, router, monitoringHandler); Handler routingContextHandlerrNew = runConfig.buildRoutingContextHandler(); selfClient.setRoutingContexttHandler(routingContextHandlerrNew); mainServer = vertx.createHttpServer(); From 2b376626f6f282fa0ad1a37acb9170e53685e63f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Weber?= Date: Wed, 5 Jun 2024 10:21:44 +0200 Subject: [PATCH 2/5] #49 Fixed bug in QueueBrowser by deleting it. Is deprecated since 2021 --- .../org/swisspush/gateleen/AbstractTest.java | 1 + .../java/org/swisspush/gateleen/TestUtils.java | 17 +++++++++++++++++ .../swisspush/gateleen/hook/ListenerTest.java | 1 + .../org/swisspush/gateleen/queue/QueueTest.java | 1 + 4 files changed, 20 insertions(+) diff --git a/gateleen-test/src/test/java/org/swisspush/gateleen/AbstractTest.java b/gateleen-test/src/test/java/org/swisspush/gateleen/AbstractTest.java index 3d9f7d1a..c12381d8 100755 --- a/gateleen-test/src/test/java/org/swisspush/gateleen/AbstractTest.java +++ b/gateleen-test/src/test/java/org/swisspush/gateleen/AbstractTest.java @@ -104,6 +104,7 @@ public abstract class AbstractTest { protected static final int REDIS_PORT = 6379; protected static final int STORAGE_PORT = 8989; private static final int CIRCUIT_BREAKER_REST_API_PORT = 7014; + protected static final int REDISQUES_API_PORT = 7015; /** * Basis configuration for RestAssured diff --git a/gateleen-test/src/test/java/org/swisspush/gateleen/TestUtils.java b/gateleen-test/src/test/java/org/swisspush/gateleen/TestUtils.java index 0100ae71..2be56b88 100644 --- a/gateleen-test/src/test/java/org/swisspush/gateleen/TestUtils.java +++ b/gateleen-test/src/test/java/org/swisspush/gateleen/TestUtils.java @@ -114,6 +114,23 @@ public static void waitSomeTime(int seconds) { } } + /** + * Adds the routing rule for queuing to the given routing rules. + * + * @param rules current rules. + */ + public static JsonObject addRoutingRuleQueuing(JsonObject rules) { + + JsonObject queuing = createRoutingRule(ImmutableMap.of( + "description", + "vertx-redisques API", + "url", + "http://localhost:" + AbstractTest.REDISQUES_API_PORT + "/queuing/$1")); + + rules = addRoutingRule(rules, AbstractTest.SERVER_ROOT + "/queuing/(.*)", queuing); + return rules; + } + /** * Adds the routing rule for cleanup to the given routing rules. * diff --git a/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java b/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java index 2ef58ec1..27b9725d 100755 --- a/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java +++ b/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java @@ -63,6 +63,7 @@ private void initRoutingRules() { // add a routing JsonObject rules = new JsonObject(); rules = TestUtils.addRoutingRuleMainStorage(rules); + rules = TestUtils.addRoutingRuleQueuing(rules); rules = TestUtils.addRoutingRuleHooks(rules); TestUtils.putRoutingRules(rules); } diff --git a/gateleen-test/src/test/java/org/swisspush/gateleen/queue/QueueTest.java b/gateleen-test/src/test/java/org/swisspush/gateleen/queue/QueueTest.java index de9f8007..6113621b 100644 --- a/gateleen-test/src/test/java/org/swisspush/gateleen/queue/QueueTest.java +++ b/gateleen-test/src/test/java/org/swisspush/gateleen/queue/QueueTest.java @@ -30,6 +30,7 @@ public void init() { // add a routing JsonObject rules = new JsonObject(); rules = TestUtils.addRoutingRuleMainStorage(rules); + rules = TestUtils.addRoutingRuleQueuing(rules); rules = TestUtils.addRoutingRuleCleanup(rules); TestUtils.putRoutingRules(rules); } From 108ccce606fb8c79af900770b3641dd2b2f9a86d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Weber?= Date: Wed, 5 Jun 2024 10:58:23 +0200 Subject: [PATCH 3/5] #49 Fixed some unit tests --- .../queue/expiry/ResourceQueueExpiryTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/gateleen-test/src/test/java/org/swisspush/gateleen/queue/expiry/ResourceQueueExpiryTest.java b/gateleen-test/src/test/java/org/swisspush/gateleen/queue/expiry/ResourceQueueExpiryTest.java index 06f3c173..37d60538 100644 --- a/gateleen-test/src/test/java/org/swisspush/gateleen/queue/expiry/ResourceQueueExpiryTest.java +++ b/gateleen-test/src/test/java/org/swisspush/gateleen/queue/expiry/ResourceQueueExpiryTest.java @@ -1,6 +1,7 @@ package org.swisspush.gateleen.queue.expiry; import io.restassured.RestAssured; +import io.vertx.core.json.JsonObject; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.VertxUnitRunner; @@ -36,6 +37,14 @@ public void initRestAssured() { RestAssured.requestSpecification.basePath(SERVER_ROOT + "/"); } + private void initRoutingRules() { + // add a routing + JsonObject rules = new JsonObject(); + rules = TestUtils.addRoutingRuleMainStorage(rules); + rules = TestUtils.addRoutingRuleQueuing(rules); + TestUtils.putRoutingRules(rules); + } + /** * Checks if the GET request of the * given resource returns the wished body. @@ -55,6 +64,7 @@ private void checkGETBodyWithAwait(final String requestUrl, final String body) { public void testQueueExpiry(TestContext context) { Async async = context.async(); delete(); + initRoutingRules(); System.out.println("testQueueExpiry"); @@ -165,6 +175,7 @@ public void testQueueExpiry(TestContext context) { public void testQueueExpiryOverride_requestIsExpired_beforeRegularExpiryTime(TestContext context) { Async async = context.async(); delete(); + initRoutingRules(); System.out.println("testQueueExpiry"); @@ -213,6 +224,7 @@ public void testQueueExpiryOverride_requestIsExpired_beforeRegularExpiryTime(Tes public void testQueueExpiryOverride_requestIsNotExpired_regularResourceExpiry(TestContext context) { Async async = context.async(); delete(); + initRoutingRules(); System.out.println("testQueueExpiry"); From b35a9b788825ba5978b00ae2c088d9f4eec31c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Weber?= Date: Wed, 5 Jun 2024 11:12:17 +0200 Subject: [PATCH 4/5] #49 Fixed some unit tests (temporary) --- .../src/test/java/org/swisspush/gateleen/hook/ListenerTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java b/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java index 27b9725d..b761c0fd 100755 --- a/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java +++ b/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java @@ -11,6 +11,7 @@ import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.VertxUnitRunner; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -661,6 +662,7 @@ public void testDeadLock(TestContext context) { } @Test + @Ignore public void testHookQueueExpiryOverride(TestContext context) { // Prepare Environment // ---- From cdceaa024620fa07b23a0249b352e1317b6274e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Weber?= Date: Wed, 5 Jun 2024 11:25:48 +0200 Subject: [PATCH 5/5] #49 Fixed some unit tests --- .../org/swisspush/gateleen/TestUtils.java | 24 ++++++++++++++++--- .../swisspush/gateleen/hook/ListenerTest.java | 6 ++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/gateleen-test/src/test/java/org/swisspush/gateleen/TestUtils.java b/gateleen-test/src/test/java/org/swisspush/gateleen/TestUtils.java index 2be56b88..b2fef8f7 100644 --- a/gateleen-test/src/test/java/org/swisspush/gateleen/TestUtils.java +++ b/gateleen-test/src/test/java/org/swisspush/gateleen/TestUtils.java @@ -8,10 +8,8 @@ import org.swisspush.gateleen.hook.HookHandler; import org.swisspush.gateleen.hook.HookTriggerType; -import java.util.Arrays; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; import java.util.regex.Pattern; import static org.awaitility.Awaitility.await; @@ -365,9 +363,29 @@ public static void registerListener(final String requestUrl, final String target public static void registerListener(final String requestUrl, final String target, String[] methods, String filter, Integer queueExpireTime, Map staticHeaders, HookTriggerType type, String headersFilter) { + registerListener(requestUrl, target, methods, filter, queueExpireTime, staticHeaders, type, headersFilter, null); + } + + /** + * Registers a listener with a filter, static headers, a queue header and a event trigger. + * + * @param requestUrl + * @param target + * @param methods + * @param filter + * @param queueExpireTime + * @param staticHeaders + * @param queueHeader + */ + public static void registerListener(final String requestUrl, final String target, String[] methods, String filter, + Integer queueExpireTime, Map staticHeaders, HookTriggerType type, + String headersFilter, String queueHeader) { JsonObject route = new JsonObject(); route.put("destination", target); + if(queueHeader != null) { + route.put("headers", new JsonArray(List.of(new JsonObject().put("header", "x-queue").put("value", queueHeader)))); + } if(methods != null){ route.put("methods", new JsonArray(Arrays.asList(methods))); } diff --git a/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java b/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java index b761c0fd..4a858aab 100755 --- a/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java +++ b/gateleen-test/src/test/java/org/swisspush/gateleen/hook/ListenerTest.java @@ -662,7 +662,6 @@ public void testDeadLock(TestContext context) { } @Test - @Ignore public void testHookQueueExpiryOverride(TestContext context) { // Prepare Environment // ---- @@ -681,7 +680,7 @@ public void testHookQueueExpiryOverride(TestContext context) { String requestUrl = sourceUrl + TestUtils.getHookListenersUrlSuffix() + "testservice" + "/" + 1; String targetUrl = targetUrlBase + "/result"; - String queueName = HookHandler.LISTENER_QUEUE_PREFIX + "-" + hookHandler.getUniqueListenerId(SERVER_ROOT + requestUrl); + String queueName = "hook-queue-expiry-test"; String putRequest = sourceUrl + "/test1"; String putTarget = targetUrl + "/test1"; @@ -692,7 +691,8 @@ public void testHookQueueExpiryOverride(TestContext context) { // ---- // register Listener - TestUtils.registerListener(requestUrl, targetUrl, null, null, 5); + TestUtils.registerListener(requestUrl, targetUrl, null, null, 5, + null, null, null, queueName); // lock queue String lockRequestUrl = "queuing/locks/" + queueName;