This is an automated email from the ASF dual-hosted git repository.

jbertram pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new 648faf58cc ARTEMIS-4169 Auto detect dead-letter and expiry queues in 
the console
648faf58cc is described below

commit 648faf58cceef753322c1c85dac50eddc57ff455
Author: Domenico Francesco Bruscino <[email protected]>
AuthorDate: Wed Feb 15 13:20:27 2023 +0100

    ARTEMIS-4169 Auto detect dead-letter and expiry queues in the console
---
 .../src/main/webapp/plugin/js/components/browse.js | 82 ++++++++--------------
 .../src/main/webapp/plugin/js/services/toolbar.js  | 10 ---
 .../artemis/tests/smoke/console/QueuesTest.java    | 66 ++++++++++++-----
 .../tests/smoke/console/pages/ArtemisPage.java     | 21 ++++++
 .../tests/smoke/console/pages/ConsolePage.java     | 11 +++
 .../tests/smoke/console/pages/QueuePage.java       |  2 +-
 .../tests/smoke/console/pages/SendMessagePage.java |  2 +
 7 files changed, 113 insertions(+), 81 deletions(-)

diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/browse.js 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/browse.js
index 4986a9f1bc..c876f0aa93 100644
--- 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/browse.js
+++ 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/components/browse.js
@@ -209,26 +209,27 @@ var Artemis;
         ctrl.allMessages = [];
         ctrl.messages = [];
 
-        var objName;
+        ctrl.objName = '';
         if (workspace.selection) {
-            objName = workspace.selection.objectName;
+            ctrl.objName = workspace.selection.objectName;
         } else {
         // in case of refresh
             var key = location.search()['nid'];
             var node = workspace.keyToNodeMap[key];
-            objName = node.objectName;
+            ctrl.objName = node.objectName;
         }
-        var artemisDLQ = localStorage['artemisDLQ'] || "^DLQ$";
-        var artemisExpiryQueue = localStorage['artemisExpiryQueue'] || 
"^ExpiryQueue$";
-        Artemis.log.debug("loading table" + artemisExpiryQueue);
-        if (objName) {
-            ctrl.dlq = false;
-            var addressName = jolokia.getAttribute(objName, "Address");
-            if (addressName.match(artemisDLQ) != null || 
addressName.match(artemisExpiryQueue) != null) {
-                ctrl.dlq = true;
-            }
+        if (ctrl.objName) {
+            ctrl.addressName = jolokia.getAttribute(ctrl.objName, "Address");
+            Artemis.log.debug("addressName: " + ctrl.addressName);
         }
 
+        ctrl.artemisDLQ = localStorage['artemisDLQ'] || "^DLQ$";
+        Artemis.log.debug("artemisDLQ: " + ctrl.artemisDLQ);
+        ctrl.artemisExpiryQueue = localStorage['artemisExpiryQueue'] || 
"^ExpiryQueue$";
+        Artemis.log.debug("artemisExpiryQueue: " + ctrl.artemisExpiryQueue);
+
+        ctrl.originalQueueColumn = { name: "Original Queue", visible: false };
+
         ctrl.dtOptions = {
            // turn of ordering as we do it ourselves
            ordering: false,
@@ -244,7 +245,8 @@ var Artemis;
                 {name: "Large", visible: true},
                 {name: "Persistent Size", visible: true},
                 {name: "User ID", visible: true},
-                {name: "Validated User", visible: false}
+                {name: "Validated User", visible: false},
+                ctrl.originalQueueColumn
            ]
         };
 
@@ -331,23 +333,17 @@ var Artemis;
                     if (!value) return undefined;
                     return value._AMQ_VALIDATED_USER;
                 }
-            }
-
-        ];
-
-        if (ctrl.dlq) {
-            origQueue = {
+            },
+            {
                 itemField: 'StringProperties',
                 header: 'Original Queue',
                 templateFn: function(value) {
                     if (!value) return undefined;
                     return (value['_AMQ_ORIG_QUEUE'] ? 
value['_AMQ_ORIG_QUEUE'] : value['extraProperties._AMQ_ORIG_QUEUE']);
                 }
-            };
-            ctrl.tableColumns.push(origQueue);
+            }
 
