Revision 77f0fa63 snf-cyclades-app/synnefo/api/actions.py

b/snf-cyclades-app/synnefo/api/actions.py
34 34
from socket import getfqdn
35 35
from vncauthproxy.client import request_forwarding as request_vnc_forwarding
36 36

  
37
from django.db import transaction
37 38
from django.conf import settings
38 39
from django.http import HttpResponse
39 40
from django.template.loader import render_to_string
......
42 43
from synnefo.api.faults import (BadRequest, ServiceUnavailable,
43 44
                                ItemNotFound, BuildInProgress)
44 45
from synnefo.api.util import random_password, get_vm, get_nic_from_index
45
from synnefo.db.models import NetworkInterface
46
from synnefo.logic import backend
46
from synnefo.db.models import NetworkInterface, Network
47
from synnefo.logic import backend, ippool
47 48
from synnefo.logic.utils import get_rsapi_state
48 49

  
49 50

  
......
289 290

  
290 291

  
291 292
@network_action('add')
293
@transaction.commit_on_success
292 294
def add(request, net, args):
293 295
    # Normal Response Code: 202
294 296
    # Error Response Codes: computeFault (400, 500),
......
303 305
    if not server_id:
304 306
        raise BadRequest('Malformed Request.')
305 307
    vm = get_vm(server_id, request.user_uniq)
306
    backend.connect_to_network(vm, net)
308

  
309
    #Dummy write to enforce isolation
310
    Network.objects.filter(id=net.id).update(id=net.id)
311
    net = Network.objects.get(id=net.id)
312
    # Get a free IP from the address pool.
313
    pool = ippool.IPPool(net)
314
    try:
315
        address = pool.get_free_address()
316
    except ippool.IPPool.IPPoolExhausted:
317
        raise ServiceUnavailable('Network is full')
318
    pool.save()
319

  
320
    backend.connect_to_network(vm, net, address)
307 321
    return HttpResponse(status=202)
308 322

  
323

  
309 324
@network_action('remove')
310 325
def remove(request, net, args):
311 326
    # Normal Response Code: 202

Also available in: Unified diff