|
|
@@ -390,6 +390,73 @@ class IPRangeTest(APIViewTestCases.APIViewTestCase):
|
|
|
)
|
|
|
IPRange.objects.bulk_create(ip_ranges)
|
|
|
|
|
|
+ def test_list_available_ips(self):
|
|
|
+ """
|
|
|
+ Test retrieval of all available IP addresses within a parent IP range.
|
|
|
+ """
|
|
|
+ iprange = IPRange.objects.create(
|
|
|
+ start_address=IPNetwork('192.0.2.10/24'),
|
|
|
+ end_address=IPNetwork('192.0.2.19/24')
|
|
|
+ )
|
|
|
+ url = reverse('ipam-api:iprange-available-ips', kwargs={'pk': iprange.pk})
|
|
|
+ self.add_permissions('ipam.view_iprange', 'ipam.view_ipaddress')
|
|
|
+
|
|
|
+ # Retrieve all available IPs
|
|
|
+ response = self.client.get(url, **self.header)
|
|
|
+ self.assertHttpStatus(response, status.HTTP_200_OK)
|
|
|
+ self.assertEqual(len(response.data), 10)
|
|
|
+
|
|
|
+ def test_create_single_available_ip(self):
|
|
|
+ """
|
|
|
+ Test retrieval of the first available IP address within a parent IP range.
|
|
|
+ """
|
|
|
+ vrf = VRF.objects.create(name='Test VRF 1', rd='1234')
|
|
|
+ iprange = IPRange.objects.create(
|
|
|
+ start_address=IPNetwork('192.0.2.1/24'),
|
|
|
+ end_address=IPNetwork('192.0.2.3/24'),
|
|
|
+ vrf=vrf
|
|
|
+ )
|
|
|
+ url = reverse('ipam-api:iprange-available-ips', kwargs={'pk': iprange.pk})
|
|
|
+ self.add_permissions('ipam.view_iprange', 'ipam.add_ipaddress')
|
|
|
+
|
|
|
+ # Create all three available IPs with individual requests
|
|
|
+ for i in range(1, 4):
|
|
|
+ data = {
|
|
|
+ 'description': f'Test IP #{i}'
|
|
|
+ }
|
|
|
+ response = self.client.post(url, data, format='json', **self.header)
|
|
|
+ self.assertHttpStatus(response, status.HTTP_201_CREATED)
|
|
|
+ self.assertEqual(response.data['vrf']['id'], vrf.pk)
|
|
|
+ self.assertEqual(response.data['description'], data['description'])
|
|
|
+
|
|
|
+ # Try to create one more IP
|
|
|
+ response = self.client.post(url, {}, **self.header)
|
|
|
+ self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
|
|
|
+ self.assertIn('detail', response.data)
|
|
|
+
|
|
|
+ def test_create_multiple_available_ips(self):
|
|
|
+ """
|
|
|
+ Test the creation of available IP addresses within a parent IP range.
|
|
|
+ """
|
|
|
+ iprange = IPRange.objects.create(
|
|
|
+ start_address=IPNetwork('192.0.2.1/24'),
|
|
|
+ end_address=IPNetwork('192.0.2.8/24')
|
|
|
+ )
|
|
|
+ url = reverse('ipam-api:iprange-available-ips', kwargs={'pk': iprange.pk})
|
|
|
+ self.add_permissions('ipam.view_iprange', 'ipam.add_ipaddress')
|
|
|
+
|
|
|
+ # Try to create nine IPs (only eight are available)
|
|
|
+ data = [{'description': f'Test IP #{i}'} for i in range(1, 10)] # 9 IPs
|
|
|
+ response = self.client.post(url, data, format='json', **self.header)
|
|
|
+ self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
|
|
|
+ self.assertIn('detail', response.data)
|
|
|
+
|
|
|
+ # Create all eight available IPs in a single request
|
|
|
+ data = [{'description': f'Test IP #{i}'} for i in range(1, 9)] # 8 IPs
|
|
|
+ response = self.client.post(url, data, format='json', **self.header)
|
|
|
+ self.assertHttpStatus(response, status.HTTP_201_CREATED)
|
|
|
+ self.assertEqual(len(response.data), 8)
|
|
|
+
|
|
|
|
|
|
class IPAddressTest(APIViewTestCases.APIViewTestCase):
|
|
|
model = IPAddress
|