Repository: libcloud Updated Branches: refs/heads/trunk e63adedf0 -> ff191dfee
Add utility join_ipv4_segments and increment_ipv4_segments functions to libcloud.utils.networking module. Patch by Andrew Mann, Tomaz Muraus. Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/ff191dfe Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/ff191dfe Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/ff191dfe Branch: refs/heads/trunk Commit: ff191dfee89d2786a7c1e5d9a3c3b380263b01b1 Parents: e63aded Author: Tomaz Muraus <[email protected]> Authored: Wed Aug 6 13:22:18 2014 +0200 Committer: Tomaz Muraus <[email protected]> Committed: Wed Aug 6 13:32:46 2014 +0200 ---------------------------------------------------------------------- libcloud/test/test_utils.py | 25 +++++++++++++++++++++ libcloud/utils/networking.py | 47 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff191dfe/libcloud/test/test_utils.py ---------------------------------------------------------------------- diff --git a/libcloud/test/test_utils.py b/libcloud/test/test_utils.py index 58b3506..4c1b6c0 100644 --- a/libcloud/test/test_utils.py +++ b/libcloud/test/test_utils.py @@ -42,6 +42,8 @@ from libcloud.utils.misc import get_secure_random_string from libcloud.utils.networking import is_public_subnet from libcloud.utils.networking import is_private_subnet from libcloud.utils.networking import is_valid_ip_address +from libcloud.utils.networking import join_ipv4_segments +from libcloud.utils.networking import increment_ipv4_segments from libcloud.storage.drivers.dummy import DummyIterator @@ -355,6 +357,29 @@ class NetworkingUtilsTestCase(unittest.TestCase): family=socket.AF_INET6) self.assertFalse(status) + def test_join_ipv4_segments(self): + values = [ + (('127', '0', '0', '1'), '127.0.0.1'), + (('255', '255', '255', '0'), '255.255.255.0'), + ] + + for segments, joined_ip in values: + result = join_ipv4_segments(segments=segments) + self.assertEqual(result, joined_ip) + + def test_increment_ipv4_segments(self): + values = [ + (('127', '0', '0', '1'), '127.0.0.2'), + (('255', '255', '255', '0'), '255.255.255.1'), + (('254', '255', '255', '255'), '255.0.0.0'), + (('100', '1', '0', '255'), '100.1.1.0'), + ] + + for segments, incremented_ip in values: + result = increment_ipv4_segments(segments=segments) + result = join_ipv4_segments(segments=result) + self.assertEqual(result, incremented_ip) + if __name__ == '__main__': sys.exit(unittest.main()) http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff191dfe/libcloud/utils/networking.py ---------------------------------------------------------------------- diff --git a/libcloud/utils/networking.py b/libcloud/utils/networking.py index f7dca9b..d508d24 100644 --- a/libcloud/utils/networking.py +++ b/libcloud/utils/networking.py @@ -19,7 +19,9 @@ import struct __all__ = [ 'is_private_subnet', 'is_public_subnet', - 'is_valid_ip_address' + 'is_valid_ip_address', + 'join_ipv4_segments', + 'increment_ipv4_segments' ] @@ -78,3 +80,46 @@ def is_valid_ip_address(address, family=socket.AF_INET): return False return True + + +def join_ipv4_segments(segments): + """ + Helper method to join ip numeric segment pieces back into a full + ip address. + + :param segments: IPv4 segments to join. + :type segments: ``list`` or ``tuple`` + + :return: IPv4 address. + :rtype: ``str`` + """ + return '.'.join([str(s) for s in segments]) + + +def increment_ipv4_segments(segments): + """ + Increment an ip address given in quad segments based on ipv4 rules + + :param segments: IPv4 segments to increment. + :type segments: ``list`` or ``tuple`` + + :return: Incremented segments. + :rtype: ``list`` + """ + segments = [int(segment) for segment in segments] + + segments[3] += 1 + + if segments[3] == 256: + segments[3] = 0 + segments[2] += 1 + + if segments[2] == 256: + segments[2] = 0 + segments[1] += 1 + + if segments[1] == 256: + segments[1] = 0 + segments[0] += 1 + + return segments
