Cidr4 merge algorithm #5
@@ -1,7 +1,4 @@
|
||||
import pytest
|
||||
|
||||
from vpn_manager.cidr4_merge.cidr4_merger import (
|
||||
Cidr4MergerError,
|
||||
calc_dip,
|
||||
cidr4_to_node,
|
||||
find_neighbors,
|
||||
@@ -47,30 +44,9 @@ def test_find_parent():
|
||||
assert find_parent((0, 2), (3221225472, 2)) == (0, 0)
|
||||
assert find_parent((1, 32), (6, 32)) == (0, 29)
|
||||
|
||||
|
||||
def test_find_parent__with_exception():
|
||||
with pytest.raises(Exception) as exc_info:
|
||||
find_parent((0, 32), (0, 29))
|
||||
assert (
|
||||
str(exc_info.value)
|
||||
== "Error! Trying to find common parent of network and subnet! parent_node=(0, 29), a=(0, 32), b=(0, 29)."
|
||||
)
|
||||
assert exc_info.type is Cidr4MergerError
|
||||
with pytest.raises(Exception) as exc_info:
|
||||
find_parent((0, 1), (1073741824, 2))
|
||||
assert (
|
||||
str(exc_info.value)
|
||||
== "Error! Trying to find common parent of network and subnet! parent_node=(0, 1), a=(0, 1), b=(1073741824, 2)."
|
||||
)
|
||||
assert exc_info.type is Cidr4MergerError
|
||||
|
||||
with pytest.raises(Exception) as exc_info:
|
||||
find_parent((0, 0), (3221225472, 2))
|
||||
assert (
|
||||
str(exc_info.value)
|
||||
== "Error! Trying to find common parent of network and subnet! parent_node=(0, 0), a=(0, 0), b=(3221225472, 2)."
|
||||
)
|
||||
assert exc_info.type is Cidr4MergerError
|
||||
assert find_parent((0, 32), (0, 29)) == (0, 29)
|
||||
assert find_parent((0, 1), (1073741824, 2)) == (0, 1)
|
||||
assert find_parent((0, 0), (3221225472, 2)) == (0, 0)
|
||||
|
||||
|
||||
def test_calc_dip():
|
||||
|
||||
@@ -19,10 +19,6 @@ def find_parent(a: Node, b: Node) -> Node:
|
||||
mask = (mask << 1) & ((1 << 32) - 1)
|
||||
ip = ip_a & mask
|
||||
parent_node = ip, mask_len
|
||||
if parent_node == a or parent_node == b:
|
||||
raise Cidr4MergerError(
|
||||
f"Error! Trying to find common parent of network and subnet! {parent_node=}, {a=}, {b=}."
|
||||
)
|
||||
return parent_node
|
||||
|
||||
|
||||
@@ -64,6 +60,20 @@ def merge_nodes(nodes: list[Node], required_len: int) -> tuple[list[Node], int]:
|
||||
return nodes, sum_dip
|
||||
|
||||
|
||||
def find_subnets(nodes: list[Node]) -> list[tuple[Node, Node]]:
|
||||
subnets = []
|
||||
for i, (a, b) in enumerate(zip(nodes, nodes[1:])):
|
||||
parent_node, dip = merge_two_nodes(a, b)
|
||||
if parent_node == a or parent_node == b:
|
||||
subnets.append((a, b))
|
||||
return subnets
|
||||
|
||||
|
||||
def ensure_no_subnets(nodes: list[Node]):
|
||||
if subnets := find_subnets(nodes):
|
||||
raise Cidr4MergerError(f"There are subnets! {subnets=}")
|
||||
|
||||
|
||||
def find_neighbors(nodes: list[Node]) -> list[tuple[int, Node, Node]]:
|
||||
neighbors = []
|
||||
for i, (a, b) in enumerate(zip(nodes, nodes[1:])):
|
||||
@@ -73,10 +83,17 @@ def find_neighbors(nodes: list[Node]) -> list[tuple[int, Node, Node]]:
|
||||
return neighbors
|
||||
|
||||
|
||||
def ensure_no_neighbors(nodes: list[Node]):
|
||||
if neighbors := find_neighbors(nodes):
|
||||
raise Cidr4MergerError(f"There are neighbors! {neighbors=}")
|
||||
|
||||
|
||||
def main():
|
||||
required_len = 20
|
||||
data = get_data()
|
||||
nodes = sorted(map(cidr4_to_node, data))
|
||||
ensure_no_subnets(nodes)
|
||||
ensure_no_neighbors(nodes)
|
||||
merged_nodes, sum_dip = merge_nodes(nodes, required_len)
|
||||
cidr4s = [make_cidr4(ip, mask_len) for ip, mask_len in merged_nodes]
|
||||
print(cidr4s, sum_dip, sep="\n")
|
||||
|
||||
Reference in New Issue
Block a user