1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import datetime
18 import itertools
19 import logging
20
21 import web
22
23 from pulp.server.api.consumer import ConsumerApi
24 from pulp.server.api.consumer_history import ConsumerHistoryApi, SORT_DESCENDING
25 from pulp.server.webservices import http
26 from pulp.server.webservices import mongo
27 from pulp.server.webservices.controllers.base import JSONController
28 from pulp.server.webservices.role_check import RoleCheck
29
30
31
32 consumer_api = ConsumerApi()
33 history_api = ConsumerHistoryApi()
34 log = logging.getLogger('pulp')
35
36
37 default_fields = ['id', 'description']
42
43 @JSONController.error_handler
44 @RoleCheck(admin=True)
65
66 @JSONController.error_handler
67 @RoleCheck(admin=True)
81
82 @JSONController.error_handler
83 @RoleCheck(admin=True)
85 """
86 Delete all consumers.
87 @return: True on successful deletion of all consumers
88 """
89 consumer_api.clean()
90 return self.ok(True)
91
92
93 -class Bulk(JSONController):
100
103
104 @JSONController.error_handler
105 @RoleCheck(consumer_id=True, admin=True)
119
120 @JSONController.error_handler
121 @RoleCheck(admin=True)
123 """
124 Update consumer
125 @param id: The consumer id
126 @type id: str
127 """
128 log.debug("PUT called.")
129 consumer_data = self.params()
130 if id != consumer_data['id']:
131 return self.bad_request('Cannot change the consumer id')
132
133 for field in itertools.chain(['uri_ref'],
134 ConsumerDeferredFields.exposed_fields):
135 consumer_data.pop(field, None)
136 consumer_api.update(consumer_data)
137 return self.ok(True)
138
139 @JSONController.error_handler
140 @RoleCheck(consumer_id=True, admin=True)
142 """
143 Delete a consumer.
144 @param id: consumer id
145 @return: True on successful deletion of consumer
146 """
147 consumer_api.delete(id=id)
148 return self.ok(True)
149
152
153
154 exposed_fields = (
155 'package_profile',
156 'repoids',
157 'certificate'
158 )
159 @RoleCheck(consumer_id=True, admin=True)
171
172 @RoleCheck(consumer_id=True, admin=True)
186
187 @RoleCheck(admin=True)
189 """
190 Get a X509 Certificate for this Consumer. Useful for uniquely and securely
191 identifying this Consumer later.
192 @type id: str ID of the Consumer
193 @param id: consumer id
194 @return: X509 PEM Certificate
195 """
196 valid_filters = ('id')
197 filters = self.filters(valid_filters)
198 private_key, certificate = consumer_api.certificate(id)
199 certificate = {'certificate': certificate, 'private_key': private_key}
200 return self.ok(certificate)
201
202 @JSONController.error_handler
203 - def GET(self, id, field_name):
204 """
205 Deferred field dispatcher.
206 """
207 field = getattr(self, field_name, None)
208 if field is None:
209 return self.internal_server_error('No implementation for %s found' % field_name)
210 return field(id)
211
214
215
216
217
218 exposed_actions = (
219 'bind',
220 'unbind',
221 'profile',
222 'installpackages',
223 'installpackagegroups',
224 'listerrata',
225 'installerrata',
226 'history',
227 )
228
229 @RoleCheck(consumer_id=True, admin=True)
230 - def bind(self, id):
231 """
232 Bind (subscribe) a user to a repository.
233 @param id: consumer id
234 """
235 data = self.params()
236 consumer_api.bind(id, data)
237 return self.ok(True)
238
239 @RoleCheck(consumer_id=True, admin=True)
241 """
242 Unbind (unsubscribe) a user to a repository.
243 @param id: consumer id
244 """
245 data = self.params()
246 consumer_api.unbind(id, data)
247 return self.ok(None)
248
249 @RoleCheck(consumer_id=True, admin=True)
251 """
252 update/add Consumer profile information. eg:package, hardware etc
253 """
254 log.debug("consumers.py profile() with id: %s" % id)
255 consumer_api.profile_update(id, self.params())
256 return self.ok(True)
257
258 @RoleCheck(consumer_id=True, admin=True)
260 """
261 Install packages.
262 Body contains a list of package names.
263 """
264 data = self.params()
265 names = data.get('packagenames', [])
266 return self.ok(consumer_api.installpackages(id, names))
267
268 @RoleCheck(consumer_id=True, admin=True)
277
278 @RoleCheck(consumer_id=True, admin=True)
280 """
281 Install errata
282 Body contains list of errata ids and/or type
283 """
284 data = self.params()
285 eids = data.get('errataids', [])
286 types = data.get('types', [])
287 return self.ok(consumer_api.installerrata(id, eids, types))
288
289 @JSONController.error_handler
290 @RoleCheck(consumer_id=True, admin=True)
292 """
293 list applicable errata for a given repo.
294 filter by errata type if any
295 """
296 data = self.params()
297 return self.ok(consumer_api.listerrata(id, data['types']))
298
299 @JSONController.error_handler
300 @RoleCheck(consumer_id=True, admin=True)
301 - def history(self, id):
302 data = self.params()
303
304 event_type = data.get('event_type', None)
305 limit = data.get('limit', None)
306 sort = data.get('sort', None)
307 start_date = data.get('start_date', None)
308 end_date = data.get('end_date', None)
309
310 if sort is None:
311 sort = SORT_DESCENDING
312
313 if limit:
314 limit = int(limit)
315
316 if start_date:
317 start_date = datetime.datetime.strptime(start_date, '%Y-%m-%d')
318
319 if end_date:
320 end_date = datetime.datetime.strptime(end_date, '%Y-%m-%d')
321
322 results = history_api.query(consumer_id=id, event_type=event_type, limit=limit,
323 sort=sort, start_date=start_date, end_date=end_date)
324 return self.ok(results)
325
326 @JSONController.error_handler
327 - def POST(self, id, action_name):
328 """
329 Consumer action dispatcher
330 @type id: str
331 @param id: controller id
332 @type action_name: str
333 @param action_name: action name
334 """
335
336 action = getattr(self, action_name, None)
337 log.debug("consumers.py POST. Action: %s" % action_name)
338 if action is None:
339 return self.internal_server_error('No implementation for %s found' % action_name)
340 return action(id)
341
342
343
344 URLS = (
345 '/$', 'Consumers',
346 '/bulk/$', 'Bulk',
347 '/([^/]+)/$', 'Consumer',
348
349 '/([^/]+)/(%s)/$' % '|'.join(ConsumerDeferredFields.exposed_fields),
350 'ConsumerDeferredFields',
351
352 '/([^/]+)/(%s)/$' % '|'.join(ConsumerActions.exposed_actions),
353 'ConsumerActions',
354 )
355
356 application = web.application(URLS, globals())
357