photoncloud-monorepo/nix/modules/nix-nos/cluster-config-generator.nix
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

65 lines
2.1 KiB
Nix

# Standalone cluster-config.json generator
# Usage: nix-build cluster-config-generator.nix --argstr hostname node01 --argstr clusterName plasmacloud
{ pkgs ? import <nixpkgs> {}
, hostname ? "node01"
, clusterName ? "plasmacloud"
, topologyFile ? ./example-topology.nix
}:
let
# Import topology module
lib = pkgs.lib;
# Evaluate the topology file
topologyEval = import topologyFile { inherit lib; };
# Get the cluster configuration
cluster = topologyEval.nix-nos.clusters.${clusterName} or (throw "Cluster ${clusterName} not found");
node = cluster.nodes.${hostname} or (throw "Node ${hostname} not found in cluster ${clusterName}");
# Determine bootstrap node
controlPlaneNodes = lib.filter (n: cluster.nodes.${n}.role == "control-plane") (lib.attrNames cluster.nodes);
bootstrapNodeName =
if cluster.bootstrapNode != null
then cluster.bootstrapNode
else lib.head controlPlaneNodes;
isBootstrap = hostname == bootstrapNodeName;
# Leader URL (bootstrap node's API endpoint)
bootstrapNode = cluster.nodes.${bootstrapNodeName};
leaderUrl = "https://${bootstrapNode.ip}:${toString bootstrapNode.apiPort}";
# Initial peers for Raft cluster
initialPeers = map (nodeName: {
id = nodeName;
addr = "${cluster.nodes.${nodeName}.ip}:${toString cluster.nodes.${nodeName}.raftPort}";
}) controlPlaneNodes;
# FlareDB peers (all control-plane nodes)
flaredbPeers = map (nodeName:
"${cluster.nodes.${nodeName}.ip}:${toString (cluster.nodes.${nodeName}.apiPort + 100)}"
) controlPlaneNodes;
# Generate cluster config
clusterConfig = {
node_id = hostname;
node_role = node.role;
bootstrap = isBootstrap;
cluster_name = cluster.name;
leader_url = leaderUrl;
raft_addr = "${node.ip}:${toString node.raftPort}";
initial_peers = initialPeers;
flaredb_peers = flaredbPeers;
services = node.services;
metadata = node.metadata;
};
# Convert to JSON
configJson = builtins.toJSON clusterConfig;
in pkgs.writeTextFile {
name = "cluster-config-${hostname}.json";
text = configJson;
destination = "/cluster-config.json";
}