comparison frontends/src/jp/cmd_pubsub.py @ 2221:a6c9bc4d1de0

jp (pubsub/node): added create and delete commands
author Goffi <goffi@goffi.org>
date Mon, 03 Apr 2017 00:23:01 +0200
parents 4e06cd44e667
children 87fcd4a7c7e4
comparison
equal deleted inserted replaced
2220:0d27d95652a7 2221:a6c9bc4d1de0
19 19
20 20
21 import base 21 import base
22 from sat.core.i18n import _ 22 from sat.core.i18n import _
23 from sat_frontends.jp.constants import Const as C 23 from sat_frontends.jp.constants import Const as C
24 from functools import partial
24 25
25 __commands__ = ["Pubsub"] 26 __commands__ = ["Pubsub"]
26 27
27 28
28 class NodeInfo(base.CommandBase): 29 class NodeCommon(object):
30 node_required = True
31
32 def __init__(self, node_required=True):
33 self.node_required = node_required
34
35 def add_parser_options(self):
36 self.parser.add_argument("-s", "--service", type=base.unicode_decoder, default=u'',
37 help=_(u"JID of the PubSub service (default: PEP service)"))
38 if self.node_required:
39 self.parser.add_argument("node", type=base.unicode_decoder, help=_(u"node to request"))
40 else:
41 self.parser.add_argument("-n", "--node", type=base.unicode_decoder, default=u'', help=_(u"node to request"))
42
43
44 class NodeInfo(base.CommandBase, NodeCommon):
29 45
30 def __init__(self, host): 46 def __init__(self, host):
31 base.CommandBase.__init__(self, host, 'info', use_output=C.OUTPUT_DICT, help=_(u'retrieve node configuration')) 47 base.CommandBase.__init__(self, host, 'info', use_output=C.OUTPUT_DICT, help=_(u'retrieve node configuration'))
32 self.need_loop=True 48 self.need_loop=True
33 49
34 def add_parser_options(self): 50 def add_parser_options(self):
35 self.parser.add_argument("-k", "--key", type=base.unicode_decoder, action='append', dest='keys', 51 self.parser.add_argument("-k", "--key", type=base.unicode_decoder, action='append', dest='keys',
36 help=_(u"data key to filter")) 52 help=_(u"data key to filter"))
37 self.parser.add_argument("node", type=base.unicode_decoder, help=_(u"node to request")) 53 NodeCommon.add_parser_options(self)
38 self.parser.add_argument("service", type=base.unicode_decoder, nargs='?', default=u'',
39 help=_(u"JID of the PubSub service (default: request profile own pubsub)"))
40 54
41 def removePrefix(self, key): 55 def removePrefix(self, key):
42 return key[7:] if key.startswith(u"pubsub#") else key 56 return key[7:] if key.startswith(u"pubsub#") else key
43 57
44 def filterKey(self, key): 58 def filterKey(self, key):
61 self.args.node, 75 self.args.node,
62 self.profile, 76 self.profile,
63 callback=self.psNodeConfigurationGetCb, 77 callback=self.psNodeConfigurationGetCb,
64 errback=self.psNodeConfigurationGetEb) 78 errback=self.psNodeConfigurationGetEb)
65 79
66 class NodeSet(base.CommandBase): 80
67 81 class NodeCreate(base.CommandBase, NodeCommon):
68 def __init__(self, host): 82
69 base.CommandBase.__init__(self, host, 'set', use_output=C.OUTPUT_DICT, use_verbose=True, help=_(u'set node configuration')) 83 def __init__(self, host):
84 NodeCommon.__init__(self, node_required=False)
85 base.CommandBase.__init__(self, host, 'create', use_output=C.OUTPUT_DICT, use_verbose=True, help=_(u'create a node'))
70 self.need_loop=True 86 self.need_loop=True
71 87
72 def add_parser_options(self): 88 def add_parser_options(self):
73 self.parser.add_argument("-f", "--field", type=base.unicode_decoder, action='append', nargs=2, dest='fields', 89 self.parser.add_argument("-f", "--field", type=base.unicode_decoder, action='append', nargs=2, dest='fields',
74 required=True, metavar=(u"KEY", u"VALUE"), help=_(u"configuration field to set (required)")) 90 required=True, metavar=(u"KEY", u"VALUE"), help=_(u"configuration field to set (required)"))
75 self.parser.add_argument("node", type=base.unicode_decoder, help=_(u"node to request")) 91 self.parser.add_argument("-F", "--full-prefix", action="store_true", help=_(u"don't prepend \"pubsub#\" prefix to field names"))
76 self.parser.add_argument("service", type=base.unicode_decoder, nargs='?', default=u'', 92 NodeCommon.add_parser_options(self)
77 help=_(u"JID of the PubSub service (default: request profile own pubsub)")) 93
94 def psNodeCreateCb(self, node_id):
95 if self.host.verbosity:
96 announce = _(u'node created successfully: ')
97 else:
98 announce = u''
99 self.disp(announce + node_id)
100 self.host.quit()
101
102 def psNodeCreateEb(self, failure_):
103 self.disp(u"can't create: {reason}".format(
104 reason=failure_), error=True)
105 self.host.quit(C.EXIT_BRIDGE_ERRBACK)
106
107 def start(self):
108 if not self.args.full_prefix:
109 options = {u'pubsub#' + k: v for k,v in self.args.fields}
110 else:
111 options = dict(self.args.fields)
112 self.host.bridge.psNodeCreate(
113 self.args.service,
114 self.args.node,
115 options,
116 self.profile,
117 callback=self.psNodeCreateCb,
118 errback=partial(self.errback,
119 msg=_(u"can't create node: {}"),
120 exit_code=C.EXIT_BRIDGE_ERRBACK))
121
122
123 class NodeDelete(base.CommandBase, NodeCommon):
124
125 def __init__(self, host):
126 base.CommandBase.__init__(self, host, 'delete', help=_(u'delete a node'))
127 self.need_loop=True
128
129 def add_parser_options(self):
130 self.parser.add_argument('-f', '--force', action='store_true', help=_(u'delete node without confirmation'))
131 NodeCommon.add_parser_options(self)
132
133 def psNodeDeleteCb(self):
134 self.disp(_(u'node deleted successfully'))
135 self.host.quit()
136
137 def start(self):
138 if not self.args.force:
139 if not self.args.service:
140 message = _(u"Are you sure to delete pep node [{node_id}] ?").format(
141 node_id=self.args.node)
142 else:
143 message = _(u"Are you sure to delete node [{node_id}] on service [{service}] ?").format(
144 node_id=self.args.node, service=self.args.service)
145
146 res = raw_input("{} (y/N)? ".format(message))
147 if res not in ("y", "Y"):
148 self.disp(_(u"node deletion cancelled"))
149 self.host.quit(2)
150
151 self.host.bridge.psNodeDelete(
152 self.args.service,
153 self.args.node,
154 self.profile,
155 callback=self.psNodeDeleteCb,
156 errback=partial(self.errback,
157 msg=_(u"can't delete node: {}"),
158 exit_code=C.EXIT_BRIDGE_ERRBACK))
159
160
161 class NodeSet(base.CommandBase, NodeCommon):
162
163 def __init__(self, host):
164 base.CommandBase.__init__(self, host, 'set', use_output=C.OUTPUT_DICT, use_verbose=True, help=_(u'set node configuration'))
165 self.need_loop=True
166
167 def add_parser_options(self):
168 self.parser.add_argument("-f", "--field", type=base.unicode_decoder, action='append', nargs=2, dest='fields',
169 required=True, metavar=(u"KEY", u"VALUE"), help=_(u"configuration field to set (required)"))
170 NodeCommon.add_parser_options(self)
78 171
79 def psNodeConfigurationSetCb(self): 172 def psNodeConfigurationSetCb(self):
80 self.disp(_(u'node configuration successful'), 1) 173 self.disp(_(u'node configuration successful'), 1)
81 self.host.quit() 174 self.host.quit()
82 175
99 self.profile, 192 self.profile,
100 callback=self.psNodeConfigurationSetCb, 193 callback=self.psNodeConfigurationSetCb,
101 errback=self.psNodeConfigurationSetEb) 194 errback=self.psNodeConfigurationSetEb)
102 195
103 196
104 class NodeAffiliationsGet(base.CommandBase): 197 class NodeAffiliationsGet(base.CommandBase, NodeCommon):
105 198
106 def __init__(self, host): 199 def __init__(self, host):
107 base.CommandBase.__init__(self, host, 'get', use_output=C.OUTPUT_DICT, help=_(u'retrieve node affiliations (for node owner)')) 200 base.CommandBase.__init__(self, host, 'get', use_output=C.OUTPUT_DICT, help=_(u'retrieve node affiliations (for node owner)'))
108 self.need_loop=True 201 self.need_loop=True
109 202
110 def add_parser_options(self): 203 def add_parser_options(self):
111 self.parser.add_argument("-s", "--service", type=base.unicode_decoder, default=u'', 204 NodeCommon.add_parser_options(self)
112 help=_(u"JID of the PubSub service (default: request profile own pubsub)"))
113 self.parser.add_argument("node", type=base.unicode_decoder, help=_(u"node to request"))
114 205
115 def psNodeAffiliationsGetCb(self, affiliations): 206 def psNodeAffiliationsGetCb(self, affiliations):
116 self.output(affiliations) 207 self.output(affiliations)
117 self.host.quit() 208 self.host.quit()
118 209
128 self.profile, 219 self.profile,
129 callback=self.psNodeAffiliationsGetCb, 220 callback=self.psNodeAffiliationsGetCb,
130 errback=self.psNodeAffiliationsGetEb) 221 errback=self.psNodeAffiliationsGetEb)
131 222
132 223
133 class NodeAffiliationsSet(base.CommandBase): 224 class NodeAffiliationsSet(base.CommandBase, NodeCommon):
134 225
135 def __init__(self, host): 226 def __init__(self, host):
136 base.CommandBase.__init__(self, host, 'set', use_verbose=True, help=_(u'set affiliations (for node owner)')) 227 base.CommandBase.__init__(self, host, 'set', use_verbose=True, help=_(u'set affiliations (for node owner)'))
137 self.need_loop=True 228 self.need_loop=True
138 229
139 def add_parser_options(self): 230 def add_parser_options(self):
140 self.parser.add_argument("-s", "--service", type=base.unicode_decoder, default=u'', 231 NodeCommon.add_parser_options(self)
141 help=_(u"JID of the PubSub service (default: request profile own pubsub)"))
142 self.parser.add_argument("node", type=base.unicode_decoder, help=_(u"node to set"))
143 # XXX: we use optional argument syntax for a required one because list of list of 2 elements 232 # XXX: we use optional argument syntax for a required one because list of list of 2 elements
144 # (uses to construct dicts) don't work with positional arguments 233 # (uses to construct dicts) don't work with positional arguments
145 self.parser.add_argument("-a", 234 self.parser.add_argument("-a",
146 "--affiliation", 235 "--affiliation",
147 dest="affiliations", 236 dest="affiliations",
178 def __init__(self, host): 267 def __init__(self, host):
179 super(NodeAffiliations, self).__init__(host, 'affiliations', use_profile=False, help=_(u'set or retrieve node affiliations')) 268 super(NodeAffiliations, self).__init__(host, 'affiliations', use_profile=False, help=_(u'set or retrieve node affiliations'))
180 269
181 270
182 class Node(base.CommandBase): 271 class Node(base.CommandBase):
183 subcommands = (NodeInfo, NodeSet, NodeAffiliations) 272 subcommands = (NodeInfo, NodeCreate, NodeDelete, NodeSet, NodeAffiliations)
184 273
185 def __init__(self, host): 274 def __init__(self, host):
186 super(Node, self).__init__(host, 'node', use_profile=False, help=_('node handling')) 275 super(Node, self).__init__(host, 'node', use_profile=False, help=_('node handling'))
187 276
188 277