Skip to content

Commit cb86fd7

Browse files
authored
Merge pull request #490 from thedac/thedac/ip-ranges-available-ips
Enable available_ips for ip_ranges
2 parents 2bd062b + 1709842 commit cb86fd7

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

pynetbox/models/ipam.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,42 @@ def __str__(self):
2222
return str(self.address)
2323

2424

25+
class IpRanges(Record):
26+
def __str__(self):
27+
return str(self.display)
28+
29+
@property
30+
def available_ips(self):
31+
"""Represents the ``available-ips`` detail endpoint.
32+
33+
Returns a DetailEndpoint object that is the interface for
34+
viewing and creating IP addresses inside an ip range .
35+
36+
:returns: :py:class:`.DetailEndpoint`
37+
38+
:Examples:
39+
40+
>>> ip_range = nb.ipam.ip_ranges.get(24)
41+
>>> ip_range.available_ips.list()
42+
[10.0.0.1/24, 10.0.0.2/24, 10.0.0.3/24, 10.0.0.4/24, 10.0.0.5/24, ...]
43+
44+
To create a single IP:
45+
46+
>>> ip_range = nb.ipam.ip_ranges.get(24)
47+
>>> ip_range.available_ips.create()
48+
10.0.0.1/24
49+
50+
51+
To create multiple IPs:
52+
53+
>>> ip_range = nb.ipam.ip_ranges.get(24)
54+
>>> create = ip_range.available_ips.create([{} for i in range(2)])
55+
>>> create
56+
[10.0.0.2/24, 10.0.0.3/24]
57+
"""
58+
return DetailEndpoint(self, "available-ips", custom_return=IpAddresses)
59+
60+
2561
class Prefixes(Record):
2662
def __str__(self):
2763
return str(self.prefix)

tests/unit/test_detailendpoint.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
class DetailEndpointTestCase(unittest.TestCase):
1111
def test_detail_endpoint_create_single(self):
12+
# Prefixes
1213
with patch(
1314
"pynetbox.core.query.Request._make_call",
1415
return_value={"id": 123, "prefix": "1.2.3.0/24"},
@@ -21,8 +22,22 @@ def test_detail_endpoint_create_single(self):
2122
):
2223
ip_obj = prefix_obj.available_ips.create()
2324
self.assertEqual(ip_obj.address, "1.2.3.1/24")
25+
# IP Ranges
26+
with patch(
27+
"pynetbox.core.query.Request._make_call",
28+
return_value={"id": 321, "display": "1.2.4.1-254/24"},
29+
):
30+
ip_range_obj = nb.ipam.ip_ranges.get(321)
31+
self.assertEqual(ip_range_obj.display, "1.2.4.1-254/24")
32+
with patch(
33+
"pynetbox.core.query.Request._make_call",
34+
return_value={"address": "1.2.4.2/24"},
35+
):
36+
ip_obj = ip_range_obj.available_ips.create()
37+
self.assertEqual(ip_obj.address, "1.2.4.2/24")
2438

2539
def test_detail_endpoint_create_list(self):
40+
# Prefixes
2641
with patch(
2742
"pynetbox.core.query.Request._make_call",
2843
return_value={"id": 123, "prefix": "1.2.3.0/24"},
@@ -36,3 +51,17 @@ def test_detail_endpoint_create_list(self):
3651
ip_list = prefix_obj.available_ips.create([{} for _ in range(2)])
3752
self.assertTrue(isinstance(ip_list, list))
3853
self.assertEqual(len(ip_list), 2)
54+
# IP Ranges
55+
with patch(
56+
"pynetbox.core.query.Request._make_call",
57+
return_value={"id": 321, "display": "1.2.4.1-254/24"},
58+
):
59+
ip_range_obj = nb.ipam.ip_ranges.get(321)
60+
self.assertEqual(ip_range_obj.display, "1.2.4.1-254/24")
61+
with patch(
62+
"pynetbox.core.query.Request._make_call",
63+
return_value=[{"address": "1.2.4.2/24"}, {"address": "1.2.4.3/24"}],
64+
):
65+
ip_list = ip_range_obj.available_ips.create([{} for _ in range(2)])
66+
self.assertTrue(isinstance(ip_list, list))
67+
self.assertEqual(len(ip_list), 2)

0 commit comments

Comments
 (0)