You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2013/11/04 15:38:47 UTC
svn commit: r1538626 - in /qpid/trunk/qpid/tools/src/py: qpid-config
qpidtoollibs/broker.py
Author: gsim
Date: Mon Nov 4 14:38:47 2013
New Revision: 1538626
URL: http://svn.apache.org/r1538626
Log:
QPID-5277: support for generic add, del and list
Modified:
qpid/trunk/qpid/tools/src/py/qpid-config
qpid/trunk/qpid/tools/src/py/qpidtoollibs/broker.py
Modified: qpid/trunk/qpid/tools/src/py/qpid-config
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/tools/src/py/qpid-config?rev=1538626&r1=1538625&r2=1538626&view=diff
==============================================================================
--- qpid/trunk/qpid/tools/src/py/qpid-config (original)
+++ qpid/trunk/qpid/tools/src/py/qpid-config Mon Nov 4 14:38:47 2013
@@ -30,6 +30,7 @@ sys.path.append(os.path.join(home, "pyth
from qpid.messaging import Connection
from qpidtoollibs import BrokerAgent
+from qpidtoollibs import Display, Header
usage = """
Usage: qpid-config [OPTIONS]
@@ -43,7 +44,10 @@ Usage: qpid-config [OPTIONS]
<for type xml> [-f -|filename]
<for type header> [all|any] k1=v1 [, k2=v2...]
qpid-config [OPTIONS] unbind <exchange-name> <queue-name> [binding-key]
- qpid-config [OPTIONS] reload-acl"""
+ qpid-config [OPTIONS] reload-acl
+ qpid-config [OPTIONS] add <type> <name> [--argument <property-name>=<property-value>]
+ qpid-config [OPTIONS] del <type> <name>
+ qpid-config [OPTIONS] list <type> [--show-property <property-name>]"""
description = """
Examples:
@@ -76,6 +80,7 @@ Replication levels:
"""
REPLICATE_LEVELS= ["none", "configuration", "all"]
+DEFAULT_PROPERTIES = {"exchange":["name", "type", "durable"], "queue":["name", "durable", "autoDelete"]}
class Config:
def __init__(self):
@@ -107,6 +112,17 @@ class Config:
self._extra_arguments = []
self._start_replica = None
self._returnCode = 0
+ self._list_properties = []
+
+ def getOptions(self):
+ options = {}
+ for a in self._extra_arguments:
+ r = a.split("=", 1)
+ if len(r) == 2: value = r[1]
+ else: value = None
+ options[r[0]] = value
+ return options
+
config = Config()
conn_options = {}
@@ -229,6 +245,11 @@ def OptionsAndArguments(argv):
group6.add_option("-f", "--file", action="store", type="string", metavar="<file.xq>", help="For XML Exchange bindings - specifies the name of a file containing an XQuery.")
parser.add_option_group(group6)
+ group_7 = OptionGroup(parser, "Formatting options for 'list' action")
+ group_7.add_option("--show-property", dest="list_properties", action="append", default=[],
+ metavar="<property-name>", help="Specify a property of an object to be included in output")
+ parser.add_option_group(group_7)
+
opts, encArgs = parser.parse_args(args=argv)
try:
@@ -304,6 +325,8 @@ def OptionsAndArguments(argv):
config._extra_arguments = opts.extra_arguments
if opts.start_replica:
config._start_replica = opts.start_replica
+ if opts.list_properties:
+ config._list_properties = opts.list_properties
if opts.sasl_mechanism:
conn_options['sasl_mechanisms'] = opts.sasl_mechanism
@@ -701,6 +724,13 @@ def YN(bool):
return 'Y'
return 'N'
+def _clean_ref(o):
+ if isinstance(o, dict) and "_object_name" in o:
+ fqn = o["_object_name"]
+ parts = fqn.split(":",2)
+ return parts[len(parts)-1]
+ else:
+ return o
def main(argv=None):
args = OptionsAndArguments(argv)
@@ -730,6 +760,8 @@ def main(argv=None):
bm.AddExchange(args[2:])
elif modifier == "queue":
bm.AddQueue(args[2:])
+ elif len(args) > 2:
+ bm.broker.create(modifier, args[2], config.getOptions())
else:
Usage()
elif cmd == "del":
@@ -737,6 +769,8 @@ def main(argv=None):
bm.DelExchange(args[2:])
elif modifier == "queue":
bm.DelQueue(args[2:])
+ elif len(args) > 2:
+ bm.broker.delete(modifier, args[2], {})
else:
Usage()
elif cmd == "bind":
@@ -745,6 +779,36 @@ def main(argv=None):
bm.Unbind(args[1:])
elif cmd == "reload-acl":
bm.ReloadAcl()
+ elif cmd == "list" and len(args) > 1:
+ # fetch objects
+ objects = bm.broker.list(modifier)
+
+ # collect available attributes
+ attributes = []
+ for o in objects:
+ for k in o.keys():
+ if k == "name" and k not in attributes:
+ attributes.insert(0, k)
+ elif k not in attributes:
+ attributes.append(k)
+
+ # determine which attributes to display
+ desired = []
+ if len(config._list_properties):
+ for p in config._list_properties:
+ if p not in attributes: print "Warning: No such property '%s' for type '%s'" % (p, modifier)
+ else: desired.append(p)
+ elif modifier in DEFAULT_PROPERTIES:
+ desired = DEFAULT_PROPERTIES[modifier]
+ else:
+ desired = attributes[:6]
+
+ # display
+ display = Display(prefix=" ")
+ headers = [Header(a) for a in desired]
+ rows = [tuple([_clean_ref(o[a]) for a in desired]) for o in objects]
+ display.formattedTable("Objects of type '%s'" % modifier, headers, rows)
+
else:
Usage()
except KeyboardInterrupt:
Modified: qpid/trunk/qpid/tools/src/py/qpidtoollibs/broker.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/tools/src/py/qpidtoollibs/broker.py?rev=1538626&r1=1538625&r2=1538626&view=diff
==============================================================================
--- qpid/trunk/qpid/tools/src/py/qpidtoollibs/broker.py (original)
+++ qpid/trunk/qpid/tools/src/py/qpidtoollibs/broker.py Mon Nov 4 14:38:47 2013
@@ -312,6 +312,10 @@ class BrokerAgent(object):
'options': options}
return self._method('delete', args)
+ def list(self, _type):
+ """List objects of the specified type"""
+ return [i["_values"] for i in self._doClassQuery(_type.lower())]
+
def query(self, _type, oid):
"""Query the current state of an object"""
return self._getBrokerObject(self, _type, oid)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org