Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / neutron / port_views.py @ d6b24130

History | View | Annotate | Download (4.2 kB)

1
from django.http import HttpResponse
2
from django.utils import simplejson as json
3
from django.db import transaction
4
from django.db.models import Q
5
from synnefo.db.pools import EmptyPool
6
from synnefo.db.utils import validate_mac
7
from django.conf import settings
8
from snf_django.lib import api
9
from snf_django.lib.api import utils
10
from synnefo.logic import backend
11
from django.template.loader import render_to_string
12
from synnefo.api import util
13
from models import NetworkInterface
14

    
15
from logging import getLogger
16

    
17

    
18

    
19
log = getLogger(__name__)
20

    
21
def demux(request):
22
    if request.method == 'GET':
23
        return HttpResponse("list ports")
24
        #return list_ports(request)
25
    elif request.method == 'POST':
26
        #return create_port(request)
27
        return HttpResponse("create port")
28
    else:
29
        return api.api_method_not_allowed(request)
30

    
31
def port_demux(request,offset):
32

    
33
    if request.method == 'GET':
34
        return HttpResponse("get single port")
35
        #return get_port(request,offset)
36
    elif request.method == 'DELETE':
37
        return HttpResponse("delete port")
38
        #return delete_port(request,offset)
39
    elif request.method == 'PUT':
40
        return HttpResponse("put port")
41
        #return update_port(request,offset)
42
    else:
43
        return api.api_method_not_allowed(request)
44
"""
45
@api.api_method(http_method='GET', user_required=True, logger=log)
46
def list_ports(request):
47
    log.debug('list_networks')
48

49
    user_networks = Network.objects.filter(Q(userid=request.user_uniq) |
50
            Q(public=True))
51

52
    user_networks = user_networks.filter(deleted=False)
53

54
    networks = [network_to_dict(network)
55
                for network in user_networks.order_by('id')]
56

57
    if request.serialization == 'xml':
58
        data = render_to_string('list_networks.xml', {
59
            'networks': networks })
60
    else:
61
        data = json.dumps({'networks': networks})
62

63
    return HttpResponse(data, status=200)
64
"""
65
@api.api_method(http_method='POST', user_required=True, logger=log)
66
@transaction.commit_manually
67
def create_port (request):
68
    '''
69
    '''
70

    
71
    try:
72
        user_id = request.user_uniq
73
        req = utils.get_request_dict(request)
74
        log.info('create_network %s', req)
75
        try:
76
             d = req['port']
77
             name = d['name']
78
        except KeyError:
79
             raise api.faults.BadRequest("Malformed request")
80

    
81
        flavor = d.get("type", None)
82
        if flavor is None:
83
            #raise faults.BadRequest("Missing request parameter 'type'")
84
            # set default flavor
85
            #FIX ME!!!
86
            flavor="MAC_FILTERED"
87
            log.info("not found flavor")
88
        elif flavor not in Network.FLAVORS.keys():
89
            raise api.faults.BadRequest("Invalid network type '%s'" % flavor)
90
            log.info("found flavor 1")
91
        elif flavor not in settings.API_ENABLED_NETWORK_FLAVORS:
92
            log.info("found flavor2")
93
            raise api.faults.Forbidden("Can not create network of type '%s'" %flavor)
94
        # Get and validate flavor. Flavors are still exposed as 'type' in the
95
        # API.
96

    
97
        try:
98
            mode, link, mac_prefix, tags = util.values_from_flavor(flavor)
99
            validate_mac(mac_prefix + "0:00:00:00")
100
            network = Network.objects.create(
101
                name=name,
102
                userid=user_id,
103
                flavor=flavor,
104
                mode=mode,
105
                link=link,
106
                mac_prefix=mac_prefix,
107
                tags=tags,
108
                action='CREATE',
109
                state='ACTIVE')
110
        except EmptyPool:
111
            log.error("Failed to allocate resources for network of type: %s",
112
            flavor)
113
            raise api.faults.ServiceUnavailable("Failed to allocate network"
114
                " resources")
115

    
116
        # Issue commission to Quotaholder and accept it since at the end of
117
        # this transaction the Network object will be created in the DB.
118
        # Note: the following call does a commit!
119
        #quotas.issue_and_accept_commission(network)
120
        # COME BACK....
121

    
122
    except:
123
        transaction.rollback()
124
        log.info("roll")
125
        raise
126
    else:
127
        transaction.commit()
128
        log.info("commit")
129
    networkdict = network_to_dict(network)
130
    response = render_network(request, networkdict, status=201)
131

    
132
    return response
133