Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.4 kB)

1 d6b24130 Marios Kogias
from django.http import HttpResponse
2 d6b24130 Marios Kogias
from django.utils import simplejson as json
3 d6b24130 Marios Kogias
from django.db import transaction
4 d6b24130 Marios Kogias
from django.db.models import Q
5 d6b24130 Marios Kogias
from synnefo.db.pools import EmptyPool
6 d6b24130 Marios Kogias
from synnefo.db.utils import validate_mac
7 d6b24130 Marios Kogias
from django.conf import settings
8 d6b24130 Marios Kogias
from snf_django.lib import api
9 d6b24130 Marios Kogias
from snf_django.lib.api import utils
10 d6b24130 Marios Kogias
from synnefo.logic import backend
11 d6b24130 Marios Kogias
from django.template.loader import render_to_string
12 d6b24130 Marios Kogias
from synnefo.api import util
13 633f6952 Marios Kogias
from models import NetworkInterface, SecurityGroup
14 d6b24130 Marios Kogias
15 d6b24130 Marios Kogias
from logging import getLogger
16 d6b24130 Marios Kogias
17 d6b24130 Marios Kogias
log = getLogger(__name__)
18 d6b24130 Marios Kogias
19 d6e16760 Marios Kogias
20 d6b24130 Marios Kogias
def demux(request):
21 d6b24130 Marios Kogias
    if request.method == 'GET':
22 633f6952 Marios Kogias
        #return HttpResponse("list ports")
23 633f6952 Marios Kogias
        return list_ports(request)
24 d6b24130 Marios Kogias
    elif request.method == 'POST':
25 d6b24130 Marios Kogias
        #return create_port(request)
26 d6b24130 Marios Kogias
        return HttpResponse("create port")
27 d6b24130 Marios Kogias
    else:
28 d6b24130 Marios Kogias
        return api.api_method_not_allowed(request)
29 d6b24130 Marios Kogias
30 d6e16760 Marios Kogias
31 d6e16760 Marios Kogias
def port_demux(request, offset):
32 d6b24130 Marios Kogias
33 d6b24130 Marios Kogias
    if request.method == 'GET':
34 633f6952 Marios Kogias
        #return HttpResponse("get single port")
35 633f6952 Marios Kogias
        return get_port(request,offset)
36 d6b24130 Marios Kogias
    elif request.method == 'DELETE':
37 633f6952 Marios Kogias
        #return HttpResponse("delete port")
38 633f6952 Marios Kogias
        return delete_port(request,offset)
39 d6b24130 Marios Kogias
    elif request.method == 'PUT':
40 633f6952 Marios Kogias
        #return HttpResponse("put port")
41 633f6952 Marios Kogias
        return update_port(request,offset)
42 d6b24130 Marios Kogias
    else:
43 d6b24130 Marios Kogias
        return api.api_method_not_allowed(request)
44 633f6952 Marios Kogias
45 633f6952 Marios Kogias
46 633f6952 Marios Kogias
@api.api_method(http_method='GET', user_required=True, logger=log)
47 633f6952 Marios Kogias
def list_ports(request, detail=False):
48 633f6952 Marios Kogias
49 633f6952 Marios Kogias
    log.debug('list_ports detail=%s', detail)
50 633f6952 Marios Kogias
51 633f6952 Marios Kogias
    user_ports = NetworkInterface.objects.filter(network__userid=request.user_uniq)
52 633f6952 Marios Kogias
53 633f6952 Marios Kogias
    user_ports = utils.filter_modified_since(request, objects=user_ports)
54 633f6952 Marios Kogias
55 633f6952 Marios Kogias
    ports = [port_to_dict(network, detail)
56 633f6952 Marios Kogias
        for port in user_ports.order_by('id')]
57 633f6952 Marios Kogias
58 633f6952 Marios Kogias
    if request.serialization == 'xml':
59 633f6952 Marios Kogias
        data = render_to_string('list_networks.xml', {
60 633f6952 Marios Kogias
            "ports": ports})
61 633f6952 Marios Kogias
    else:
62 633f6952 Marios Kogias
        data = json.dumps({'ports': ports})
