You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+98-60Lines changed: 98 additions & 60 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,22 +1,59 @@
1
1
# netcompare
2
2
3
-
This library is meant to be a light-weight way to compare structured output from network devices `show` commands. `netcompare`is a python library targeted at intelligently deep diffing structured data objects of json type. In addition, `netcompare` can also provide some basic testing of key/values within a data structure.
3
+
The `netcompare` is a light-weight library to examine structured data. `netcompare`provides an interface to intelligently compare json data objects as well as test for the presence (or absence) of keys, and to examine and compare their values.
4
4
5
-
The library heavily relies on [jmespath](https://jmespath.org/) for traversing the json object and finding the value(s) to be evaluated. More on that later.
5
+
The library heavily relies on [jmespath](https://jmespath.org/) for traversing the json object and finding the value(s) to be evaluated. More on that [here](#customized-jmespath).
6
6
7
-
## Use Case
7
+
## Usage
8
8
9
-
`netcompare` enables an easy and direct way to see the outcome of network configuration or operational status change. The intended usage is to collect structured `show` command output before and after a change window. Prior to closing the change window, the results are compared to help determine if the change was successful as intended and if the network is in an acceptable state. The output can be stored with the change's documentation for easy reference and proof of completion.
9
+
A `netcompare` Check accepts two objects as input: the reference object, and the comparison object. The reference object is used as the intended or accepted state and it's keys and values are compared against the comparison object.
10
+
11
+
`netcompare` does not collect the data for you, it simply works on data passed into it. This allows for maximum flexibility in collecting the data.
12
+
13
+
For instance, the reference state can be collected from the network directly using any method that returns structured data: ansible, napalm, nornir to name a few. You could also choose to generate the reference state from an SoT, such as [Nautobot](https://github.com/nautobot/nautobot/), and have a true intended state.
14
+
15
+
`netcompare` is perfectly suited to work with data gathered from network devices via show commands, Ansible playbooks, as well as in applications such as [Nautobot](https://github.com/nautobot/nautobot/), or [Netbox](https://github.com/netbox-community/netbox). `netcompare` is focused on being the 'plumbing' behind a full network automation validation solution.
16
+
17
+
### Testing data structures
18
+
19
+
Briefly, these tests, or `CheckTypes`, are provided to test the objects, to aide in determining the status of the data.
20
+
21
+
-`exact_match`: the keys and values much match, exactly, between the two objects
22
+
-`tolerance`: the keys must match and the values can differ according to the 'tolerance' value provided
23
+
-`parameter_match`: a reference key and value is provided and it's presence (or absence) is checked in the provided object
24
+
-`regex`: a reference regex pattern is provided and it's presence (or absence) is checked for a match in the provided object
25
+
-`operator`: similar to parameter match, but the reference includes several different possible operators: 'in', 'bool', 'string', and numerical comparison with 'int' and 'float' to check against
26
+
27
+
`CheckTypes` are explained in more detail in the [CheckTypes Explained section](#check-types-explained).
1. The reference state object is assembled. The structured data may be collected from:
38
+
39
+
- an SoT
40
+
- Directly from the network using any Automation that returns structured data
41
+
42
+
2. The Network Engineer makes changes to the network, whether it is an upgrade, peering change, or migration.
43
+
3. The comparison state is collected, typically directly from the network, but any method is acceptable.
44
+
4. The reference state is then compared to the current state using the netcompare library.
10
45
11
46
## Library Architecture
12
47
13
-

48
+
||
49
+
|:---:|
50
+
|**`netcompare` architecture**|
14
51
15
52
An instance of `CheckType` object must be created first before passing one of the below check types as an argument:
16
53
17
54
-`exact_match`
18
55
-`tolerance`
19
-
-`parameters`
56
+
-`parameter_match`
20
57
-`regex`
21
58
-`operator`
22
59
@@ -26,7 +63,7 @@ my_check = "exact_match"
26
63
check = CheckType.init(my_check)
27
64
```
28
65
29
-
Next, define a json object as reference data, as well as a JMESPATH expression to extract the value wanted and pass them to `get_value` method. Be aware! `netcompare` works with a customized version of JMESPATH. More on that later.
66
+
Next, define a json object as reference data, as well as a JMESPATH expression to extract the value wanted and pass them to `get_value` method. Be aware! `netcompare` works with a customized version of JMESPATH. More on that [below](#customized-jmespath).
30
67
31
68
```python
32
69
bgp_pre_change ="./pre/bgp.json"
@@ -118,7 +155,7 @@ That would give us...
118
155
119
156
```
120
157
121
-
## Check Types Explained
158
+
## `CheckTypes` Explained
122
159
123
160
### exact_match
124
161
@@ -222,58 +259,6 @@ Targeting only the `interfaceStatus` key, we would need to define a reference ke
222
259
The anchor logic for the reference key applies to all check-types available in `netcompare`
223
260
224
261
225
-
### parameter_match
226
-
227
-
parameter_match provides a way to match keys and values in the output with known good values.
228
-
229
-
The test defines key/value pairs known to be the good value - type `dict()` - as well as a mode - `match`, `no-match` - to match or not against the parsed output. The test fails if any status has changed based on what is defined in pre/post. If there are new values not contained in the input/test value, that will not count as a failure.
In network data, this could be a state of bgp neighbors being Established or the connectedness of certain interfaces being up.
276
-
277
262
### Tolerance
278
263
279
264
The `tolerance` test defines a percentage of differing `float()` between pre and post checks numeric value. The threshold is defined as a percentage that can be different either from the value stated in pre and post fields.
@@ -358,6 +343,59 @@ Lets have a look to a couple of examples:
358
343
This test can test the tolerance for changing quantities of certain things such as routes, or L2 or L3 neighbors. It could also test actual outputted values such as transmitted light levels for optics.
359
344
360
345
346
+
### Parameter_match
347
+
348
+
parameter_match provides a way to match keys and values in the output with known good values.
349
+
350
+
The test defines key/value pairs known to be the good value - type `dict()` - as well as a mode - `match`, `no-match` - to match or not against the parsed output. The test fails if any status has changed based on what is defined in pre/post. If there are new values not contained in the input/test value, that will not count as a failure.
In network data, this could be a state of bgp neighbors being Established or the connectedness of certain interfaces being up.
397
+
398
+
361
399
### Regex
362
400
363
401
The `regex` check type evaluates data against a python regular expression defined as check-type argument. As per `parameter_match` the option `match`, `no-match`is also supported.
0 commit comments