Revision e51c7d5b

b/kamaki/clients/compute/__init__.py
301 301
        r = self.servers_delete(server_id, key)
302 302
        return r.headers
303 303

  
304
    def list_flavors(self, detail=False):
304
    def list_flavors(self, detail=False, response_headers=dict(
305
            previous=None, next=None)):
305 306
        """
306 307
        :param detail: (bool) detailed flavor info if set, short if not
307 308

  
308 309
        :returns: (list) flavor info
309 310
        """
310
        r = self.flavors_get(command='detail' if detail else '')
311
        r = self.flavors_get(detail=bool(detail))
312
        for k, v in response_headers.items():
313
            response_headers[k] = r.headers.get(k, v)
311 314
        return r.json['flavors']
312 315

  
313 316
    def get_flavor_details(self, flavor_id):
......
319 322
        r = self.flavors_get(flavor_id)
320 323
        return r.json['flavor']
321 324

  
322
    def list_images(self, detail=False):
325
    def list_images(self, detail=False, response_headers=dict(
326
            next=None, previous=None)):
323 327
        """
324 328
        :param detail: (bool) detailed info if set, short if not
325 329

  
326 330
        :returns: dict id,name + full info if detail
327 331
        """
328
        detail = 'detail' if detail else ''
329
        r = self.images_get(command=detail)
332
        r = self.images_get(detail=bool(detail))
333
        for k, v in response_headers.items():
334
            response_headers[k] = r.headers.get(k, v)
330 335
        return r.json['images']
331 336

  
332 337
    def get_image_details(self, image_id, **kwargs):
......
351 356
        r = self.images_delete(image_id)
352 357
        return r.headers
353 358

  
354
    def get_image_metadata(self, image_id, key=''):
359
    def get_image_metadata(self, image_id, key='', response_headers=dict(
360
            previous=None, next=None)):
355 361
        """
356 362
        :param image_id: (str)
357 363

  
......
359 365

  
360 366
        :returns (dict) metadata if key not set, specific metadatum otherwise
361 367
        """
362
        command = path4url('metadata', key)
363
        r = self.images_get(image_id, command)
368
        r = self.images_metadata_get(image_id, key)
369
        for k, v in response_headers.items():
370
            response_headers[k] = r.headers.get(k, v)
364 371
        return r.json['meta' if key else 'metadata']
365 372

  
366 373
    def create_image_metadata(self, image_id, key, val):
......
377 384
        r = self.images_put(image_id, 'metadata/' + key, json_data=req)
378 385
        return r.json['meta']
379 386

  
380
    def update_image_metadata(self, image_id, **metadata):
387
    def update_image_metadata(
388
            self, image_id,
389
            response_headers=dict(previous=None, next=None), **metadata):
381 390
        """
382 391
        :param image_id: (str)
383 392

  
......
386 395
        :returns: updated metadata
387 396
        """
388 397
        req = {'metadata': metadata}
389
        r = self.images_post(image_id, 'metadata', json_data=req)
398
        r = self.images_metadata_post(image_id, json_data=req)
399
        for k, v in response_headers.items():
400
            response_headers[k] = r.headers.get(k, v)
390 401
        return r.json['metadata']
391 402

  
392 403
    def delete_image_metadata(self, image_id, key):
b/kamaki/clients/compute/rest_api.py
101 101
            self.set_param('status', status, iff=status)
102 102
            self.set_param('host', host, iff=host)
103 103

  
104
        path = path4url('servers', 'detail' if detail else server_id)
104
        path = path4url('servers', 'detail' if detail else (server_id or ''))
105 105
        return self.get(path, success=success, **kwargs)