63 633f6952 Marios Kogias
64 633f6952 Marios Kogias
    return HttpResponse(data, status=200)
65 633f6952 Marios Kogias
66 633f6952 Marios Kogias
67 633f6952 Marios Kogias
@api.api_method(http_method='GET', user_required=True, logger=log)
68 633f6952 Marios Kogias
def get_port(request, port_id):
69 633f6952 Marios Kogias
    log.debug('get_port_details %s', port_id)
70 633f6952 Marios Kogias
    port = get_port_fromdb(port_id, request.user_uniq)
71 633f6952 Marios Kogias
72 633f6952 Marios Kogias
    #needs discussion
73 633f6952 Marios Kogias
    if port.deleted:
74 633f6952 Marios Kogias
        raise api.faults.BadRequest("Port has been deleted.")
75 633f6952 Marios Kogias
    else:
76 633f6952 Marios Kogias
        portdict = port_to_dict(port)
77 633f6952 Marios Kogias
    return render_port(request, portdict)
78 633f6952 Marios Kogias
79 633f6952 Marios Kogias
80 633f6952 Marios Kogias
81 633f6952 Marios Kogias
@api.api_method(http_method='DELETE', user_required=True, logger=log)
82 633f6952 Marios Kogias
@transaction.commit_on_success
83 633f6952 Marios Kogias
def delete_port(request, port_id):
84 633f6952 Marios Kogias
    log.info('delete_port %s', port_id)
85 633f6952 Marios Kogias
    port = get_port_fromdb(port_id, request.user_uniq, for_update=True)
86 633f6952 Marios Kogias
87 633f6952 Marios Kogias
88 633f6952 Marios Kogias
    if port.deleted:
89 633f6952 Marios Kogias
        raise api.faults.BadRequest("Network has been deleted.")
90 633f6952 Marios Kogias
91 633f6952 Marios Kogias
92 633f6952 Marios Kogias
    '''
93 633f6952 Marios Kogias
    skip the backend part...
94 633f6952 Marios Kogias
    release the ips associated with the port
95 633f6952 Marios Kogias
    '''
96 633f6952 Marios Kogias
97 633f6952 Marios Kogias
    #the following has to leave when fix the backend thing
98 633f6952 Marios Kogias
    port.deleted = True
99 633f6952 Marios Kogias
    port.save()
100 633f6952 Marios Kogias
101 633f6952 Marios Kogias
    return HttpResponse(status=204)
102 633f6952 Marios Kogias
103 633f6952 Marios Kogias
104 633f6952 Marios Kogias
@api.api_method(http_method='PUT', user_required=True, logger=log)
105 633f6952 Marios Kogias
def update_port(request, port_id):
106 633f6952 Marios Kogias
    '''
107 633f6952 Marios Kogias
    You can update only name, admin_state_up, security_groups
108 633f6952 Marios Kogias
    '''
109 633f6952 Marios Kogias
    port = get_port_fromdb(port_id, request.user_uniq, for_update=True)
110 633f6952 Marios Kogias
    info = utils.get_request_dict(request)
111 633f6952 Marios Kogias
    try:
112 633f6952 Marios Kogias
        info = info["port"]
113 633f6952 Marios Kogias
    except KeyError:
114 633f6952 Marios Kogias
        raise api.faults.BadRequest("Malformed request")
115 633f6952 Marios Kogias
116 633f6952 Marios Kogias
    try:
117 633f6952 Marios Kogias
        name = info['name']
118 633f6952 Marios Kogias
        port.name = name
119 633f6952 Marios Kogias
    except KeyError:
120 633f6952 Marios Kogias
        pass
121 633f6952 Marios Kogias
    sg_list = []
122 633f6952 Marios Kogias
    try:
123 633f6952 Marios Kogias
        s_groups = info['security_groups']
124 633f6952 Marios Kogias
        #validate security groups
125 633f6952 Marios Kogias
        # like get security group from db
126 633f6952 Marios Kogias
        for gid in s_groups:
127 633f6952 Marios Kogias
            try:
