refactor: rebrand iot → fleet, operator/agent crates → harmony-fleet-* #276

Merged
johnride merged 1 commits from feat/iot-rebrand into feat/iot-helm 2026-04-25 13:48:25 +00:00
Owner

The IoT vocabulary was anchoring the codebase to one customer's
domain. The reconciler pattern is generic — operator in k8s, NATS
KV as desired-state bus, agents reconciling podman / OKD / KVM /
anything that can register. "Fleet" captures that neutrally; IoT
stays acknowledged in docs as the first customer use case.

Done now, while nothing is deployed. After a partner fleet lands,
changing the CRD group alone is a multi-quarter migration.

Scope (nothing left over):

Paths + crates

  • iot/ → fleet/
  • iot/iot-operator-v0 → fleet/harmony-fleet-operator
  • iot/iot-agent-v0 → fleet/harmony-fleet-agent
  • harmony/src/modules/iot → harmony/src/modules/fleet
  • ROADMAP/iot_platform → ROADMAP/fleet_platform
  • examples/iot_{vm_setup, load_test, nats_install} → examples/fleet_*
  • -v0 suffix dropped on the operator + agent crates (semver in
    Cargo.toml already tracks version)

Rust identifiers

  • enum IotScore (podman score payload) → ReconcileScore
  • struct IotDeviceSetupScore/Config → FleetDeviceSetupScore/Config
  • InterpretName::IotDeviceSetup → InterpretName::FleetDeviceSetup
  • HarmonyIotPool → HarmonyFleetPool (libvirt pool)
  • HARMONY_IOT_POOL_NAME (default "harmony-iot") → HARMONY_FLEET_POOL_NAME ("harmony-fleet")
  • IotSshKeypair → FleetSshKeypair
  • ensure_iot_ssh_keypair / ensure_harmony_iot_pool /
    check_iot_smoke_preflight_for_arch → fleet-prefixed variants

Wire / config surfaces

  • CRD group iot.nationtech.iofleet.nationtech.io
  • Finalizer iot.nationtech.io/finalizerfleet.nationtech.io/finalizer
  • Shortnames iotdep/iotdevice → fleetdep/fleetdev
  • Env var IOT_AGENT_CONFIG → FLEET_AGENT_CONFIG
  • Env var IOT_VM_ADMIN_PASSWORD → FLEET_VM_ADMIN_PASSWORD
  • Binary /usr/local/bin/iot-agent → /usr/local/bin/fleet-agent
  • Systemd user iot-agentfleet-agent
  • VM admin user iot-adminfleet-admin

Defaults

  • Namespaces iot-system/iot-demo/iot-load → fleet-system/fleet-demo/fleet-load
  • Helm release iot-nats → fleet-nats
  • Helm release iot-operator-v0 → harmony-fleet-operator
  • Container image localhost/iot-operator-v0:latest →
    localhost/harmony-fleet-operator:latest
  • On-disk cache $HARMONY_DATA_DIR/iot/ → $HARMONY_DATA_DIR/fleet/
    (cloud-images, ssh keypairs, libvirt pool)

What stayed

  • harmony-reconciler-contracts — already neutrally named
  • Wire types (DeviceInfo, DeploymentState, HeartbeatPayload,
    DeploymentName) — already neutral
  • KV buckets (device-info, device-state, device-heartbeat,
    desired-state) — already neutral
  • CRD kind names (Deployment, Device) — already neutral
  • NatsBasicScore / NatsHelmChartScore / HelmChart / etc. —
    framework-scope, unchanged

Verification

  • cargo check --workspace --all-targets: clean
  • All harmony lib tests (114), fleet-operator (6), fleet-agent
    (7), harmony-reconciler-contracts (13): green
  • End-to-end load-test (20 devices / 3 CRs / 20s under
    fleet/scripts/load-test.sh): PASS. Image built as
    localhost/harmony-fleet-operator:latest, chart installed as
    release harmony-fleet-operator in namespace fleet-system,
    all CR aggregates correct.

