Revision aa197ee4 api/servers.py

b/api/servers.py
88 88
        d['created'] = isoformat(vm.created)
89 89
        d['flavorRef'] = vm.flavor.id
90 90
        d['imageRef'] = vm.sourceimage.id
91
        
91

  
92 92
        metadata = metadata_to_dict(vm)
93 93
        if metadata:
94 94
            d['metadata'] = {'values': metadata}
95
        
95

  
96 96
        addresses = [address_to_dict(vm.ipfour, vm.ipsix)]
97 97
        addresses.extend({'id': str(network.id), 'values': []} for network in vm.network_set.all())
98 98
        d['addresses'] = {'values': addresses}
......
105 105
    else:
106 106
        data = json.dumps({'server': server})
107 107
    return HttpResponse(data, status=status)
108
    
108

  
109 109

  
110 110
@api_method('GET')
111 111
def list_servers(request, detail=False):
......
115 115
    #                       unauthorized (401),
116 116
    #                       badRequest (400),
117 117
    #                       overLimit (413)
118
    
118

  
119 119
    since = isoparse(request.GET.get('changes-since'))
120
    
120

  
121 121
    if since:
122 122
        user_vms = VirtualMachine.objects.filter(owner=request.user, updated__gte=since)
123 123
        if not user_vms:
......
125 125
    else:
126 126
        user_vms = VirtualMachine.objects.filter(owner=request.user, deleted=False)
127 127
    servers = [vm_to_dict(server, detail) for server in user_vms]
128
    
128

  
129 129
    if request.serialization == 'xml':
130 130
        data = render_to_string('list_servers.xml', {'servers': servers, 'detail': detail})
131 131
    else:
132 132
        data = json.dumps({'servers': {'values': servers}})
133
    
133

  
134 134
    return HttpResponse(data, status=200)
135 135

  
136 136
@api_method('POST')
......
144 144
    #                       badRequest (400),
145 145
    #                       serverCapacityUnavailable (503),
146 146
    #                       overLimit (413)
147
    
147

  
148 148
    req = get_request_dict(request)
149
    
149

  
150 150
    try:
151 151
        server = req['server']
152 152
        name = server['name']
......
156 156
        flavor_id = server['flavorRef']
157 157
    except (KeyError, AssertionError):
158 158
        raise BadRequest('Malformed request.')
159
    
159

  
160 160
    image = get_image(image_id, request.user)
161 161
    flavor = get_flavor(flavor_id)
162
    
162

  
163 163
    # We must save the VM instance now, so that it gets a valid vm.backend_id.
164 164
    vm = VirtualMachine.objects.create(
165 165
        name=name,
......
168 168
        ipfour='0.0.0.0',
169 169
        ipsix='::1',
170 170
        flavor=flavor)
171
    
171

  
172 172
    password = random_password()
173
                
173

  
174 174
    try:
175 175
        create_instance(vm, flavor, password)
176 176
    except GanetiApiError:
177 177
        vm.delete()
178 178
        raise ServiceUnavailable('Could not create server.')
179
        
179

  
180 180
    for key, val in metadata.items():
181 181
        VirtualMachineMetadata.objects.create(meta_key=key, meta_value=val, vm=vm)
182
    
182

  
183 183
    logging.info('created vm with %s cpus, %s ram and %s storage',
184 184
                    flavor.cpu, flavor.ram, flavor.disk)
185
    
185

  
186 186
    server = vm_to_dict(vm, detail=True)
187 187
    server['status'] = 'BUILD'
188 188
    server['adminPass'] = password
......
197 197
    #                       badRequest (400),
198 198
    #                       itemNotFound (404),
199 199
    #                       overLimit (413)
200
    
200

  
201 201
    vm = get_vm(server_id, request.user)
202 202
    server = vm_to_dict(vm, detail=True)
203 203
    return render_server(request, server)
......
213 213
    #                       itemNotFound (404),
214 214
    #                       buildInProgress (409),
215 215
    #                       overLimit (413)
216
    
216

  
217 217
    req = get_request_dict(request)
218
    
218

  
219 219
    try:
