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

b/snf-cyclades-app/synnefo/neutron/port_views.py
10 10
from synnefo.logic import backend
11 11
from django.template.loader import render_to_string
12 12
from synnefo.api import util
13
from models import NetworkInterface
13
from models import NetworkInterface, SecurityGroup
14 14

  
15 15
from logging import getLogger
16 16

  
......
19 19

  
20 20
def demux(request):
21 21
    if request.method == 'GET':
22
        return HttpResponse("list ports")
23
        #return list_ports(request)
22
        #return HttpResponse("list ports")
23
        return list_ports(request)
24 24
    elif request.method == 'POST':
25 25
        #return create_port(request)
26 26
        return HttpResponse("create port")
......
31 31
def port_demux(request, offset):
32 32

  
33 33
    if request.method == 'GET':
34
        return HttpResponse("get single port")
35
        #return get_port(request,offset)
34
        #return HttpResponse("get single port")
35
        return get_port(request,offset)
36 36
    elif request.method == 'DELETE':
37
        return HttpResponse("delete port")
38
        #return delete_port(request,offset)
37
        #return HttpResponse("delete port")
38
        return delete_port(request,offset)
39 39
    elif request.method == 'PUT':
40
        return HttpResponse("put port")
41
        #return update_port(request,offset)
40
        #return HttpResponse("put port")
41
        return update_port(request,offset)
42 42
    else:
43 43
        return api.api_method_not_allowed(request)
44

  
45

  
46
@api.api_method(http_method='GET', user_required=True, logger=log)
47
def list_ports(request, detail=False):
48

  
49
    log.debug('list_ports detail=%s', detail)
50

  
51
    user_ports = NetworkInterface.objects.filter(network__userid=request.user_uniq)
52

  
53
    user_ports = utils.filter_modified_since(request, objects=user_ports)
54

  
55
    ports = [port_to_dict(network, detail)
56
        for port in user_ports.order_by('id')]
57

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

  
64
    return HttpResponse(data, status=200)
65

  
66

  
67
@api.api_method(http_method='GET', user_required=True, logger=log)
68
def get_port(request, port_id):
69
    log.debug('get_port_details %s', port_id)
70
    port = get_port_fromdb(port_id, request.user_uniq)
71

  
72
    #needs discussion
73
    if port.deleted:
74
        raise api.faults.BadRequest("Port has been deleted.")
75
    else:
76
        portdict = port_to_dict(port)
77
    return render_port(request, portdict)
78

  
79

  
80

  
81
@api.api_method(http_method='DELETE', user_required=True, logger=log)
82
@transaction.commit_on_success
83
def delete_port(request, port_id):
84
    log.info('delete_port %s', port_id)
85
    port = get_port_fromdb(port_id, request.user_uniq, for_update=True)
86

  
87

  
88
    if port.deleted:
89
        raise api.faults.BadRequest("Network has been deleted.")
90

  
91

  
92
    '''
93
    skip the backend part...
94
    release the ips associated with the port
95
    '''
96

  
97
    #the following has to leave when fix the backend thing
98
    port.deleted = True
99
    port.save()
100

  
101
    return HttpResponse(status=204)
102

  
103

  
104
@api.api_method(http_method='PUT', user_required=True, logger=log)
105
def update_port(request, port_id):
106
    '''
107
    You can update only name, admin_state_up, security_groups
108
    '''
109
    port = get_port_fromdb(port_id, request.user_uniq, for_update=True)
110
    info = utils.get_request_dict(request)
111
    try:
112
        info = info["port"]
113
    except KeyError:
114
        raise api.faults.BadRequest("Malformed request")
115

  
116
    try:
117
        name = info['name']
118
        port.name = name
119
    except KeyError:
120
        pass
121
    sg_list = []
122
    try:
123
        s_groups = info['security_groups']
124
        #validate security groups
125
        # like get security group from db
126
        for gid in s_groups:
127
            try:
128
                sg = SecurityGroup.objects.get(id=int(gid))
129
                sg_list.append(sg)
130
            except (ValueError, SecurityGroup.DoesNotExist):
131
                raise api.faults.ItemNotFound("Not valid security group")
132

  
133
        #clear the old security groups
134
        port.security_groups.clear()
135

  
136
        #add the new groups
137
        for group in sg_list:
138
            port.security_groups.add(group)
139
    except KeyError:
140
        pass
141

  
142
    port.save()
143
    portdict = port_to_dict(port)
144
    return render_port(request, portdict, 200)
145

  
146

  
147

  
148
#util functions
149

  
150

  
151
def port_to_dict(port, detail=True):
152
    d = {'id': str(port.id), 'name': port.name}
153
    if detail:
154
        d['user_id'] = port.network.userid
155
        d['tenant_id'] = port.network.userid
156
        d['device_id'] = port.machine.id
157
        d['admin_state_up'] = "true"
158
        d['mac_address'] = port.mac
159
        d['status'] = port.state
160
        if port.subnet:
161
            d['fixed_ips'] = [{"ip_address" :port.ipv4, "subnet" :port.subnet.id}]
162
        else:
163
            d['fixed_ips'] = []
164
        d['security_groups'] = [str(sg.id) for sg in port.security_groups.all()]
165
    return d
166

  
167

  
168

  
169
def render_port(request, portdict, status=200):
170
    if request.serialization == 'xml':
171
        data = render_to_string('network.xml', {'port': portdict})
172
    else:
173
        data = json.dumps({'port': portdict})
174
    return HttpResponse(data, status=status)
175

  
176
def get_port_fromdb(port_id, user_id, for_update=False):
177
    """
178
    Return a NetworkInteface instance or raise ItemNotFound.
179
    This is the same as util.get_network
180
    """
181
    try:
182
        port_id = int(port_id)
183
        objects = NetworkInterface.objects
184
        if for_update:
185
            objects = objects.select_for_update()
186

  
187
        return objects.get(network__userid=user_id, id=port_id)
188
    except (ValueError, NetworkInterface.DoesNotExist):
189
        raise api.faults.ItemNotFound('Port not found.')

Also available in: Unified diff