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 |
|