220 220
        name = req['server']['name']
221 221
    except (TypeError, KeyError):
222 222
        raise BadRequest('Malformed request.')
223
    
223

  
224 224
    vm = get_vm(server_id, request.user)
225 225
    vm.name = name
226 226
    vm.save()
227
    
227

  
228 228
    return HttpResponse(status=204)
229 229

  
230 230
@api_method('DELETE')
......
237 237
    #                       unauthorized (401),
238 238
    #                       buildInProgress (409),
239 239
    #                       overLimit (413)
240
    
240

  
241 241
    vm = get_vm(server_id, request.user)
242 242
    delete_instance(vm)
243 243
    return HttpResponse(status=204)
......
248 248
    req = get_request_dict(request)
249 249
    if len(req) != 1:
250 250
        raise BadRequest('Malformed request.')
251
    
251

  
252 252
    key = req.keys()[0]
253 253
    val = req[key]
254
    
254

  
255 255
    try:
256 256
        assert isinstance(val, dict)
257 257
        return server_actions[key](request, vm, req[key])
......
268 268
    #                       unauthorized (401),
269 269
    #                       badRequest (400),
270 270
    #                       overLimit (413)
271
    
271

  
272 272
    vm = get_vm(server_id, request.user)
273 273
    addresses = [address_to_dict(vm.ipfour, vm.ipsix)]
274
    
274

  
275 275
    if request.serialization == 'xml':
276 276
        data = render_to_string('list_addresses.xml', {'addresses': addresses})
277 277
    else:
278 278
        data = json.dumps({'addresses': {'values': addresses}})
279
    
279

  
280 280
    return HttpResponse(data, status=200)
281 281

  
282 282
@api_method('GET')
......
288 288
    #                       badRequest (400),
289 289
    #                       itemNotFound (404),
290 290
    #                       overLimit (413)
291
    
291

  
292 292
    vm = get_vm(server_id, request.user)
293 293
    if network_id != 'public':
294 294
        raise ItemNotFound('Unknown network.')
295
    
295

  
296 296
    address = address_to_dict(vm.ipfour, vm.ipsix)
297
    
297

  
298 298
    if request.serialization == 'xml':
299 299
        data = render_to_string('address.xml', {'address': address})
300 300
    else:
301 301
        data = json.dumps({'network': address})
302
    
302

  
303 303
    return HttpResponse(data, status=200)
304 304

  
305 305
@api_method('GET')
......
333 333
        assert isinstance(metadata, dict)
334 334
    except (KeyError, AssertionError):
335 335
        raise BadRequest('Malformed request.')
336
    
336

  
337 337
    updated = {}
338
    
338

  
339 339
    for key, val in metadata.items():
340 340
        try:
341 341
            meta = VirtualMachineMetadata.objects.get(meta_key=key, vm=vm)
......
344 344
            updated[key] = val
345 345
        except VirtualMachineMetadata.DoesNotExist:
346 346
            pass    # Ignore non-existent metadata
347
    
347

  
348 348
    return render_metadata(request, updated, status=201)
349 349

  
350 350
@api_method('GET')
......
356 356
    #                       itemNotFound (404),
357 357
    #                       badRequest (400),
358 358
    #                       overLimit (413)
359
    
359

  
360 360
    vm = get_vm(server_id, request.user)
361 361
    meta = get_vm_meta(vm, key)
362 362
    return render_meta(request, meta, status=200)
......
382 382
        assert key in metadict
383 383
    except (KeyError, AssertionError):
384 384
        raise BadRequest('Malformed request.')
385
    
385

  
386 386
    meta, created = VirtualMachineMetadata.objects.get_or_create(meta_key=key, vm=vm)
387 387
    meta.meta_value = metadict[key]
388 388
    meta.save()
......
399 399
    #                       buildInProgress (409),
400 400
    #                       badMediaType(415),
401 401
    #                       overLimit (413),
402
    
402

  
403 403
    vm = get_vm(server_id, request.user)
404 404
    meta = get_vm_meta(vm, key)
405 405
    meta.delete()

Also available in: Unified diff