Zero stragglers: grep across the tree for \biot\b / IOT_ /
\bIot[A-Z] returns empty (excluding docs explicitly talking about
IoT as the first customer's domain).

The IoT vocabulary was anchoring the codebase to one customer's domain. The reconciler pattern is generic — operator in k8s, NATS KV as desired-state bus, agents reconciling podman / OKD / KVM / anything that can register. "Fleet" captures that neutrally; IoT stays acknowledged in docs as the first customer use case. Done now, while nothing is deployed. After a partner fleet lands, changing the CRD group alone is a multi-quarter migration. Scope (nothing left over): Paths + crates - iot/ → fleet/ - iot/iot-operator-v0 → fleet/harmony-fleet-operator - iot/iot-agent-v0 → fleet/harmony-fleet-agent - harmony/src/modules/iot → harmony/src/modules/fleet - ROADMAP/iot_platform → ROADMAP/fleet_platform - examples/iot_{vm_setup, load_test, nats_install} → examples/fleet_* - -v0 suffix dropped on the operator + agent crates (semver in Cargo.toml already tracks version) Rust identifiers - enum IotScore (podman score payload) → ReconcileScore - struct IotDeviceSetupScore/Config → FleetDeviceSetupScore/Config - InterpretName::IotDeviceSetup → InterpretName::FleetDeviceSetup - HarmonyIotPool → HarmonyFleetPool (libvirt pool) - HARMONY_IOT_POOL_NAME (default "harmony-iot") → HARMONY_FLEET_POOL_NAME ("harmony-fleet") - IotSshKeypair → FleetSshKeypair - ensure_iot_ssh_keypair / ensure_harmony_iot_pool / check_iot_smoke_preflight_for_arch → fleet-prefixed variants Wire / config surfaces - CRD group `iot.nationtech.io` → `fleet.nationtech.io` - Finalizer `iot.nationtech.io/finalizer` → `fleet.nationtech.io/finalizer` - Shortnames iotdep/iotdevice → fleetdep/fleetdev - Env var IOT_AGENT_CONFIG → FLEET_AGENT_CONFIG - Env var IOT_VM_ADMIN_PASSWORD → FLEET_VM_ADMIN_PASSWORD - Binary /usr/local/bin/iot-agent → /usr/local/bin/fleet-agent - Systemd user `iot-agent` → `fleet-agent` - VM admin user `iot-admin` → `fleet-admin` Defaults - Namespaces iot-system/iot-demo/iot-load → fleet-system/fleet-demo/fleet-load - Helm release iot-nats → fleet-nats - Helm release iot-operator-v0 → harmony-fleet-operator - Container image localhost/iot-operator-v0:latest → localhost/harmony-fleet-operator:latest - On-disk cache $HARMONY_DATA_DIR/iot/ → $HARMONY_DATA_DIR/fleet/ (cloud-images, ssh keypairs, libvirt pool) What stayed - harmony-reconciler-contracts — already neutrally named - Wire types (DeviceInfo, DeploymentState, HeartbeatPayload, DeploymentName) — already neutral - KV buckets (device-info, device-state, device-heartbeat, desired-state) — already neutral - CRD kind names (Deployment, Device) — already neutral - NatsBasicScore / NatsHelmChartScore / HelmChart / etc. — framework-scope, unchanged Verification - cargo check --workspace --all-targets: clean - All harmony lib tests (114), fleet-operator (6), fleet-agent (7), harmony-reconciler-contracts (13): green - End-to-end load-test (20 devices / 3 CRs / 20s under fleet/scripts/load-test.sh): PASS. Image built as localhost/harmony-fleet-operator:latest, chart installed as release harmony-fleet-operator in namespace fleet-system, all CR aggregates correct. Zero stragglers: grep across the tree for \biot\b / IOT_ / \bIot[A-Z] returns empty (excluding docs explicitly talking about IoT as the first customer's domain).
johnride added 1 commit 2026-04-23 17:53:08 +00:00
refactor: rebrand iot → fleet, operator/agent crates → harmony-fleet-*
All checks were successful
Run Check Script / check (pull_request) Successful in 2m25s
7c1fedb303
The IoT vocabulary was anchoring the codebase to one customer's
domain. The reconciler pattern is generic — operator in k8s, NATS
KV as desired-state bus, agents reconciling podman / OKD / KVM /
anything that can register. "Fleet" captures that neutrally; IoT
stays acknowledged in docs as the first customer use case.

