How the Sync Works
The Matrix connector is event-driven: NetBox changes reach Fleet Manager’s inventory projections and flow to the connector as NATS events, with a polling backstop sweeping every scoped site every 150 seconds so nothing is ever missed. Ethernet devices and InfiniBand inventory are read from NetBox directly on a 120-second delta loop with a 6-hour keep-alive re-stamp. Devices are filtered by role and status (active only), transformed into Matrix table schemas, and ingested to Azure Kusto staging tables. Deletions differ by table: projection-fed tables (Servers, NVSwitches) receive an IsDeleted tombstone within the SLA, while NetBox-direct tables (EthDevices, IbInventory) prune on the next successful full refresh and the stale rows age out under the 7-day staging retention. A NetBox change is typically queryable in Kusto within seconds, well inside the 5-minute SLA. See Matrix Connector Operations for the operational runbook.
The transforms and naming rules on this page previously ran in the retired
netbox_matrix agent and are unchanged in the connector — “the agent” in the sections below refers to the sync’s transform behaviour, which is identical.CONNECTOR_SITE_FILTER are synced to Matrix. That filter scopes the Matrix connector alone. Fleet Manager’s own NetBox sync agent selects its devices through NETBOX_AGENT_DEVICE_FILTERS instead, so a site the sync agent covers has its RDMA GUID labels (section 6) read whether or not it appears in CONNECTOR_SITE_FILTER.
Device and Asset Naming Conventions
The agent uses theasset_tag field as the primary display name in Matrix (falling back to name if unset). For Ethernet devices, the asset_tag is also the source for asset type extraction — a critical Matrix field. Names must follow specific conventions per device type.
General Rules
asset_tagis the preferred identifier sent to Matrix. Set it on every device.nameis the NetBox hostname. It acts as a fallback whenasset_tagis empty.- The agent checks
asset_tagfirst, thenname, when resolving display names and extracting asset types.
Ethernet Device Naming (Switches, Firewalls, Routers)
Ethernet deviceasset_tag values must follow this pattern for asset type extraction to work:
-(\d+)([a-z]+\d*)$ (case-insensitive) to extract the type suffix from the end of the name. The <number> is a sequence number and the <type> is a short code identifying the device’s function.
Pattern breakdown:
Known asset type suffixes:
Examples with full extraction:
If neither the regex nor a role fallback applies, the
asset_type field in Matrix will be empty — this indicates a naming issue that should be fixed.
gpu-node and compute-tray devices sync via the Servers table (section 4a), not EthDevices. If they do appear in EthDevices context (e.g., as cable endpoints in EthInterfaceLinks), the function returns GPUNode as a fallback.InfiniBand Switch Naming
IB switches have a hard requirement: the devicename must contain -ifs-. Without it, the device is filtered out entirely even if it has the correct role.
name pattern: <site>-<pod>-ifs-<switch_type><number>
asset_tag convention: The asset_tag is used as the display name in Matrix (device_name) when present, and follows a different convention based on the switch’s position in the IB fabric topology. This applies to both NDR and XDR clusters:
The
asset_tag may carry a site prefix (e.g. sys1-wdc1.L3.1.1), because NetBox requires asset tags to be globally unique and the same fabric designation is reused across sites. The agent strips the prefix on transform, so Matrix always receives the bare designation (L3.1.1).CX.Y:
Example:
C1.2 = core group 1, switch 2
Spine switches — SX.Y.Z:
Example:
S1.3.2 = switch 1, super pod 3, rail 2
Leaf switches — LX.Y.Z:
Example:
L2.1.4 = switch 2, super pod 1, rail 4
GPU Compute Server Naming
GPU servers don’t have a strict naming regex, but common patterns include:
The
asset_tag (or name as fallback) becomes the node_name in the Servers table.
NVLink Switch Naming
NVLink switches useasset_tag as the display name. Their asset_type is normalized to nvs when the tag ends in either supported site convention:
Any other NVLink
asset_tag suffix produces an empty asset_type; correct the tag rather than relying on the device name as a fallback.
UFM Server Naming
UFM servers sync to the IbSwitches table. No-ifs- naming requirement — role match alone is sufficient. The asset_tag (or name) becomes the display name.
NetBox name vs asset_tag Summary
Recommendation: Always set both fields. Use
name for the internal infrastructure hostname (e.g., sin1-p-swi-feb1) and asset_tag for the Matrix-facing name that follows the naming convention (e.g., sie50-dh5-dc-01fbs).
TenantId (from the name cluster prefix)
The TenantId column on Servers, NVSwitches, EthDevices, EthInterfaceLinks, IbInventory and IbSwitchLinks is the Nscale cluster number N from the leading sys<N>- prefix of the NetBox name — never from asset_tag, which carries no cluster prefix. The customer calls this number TenantId; it is zero-padded to two digits:
A link takes the
TenantId of its start device (for IbSwitchLinks, the IB switch end). IB switches share fabric designations across clusters — both sys1-wdc1.L3.1.1 and sys2-wdc1.L3.1.1 publish as L3.1.1 — so on the IB tables TenantId is what tells them apart. A device whose name lacks the sys<N>- prefix publishes an empty TenantId rather than a guessed one, so a misnamed device shows up as a blank, not as the wrong tenant.
Every one of these tables also carries a TenantID column (capital D) with the same value. Microsoft’s validator (MTX-2261) reads TenantID and Kusto column names are case-sensitive, so both spellings are published until Microsoft confirms which one to keep; the other is then dropped.
1. Site Setup
NetBox model:dcim/sites
Every site that should sync to Matrix must be configured with:
Critical: The
description field becomes the dc_region value in every Matrix table. If it is missing, region fields will be empty across Servers, IbSwitches, NVSwitches, and EthDevices.
Site Prefixes (for Ethernet devices only)
NetBox model:ipam/prefixes
Each site needs an RFC1918 supernet prefix to derive the site_id used in EthDevices and link tables:
The second octet of the prefix becomes the
site_id (e.g., 10.40.0.0/16 → site_id 40). This value drives:
SiteIdin EthDevices and EthInterfaceLinksSyslogServerIp→192.168.<site_id>.97SNMPServerIp→192.168.<site_id>.135
2. Location Hierarchy
NetBox model:dcim/locations
Locations are used to resolve the DataHall for servers and switches. The agent walks the location tree:
- If a location has no parent → it IS the datahall
- If the location’s parent has no parent → the parent is site-level, and the current location is the datahall
- Otherwise → the parent is the datahall
Example hierarchy:
Row 5 will resolve datahall = dh110.
3. Device Types
NetBox model:dcim/device-types
Device types must be fully populated since they provide hardware metadata:
Fleet Manager writes
custom_fields.platform_class on the device (not the device type)
during enrolment, once the site’s platform_class_activity_ready gate is on:
<GPUTYPE>_<DEVICETYPE>_<FABRICTYPE>_<NN>, e.g. GB300_LENOVOHG635NV2_IB_01.
resource_class is deliberately separate: it is operator-set in
config_context.ironic_settings, shared by a device type, and customer-facing through Ironic,
Nova/Placement, and SLURM. platform_class is the Fleet Manager-owned per-device variant key
for hardware-descriptor lookups: burn-in derives GPU-count and GPU-name test parameters that
a test’s params leave unset from it, and a test that needs such a value on a device without
one fails. Threshold and topology selection still use resource_class. Fleet Manager writes the key only when the NetBox field is empty
and never overwrites a populated value. Correct a key by clearing
custom_fields.platform_class in NetBox and running
fleetctl netbox backfill-platform-class for that device. See enrollment phase 0b
for the full derivation and write policy.
4. Devices by Role
4a. GPU Compute Servers (→ Servers table)
Roles:gpu-node, compute-tray
Interfaces required:
If no interfaces exist for a device, the device is skipped entirely.
The
location field is built as: <dc_region>-<datahall>-<rack_id> (all lowercase, hyphen-joined).
Back-end fabric (config_context.ztp) — Fleet Manager enrolment only. Fleet Manager derives the FABRICTYPE component of platform_class from the device’s rendered config_context.ztp block, and only for GPU compute devices:
CPU baremetal and hypervisor devices (no
gpu_type) are always NORDMA and their ztp block is never read.
4b. InfiniBand Switches and UFM Servers (→ IbSwitches table)
IB Switch roles:be-core-switch, be-leaf-switch, be-spine-switch
Additional filter: Device name must contain -ifs- (e.g., sin1-p-ifs-bes115). Devices with the right role but without -ifs- in the name are excluded.
UFM Server role: ufm-server
UFM servers sync to the same IbSwitches table using the same transform. No -ifs- naming convention required — role match alone is sufficient.
Both IB switches and UFM servers use the same field requirements:
Location validation is strict — if all of
location, rack, and position are missing, the device fails validation and is skipped.
The device_location field is built by joining location_name, rack_name, and position with /. Note that rack_name in NetBox can itself contain / separators (e.g., Row 2 / 11), so the output may have more than 3 visual segments:
("DH110", "Row 2 / 11", 42)→DH110 / Row 2 / 11 / 42("DH110", "Rack-05", 10)→DH110 / Rack-05 / 10
4c. NVLink Switches (→ NVSwitches table)
Role:nvlink-switch
Interfaces required:
The
device_location is: <dc_region>-<datahall>-<rack_id> (all lowercase, hyphen-joined).
4d. Ethernet Devices (→ EthDevices table)
Roles: See full list below. Devices withtenant.slug = "nscale" are excluded.
Asset type extraction: The agent extracts
asset_type from the device name or asset_tag using the regex pattern -<digits><type>$:
sie50-dh5-dc-01fbs→fbssie50-dh5-dc-01oobfbs→oobfbspdx51-m34-p1-01t1→t1pdx51-m34-dc-01cab→cab
console-server/console-manager→console-servernvlink-switch→nvsfor the documented NVLink asset-tag suffixes; otherwise empty
cloud_type→ always"public"asn→ from device custom fieldswitch_asndhcp_gateway→ list from device custom fieldsdhcp_primaryanddhcp_secondaryvlan_id,mac_address,cluster_id→ always empty (TBD / not sourced from NetBox)
fe-leaf-switch devices only:
Two interfaces feed the compute SVI fields, and vlan101-104 takes precedence when both
exist. A switch moves from the single aggregate to the per-VLAN values as soon as
vlan101-104 is created, so migration is per-device with no coordinated cutover.
vlan101-104— the per-VLAN tenant SVIs. Assign the switch’s own address for each VLAN: one IPv4 (e.g. a/27) and one IPv6 (e.g. a/64) per VLAN. Populates all four ofcompute_ipv4,compute_subnet,compute_ipv6andcompute_ipv6_subnetas comma-separated lists, ordered by address.vlan100-116— the legacy single aggregate. Used only whenvlan101-104is absent, and then exactly as before: the lowest non-anycast IPv4 and its subnet, withcompute_ipv6/compute_ipv6_subnetleft empty.
anycast on either interface — they are skipped, as
they are not the switch’s own address. If you create vlan101-104 but assign only IPv4, the
IPv6 fields stay empty; the IPv4 fields still switch to the per-VLAN list.
Example for a switch with four tenant VLANs on vlan101-104:
- Create an interface named
lowith an IPv4 address assigned → populatesloopback_ipv4
5. Cables / Links
5a. Ethernet Interface Links (→ EthInterfaceLinks table)
NetBox model:dcim/cables
Both termination interfaces must have:
nameset- Belong to devices with
nameset - Belong to devices in the same site
speed on the A-side interface is converted to bandwidth_in_gbps (kbps ÷ 1,000,000).
Only device-to-device cables are synced. Cables to patch panels, power outlets, or console ports are ignored.
5b. InfiniBand Switch Links (→ IbSwitchLinks table)
Same cable requirements as Ethernet links, plus:
Connection types:
- IB_IB: Both endpoints are IB switches
- IB_SERVER: One endpoint is an IB switch, the other is any non-IB-switch device (typically a
gpu-nodeorcompute-tray, but the agent does not enforce a specific role on the non-switch end)
location, rack, and position set — the device_location field (built by joining these with /) is required and the transform fails without at least one of these.
The speed on the interface is formatted as <N>G (e.g., 400000000 kbps → 400G).
For IB_SERVER links, the server’s serial number (or name as fallback) becomes the hostname field.
6. InfiniBand Port GUIDs on RDMA Interfaces
This is the one requirement on this page the Matrix connector does not read. It is consumed by Fleet Manager’s NetBox sync agent, which mirrors NetBox devices into Fleet Manager’s own inventory and fills
interfaces[].ib_device_guid from it.name selects; the interface label carries the value. The sync agent looks at every interface whose name matches ^RDMA[0-9]+$ (case-insensitive — RDMA0, rdma7, and Rdma11 all match) and reads the InfiniBand port GUID out of that interface’s NetBox label. No custom field is involved: it is the built-in label field on the interface. That split between the selecting field and the carrying field is the surprising part of this contract, and it is easy to satisfy one half of it and not the other.
A host RDMA port named anything else is silently ignored. Host-side port naming varies by server and NIC vendor, and a switch-style name such as swp1s0 can never match RDMA<N>. A non-matching name yields no GUID, no warning, and no failure, so a whole site can sit at zero GUID coverage with nothing to indicate a problem. Where the names do not match, the interfaces have to be renamed to RDMA<N> — there is no alternative source for this value.
Accepted Label Formats
Both forms normalize to bare lowercase 16 hex digits, which is the only form Fleet Manager stores. Anything else — the wrong digit count, neither a
0x prefix nor colons, a GUID with surrounding commentary — is rejected; the two rows above are the complete list of what the sync agent parses. Bare lowercase hex is Fleet Manager’s canonical form for a GUID: every accepted spelling collapses to one string, so GUIDs compare and de-duplicate as plain text, and it is the representation the NVIDIA UFM pkey GUIDs REST API uses in its own examples, so a stored value can be passed to the fabric manager as-is.
What Happens When the Label is Missing or Malformed
Nothing fails. Enrolment is unaffected, the interface still syncs, and the device stays usable — it simply carries no GUID:
Search the sync agent’s logs by structured field, not by message text — the wording of a warning is not a contract and changes between releases; the fields are. Every GUID-gap warning carries:
Filter the agent’s stream on
ib_guid_gap being present and group by site_slug and ib_guid_gap: that gives coverage gaps per site, by cause, without reading a single message. In Grafana Explore against product-loki (add your hub cluster’s cluster label to the selector):
RDMA<N> — a port named anything else produces no log line at all. A site whose host ports are all named outside the pattern therefore generates nothing: searching the sync agent’s logs finds no warning, and that absence does not mean there is no gap. Coverage has to be verified deliberately; a healthy-looking sync says nothing about it.
Populating Labels in Bulk
fleetctl netbox populate-ib-guids writes the labels from a per-hostname GPU-to-GUID export. It reads the same NetBox configuration as the sync agent (NETBOX_URL plus a token, or the 1Password credential lookup).
The input JSON maps hostname → RDMA<N> → that port’s guid and os_name:
name. Interfaces are matched on the integer N in RDMA<N> rather than on the exact string, so an export key of rdma01 still resolves to NetBox’s RDMA1. Any additional key inside a port entry is ignored.
The refusal to overwrite is what makes the command safe to re-run: it can never quietly replace a GUID somebody else put there. A conflict can surface at two points, and they behave differently:
- Preflight (dry-run and
--applyalike) — the plan is built from a first read of every interface. A conflict found here — along with an unknown hostname, a hostname matching more than one NetBox device, a missingRDMA<N>interface, a port key that is notRDMA<N>, an unparseable GUID, the same GUID on two entries, a duplicated JSON key, two input keys colliding on one RDMA index, or NetBox itself holding two interface names that resolve to one index (RDMA1alongsiderdma01) — aborts the whole run before a single label is written. Fix the input and run it again. - Apply time (
--applyonly) — NetBox has no compare-and-set, so each label is re-read immediately before it is written. If a different value landed there (or the interface disappeared) between preflight and the write, that one interface is skipped with a warning and the command carries on with the rest; the summary line reports how many wereconflicting since preflightand the command exits non-zero. Labels written before the conflict stay written. A non-zero exit from--applytherefore means a partial backfill, not an untouched NetBox — read the summary, resolve the conflict, and re-run; everything already set is a skip on the next pass. If the re-read finds the identical GUID already in place, that counts as already set, not as a conflict.
Verifying Coverage
Labels reach Fleet Manager on the sync agent’s next reconcile. Read a device back from the API and list every interface with its name and GUID:RDMA<N> entry should carry 16 hex digits; null means the label is absent or was rejected. To list only the interfaces with no GUID:
RDMA<N> name — and a host port that shows up under a non-matching name (swp4s1, say) is the misnamed-port case from the top of this section, visible here precisely because the command does not filter on the pattern. List all interfaces deliberately rather than filtering on the name pattern: a filter on RDMA<N> inherits the contract’s own blind spot, because a physical port that is absent from NetBox or named outside the pattern (swp4s1, say) never appears in the filtered output, and seven valid GUIDs read as a complete node when the hardware has eight ports.
In NetBox itself, the equivalent check is that each host has as many RDMA<N> interfaces as it has HCA ports and the Label column is populated on every one of them.
Documenting this contract does not populate anyone’s NetBox. Backfilling a site still needs a GPU-to-GUID export for that hardware to exist in the first place, collected from the nodes themselves.
7. RoCE Back-end Ports for the VRF Flip
Like section 6, the Matrix connector does not read this. It is the contract for Fleet Manager’s back-end VRF flip, which is being built (spec 0064): which leaf sub-ports will move between the customer and maintenance VRFs when a host is isolated for repair. Today
fleetctl netbox be-port-plan checks a host against it.TEMPORAL_WORKER_BACKEND_PORT_SHAPE (the satellite chart’s temporalWorker.backendPortShape); Fleet Manager ships no default, and a site that sets none is refused before NetBox is read. The example below is GSO1’s (XE9712 GB300 trays on SN5610 back-end leaves); the back-end VRF runbook has its JSON.
Each PF’s leaf comes from the
netbox_datacenter plugin’s fibre graph. A PF reaches its leaf through passive shuffle cassettes, which NetBox’s own cable trace cannot cross, so GSO1 records no native cable for a back-end PF. Fleet Manager reads the plugin’s fiber_graph interface peer mapping instead, one request per host, and needs view on netbox_datacenter.inventoryinfointerfacepeermapping to do so. Each PF must have exactly one mapped row naming the leaf’s interface. A native cable on a PF is not required; if one exists and ends directly on an interface, it must be the mapped one. The plugin recomputes the mapping on its own schedule, and Fleet Manager does not check how old it is.
The be-meta and be-nscale VRFs are created on every leaf by network engineering. Fleet Manager never creates or deletes a VRF.
Checking a host
fleetctl netbox be-port-plan reads NetBox only and touches no switch. Run it with the site’s worker settings, including its port shape:
A refusal is fixed in NetBox, not in Fleet Manager.
8. Quick Reference Checklist
Use this when adding a new device to NetBox:Before adding any device:
- Site exists and has
descriptionset (e.g.,SIE50) - Site is in
CONNECTOR_SITE_FILTER - Location hierarchy exists (datahall → row) with correct parent relationships
- Device type exists with
modelpopulated (manufacturertoo, for Servers/NVSwitches/EthDevices — not required for IB switches/UFM servers)
For every device:
-
nameis set -
asset_tagis set (preferred display name in Matrix) -
status=active -
roleis one of the supported roles (see sections 4a-4d) -
siteis assigned -
locationis assigned (for datahall resolution) -
rackis assigned -
position(rack unit) is set -
serialnumber is set
For GPU compute servers (gpu-node, compute-tray):
-
oob_ipis set - The device type’s
custom_fields.gpu_typeis set (e.g.GB300) — enrolment fails without it -
config_context.ztpis either absent or carries aninfinibandsection — any other shape fails enrolment -
descriptionstarts with hardware SKU (e.g.,GB300 NVL72) - At least one interface exists with a MAC address
- BMC interface exists (named
bmc,ipmi,xcc,mgmt,ilo,idrac, ormanagement) - Primary network interface exists (named
eth0,eth1,ib0, orib1) with MAC - Every RDMA port is named
RDMA<N>and its interfacelabelholds that port’s IB GUID (section 6) - (optional)
custom_fields.backend_idis set — publishes"01"when left empty
For IB switches (be-core-switch, be-leaf-switch, be-spine-switch):
- Device name contains
-ifs- -
primary_iporoob_ipis set -
device_type.part_numberis set (SKU) -
device_type.u_heightis set on the device type -
custom_fields.software_versionis set (firmware) -
custom_fields.os_versionis set -
custom_fields.system_guidis set (InfiniBand GUID) - (optional)
custom_fields.backend_idis set — publishes"01"when left empty
For UFM servers (ufm-server):
- Same as IB switches, but no
-ifs-naming requirement
For NVLink switches (nvlink-switch):
-
oob_ipis set (BMC IP) -
primary_ipis set (OOB management IP) - Interfaces created:
bmc/ipmi,oob/mgmt,serial/consolewith MACs - (optional)
custom_fields.backend_idis set — publishes"01"when left empty
For Ethernet devices:
- Device is NOT tenanted to
nscale - Site has an RFC1918 supernet prefix (e.g.,
10.40.0.0/16) withtenant.slug = "matrix" -
asset_tagornamefollows naming convention<site>-<rack>-<loc>-<num><type>for asset type extraction -
custom_fields.os_versionis set (firmware version) - (fe-leaf-switch only) Interface
vlan101-104exists with the per-VLAN IPv4 and IPv6 SVI addresses — takes precedence overvlan100-116 - (fe-leaf-switch only) …or, if not yet migrated, interface
vlan100-116exists with IPv4 addresses (legacy single-value output, no IPv6) - (fe-leaf-switch only) VRR gateway addresses carry IP role
anycastso they are excluded - Interface
loexists with IPv4 address (for loopback)
For cables:
- Both ends terminated on
dcim.interface(not patch panels/power/console) - Both endpoint interfaces have
nameset - Both endpoint devices have
nameset - Both endpoint devices are in the same site
- Cable
typeis set (required — untyped cables are not synced. E.g.,cat6a,mmf,smf,dac-passive) - Interface
speedis set on at least the A-side (for bandwidth calculation) - (IB links only) At least one endpoint is an IB switch with
-ifs-in the name - (IB links only) Both endpoints have
location,rack, andpositionset
9. What Happens When Data is Missing
10. Connector Configuration
The connector is configured through the Fleet Manager hub chart (matrixConnector values), which renders these environment variables: