forked from dan/liminix
flip dependencies for triggered/controlled services
Instead of treating the trigger as the "main" service and the triggered service as subsidary, now we treat the triggered service as the service and the trigger as "subsidary". This needs some special handling when we work out which services go in the default bundle, but it works better for declaring dependencies on triggered services because it means the dependency runs after the triggered service comes up, not just when the watcher-for-events starts
This commit is contained in:
parent
2c10790a6d
commit
e6e4665a18
|
@ -7,19 +7,21 @@
|
|||
let
|
||||
inherit (liminix.services) longrun oneshot;
|
||||
device = "/dev/disk/by-partlabel/${partlabel}";
|
||||
name = "mount.${lib.strings.sanitizeDerivationName (lib.escapeURL mountpoint)}";
|
||||
options_string =
|
||||
if options == [] then "" else "-o ${lib.concatStringsSep "," options}";
|
||||
mount_service = oneshot {
|
||||
name = "mount.${lib.escapeURL mountpoint}";
|
||||
timeout-up = 3600;
|
||||
up = "mount -t ${fstype} ${options_string} ${device} ${mountpoint}";
|
||||
down = "umount ${mountpoint}";
|
||||
};
|
||||
in svc.uevent-rule.build {
|
||||
service = mount_service;
|
||||
symlink = device;
|
||||
terms = {
|
||||
partname = partlabel;
|
||||
devtype = "partition";
|
||||
controller = svc.uevent-rule.build {
|
||||
serviceName = name;
|
||||
symlink = device;
|
||||
terms = {
|
||||
partname = partlabel;
|
||||
devtype = "partition";
|
||||
};
|
||||
};
|
||||
in oneshot {
|
||||
inherit name;
|
||||
timeout-up = 3600;
|
||||
up = "mount -t ${fstype} ${options_string} ${device} ${mountpoint}";
|
||||
down = "umount ${mountpoint}";
|
||||
inherit controller;
|
||||
}
|
||||
|
|
|
@ -13,7 +13,10 @@ let
|
|||
let
|
||||
defaultDefaultTarget = bundle {
|
||||
name = "default";
|
||||
contents = builtins.attrValues config.services;
|
||||
contents =
|
||||
builtins.map
|
||||
(s: if (s ? controller && s.controller != null) then s.controller else s)
|
||||
(builtins.attrValues config.services));
|
||||
};
|
||||
servicesAttrs = {
|
||||
default = defaultDefaultTarget;
|
||||
|
|
|
@ -15,9 +15,9 @@ in {
|
|||
};
|
||||
config = {
|
||||
system.service.uevent-rule = liminix.callService ./rule.nix {
|
||||
service = mkOption {
|
||||
description = "the service to run when the rule matches";
|
||||
type = liminix.lib.types.service;
|
||||
serviceName = mkOption {
|
||||
description = "name of the service to run when the rule matches";
|
||||
type = types.str;
|
||||
};
|
||||
terms = mkOption {
|
||||
type = types.attrs;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
, serviceFns
|
||||
, lib }:
|
||||
{
|
||||
service, terms, symlink
|
||||
serviceName, terms, symlink
|
||||
}:
|
||||
let
|
||||
inherit (liminix.services) longrun;
|
||||
|
@ -18,8 +18,7 @@ let
|
|||
attrs));
|
||||
termsString = stringify terms;
|
||||
in longrun {
|
||||
name = "watch-for-${service.name}";
|
||||
name = "watch-for-${serviceName}";
|
||||
isTrigger = true;
|
||||
buildInputs = [ service ];
|
||||
run = "${uevent-watch}/bin/uevent-watch ${if symlink != null then "-n ${symlink}" else ""} -s ${service.name} ${termsString}";
|
||||
run = "${uevent-watch}/bin/uevent-watch ${if symlink != null then "-n ${symlink}" else ""} -s ${serviceName} ${termsString}";
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ test -n "$contents" && for d in $contents; do
|
|||
touch $out/${name}/contents.d/$d
|
||||
done
|
||||
|
||||
for i in timeout-up timeout-down run notification-fd up down finish consumer-for producer-for pipeline-name restart-on-upgrade; do
|
||||
for i in controllerName timeout-up timeout-down run notification-fd up down finish consumer-for producer-for pipeline-name restart-on-upgrade; do
|
||||
test -n "$(printenv $i)" && (echo "$(printenv $i)" > $out/${name}/$i)
|
||||
done
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ let
|
|||
, contents ? []
|
||||
, buildInputs ? []
|
||||
, isTrigger ? false
|
||||
, controller ? null
|
||||
} @ args:
|
||||
stdenvNoCC.mkDerivation {
|
||||
# we use stdenvNoCC to avoid generating derivations with names
|
||||
|
@ -46,9 +47,11 @@ let
|
|||
inherit name serviceType up down run finish notification-fd
|
||||
producer-for consumer-for pipeline-name timeout-up timeout-down;
|
||||
restart-on-upgrade = isTrigger;
|
||||
buildInputs = buildInputs ++ dependencies ++ contents;
|
||||
buildInputs = buildInputs ++ dependencies ++ contents ++ lib.optional (controller != null) controller;
|
||||
dependencies = map (d: d.name) dependencies;
|
||||
contents = map (d: d.name) contents;
|
||||
inherit controller;
|
||||
controllerName = if controller ? name then controller.name else null;
|
||||
builder = ./builder.sh;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue