Revision b3fd98ae snf-cyclades-app/synnefo/api/servers.py
b/snf-cyclades-app/synnefo/api/servers.py | ||
---|---|---|
1 |
# Copyright 2011-2012 GRNET S.A. All rights reserved.
|
|
1 |
# Copyright 2011-2013 GRNET S.A. All rights reserved.
|
|
2 | 2 |
# |
3 | 3 |
# Redistribution and use in source and binary forms, with or |
4 | 4 |
# without modification, are permitted provided that the following |
... | ... | |
31 | 31 |
# interpreted as representing official policies, either expressed |
32 | 32 |
# or implied, of GRNET S.A. |
33 | 33 |
|
34 |
from base64 import b64decode |
|
35 |
|
|
36 | 34 |
from django import dispatch |
37 | 35 |
from django.conf import settings |
38 | 36 |
from django.conf.urls.defaults import patterns |
... | ... | |
41 | 39 |
from django.template.loader import render_to_string |
42 | 40 |
from django.utils import simplejson as json |
43 | 41 |
|
44 |
from snf_django.lib.api import faults |
|
42 |
from snf_django.lib import api |
|
43 |
from snf_django.lib.api import faults, utils |
|
45 | 44 |
from synnefo.api import util |
46 | 45 |
from synnefo.api.actions import server_actions |
47 |
from synnefo.api.common import method_not_allowed |
|
48 | 46 |
from synnefo.db.models import (VirtualMachine, VirtualMachineMetadata, |
49 | 47 |
NetworkInterface) |
50 | 48 |
from synnefo.logic.backend import create_instance, delete_instance |
... | ... | |
57 | 55 |
server_created = dispatch.Signal(providing_args=["created_vm_params"]) |
58 | 56 |
|
59 | 57 |
from logging import getLogger |
60 |
log = getLogger('synnefo.api')
|
|
58 |
log = getLogger(__name__)
|
|
61 | 59 |
|
62 | 60 |
urlpatterns = patterns( |
63 | 61 |
'synnefo.api.servers', |
... | ... | |
80 | 78 |
elif request.method == 'POST': |
81 | 79 |
return create_server(request) |
82 | 80 |
else: |
83 |
return method_not_allowed(request) |
|
81 |
return api.method_not_allowed(request)
|
|
84 | 82 |
|
85 | 83 |
|
86 | 84 |
def server_demux(request, server_id): |
... | ... | |
91 | 89 |
elif request.method == 'DELETE': |
92 | 90 |
return delete_server(request, server_id) |
93 | 91 |
else: |
94 |
return method_not_allowed(request) |
|
92 |
return api.method_not_allowed(request)
|
|
95 | 93 |
|
96 | 94 |
|
97 | 95 |
def metadata_demux(request, server_id): |
... | ... | |
100 | 98 |
elif request.method == 'POST': |
101 | 99 |
return update_metadata(request, server_id) |
102 | 100 |
else: |
103 |
return method_not_allowed(request) |
|
101 |
return api.method_not_allowed(request)
|
|
104 | 102 |
|
105 | 103 |
|
106 | 104 |
def metadata_item_demux(request, server_id, key): |
... | ... | |
111 | 109 |
elif request.method == 'DELETE': |
112 | 110 |
return delete_metadata_item(request, server_id, key) |
113 | 111 |
else: |
114 |
return method_not_allowed(request) |
|
112 |
return api.method_not_allowed(request)
|
|
115 | 113 |
|
116 | 114 |
|
117 | 115 |
def nic_to_dict(nic): |
... | ... | |
133 | 131 |
d['progress'] = 100 if get_rsapi_state(vm) == 'ACTIVE' \ |
134 | 132 |
else vm.buildpercentage |
135 | 133 |
d['hostId'] = vm.hostid |
136 |
d['updated'] = util.isoformat(vm.updated) |
|
137 |
d['created'] = util.isoformat(vm.created) |
|
134 |
d['updated'] = utils.isoformat(vm.updated)
|
|
135 |
d['created'] = utils.isoformat(vm.created)
|
|
138 | 136 |
d['flavorRef'] = vm.flavor.id |
139 | 137 |
d['imageRef'] = vm.imageid |
140 | 138 |
d['suspended'] = vm.suspended |
... | ... | |
166 | 164 |
# format source date if set |
167 | 165 |
formatted_source_date = None |
168 | 166 |
if diagnostic.source_date: |
169 |
formatted_source_date = util.isoformat(diagnostic.source_date) |
|
167 |
formatted_source_date = utils.isoformat(diagnostic.source_date)
|
|
170 | 168 |
|
171 | 169 |
entry = { |
172 | 170 |
'source': diagnostic.source, |
173 |
'created': util.isoformat(diagnostic.created), |
|
171 |
'created': utils.isoformat(diagnostic.created),
|
|
174 | 172 |
'message': diagnostic.message, |
175 | 173 |
'details': diagnostic.details, |
176 | 174 |
'level': diagnostic.level, |
... | ... | |
201 | 199 |
return HttpResponse(json.dumps(diagnostics_dict), status=status) |
202 | 200 |
|
203 | 201 |
|
204 |
@util.api_method('GET')
|
|
202 |
@api.api_method(http_method='GET', user_required=True, logger=log)
|
|
205 | 203 |
def get_server_diagnostics(request, server_id): |
206 | 204 |
""" |
207 | 205 |
Virtual machine diagnostics api view. |
... | ... | |
212 | 210 |
return render_diagnostics(request, diagnostics) |
213 | 211 |
|
214 | 212 |
|
215 |
@util.api_method('GET')
|
|
213 |
@api.api_method(http_method='GET', user_required=True, logger=log)
|
|
216 | 214 |
def list_servers(request, detail=False): |
217 | 215 |
# Normal Response Codes: 200, 203 |
218 | 216 |
# Error Response Codes: computeFault (400, 500), |
... | ... | |
224 | 222 |
log.debug('list_servers detail=%s', detail) |
225 | 223 |
user_vms = VirtualMachine.objects.filter(userid=request.user_uniq) |
226 | 224 |
|
227 |
since = util.isoparse(request.GET.get('changes-since')) |
|
225 |
since = utils.isoparse(request.GET.get('changes-since'))
|
|
228 | 226 |
|
229 | 227 |
if since: |
230 | 228 |
user_vms = user_vms.filter(updated__gte=since) |
... | ... | |
246 | 244 |
return HttpResponse(data, status=200) |
247 | 245 |
|
248 | 246 |
|
249 |
@util.api_method('POST')
|
|
247 |
@api.api_method(http_method='POST', user_required=True, logger=log)
|
|
250 | 248 |
# Use manual transactions. Backend and IP pool allocations need exclusive |
251 | 249 |
# access (SELECT..FOR UPDATE). Running create_server with commit_on_success |
252 | 250 |
# would result in backends and public networks to be locked until the job is |
... | ... | |
264 | 262 |
# serverCapacityUnavailable (503), |
265 | 263 |
# overLimit (413) |
266 | 264 |
try: |
267 |
req = util.get_request_dict(request) |
|
265 |
req = utils.get_request_dict(request)
|
|
268 | 266 |
log.info('create_server %s', req) |
269 | 267 |
user_id = request.user_uniq |
270 | 268 |
|
... | ... | |
398 | 396 |
return respsone |
399 | 397 |
|
400 | 398 |
|
401 |
@util.api_method('GET')
|
|
399 |
@api.api_method(http_method='GET', user_required=True, logger=log)
|
|
402 | 400 |
def get_server_details(request, server_id): |
403 | 401 |
# Normal Response Codes: 200, 203 |
404 | 402 |
# Error Response Codes: computeFault (400, 500), |
... | ... | |
414 | 412 |
return render_server(request, server) |
415 | 413 |
|
416 | 414 |
|
417 |
@util.api_method('PUT')
|
|
415 |
@api.api_method(http_method='PUT', user_required=True, logger=log)
|
|
418 | 416 |
def update_server_name(request, server_id): |
419 | 417 |
# Normal Response Code: 204 |
420 | 418 |
# Error Response Codes: computeFault (400, 500), |
... | ... | |
426 | 424 |
# buildInProgress (409), |
427 | 425 |
# overLimit (413) |
428 | 426 |
|
429 |
req = util.get_request_dict(request) |
|
427 |
req = utils.get_request_dict(request)
|
|
430 | 428 |
log.info('update_server_name %s %s', server_id, req) |
431 | 429 |
|
432 | 430 |
try: |
... | ... | |
442 | 440 |
return HttpResponse(status=204) |
443 | 441 |
|
444 | 442 |
|
445 |
@util.api_method('DELETE')
|
|
443 |
@api.api_method(http_method='DELETE', user_required=True, logger=log)
|
|
446 | 444 |
@transaction.commit_on_success |
447 | 445 |
def delete_server(request, server_id): |
448 | 446 |
# Normal Response Codes: 204 |
... | ... | |
466 | 464 |
ARBITRARY_ACTIONS = ['console', 'firewallProfile'] |
467 | 465 |
|
468 | 466 |
|
469 |
@util.api_method('POST')
|
|
467 |
@api.api_method(http_method='POST', user_required=True, logger=log)
|
|
470 | 468 |
def server_action(request, server_id): |
471 |
req = util.get_request_dict(request) |
|
469 |
req = utils.get_request_dict(request)
|
|
472 | 470 |
log.debug('server_action %s %s', server_id, req) |
473 | 471 |
|
474 | 472 |
if len(req) != 1: |
... | ... | |
528 | 526 |
vm.save() |
529 | 527 |
|
530 | 528 |
|
531 |
@util.api_method('GET')
|
|
529 |
@api.api_method(http_method='GET', user_required=True, logger=log)
|
|
532 | 530 |
def list_addresses(request, server_id): |
533 | 531 |
# Normal Response Codes: 200, 203 |
534 | 532 |
# Error Response Codes: computeFault (400, 500), |
... | ... | |
549 | 547 |
return HttpResponse(data, status=200) |
550 | 548 |
|
551 | 549 |
|
552 |
@util.api_method('GET')
|
|
550 |
@api.api_method(http_method='GET', user_required=True, logger=log)
|
|
553 | 551 |
def list_addresses_by_network(request, server_id, network_id): |
554 | 552 |
# Normal Response Codes: 200, 203 |
555 | 553 |
# Error Response Codes: computeFault (400, 500), |
... | ... | |
573 | 571 |
return HttpResponse(data, status=200) |
574 | 572 |
|
575 | 573 |
|
576 |
@util.api_method('GET')
|
|
574 |
@api.api_method(http_method='GET', user_required=True, logger=log)
|
|
577 | 575 |
def list_metadata(request, server_id): |
578 | 576 |
# Normal Response Codes: 200, 203 |
579 | 577 |
# Error Response Codes: computeFault (400, 500), |
... | ... | |
588 | 586 |
return util.render_metadata(request, metadata, use_values=True, status=200) |
589 | 587 |
|
590 | 588 |
|
591 |
@util.api_method('POST')
|
|
589 |
@api.api_method(http_method='POST', user_required=True, logger=log)
|
|
592 | 590 |
def update_metadata(request, server_id): |
593 | 591 |
# Normal Response Code: 201 |
594 | 592 |
# Error Response Codes: computeFault (400, 500), |
... | ... | |
599 | 597 |
# badMediaType(415), |
600 | 598 |
# overLimit (413) |
601 | 599 |
|
602 |
req = util.get_request_dict(request) |
|
600 |
req = utils.get_request_dict(request)
|
|
603 | 601 |
log.info('update_server_metadata %s %s', server_id, req) |
604 | 602 |
vm = util.get_vm(server_id, request.user_uniq, non_suspended=True) |
605 | 603 |
try: |
... | ... | |
618 | 616 |
return util.render_metadata(request, vm_meta, status=201) |
619 | 617 |
|
620 | 618 |
|
621 |
@util.api_method('GET')
|
|
619 |
@api.api_method(http_method='GET', user_required=True, logger=log)
|
|
622 | 620 |
def get_metadata_item(request, server_id, key): |
623 | 621 |
# Normal Response Codes: 200, 203 |
624 | 622 |
# Error Response Codes: computeFault (400, 500), |
... | ... | |
635 | 633 |
return util.render_meta(request, d, status=200) |
636 | 634 |
|
637 | 635 |
|
638 |
@util.api_method('PUT')
|
|
636 |
@api.api_method(http_method='PUT', user_required=True, logger=log)
|
|
639 | 637 |
@transaction.commit_on_success |
640 | 638 |
def create_metadata_item(request, server_id, key): |
641 | 639 |
# Normal Response Code: 201 |
... | ... | |
648 | 646 |
# badMediaType(415), |
649 | 647 |
# overLimit (413) |
650 | 648 |
|
651 |
req = util.get_request_dict(request) |
|
649 |
req = utils.get_request_dict(request)
|
|
652 | 650 |
log.info('create_server_metadata_item %s %s %s', server_id, key, req) |
653 | 651 |
vm = util.get_vm(server_id, request.user_uniq, non_suspended=True) |
654 | 652 |
try: |
... | ... | |
670 | 668 |
return util.render_meta(request, d, status=201) |
671 | 669 |
|
672 | 670 |
|
673 |
@util.api_method('DELETE')
|
|
671 |
@api.api_method(http_method='DELETE', user_required=True, logger=log)
|
|
674 | 672 |
@transaction.commit_on_success |
675 | 673 |
def delete_metadata_item(request, server_id, key): |
676 | 674 |
# Normal Response Code: 204 |
... | ... | |
691 | 689 |
return HttpResponse(status=204) |
692 | 690 |
|
693 | 691 |
|
694 |
@util.api_method('GET')
|
|
692 |
@api.api_method(http_method='GET', user_required=True, logger=log)
|
|
695 | 693 |
def server_stats(request, server_id): |
696 | 694 |
# Normal Response Codes: 200 |
697 | 695 |
# Error Response Codes: computeFault (400, 500), |
Also available in: Unified diff