From d6725ae24fb3968e751eb38dd1794e9b3c98d5a0 Mon Sep 17 00:00:00 2001 From: marshmallow Date: Mon, 22 Dec 2025 13:36:35 +1100 Subject: [PATCH] add per-node special args (#381) --- CHANGELOG.md | 1 + doc/guides/writing-a-hive.md | 4 +++ doc/reference/meta.md | 18 +++++++++++ runtime/evaluate.nix | 3 +- tests/nix/suite/test_remote_deploy/hive.nix | 34 +++++++++++++++------ 5 files changed, 50 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be1b5be..0551936 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add a `--substitute-on-destination` argument. +- Add the `meta.nodeSpecialArgs` meta option. ## [v1.0.0] - 2025-12-17 diff --git a/doc/guides/writing-a-hive.md b/doc/guides/writing-a-hive.md index bb141e2..391854f 100644 --- a/doc/guides/writing-a-hive.md +++ b/doc/guides/writing-a-hive.md @@ -23,6 +23,10 @@ wire.makeHive { # type: attrset specialArgs = { }; + # `meta.nodeSpecialArgs` lets you override `meta.specialArgs` per-node. + # type: attrset of attrset + nodeSpecialArgs: = { }; + # `meta.nodeNixpkgs` lets you override nixpkgs per-node. # type: attrset of "A path or an instance of nixpkgs." nodeNixpkgs: = { }; diff --git a/doc/reference/meta.md b/doc/reference/meta.md index 56b8e40..914c530 100644 --- a/doc/reference/meta.md +++ b/doc/reference/meta.md @@ -61,6 +61,24 @@ _Example:_ } ``` +## meta.nodeSpecialArgs + +Extra `specialArgs` to override `meta.specialArgs` for each node + +_Type:_ attribute set of attribute set + +_Default:_ `{ }` + +_Example:_ + +```nix +{ + meta.nodeSpecialArgs = { + extra-property = "some-value"; + }; +} +``` + ## meta.nodeNixpkgs Per-node nixpkgs to override `meta.nixpkgs`. diff --git a/runtime/evaluate.nix b/runtime/evaluate.nix index 12eae3e..e046633 100644 --- a/runtime/evaluate.nix +++ b/runtime/evaluate.nix @@ -83,7 +83,8 @@ let specialArgs = { inherit name nodes; } - // mergedHive.meta.specialArgs or { }; + // mergedHive.meta.specialArgs or { } + // mergedHive.meta.nodeSpecialArgs.${name} or { }; }; nodes = builtins.listToAttrs ( diff --git a/tests/nix/suite/test_remote_deploy/hive.nix b/tests/nix/suite/test_remote_deploy/hive.nix index 3df9e23..2a38593 100644 --- a/tests/nix/suite/test_remote_deploy/hive.nix +++ b/tests/nix/suite/test_remote_deploy/hive.nix @@ -5,7 +5,17 @@ let inherit (import ../utils.nix { testName = "test_keys-@IDENT@"; }) makeHive mkHiveNode; in makeHive { - meta.nixpkgs = import { localSystem = "x86_64-linux"; }; + meta = { + nixpkgs = import { localSystem = "x86_64-linux"; }; + + specialArgs = { + message = "second"; + }; + + nodeSpecialArgs = { + receiver-third.message = "third"; + }; + }; receiver = mkHiveNode { hostname = "receiver"; } { environment.etc."identity".text = "first"; @@ -20,15 +30,21 @@ makeHive { ]; }; - receiver-second = mkHiveNode { hostname = "receiver"; } { - environment.etc."identity".text = "second"; - deployment.target.host = "receiver"; - }; + receiver-second = mkHiveNode { hostname = "receiver"; } ( + { message, ... }: + { + environment.etc."identity".text = message; + deployment.target.host = "receiver"; + } + ); - receiver-third = mkHiveNode { hostname = "receiver"; } { - environment.etc."identity".text = "third"; - deployment.target.host = "receiver"; - }; + receiver-third = mkHiveNode { hostname = "receiver"; } ( + { message, ... }: + { + environment.etc."identity".text = message; + deployment.target.host = "receiver"; + } + ); receiver-unreachable = mkHiveNode { hostname = "receiver"; } { # test node pinging -- 2.51.2