From bc8ddf1be492746b35dbd83248255af9f06f783f Mon Sep 17 00:00:00 2001 From: Pavel Patsey Date: Sat, 25 Jan 2025 10:28:03 +0300 Subject: [PATCH] add insurance functions, delete raise exception from find_parent function --- tests/cidr4_merge/test_cidr4_merger.py | 30 +++---------------------- vpn_manager/cidr4_merge/cidr4_merger.py | 25 +++++++++++++++++---- 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/tests/cidr4_merge/test_cidr4_merger.py b/tests/cidr4_merge/test_cidr4_merger.py index f4a9652..49df2f3 100644 --- a/tests/cidr4_merge/test_cidr4_merger.py +++ b/tests/cidr4_merge/test_cidr4_merger.py @@ -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(): diff --git a/vpn_manager/cidr4_merge/cidr4_merger.py b/vpn_manager/cidr4_merge/cidr4_merger.py index 6b3a5e0..b7cbe74 100644 --- a/vpn_manager/cidr4_merge/cidr4_merger.py +++ b/vpn_manager/cidr4_merge/cidr4_merger.py @@ -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")