Statistics
| Branch: | Tag: | Revision:

root / api / actions.py @ d8e50a39

History | View | Annotate | Download (4.9 kB)

1
#
2
# Copyright (c) 2010 Greek Research and Technology Network
3
#
4

    
5
from django.conf import settings
6
from django.http import HttpResponse
7

    
8
from synnefo.api.faults import BadRequest, ResizeNotAllowed, ServiceUnavailable
9
from synnefo.util.rapi import GanetiRapiClient
10
from synnefo.logic import backend
11

    
12

    
13
server_actions = {}
14

    
15
rapi = GanetiRapiClient(*settings.GANETI_CLUSTER_INFO)
16

    
17

    
18
def server_action(name):
19
    '''Decorator for functions implementing server actions.
20
    
21
       `name` is the key in the dict passed by the client.
22
    '''
23
    
24
    def decorator(func):
25
        server_actions[name] = func
26
        return func
27
    return decorator
28

    
29

    
30
@server_action('changePassword')
31
def change_password(vm, args):
32
    # Normal Response Code: 202
33
    # Error Response Codes: computeFault (400, 500),
34
    #                       serviceUnavailable (503),
35
    #                       unauthorized (401),
36
    #                       badRequest (400),
37
    #                       badMediaType(415),
38
    #                       itemNotFound (404),
39
    #                       buildInProgress (409),
40
    #                       overLimit (413)
41
    
42
    try:
43
        adminPass = args['adminPass']
44
    except KeyError:
45
        raise BadRequest()
46

    
47
    raise ServiceUnavailable()
48

    
49
@server_action('reboot')
50
def reboot(vm, args):
51
    # Normal Response Code: 202
52
    # Error Response Codes: computeFault (400, 500),
53
    #                       serviceUnavailable (503),
54
    #                       unauthorized (401),
55
    #                       badRequest (400),
56
    #                       badMediaType(415),
57
    #                       itemNotFound (404),
58
    #                       buildInProgress (409),
59
    #                       overLimit (413)
60
    
61
    reboot_type = args.get('type', '')
62
    if reboot_type not in ('SOFT', 'HARD'):
63
        raise BadRequest()
64
    
65
    backend.start_action(vm, 'REBOOT')
66
    rapi.RebootInstance(vm.backend_id, reboot_type.lower())
67
    return HttpResponse(status=202)
68

    
69
@server_action('start')
70
def start(vm, args):
71
    # Normal Response Code: 202
72
    # Error Response Codes: serviceUnavailable (503),
73
    #                       itemNotFound (404)
74

    
75
    backend.start_action(vm, 'START')
76
    rapi.StartupInstance(vm.backend_id)
77
    return HttpResponse(status=202)
78

    
79
@server_action('shutdown')
80
def shutdown(vm, args):
81
    # Normal Response Code: 202
82
    # Error Response Codes: serviceUnavailable (503),
83
    #                       itemNotFound (404)
84
    
85
    backend.start_action(vm, 'STOP')
86
    rapi.ShutdownInstance(vm.backend_id)
87
    return HttpResponse(status=202)
88

    
89
@server_action('rebuild')
90
def rebuild(vm, args):
91
    # Normal Response Code: 202
92
    # Error Response Codes: computeFault (400, 500),
93
    #                       serviceUnavailable (503),
94
    #                       unauthorized (401),
95
    #                       badRequest (400),
96
    #                       badMediaType(415),
97
    #                       itemNotFound (404),
98
    #                       buildInProgress (409),
99
    #                       serverCapacityUnavailable (503),
100
    #                       overLimit (413)
101

    
102
    raise ServiceUnavailable()
103

    
104
@server_action('resize')
105
def resize(vm, args):
106
    # Normal Response Code: 202
107
    # Error Response Codes: computeFault (400, 500),
108
    #                       serviceUnavailable (503),
109
    #                       unauthorized (401),
110
    #                       badRequest (400),
111
    #                       badMediaType(415),
112
    #                       itemNotFound (404),
113
    #                       buildInProgress (409),
114
    #                       serverCapacityUnavailable (503),
115
    #                       overLimit (413),
116
    #                       resizeNotAllowed (403)
117
    
118
    raise ResizeNotAllowed()
119

    
120
@server_action('confirmResize')
121
def confirm_resize(vm, args):
122
    # Normal Response Code: 204
123
    # Error Response Codes: computeFault (400, 500),
124
    #                       serviceUnavailable (503),
125
    #                       unauthorized (401),
126
    #                       badRequest (400),
127
    #                       badMediaType(415),
128
    #                       itemNotFound (404),
129
    #                       buildInProgress (409),
130
    #                       serverCapacityUnavailable (503),
131
    #                       overLimit (413),
132
    #                       resizeNotAllowed (403)
133
    
134
    raise ResizeNotAllowed()
135

    
136
@server_action('revertResize')
137
def revert_resize(vm, args):
138
    # Normal Response Code: 202
139
    # Error Response Codes: computeFault (400, 500),
140
    #                       serviceUnavailable (503),
141
    #                       unauthorized (401),
142
    #                       badRequest (400),
143
    #                       badMediaType(415),
144
    #                       itemNotFound (404),
145
    #                       buildInProgress (409),
146
    #                       serverCapacityUnavailable (503),
147
    #                       overLimit (413),
148
    #                       resizeNotAllowed (403)
149

    
150
    raise ResizeNotAllowed()