Improve ut coverage (#145)

Improve ut coverage

SUMMARY

Add more testcases for ipaddr filter

ISSUE TYPE

COMPONENT NAME

ipaddr.py
ADDITIONAL INFORMATION

Reviewed-by: Nilashish Chakraborty <nilashishchakraborty8@gmail.com>
Reviewed-by: Ashwini Mhatre <mashu97@gmail.com>
Reviewed-by: Sagar Paul <sagpaul@redhat.com>
pull/147/head
Ashwini Mhatre 2022-03-01 10:36:47 +05:30 committed by GitHub
parent a14a9337c6
commit 9f510450f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 757 additions and 154 deletions

View File

@ -0,0 +1,3 @@
---
trivial:
- Add more testcases for ipaddr filter plugins.

View File

@ -671,9 +671,6 @@ def _linux_query(v):
def _postgresql_query(v): def _postgresql_query(v):
v.dialect = netaddr.mac_pgsql v.dialect = netaddr.mac_pgsql
import epdb
epdb.serve()
return str(v) return str(v)

View File

@ -4,180 +4,783 @@
# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) # (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
""" """
Unit test file for cidr_merge filter plugin Unit test file for ipaddr filter plugins
""" """
from __future__ import absolute_import, division, print_function from __future__ import absolute_import, division, print_function
__metaclass__ = type __metaclass__ = type
import sys
import pytest
import unittest import unittest
from ansible.errors import AnsibleFilterError from ansible.errors import AnsibleFilterError
from ansible_collections.ansible.utils.plugins.filter.ipaddr import _ipaddr from ansible_collections.ansible.utils.plugins.plugin_utils.base.ipaddr_utils import (
ipaddr,
)
from ansible_collections.ansible.utils.plugins.filter.next_nth_usable import (
next_nth_usable,
)
from ansible_collections.ansible.utils.plugins.filter.ipsubnet import ipsubnet
from ansible_collections.ansible.utils.plugins.filter.previous_nth_usable import (
previous_nth_usable,
)
from ansible_collections.ansible.utils.plugins.filter.network_in_usable import (
network_in_usable,
)
from ansible_collections.ansible.utils.plugins.filter.network_in_network import (
network_in_network,
)
from ansible_collections.ansible.utils.plugins.filter.nthhost import nthhost
from ansible_collections.ansible.utils.plugins.filter.reduce_on_network import (
reduce_on_network,
)
from ansible_collections.ansible.utils.plugins.filter.cidr_merge import (
cidr_merge,
)
from ansible_collections.ansible.utils.plugins.filter.ipmath import ipmath
from ansible_collections.ansible.utils.plugins.filter.slaac import slaac
from ansible_collections.ansible.utils.plugins.filter.ip4_hex import ip4_hex
VALID_DATA = [ netaddr = pytest.importorskip("netaddr")
"192.24.2.1",
"host.fqdn",
"::1",
"",
"192.168.32.0/24",
"fe80::100/10",
"42540766412265424405338506004571095040/64",
True,
]
VALID_DATA1 = ["192.168.32.0/24", "2001:db8:32c:faad::/64"]
VALID_OUTPUT = [
"192.24.2.1",
"::1",
"192.168.32.0/24",
"fe80::100/10",
"2001:db8:32c:faad::/64",
]
VALID_OUTPUT1 = ["192.24.2.1", "::1", "fe80::100", "2001:db8:32c:faad::"]
VALID_OUTPUT2 = ["192.24.2.1/32", "::1/128", "fe80::100/10"]
VALID_OUTPUT3 = ["192.24.2.1", "2001:db8:32c:faad::/64"]
VALID_OUTPUT4 = ["192.168.32.0/24", "fe80::100/10"]
VALID_OUTPUT5 = ["192.168.32.0/24", "2001:db8:32c:faad::/64"]
VALID_OUTPUT6 = [256, 18446744073709551616]
VALID_OUTPUT7 = ["192.24.2.1", "192.168.32.0/24"]
VALID_OUTPUT8 = ["192.168.32.0/24", "2001:db8:32c:faad::/64"]
# ansible_default_ipv4 = {
# "address": "192.168.0.11",
# "alias": "eth0",
# "broadcast": "192.168.0.255",
# "gateway": "192.168.0.1",
# "interface": "eth0",
# "macaddress": "fa:16:3e:c4:bd:89",
# "mtu": 1500,
# "netmask": "255.255.255.0",
# "network": "192.168.0.0",
# "type": "ether"
# }
net_mask = "192.168.0.0/255.255.255.0"
host_prefix = ["2001:db8:deaf:be11::ef3/64", "192.0.2.48/24", "192.168.0.0/16"]
class TestIpAddr(unittest.TestCase): class TestIpFilter(unittest.TestCase):
def setUp(self): def test_cidr_merge(self):
pass with pytest.raises(
AnsibleFilterError, match="cidr_merge: expected iterable, got None"
):
cidr_merge(None)
def test_valid_data_empty(self): with pytest.raises(
"""Check passing invalid argspec""" AnsibleFilterError, match="cidr_merge: invalid action 'floop'"
):
cidr_merge([], "floop")
args = ["", VALID_DATA, ""] self.assertEqual(cidr_merge([]), [])
result = _ipaddr(*args) self.assertEqual(cidr_merge([], "span"), None)
self.assertEqual(result, VALID_OUTPUT) subnets = ["1.12.1.0/24"]
self.assertEqual(cidr_merge(subnets), subnets)
self.assertEqual(cidr_merge(subnets, "span"), subnets[0])
subnets = ["1.12.1.0/25", "1.12.1.128/25"]
self.assertEqual(cidr_merge(subnets), ["1.12.1.0/24"])
self.assertEqual(cidr_merge(subnets, "span"), "1.12.1.0/24")
subnets = ["1.12.1.0/25", "1.12.1.128/25", "1.12.2.0/24"]
self.assertEqual(cidr_merge(subnets), ["1.12.1.0/24", "1.12.2.0/24"])
self.assertEqual(cidr_merge(subnets, "span"), "1.12.0.0/22")
subnets = ["1.12.1.1", "1.12.1.255"]
self.assertEqual(cidr_merge(subnets), ["1.12.1.1/32", "1.12.1.255/32"])
self.assertEqual(cidr_merge(subnets, "span"), "1.12.1.0/24")
def test_valid_data_address(self): def test_ipaddr_empty_query(self):
"""Check passing invalid argspec""" self.assertEqual(ipaddr("192.0.2.230"), "192.0.2.230")
self.assertEqual(ipaddr("192.0.2.230/30"), "192.0.2.230/30")
self.assertEqual(ipaddr([]), [])
args = ["", VALID_DATA, "address"] self.assertEqual(ipaddr(True), False)
result = _ipaddr(*args) self.assertEqual(ipaddr(""), False)
self.assertEqual(result, VALID_OUTPUT1)
def test_valid_data_host(self): def test_ipaddr_6to4_query(self):
"""Check passing invalid argspec""" v6_address = "2002:c000:02e6::1/48"
self.assertEqual(ipaddr("192.0.2.230", "6to4"), v6_address)
self.assertEqual(ipaddr("192.0.2.230/24", "6to4"), v6_address)
self.assertFalse(ipaddr("192.0.2.0/24", "6to4"))
args = ["", VALID_DATA, "host"] self.assertFalse(ipaddr("fd::e", "6to4"))
result = _ipaddr(*args) self.assertFalse(ipaddr("fd::e/20", "6to4"))
self.assertEqual(result, VALID_OUTPUT2)
def test_valid_data_public(self):
"""Check passing invalid argspec"""
args = ["", VALID_DATA, "public"]
result = _ipaddr(*args)
self.assertEqual(result, VALID_OUTPUT3)
def test_valid_data_private(self):
"""Check passing invalid argspec"""
args = ["", VALID_DATA, "private"]
result = _ipaddr(*args)
self.assertEqual(result, VALID_OUTPUT4)
def test_valid_data_net(self):
"""Check passing invalid argspec"""
args = ["", VALID_DATA, "net"]
result = _ipaddr(*args)
self.assertEqual(result, VALID_OUTPUT5)
def test_valid_data_size(self):
"""Check passing invalid argspec"""
args = ["", VALID_DATA1, "size"]
result = _ipaddr(*args)
self.assertEqual(result, VALID_OUTPUT6)
def test_valid_data_network_range(self):
"""Check passing invalid argspec"""
args = ["", VALID_DATA, "192.0.0.0/8"]
result = _ipaddr(*args)
self.assertEqual(result, VALID_OUTPUT7)
def test_valid_data_with_index(self):
"""Check passing invalid argspec"""
args = ["", VALID_DATA1, "0"]
result = _ipaddr(*args)
self.assertEqual(result, VALID_OUTPUT8)
def test_invalid_data(self):
"""Check passing invalid argspec"""
args = ["", VALID_DATA, "tftftf"]
kwargs = {}
with self.assertRaises(AnsibleFilterError) as error:
_ipaddr(*args, **kwargs)
self.assertIn("unknown filter type: tftftf", str(error.exception))
def test_valid_data_with_prefix(self):
"""Check passing invalid argspec"""
args = ["", net_mask, "prefix"]
result = _ipaddr(*args)
self.assertEqual(result, [24])
def test_valid_data_with_host_prefix(self):
"""Check passing invalid argspec"""
args = ["", host_prefix, "host/prefix"]
result = _ipaddr(*args)
self.assertEqual( self.assertEqual(
result, ["2001:db8:deaf:be11::ef3/64", "192.0.2.48/24"] ipaddr("2002:c000:02e6::1", "6to4"), "2002:c000:02e6::1"
)
self.assertEqual(ipaddr(v6_address, "6to4"), v6_address)
self.assertEqual(
ipaddr(
["192.0.2.230", "192.0.2.0/24", "fd::e", "2002:c000:02e6::1"],
"6to4",
),
[v6_address, "2002:c000:02e6::1"],
) )
def test_valid_data_with_network_prefix(self): def test_ipaddr_address_query(self):
"""Check passing invalid argspec""" self.assertEqual(ipaddr("192.0.2.230", "address"), "192.0.2.230")
self.assertEqual(ipaddr("192.0.2.230/24", "address"), "192.0.2.230")
self.assertIsNone(ipaddr("192.0.2.0/24", "address"))
self.assertEqual(ipaddr("192.0.2.0/31", "address"), "192.0.2.0")
self.assertEqual(ipaddr("2001::1", "address"), "2001::1")
self.assertEqual(ipaddr("2001::1/48", "address"), "2001::1")
self.assertEqual(ipaddr("2001::", "address"), "2001::")
self.assertEqual(ipaddr("2001::/48", "address"), "2001::")
ipaddress = "192.168.0.11/255.255.255.0" def test_ipaddr_bool_query(self):
self.assertTrue(ipaddr("192.0.2.20", "bool"))
self.assertFalse(ipaddr("192.900.2.20", "bool"))
args = ["", ipaddress, "network/prefix"] def test_netmask(self):
result = _ipaddr(*args) address = "1.1.1.1/24"
self.assertEqual(result, ["192.168.0.0/24"]) self.assertEqual(ipaddr(address, "netmask"), "255.255.255.0")
address = "1.1.1.1/25"
self.assertEqual(ipaddr(address, "netmask"), "255.255.255.128")
address = "1.12.1.34/32"
self.assertEqual(ipaddr(address, "netmask"), "255.255.255.255")
def test_valid_data_with_subnet(self): def test_network(self):
"""Check passing invalid argspec""" address = "1.12.1.34/32"
self.assertEqual(ipaddr(address, "network"), "1.12.1.34")
address = "1.12.1.34/255.255.255.255"
self.assertEqual(ipaddr(address, "network"), "1.12.1.34")
address = "1.12.1.34"
self.assertEqual(ipaddr(address, "network"), "1.12.1.34")
address = "1.12.1.35/31"
self.assertEqual(ipaddr(address, "network"), "1.12.1.34")
address = "1.12.1.34/24"
self.assertEqual(ipaddr(address, "network"), "1.12.1.0")
args = ["", host_prefix, "host/prefix"] def test_broadcast(self):
result1 = _ipaddr(*args) address = "1.12.1.34/24"
self.assertEqual(ipaddr(address, "broadcast"), "1.12.1.255")
address = "1.12.1.34/16"
self.assertEqual(ipaddr(address, "broadcast"), "1.12.255.255")
address = "1.12.1.34/27"
self.assertEqual(ipaddr(address, "broadcast"), "1.12.1.63")
address = "1.12.1.34/32"
self.assertEqual(ipaddr(address, "broadcast"), None)
address = "1.12.1.35/31"
self.assertEqual(ipaddr(address, "broadcast"), None)
args = ["", result1, "subnet"] def test_first_usable(self):
result = _ipaddr(*args) with pytest.raises(AnsibleFilterError, match="Not a network address"):
self.assertEqual(result, ["2001:db8:deaf:be11::/64", "192.0.2.0/24"]) ipaddr("1.12.1.34", "first_usable")
address = "1.12.1.0/24"
self.assertEqual(ipaddr(address, "first_usable"), "1.12.1.1")
address = "1.12.1.36/24"
self.assertEqual(ipaddr(address, "first_usable"), "1.12.1.1")
address = "1.12.1.36/28"
self.assertEqual(ipaddr(address, "first_usable"), "1.12.1.33")
address = "1.12.1.36/255.255.255.240"
self.assertEqual(ipaddr(address, "first_usable"), "1.12.1.33")
address = "1.12.1.36/31"
self.assertEqual(ipaddr(address, "first_usable"), "1.12.1.36")
address = "1.12.1.37/31"
self.assertEqual(ipaddr(address, "first_usable"), "1.12.1.36")
address = "1.12.1.36/32"
self.assertEqual(ipaddr(address, "first_usable"), None)
def test_host_query(self):
self.assertEqual(ipaddr("192.0.2.1", "host"), "192.0.2.1/32")
address = "192.0.2.12/20"
self.assertEqual(ipaddr(address, "host"), address)
address = "192.0.2.0/31"
self.assertEqual(ipaddr(address, "host"), address)
self.assertIsNone(ipaddr("192.0.2.0/24", "host"))
def test_last_usable(self):
with pytest.raises(AnsibleFilterError, match="Not a network address"):
ipaddr("1.12.1.34", "last_usable")
address = "1.12.1.0/24"
self.assertEqual(ipaddr(address, "last_usable"), "1.12.1.254")
address = "1.12.1.36/24"
self.assertEqual(ipaddr(address, "last_usable"), "1.12.1.254")
address = "1.12.1.36/28"
self.assertEqual(ipaddr(address, "last_usable"), "1.12.1.46")
address = "1.12.1.36/255.255.255.240"
self.assertEqual(ipaddr(address, "last_usable"), "1.12.1.46")
address = "1.12.1.36/31"
self.assertEqual(ipaddr(address, "last_usable"), "1.12.1.37")
address = "1.12.1.37/31"
self.assertEqual(ipaddr(address, "last_usable"), "1.12.1.37")
address = "1.12.1.36/32"
self.assertEqual(ipaddr(address, "last_usable"), None)
def test_wildcard(self):
address = "1.12.1.0/24"
self.assertEqual(ipaddr(address, "wildcard"), "0.0.0.255")
address = "1.12.1.0/25"
self.assertEqual(ipaddr(address, "wildcard"), "0.0.0.127")
address = "1.12.1.36/28"
self.assertEqual(ipaddr(address, "wildcard"), "0.0.0.15")
address = "1.12.1.36/255.255.255.240"
self.assertEqual(ipaddr(address, "wildcard"), "0.0.0.15")
address = "1.12.1.36/31"
self.assertEqual(ipaddr(address, "wildcard"), "0.0.0.1")
address = "1.12.1.37/31"
self.assertEqual(ipaddr(address, "wildcard"), "0.0.0.1")
address = "1.12.1.36/32"
self.assertEqual(ipaddr(address, "wildcard"), "0.0.0.0")
address = "1.12.1.254/24"
self.assertEqual(ipaddr(address, "wildcard"), "0.0.0.255")
def test_size_usable(self):
address = "1.12.1.0/24"
self.assertEqual(ipaddr(address, "size_usable"), 254)
address = "1.12.1.0/25"
self.assertEqual(ipaddr(address, "size_usable"), 126)
address = "1.12.1.36/28"
self.assertEqual(ipaddr(address, "size_usable"), 14)
address = "1.12.1.36/255.255.255.240"
self.assertEqual(ipaddr(address, "size_usable"), 14)
address = "1.12.1.36/31"
self.assertEqual(ipaddr(address, "size_usable"), 2)
address = "1.12.1.37/31"
self.assertEqual(ipaddr(address, "size_usable"), 2)
address = "1.12.1.36/32"
self.assertEqual(ipaddr(address, "size_usable"), 0)
address = "1.12.1.254/24"
self.assertEqual(ipaddr(address, "size_usable"), 254)
def test_ipaddr_public_query(self):
self.assertIsNone(ipaddr("192.168.1.12", "public"))
self.assertIsNone(ipaddr("127.0.1.25", "public"))
self.assertIsNone(ipaddr("255.255.240.0", "public"))
self.assertEqual(ipaddr("76.120.99.190", "public"), "76.120.99.190")
self.assertEqual(
ipaddr(["192.168.1.12", "127.0.1.25", "255.255.240.0"], "public"),
[],
)
self.assertEqual(
ipaddr(
[
"192.168.1.12",
"127.0.1.25",
"255.255.240.0",
"76.120.99.190",
],
"public",
),
["76.120.99.190"],
)
def test_range_usable(self):
address = "1.12.1.0/24"
self.assertEqual(
ipaddr(address, "range_usable"), "1.12.1.1-1.12.1.254"
)
address = "1.12.1.0/25"
self.assertEqual(
ipaddr(address, "range_usable"), "1.12.1.1-1.12.1.126"
)
address = "1.12.1.36/28"
self.assertEqual(
ipaddr(address, "range_usable"), "1.12.1.33-1.12.1.46"
)
address = "1.12.1.36/255.255.255.240"
self.assertEqual(
ipaddr(address, "range_usable"), "1.12.1.33-1.12.1.46"
)
address = "1.12.1.36/31"
self.assertEqual(
ipaddr(address, "range_usable"), "1.12.1.36-1.12.1.37"
)
address = "1.12.1.37/31"
self.assertEqual(
ipaddr(address, "range_usable"), "1.12.1.36-1.12.1.37"
)
address = "1.12.1.36/32"
self.assertEqual(ipaddr(address, "range_usable"), None)
address = "1.12.1.254/24"
self.assertEqual(
ipaddr(address, "range_usable"), "1.12.1.1-1.12.1.254"
)
def test_address_prefix(self):
# Regular address
address = "1.12.1.12/24"
self.assertEqual(ipaddr(address, "address/prefix"), address)
# Network address - invalid
address = "1.12.1.0/24"
self.assertFalse(ipaddr(address, "address/prefix"))
# But valid in a /31
address = "1.12.1.0/31"
self.assertEqual(ipaddr(address, "address/prefix"), address)
# Broadcast address - invalid
address = "1.12.1.255/24"
self.assertFalse(ipaddr(address, "address/prefix"))
# But valid in a /31
address = "1.12.1.255/31"
self.assertEqual(ipaddr(address, "address/prefix"), address)
# /32 - always valid?
address = "1.12.1.0/32"
self.assertEqual(ipaddr(address, "address/prefix"), address)
address = "1.12.1.12/32"
self.assertEqual(ipaddr(address, "address/prefix"), address)
address = "1.12.1.255/32"
self.assertEqual(ipaddr(address, "address/prefix"), address)
# No prefix means /32
address = "1.12.1.34"
self.assertEqual(ipaddr(address, "address/prefix"), "1.12.1.34/32")
# Hostmask also works
address = "1.12.1.36/255.255.255.240"
self.assertEqual(ipaddr(address, "address/prefix"), "1.12.1.36/28")
# But not hostmasks that don't make a valid CIDR prefix
address = "1.12.1.36/255.255.255.88"
self.assertFalse(ipaddr(address, "address/prefix"))
def test_ip_prefix(self):
address = "1.12.1.0/24"
self.assertEqual(ipaddr(address, "ip/prefix"), None)
address = "1.12.1.0/25"
self.assertEqual(ipaddr(address, "ip/prefix"), None)
address = "1.12.1.36/28"
self.assertEqual(ipaddr(address, "ip/prefix"), "1.12.1.36/28")
address = "1.12.1.36/255.255.255.240"
self.assertEqual(ipaddr(address, "ip/prefix"), "1.12.1.36/28")
address = "1.12.1.36/31"
self.assertEqual(ipaddr(address, "ip/prefix"), "1.12.1.36/31")
address = "1.12.1.37/31"
self.assertEqual(ipaddr(address, "ip/prefix"), "1.12.1.37/31")
address = "1.12.1.36/32"
self.assertEqual(ipaddr(address, "ip/prefix"), None)
address = "1.12.1.254/24"
self.assertEqual(ipaddr(address, "ip/prefix"), "1.12.1.254/24")
def test_ip_netmask(self):
address = "1.12.1.0/24"
self.assertEqual(ipaddr(address, "ip_netmask"), None)
address = "1.12.1.0/25"
self.assertEqual(ipaddr(address, "ip_netmask"), None)
address = "1.12.1.36/28"
self.assertEqual(
ipaddr(address, "ip_netmask"), "1.12.1.36 255.255.255.240"
)
address = "1.12.1.36/255.255.255.240"
self.assertEqual(
ipaddr(address, "ip_netmask"), "1.12.1.36 255.255.255.240"
)
address = "1.12.1.36/31"
self.assertEqual(
ipaddr(address, "ip_netmask"), "1.12.1.36 255.255.255.254"
)
address = "1.12.1.37/31"
self.assertEqual(
ipaddr(address, "ip_netmask"), "1.12.1.37 255.255.255.254"
)
address = "1.12.1.36/32"
self.assertEqual(ipaddr(address, "ip_netmask"), None)
address = "1.12.1.254/24"
self.assertEqual(
ipaddr(address, "ip_netmask"), "1.12.1.254 255.255.255.0"
)
def test_ipv6_query(self):
self.assertEqual(ipaddr("fd00:123::97", "ipv6"), "fd00:123::97")
self.assertEqual(
ipaddr("192.0.2.230", "ipv6"), "::ffff:192.0.2.230/128"
)
def test_ipaddr_link_local_query(self):
self.assertEqual(ipaddr("169.254.0.12", "link-local"), "169.254.0.12")
self.assertIsNone(ipaddr("192.0.2.12", "link-local"))
self.assertEqual(ipaddr("fe80::9", "link-local"), "fe80::9")
self.assertIsNone(ipaddr("2001::", "link-local"))
def test_network_id(self):
address = "1.12.1.0/24"
self.assertEqual(ipaddr(address, "network_id"), "1.12.1.0")
address = "1.12.1.0/25"
self.assertEqual(ipaddr(address, "network_id"), "1.12.1.0")
address = "1.12.1.36/28"
self.assertEqual(ipaddr(address, "network_id"), "1.12.1.32")
address = "1.12.1.36/255.255.255.240"
self.assertEqual(ipaddr(address, "network_id"), "1.12.1.32")
address = "1.12.1.36/31"
self.assertEqual(ipaddr(address, "network_id"), "1.12.1.36")
address = "1.12.1.37/31"
self.assertEqual(ipaddr(address, "network_id"), "1.12.1.36")
address = "1.12.1.36/32"
self.assertEqual(ipaddr(address, "network_id"), "1.12.1.36")
address = "1.12.1.254/24"
self.assertEqual(ipaddr(address, "network_id"), "1.12.1.0")
def test_network_prefix(self):
address = "1.12.1.0/24"
self.assertEqual(ipaddr(address, "network/prefix"), "1.12.1.0/24")
address = "1.12.1.0/25"
self.assertEqual(ipaddr(address, "network/prefix"), "1.12.1.0/25")
address = "1.12.1.36/28"
self.assertEqual(ipaddr(address, "network/prefix"), "1.12.1.32/28")
address = "1.12.1.36/255.255.255.240"
self.assertEqual(ipaddr(address, "network/prefix"), "1.12.1.32/28")
address = "1.12.1.36/31"
self.assertEqual(ipaddr(address, "network/prefix"), "1.12.1.36/31")
address = "1.12.1.37/31"
self.assertEqual(ipaddr(address, "network/prefix"), "1.12.1.36/31")
address = "1.12.1.36/32"
self.assertEqual(ipaddr(address, "network/prefix"), "1.12.1.36/32")
address = "1.12.1.254/24"
self.assertEqual(ipaddr(address, "network/prefix"), "1.12.1.0/24")
def test_network_netmask(self):
address = "1.12.1.0/24"
self.assertEqual(
ipaddr(address, "network_netmask"), "1.12.1.0 255.255.255.0"
)
address = "1.12.1.0/25"
self.assertEqual(
ipaddr(address, "network_netmask"), "1.12.1.0 255.255.255.128"
)
address = "1.12.1.36/28"
self.assertEqual(
ipaddr(address, "network_netmask"), "1.12.1.32 255.255.255.240"
)
address = "1.12.1.36/255.255.255.240"
self.assertEqual(
ipaddr(address, "network_netmask"), "1.12.1.32 255.255.255.240"
)
address = "1.12.1.36/31"
self.assertEqual(
ipaddr(address, "network_netmask"), "1.12.1.36 255.255.255.254"
)
address = "1.12.1.37/31"
self.assertEqual(
ipaddr(address, "network_netmask"), "1.12.1.36 255.255.255.254"
)
address = "1.12.1.36/32"
self.assertEqual(
ipaddr(address, "network_netmask"), "1.12.1.36 255.255.255.255"
)
address = "1.12.1.254/24"
self.assertEqual(
ipaddr(address, "network_netmask"), "1.12.1.0 255.255.255.0"
)
def test_network_wildcard(self):
address = "1.12.1.0/24"
self.assertEqual(
ipaddr(address, "network_wildcard"), "1.12.1.0 0.0.0.255"
)
address = "1.12.1.0/25"
self.assertEqual(
ipaddr(address, "network_wildcard"), "1.12.1.0 0.0.0.127"
)
address = "1.12.1.36/28"
self.assertEqual(
ipaddr(address, "network_wildcard"), "1.12.1.32 0.0.0.15"
)
address = "1.12.1.36/255.255.255.240"
self.assertEqual(
ipaddr(address, "network_wildcard"), "1.12.1.32 0.0.0.15"
)
address = "1.12.1.36/31"
self.assertEqual(
ipaddr(address, "network_wildcard"), "1.12.1.36 0.0.0.1"
)
address = "1.12.1.37/31"
self.assertEqual(
ipaddr(address, "network_wildcard"), "1.12.1.36 0.0.0.1"
)
address = "1.12.1.36/32"
self.assertEqual(
ipaddr(address, "network_wildcard"), "1.12.1.36 0.0.0.0"
)
address = "1.12.1.254/24"
self.assertEqual(
ipaddr(address, "network_wildcard"), "1.12.1.0 0.0.0.255"
)
def test_next_usable(self):
address = "1.12.1.0/24"
self.assertEqual(ipaddr(address, "next_usable"), "1.12.1.1")
address = "1.12.1.36/24"
self.assertEqual(ipaddr(address, "next_usable"), "1.12.1.37")
address = "1.12.1.36/28"
self.assertEqual(ipaddr(address, "next_usable"), "1.12.1.37")
address = "1.12.1.36/255.255.255.240"
self.assertEqual(ipaddr(address, "next_usable"), "1.12.1.37")
address = "1.12.1.36/31"
self.assertEqual(ipaddr(address, "next_usable"), "1.12.1.37")
address = "1.12.1.37/31"
self.assertEqual(ipaddr(address, "next_usable"), None)
address = "1.12.1.36/32"
self.assertEqual(ipaddr(address, "next_usable"), None)
address = "1.12.1.254/24"
self.assertEqual(ipaddr(address, "next_usable"), None)
def test_peer(self):
address = "1.12.1.0/31"
self.assertEqual(ipaddr(address, "peer"), "1.12.1.1")
address = "1.12.1.1/31"
self.assertEqual(ipaddr(address, "peer"), "1.12.1.0")
address = "1.12.1.1/30"
self.assertEqual(ipaddr(address, "peer"), "1.12.1.2")
address = "1.12.1.2/30"
self.assertEqual(ipaddr(address, "peer"), "1.12.1.1")
with self.assertRaises(AnsibleFilterError):
address = "1.12.1.34"
ipaddr(address, "peer")
with self.assertRaises(AnsibleFilterError):
address = "1.12.1.33/29"
ipaddr(address, "peer")
with self.assertRaises(AnsibleFilterError):
address = "1.12.1.32/30"
ipaddr(address, "peer")
with self.assertRaises(AnsibleFilterError):
address = "1.12.1.35/30"
ipaddr(address, "peer")
with self.assertRaises(AnsibleFilterError):
address = "1.12.1.34/32"
ipaddr(address, "peer")
def test_previous_usable(self):
address = "1.12.1.0/24"
self.assertEqual(ipaddr(address, "previous_usable"), None)
address = "1.12.1.36/24"
self.assertEqual(ipaddr(address, "previous_usable"), "1.12.1.35")
address = "1.12.1.36/28"
self.assertEqual(ipaddr(address, "previous_usable"), "1.12.1.35")
address = "1.12.1.36/255.255.255.240"
self.assertEqual(ipaddr(address, "previous_usable"), "1.12.1.35")
address = "1.12.1.36/31"
self.assertEqual(ipaddr(address, "previous_usable"), None)
address = "1.12.1.37/31"
self.assertEqual(ipaddr(address, "previous_usable"), "1.12.1.36")
address = "1.12.1.36/32"
self.assertEqual(ipaddr(address, "previous_usable"), None)
address = "1.12.1.254/24"
self.assertEqual(ipaddr(address, "previous_usable"), "1.12.1.253")
def test_ipmath(self):
self.assertEqual(ipmath("192.168.1.5", 5), "192.168.1.10")
self.assertEqual(ipmath("192.168.1.5", -5), "192.168.1.0")
self.assertEqual(ipmath("192.168.0.5", -10), "192.167.255.251")
self.assertEqual(ipmath("192.168.1.1/24", 5), "192.168.1.6")
self.assertEqual(ipmath("192.168.1.6/24", -5), "192.168.1.1")
self.assertEqual(ipmath("192.168.2.6/24", -10), "192.168.1.252")
self.assertEqual(ipmath("2001::1", 8), "2001::9")
self.assertEqual(ipmath("2001::1", 9), "2001::a")
self.assertEqual(ipmath("2001::1", 10), "2001::b")
self.assertEqual(ipmath("2001::5", -3), "2001::2")
self.assertEqual(
ipmath("2001::5", -10), "2000:ffff:ffff:ffff:ffff:ffff:ffff:fffb"
)
expected = "You must pass a valid IP address; invalid_ip is invalid"
with self.assertRaises(AnsibleFilterError) as exc:
ipmath("invalid_ip", 8)
self.assertEqual(exc.exception.message, expected)
expected = (
"You must pass an integer for arithmetic; "
"some_number is not a valid integer"
)
with self.assertRaises(AnsibleFilterError) as exc:
ipmath("1.2.3.4", "some_number")
self.assertEqual(exc.exception.message, expected)
def test_ipsubnet(self):
test_cases = (
(("1.1.1.1/24", "30"), "64"),
(("1.1.1.1/25", "24"), "0"),
(("1.12.1.34/32", "1.12.1.34/24"), "35"),
(("192.168.50.0/24", "192.168.0.0/16"), "51"),
(("192.168.144.5", "192.168.0.0/16"), "36870"),
(("192.168.144.5", "192.168.144.5/24"), "6"),
(("192.168.144.5/32", "192.168.144.0/24"), "6"),
(("192.168.144.16/30", "192.168.144.0/24"), "5"),
(("192.168.144.5",), "192.168.144.5/32"),
(("192.168.0.0/16",), "192.168.0.0/16"),
(("192.168.144.5",), "192.168.144.5/32"),
(("192.168.0.0/16", "20"), "16"),
(("192.168.0.0/16", "20", "0"), "192.168.0.0/20"),
(("192.168.0.0/16", "20", "-1"), "192.168.240.0/20"),
(("192.168.0.0/16", "20", "5"), "192.168.80.0/20"),
(("192.168.0.0/16", "20", "-5"), "192.168.176.0/20"),
(("192.168.144.5", "20"), "192.168.144.0/20"),
(("192.168.144.5", "18", "0"), "192.168.128.0/18"),
(("192.168.144.5", "18", "-1"), "192.168.144.4/31"),
(("192.168.144.5", "18", "5"), "192.168.144.0/23"),
(("192.168.144.5", "18", "-5"), "192.168.144.0/27"),
(("span", "test", "error"), False),
(("test",), False),
(("192.168.144.5", "500000", "-5"), False),
(("192.168.144.5", "18", "500000"), False),
(("200000", "18", "-5"), "0.3.13.64/27"),
)
for args, res in test_cases:
self._test_ipsubnet(args, res)
def _test_ipsubnet(self, ipsubnet_args, expected_result):
if (
ipsubnet_args == ("1.1.1.1/25", "24")
and expected_result == "0"
and sys.version_info >= (3, 7)
):
return # fails in netaddr on Python 3.7+
self.assertEqual(ipsubnet(*ipsubnet_args), expected_result)
with self.assertRaisesRegexp(
AnsibleFilterError,
"You must pass a valid subnet or IP address; invalid_subnet is invalid",
):
ipsubnet("192.168.144.5", "invalid_subnet")
with self.assertRaisesRegexp(
AnsibleFilterError,
"192.168.144.0/30 is not in the subnet 192.168.144.4/30",
):
ipsubnet("192.168.144.1/30", "192.168.144.5/30")
def test_nthhost(self):
address = "1.12.1.0/24"
self.assertFalse(nthhost(address))
self.assertEqual(nthhost(address, 5), "1.12.1.5")
address = "1.12.1.36/24"
self.assertEqual(nthhost(address, 10), "1.12.1.10")
address = "1.12.1.34"
self.assertFalse(
nthhost(address, "last_usable"), "Not a network address"
)
address = "1.12.1.36/28"
self.assertEqual(nthhost(address, 4), "1.12.1.36")
address = "1.12.1.36/255.255.255.240"
self.assertEqual(nthhost(address, 4), "1.12.1.36")
address = "1.12.1.36/31"
self.assertEqual(nthhost(address, 1), "1.12.1.37")
address = "1.12.1.37/31"
self.assertEqual(nthhost(address, 1), "1.12.1.37")
address = "1.12.1.36/32"
self.assertFalse(nthhost(address, 1))
address = "1.12.1.254/24"
self.assertEqual(nthhost(address, 2), "1.12.1.2")
def test_next_nth_usable(self):
address = "1.12.1.0/24"
self.assertEqual(next_nth_usable(address, 5), "1.12.1.5")
address = "1.12.1.36/24"
self.assertEqual(next_nth_usable(address, 10), "1.12.1.46")
address = "1.12.1.36/28"
self.assertEqual(next_nth_usable(address, 4), "1.12.1.40")
address = "1.12.1.36/255.255.255.240"
self.assertEqual(next_nth_usable(address, 4), "1.12.1.40")
address = "1.12.1.36/31"
self.assertEqual(next_nth_usable(address, 1), "1.12.1.37")
address = "1.12.1.37/31"
self.assertEqual(next_nth_usable(address, 1), None)
address = "1.12.1.36/32"
self.assertEqual(next_nth_usable(address, 1), None)
address = "1.12.1.254/24"
self.assertEqual(next_nth_usable(address, 2), None)
def test_previous_nth_usable(self):
address = "1.12.1.0/24"
self.assertEqual(previous_nth_usable(address, 5), None)
address = "1.12.1.36/24"
self.assertEqual(previous_nth_usable(address, 10), "1.12.1.26")
address = "1.12.1.36/28"
self.assertEqual(previous_nth_usable(address, 2), "1.12.1.34")
address = "1.12.1.36/255.255.255.240"
self.assertEqual(previous_nth_usable(address, 2), "1.12.1.34")
address = "1.12.1.36/31"
self.assertEqual(previous_nth_usable(address, 1), None)
address = "1.12.1.37/31"
self.assertEqual(previous_nth_usable(address, 1), "1.12.1.36")
address = "1.12.1.36/32"
self.assertEqual(previous_nth_usable(address, 1), None)
address = "1.12.1.254/24"
self.assertEqual(previous_nth_usable(address, 2), "1.12.1.252")
def test_network_in_usable(self):
subnet = "1.12.1.0/24"
address = "1.12.1.10"
self.assertEqual(network_in_usable(subnet, address), True)
subnet = "1.12.1.0/24"
address = "1.12.0.10"
self.assertEqual(network_in_usable(subnet, address), False)
subnet = "1.12.1.32/28"
address = "1.12.1.36"
self.assertEqual(network_in_usable(subnet, address), True)
subnet = "1.12.1.32/28"
address = "1.12.1.36/31"
self.assertEqual(network_in_usable(subnet, address), True)
subnet = "1.12.1.32/28"
address = "1.12.1.48/31"
self.assertEqual(network_in_usable(subnet, address), False)
subnet = "1.12.1.32/255.255.255.240"
address = "1.12.1.31"
self.assertEqual(network_in_usable(subnet, address), False)
subnet = "1.12.1.36/31"
address = "1.12.1.36"
self.assertEqual(network_in_usable(subnet, address), True)
subnet = "1.12.1.37/31"
address = "1.12.1.35"
self.assertEqual(network_in_usable(subnet, address), False)
subnet = "1.12.1.36/32"
address = "1.12.1.36"
self.assertEqual(network_in_usable(subnet, address), True)
subnet = "1.12.1.0/24"
address = "1.12.2.0"
self.assertEqual(network_in_usable(subnet, address), False)
def test_network_in_network(self):
subnet = "1.12.1.0/24"
address = "1.12.1.0"
self.assertEqual(network_in_network(subnet, address), True)
subnet = "1.12.1.0/24"
address = "1.12.0.10"
self.assertEqual(network_in_network(subnet, address), False)
subnet = "1.12.1.32/28"
address = "1.12.1.32/28"
self.assertEqual(network_in_network(subnet, address), True)
subnet = "1.12.1.32/28"
address = "1.12.1.47"
self.assertEqual(network_in_network(subnet, address), True)
subnet = "1.12.1.32/28"
address = "1.12.1.48/31"
self.assertEqual(network_in_network(subnet, address), False)
subnet = "1.12.1.32/255.255.255.240"
address = "1.12.1.31"
self.assertEqual(network_in_network(subnet, address), False)
subnet = "1.12.1.36/31"
address = "1.12.1.36"
self.assertEqual(network_in_network(subnet, address), True)
subnet = "1.12.1.37/31"
address = "1.12.1.35"
self.assertEqual(network_in_network(subnet, address), False)
subnet = "1.12.1.36/32"
address = "1.12.1.36"
self.assertEqual(network_in_network(subnet, address), True)
subnet = "1.12.1.0/24"
address = "1.12.2.0"
self.assertEqual(network_in_network(subnet, address), False)
def test_reduce_on_network(self):
subnet = "1.12.1.0/28"
addresses = ["1.12.1.0", "1.12.0.10"]
self.assertEqual(reduce_on_network(addresses, subnet), [addresses[0]])
addresses = ["1.12.2.0", "1.12.1.236"]
self.assertEqual(reduce_on_network(addresses, subnet), [])
subnet = "1.12.1.32/28"
addresses = ["1.12.1.32/28", "1.12.1.47", "1.12.1.48/31"]
self.assertEqual(reduce_on_network(addresses, subnet), addresses[:-1])
subnet = "1.12.1.36/32"
addresses = ["1.12.1.31", "1.12.1.36", "1.12.1.35", "1.12.1.40"]
self.assertEqual(reduce_on_network(addresses, subnet), [addresses[1]])
subnet = "1.12.1.32/255.255.255.240"
self.assertEqual(reduce_on_network(addresses, subnet), addresses[1:])
def test_slaac(self):
mac = "00:50:b6:aa:99:e2"
self.assertFalse(slaac("192.168.1.20", mac))
self.assertFalse(slaac("fd::9"))
self.assertFalse(slaac("floop"))
self.assertEqual(slaac("fd::9", mac), "fd::250:b6ff:feaa:99eb")
self.assertEqual(
slaac("fd00:1234:5678:9abc:def0::/20", mac),
"fd00:1000::250:b6ff:feaa:99e2",
)
def test_ip4_hex(self):
self.assertEqual(ip4_hex("192.0.2.24"), "c0000218")
self.assertEqual(ip4_hex("192.0.2.24", "."), "c0.00.02.18")