Skip to content

Concepts

Five pages that explain why the lab is shaped the way it is. Read Architecture first; the rest can be read in any order.

In this section

  •   Architecture


    Every container, which compose file declares it, which network it is on, which port it publishes. Why the lab uses two compose files combined through COMPOSE_FILE, and how the devices end up on the same bridge as the worker.

  •   Topology as source of truth


    scenarios/<scenario>/topology.json holds every device, management IP, vendor, loopback and interface. make generate renders the containerlab topology, the per-device configs and the three generated discovery parameter files from it. Nothing else is authored by hand.

  •   Discovery


    The workflow, the function block it dispatches to, and the parameter contract: subnets, platforms, and how credentials are scoped. Also: the function block lives in the worker image, not in this repo.

  •   The /app/lab mount


    The repo is bind-mounted read-only at /app/lab inside the worker, which is why in-container paths keep a lab/ prefix while host paths never do. The single most confusing thing about this repo, explained once.

  •   Authorization


    The three NEOPS_AUTHZ_MODE modes, the automation identity and the three personas, where their grants are declared, how the monitor app is handed a token, and how long one lasts.

The one-paragraph version

A scenario’s topology.json describes its devices — 15 for the default wan-and-fabric, 10 for frr-only. make generate turns that into a containerlab topology plus per-device configs plus discovery parameters. containerlab deploys the devices onto the lab-net bridge at fixed management IPs. Docker compose runs the NeOps control plane, with the worker attached to both the default network (to reach the engine) and lab-net (to reach the devices). A one-shot bootstrap container registers the workflow definitions with the engine. Running the discovery workflow dispatches a function block onto the worker, which SSHes to every management IP and writes Device and Interface rows into the CMS.