photoncloud-monorepo/docs/por/T061-deployer-nixnos/task.yaml
centra 3eeb303dcb feat: Batch commit for T039.S3 deployment
Includes all pending changes needed for nixos-anywhere:
- fiberlb: L7 policy, rule, certificate types
- deployer: New service for cluster management
- nix-nos: Generic network modules
- Various service updates and fixes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-13 04:34:51 +09:00

219 lines
8.1 KiB
YAML

id: T061
name: PlasmaCloud Deployer & Cluster Management
goal: Implement PlasmaCloud-specific layers (L2/L3) for cluster and deployment management
status: complete
completed: 2025-12-13 01:44 JST
priority: P0
owner: peerA
created: 2025-12-13
depends_on: [T062]
blocks: []
context: |
**User Direction (2025-12-13 00:46 JST):**
Three-layer architecture with separate Nix-NOS repo:
**Layer 1 (T062):** Nix-NOS generic network module (separate repo)
**Layer 2 (T061):** PlasmaCloud Network - FiberLB BGP, PrismNET integration
**Layer 3 (T061):** PlasmaCloud Cluster - cluster-config, Deployer, orchestration
**Key Principle:**
PlasmaCloud modules DEPEND ON Nix-NOS, not the other way around.
Nix-NOS remains generic and reusable by other projects.
**Repository:** github.com/centra/plasmacloud (existing repo)
**Path:** nix/modules/plasmacloud-*.nix
acceptance:
- plasmacloud.cluster defines node topology and generates cluster-config.json
- plasmacloud.network uses nix-nos.bgp for FiberLB VIP advertisement
- Deployer Rust service for node lifecycle management
- PlasmaCloud flake.nix imports nix-nos as input
steps:
- step: S1
name: PlasmaCloud Cluster Module (Layer 3)
done: plasmacloud-cluster.nix for topology and cluster-config generation
status: complete
completed: 2025-12-13 00:58 JST
owner: peerB
priority: P0
notes: |
Create nix/modules/plasmacloud-cluster.nix:
options.plasmacloud.cluster = {
name = mkOption { type = str; };
nodes = mkOption {
type = attrsOf (submodule {
role = enum [ "control-plane" "worker" ];
ip = str;
services = listOf str;
});
};
bootstrap.initialPeers = listOf str;
bgp.asn = int;
};
config = {
# Generate cluster-config.json
environment.etc."nixos/secrets/cluster-config.json".text = ...;
# Map to nix-nos.topology
};
outputs:
- path: nix/modules/plasmacloud-cluster.nix
note: Complete module with options, validation, and cluster-config.json generation (175L)
- path: .cccc/work/test-plasmacloud-cluster.nix
note: Test configuration validating module evaluation
- step: S2
name: PlasmaCloud Network Module (Layer 2)
done: plasmacloud-network.nix using nix-nos.bgp for FiberLB
status: complete
completed: 2025-12-13 01:11 JST
owner: peerB
priority: P0
depends_on: [T062.S2]
notes: |
Create nix/modules/plasmacloud-network.nix:
options.plasmacloud.network = {
fiberlbBgp = {
enable = mkEnableOption "FiberLB BGP";
vips = listOf str;
};
prismnetIntegration.enable = mkEnableOption "PrismNET OVN";
};
config = mkIf fiberlbBgp.enable {
nix-nos.bgp = {
enable = true;
backend = "gobgp"; # FiberLB uses GoBGP
asn = cluster.bgp.asn;
announcements = map vipToAnnouncement vips;
};
services.fiberlb.bgp.gobgpAddress = "127.0.0.1:50051";
};
outputs:
- path: nix/modules/plasmacloud-network.nix
note: Complete Layer 2 module bridging plasmacloud.network → nix-nos.bgp (130L)
- path: .cccc/work/test-plasmacloud-network.nix
note: Test configuration with FiberLB BGP + VIP advertisement
- step: S3
name: Deployer Core (Rust)
done: Deployer service with Phone Home API and ChainFire state
status: complete
completed: 2025-12-13 01:28 JST
owner: peerB
priority: P1
notes: |
Create deployer/ Rust workspace:
- Phone Home API for node registration
- State management via ChainFire (in-memory for now, ChainFire integration TODO)
- Node lifecycle: Pending → Provisioning → Active → Failed
- REST API with /health and /api/v1/phone-home endpoints
Phase 1 (minimal scaffolding) complete.
Future work: gRPC API, full ChainFire integration, health monitoring.
outputs:
- path: deployer/Cargo.toml
note: Workspace definition with deployer-types and deployer-server
- path: deployer/crates/deployer-types/src/lib.rs
note: NodeState enum, NodeInfo struct, PhoneHomeRequest/Response types (110L)
- path: deployer/crates/deployer-server/src/main.rs
note: Binary entry point with tracing initialization (24L)
- path: deployer/crates/deployer-server/src/lib.rs
note: Router setup with /health and /api/v1/phone-home routes (71L)
- path: deployer/crates/deployer-server/src/config.rs
note: Configuration loading with ChainFire settings (93L)
- path: deployer/crates/deployer-server/src/phone_home.rs
note: Phone Home API endpoint handler with in-memory state (120L)
- path: deployer/crates/deployer-server/src/state.rs
note: AppState with RwLock for node registry (36L)
- step: S4
name: Flake Integration
done: Update plasmacloud flake.nix to import nix-nos
status: complete
completed: 2025-12-13 01:03 JST
owner: peerB
priority: P1
depends_on: [T062.S1]
notes: |
Update flake.nix:
inputs = {
nix-nos.url = "github:centra/nix-nos";
nix-nos.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { nix-nos, ... }: {
nixosConfigurations.node01 = {
modules = [
nix-nos.nixosModules.default
./nix/modules/plasmacloud-cluster.nix
./nix/modules/plasmacloud-network.nix
];
};
};
outputs:
- path: flake.nix
note: Added nix-nos input (path:./nix-nos) and wired to node01 configuration (+8L)
- path: flake.lock
note: Locked nix-nos dependency
- step: S5
name: ISO Pipeline
done: Automated ISO generation with embedded cluster-config
status: complete
completed: 2025-12-13 01:44 JST
owner: peerB
priority: P2
notes: |
Created ISO pipeline for PlasmaCloud first-boot:
- nix/iso/plasmacloud-iso.nix - ISO configuration with Phone Home service
- nix/iso/build-iso.sh - Build script with cluster-config embedding
- flake.nix plasmacloud-iso configuration
- Phone Home service contacts Deployer at http://deployer:8080/api/v1/phone-home
- Extracts node info from cluster-config.json (node_id, IP, role, config hash)
- Retry logic with exponential backoff (5 attempts)
- DHCP networking enabled by default
- SSH enabled with default password for ISO
outputs:
- path: nix/iso/plasmacloud-iso.nix
note: ISO configuration with Phone Home service and cluster-config embedding (132L)
- path: nix/iso/build-iso.sh
note: ISO build script with validation and user-friendly output (65L)
- path: flake.nix
note: Added plasmacloud-iso nixosConfiguration (+8L)
evidence:
- item: T061.S1 PlasmaCloud Cluster Module
desc: Complete plasmacloud-cluster.nix with nodeType, generateClusterConfig, assertions
total_loc: 162
validation: nix-instantiate returns lambda, cluster-config.json generation verified
- item: T061.S4 Flake Integration
desc: nix-nos imported as flake input, wired to node01 configuration
total_loc: 8
validation: nix eval .#nixosConfigurations.node01.config.nix-nos.bgp returns bgp_exists
- item: T061.S2 PlasmaCloud Network Module
desc: plasmacloud-network.nix bridges Layer 2 → Layer 1 for FiberLB BGP
total_loc: 124
validation: nix-instantiate returns LAMBDA, nix-nos.bgp wired from fiberlbBgp
- item: T061.S3 Deployer Core (Rust)
desc: Deployer workspace with Phone Home API and in-memory state management
total_loc: 454
validation: cargo check passes, cargo test passes (7 tests)
- item: T061.S5 ISO Pipeline
desc: Bootable ISO with Phone Home service and cluster-config embedding
total_loc: 197
validation: nix-instantiate evaluates successfully, Phone Home service configured
notes: |
Reference: /home/centra/cloud/Nix-NOS.md
This is Layers 2+3 of the three-layer architecture.
Depends on T062 (Nix-NOS generic) for Layer 1.
Data flow:
User → plasmacloud.cluster → plasmacloud.network → nix-nos.bgp → NixOS standard modules