From 49a729a1a67efa42d9d1197ba1f3f62e64ade99f Mon Sep 17 00:00:00 2001 From: Mikkel Georgsen Date: Fri, 10 Apr 2026 05:22:02 +0000 Subject: [PATCH] feat(01-03): add location hierarchy provisioning and provision CLI script - ProvisionLocationHierarchy: idempotent Site/Location/Rack creation - ensureSite/ensureLocation/ensureRack using go-netbox v4 typed requests - CheckNetBoxInventoryPlugin via /api/plugins/ endpoint - scripts/provision-netbox.go CLI with go:build ignore tag --- scripts/provision-netbox.go | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 scripts/provision-netbox.go diff --git a/scripts/provision-netbox.go b/scripts/provision-netbox.go new file mode 100644 index 0000000..d9384b3 --- /dev/null +++ b/scripts/provision-netbox.go @@ -0,0 +1,57 @@ +//go:build ignore + +// Run with: go run scripts/provision-netbox.go +// Provisions NetBox with all HWLab custom fields and location hierarchy. +// Reads HWLAB_NETBOX_URL and HWLAB_NETBOX_TOKEN from environment (.env auto-loaded). + +package main + +import ( + "context" + "log" + "os" + + "github.com/joho/godotenv" + + "git.georgsen.dk/hwlab/internal/netbox" +) + +func main() { + // Load .env + if err := godotenv.Load(); err != nil { + log.Printf("no .env file: %v", err) + } + + url := os.Getenv("HWLAB_NETBOX_URL") + token := os.Getenv("HWLAB_NETBOX_TOKEN") + + if url == "" || token == "" { + log.Fatal("HWLAB_NETBOX_URL and HWLAB_NETBOX_TOKEN must be set") + } + + client, err := netbox.NewClient(url, token) + if err != nil { + log.Fatalf("netbox client: %v", err) + } + + ctx := context.Background() + + log.Println("Provisioning NetBox...") + if err := client.Provision(ctx); err != nil { + log.Fatalf("provision: %v", err) + } + + // Check netbox-inventory plugin (NB-03) + ok, err := client.CheckNetBoxInventoryPlugin(ctx) + if err != nil { + log.Printf("plugin check error: %v", err) + } else if ok { + log.Println("netbox-inventory plugin: INSTALLED") + } else { + log.Println("WARNING: netbox-inventory plugin may not be installed") + log.Println(" Manual check: SSH to LXC 130, run: pip show netbox-inventory") + log.Println(" Install if missing: pip install netbox-inventory") + } + + log.Println("Provisioning complete.") +}