From 2e6fbe5856960fa825fc9b9d6da13a2e0cf93f60 Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Sun, 20 Jul 2025 11:27:26 -0500 Subject: [PATCH] Trying to structure this to be a flake input. --- flake.nix | 38 ++++++++++++++++++++++++++++++++++++++ lib/metanix.nix | 45 +++++++++++++++++++++++++++++++++++++++++++++ test-index.nix | 6 ++++++ 3 files changed, 89 insertions(+) create mode 100644 flake.nix create mode 100644 lib/metanix.nix create mode 100644 test-index.nix diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..16da974 --- /dev/null +++ b/flake.nix @@ -0,0 +1,38 @@ +{ + description = "Metanix infra logic flake"; + + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + outputs = { self, nixpkgs }: + let + system = "x86_64-linux"; + pkgs = import nixpkgs { inherit system; }; + data = import ./meta.nix; + metanix = import ./lib/metanix.nix { inherit data; lib = pkgs.lib; }; + in + { + # You get a devShell so you can :repl in peace + devShells.${system}.default = pkgs.mkShell { + buildInputs = [ pkgs.nix pkgs.git ]; + }; + + # Simple command to dump the system index to stdout + apps.${system}.print-index = { + type = "app"; + program = pkgs.writeShellScript "print-index" '' + nix eval --impure --expr ' + let + data = import ./meta.nix; + lib = import ${nixpkgs}/lib; + metanix = import ./lib/metanix.nix { inherit data lib; }; + in + builtins.toJSON metanix.buildSystemIndex + ' + ''; + }; + + # Or expose it as a Nix eval-friendly output + packages.${system}.default = pkgs.writeText "system-index.json" + (builtins.toJSON metanix.buildSystemIndex); + }; +} diff --git a/lib/metanix.nix b/lib/metanix.nix new file mode 100644 index 0000000..4325112 --- /dev/null +++ b/lib/metanix.nix @@ -0,0 +1,45 @@ +# lib/metanix.nix +{ data, lib }: + +let + buildSystemIndex = + let + flattenSystems = locationName: subnetName: systems: + lib.mapAttrsToList + (systemName: systemCfg: { + inherit systemName locationName subnetName; + primary = systemCfg.primary or false; + macs = systemCfg.macAddresses or [ ]; + }) + systems; + + allSystems = + builtins.concatLists ( + lib.mapAttrsToList + (locationName: location: + builtins.concatLists ( + lib.mapAttrsToList + (subnetName: subnet: + flattenSystems locationName subnetName (subnet.systems or { }) + ) + (location.subnets or { }) + ) + ) + data.locations + ); + in + builtins.foldl' + (acc: entry: + let + existing = acc.${entry.systemName} or [ ]; + in + acc // { + ${entry.systemName} = existing ++ [ builtins.removeAttrs entry [ "systemName" ] ]; + } + ) + { } + allSystems; +in +{ + inherit buildSystemIndex; +} diff --git a/test-index.nix b/test-index.nix new file mode 100644 index 0000000..717c9f1 --- /dev/null +++ b/test-index.nix @@ -0,0 +1,6 @@ +# test-index.nix +let + data = import ./meta.nix; + metanix = import ./lib/metanix.nix { inherit data; }; +in +metanix.buildSystemIndex