Skip to content

Commit 7e88f30

Browse files
committed
feat: NetBox compatibility checker script
1 parent 2b7567c commit 7e88f30

File tree

4 files changed

+99
-0
lines changed

4 files changed

+99
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from .checker import check_netbox
2+
3+
__all__ = [
4+
"check_netbox",
5+
]
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
"""NetBox check script to validate data before importing to Nautobot."""
2+
3+
import sys
4+
from os import getenv
5+
6+
from django.apps import apps
7+
from django.urls import reverse
8+
9+
_SETTINGS = {
10+
"max_outputs": 0,
11+
"base_url": "",
12+
}
13+
14+
15+
def _print_issues(message: str, queryset):
16+
"""Print issues to the console."""
17+
for obj in queryset:
18+
_SETTINGS["max_outputs"] -= 1
19+
if _SETTINGS["max_outputs"] < 0:
20+
sys.exit(0)
21+
22+
print(f"{message} {obj.id} {obj}")
23+
24+
app_label = obj._meta.app_label
25+
model_name = obj._meta.model_name
26+
url = reverse(f"{app_label}:{model_name}", kwargs={"pk": obj.id})
27+
print(f"{_SETTINGS['base_url']}{url}")
28+
29+
print(100 * "-")
30+
31+
32+
def _find_missing_cables(side: str):
33+
"""Check for cables missing termination side `A` or `B`."""
34+
Cable = apps.get_model("dcim", "Cable")
35+
CableTermination = apps.get_model("dcim", "CableTermination")
36+
37+
cables_missing = Cable.objects.exclude(id__in=CableTermination.objects.filter(cable_end="A").values("cable_id"))
38+
39+
if cables_missing.count():
40+
_print_issues(f"Missing cable termination on side {side}:", cables_missing)
41+
42+
43+
def check_netbox(
44+
max_outputs=int(getenv("NETBOX_CHECKER_MAX_OUTPUTS") or 10),
45+
base_url=getenv("NETBOX_CHECKER_BASE_URL", "http://localhost:8000"),
46+
):
47+
"""Main function."""
48+
_SETTINGS["max_outputs"] = max_outputs
49+
_SETTINGS["base_url"] = base_url
50+
51+
_find_missing_cables("A")
52+
_find_missing_cables("B")

netbox-checker/pyproject.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[project]
2+
name = "netbox-checker"
3+
version = "0.1.0"
4+
description = "Simple tool to check the status of a NetBox instance"
5+
requires-python = ">=3.8"
6+
dependencies = [
7+
"requests",
8+
]
9+
10+
[build-system]
11+
requires = ["setuptools>=61.0"]
12+
build-backend = "setuptools.build_meta"

netbox-checker/run.sh

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#!/bin/bash
2+
#
3+
# Usage with `netbox-community/netbox-docker`
4+
#
5+
# ./run.sh <netbox-docker-path>
6+
7+
set -e
8+
9+
if [[ $1 == "inside-docker" ]]; then
10+
echo "Running inside container"
11+
12+
pip install -e /netbox-checker
13+
14+
/opt/netbox/netbox/manage.py nbshell \
15+
--command='from netbox_checker import check_netbox; check_netbox()'
16+
else
17+
echo "Running docker compose"
18+
19+
export NETBOX_CHECKER_PATH="$PWD"
20+
export NETBOX_DOCKER_PATH=${1:-$NETBOX_CHECKER_PATH/../netbox-docker}
21+
22+
cd "$NETBOX_DOCKER_PATH"
23+
24+
docker compose run \
25+
--user=root \
26+
--env NETBOX_CHECKER_MAX_OUTPUTS \
27+
--env NETBOX_CHECKER_BASE_URL \
28+
--volume "$NETBOX_CHECKER_PATH:/netbox-checker" \
29+
netbox /netbox-checker/run.sh inside-docker
30+
fi

0 commit comments

Comments
 (0)