Skip to content

Commit f2c6fe6

Browse files
committed
Merge remote-tracking branch 'origin/develop'
2 parents 46eec6c + 08dbe99 commit f2c6fe6

File tree

504 files changed

+22080
-15408
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

504 files changed

+22080
-15408
lines changed

build/requirements.txt

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,32 @@
11
aiofiles==0.8.0; python_version >= "3.6" and python_version < "4.0"
22
aiohttp==3.7.4; python_version >= "3.6"
33
altair==4.2.0; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
4-
appnope==0.1.3; sys_platform == "darwin" and python_version >= "3.6" and platform_system == "Darwin"
5-
argon2-cffi-bindings==21.2.0; python_version >= "3.6"
4+
appnope==0.1.3; sys_platform == "darwin" and python_version >= "3.7" and platform_system == "Darwin"
5+
argon2-cffi-bindings==21.2.0; python_version >= "3.7"
66
argon2-cffi==21.3.0; python_version >= "3.7"
77
asgiref==3.5.2; python_version >= "3.7"
88
async-timeout==3.0.1; python_full_version >= "3.5.3"
99
asyncssh==2.11.0; python_version >= "3.6"
10-
attrs==21.4.0; python_full_version >= "3.7.1" and python_version >= "3.6" and python_version < "4.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7")
11-
backcall==0.2.0; python_version >= "3.6"
10+
attrs==21.4.0; python_full_version >= "3.7.1" and python_version >= "3.7" and python_version < "4.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7")
11+
backcall==0.2.0; python_version >= "3.7"
1212
beautifulsoup4==4.11.1; python_full_version >= "3.6.0" and python_version >= "3.7"
1313
bidict==0.22.0; python_version >= "3.7"
1414
bleach==5.0.0; python_version >= "3.7"
15-
blinker==1.4; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.6"
15+
blinker==1.4; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
1616
cachetools==5.2.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.1"
17-
certifi==2022.5.18.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6"
18-
cffi==1.15.0; implementation_name == "pypy" and python_version >= "3.6"
17+
certifi==2022.5.18.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7"
18+
cffi==1.15.0; implementation_name == "pypy" and python_version >= "3.7"
1919
chardet==3.0.4; python_version >= "3.6"
20-
charset-normalizer==2.0.12; python_full_version >= "3.6.0" and python_version >= "3.6"
20+
charset-normalizer==2.0.12; python_full_version >= "3.6.0" and python_version >= "3.7"
2121
ciscoconfparse==1.6.40; python_version >= "3.6"
22-
click==8.0.4; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.6"
22+
click==8.0.4; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
2323
colorama==0.4.4; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
24+
commonmark==0.9.1; python_full_version >= "3.6.3" and python_full_version < "4.0.0" and python_version >= "3.7"
2425
configargparse==0.15.2; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
2526
cryptography==37.0.2; python_version >= "3.6"
2627
cycler==0.11.0; python_version >= "3.7"
2728
dateparser==1.1.1; python_version >= "3.5"
28-
decorator==5.1.1; python_version >= "3.6"
29+
decorator==5.1.1; python_version >= "3.7"
2930
defusedxml==0.7.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7"
3031
dnspython==2.2.1; python_version >= "3.6" and python_version < "4.0"
3132
entrypoints==0.4; python_version >= "3.7"
@@ -38,7 +39,7 @@ gitdb==4.0.9; python_version >= "3.7"
3839
gitpython==3.1.27; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
3940
graphviz==0.15; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0")
4041
h11==0.13.0; python_version >= "3.6"
41-
idna==3.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6"
42+
idna==3.3; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7"
4243
importlib-metadata==4.11.4; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
4344
importlib-resources==5.7.1; python_version < "3.9" and python_version >= "3.7"
4445
ipaddress==1.0.23
@@ -69,42 +70,43 @@ nbformat==5.4.0; python_full_version >= "3.7.0" and python_version >= "3.7"
6970
nest-asyncio==1.5.5; python_full_version >= "3.7.0" and python_version >= "3.7"
7071
netconan==0.11.3
7172
networkx==2.8.3; python_version >= "3.8"
72-
notebook==6.4.10; python_version >= "3.6"
73+
notebook==6.4.12; python_version >= "3.7"
7374
numpy==1.22.4
7475
packaging==21.3; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
7576
pandas==1.3.4; python_full_version >= "3.7.1"
7677
pandocfilters==1.5.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7"
7778
parso==0.7.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
7879
passlib==1.7.4; python_version >= "3.6"
79-
pexpect==4.8.0; sys_platform != "win32" and python_version >= "3.6"
80-
pickleshare==0.7.5; python_version >= "3.6"
80+
pexpect==4.8.0; sys_platform != "win32" and python_version >= "3.7"
81+
pickleshare==0.7.5; python_version >= "3.7"
8182
pillow==9.1.1; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
8283
ply==3.11
8384
prettytable==3.3.0; python_version >= "3.7"
8485
prometheus-client==0.14.1; python_version >= "3.7"
8586
prompt-toolkit==3.0.29; python_full_version >= "3.6.2"
8687
protobuf==3.20.1; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
8788
ptyprocess==0.7.0; os_name != "nt" and python_version >= "3.7" and sys_platform != "win32"
88-
py==1.11.0; python_version >= "3.6" and python_full_version < "3.0.0" and implementation_name == "pypy" or implementation_name == "pypy" and python_version >= "3.6" and python_full_version >= "3.5.0"
89-
pyarrow==5.0.0; python_version >= "3.6"
89+
py==1.11.0; python_version >= "3.7" and python_full_version < "3.0.0" and implementation_name == "pypy" or implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.5.0"
90+
pyarrow==8.0.0; python_version >= "3.7"
9091
pycparser==2.21; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
9192
pydantic==1.9.1; python_full_version >= "3.6.1" and python_version >= "3.6"
9293
pydeck==0.7.1; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
93-
pygments==2.12.0; python_version >= "3.7"
94-
pympler==1.0.1; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.6"
94+
pygments==2.12.0; python_full_version >= "3.6.3" and python_full_version < "4.0.0" and python_version >= "3.7"
95+
pympler==1.0.1; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
9596
pyparsing==2.4.7; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0")
9697
pyrsistent==0.18.1; python_version >= "3.7"
97-
python-dateutil==2.8.2; python_full_version >= "3.7.1" and python_version >= "3.7" and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.5") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6") and python_version < "4.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7")
98+
python-dateutil==2.8.2; python_full_version >= "3.7.1" and python_version >= "3.7" and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.5") and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7") and python_version < "4.0"
9899
python-dotenv==0.19.2; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.5"
99100
python-nubia==0.2b5; python_version >= "3.6"
100-
pytz==2022.1; python_full_version >= "3.7.1" and python_version >= "3.6"
101+
pytz==2022.1; python_full_version >= "3.7.1" and python_version >= "3.7"
101102
pywin32==304; sys_platform == "win32" and platform_python_implementation != "PyPy" and python_version >= "3.7"
102103
pywinpty==2.0.5; os_name == "nt" and python_version >= "3.7"
103104
pyyaml==6.0; python_version >= "3.6"
104105
pyzmq==23.1.0; python_version >= "3.7"
105106
regex==2022.3.2; python_version >= "3.6"
106107
requests==2.27.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0")
107-
semver==2.13.0; python_full_version >= "3.7.1" and python_version >= "3.6" and python_version < "4.0"
108+
rich==12.5.1; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and python_version >= "3.7" and python_version < "4.0"
109+
semver==2.13.0; python_full_version >= "3.7.1" and python_version >= "3.7" and python_version < "4.0"
108110
send2trash==1.8.0; python_version >= "3.7"
109111
setuptools-scm==6.4.2; python_version >= "3.7"
110112
simplejson==3.17.6; python_full_version >= "3.7.1" and python_version < "4.0"
@@ -113,7 +115,7 @@ smmap==5.0.0; python_version >= "3.7"
113115
soupsieve==2.3.2.post1; python_full_version >= "3.6.0" and python_version >= "3.7"
114116
starlette==0.14.2; python_version >= "3.6"
115117
streamlit-aggrid==0.2.3.post2; python_full_version >= "3.7.1" and python_version < "4.0"
116-
streamlit==1.9.2; python_version >= "3.6"
118+
streamlit==1.11.1; python_version >= "3.7"
117119
tabulate==0.8.9
118120
termcolor==1.1.0; python_version >= "3.6"
119121
terminado==0.15.0; python_version >= "3.7"
@@ -125,14 +127,14 @@ tomli==2.0.1; python_version >= "3.7"
125127
toolz==0.11.2; python_version >= "3.7"
126128
tornado==6.1; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
127129
traitlets==5.2.2.post1; python_full_version >= "3.7.0" and python_version >= "3.7"
128-
typing-extensions==4.2.0; python_full_version >= "3.7.1" and python_version >= "3.7" and python_version < "4.0"
130+
typing-extensions==4.2.0; python_full_version >= "3.7.1" and python_version >= "3.7" and python_full_version < "4.0.0" and python_version < "3.9"
129131
typing-inspect==0.7.1; python_version >= "3.6"
130132
tzlocal==2.1
131-
urllib3==1.26.9; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.6"
133+
urllib3==1.26.9; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7"
132134
uvicorn==0.14.0
133135
uvloop==0.16.0; python_version >= "3.7"
134-
validators==0.20.0; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.6"
135-
watchdog==2.1.8; platform_system != "Darwin" and python_version >= "3.6" and python_full_version >= "3.7.1" and python_version < "4.0"
136+
validators==0.20.0; python_full_version >= "3.7.1" and python_version < "4.0" and python_version >= "3.7"
137+
watchdog==2.1.8; platform_system != "Darwin" and python_version >= "3.7" and python_full_version >= "3.7.1" and python_version < "4.0"
136138
wcwidth==0.2.5; python_full_version >= "3.6.2" and python_version >= "3.7"
137139
webencodings==0.5.1; python_version >= "3.7"
138140
widgetsnbextension==3.6.0; python_version >= "3.7"

docs/2020-priority.md

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Suzieq Priorities
22

3-
(last updated August 2021)
3+
(last updated June 2022)
44

55
This roadmap represents our best guess at broad priorities.
66
The point is to demonstrate what we think we should work on and the general
@@ -11,18 +11,6 @@ it more useful to you, please let us know. The best way is to
1111
We are trying to provide a mix of adding new collection, new analysis, and making Suzieq a better
1212
platform to build on.
1313

14-
So far Suzieq is focused on datacenter, but we if we hear of
15-
interest in the ISP/WAN space (or any other), then we can pivot
16-
towards that. There's nothing inherent in Suzieq that makes it just
17-
for one part of the network than the others, we just started in the
18-
datacenter. The current version will be useful anywhere, it's just
19-
that we aren't collecting everything we'd need to do a great job
20-
in other places and we don't have asserts tuned towards other use cases.
21-
22-
First release (0.1), was focused on good fundamentals and a good
23-
representation of what Suzieq can be used for. Second release (0.2)
24-
was focused on NXOS and Junos support.
25-
2614
## Areas of Development
2715

2816
There are six major areas that Suzieq development can be broken down into.
@@ -59,30 +47,17 @@ Given the categories, here is a rough list of tasks we will be tackling. We welc
5947
~~ * maybe be able to just start with one IP address and then discover
6048
everything that must be polled by suzieq
6149
* ~~support augmenting columns (like adding peerHostname in OSPF when all we have is peerIP)~~
62-
* change gen_schema to ignore _ fields
6350
* ~~make column manipulation at higher level than engine.py~~
6451
* ~~Schema evolution and versioning to make suzieq less brittle to changes in the schema~~
65-
* Network wide summarize to take advantage of data across all commands
6652
~~* Web-based GUI--
6753
-- * ~Do you have a framework you'd like the GUI to use?~~
68-
-- * For what functions would you use a GUI?~~
69-
* caching and performance
70-
~~* suzieq as a daemon--
71-
* do we need suzieq as a daemon -- what are the use cases
7254
* ~~REST API~~
73-
* Create tags or other ways to group in a hierarchical way
74-
* possibly reuse ansible grouping
7555
* Kubernetes
7656
* understand topology, pod and cluster
7757
* calico, cilium, vxlan
7858
* asserts
7959
* Better unit tests with mocking instead of just end-to-end with real data.
80-
* Integration with performance analysis
81-
* integration with prometheus and influxdb
82-
* what do we want to be able to do with this?
8360
* ~~Arista EVPN~~
84-
* Integration with systems for notification of events
85-
* slack * ???
8661
* ~~Users can do their own queries~~
8762
* ~~pandas or pandas sql query~~
8863
~~* Great expectations or some other way of better verifying data output
@@ -93,8 +68,6 @@ Given the categories, here is a rough list of tasks we will be tackling. We welc
9368
* ~~Support for Cisco's IOS-XR~~
9469
* Temperature and power collection
9570
* Cloud integration such as VPC from cloud providers
96-
* Kafka integration for streaming telemetry
97-
* Redundancy -- some way of making sure that one poller is always running
9871
* BMP to collect BGP data for realtime BGP analysis
9972
* Understand BGP routing policy and route maps / etc
10073
* ISIS