Done now, while nothing is deployed. After a partner fleet lands,
changing the CRD group alone is a multi-quarter migration.

Scope (nothing left over):

Paths + crates
- iot/ → fleet/
- iot/iot-operator-v0 → fleet/harmony-fleet-operator
- iot/iot-agent-v0 → fleet/harmony-fleet-agent
- harmony/src/modules/iot → harmony/src/modules/fleet
- ROADMAP/iot_platform → ROADMAP/fleet_platform
- examples/iot_{vm_setup, load_test, nats_install} → examples/fleet_*
- -v0 suffix dropped on the operator + agent crates (semver in
  Cargo.toml already tracks version)

Rust identifiers
- enum IotScore (podman score payload) → ReconcileScore
- struct IotDeviceSetupScore/Config → FleetDeviceSetupScore/Config
- InterpretName::IotDeviceSetup → InterpretName::FleetDeviceSetup
- HarmonyIotPool → HarmonyFleetPool (libvirt pool)
- HARMONY_IOT_POOL_NAME (default "harmony-iot") → HARMONY_FLEET_POOL_NAME ("harmony-fleet")
- IotSshKeypair → FleetSshKeypair
- ensure_iot_ssh_keypair / ensure_harmony_iot_pool /
  check_iot_smoke_preflight_for_arch → fleet-prefixed variants

Wire / config surfaces
- CRD group `iot.nationtech.io` → `fleet.nationtech.io`
- Finalizer `iot.nationtech.io/finalizer` → `fleet.nationtech.io/finalizer`
- Shortnames iotdep/iotdevice → fleetdep/fleetdev
- Env var IOT_AGENT_CONFIG → FLEET_AGENT_CONFIG
- Env var IOT_VM_ADMIN_PASSWORD → FLEET_VM_ADMIN_PASSWORD
- Binary /usr/local/bin/iot-agent → /usr/local/bin/fleet-agent
- Systemd user `iot-agent` → `fleet-agent`
- VM admin user `iot-admin` → `fleet-admin`

Defaults
- Namespaces iot-system/iot-demo/iot-load → fleet-system/fleet-demo/fleet-load
- Helm release iot-nats → fleet-nats
- Helm release iot-operator-v0 → harmony-fleet-operator
- Container image localhost/iot-operator-v0:latest →
  localhost/harmony-fleet-operator:latest
- On-disk cache $HARMONY_DATA_DIR/iot/ → $HARMONY_DATA_DIR/fleet/
  (cloud-images, ssh keypairs, libvirt pool)

What stayed
- harmony-reconciler-contracts — already neutrally named
- Wire types (DeviceInfo, DeploymentState, HeartbeatPayload,
  DeploymentName) — already neutral
- KV buckets (device-info, device-state, device-heartbeat,
  desired-state) — already neutral
- CRD kind names (Deployment, Device) — already neutral
- NatsBasicScore / NatsHelmChartScore / HelmChart / etc. —
  framework-scope, unchanged

Verification
- cargo check --workspace --all-targets: clean
- All harmony lib tests (114), fleet-operator (6), fleet-agent
  (7), harmony-reconciler-contracts (13): green
- End-to-end load-test (20 devices / 3 CRs / 20s under
  fleet/scripts/load-test.sh): PASS. Image built as
  localhost/harmony-fleet-operator:latest, chart installed as
  release harmony-fleet-operator in namespace fleet-system,
  all CR aggregates correct.

