# Hardware Naming Scheme Design **Date:** 2026-06-24 **Status:** Approved ## Goal Settle a single, clear hardware naming scheme for the MakerFLOSS rack that the team can grow within, before more devices are documented. The scheme assigns every physical device a stable identifier and pushes everything that changes over time (which cluster a node serves, its role) into frontmatter, so the identifier never has to be renamed when hardware is repurposed. ## Context - Hardware is documented one-file-per-device under `docs/hardware/*.md`, with the file name equal to the device identifier (enforced by `scripts/gen_overview.py`). - Current names are inconsistent: compute uses an org/brand prefix (`mf00`–`mf04`), infrastructure uses kind prefixes (`pdu01/02`, `sw01`, `pp01`). - The inventory to be documented is a mix of rack and home-office gear, grouped into clusters (TaPPaaS production + four test clusters) plus crosscutting power/network gear. Stationary PCs will sit on rack shelves. - Hardware moves between test clusters over time, so cluster membership is a changeable attribute, not an intrinsic property of a device. ## Decisions ### 1. Identifier nature (mixed) - **Compute nodes (stationary PCs) and managed switches:** the identifier *is* the device's real OS/DNS hostname. It must be DNS-safe (lowercase letters, digits, hyphens) and stable — renaming costs OS/DNS/Ansible churn. - **Passive gear (UPS, PDU/power strip, patch panel, unmanaged switch):** the identifier is a documentation/physical-label id only; the device has no OS. ### 2. Format `` — a kind abbreviation followed by a **2-digit zero-padded sequence**, **globally unique within a kind**, starting at `01`. The number is just "next free"; it encodes nothing — not cluster, rack, role, or port count. A 10-port and a 24-port switch are still `sw01` and `sw02`. ### 3. Kind abbreviation table The prefix equals the `kind` field, so the name is self-describing. | Device | `kind` | abbrev | example | |--------|--------|--------|---------| | Stationary PC / server | `server` | `srv` | `srv01` | | Switch (managed or dumb) | `switch` | `sw` | `sw01` | | Patch / network panel | `patch-panel` | `pp` | `pp01` | | PDU / power strip | `pdu` | `pdu` | `pdu01` | | UPS | `ups` | `ups` | `ups01` | | Shelf | `shelf` | `shf` | `shf01` | | WAN uplink / ISP demarcation | `wan` | `wan` | `wan01` | Existing enum kinds not yet in the rack reuse their natural short form when first used (`ap` → `ap`, `kvm` → `kvm`, `sbc` → `sbc`, `laptop` → `lt`, `desktop` → `dt`, `blank` → `blank`); register the chosen abbrev in this table at that time. Distinguishing attributes (port/outlet count, managed vs dumb, speed) live in frontmatter (`ports:`, `outlets:`, …), never in the name. ### 4. Grouping in frontmatter, not the name - `cluster:` — one of `tappaas`, `test-1`, `test-2`, `test-3`, `test-4`, or `shared` (crosscutting gear that spans clusters: power strips, shared patch panels). Editing this field is the entire cost of moving a node between clusters. - `role:` — optional, free-form (e.g. `control`, `worker`); added only where it earns its keep. A future generator step may group/table hardware by `cluster`, exactly as the hardware index groups by `kind` today. That is **not** part of this scheme — the scheme only fixes the field and its allowed values. ### 5. Exceptions Cloud / externally-named hosts keep their real FQDN as the identifier (e.g. `makerfloss.eu`) instead of `srvNN`. They are not racked and DNS owns the name. Such hosts carry no `rack:` field and need no `cluster:`. ### 6. Growth rules - **New device class:** add the `kind` to the `hardware` enum in `scripts/overview_config.yml` and register a short abbrev in the table above. - **New grouping:** add a `cluster:` value. - **More than 99 of one kind:** widen that kind's sequence to 3 digits. - **More racks:** already supported via the `rack:` field (Phase 1). - **Multiple sites:** deferred until real (YAGNI); a site prefix or field can be added without disturbing existing names. ## Migration of current names | Current | New | Notes | |---------|-----|-------| | `mf00` | `srv01` | "TaPPaaS node 1" → `cluster: tappaas` | | `mf01` | `srv02` | cluster omitted until a real assignment is given | | `mf02` | `srv03` | | | `mf03` | `srv04` | | | `mf04` | `srv05` | | | `pdu01`, `pdu02` | unchanged | already conform | | `sw01`, `pp01` | unchanged | already conform | | `makerfloss.eu` | unchanged | cloud FQDN exception | The `mf0x` machines are staging placeholders, so renaming is cheap now. The rename touches their files, the `power:`/`links:` references to them in `pdu*`/`sw*`/`pp*` and sibling host files, and the regenerated artifacts under `docs/hardware/index.md` and `docs/infrastructure/racks/`. The cluster assignments for `srv02`–`srv05` are provisional until real values are given; `srv01` = `tappaas` is the one known mapping. ## Out of scope - Choosing the *best distribution* of hardware across clusters. - Building a generator view that groups by `cluster` (possible future work). - Real cluster assignments beyond `srv01` = TaPPaaS.