Revision 09471611 api/actions.py
b/api/actions.py | ||
---|---|---|
4 | 4 |
|
5 | 5 |
from django.conf import settings |
6 | 6 |
from django.http import HttpResponse |
7 |
from django.template.loader import render_to_string |
|
8 |
from django.utils import simplejson as json |
|
7 | 9 |
|
8 | 10 |
from synnefo.api.errors import * |
11 |
from synnefo.api.util import random_password |
|
9 | 12 |
from synnefo.util.rapi import GanetiRapiClient |
13 |
from synnefo.util.vapclient import request_forwarding as request_vnc_forwarding |
|
10 | 14 |
from synnefo.logic import backend, utils |
11 | 15 |
|
12 | 16 |
server_actions = {} |
... | ... | |
20 | 24 |
return func |
21 | 25 |
return decorator |
22 | 26 |
|
27 |
@server_action('console') |
|
28 |
def get_console(request, server, args): |
|
29 |
"""Arrange for an OOB console of the specified type |
|
30 |
|
|
31 |
This method arranges for an OOB console of the specified type. |
|
32 |
Only "vnc" type consoles are supported for now. |
|
33 |
It uses a running instance of vncauthproxy to setup proper |
|
34 |
VNC forwarding with a random password, then returns the necessary |
|
35 |
VNC connection info to the caller. |
|
36 |
|
|
37 |
""" |
|
38 |
# Normal Response Code: 200 |
|
39 |
# Error Response Codes: computeFault (400, 500), |
|
40 |
# serviceUnavailable (503), |
|
41 |
# unauthorized (401), |
|
42 |
# badRequest (400), |
|
43 |
# badMediaType(415), |
|
44 |
# itemNotFound (404), |
|
45 |
# buildInProgress (409), |
|
46 |
# overLimit (413) |
|
47 |
try: |
|
48 |
console_type = args.get('type', '') |
|
49 |
if console_type != 'VNC': |
|
50 |
raise BadRequest(message="type can only be 'VNC'") |
|
51 |
except KeyError: |
|
52 |
raise BadRequest() |
|
53 |
|
|
54 |
# Use RAPI to get VNC console information for this instance |
|
55 |
if utils.get_rsapi_state(server) != 'ACTIVE': |
|
56 |
raise BadRequest(message="Server not in ACTIVE state") |
|
57 |
console_data = rapi.GetInstanceConsole(server.backend_id) |
|
58 |
if console_data['kind'] != 'vnc': |
|
59 |
raise ServiceUnavailable() |
|
60 |
|
|
61 |
# Let vncauthproxy decide on the source port. |
|
62 |
# FIXME |
|
63 |
# sport = 0 |
|
64 |
sport = console_data['port'] - 1000 |
|
65 |
daddr = console_data['host'] |
|
66 |
dport = console_data['port'] |
|
67 |
passwd = random_password() |
|
68 |
|
|
69 |
request_vnc_forwarding(sport, daddr, dport, passwd) |
|
70 |
vnc = { 'host': '62.217.120.67', 'port': sport, 'password': passwd } |
|
71 |
|
|
72 |
# Format to be reviewed by [verigak], FIXME |
|
73 |
if request.type == 'xml': |
|
74 |
mimetype = 'application/xml' |
|
75 |
data = render_to_string('vnc.xml', {'vnc': vnc}) |
|
76 |
else: |
|
77 |
mimetype = 'application/json' |
|
78 |
data = json.dumps(vnc) |
|
79 |
|
|
80 |
return HttpResponse(data, mimetype=mimetype, status=200) |
|
81 |
|
|
23 | 82 |
|
24 | 83 |
@server_action('changePassword') |
25 |
def change_password(server, args): |
|
84 |
def change_password(request, server, args):
|
|
26 | 85 |
# Normal Response Code: 202 |
27 | 86 |
# Error Response Codes: computeFault (400, 500), |
28 | 87 |
# serviceUnavailable (503), |
... | ... | |
41 | 100 |
raise ServiceUnavailable() |
42 | 101 |
|
43 | 102 |
@server_action('reboot') |
44 |
def reboot(server, args): |
|
103 |
def reboot(request, server, args):
|
|
45 | 104 |
# Normal Response Code: 202 |
46 | 105 |
# Error Response Codes: computeFault (400, 500), |
47 | 106 |
# serviceUnavailable (503), |
... | ... | |
61 | 120 |
return HttpResponse(status=202) |
62 | 121 |
|
63 | 122 |
@server_action('start') |
64 |
def start(server, args): |
|
123 |
def start(request, server, args):
|
|
65 | 124 |
# Normal Response Code: 202 |
66 | 125 |
# Error Response Codes: serviceUnavailable (503), itemNotFound (404) |
67 | 126 |
|
... | ... | |
70 | 129 |
return HttpResponse(status=202) |
71 | 130 |
|
72 | 131 |
@server_action('shutdown') |
73 |
def shutdown(server, args): |
|
132 |
def shutdown(request, server, args):
|
|
74 | 133 |
# Normal Response Code: 202 |
75 | 134 |
# Error Response Codes: serviceUnavailable (503), itemNotFound (404) |
76 | 135 |
|
... | ... | |
79 | 138 |
return HttpResponse(status=202) |
80 | 139 |
|
81 | 140 |
@server_action('rebuild') |
82 |
def rebuild(server, args): |
|
141 |
def rebuild(request, server, args):
|
|
83 | 142 |
# Normal Response Code: 202 |
84 | 143 |
# Error Response Codes: computeFault (400, 500), |
85 | 144 |
# serviceUnavailable (503), |
... | ... | |
94 | 153 |
raise ServiceUnavailable() |
95 | 154 |
|
96 | 155 |
@server_action('resize') |
97 |
def resize(server, args): |
|
156 |
def resize(request, server, args):
|
|
98 | 157 |
# Normal Response Code: 202 |
99 | 158 |
# Error Response Codes: computeFault (400, 500), |
100 | 159 |
# serviceUnavailable (503), |
... | ... | |
110 | 169 |
raise ResizeNotAllowed() |
111 | 170 |
|
112 | 171 |
@server_action('confirmResize') |
113 |
def confirm_resize(server, args): |
|
172 |
def confirm_resize(request, server, args):
|
|
114 | 173 |
# Normal Response Code: 204 |
115 | 174 |
# Error Response Codes: computeFault (400, 500), |
116 | 175 |
# serviceUnavailable (503), |
... | ... | |
126 | 185 |
raise ResizeNotAllowed() |
127 | 186 |
|
128 | 187 |
@server_action('revertResize') |
129 |
def revert_resize(server, args): |
|
188 |
def revert_resize(request, server, args):
|
|
130 | 189 |
# Normal Response Code: 202 |
131 | 190 |
# Error Response Codes: computeFault (400, 500), |
132 | 191 |
# serviceUnavailable (503), |
Also available in: Unified diff