Revision 207b70d5

b/api/networks.py
41 41

  
42 42

  
43 43
def network_to_dict(network, detail=True):
44
    d = {'id': network.id, 'name': network.name}
44
    network_id = str(network.id) if not network.public else 'public'
45
    d = {'id': network_id, 'name': network.name}
45 46
    if detail:
46 47
        d['updated'] = isoformat(network.updated)
47 48
        d['created'] = isoformat(network.created)
......
145 146
        raise BadRequest('Malformed request.')
146 147

  
147 148
    net = get_network(network_id, request.user)
149
    if net.public:
150
        raise Unauthorized('Can not rename the public network.')
148 151
    net.name = name
149 152
    net.save()
150 153
    return HttpResponse(status=204)
......
159 162
    #                       unauthorized (401),
160 163
    #                       overLimit (413)
161 164
    
162
    if network_id in ('1', 'public'):
163
        raise Unauthorized('Can not delete the public network.')
164 165
    net = get_network(network_id, request.user)
166
    if net.public:
167
        raise Unauthorized('Can not delete the public network.')
165 168
    backend.delete_network(net)
166 169
    return HttpResponse(status=204)
167 170

  
168 171
@api_method('POST')
169 172
def network_action(request, network_id):
170 173
    net = get_network(network_id, request.user)
174
    if net.public:
175
        raise Unauthorized('Can not modify the public network.')
176
    
171 177
    req = get_request_dict(request)
172 178
    if len(req) != 1:
173 179
        raise BadRequest('Malformed request.')
b/api/servers.py
71 71

  
72 72

  
73 73
def nic_to_dict(nic):
74
    d = {
75
        'id': nic.network.id,
76
        'name': nic.network.name,
77
        'mac': nic.mac,
78
        'firewallProfile': nic.firewall_profile}
74
    network = nic.network
75
    network_id = str(network.id) if not network.public else 'public'
76
    d = {'id': network_id, 'name': network.name, 'mac': nic.mac}
77
    if nic.firewall_profile:
78
        d['firewallProfile'] = nic.firewall_profile
79 79
    if nic.ipv4 or nic.ipv6:
80 80
        d['values'] = []
81 81
        if nic.ipv4:
......
104 104
            d['metadata'] = {'values': metadata}
105 105

  
106 106
        addresses = [nic_to_dict(nic) for nic in vm.nics.all()]
107
        d['addresses'] = {'values': addresses}
107
        if addresses:
108
            d['addresses'] = {'values': addresses}
108 109
    return d
109 110

  
110 111

  
b/api/tests.py
500 500
        return reply
501 501

  
502 502
    def get_network_details(self, network_id):
503
        path = '/api/v1.1/networks/%d' % network_id
503
        path = '/api/v1.1/networks/%s' % network_id
504 504
        response = self.client.get(path)
505 505
        self.assertEqual(response.status_code, 200)
506 506
        reply = json.loads(response.content)
......
508 508
        return reply['network']
509 509

  
510 510
    def update_network_name(self, network_id, new_name):
511
        path = '/api/v1.1/networks/%d' % network_id
511
        path = '/api/v1.1/networks/%s' % network_id
512 512
        data = json.dumps({'network': {'name': new_name}})
513 513
        response = self.client.put(path, data, content_type='application/json')
514 514
        self.assertEqual(response.status_code, 204)
515 515

  
516 516
    def delete_network(self, network_id):
517
        path = '/api/v1.1/networks/%d' % network_id
517
        path = '/api/v1.1/networks/%s' % network_id
518 518
        response = self.client.delete(path)
519 519
        self.assertEqual(response.status_code, 204)
520 520

  
521 521
    def add_to_network(self, network_id, server_id):
522
        path = '/api/v1.1/networks/%d/action' % network_id
522
        path = '/api/v1.1/networks/%s/action' % network_id
523 523
        data = json.dumps({'add': {'serverRef': server_id}})
524 524
        response = self.client.post(path, data, content_type='application/json')
525 525
        self.assertEqual(response.status_code, 202)
526 526

  
527 527
    def remove_from_network(self, network_id, server_id):
528
        path = '/api/v1.1/networks/%d/action' % network_id
528
        path = '/api/v1.1/networks/%s/action' % network_id
529 529
        data = json.dumps({'remove': {'serverRef': server_id}})
530 530
        response = self.client.post(path, data, content_type='application/json')
531 531
        self.assertEqual(response.status_code, 202)
