Revision 882b662f
b/snf-cyclades-app/synnefo/neutron/models.py | ||
---|---|---|
214 | 214 |
|
215 | 215 |
|
216 | 216 |
class Subnet(models.Model): |
217 |
SUBNET_NAME_LENGTH = 128 |
|
218 |
|
|
217 | 219 |
subnet_id = models.CharField('ID of the subnet', max_length=128, |
218 | 220 |
null=True, db_index=True, primary_key=True) |
219 | 221 |
network = models.ForeignKey('Network') |
220 | 222 |
|
221 |
name = models.CharField('Network Name', max_length=128)
|
|
223 |
name = models.CharField('Network Name', max_length=SUBNET_NAME_LENGTH)
|
|
222 | 224 |
ipversion = models.IntegerField('IP Version', default=4) |
223 | 225 |
cidr = models.CharField('Subnet', max_length=32, null=True) |
224 | 226 |
gateway = models.CharField('Gateway', max_length=32, null=True) |
b/snf-cyclades-app/synnefo/neutron/subnet_views.py | ||
---|---|---|
44 | 44 |
|
45 | 45 |
import ipaddr |
46 | 46 |
|
47 |
log = getLogger('synnefo.neutron')
|
|
47 |
log = getLogger(__name__)
|
|
48 | 48 |
|
49 | 49 |
|
50 | 50 |
def demux(request): |
51 | 51 |
if request.method == 'GET': |
52 | 52 |
return list_subnets(request) |
53 | 53 |
elif request.method == 'POST': |
54 |
#return create_network(request) |
|
55 |
return HttpResponse("in subnet POST") |
|
54 |
return create_subnet(request) |
|
56 | 55 |
else: |
57 | 56 |
return api.api_method_not_allowed(request) |
58 | 57 |
|
... | ... | |
61 | 60 |
if request.method == 'GET': |
62 | 61 |
return get_subnet(request, offset) |
63 | 62 |
elif request.method == 'DELETE': |
64 |
return delete_network(request, offset)
|
|
63 |
return delete_subnet(request, offset)
|
|
65 | 64 |
elif request.method == 'PUT': |
66 |
#return update_network(request,offset) |
|
67 |
return HttpResponse("in subnet det put") |
|
65 |
return update_subnet(request, offset) |
|
68 | 66 |
else: |
69 | 67 |
return api.api_method_not_allowed(request) |
70 | 68 |
|
... | ... | |
85 | 83 |
@api.api_method(http_method='POST', user_required=True, logger=log) |
86 | 84 |
def create_subnet(request): |
87 | 85 |
'''Create a subnet''' |
86 |
|
|
87 |
dic = utils.get_request_dict(request) |
|
88 |
log.info('create subnet %s', dic) |
|
88 | 89 |
user_id = request.user_uniq |
89 | 90 |
|
90 | 91 |
try: |
91 |
dic = utils.get_request_dict(request) |
|
92 | 92 |
subnet = dic['subnet'] |
93 | 93 |
network_id = subnet['network_id'] |
94 | 94 |
cidr = subnet['cidr'] |
... | ... | |
97 | 97 |
|
98 | 98 |
ipversion = subnet.get('ip_version', 4) |
99 | 99 |
if ipversion not in [4, 6]: |
100 |
raise api.faults.BadRequests("Malformed IP version type")
|
|
100 |
raise api.faults.BadRequest("Malformed IP version type") |
|
101 | 101 |
|
102 | 102 |
dhcp = subnet.get('enable_dhcp', True) |
103 |
if dhcp not in [True, False]: |
|
104 |
raise api.faults.BadRequest("Malformed request, enable_dhcp must be" |
|
105 |
" True or False") |
|
103 | 106 |
name = subnet.get('name', None) |
107 |
if len(str(name)) > Subnet.SUBNET_NAME_LENGTH: |
|
108 |
raise api.faults.BadRequest("Subnet name too long") |
|
104 | 109 |
|
105 | 110 |
# FIX ME, SNF:gateway6 vs gateway6 |
106 | 111 |
gateway6 = subnet.get('SNF:gateway6', None) |
107 | 112 |
subnet6 = subnet.get('SNF:subnet6', None) |
108 | 113 |
|
109 |
# Returns the first available ip in the subnet
|
|
114 |
# Returns the first available IP in the subnet
|
|
110 | 115 |
potential_gateway = ipaddr.IPv4Network(cidr).network + 1 |
111 | 116 |
gateway = subnet.get('gateway_ip', potential_gateway) |
112 | 117 |
|
113 |
networks.validate_network_params(subnet, gateway, subnet6, gateway6)
|
|
118 |
networks.validate_network_params(cidr, gateway, subnet6, gateway6)
|
|
114 | 119 |
|
120 |
# FIX ME |
|
115 | 121 |
try: |
116 | 122 |
sub = Subnet.objects.create(name=name, network_id=network_id, |
117 | 123 |
cidr=cidr, ipversion=ipversion, |
118 | 124 |
gateway=gateway, gateway6=gateway6, |
119 | 125 |
subnet6=subnet6) |
120 |
# FIX ME |
|
121 | 126 |
except: |
122 | 127 |
print "Error" |
123 | 128 |
|
... | ... | |
140 | 145 |
@api.api_method(http_method='DELETE', user_required=True, logger=log) |
141 | 146 |
def delete_subnet(request, offset): |
142 | 147 |
'''Delete a subnet''' |
143 |
try: |
|
144 |
subnet = Subnet.objects.get(subnet_id=offset) |
|
145 |
except Subnet.DoesNotExist: |
|
146 |
raise api.faults.ItemNotFound("Subnet not found") |
|
148 |
# Commented until we have a design document |
|
149 |
#log.info('delete_subnet %s', offset) |
|
150 |
#try: |
|
151 |
# subnet = Subnet.objects.get(subnet_id=offset) |
|
152 |
#except Subnet.DoesNotExist: |
|
153 |
# raise api.faults.ItemNotFound("Subnet not found") |
|
147 | 154 |
# Add support for 409 error, subnet in use |
148 | 155 |
|
149 |
subnet.delete() |
|
150 |
return HttpResponse(status=204) |
|
156 |
#subnets.delete() |
|
157 |
#return HttpResponse(status=204) |
|
158 |
raise api.faults.BadRequest("Deletion of a subnet is not supported") |
|
151 | 159 |
|
152 | 160 |
|
153 | 161 |
def subnet_to_dict(subnet): |
b/snf-cyclades-app/synnefo/neutron/tests/api.py | ||
---|---|---|
136 | 136 |
response = self.get(url) |
137 | 137 |
self.assertItemNotFound(response) |
138 | 138 |
|
139 |
def test_subnet_delete_not_found(self): |
|
140 |
'''Test delete a subnet that doesn't exist''' |
|
141 |
url = join_urls(SUBNETS_URL, '52') |
|
142 |
response = self.get(url) |
|
143 |
self.assertItemNotFound(response) |
|
139 |
#def test_subnet_delete_not_found(self): |
|
140 |
# '''Test delete a subnet that doesn't exist''' |
|
141 |
# # FIX ME |
|
142 |
# url = join_urls(SUBNETS_URL, '52') |
|
143 |
# response = self.get(url) |
|
144 |
# self.assertItemNotFound(response) |
|
144 | 145 |
|
145 | 146 |
def test_subnet_delete(self): |
146 |
'''Test delete a subnet that's not in use'''
|
|
147 |
'''Test delete a subnet -- not supported'''
|
|
147 | 148 |
url = join_urls(SUBNETS_URL, '42') |
148 | 149 |
response = self.get(url) |
149 | 150 |
self.assertItemNotFound(response) |
150 | 151 |
|
151 | 152 |
def test_create_subnet_with_malformed_ipversion(self): |
152 | 153 |
'''Create a subnet with a malformed ip_version type''' |
153 |
# PEP8 for {{}}? |
|
154 |
request = {'subnet': {'network_id': |
|
155 |
'ed2e3c10-2e43-4297-9006-2863a2d1abbc', |
|
156 |
'cidr': '10.0.3.0/24', |
|
157 |
'ip_version': 8}} |
|
154 |
request = { |
|
155 |
'subnet': { |
|
156 |
'network_id': 'ed2e3c10-2e43-4297-9006-2863a2d1abbc', |
|
157 |
'cidr': '10.0.3.0/24', |
|
158 |
'ip_version': 8} |
|
159 |
} |
|
160 |
response = self.post(SUBNETS_URL, "user9", json.dumps(request), "json") |
|
161 |
self.assertBadRequest(response) |
|
162 |
|
|
163 |
def test_create_subnet_with_invalid_cidr(self): |
|
164 |
'''Create a subnet with an invalid cidr''' |
|
165 |
request = { |
|
166 |
'subnet': { |
|
167 |
'network_id': 'ed2e3c10-2e43-4297-9006-2863a2d1abbc', |
|
168 |
'cidr': '192.168.3.0/8'} |
|
169 |
} |
|
170 |
response = self.post(SUBNETS_URL, "user9", json.dumps(request), "json") |
|
171 |
self.assertBadRequest(response) |
|
158 | 172 |
|
173 |
def test_create_subnet_with_invalid_gateway(self): |
|
174 |
'''Create a subnet with a gateway outside of the subnet range''' |
|
175 |
request = { |
|
176 |
'subnet': { |
|
177 |
'network_id': 'ed2e3c10-2e43-4297-9006-2863a2d1abbc', |
|
178 |
'cidr': '192.168.3.0/24', |
|
179 |
'gateway_ip': '192.168.0.1'} |
|
180 |
} |
|
181 |
response = self.post(SUBNETS_URL, "user9", json.dumps(request), "json") |
|
182 |
self.assertBadRequest(response) |
|
183 |
|
|
184 |
def test_create_subnet_with_long_name(self): |
|
185 |
'''Create a subnet with an invalid subnet name''' |
|
186 |
request = { |
|
187 |
'subnet': { |
|
188 |
'network_id': 'ed2e3c10-2e43-4297-9006-2863a2d1abbc', |
|
189 |
'cidr': '192.168.3.0/24', |
|
190 |
'name': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' |
|
191 |
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' |
|
192 |
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'} |
|
193 |
} |
|
194 |
response = self.post(SUBNETS_URL, "user9", json.dumps(request), "json") |
|
195 |
self.assertBadRequest(response) |
|
196 |
|
|
197 |
def test_create_subnet_with_invalid_dhcp(self): |
|
198 |
'''Create a subnet with an invalid dhcp value''' |
|
199 |
request = { |
|
200 |
'subnet': { |
|
201 |
'network_id': 'ed2e3c10-2e43-4297-9006-2863a2d1abbc', |
|
202 |
'cidr': '192.168.3.0/24', |
|
203 |
'enable_dhcp': 'None'} |
|
204 |
} |
|
159 | 205 |
response = self.post(SUBNETS_URL, "user9", json.dumps(request), "json") |
160 | 206 |
self.assertBadRequest(response) |
Also available in: Unified diff