holo-daemon: 0.8.0 -> 0.9.0; init modular service (#498536)

This commit is contained in:
Weijia Wang
2026-06-17 12:32:00 +00:00
committed by GitHub
4 changed files with 213 additions and 2 deletions
+1
View File
@@ -752,6 +752,7 @@ in
hitch = handleTest ./hitch { };
hledger-web = runTest ./hledger-web.nix;
hockeypuck = runTest ./hockeypuck.nix;
holo-daemon-modular-service = runTest ./holo-daemon-modular.nix;
home-assistant = runTest ./home-assistant.nix;
homebox = runTest ./homebox.nix;
homebridge = runTest ./homebridge.nix;
+66
View File
@@ -0,0 +1,66 @@
{ ... }:
{
_class = "nixosTest";
name = "holo-daemon-modular-service-test";
nodes = {
machine =
{ pkgs, ... }:
{
environment.systemPackages = [
pkgs.holo-daemon
pkgs.holo-cli
];
system.services.holo-daemon = {
imports = [ pkgs.holo-daemon.services.default ];
};
users.users.holo = {
isSystemUser = true;
group = "holo";
home = "/var/lib/holo";
createHome = true;
};
users.groups.holo = { };
services.getty.autologinUser = "root";
};
};
testScript =
{ nodes, ... }:
''
import time
start_all()
# holo-cli connects to the daemon at startup
# features a bash-like editing functionality for interactive use
# uses -c option to execute arguments as commands
machine.wait_for_unit("multi-user.target")
machine.wait_for_unit("holo-daemon.service")
machine.succeed("holo-cli -V")
# wait for cli to connect to the daemon
machine.wait_for_open_port(50051)
# Test the running configuration is empty
machine.succeed("holo-cli -c 'show running format json'")
# Configure an OSPFv3 instance:
# as seen in https://asciinema.org/a/qYxmDu1QjGPBAt5gNyNKvXhHk
machine.send_chars("holo-cli\n", 1)
time.sleep(5)
machine.send_chars("configure\n", 1)
machine.send_chars("routing control-plane-protocols control-plane-protocol ietf-ospf:ospfv3 main\n", 1)
machine.send_chars("ospf preference inter-area 50\n", 1)
machine.send_chars("show changes\n", 1)
machine.send_chars("commit\n", 1)
machine.send_chars("exit\n", 1)
# Verify the configuration was applied (in interactive test)
machine.succeed("test \"$(holo-cli -c 'show running format json')\" != \"{}\"");
'';
}
+13 -2
View File
@@ -6,6 +6,7 @@
pkg-config,
protobuf,
pcre2,
pkgs,
nix-update-script,
}:
@@ -20,8 +21,6 @@ rustPlatform.buildRustPackage (finalAttrs: {
hash = "sha256-zZrse46NJb8gD4BtM20FfdtRdxVNLZ+/51dy2nuiOd8=";
};
passthru.updateScript = nix-update-script { };
cargoHash = "sha256-cHJzwI7FDVA1iwqg+x9sMlao22SGQoOuq+MB0XtYsEc=";
# Use rust nightly features
@@ -36,6 +35,18 @@ rustPlatform.buildRustPackage (finalAttrs: {
pcre2
];
passthru = {
updateScript = nix-update-script { };
services.default = {
imports = [
(lib.modules.importApply ./service.nix {
inherit pkgs;
})
];
holo-daemon.package = lib.mkDefault finalAttrs.finalPackage;
};
};
meta = {
description = "`holo` daemon that provides the routing protocols, tools and policies";
homepage = "https://github.com/holo-routing/holo";
+133
View File
@@ -0,0 +1,133 @@
# Non-module dependencies (`importApply`)
{ pkgs }:
# Service module
{
config,
lib,
...
}:
let
inherit (lib)
mkPackageOption
mkOption
types
;
cfg = config.holo-daemon;
format = pkgs.formats.toml { };
configFile = format.generate "holod.toml" cfg.settings;
in
{
_class = "service";
options.holo-daemon = {
package = mkPackageOption pkgs "holo-daemon" { };
settings = mkOption {
type = types.submodule {
freeformType = format.type;
options = {
user = mkOption {
type = types.str;
description = "User for the holo daemon";
default = "holo";
};
group = mkOption {
type = types.str;
description = "Group for the holo daemon";
default = "holo";
};
# Needs to be writable by @user or @group
database_path = mkOption {
type = types.str;
description = "Path to the holo database";
default = "/var/run/holod/holod.db";
};
logging = mkOption {
type = types.submodule {
freeformType = format.type;
options = {
journald = mkOption {
type = types.submodule {
options = {
enabled = mkOption {
type = types.bool;
description = "Enable or disable journald logging";
default = true;
};
};
};
description = "Journald logging configuration";
default = { };
};
file = mkOption {
type = types.submodule {
options = {
enabled = mkOption {
type = types.bool;
description = "Enable or disable file logging";
default = true;
};
dir = mkOption {
type = types.str;
description = "Directory for log files";
default = "/var/log/";
};
name = mkOption {
type = types.str;
description = "Name of the log file";
default = "holod.log";
};
};
};
description = "File logging configuration";
default = { };
};
};
};
description = "Logging configuration for the holo daemon";
default = { };
};
plugins = mkOption {
type = types.submodule {
freeformType = format.type;
options = {
grpc = mkOption {
type = types.submodule {
options = {
enabled = mkOption {
type = types.bool;
description = "Enable or disable gRPC plugin";
default = true;
};
address = mkOption {
type = types.str;
description = "gRPC server listening address";
default = "[::]:50051";
};
};
};
description = "gRPC plugin configuration";
default = { };
};
};
};
description = "Plugin configuration for the holo daemon";
default = { };
};
};
};
description = "Configuration for the holo daemon";
default = { };
};
};
config = {
process.argv = [
"${cfg.package}/bin/holod"
"-c"
configFile
];
};
meta.maintainers = with lib.maintainers; [ themadbit ];
}