Skip to content

Commit 872ffa1

Browse files
pszulczewskiPatryk Szulczewski
andauthored
Improve tolerance check. (#24)
Co-authored-by: Patryk Szulczewski <patryk.szulczewski@networktocode.com>
1 parent a1a41a3 commit 872ffa1

File tree

4 files changed

+84
-8
lines changed

4 files changed

+84
-8
lines changed

netcompare/check_type.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,19 @@ def __init__(self, *args):
7272
def evaluate(self, reference_value: Mapping, value_to_compare: Mapping) -> Tuple[Dict, bool]:
7373
"""Returns the difference between values and the boolean. Overwrites method in base class."""
7474
diff = diff_generator(reference_value, value_to_compare)
75-
diff = self._get_outliers(diff)
75+
self._remove_within_tolerance(diff)
7676
return diff, not diff
7777

78-
def _get_outliers(self, diff: Mapping) -> Dict:
79-
"""Return a mapping of values outside the tolerance threshold."""
80-
result = {
81-
key: {sub_key: values for sub_key, values in obj.items() if not self._within_tolerance(**values)}
82-
for key, obj in diff.items()
83-
}
84-
return {key: obj for key, obj in result.items() if obj}
78+
def _remove_within_tolerance(self, diff: Dict) -> None:
79+
"""Recursively look into diff and apply tolerance check, remove reported difference when within tolerance."""
80+
for key, value in list(diff.items()): # casting list makes copy, so we don't modify object being iterated.
81+
if isinstance(value, dict):
82+
if "new_value" in value.keys() and "old_value" in value.keys() and self._within_tolerance(**value):
83+
diff.pop(key)
84+
else:
85+
self._remove_within_tolerance(diff[key])
86+
if not value:
87+
diff.pop(key)
8588

8689
def _within_tolerance(self, *, old_value: float, new_value: float) -> bool:
8790
"""Return True if new value is within the tolerance range of the previous value."""

tests/mock/tolerance/post.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"interfaces": {
3+
"Ethernet1": {
4+
"power_level": 4
5+
},
6+
"Ethernet2": {
7+
"power_level": -4
8+
},
9+
"Ethernet3": {
10+
"power_level": 3
11+
},
12+
"Ethernet4": {
13+
"power_level": -4
14+
}
15+
}
16+
}

tests/mock/tolerance/pre.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"interfaces": {
3+
"Ethernet1": {
4+
"power_level": -4
5+
},
6+
"Ethernet2": {
7+
"power_level": -4
8+
},
9+
"Ethernet3": {
10+
"power_level": -3
11+
},
12+
"Ethernet4": {
13+
"power_level": -4
14+
}
15+
}
16+
}

tests/test_type_check.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,52 @@ def test_check_type_results(check_type_args, folder_name, path, expected_results
138138
),
139139
)
140140

141+
tolerance_no_path = (
142+
"tolerance",
143+
("tolerance", 10),
144+
"",
145+
(
146+
{
147+
"interfaces": {
148+
"Ethernet1": {"power_level": {"new_value": 4, "old_value": -4}},
149+
"Ethernet3": {"power_level": {"new_value": 3, "old_value": -3}},
150+
}
151+
},
152+
False,
153+
),
154+
)
155+
156+
tolerance_path = (
157+
"tolerance",
158+
("tolerance", 10),
159+
"interfaces",
160+
(
161+
{
162+
"Ethernet1": {"power_level": {"new_value": 4, "old_value": -4}},
163+
"Ethernet3": {"power_level": {"new_value": 3, "old_value": -3}},
164+
},
165+
False,
166+
),
167+
)
168+
169+
tolerance_deep_path = (
170+
"tolerance",
171+
("tolerance", 10),
172+
"interfaces.Ethernet1",
173+
(
174+
{"power_level": {"new_value": 4, "old_value": -4}},
175+
False,
176+
),
177+
)
178+
141179
check_tests = [
142180
napalm_bgp_neighbor_status,
143181
napalm_bgp_neighbor_prefixes_ipv4,
144182
napalm_bgp_neighbor_prefixes_ipv6,
145183
napalm_get_lldp_neighbors_exact_raw,
184+
tolerance_no_path,
185+
tolerance_path,
186+
tolerance_deep_path,
146187
]
147188

148189

0 commit comments

Comments
 (0)