docs/inventory.md

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ sources:
1919
- name: netbox-instance-123
2020
token: af8717c89ec0ff420c19d89e6c20646ad55dd54e
2121
url: http://127.0.0.1:8000
22-
tag: suzieq-demo
22+
tag:
23+
- suzieq-demo
2324
type: netbox
2425
period: 3600
2526

@@ -98,12 +99,14 @@ Whenever a source has many fields in common with another, you don't have to rewr
9899
type: netbox
99100
token: your-api-token-here
100101
url: http://127.0.0.1:8000
101-
tag: suzieq-demo
102+
tag:
103+
- suzieq-demo
102104
period: 3600
103105
104106
- name: netbox-copy # This source will use the same set of parameters of 'netbox-orig'
105107
copy: netbox-orig # and only overrides the 'tag' field.
106-
tag: suzieq-copy
108+
tag:
109+
- suzieq-copy
107110
108111
```
109112
### <a name='source-host-list'></a>Host list
@@ -142,9 +145,9 @@ Now you can set the path of the ansible inventory in the source:
142145

143146
### <a name='source-netbox'></a>Netbox
144147

145-
[Netbox](https://netbox.readthedocs.io/en/stable/) is often used to store devices type, management address and other useful information to be used in network automation. Suzieq can pull device data from Netbox selecting them by tag (currently only one per each source).
146-
To do so a token to access the netbox API is required as well as the netbox instance url.
147-
148+
[Netbox](https://netbox.readthedocs.io/en/stable/) is often used to store devices type, management address and other useful information to be used in network automation.
149+
Suzieq can pull device data from Netbox selecting them by one or more tags.
150+
To grant access to netbox, a token and an url must be provided.
148151
The token is considered a [sensitive data](#sensitive-data), so it can be specified via an environment variable using the format `env:ENV_TOKEN`.
149152

150153
Since Netbox is a _dynamic source_, the data are periodically pulled, the period can be set to any desired number in seconds (default is 3600).
@@ -160,12 +163,35 @@ Here is an example of the configuration of a netbox type source:
160163
type: netbox
161164
token: your-api-token-here
162165
url: https://127.0.0.1:8000
163-
tag: suzieq-demo # if not present, default is "suzieq"
166+
tag: # if not present, default is "suzieq"
167+
- suzieq-demo
164168
period: 3600 # How frequently Netbox should be polled
165169
ssl-verify: false # Netbox certificate validation will be skipped
166170
```
171+
#### Selecting devices from Netbox
172+
173+
Starting from 0.19, it's possible to specify more than one tag to be matched, defining a list of one or more rules.
174+
A single rule can contain a set of tags divided by the `,` separator, which should **ALL** be matched.
175+
A device is polled by SuzieQ if it matches at least one of the defined rules.
176+
177+
```yaml
178+
- name: netbox-multi-tag
179+
type: netbox
180+
token: your-api-token-here
181+
url: https://127.0.0.1:8000
182+
tag:
183+
- alpha
184+
- bravo, charlie
185+
```
186+
For example, the source above tells SuzieQ to select from Netbox all the devices having the `alpha` OR `bravo & charlie` tags.
187+
188+
!!!Warning
189+
SuzieQ versions older than 0.19 supported one single tag.
190+
The old syntax, following the pattern `tag: netbox-tag`, is deprecated and it might be removed in the future releases.
191+
192+
#### Map Netbox sitenames to namespaces
167193

168-
Moreover, netbox type source is capable to assign each device to a namespace which corresponds to the device's sitename.
194+
Netbox type source is capable to assign each device to a namespace which corresponds to the device's sitename.
169195
To obtain this behaviour, we need to declare a `namespace` object with `name: netbox-sitename`.
170196

171197
Here is an example:
@@ -175,13 +201,16 @@ sources:
175201
type: netbox
176202
token: your-api-token-here
177203
url: http://127.0.0.1:8000
178-
tag: suzieq-demo
204+
tag:
205+
- tag1
206+
- tag2, tag3
179207
180208
- name: netbox-dc-02
181209
type: netbox
182210
token: your-api-token-here
183211
url: http://127.0.0.1:9000
184-
tag: suzieq
212+
tag:
213+
- suzieq
185214
186215
auths:
187216
- name: auth-st

0 commit comments

Comments
 (0)