-            ctrl.dtOptions.columns.push({name: "Original Queue", visible: 
true});
-        }
+        ];
 
         var resendConfig = {
             name: 'Resend',
@@ -684,7 +680,12 @@ var Artemis;
                 ctrl.allMessages = data;
             }
             idx = 0;
+
+            ctrl.dlq = ctrl.addressName.match(ctrl.artemisDLQ) != null ||
+                ctrl.addressName.match(ctrl.artemisExpiryQueue) != null;
+
             angular.forEach(ctrl.allMessages, function(message) {
+                ctrl.dlq = ctrl.dlq || (message['StringProperties'] ? 
(message['StringProperties']['_AMQ_ORIG_QUEUE'] ? true : 
(message['StringProperties']['extraProperties._AMQ_ORIG_QUEUE'] ? true : 
false)) : false);
                 message.bodyText = createBodyText(message);
                 if (idx == 0 && !ctrl.loadPrevousPage) {
                 //always load n the first message for paination when viewing 
message details
@@ -701,6 +702,7 @@ var Artemis;
                 message.idx = idx;
                 idx++;
             });
+            ctrl.originalQueueColumn.visible = ctrl.dlq;
             ctrl.messages = ctrl.allMessages;
             ctrl.isLoading = false;
             Core.$apply($scope);
@@ -886,44 +888,20 @@ var Artemis;
 
         ctrl.loadTable = function() {
             Artemis.log.debug("loading table")
+            ctrl.dlq = false;
             ctrl.isLoading = true;
-            var objName;
-            if (workspace.selection) {
-                objName = workspace.selection.objectName;
-            } else {
-                // in case of refresh
-                var key = location.search()['nid'];
-                var node = workspace.keyToNodeMap[key];
-                objName = node.objectName;
-            }
-            if (objName) {
-                ctrl.dlq = false;
-                var addressName = jolokia.getAttribute(objName, "Address");
-                var artemisDLQ = localStorage['artemisDLQ'] || "^DLQ$";
-                var artemisExpiryQueue = localStorage['artemisExpiryQueue'] || 
"^ExpiryQueue$";
-                Artemis.log.debug("loading table" + artemisExpiryQueue);
-                if (addressName.match(artemisDLQ) != null || 
addressName.match(artemisExpiryQueue) != null) {
-                    onDlq(true);
-                } else {
-                    onDlq(false);
-                }
+            if (ctrl.objName) {
                 //make sure to count only filtered messages
                 if (ctrl.filter) {
-                    jolokia.request({ type: 'exec', mbean: objName, operation: 
'countMessages(java.lang.String)', arguments: [ctrl.filter] }, 
Core.onSuccess(function(response) { ctrl.pagination.page(response.value); }));
+                    jolokia.request({ type: 'exec', mbean: ctrl.objName, 
operation: 'countMessages(java.lang.String)', arguments: [ctrl.filter] }, 
Core.onSuccess(function(response) { ctrl.pagination.page(response.value); }));
                 } else {
-                    jolokia.request({ type: 'exec', mbean: objName, operation: 
'countMessages()'}, Core.onSuccess(function(response) { 
ctrl.pagination.page(response.value); }));
+                    jolokia.request({ type: 'exec', mbean: ctrl.objName, 
operation: 'countMessages()'}, Core.onSuccess(function(response) { 
ctrl.pagination.page(response.value); }));
                 }
 
-                jolokia.request({ type: 'exec', mbean: objName, operation: 
'browse(int, int, java.lang.String)', arguments: [ctrl.pagination.pageNumber, 
ctrl.pagination.pageSize, ctrl.filter] }, Core.onSuccess(populateTable));
+                jolokia.request({ type: 'exec', mbean: ctrl.objName, 
operation: 'browse(int, int, java.lang.String)', arguments: 
[ctrl.pagination.pageNumber, ctrl.pagination.pageSize, ctrl.filter] }, 
Core.onSuccess(populateTable));
             }
         }
 
-        function onDlq(response) {
-            Artemis.log.debug("onDLQ=" + response);
-            ctrl.dlq = response;
-            Core.$apply($scope);
-        }
-
         function operationSuccess() {
             ctrl.messageDialog = false;
             Core.notification("success", ctrl.message);
diff --git 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/services/toolbar.js 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/services/toolbar.js
index 7329fc9c33..3a93c31dda 100644
--- 
a/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/services/toolbar.js
+++ 
b/artemis-hawtio/artemis-plugin/src/main/webapp/plugin/js/services/toolbar.js
@@ -114,16 +114,6 @@ var Artemis;
                                         title=""
                                         ng-click="$ctrl.reset()">Reset
                                     </button>
-                                    <button ng-show="$ctrl.dlq" class="btn 
btn-default primary-action ng-binding ng-scope"
-                                        type="button"
-                                        title=""
-                                        ng-click="$ctrl.retry()">Retry Messages
-                                    </button>
-                                    <button ng-show="$ctrl.dlq" class="btn 
btn-default primary-action ng-binding ng-scope"
-                                        type="button"
-                                        title=""
-                                        ng-click="$ctrl.retry()">Move Messages
-                                    </button>
                             </div>
                         </form>
                     </div>
diff --git 
a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/QueuesTest.java
 
b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/QueuesTest.java
index 2b64eaa23a..c80d19c3cb 100644
--- 
a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/QueuesTest.java
+++ 
b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/QueuesTest.java
@@ -110,10 +110,33 @@ public class QueuesTest extends ConsoleTest {
    }
 
    @Test
-   public void testExpiryQueue() throws Exception {
-      final int messages = 1;
-      final String expiryQueueName = "ExpiryQueue";
-      final String testQueueName = "TEST";
+   public void testDefaultExpiryQueue() throws Exception {
+      testExpiryQueue("TEST", "ExpiryQueue");
+   }
+
+   @Test
+   public void testCustomExpiryQueue() throws Exception {
+      final ObjectNameBuilder objectNameBuilder = 
ObjectNameBuilder.create(null, "0.0.0.0", true);
+      final ObjectName activeMQServerObjectName = 
objectNameBuilder.getActiveMQServerObjectName();
+
+      driver.get(serverUrl + "/console");
+      LoginPage loginPage = new LoginPage(driver);
+      StatusPage statusPage = loginPage.loginValidUser(
+         SERVER_ADMIN_USERNAME, SERVER_ADMIN_PASSWORD, DEFAULT_TIMEOUT);
+
+      
Assert.assertTrue(statusPage.postJolokiaExecRequest(activeMQServerObjectName.getCanonicalName(),
+         "createQueue(java.lang.String,java.lang.String,java.lang.String)",
+         "\"foo\",\"foo\",\"ANYCAST\"").toString().contains("\"status\":200"));
+      
Assert.assertTrue(statusPage.postJolokiaExecRequest(activeMQServerObjectName.getCanonicalName(),
+         
"addAddressSettings(java.lang.String,java.lang.String,java.lang.String,long,boolean,int,long,int,int,long,double,long,long,boolean,java.lang.String,long,long,java.lang.String,boolean,boolean,boolean,boolean)",
+         
"\"bar\",\"DLA\",\"foo\",-1,false,0,0,0,0,0,\"0\",0,0,false,\"\",-1,0,\"\",false,false,false,false").toString().contains("\"status\":200"));
+
+      statusPage.logout(DEFAULT_TIMEOUT);
+
+      testExpiryQueue("bar", "foo");
+   }
+
+   private void testExpiryQueue(String queueName, String expiryQueueName) 
throws Exception {
       final String messageText = "TEST";
       final ObjectNameBuilder objectNameBuilder = 
ObjectNameBuilder.create(null, "0.0.0.0", true);
       final ObjectName expiryQueueObjectName = 
objectNameBuilder.getQueueObjectName(
@@ -121,8 +144,8 @@ public class QueuesTest extends ConsoleTest {
          SimpleString.toSimpleString(expiryQueueName),
          RoutingType.ANYCAST);
       final ObjectName testQueueObjectName = 
objectNameBuilder.getQueueObjectName(
-         SimpleString.toSimpleString(testQueueName),
-         SimpleString.toSimpleString(testQueueName),
+         SimpleString.toSimpleString(queueName),
+         SimpleString.toSimpleString(queueName),
          RoutingType.ANYCAST);
 
       driver.get(serverUrl + "/console");
@@ -133,14 +156,14 @@ public class QueuesTest extends ConsoleTest {
          "removeAllMessages()", "").toString().contains("\"status\":200"));
 
       QueuesPage beforeQueuesPage = statusPage.getQueuesPage(DEFAULT_TIMEOUT);
-      Wait.assertEquals(1, () -> beforeQueuesPage.countQueue("ExpiryQueue"));
-      Wait.assertEquals(0, () -> beforeQueuesPage.countQueue(testQueueName));
+      Wait.assertEquals(1, () -> beforeQueuesPage.countQueue(expiryQueueName));
+      Wait.assertEquals(0, () -> beforeQueuesPage.countQueue(queueName));
 
       Producer producer = new Producer();
       producer.setUser(SERVER_ADMIN_USERNAME);
       producer.setPassword(SERVER_ADMIN_PASSWORD);
-      producer.setDestination(testQueueName);
-      producer.setMessageCount(messages);
+      producer.setDestination(queueName);
+      producer.setMessageCount(1);
       producer.setMessage(messageText);
       producer.setSilentInput(true);
       producer.setProtocol("amqp");
@@ -149,21 +172,28 @@ public class QueuesTest extends ConsoleTest {
       beforeQueuesPage.refresh(DEFAULT_TIMEOUT);
       Wait.assertEquals(1, () -> beforeQueuesPage.countQueue(expiryQueueName));
       assertEquals(0, beforeQueuesPage.getMessagesCount(expiryQueueName));
-      Wait.assertEquals(1, () -> beforeQueuesPage.countQueue(testQueueName));
-      assertEquals(messages, beforeQueuesPage.getMessagesCount(testQueueName));
+      Wait.assertEquals(1, () -> beforeQueuesPage.countQueue(queueName));
+      assertEquals(1, beforeQueuesPage.getMessagesCount(queueName));
 
-      QueuePage queuePage = beforeQueuesPage.getQueuePage(testQueueName, 
DEFAULT_TIMEOUT);
+      SendMessagePage sendMessagePage = 
beforeQueuesPage.getAddressSendMessagePage(queueName, DEFAULT_TIMEOUT);
+      sendMessagePage.appendMessageText("xxx");
+      sendMessagePage.sendMessage();
+
+      QueuePage queuePage = 
sendMessagePage.getQueuesPage(DEFAULT_TIMEOUT).getQueuePage(queueName, 
DEFAULT_TIMEOUT);
       
Assert.assertTrue(queuePage.postJolokiaExecRequest(testQueueObjectName.getCanonicalName(),
 "expireMessage(long)",
          
String.valueOf(queuePage.getMessageId(0))).toString().contains("\"status\":200"));
+      
Assert.assertTrue(queuePage.postJolokiaExecRequest(testQueueObjectName.getCanonicalName(),
 "expireMessage(long)",
+         
String.valueOf(queuePage.getMessageId(1))).toString().contains("\"status\":200"));
 
       QueuesPage afterQueuesPage = queuePage.getQueuesPage(DEFAULT_TIMEOUT);
       Wait.assertEquals(1, () -> afterQueuesPage.countQueue(expiryQueueName));
-      assertEquals(messages, 
afterQueuesPage.getMessagesCount(expiryQueueName));
-      Wait.assertEquals(1, () -> beforeQueuesPage.countQueue(testQueueName));
-      assertEquals(0, afterQueuesPage.getMessagesCount(testQueueName));
+      assertEquals(2, afterQueuesPage.getMessagesCount(expiryQueueName));
+      Wait.assertEquals(1, () -> afterQueuesPage.countQueue(queueName));
+      assertEquals(0, afterQueuesPage.getMessagesCount(queueName));
 
-      QueuePage dlqPage = afterQueuesPage.getQueuePage(expiryQueueName, 
DEFAULT_TIMEOUT);
-      assertEquals(testQueueName, dlqPage.getMessageOriginalQueue(0));
+      QueuePage expiryPage = afterQueuesPage.getQueuePage(expiryQueueName, 
DEFAULT_TIMEOUT);
+      assertEquals(queueName, expiryPage.getMessageOriginalQueue(0));
+      assertEquals(queueName, expiryPage.getMessageOriginalQueue(1));
    }
 
    @Test
diff --git 
a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/ArtemisPage.java
 
b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/ArtemisPage.java
index 2d5c0c712a..bb7d1f8104 100644
--- 
a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/ArtemisPage.java
+++ 
b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/ArtemisPage.java
@@ -57,6 +57,14 @@ public abstract class ArtemisPage extends ConsolePage {
       return null;
    }
 
+   public SendMessagePage getAddressSendMessagePage(String address, int 
timeout) {
+      driver.get(getServerUrl() + 
"/console/artemis/artemisAddressSendMessage?nid=root-org.apache.activemq.artemis-0.0.0.0-addresses-"
 + address);
+
+      waitForElementToBeVisible(By.xpath("//h1[contains(text(),'Send 
Message')]"), timeout);
+
+      return new SendMessagePage(driver);
+   }
+
    public QueuesPage getQueuesPage(int timeout) {
       WebElement queuesMenuItem = driver.findElement(queuesMenuItemLocator);
 
@@ -77,6 +85,19 @@ public abstract class ArtemisPage extends ConsolePage {
       return new QueuesPage(driver);
    }
 
+   public LoginPage logout(int timeout) {
+      WebElement logoutWebElement = driver.findElement(logoutLocator);
+      WebElement userDropdownMenuWebElement = 
driver.findElement(userDropdownMenuLocator);
+
+      if (!logoutWebElement.isDisplayed()) {
+         userDropdownMenuWebElement.click();
+      }
+
+      logoutWebElement.click();
+
+      return new LoginPage(driver);
+   }
+
    public Object postJolokiaExecRequest(String mbean, String operation, String 
arguments) {
       Object response = ((JavascriptExecutor) driver).executeAsyncScript(
          "var callback = arguments[arguments.length - 1];" +
diff --git 
a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/ConsolePage.java
 
b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/ConsolePage.java
index 5d6be33c74..aba68e4576 100644
--- 
a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/ConsolePage.java
+++ 
b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/ConsolePage.java
@@ -16,6 +16,8 @@
  */
 package org.apache.activemq.artemis.tests.smoke.console.pages;
 
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.time.Duration;
 
 import org.openqa.selenium.By;
@@ -32,6 +34,15 @@ public abstract class ConsolePage {
       this.driver = driver;
    }
 
+   public String getServerUrl() {
+      try {
+         URL currentUrl = new URL(driver.getCurrentUrl());
+         return currentUrl.getProtocol() + "://" + currentUrl.getAuthority();
+      } catch (MalformedURLException e) {
+         throw new RuntimeException(e);
+      }
+   }
+
    public void refresh(int timeout) {
       driver.navigate().refresh();
 
diff --git 
a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/QueuePage.java
 
b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/QueuePage.java
index 018e842cf0..28956b67b0 100644
--- 
a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/QueuePage.java
+++ 
b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/QueuePage.java
@@ -23,7 +23,7 @@ import org.openqa.selenium.WebElement;
 import java.util.List;
 
 public class QueuePage extends ArtemisPage {
-   private By messageRowLocator = 
By.cssSelector("tr[role='row'][class='ng-scope odd']");
+   private By messageRowLocator = By.cssSelector("tr[role='row'][class]");
 
    public QueuePage(WebDriver driver) {
       super(driver);
diff --git 
a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/SendMessagePage.java
 
b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/SendMessagePage.java
index fc0871e695..9457cea5dd 100644
--- 
a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/SendMessagePage.java
+++ 
b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/console/pages/SendMessagePage.java
@@ -69,5 +69,7 @@ public class SendMessagePage extends ArtemisPage {
 
    public void sendMessage() {
       driver.findElement(By.xpath("//button[contains(text(),'Send 
Message')]")).click();
+
+      driver.findElement(By.xpath("//button[@class='close']")).click();
    }
 }

Reply via email to