Zero stragglers: grep across the tree for \biot\b / IOT_ /
\bIot[A-Z] returns empty (excluding docs explicitly talking about
IoT as the first customer's domain).
Author
Owner

● All three deliverables done

feat/iot-helm — 3 new commits on top of the existing PR

┌──────────┬────────────────────────────────────────────────────────────────────────────┐
│ SHA │ Commit │
├──────────┼────────────────────────────────────────────────────────────────────────────┤
a616204b │ NATS primitive extract (original, now superseded by…) │
├──────────┼────────────────────────────────────────────────────────────────────────────┤
4254a209 │ refactor(nats): share the helm-chart primitive across all NATS scores │
├──────────┼────────────────────────────────────────────────────────────────────────────┤
61cdb9c3 │ refactor(examples): rename iot_apply_deployment → harmony_apply_deployment │
└──────────┴────────────────────────────────────────────────────────────────────────────┘

The NATS refactor correctly addresses your review: deleted node.rs (279 lines of reinvented-NATS parallel universe), introduced NatsHelmChartScore that pins the upstream
nats/nats chart + repo, rewrote NatsBasicScore as a minimal single-node values-yaml preset, pointed NatsK8sScore (supercluster) at the same wrapper. Two presets, one
primitive. K8sBareTopology grew an impl HelmCommand so the in-cluster NATS install path still compiles. 12 NATS unit tests green. End-to-end load-test.sh at 20 devices: PASS.

feat/iot-rebrand — 1 rebrand commit on top of feat/iot-helm

One atomic commit. 57 files, +499/−479 lines — mostly renames. Summary of moves:

  • Paths: iot/ → fleet/, harmony/src/modules/iot/ → fleet/, ROADMAP/iot_platform/ → fleet_platform/, examples/iot_* → examples/fleet_*
  • Crates: iot-operator-v0 → harmony-fleet-operator, iot-agent-v0 → harmony-fleet-agent (-v0 suffix dropped, semver lives in Cargo.toml)
  • Rust identifiers: IotScore → ReconcileScore, IotDeviceSetupScore/Config → FleetDeviceSetupScore/Config, HarmonyIotPool → HarmonyFleetPool, IotSshKeypair → FleetSshKeypair,
    all the ensure_iot_* / check_iot_* / InterpretName::IotDeviceSetup follow
  • Wire + config: CRD group iot.nationtech.io → fleet.nationtech.io, finalizer + shortnames follow, env vars IOT_AGENT_CONFIG / IOT_VM_ADMIN_PASSWORD → FLEET_*, binary
    /usr/local/bin/iot-agent → fleet-agent, systemd user iot-agent → fleet-agent, VM admin iot-admin → fleet-admin
  • Defaults: namespaces iot-system/iot-demo/iot-load → fleet-*, helm releases iot-nats → fleet-nats and iot-operator-v0 → harmony-fleet-operator, on-disk cache
    $HARMONY_DATA_DIR/iot/ → fleet/

What stayed unchanged (already domain-neutral):

  • harmony-reconciler-contracts crate
  • Wire types (DeviceInfo, DeploymentState, HeartbeatPayload, DeploymentName)
  • KV bucket names (device-info, device-state, device-heartbeat, desired-state)
  • CRD kind names (Deployment, Device)
  • NatsBasicScore, HelmChart, K8sBareTopology, etc.

Verification

  • cargo check --workspace --all-targets: clean
  • cargo test: 114 harmony lib + 6 fleet-operator + 7 fleet-agent + 13 harmony-reconciler-contracts = 140 tests green
  • End-to-end fleet/scripts/load-test.sh at 20 devices / 3 CRs: PASS. Image localhost/harmony-fleet-operator:latest, helm release harmony-fleet-operator in namespace
    fleet-system, aggregates correct
  • Zero stragglers: grep -E "\biot\b|IOT_|\bIot[A-Z]" across rs/sh/toml returns empty

Branch layout now

master
└── feat/iot-helm (this is what your PR review is on)
└── feat/iot-rebrand (1 atomic commit on top)

Push when you want to publish either. The rebrand commit is structured as one atomic change so it's readable end-to-end and revertable as a unit — any piece of the rename
that turns out wrong is one git revert away.

● All three deliverables done feat/iot-helm — 3 new commits on top of the existing PR ┌──────────┬────────────────────────────────────────────────────────────────────────────┐ │ SHA │ Commit │ ├──────────┼────────────────────────────────────────────────────────────────────────────┤ │ a616204b │ NATS primitive extract (original, now superseded by…) │ ├──────────┼────────────────────────────────────────────────────────────────────────────┤ │ 4254a209 │ refactor(nats): share the helm-chart primitive across all NATS scores │ ├──────────┼────────────────────────────────────────────────────────────────────────────┤ │ 61cdb9c3 │ refactor(examples): rename iot_apply_deployment → harmony_apply_deployment │ └──────────┴────────────────────────────────────────────────────────────────────────────┘ The NATS refactor correctly addresses your review: deleted node.rs (279 lines of reinvented-NATS parallel universe), introduced NatsHelmChartScore that pins the upstream nats/nats chart + repo, rewrote NatsBasicScore as a minimal single-node values-yaml preset, pointed NatsK8sScore (supercluster) at the same wrapper. Two presets, one primitive. K8sBareTopology grew an impl HelmCommand so the in-cluster NATS install path still compiles. 12 NATS unit tests green. End-to-end load-test.sh at 20 devices: PASS. feat/iot-rebrand — 1 rebrand commit on top of feat/iot-helm One atomic commit. 57 files, +499/−479 lines — mostly renames. Summary of moves: - Paths: iot/ → fleet/, harmony/src/modules/iot/ → fleet/, ROADMAP/iot_platform/ → fleet_platform/, examples/iot_* → examples/fleet_* - Crates: iot-operator-v0 → harmony-fleet-operator, iot-agent-v0 → harmony-fleet-agent (-v0 suffix dropped, semver lives in Cargo.toml) - Rust identifiers: IotScore → ReconcileScore, IotDeviceSetupScore/Config → FleetDeviceSetupScore/Config, HarmonyIotPool → HarmonyFleetPool, IotSshKeypair → FleetSshKeypair, all the ensure_iot_* / check_iot_* / InterpretName::IotDeviceSetup follow - Wire + config: CRD group iot.nationtech.io → fleet.nationtech.io, finalizer + shortnames follow, env vars IOT_AGENT_CONFIG / IOT_VM_ADMIN_PASSWORD → FLEET_*, binary /usr/local/bin/iot-agent → fleet-agent, systemd user iot-agent → fleet-agent, VM admin iot-admin → fleet-admin - Defaults: namespaces iot-system/iot-demo/iot-load → fleet-*, helm releases iot-nats → fleet-nats and iot-operator-v0 → harmony-fleet-operator, on-disk cache $HARMONY_DATA_DIR/iot/ → fleet/ What stayed unchanged (already domain-neutral): - harmony-reconciler-contracts crate - Wire types (DeviceInfo, DeploymentState, HeartbeatPayload, DeploymentName) - KV bucket names (device-info, device-state, device-heartbeat, desired-state) - CRD kind names (Deployment, Device) - NatsBasicScore, HelmChart, K8sBareTopology, etc. Verification - cargo check --workspace --all-targets: clean - cargo test: 114 harmony lib + 6 fleet-operator + 7 fleet-agent + 13 harmony-reconciler-contracts = 140 tests green - End-to-end fleet/scripts/load-test.sh at 20 devices / 3 CRs: PASS. Image localhost/harmony-fleet-operator:latest, helm release harmony-fleet-operator in namespace fleet-system, aggregates correct - Zero stragglers: grep -E "\biot\b|IOT_|\bIot[A-Z]" across rs/sh/toml returns empty Branch layout now master └── feat/iot-helm (this is what your PR review is on) └── feat/iot-rebrand (1 atomic commit on top) Push when you want to publish either. The rebrand commit is structured as one atomic change so it's readable end-to-end and revertable as a unit — any piece of the rename that turns out wrong is one git revert away.
johnride merged commit fbe58228f2 into feat/iot-helm 2026-04-25 13:48:25 +00:00
johnride deleted branch feat/iot-rebrand 2026-04-25 13:48:25 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: NationTech/harmony#276
No description provided.