665
595
_data([tnt1_device1_ip1, tnt1_device1_ip2]))
668
class TestInsideGlobalsController(BaseTestController):
670
def _nat_path(self, block, address):
671
return ("/ipam/tenants/{0}/ip_blocks/{1}/ip_addresses/{2}"
672
"/inside_globals".format(block.tenant_id,
676
def test_index(self):
677
local_block = factory_models.PrivateIpBlockFactory(cidr="10.1.1.1/30")
678
public_factory = factory_models.PublicIpBlockFactory
679
global_block1 = public_factory(cidr="192.1.1.1/30")
680
global_block2 = public_factory(cidr="196.1.1.1/30")
682
local_ip = local_block.allocate_ip()
683
global_ip1 = global_block1.allocate_ip()
684
global_ip2 = global_block2.allocate_ip()
686
local_ip.add_inside_globals([global_ip1, global_ip2])
688
response = self.app.get(self._nat_path(local_block, local_ip.address))
690
self.assertItemsEqual(response.json['ip_addresses'],
691
_data([global_ip1, global_ip2]))
693
def test_index_with_pagination(self):
694
local_block = factory_models.PrivateIpBlockFactory(cidr="10.1.1.1/8")
695
global_block = factory_models.PublicIpBlockFactory(cidr="192.1.1.1/8")
697
[local_ip], global_ips = _allocate_ips((local_block, 1),
699
local_ip.add_inside_globals(global_ips)
701
response = self.app.get("{0}?limit=2&marker={1}".
702
format(self._nat_path(local_block,
706
self.assertEqual(response.json['ip_addresses'],
707
_data([global_ips[2], global_ips[3]]))
709
def test_index_for_nonexistent_block(self):
710
non_existant_block_id = 12122
711
url = "/ipam/tenants/tnt/ip_blocks/%s/ip_addresses/%s/inside_globals"
712
response = self.app.get(url % (non_existant_block_id, "10.1.1.2"),
715
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
718
def test_index_for_nonexistent_block_for_given_tenant(self):
719
block = factory_models.PrivateIpBlockFactory(cidr="10.0.0.0/24",
722
url = ("/ipam/tenants/bad_tenant_id/ip_blocks/%s"
723
"/ip_addresses/%s/inside_globals")
724
response = self.app.get(url % (block.id, "10.1.1.2"), status='*')
726
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
729
def test_index_for_nonexistent_address(self):
730
ip_block = factory_models.PrivateIpBlockFactory(cidr="191.1.1.1/10")
731
response = self.app.get(self._nat_path(ip_block, '10.1.1.2'),
734
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
735
"IpAddress Not Found")
737
def test_create(self):
738
local_block = factory_models.PrivateIpBlockFactory(cidr="10.1.1.1/24")
739
global_block = factory_models.PublicIpBlockFactory(cidr="77.1.1.1/24")
741
global_ip = global_block.allocate_ip()
742
local_ip = local_block.allocate_ip()
743
response = self.app.post_json(self._nat_path(local_block,
746
'ip_block_id': global_block.id,
747
'ip_address': global_ip.address
751
self.assertEqual(response.status, "200 OK")
753
self.assertEqual(len(local_ip.inside_globals()), 1)
754
self.assertEqual(global_ip.id, local_ip.inside_globals()[0].id)
755
self.assertEqual(local_ip.id, global_ip.inside_locals()[0].id)
757
def test_create_throws_error_for_ips_of_other_tenants_blocks(self):
758
local_block = factory_models.PublicIpBlockFactory(cidr="77.1.1.0/28")
759
other_tenant_global_block = factory_models.PrivateIpBlockFactory(
760
cidr="10.1.1.0/28", tenant_id="other_tenant_id")
763
'ip_block_id': other_tenant_global_block.id,
764
'ip_address': "10.1.1.2",
766
request_data = {'ip_addresses': json_data}
768
response = self.app.post_json(self._nat_path(local_block, "77.1.1.0"),
769
request_data, status="*")
771
self.assertEqual(response.status_int, 404)
772
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
775
def test_create_for_nonexistent_block(self):
776
non_existant_block_id = 1234
778
url = "/ipam/tenants/tnt/ip_blocks/%s/ip_addresses/%s/inside_globals"
779
response = self.app.post_json(url % (non_existant_block_id,
782
'ip_block_id': "5678",
783
'ip_address': "10.0.0.0",
788
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
791
def test_create_for_nonexistent_block_for_given_tenant(self):
792
block = factory_models.PrivateIpBlockFactory(cidr="10.0.0.0/24",
795
url = ("/ipam/tenants/bad_tenant_id/ip_blocks/%s"
796
"/ip_addresses/%s/inside_globals")
797
response = self.app.post_json(url % (block.id, "10.1.1.2"),
799
'ip_block_id': "5678",
800
'ip_address': "10.0.0.0",
805
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
808
def test_delete(self):
809
local_block = factory_models.PrivateIpBlockFactory(cidr="10.1.1.1/24")
810
global_block = factory_models.PublicIpBlockFactory(cidr="77.1.1.1/24")
812
global_ip = global_block.allocate_ip()
813
local_ip = local_block.allocate_ip()
814
local_ip.add_inside_globals([global_ip])
816
response = self.app.delete(self._nat_path(local_block,
819
self.assertEqual(response.status, "200 OK")
820
self.assertEqual(local_ip.inside_globals(), [])
822
def test_delete_for_specific_address(self):
823
local_block = factory_models.PrivateIpBlockFactory(cidr="10.1.1.1/8")
824
global_block = factory_models.PublicIpBlockFactory(cidr="192.1.1.1/8")
826
global_ips, = _allocate_ips((global_block, 3))
827
local_ip = local_block.allocate_ip()
828
local_ip.add_inside_globals(global_ips)
830
self.app.delete("%s/%s" % (self._nat_path(local_block,
832
global_ips[1].address))
834
globals_left = [ip.address for ip in local_ip.inside_globals()]
835
self.assertEqual(globals_left, [global_ips[0].address,
836
global_ips[2].address])
838
def test_delete_for_nonexistent_block(self):
839
non_existant_block_id = 12122
840
url = "/ipam/tenants/tnt/ip_blocks/%s/ip_addresses/%s/inside_globals"
841
response = self.app.delete(url % (non_existant_block_id, '10.1.1.2'),
844
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
847
def test_delete_for_nonexistent_block_for_given_tenant(self):
848
block = factory_models.PrivateIpBlockFactory(cidr="10.0.0.0/24",
851
url = ("/ipam/tenants/bad_tenant_id/ip_blocks/%s"
852
"/ip_addresses/%s/inside_globals")
853
response = self.app.delete(url % (block.id, "10.1.1.2"), status='*')
855
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
858
def test_delete_for_nonexistent_address(self):
859
ip_block = factory_models.PrivateIpBlockFactory(cidr="191.1.1.1/10")
860
response = self.app.delete(self._nat_path(ip_block, '10.1.1.2'),
863
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
864
"IpAddress Not Found")
867
class TestInsideLocalsController(BaseTestController):
869
def _nat_path(self, block, address):
870
return ("/ipam/tenants/{0}/ip_blocks/{1}/ip_addresses/{2}"
871
"/inside_locals".format(block.tenant_id,
875
def test_index(self):
876
local_block = factory_models.PrivateIpBlockFactory(cidr="10.1.1.1/24")
877
global_block = factory_models.PublicIpBlockFactory(cidr="77.1.1.1/24")
879
[global_ip], local_ips = _allocate_ips((global_block, 1),
881
global_ip.add_inside_locals(local_ips)
883
response = self.app.get(self._nat_path(global_block,
886
self.assertEqual(response.json['ip_addresses'], _data(local_ips))
888
def test_index_with_pagination(self):
889
local_block = factory_models.PrivateIpBlockFactory(cidr="10.1.1.1/24")
890
global_block = factory_models.PublicIpBlockFactory(cidr="77.1.1.1/24")
892
[global_ip], local_ips = _allocate_ips((global_block, 1),
894
global_ip.add_inside_locals(local_ips)
896
response = self.app.get("{0}?limit=2&marker={1}".
897
format(self._nat_path(global_block,
901
self.assertEqual(response.json['ip_addresses'],
902
_data([local_ips[2], local_ips[3]]))
904
def test_index_for_nonexistent_block(self):
905
non_existant_block_id = 12122
906
url = "/ipam/tenants/tnt/ip_blocks/%s/ip_addresses/%s/inside_locals"
907
response = self.app.get(url % (non_existant_block_id, "10.1.1.2"),
910
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
913
def test_index_for_nonexistent_block_for_given_tenant(self):
914
block = factory_models.PrivateIpBlockFactory(cidr="10.0.0.0/24",
917
url = ("/ipam/tenants/bad_tenant_id/ip_blocks/%s"
918
"/ip_addresses/%s/inside_locals")
919
response = self.app.get(url % (block.id, "10.1.1.2"), status='*')
921
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
924
def test_index_for_nonexistent_address(self):
925
ip_block = factory_models.PrivateIpBlockFactory(cidr="191.1.1.1/10")
926
response = self.app.get(self._nat_path(ip_block, '10.1.1.2'),
929
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
930
"IpAddress Not Found")
932
def test_create(self):
933
global_block = factory_models.PublicIpBlockFactory(cidr="77.1.1.0/28")
934
local_block1 = factory_models.PrivateIpBlockFactory(cidr="10.1.1.0/28")
935
local_block2 = factory_models.PrivateIpBlockFactory(cidr="10.0.0.0/28")
938
{'ip_block_id': local_block1.id, 'ip_address': "10.1.1.2"},
939
{'ip_block_id': local_block2.id, 'ip_address': "10.0.0.2"},
941
request_data = {'ip_addresses': json_data}
942
response = self.app.post_json(self._nat_path(global_block, "77.1.1.0"),
945
self.assertEqual(response.status, "200 OK")
946
ips = global_block.find_allocated_ip("77.1.1.0").inside_locals()
947
inside_locals = [ip.address for ip in ips]
949
self.assertEqual(len(inside_locals), 2)
950
self.assertTrue("10.1.1.2" in inside_locals)
951
self.assertTrue("10.0.0.2" in inside_locals)
952
local_ip = models.IpAddress.find_by(ip_block_id=local_block1.id,
954
self.assertEqual(local_ip.inside_globals()[0].address, "77.1.1.0")
956
def test_create_throws_error_for_ips_of_other_tenants_blocks(self):
957
global_block = factory_models.PublicIpBlockFactory(cidr="77.1.1.0/28")
958
other_tenant_local_block = factory_models.PrivateIpBlockFactory(
959
cidr="10.1.1.0/28", tenant_id="other_tenant_id")
962
'ip_block_id': other_tenant_local_block.id,
963
'ip_address': "10.1.1.2",
965
request_data = {'ip_addresses': json_data}
967
response = self.app.post_json(self._nat_path(global_block, "77.1.1.0"),
968
request_data, status="*")
970
self.assertEqual(response.status_int, 404)
971
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
974
def test_create_for_nonexistent_block_for_given_tenant(self):
975
block = factory_models.PrivateIpBlockFactory(cidr="10.0.0.0/24",
978
url = ("/ipam/tenants/bad_tenant_id/ip_blocks/%s"
979
"/ip_addresses/%s/inside_locals")
980
response = self.app.post_json(url % (block.id, "10.1.1.2"),
982
'ip_block_id': "5678",
983
'ip_address': "10.0.0.0",
988
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
991
def test_delete_for_specific_address(self):
992
local_block = factory_models.PrivateIpBlockFactory(cidr="10.1.1.1/24")
993
global_block = factory_models.PublicIpBlockFactory(cidr="77.1.1.1/24")
995
local_ips, = _allocate_ips((local_block, 3))
996
global_ip = global_block.allocate_ip()
997
global_ip.add_inside_locals(local_ips)
999
self.app.delete("{0}/{1}".format(self._nat_path(global_block,
1001
local_ips[1].address))
1003
locals_left = [ip.address for ip in global_ip.inside_locals()]
1004
self.assertEqual(locals_left,
1005
[local_ips[0].address, local_ips[2].address])
1007
def test_delete(self):
1008
local_block = factory_models.PrivateIpBlockFactory(cidr="10.1.1.1/24")
1009
global_block = factory_models.PublicIpBlockFactory(cidr="77.1.1.1/24")
1011
global_ip = global_block.allocate_ip()
1012
local_ip = local_block.allocate_ip()
1013
global_ip.add_inside_locals([local_ip])
1015
response = self.app.delete(self._nat_path(global_block,
1018
self.assertEqual(response.status, "200 OK")
1019
self.assertEqual(global_ip.inside_locals(), [])
1021
def test_delete_for_nonexistent_block(self):
1022
non_existant_block_id = 12122
1023
url = "/ipam/tenants/tnt/ip_blocks/%s/ip_addresses/%s/inside_locals"
1024
response = self.app.delete(url % (non_existant_block_id, '10.1.1.2'),
1027
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1028
"IpBlock Not Found")
1030
def test_delete_for_nonexistent_block_for_given_tenant(self):
1031
block = factory_models.PrivateIpBlockFactory(cidr="10.0.0.0/24",
1034
url = ("/ipam/tenants/bad_tenant_id/ip_blocks/%s"
1035
"/ip_addresses/%s/inside_locals")
1036
response = self.app.delete(url % (block.id, "10.1.1.2"), status='*')
1038
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1039
"IpBlock Not Found")
1041
def test_delete_for_nonexistent_address(self):
1042
ip_block = factory_models.PrivateIpBlockFactory(cidr="191.1.1.1/10")
1043
response = self.app.delete(self._nat_path(ip_block, '10.1.1.2'),
1046
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1047
"IpAddress Not Found")
1050
class TestUnusableIpRangesController(BaseTestController):
1053
self.policy_path = "/ipam/tenants/tnt_id/policies"
1054
super(TestUnusableIpRangesController, self).setUp()
1056
def test_create(self):
1057
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1059
response = self.app.post_json("%s/%s/unusable_ip_ranges"
1060
% (self.policy_path, policy.id),
1067
unusable_range = models.IpRange.find_by(policy_id=policy.id)
1068
self.assertEqual(response.status, "201 Created")
1069
self.assertEqual(response.json, dict(ip_range=_data(unusable_range)))
1071
def test_create_on_non_existent_policy(self):
1072
response = self.app.post_json("%s/bad_policy_id/unusable_ip_ranges"
1081
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1084
def test_create_fails_for_non_existent_policy_for_given_tenant(self):
1085
policy = factory_models.PolicyFactory(tenant_id=123)
1086
self.policy_path = "/ipam/tenants/another_tenant_id/policies"
1087
response = self.app.post_json("%s/%s/unusable_ip_ranges"
1088
% (self.policy_path, policy.id),
1096
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1099
def test_show(self):
1100
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1101
ip_range = factory_models.IpRangeFactory.create(policy_id=policy.id)
1103
response = self.app.get("%s/%s/unusable_ip_ranges/%s"
1104
% (self.policy_path, policy.id, ip_range.id))
1106
self.assertEqual(response.status_int, 200)
1107
self.assertEqual(response.json, dict(ip_range=_data(ip_range)))
1109
def test_show_when_ip_range_does_not_exists(self):
1110
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1112
response = self.app.get("%s/%s/unusable_ip_ranges/bad_ip_range_id"
1113
% (self.policy_path, policy.id),
1116
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1117
"IpRange Not Found")
1119
def test_show_fails_for_non_existent_policy_for_given_tenant(self):
1120
policy = factory_models.PolicyFactory(tenant_id="123")
1121
ip_range = factory_models.IpRangeFactory(policy_id=policy.id)
1122
self.policy_path = "/ipam/tenants/bad_tenant_id/policies"
1123
response = self.app.get("%s/%s/unusable_ip_ranges/%s"
1124
% (self.policy_path, policy.id, ip_range.id),
1127
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1130
def test_update(self):
1131
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1132
ip_range = factory_models.IpRangeFactory.create(offset=10,
1134
policy_id=policy.id)
1136
response = self.app.put_json("%s/%s/unusable_ip_ranges/%s"
1137
% (self.policy_path,
1146
self.assertEqual(response.status_int, 200)
1147
updated_range = models.IpRange.find(ip_range.id)
1148
self.assertEqual(updated_range.offset, 1111)
1149
self.assertEqual(updated_range.length, 2222)
1150
self.assertEqual(response.json, dict(ip_range=_data(updated_range)))
1152
def test_update_ignores_change_in_policy_id(self):
1153
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1154
ip_range = factory_models.IpRangeFactory.create(offset=10,
1156
policy_id=policy.id)
1157
new_policy_id = utils.generate_uuid()
1158
response = self.app.put_json("%s/%s/unusable_ip_ranges/%s"
1159
% (self.policy_path,
1165
'policy_id': new_policy_id,
1169
self.assertEqual(response.status_int, 200)
1170
updated_range = models.IpRange.find(ip_range.id)
1171
self.assertEqual(updated_range.offset, 1111)
1172
self.assertEqual(updated_range.policy_id, policy.id)
1173
self.assertEqual(response.json['ip_range']['policy_id'], policy.id)
1175
def test_update_when_ip_range_does_not_exists(self):
1176
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1178
response = self.app.put_json("%s/%s/unusable_ip_ranges/bad_ip_range_id"
1179
% (self.policy_path, policy.id),
1187
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1188
"IpRange Not Found")
1190
def test_update_fails_for_non_existent_policy_for_given_tenant(self):
1191
policy = factory_models.PolicyFactory(tenant_id=123)
1192
ip_range = factory_models.IpRangeFactory(policy_id=policy.id)
1193
self.policy_path = "/ipam/tenants/another_tenant_id/policies"
1194
response = self.app.put_json("%s/%s/unusable_ip_ranges/%s"
1195
% (self.policy_path,
1198
{'ip_range': {'offset': 1}}, status='*')
1200
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1203
def test_index(self):
1204
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1205
for i in range(0, 3):
1206
factory_models.IpRangeFactory(policy_id=policy.id)
1208
response = self.app.get("%s/%s/unusable_ip_ranges"
1209
% (self.policy_path, policy.id))
1211
response_ranges = response.json["ip_ranges"]
1212
self.assertEqual(len(response_ranges), 3)
1213
self.assertItemsEqual(response_ranges,
1214
_data(policy.unusable_ip_ranges))
1216
def test_index_with_pagination(self):
1217
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1218
ip_ranges = [factory_models.IpRangeFactory(policy_id=policy.id)
1219
for i in range(0, 5)]
1220
ip_ranges = models.sort(ip_ranges)
1222
response = self.app.get("%s/%s/unusable_ip_ranges?limit=2&marker=%s"
1223
% (self.policy_path,
1227
next_link = response.json["ip_ranges_links"][0]['href']
1228
expected_next_link = string.replace(response.request.url,
1229
"marker=%s" % ip_ranges[0].id,
1230
"marker=%s" % ip_ranges[2].id)
1232
response_ranges = response.json["ip_ranges"]
1233
self.assertEqual(len(response_ranges), 2)
1234
self.assertItemsEqual(response_ranges, _data(ip_ranges[1:3]))
1235
self.assertUrlEqual(next_link, expected_next_link)
1237
def test_index_fails_for_non_existent_policy_for_given_tenant(self):
1238
policy = factory_models.PolicyFactory(tenant_id=123)
1239
self.policy_path = "/ipam/tenants/another_tenant_id/policies"
1240
response = self.app.get("%s/%s/unusable_ip_ranges"
1241
% (self.policy_path, policy.id),
1244
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1247
def test_delete(self):
1248
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1249
ip_range = factory_models.IpRangeFactory(policy_id=policy.id)
1251
response = self.app.delete("%s/%s/unusable_ip_ranges/%s"
1252
% (self.policy_path,
1256
self.assertEqual(response.status_int, 200)
1257
self.assertRaises(models.ModelNotFoundError,
1258
policy.find_ip_range,
1259
ip_range_id=ip_range.id)
1261
def test_delete_fails_for_non_existent_policy_for_given_tenant(self):
1262
policy = factory_models.PolicyFactory(tenant_id=123)
1263
ip_range = factory_models.IpRangeFactory(policy_id=policy.id)
1264
self.policy_path = "/ipam/tenants/another_tenant_id/policies"
1265
response = self.app.delete("%s/%s/unusable_ip_ranges/%s"
1266
% (self.policy_path,
1271
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1275
class TestUnusableIpOctetsController(BaseTestController):
1278
self.policy_path = "/ipam/tenants/tnt_id/policies"
1279
super(TestUnusableIpOctetsController, self).setUp()
1281
def test_index(self):
1282
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1283
for i in range(0, 3):
1284
factory_models.IpOctetFactory(policy_id=policy.id)
1286
response = self.app.get("%s/%s/unusable_ip_octets" % (self.policy_path,
1289
response_octets = response.json["ip_octets"]
1290
self.assertEqual(len(response_octets), 3)
1291
self.assertItemsEqual(response_octets,
1292
_data(policy.unusable_ip_octets))
1294
def test_index_with_pagination(self):
1295
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1296
ip_octets = [factory_models.IpOctetFactory(policy_id=policy.id)
1297
for i in range(0, 5)]
1298
ip_octets = models.sort(ip_octets)
1300
response = self.app.get("%s/%s/unusable_ip_octets?limit=2&marker=%s"
1301
% (self.policy_path,
1305
next_link = response.json["ip_octets_links"][0]['href']
1306
expected_next_link = string.replace(response.request.url,
1307
"marker=%s" % ip_octets[0].id,
1308
"marker=%s" % ip_octets[2].id)
1310
response_octets = response.json["ip_octets"]
1311
self.assertEqual(len(response_octets), 2)
1312
self.assertItemsEqual(response_octets, _data(ip_octets[1:3]))
1313
self.assertUrlEqual(next_link, expected_next_link)
1315
def test_index_fails_for_non_existent_policy_for_given_tenant(self):
1316
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1317
self.policy_path = "/ipam/tenants/another_tenant_id/policies"
1318
response = self.app.get("%s/%s/unusable_ip_octets"
1319
% (self.policy_path, policy.id),
1322
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1325
def test_create(self):
1326
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1327
response = self.app.post_json("%s/%s/unusable_ip_octets"
1328
% (self.policy_path, policy.id),
1329
{'ip_octet': {'octet': '123'}})
1331
ip_octet = models.IpOctet.find_by(policy_id=policy.id)
1332
self.assertEqual(response.status, "201 Created")
1333
self.assertEqual(response.json['ip_octet'], _data(ip_octet))
1335
def test_create_on_non_existent_policy(self):
1336
response = self.app.post_json("%s/bad_policy_id/unusable_ip_octets"
1338
{'ip_octet': {'octet': '2'}},
1341
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1344
def test_create_fails_for_non_existent_policy_for_given_tenant(self):
1345
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1346
self.policy_path = "/ipam/tenants/another_tenant_id/policies"
1347
response = self.app.post_json("%s/%s/unusable_ip_octets"
1348
% (self.policy_path, policy.id),
1349
{'ip_octet': {'octet': 1}},
1352
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1355
def test_show(self):
1356
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1357
ip_octet = factory_models.IpOctetFactory(policy_id=policy.id)
1359
response = self.app.get("%s/%s/unusable_ip_octets/%s"
1360
% (self.policy_path, policy.id, ip_octet.id))
1362
self.assertEqual(response.status_int, 200)
1363
self.assertEqual(response.json['ip_octet'], _data(ip_octet))
1365
def test_show_when_ip_octet_does_not_exists(self):
1366
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1368
response = self.app.get("%s/%s/unusable_ip_octets/non_existant_octet"
1369
% (self.policy_path, policy.id),
1372
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1373
"IpOctet Not Found")
1375
def test_show_fails_for_non_existent_policy_for_given_tenant(self):
1376
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1377
ip_octet = factory_models.IpOctetFactory(policy_id=policy.id)
1378
self.policy_path = "/ipam/tenants/another_tenanat_id/policies"
1379
response = self.app.get("%s/%s/unusable_ip_octets/%s"
1380
% (self.policy_path, policy.id, ip_octet.id),
1383
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1386
def test_update(self):
1387
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1388
ip_octet = factory_models.IpOctetFactory.create(octet=10,
1389
policy_id=policy.id)
1391
response = self.app.put_json("%s/%s/unusable_ip_octets/%s"
1392
% (self.policy_path,
1395
{'ip_octet': {'octet': 123}})
1397
self.assertEqual(response.status_int, 200)
1398
updated_octet = models.IpOctet.find(ip_octet.id)
1399
self.assertEqual(updated_octet.octet, 123)
1400
self.assertEqual(response.json['ip_octet'], _data(updated_octet))
1402
def test_update_ignores_change_in_policy_id(self):
1403
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1404
ip_octet = factory_models.IpOctetFactory.create(octet=254,
1405
policy_id=policy.id)
1406
new_policy_id = utils.generate_uuid()
1407
response = self.app.put_json("%s/%s/unusable_ip_octets/%s"
1408
% (self.policy_path, policy.id, ip_octet.id),
1411
'policy_id': new_policy_id,
1415
self.assertEqual(response.status_int, 200)
1416
updated_octet = models.IpOctet.find(ip_octet.id)
1417
self.assertEqual(updated_octet.octet, 253)
1418
self.assertEqual(updated_octet.policy_id, policy.id)
1419
self.assertEqual(response.json['ip_octet']['policy_id'], policy.id)
1421
def test_update_fails_for_non_existent_policy_for_given_tenant(self):
1422
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1423
ip_octet = factory_models.IpOctetFactory(policy_id=policy.id)
1424
self.policy_path = "/ipam/tenants/another_tenant_id/policies"
1425
response = self.app.put_json("%s/%s/unusable_ip_octets/%s"
1426
% (self.policy_path,
1429
{'ip_octet': {'octet': 1}},
1432
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1435
def test_update_when_ip_octet_does_not_exists(self):
1436
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1438
response = self.app.put_json("%s/%s/unusable_ip_octets/invalid_id"
1439
% (self.policy_path, policy.id),
1440
{'ip_octet': {'octet': 222}},
1443
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1444
"IpOctet Not Found")
1446
def test_delete(self):
1447
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1448
ip_octet = factory_models.IpOctetFactory(policy_id=policy.id)
1450
response = self.app.delete("%s/%s/unusable_ip_octets/%s"
1451
% (self.policy_path,
1455
self.assertEqual(response.status_int, 200)
1456
self.assertRaises(models.ModelNotFoundError,
1457
policy.find_ip_octet,
1458
ip_octet_id=ip_octet.id)
1460
def test_delete_fails_for_non_existent_policy_for_given_tenant(self):
1461
policy = factory_models.PolicyFactory(tenant_id="tnt_id")
1462
ip_octet = factory_models.IpOctetFactory(policy_id=policy.id)
1463
self.policy_path = "/ipam/tenants/another_tenant_id/policies"
1464
response = self.app.delete("%s/%s/unusable_ip_octets/%s"
1465
% (self.policy_path,
1470
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1474
class TestTenantPoliciesController(BaseTestController):
1476
def test_index(self):
1477
policy1 = factory_models.PolicyFactory(tenant_id="1")
1478
policy2 = factory_models.PolicyFactory(tenant_id="2")
1479
policy3 = factory_models.PolicyFactory(tenant_id="1")
1481
response = self.app.get("/ipam/tenants/1/policies")
1483
self.assertEqual(response.status_int, 200)
1484
self.assertItemsEqual(response.json["policies"],
1485
_data([policy1, policy3]))
1487
def test_create(self):
1488
response = self.app.post_json("/ipam/tenants/1111/policies",
1489
{'policy': {'name': "infrastructure"}})
1491
self.assertTrue(models.Policy.find_by(tenant_id="1111") is not None)
1492
self.assertEqual(response.status, "201 Created")
1493
self.assertEqual(response.json['policy']['tenant_id'], "1111")
1495
def test_create_ignores_tenant_id_passed_in_post_body(self):
1496
response = self.app.post_json("/ipam/tenants/123/policies",
1497
{'policy': {'name': "Standard",
1498
'tenant_id': "124"}})
1500
self.assertEqual(response.status_int, 201)
1501
self.assertEqual(response.json['policy']['name'], "Standard")
1502
self.assertEqual(response.json['policy']['tenant_id'], "123")
1504
def test_show(self):
1505
policy = factory_models.PolicyFactory(tenant_id="1111")
1506
response = self.app.get("/ipam/tenants/1111/policies/%s" % policy.id)
1508
self.assertEqual(response.status, "200 OK")
1509
self.assertEqual(response.json['policy']['id'], policy.id)
1511
def test_show_fails_for_nonexistent_tenant(self):
1512
policy = factory_models.PolicyFactory(tenant_id="1112")
1513
response = self.app.get("/ipam/tenants/1111/policies/%s" % policy.id,
1516
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1519
def test_update_fails_for_incorrect_tenant_id(self):
1520
policy = factory_models.PolicyFactory(tenant_id="111")
1521
response = self.app.put_json("/ipam/tenants/123/policies/%s"
1523
{'policy': {'name': "Standard"}},
1526
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1529
def test_update(self):
1530
policy = factory_models.PolicyFactory(name="blah", tenant_id="123")
1531
response = self.app.put_json("/ipam/tenants/123/policies/%s"
1533
{'policy': {'name': "Standard"}})
1535
self.assertEqual(response.status_int, 200)
1536
self.assertEqual("Standard", models.Policy.find(policy.id).name)
1538
def test_update_cannot_change_tenant_id(self):
1539
policy = factory_models.PolicyFactory(name="Infrastructure",
1541
response = self.app.put_json("/ipam/tenants/123/policies/%s"
1543
{'policy': {'name': "Standard",
1548
self.assertEqual(response.status_int, 200)
1549
updated_policy = models.Policy.find(policy.id)
1550
self.assertEqual(updated_policy.name, "Standard")
1551
self.assertEqual(updated_policy.tenant_id, "123")
1552
self.assertEqual(response.json['policy']['tenant_id'], "123")
1554
def test_delete(self):
1555
policy = factory_models.PolicyFactory(tenant_id="123")
1556
response = self.app.delete("/ipam/tenants/123/policies/%s" % policy.id)
1558
self.assertEqual(response.status_int, 200)
1559
self.assertTrue(models.Policy.get(policy.id) is None)
1561
def test_delete_fails_for_incorrect_tenant_id(self):
1562
policy = factory_models.PolicyFactory(tenant_id="123")
1563
response = self.app.delete("/ipam/tenants/111/policies/%s" % policy.id,
1566
self.assertErrorResponse(response, webob.exc.HTTPNotFound,
1570
598
class TestNetworksController(BaseTestController):
1572
600
def setUp(self):