106 106

  
107 107
    def servers_post(
......
263 263
        path = path4url('servers', server_id, 'action')
264 264
        return self.post(path, data=json_data, success=success, **kwargs)
265 265

  
266
    """
267
    def servers_actions_post
268
    def servers_ips_get
269

  
270
    def servers_get(self, server_id='', command='', success=200, **kwargs):
271
        ""GET base_url/servers[/server_id][/command] request
272

  
273
        :param server_id: integer (as int or str)
274

  
275
        :param command: 'ips', 'stats', or ''
266
    def servers_ips_get(
267
            self, server_id,
268
            network_id=None, changes_since=None, success=(304, 200),
269
            **kwargs):
270
        """GET base_url/servers/<server_id>/ips[/network_id]
276 271

  
277
        :param success: success code or list or tupple of accepted success
278
            codes. if server response code is not in this list, a ClientError
279
            raises
272
        :param changes_since: time/date stamp in UNIX/epoch time. Checks for
273
            changes since a previous request.
280 274

  
281 275
        :returns: request response
282
        ""
283
        path = path4url('servers', server_id, command)
276
        """
277
        self.set_param('changes-since', changes_since, iff=changes_since)
278
        path = path4url('servers', server_id, 'ips', network_id or '')
279
        return self.get(path, success=success, **kwargs)
284 280

  
285
    def servers_post(
281
    def images_get(
286 282
            self,
287
            server_id='',
288
            command='',
289
            json_data=None,
290
            success=202,
283
            image_id='',
284
            detail=False,
285
            changes_since=None,
286
            server_name=None,
287
            name=None,
288
            status=None,
289
            marker=None,
290
            limit=None,
291
            type=None,
292
            success=200,
291 293
            **kwargs):
292
        ""POST base_url/servers[/server_id]/[command] request
293

  
294
        :param server_id: integer (as int or str)
294
        """GET base_url[/image_id][/command]
295 295

  
296
        :param command: 'ips', 'stats', or ''
296
        :param image_id: (str) ignored if detail
297 297

  
298
        :param json_data: a json-formated dict that will be send as data
298
        :param detail: (bool)
299 299

  
300
        :param success: success code or list or tupple of accepted success
301
            codes. if server response code is not in this list, a ClientError
302
            raises
300
        --- Parameters ---
301
        :param changes_since: when the image last changed status
303 302

  
304
        :returns: request response
305
        ""
306
        data = json_data
307
        if json_data:
308
            data = json.dumps(json_data)
309
            self.set_header('Content-Type', 'application/json')
310
            self.set_header('Content-Length', len(data))
303
        :param server_name: Name of the server in URL format
311 304

  
312
        path = path4url('servers', server_id, command)
313
        return self.post(path, data=data, success=success, **kwargs)
314
    """
305
        :param name: Name of the image
315 306

  
316
    def flavors_get(self, flavor_id='', command='', success=200, **kwargs):
317
        """GET base_url[/flavor_id][/command]
307
        :param status: Status of the image (e.g. filter on "ACTIVE")
318 308

  
319
        :param flavor_id: integer (str or int)
309
        :param marker: UUID of the image at which you want to set a marker
320 310

  
321
        :param command: flavor service command
311
        :param limit: Integer value for the limit of values to return
322 312

  
323
        :param success: success code or list or tupple of accepted success
324
            codes. if server response code is not in this list, a ClientError
325
            raises
313
        :param type: Type of image (e.g. BASE, SERVER, or ALL)
326 314

  
327 315
        :returns: request response
328 316
        """
329
        path = path4url('flavors', flavor_id, command)
330
        return self.get(path, success=success, **kwargs)
317
        if not image_id:
318
            self.set_param('changes-since', changes_since, iff=changes_since)
319
            self.set_param('name', name, iff=name)
320
            self.set_param('status', status, iff=status)
321
            self.set_param('marker', marker, iff=marker)
322
            self.set_param('limit', limit, iff=limit)
323
            self.set_param('type', type, iff=type)
324
            self.set_param('server', server_name, iff=server_name)
331 325

  
332
    def images_get(self, image_id='', command='', success=200, **kwargs):
333
        """GET base_url[/image_id][/command]
326
        path = path4url('images', 'detail' if detail else (image_id or ''))
327
        return self.get(path, success=success, **kwargs)
334 328

  
335
        :param image_id: string
329
    def images_delete(self, image_id='', success=204, **kwargs):
330
        """DEL ETE base_url/images/<image_id>
336 331

  
337
        :param command: image server command
332
        :returns: request response
333
        """
334
        path = path4url('images', image_id)
335
        return self.delete(path, success=success, **kwargs)
338 336

  
339
        :param success: success code or list or tupple of accepted success
340
            codes. if server response code is not in this list, a ClientError
341
            raises
337
    def images_metadata_get(self, image_id, key=None, success=200, **kwargs):
338
        """GET base_url/<image_id>/metadata[/key]
342 339

  
343 340
        :returns: request response
344 341
        """
345
        path = path4url('images', image_id, command)
342
        path = path4url('images', image_id, 'metadata', key or '')
346 343
        return self.get(path, success=success, **kwargs)
347 344

  
348
    def images_delete(self, image_id='', command='', success=204, **kwargs):
349
        """DELETE base_url[/image_id][/command]
350

  
351
        :param image_id: string
352

  
353
        :param command: image server command
354

  
355
        :param success: success code or list or tuple of accepted success
356
            codes. if server response code is not in this list, a ClientError
357
            raises
345
    def images_metadata_post(
346
            self, image_id, json_data=None, success=201, **kwargs):
347
        """POST base_url/images/<image_id>/metadata
358 348

  
359 349
        :returns: request response
360 350
        """
361
        path = path4url('images', image_id, command)
362
        return self.delete(path, success=success, **kwargs)
363

  
364
    def images_post(
365
            self,
366
            image_id='',
367
            command='',
368
            json_data=None,
369
            success=201,
370
            **kwargs):
371
        """POST base_url/images[/image_id]/[command] request
372

  
373
        :param image_id: string
374

  
375
        :param command: image server command
351
        if json_data is not None:
352
            json_data = json.dumps(json_data)
353
            self.set_header('Content-Type', 'application/json')
354
            self.set_header('Content-Length', len(json_data))
376 355

  
377
        :param json_data: (dict) will be send as data
356
        path = path4url('images', image_id, 'metadata')
357
        return self.post(path, data=json_data, success=success, **kwargs)
378 358

  
379
        :param success: success code or list or tuple of accepted success
380
            codes. if server response code is not in this list, a ClientError
381
            raises
359
    def images_metadata_put(
360
            self, image_id, key=None, json_data=None, success=201, **kwargs):
361
        """PUT base_url/images/<image_id>/metadata
382 362

  
383 363
        :returns: request response
384 364
        """
385
        data = json_data
386 365
        if json_data is not None:
387
            data = json.dumps(json_data)
366
            json_data = json.dumps(json_data)
388 367
            self.set_header('Content-Type', 'application/json')
389
            self.set_header('Content-Length', len(data))
368
            self.set_header('Content-Length', len(json_data))
369

  
370
        path = path4url('images', image_id, 'metadata')
371
        return self.put(path, data=json_data, success=success, **kwargs)
390 372

  
391
        path = path4url('images', image_id, command)
392
        return self.post(path, data=data, success=success, **kwargs)
373
    def images_metadata_delete(self, image_id, key, success=204, **kwargs):
374
        """DEL ETE base_url/images/<image_id>/metadata/key
393 375

  
394
    def images_put(
376
        :returns: request response
377
        """
378
        path = path4url('images', image_id, 'metadata', key)
379
        return self.put(path, success=success, **kwargs)
380

  
381
    def flavors_get(
395 382
            self,
396
            image_id='',
397
            command='',
398
            json_data=None,
399
            success=201,
383
            flavor_id='',
384
            detail=False,
385
            changes_since=None,
386
            minDisk=None,
387
            minRam=None,
388
            marker=None,
389
            limit=None,
390
            success=200,
400 391
            **kwargs):
401
        """PUT base_url/images[/image_id]/[command] request
392
        """GET base_url[/flavor_id][/command]
402 393

  
403
        :param image_id: string
394
        :param flavor_id: ignored if detail
404 395

  
405
        :param command: image server command
396
        :param detail: (bool)
406 397

  
407
        :param json_data: (dict) will be send as data
398
        --- Parameters ---
408 399

  
409
        :param success: success code or list or tuple of accepted success
410
            codes. if server response code is not in this list, a ClientError
411
            raises
400
        :param changes_since: when the flavor last changed
401

  
402
        :param minDisk: minimum disk space in GB filter
403

  
404
        :param minRam: minimum RAM filter
405

  
406
        :param marker: UUID of the flavor at which to set a marker
407

  
408
        :param limit: limit the number of returned values
412 409

  
413 410
        :returns: request response
414 411
        """
415
        data = json_data
416
        if json_data is not None:
417
            data = json.dumps(json_data)
418
            self.set_header('Content-Type', 'application/json')
419
            self.set_header('Content-Length', len(data))
412
        if not flavor_id:
413
            self.set_param('changes-since', changes_since, iff=changes_since)
414
            self.set_param('minDisk', minDisk, iff=minDisk)
415
            self.set_param('minRam', minRam, iff=minRam)
416
            self.set_param('marker', marker, iff=marker)
417
            self.set_param('limit', limit, iff=limit)
420 418

  
421
        path = path4url('images', image_id, command)
422
        return self.put(path, data=data, success=success, **kwargs)
419
        path = path4url('flavors', 'detail' if detail else (flavor_id or ''))
420
        return self.get(path, success=success, **kwargs)
423 421

  
424 422
    def floating_ip_pools_get(self, tenant_id, success=200, **kwargs):
425 423
        path = path4url(tenant_id, 'os-floating-ip-pools')
b/kamaki/clients/cyclades/__init__.py
151 151

  
152 152
        :returns: (dict) network interface connections
153 153
        """
154
        r = self.servers_get(server_id, 'ips')
154
        r = self.servers_ips_get(server_id)
155 155
        return r.json['attachments']
156
        #return r.json['addresses']
157 156

  
158 157
    def get_server_stats(self, server_id):
159 158
        """
......
161 160

  
162 161
        :returns: (dict) auto-generated graphs of statistics (urls)
163 162
        """
164
        r = self.servers_get(server_id, 'stats')
163
        r = self.servers_stats_get(server_id)
165 164
        return r.json['stats']
166 165

  
167 166
    def list_networks(self, detail=False):
b/kamaki/clients/cyclades/rest_api.py
39 39
class CycladesRestClient(ComputeClient):
40 40
    """Synnefo Cyclades REST API Client"""
41 41

  
42
    def servers_stats_get(self, server_id, success=200, **kwargs):
43
        """GET base_url/servers/<server_id>/stats"""
44
        path = path4url('servers', server_id, 'stats')
45
        return self.get(path, success=success, **kwargs)
46

  
42 47
    def networks_get(
43 48
            self,
44 49
            network_id='',

Also available in: Unified diff