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