A bit more abstraction.

This commit is contained in:
Simon MacMullen 2011-03-10 13:39:10 +00:00
parent b6bf09471a
commit c2fc45b13e
1 changed files with 26 additions and 21 deletions

View File

@ -81,6 +81,16 @@ PURGABLE = {
'uri': '/queues/{vhost}/{name}/contents'} 'uri': '/queues/{vhost}/{name}/contents'}
} }
EXTRA_VERBS = {
'publish': {'mandatory': ['routing_key', 'payload'],
'optional': {'exchange': 'amq.default',
'payload_encoding': 'string'},
'uri': '/exchanges/{vhost}/{exchange}/publish'},
'get': {'mandatory': ['queue'],
'optional': {'count': '1', 'requeue': 'true'},
'uri': '/queues/{vhost}/{queue}/get'}
}
for k in DECLARABLE: for k in DECLARABLE:
DECLARABLE[k]['uri'] = URIS[k] DECLARABLE[k]['uri'] = URIS[k]
@ -98,16 +108,14 @@ where cmd is one of:
usage += " list {0} [<column>...]\n".format(l) usage += " list {0} [<column>...]\n".format(l)
for s in SHOWABLE: for s in SHOWABLE:
usage += " show {0} [<column>...]\n".format(s) usage += " show {0} [<column>...]\n".format(s)
usage += fmt_usage_stanza(DECLARABLE, 'declare') usage += fmt_usage_stanza(DECLARABLE, 'declare')
usage += fmt_usage_stanza(DELETABLE, 'delete') usage += fmt_usage_stanza(DELETABLE, 'delete')
usage += fmt_usage_stanza(CLOSABLE, 'close') usage += fmt_usage_stanza(CLOSABLE, 'close')
usage += fmt_usage_stanza(PURGABLE, 'purge') usage += fmt_usage_stanza(PURGABLE, 'purge')
usage += fmt_usage_stanza(EXTRA_VERBS, '')
usage += """ usage += """
export <file> export <file>
import <file> import <file>"""
publish exchange=... routing_key=... payload=... payload_encoding=...
get queue=... count=... requeue=..."""
return usage return usage
def fmt_usage_stanza(root, verb): def fmt_usage_stanza(root, verb):
@ -119,8 +127,10 @@ def fmt_usage_stanza(root, verb):
return res return res
text = "\n" text = "\n"
if verb != "":
verb = " " + verb
for k in root.keys(): for k in root.keys():
text += " {0} {1} {2}\n".format(verb, k, fmt_args(root[k])) text += " {0} {1} {2}\n".format(verb, k, fmt_args(root[k]))
return text return text
parser = OptionParser(usage=make_usage()) parser = OptionParser(usage=make_usage())
@ -230,11 +240,7 @@ class Management:
return self.args[0] return self.args[0]
def invoke_publish(self): def invoke_publish(self):
(uri, payload) = self.parse_args(self.args, (uri, payload) = self.parse_args(self.args, EXTRA_VERBS['publish'])
['routing_key', 'payload'],
{'exchange': 'amq.default',
'payload_encoding': 'string'},
'/exchanges/{vhost}/{exchange}/publish')
payload['properties'] = {} # TODO do we care here? payload['properties'] = {} # TODO do we care here?
resp = json.loads(self.post(uri, json.dumps(payload))) resp = json.loads(self.post(uri, json.dumps(payload)))
if resp['routed']: if resp['routed']:
@ -243,10 +249,7 @@ class Management:
self.verbose("Message published but NOT routed") self.verbose("Message published but NOT routed")
def invoke_get(self): def invoke_get(self):
(uri, payload) = self.parse_args(self.args, (uri, payload) = self.parse_args(self.args, EXTRA_VERBS['get'])
['queue'],
{'count': '1', 'requeue': 'true'},
'/queues/{vhost}/{queue}/get')
format_list(self.post(uri, json.dumps(payload)), [], self.options) format_list(self.post(uri, json.dumps(payload)), [], self.options)
def invoke_export(self): def invoke_export(self):
@ -311,11 +314,13 @@ class Management:
assert_usage(obj_type in root, assert_usage(obj_type in root,
'Type {0} not recognised'.format(obj_type)) 'Type {0} not recognised'.format(obj_type))
obj = root[obj_type] obj = root[obj_type]
(uri, payload) = self.parse_args(self.args[1:], obj['mandatory'], (uri, payload) = self.parse_args(self.args[1:], obj)
obj['optional'], obj['uri'])
return (obj_type, uri, payload) return (obj_type, uri, payload)
def parse_args(self, args, mandatory, optional, uri_template): def parse_args(self, args, obj):
mandatory = obj['mandatory']
optional = obj['optional']
uri_template = obj['uri']
payload = {} payload = {}
for k in optional.keys(): for k in optional.keys():
payload[k] = optional[k] payload[k] = optional[k]