diff options
| author | Robert Gemmell <robbie@apache.org> | 2012-07-19 11:23:49 +0000 |
|---|---|---|
| committer | Robert Gemmell <robbie@apache.org> | 2012-07-19 11:23:49 +0000 |
| commit | acb7c90e99f53821aa8120074c0ac7e8c6b793e9 (patch) | |
| tree | 845a9abcba9cc31305b20e07a438e42ac75ae908 /java/broker-plugins | |
| parent | b8e034a771994585028421e9c2781d7ad581c95a (diff) | |
| download | qpid-python-acb7c90e99f53821aa8120074c0ac7e8c6b793e9.tar.gz | |
QPID-4149: Add REST functionality to delete exchanges, queues and bindings, add queue/exchange/binding delete operations into web UI
Applied patch from Oleksandr Rudyy <orudyy@gmail.com> and myself.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1363298 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/broker-plugins')
11 files changed, 320 insertions, 20 deletions
diff --git a/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js b/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js index d7917b640e..08fdf5c99b 100644 --- a/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js +++ b/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js @@ -18,8 +18,8 @@ * under the License. * */ -define([], - function () { +define(["dojo/_base/xhr"], + function (xhr) { var util = {}; if (Array.isArray) { util.isArray = function (object) { @@ -52,5 +52,69 @@ define([], } } }; + + util.isReservedExchangeName = function(exchangeName) + { + return exchangeName == null || exchangeName == "" || "<<default>>" == exchangeName || exchangeName.indexOf("amq.") == 0 || exchangeName.indexOf("qpid.") == 0; + }; + + util.deleteGridSelections = function(updater, gridName, url, confirmationMessageStart) + { + var grid = updater[gridName].grid; + var data = grid.selection.getSelected(); + if(data.length) + { + var confirmationMessage = null; + if (data.length == 1) + { + confirmationMessage = confirmationMessageStart + " '" + data[0].name + "'?"; + } + else + { + var names = ''; + for(var i = 0; i<data.length; i++) + { + if (names) + { + names += ', '; + } + names += "\""+ data[i].name + "\""; + } + confirmationMessage = confirmationMessageStart + "s " + names + "?"; + } + if(confirm(confirmationMessage)) + { + var i, queryParam; + for(i = 0; i<data.length; i++) + { + if(queryParam) + { + queryParam += "&"; + } + else + { + queryParam = "?"; + } + queryParam += "id=" + data[i].id; + } + var query = url + queryParam; + var success = true + var failureReason = ""; + xhr.del({url: query, sync: true, handleAs: "json"}).then( + function(data) + { + grid.setQuery({id: "*"}); + grid.selection.deselectAll(); + updater.update(); + }, + function(error) {success = false; failureReason = error;}); + if(!success ) + { + alert("Error:" + failureReason); + } + } + } + } + return util; });
\ No newline at end of file diff --git a/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js b/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js index 0450ef53ac..37bae1ef8e 100644 --- a/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js +++ b/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Exchange.js @@ -29,8 +29,9 @@ define(["dojo/_base/xhr", "qpid/common/formatter", "qpid/common/UpdatableStore", "qpid/management/addBinding", + "dojox/grid/EnhancedGrid", "dojo/domReady!"], - function (xhr, parser, query, connect, registry, properties, updater, util, formatter, UpdatableStore, addBinding) { + function (xhr, parser, query, connect, registry, properties, updater, util, formatter, UpdatableStore, addBinding, EnhancedGrid) { function Exchange(name, parent, controller) { this.name = name; @@ -82,6 +83,27 @@ define(["dojo/_base/xhr", exchange: that.getExchangeName()}); }); + var deleteBindingButton = query(".deleteBindingButton", contentPane.containerNode)[0]; + connect.connect(registry.byNode(deleteBindingButton), "onClick", + function(evt){ + that.deleteBindings(); + }); + + var isStandard = util.isReservedExchangeName(that.name); + var deleteExchangeButton = query(".deleteExchangeButton", contentPane.containerNode)[0]; + var node = registry.byNode(deleteExchangeButton); + if(isStandard) + { + node.set('disabled', true); + } + else + { + connect.connect(node, "onClick", + function(evt){ + that.deleteExchange(); + }); + } + }}); }; @@ -89,6 +111,15 @@ define(["dojo/_base/xhr", updater.remove( this.exchangeUpdater ); }; + Exchange.prototype.deleteBindings = function() + { + util.deleteGridSelections( + this.exchangeUpdater, + "bindingsGrid", + "rest/binding/"+ encodeURIComponent(this.getVirtualHostName()) + "/" + encodeURIComponent(this.name), + "Are you sure you want to delete binding for queue"); + } + function ExchangeUpdater(containerNode, exchangeObj, controller) { var that = this; @@ -138,7 +169,21 @@ define(["dojo/_base/xhr", [ { name: "Queue", field: "queue", width: "90px"}, { name: "Binding Key", field: "name", width: "120px"}, { name: "Arguments", field: "argumentString", width: "100%"} - ]); + ], null, { + keepSelection: true, + plugins: { + pagination: { + pageSizes: ["10", "25", "50", "100"], + description: true, + sizeSwitch: true, + pageStepper: true, + gotoButton: true, + maxPageStep: 4, + position: "bottom" + }, + indirectSelection: true + + }}, EnhancedGrid); }); @@ -224,6 +269,23 @@ define(["dojo/_base/xhr", }); }; + Exchange.prototype.deleteExchange = function() { + if(confirm("Are you sure you want to delete exchange '" +this.name+"'?")) { + var query = "rest/exchange/"+ encodeURIComponent(this.getVirtualHostName()) + "/" + encodeURIComponent(this.name); + this.success = true + var that = this; + xhr.del({url: query, sync: true, handleAs: "json"}).then( + function(data) { + that.contentPane.onClose() + that.controller.tabContainer.removeChild(that.contentPane); + that.contentPane.destroyRecursive(); + }, + function(error) {that.success = false; that.failureReason = error;}); + if(!this.success ) { + alert("Error:" + this.failureReason); + } + } + } return Exchange; }); diff --git a/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js b/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js index 3ac8b0057d..b812ca2a0b 100644 --- a/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js +++ b/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js @@ -157,6 +157,12 @@ define(["dojo/_base/xhr", queue: that.getQueueName()}); }); + var deleteQueueButton = query(".deleteQueueButton", contentPane.containerNode)[0]; + connect.connect(registry.byNode(deleteQueueButton), "onClick", + function(evt){ + event.stop(evt); + that.deleteQueue(); + }); }}); @@ -458,6 +464,23 @@ define(["dojo/_base/xhr", }); }; + Queue.prototype.deleteQueue = function() { + if(confirm("Are you sure you want to delete queue '" +this.name+"'?")) { + var query = "rest/queue/"+ encodeURIComponent(this.getVirtualHostName()) + "/" + encodeURIComponent(this.name); + this.success = true + var that = this; + xhr.del({url: query, sync: true, handleAs: "json"}).then( + function(data) { + that.contentPane.onClose() + that.controller.tabContainer.removeChild(that.contentPane); + that.contentPane.destroyRecursive(); + }, + function(error) {that.success = false; that.failureReason = error;}); + if(!this.success ) { + alert("Error:" + this.failureReason); + } + } + } return Queue; }); diff --git a/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js b/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js index ce24145930..957f2381cf 100644 --- a/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js +++ b/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js @@ -30,8 +30,9 @@ define(["dojo/_base/xhr", "qpid/common/UpdatableStore", "qpid/management/addQueue", "qpid/management/addExchange", + "dojox/grid/EnhancedGrid", "dojo/domReady!"], - function (xhr, parser, query, connect, registry, properties, updater, util, formatter, UpdatableStore, addQueue, addExchange) { + function (xhr, parser, query, connect, registry, properties, updater, util, formatter, UpdatableStore, addQueue, addExchange, EnhancedGrid) { function VirtualHost(name, parent, controller) { this.name = name; @@ -66,8 +67,31 @@ define(["dojo/_base/xhr", var addQueueButton = query(".addQueueButton", contentPane.containerNode)[0]; connect.connect(registry.byNode(addQueueButton), "onClick", function(evt){ addQueue.show(that.name) }); + var deleteQueueButton = query(".deleteQueueButton", contentPane.containerNode)[0]; + connect.connect(registry.byNode(deleteQueueButton), "onClick", + function(evt){ + util.deleteGridSelections( + that.vhostUpdater, + "queuesGrid", + "rest/queue/"+ encodeURIComponent(that.name), + "Are you sure you want to delete queue"); + } + ); + var addExchangeButton = query(".addExchangeButton", contentPane.containerNode)[0]; connect.connect(registry.byNode(addExchangeButton), "onClick", function(evt){ addExchange.show(that.name) }); + + var deleteExchangeButton = query(".deleteExchangeButton", contentPane.containerNode)[0]; + connect.connect(registry.byNode(deleteExchangeButton), "onClick", + function(evt) + { + util.deleteGridSelections( + that.vhostUpdater, + "exchangesGrid", + "rest/exchange/"+ encodeURIComponent(that.name), + "Are you sure you want to delete exchange"); + } + ); }}); }; @@ -76,7 +100,6 @@ define(["dojo/_base/xhr", updater.remove( this.vhostUpdater ); }; - function Updater(node, vhost, controller) { @@ -123,6 +146,22 @@ define(["dojo/_base/xhr", // flatten statistics into attributes util.flattenStatistics( that.vhostData ); + var gridProperties = { + keepSelection: true, + plugins: { + pagination: { + pageSizes: ["10", "25", "50", "100"], + description: true, + sizeSwitch: true, + pageStepper: true, + gotoButton: true, + maxPageStep: 4, + position: "bottom" + }, + indirectSelection: true + + }}; + that.updateHeader(); that.queuesGrid = new UpdatableStore(that.vhostData.queues, findNode("queues"), [ { name: "Name", field: "name", width: "90px"}, @@ -138,24 +177,24 @@ define(["dojo/_base/xhr", var queueName = obj.dataStore.getValue(theItem,"name"); controller.show("queue", queueName, vhost); }); - } ); + } , gridProperties, EnhancedGrid); that.exchangesGrid = new UpdatableStore(that.vhostData.exchanges, findNode("exchanges"), - [ { name: "Name", field: "name", width: "120px"}, - { name: "Type", field: "type", width: "120px"}, - { name: "Binding Count", field: "bindingCount", - width: "100%"} + [ + { name: "Name", field: "name", width: "120px"}, + { name: "Type", field: "type", width: "120px"}, + { name: "Binding Count", field: "bindingCount", width: "100%"} ], function(obj) { connect.connect(obj.grid, "onRowDblClick", obj.grid, function(evt){ var idx = evt.rowIndex, - theItem = this.getItem(idx); + theItem = this.getItem(idx); var exchangeName = obj.dataStore.getValue(theItem,"name"); controller.show("exchange", exchangeName, vhost); }); - } ); + } , gridProperties, EnhancedGrid); that.connectionsGrid = new UpdatableStore(that.vhostData.connections, @@ -315,6 +354,18 @@ define(["dojo/_base/xhr", // update exchanges thisObj.exchangesGrid.update(thisObj.vhostData.exchanges); + var exchangesGrid = thisObj.exchangesGrid.grid; + for(var i=0; i< thisObj.vhostData.exchanges.length; i++) + { + var data = exchangesGrid.getItem(i); + var isStandard = false; + if (data && data.name) + { + isStandard = util.isReservedExchangeName(data.name); + } + exchangesGrid.rowSelectCell.setDisabled(i, isStandard); + } + // update connections thisObj.connectionsGrid.update(thisObj.vhostData.connections) diff --git a/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addExchange.js b/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addExchange.js index f88daa54bb..915092a9d1 100644 --- a/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addExchange.js +++ b/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addExchange.js @@ -109,7 +109,6 @@ define(["dojo/_base/xhr", var newExchange = convertToExchange(theForm.getValues()); var that = this; - xhr.put({url: "rest/exchange/"+encodeURIComponent(addExchange.vhost) + "/"+encodeURIComponent(newExchange.name), sync: true, handleAs: "json", headers: { "Content-Type": "application/json"}, diff --git a/java/broker-plugins/management-http/src/main/java/resources/showExchange.html b/java/broker-plugins/management-http/src/main/java/resources/showExchange.html index b0aa302782..f33b029026 100644 --- a/java/broker-plugins/management-http/src/main/java/resources/showExchange.html +++ b/java/broker-plugins/management-http/src/main/java/resources/showExchange.html @@ -41,6 +41,10 @@ <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Bindings'"> <div class="bindings"></div> <button data-dojo-type="dijit.form.Button" class="addBindingButton">Add Binding</button> + <button data-dojo-type="dijit.form.Button" class="deleteBindingButton">Delete Binding</button> </div> <br/> + <div class="dijitDialogPaneActionBar"> + <button data-dojo-type="dijit.form.Button" class="deleteExchangeButton" type="button">Delete Exchange</button> + </div> </div> diff --git a/java/broker-plugins/management-http/src/main/java/resources/showQueue.html b/java/broker-plugins/management-http/src/main/java/resources/showQueue.html index 3be53a45a2..f4960055b0 100644 --- a/java/broker-plugins/management-http/src/main/java/resources/showQueue.html +++ b/java/broker-plugins/management-http/src/main/java/resources/showQueue.html @@ -97,5 +97,9 @@ </div> + + <div class="dijitDialogPaneActionBar"> + <button data-dojo-type="dijit.form.Button" class="deleteQueueButton" type="button">Delete Queue</button> + </div> </div> diff --git a/java/broker-plugins/management-http/src/main/java/resources/showVirtualHost.html b/java/broker-plugins/management-http/src/main/java/resources/showVirtualHost.html index 9d16d523d6..f4d998458f 100644 --- a/java/broker-plugins/management-http/src/main/java/resources/showVirtualHost.html +++ b/java/broker-plugins/management-http/src/main/java/resources/showVirtualHost.html @@ -43,11 +43,13 @@ <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Exchanges'"> <div class="exchanges"></div> <button data-dojo-type="dijit.form.Button" class="addExchangeButton">Add Exchange</button> + <button data-dojo-type="dijit.form.Button" class="deleteExchangeButton">Delete Exchange</button> </div> <br/> <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Queues'"> <div class="queues"></div> <button data-dojo-type="dijit.form.Button" class="addQueueButton">Add Queue</button> + <button data-dojo-type="dijit.form.Button" class="deleteQueueButton">Delete Queue</button> </div> <br/> <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Connections'"> diff --git a/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BindingRestTest.java b/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BindingRestTest.java index 91b41c3476..527eb16927 100644 --- a/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BindingRestTest.java +++ b/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/BindingRestTest.java @@ -1,5 +1,6 @@ package org.apache.qpid.server.management.plugin.servlet.rest; +import java.net.HttpURLConnection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -61,4 +62,48 @@ public class BindingRestTest extends QpidRestTestCase Asserts.assertBinding("queue", "amq.direct", bindings.get(0)); } + + public void testDeleteBinding() throws Exception + { + List<Map<String, Object>> bindings = getJsonAsList("/rest/binding/test/amq.direct/queue/queue"); + assertEquals("Unexpected number of bindings", 1, bindings.size()); + Asserts.assertBinding("queue", "amq.direct", bindings.get(0)); + + HttpURLConnection connection = openManagementConection("/rest/binding/test/amq.direct/queue/queue", "DELETE"); + connection.connect(); + assertEquals("Unexpected response code", 200, connection.getResponseCode()); + + bindings = getJsonAsList("/rest/binding/test/amq.direct/queue/queue"); + assertEquals("Binding should be deleted", 0, bindings.size()); + } + + public void testDeleteBindingById() throws Exception + { + Map<String, Object> binding = getJsonAsSingletonList("/rest/binding/test/amq.direct/queue"); + HttpURLConnection connection = openManagementConection("/rest/binding/test/amq.direct?id=" + binding.get(Binding.ID), "DELETE"); + connection.connect(); + assertEquals("Unexpected response code", 200, connection.getResponseCode()); + List<Map<String, Object>> bindings = getJsonAsList("/rest/binding/test/amq.direct/queue"); + assertEquals("Binding should be deleted", 0, bindings.size()); + } + + public void testCreateBinding() throws Exception + { + String bindingName = getTestName(); + Map<String, Object> bindingData = new HashMap<String, Object>(); + bindingData.put(Binding.NAME, bindingName); + bindingData.put(Binding.QUEUE, "queue"); + bindingData.put(Binding.EXCHANGE, "amq.direct"); + + HttpURLConnection connection = openManagementConection("/rest/binding/test/amq.direct/queue/" + bindingName, "PUT"); + connection.connect(); + writeJsonRequest(connection, bindingData); + int responseCode = connection.getResponseCode(); + connection.disconnect(); + assertEquals("Unexpected response code", 201, responseCode); + Map<String, Object> binding = getJsonAsSingletonList("/rest/binding/test/amq.direct/queue/" + bindingName); + + Asserts.assertBinding(bindingName, "queue", "amq.direct", binding); + } + } diff --git a/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostRestTest.java b/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostRestTest.java index 71e85d389e..eaf2e60478 100644 --- a/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostRestTest.java +++ b/java/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/rest/VirtualHostRestTest.java @@ -246,6 +246,56 @@ public class VirtualHostRestTest extends QpidRestTestCase assertNull("Queue of unsupported type was created", queue); } + public void testDeleteQueue() throws Exception + { + String queueName = getTestQueueName(); + createQueue(queueName, null, null); + + HttpURLConnection connection = openManagementConection("/rest/queue/test/" + queueName, "DELETE"); + connection.connect(); + assertEquals("Unexpected response code", 200, connection.getResponseCode()); + List<Map<String, Object>> queues = getJsonAsList("/rest/queue/test/" + queueName); + assertEquals("Queue should be deleted", 0, queues.size()); + } + + public void testDeleteQueueById() throws Exception + { + String queueName = getTestQueueName(); + createQueue(queueName, null, null); + Map<String, Object> queueDetails = getJsonAsSingletonList("/rest/queue/test/" + queueName); + + HttpURLConnection connection = openManagementConection("/rest/queue/test?id=" + queueDetails.get(Queue.ID), "DELETE"); + connection.connect(); + assertEquals("Unexpected response code", 200, connection.getResponseCode()); + List<Map<String, Object>> queues = getJsonAsList("/rest/queue/test/" + queueName); + assertEquals("Queue should be deleted", 0, queues.size()); + } + + public void testDeleteExchange() throws Exception + { + String exchangeName = getTestName(); + createExchange(exchangeName, "direct"); + + HttpURLConnection connection = openManagementConection("/rest/exchange/test/" + exchangeName, "DELETE"); + connection.connect(); + assertEquals("Unexpected response code", 200, connection.getResponseCode()); + List<Map<String, Object>> queues = getJsonAsList("/rest/exchange/test/" + exchangeName); + assertEquals("Exchange should be deleted", 0, queues.size()); + } + + public void testDeleteExchangeById() throws Exception + { + String exchangeName = getTestName(); + createExchange(exchangeName, "direct"); + Map<String, Object> echangeDetails = getJsonAsSingletonList("/rest/exchange/test/" + exchangeName); + + HttpURLConnection connection = openManagementConection("/rest/exchange/test?id=" + echangeDetails.get(Exchange.ID), "DELETE"); + connection.connect(); + assertEquals("Unexpected response code", 200, connection.getResponseCode()); + List<Map<String, Object>> queues = getJsonAsList("/rest/exchange/test/" + exchangeName); + assertEquals("Exchange should be deleted", 0, queues.size()); + } + private void createExchange(String exchangeName, String exchangeType) throws IOException { HttpURLConnection connection = openManagementConection("/rest/exchange/test/" + exchangeName, "PUT"); diff --git a/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/systest/management/jmx/BrokerManagementTest.java b/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/systest/management/jmx/BrokerManagementTest.java index 2c341b7f2e..7473a4d3e7 100644 --- a/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/systest/management/jmx/BrokerManagementTest.java +++ b/java/broker-plugins/management-jmx/src/test/java/org/apache/qpid/systest/management/jmx/BrokerManagementTest.java @@ -24,9 +24,6 @@ import org.apache.qpid.management.common.mbeans.ManagedExchange; import org.apache.qpid.test.utils.JMXTestUtils; import org.apache.qpid.test.utils.QpidBrokerTestCase; -import javax.management.MBeanException; -import javax.management.ObjectName; - /** * Tests the JMX API for the Managed Broker. * @@ -115,11 +112,10 @@ public class BrokerManagementTest extends QpidBrokerTestCase _managedBroker.unregisterExchange(defaultExchangeName); fail("Exception not thrown"); } - catch (MBeanException mbe) + catch (UnsupportedOperationException e) { // PASS - assertEquals("Error in unregistering exchange " + defaultExchangeName, mbe.getMessage()); - assertTrue(mbe.getCause().getMessage().contains("Cannot unregister the default exchange")); + assertEquals("'<<default>>' is a reserved exchange and can't be deleted", e.getMessage()); } final ManagedExchange defaultExchange = _jmxUtils.getManagedExchange(defaultExchangeName); assertNotNull("Exchange should exist", defaultExchange); |