......
865 865
    def test_list_networks(self):
866 866
        networks = self.list_networks()
867 867
        for net in Network.objects.all():
868
            network = popdict(networks, id=net.id)
868
            net_id = str(net.id) if not net.public else 'public'
869
            network = popdict(networks, id=net_id)
869 870
            self.assertEqual(network['name'], net.name)
870 871
        self.assertEqual(networks, [])
871 872

  
872 873
    def test_list_networks_detail(self):
873 874
        networks = self.list_networks(detail=True)
874 875
        for net in Network.objects.all():
875
            network = popdict(networks, id=net.id)
876
            net_id = str(net.id) if not net.public else 'public'
877
            network = popdict(networks, id=net_id)
876 878
            self.assertEqual(network['name'], net.name)
877 879
            machines = set(vm.id for vm in net.machines.all())
878 880
            self.assertEqual(set(network['servers']['values']), machines)
......
914 916

  
915 917

  
916 918
class UpdateNetworkName(BaseTestCase):
917
    NETWORKS = 5
918

  
919 919
    def test_update_network_name(self):
920
        name = 'net'
921
        self.create_network(name)
920 922
        networks = self.list_networks(detail=True)
921
        network = choice(networks)
923
        priv = [net for net in networks if net['id'] != 'public']
924
        network = choice(priv)
922 925
        network_id = network['id']
923 926
        new_name = network['name'] + '_2'
924 927
        self.update_network_name(network_id, new_name)
......
936 939
            self.create_network('net%d' % i)
937 940
        
938 941
        networks = self.list_networks()
939
        network = choice(networks)
940
        while network['id'] == 1:
941
            network = choice(networks)
942
        priv = [net for net in networks if net['id'] != 'public']
943
        network = choice(priv)
942 944
        network_id = network['id']
943 945
        self.delete_network(network_id)
944 946
        
945 947
        net = self.get_network_details(network_id)
946 948
        self.assertEqual(net['status'], 'DELETED')
947 949

  
948
        networks.remove(network)
949
        self.assertEqual(self.list_networks(), networks)
950
        priv.remove(network)
951
        networks = self.list_networks()
952
        new_priv = [net for net in networks if net['id'] != 'public']
953
        self.assertEqual(priv, new_priv)
950 954

  
951 955

  
952 956
class NetworkActions(BaseTestCase):
b/api/util.py
122 122

  
123 123
    try:
124 124
        if network_id == 'public':
125
            network_id = 0
126
        network = Network.objects.get(id=network_id)
127
        if not network.public and network.owner != owner:
128
            raise ItemNotFound('Network not found.')
129
        return network
125
            return Network.objects.get(public=True)
126
        else:
127
            network_id = int(network_id)
128
            return Network.objects.get(id=network_id, owner=owner)
130 129
    except ValueError:
131 130
        raise BadRequest('Invalid network ID.')
132 131
    except Network.DoesNotExist:
b/logic/backend.py
5 5
#
6 6

  
7 7
from django.conf import settings
8
from django.db import transaction
9

  
8 10
from synnefo.db.models import VirtualMachine, Network, NetworkLink
9 11
from synnefo.logic import utils
10 12
from synnefo.util.rapi import GanetiRapiClient
......
45 47
    vm.save()
46 48

  
47 49

  
50
@transaction.commit_on_success
48 51
def process_net_status(vm, nics):
49 52
    """Process a net status notification from the backend
50 53

  
......
154 157
        return NetworkLink.objects.create(index=index, name=name, available=True)
155 158
    return None     # All link slots are filled
156 159

  
160
@transaction.commit_on_success
157 161
def create_network(net):
158 162
    try:
159 163
        link = NetworkLink.objects.filter(available=True)[0]
......
166 170
    link.save()
167 171
    return True
168 172

  
173
@transaction.commit_on_success
169 174
def delete_network(net):
170 175
    link = net.link
171 176
    link.available = True
b/tools/cloud
29 29
        if 'values' in net:
30 30
            addr = '[%s]' % ' '.join(ip['addr'] for ip in net['values'])
31 31
        
32
        val = '%d/%s %s %s' % (net['id'], net['name'], net['mac'], addr)
32
        val = '%s/%s %s %s' % (net['id'], net['name'], net['mac'], addr)
33 33
        print '%s %s' % (key, val)
34 34

  
35 35
def print_dict(d, show_empty=True):

Also available in: Unified diff