classification
Title: ipaddress - add ability to get next closet network of any prefix size
Type: enhancement Stage: patch review
Components: Library (Lib) Versions: Python 3.10
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: fasial.mahmood94
Priority: normal Keywords: patch

Created on 2021-01-08 00:30 by fasial.mahmood94, last changed 2021-01-09 19:36 by fasial.mahmood94.

Pull Requests
URL Status Linked Edit
PR 24180 open fasial.mahmood94, 2021-01-09 19:36
Messages (3)
msg384623 - (view) Author: Faisal Mahmood (fasial.mahmood94) * Date: 2021-01-08 00:30
The ipaddress module in Python is an excellent tool, but I noticed it is missing a feature that I needed several months ago, which is the ability to find the next closest subnet with a specific prefix length.

For example, imagine I had a IPv4Network("10.10.0.72/30"), how would I find the next possible /25 address? It is not the most straightforward thing to do, so think it would be a great enhancement to the ipaddress library.

I think this can be achieved by adding in a new method to the BaseNetwork class, the method could be defined like "next_prefix(next_prefix=None)".  Calling this method would return an IPv4/v6 address that is the closest possible match with the new prefix (defined as next_prefix).

Example calls:
v4 = IPv4Network("10.10.0.72/30")
next_network = v4.next_subnet(next_prefix=25)
# Output: next_network = IPv4Network("10.10.0.128/25")

v4 = IPv4Network("10.10.0.72/30")
next_network = v4.next_subnet(next_prefix=30)
# Output: next_network = IPv4Network("10.10.0.76/30")

v4 = IPv4Network("10.10.0.72/30")
next_network = v4.next_subnet() # if next_prefix is not defined it will use the existing prefix of /30, so this call is exactly the same as the previous
# Output: next_network = IPv4Network("10.10.0.76/30")

v6 = IPv6Network("2001:db8:aaaa:aaaa:aaaa:aaaa:aaaa:0000/112")
next_network = v6.next_subnet()
# Output: next_network = IPv6Network("2001:db8:aaaa:aaaa:aaaa:aaaa:aaab:0/112")

v6 = IPv6Network("2001:db8:aaaa:aaaa:aaaa:aaaa:aaaa:0000/112")
next_network = v6.next_subnet(next_prefix=64)
# Output: next_network = IPv6Network("2001:db8:aaaa:aaab::/64")

I am going to be working on this and plan to raise a PR soon.  This is my first time contributing to Python, so I appreciate your help / comments / suggestions / guidance as I go along.
msg384624 - (view) Author: Faisal Mahmood (fasial.mahmood94) * Date: 2021-01-08 00:33
Not sure how to edit an issue, but I made a mistake, where I said:
"...Calling this method would return an IPv4/v6 address that is the closest possible match..."

I meant to say:
"...Calling this method would return an IPv4/v6 -NETWORK- that is the closest possible match..."
msg384732 - (view) Author: Faisal Mahmood (fasial.mahmood94) * Date: 2021-01-09 16:19
Updated the title and method naming, I previously mentioned the "next subnet" and called the method "next_subnet", but technically this is wrong.  What this method should be doing is finding the next closest network of prefix size n.

So I guess the method definition should be:
`next_network(self, next_network=None)`
History
Date User Action Args
2021-01-09 19:36:24fasial.mahmood94setkeywords: + patch
stage: patch review
pull_requests: + pull_request23006
2021-01-09 16:19:40fasial.mahmood94setmessages: + msg384732
title: ipaddress - add ability to get next closet subnet of any prefix size -> ipaddress - add ability to get next closet network of any prefix size
2021-01-08 00:33:20fasial.mahmood94setmessages: + msg384624
2021-01-08 00:30:51fasial.mahmood94create