128 633f6952 Marios Kogias
                sg = SecurityGroup.objects.get(id=int(gid))
129 633f6952 Marios Kogias
                sg_list.append(sg)
130 633f6952 Marios Kogias
            except (ValueError, SecurityGroup.DoesNotExist):
131 633f6952 Marios Kogias
                raise api.faults.ItemNotFound("Not valid security group")
132 633f6952 Marios Kogias
133 633f6952 Marios Kogias
        #clear the old security groups
134 633f6952 Marios Kogias
        port.security_groups.clear()
135 633f6952 Marios Kogias
136 633f6952 Marios Kogias
        #add the new groups
137 633f6952 Marios Kogias
        for group in sg_list:
138 633f6952 Marios Kogias
            port.security_groups.add(group)
139 633f6952 Marios Kogias
    except KeyError:
140 633f6952 Marios Kogias
        pass
141 633f6952 Marios Kogias
142 633f6952 Marios Kogias
    port.save()
143 633f6952 Marios Kogias
    portdict = port_to_dict(port)
144 633f6952 Marios Kogias
    return render_port(request, portdict, 200)
145 633f6952 Marios Kogias
146 633f6952 Marios Kogias
147 633f6952 Marios Kogias
148 633f6952 Marios Kogias
#util functions
149 633f6952 Marios Kogias
150 633f6952 Marios Kogias
151 633f6952 Marios Kogias
def port_to_dict(port, detail=True):
152 633f6952 Marios Kogias
    d = {'id': str(port.id), 'name': port.name}
153 633f6952 Marios Kogias
    if detail:
154 633f6952 Marios Kogias
        d['user_id'] = port.network.userid
155 633f6952 Marios Kogias
        d['tenant_id'] = port.network.userid
156 633f6952 Marios Kogias
        d['device_id'] = port.machine.id
157 633f6952 Marios Kogias
        d['admin_state_up'] = "true"
158 633f6952 Marios Kogias
        d['mac_address'] = port.mac
159 633f6952 Marios Kogias
        d['status'] = port.state
160 633f6952 Marios Kogias
        if port.subnet:
161 633f6952 Marios Kogias
            d['fixed_ips'] = [{"ip_address" :port.ipv4, "subnet" :port.subnet.id}]
162 633f6952 Marios Kogias
        else:
163 633f6952 Marios Kogias
            d['fixed_ips'] = []
164 633f6952 Marios Kogias
        d['security_groups'] = [str(sg.id) for sg in port.security_groups.all()]
165 633f6952 Marios Kogias
    return d
166 633f6952 Marios Kogias
167 633f6952 Marios Kogias
168 633f6952 Marios Kogias
169 633f6952 Marios Kogias
def render_port(request, portdict, status=200):
170 633f6952 Marios Kogias
    if request.serialization == 'xml':
171 633f6952 Marios Kogias
        data = render_to_string('network.xml', {'port': portdict})
172 633f6952 Marios Kogias
    else:
173 633f6952 Marios Kogias
        data = json.dumps({'port': portdict})
174 633f6952 Marios Kogias
    return HttpResponse(data, status=status)
175 633f6952 Marios Kogias
176 633f6952 Marios Kogias
def get_port_fromdb(port_id, user_id, for_update=False):
177 633f6952 Marios Kogias
    """
178 633f6952 Marios Kogias
    Return a NetworkInteface instance or raise ItemNotFound.
179 633f6952 Marios Kogias
    This is the same as util.get_network
180 633f6952 Marios Kogias
    """
181 633f6952 Marios Kogias
    try:
182 633f6952 Marios Kogias
        port_id = int(port_id)
183 633f6952 Marios Kogias
        objects = NetworkInterface.objects
184 633f6952 Marios Kogias
        if for_update:
185 633f6952 Marios Kogias
            objects = objects.select_for_update()
186 633f6952 Marios Kogias
187 633f6952 Marios Kogias
        return objects.get(network__userid=user_id, id=port_id)
188 633f6952 Marios Kogias
    except (ValueError, NetworkInterface.DoesNotExist):
189 633f6952 Marios Kogias
        raise api.faults.ItemNotFound('Port not found.')