1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-03-31 04:04:32 +00:00

podman: use type in attr name of built quadlets

This commit is contained in:
Nicholas Hassan 2025-03-18 14:55:36 +10:30
parent ba3f62b84b
commit 6c1f46df15
No known key found for this signature in database
GPG key ID: FC95AB946A781EE7
6 changed files with 43 additions and 37 deletions

View file

@ -9,11 +9,17 @@ let
createQuadletSource = name: containerDef:
let
dependencyBySuffix = type: name:
if (hasInfix ".${type}" name) then
let baseName = elemAt (splitString ".${type}" name) 0;
in if (hasAttr baseName cfg.internal.builtQuadlets) then
[ (cfg.internal.builtQuadlets.${baseName}) ]
extractQuadletReference = type: value:
let
regex = "([a-zA-Z0-9_-]+\\." + type + ").*";
parts = builtins.match regex value;
in if parts == null then value else builtins.elemAt parts 0;
dependencyBySuffix = type: value:
if (hasInfix ".${type}" value) then
let name = extractQuadletReference type value;
in if (hasAttr name cfg.internal.builtQuadlets) then
[ (cfg.internal.builtQuadlets.${name}) ]
else
[ ]
else
@ -32,28 +38,27 @@ let
++ (withResolverFor "volume" containerDef.volumes);
checkQuadletReference = types: value:
let baseName = t: elemAt (splitString ".${t}" value) 0;
in if builtins.isList value then
if builtins.isList value then
builtins.concatLists (map (checkQuadletReference types) value)
else
let type = findFirst (t: hasInfix ".${t}" value) null types;
in if (type != null) then
let
quadletBaseName = baseName type;
quadletName = extractQuadletReference type value;
quadletsOfType =
filterAttrs (n: v: v.quadletData.resourceType == type)
cfg.internal.builtQuadlets;
in if (hasAttr quadletBaseName quadletsOfType) then
in if (hasAttr quadletName quadletsOfType) then
[
(replaceStrings [ quadletBaseName ]
[ "podman-${quadletBaseName}" ] value)
(replaceStrings [ quadletName ] [ "podman-${quadletName}" ]
value)
]
else
[ value ]
else if ((hasInfix "/nix/store" value) == false
&& hasAttr value cfg.internal.builtQuadlets) then
lib.warn ''
A value for Podman container '${name}' might use a reference to another quadlet: ${value}.
A value for Podman container '${name}' might use a reference to another quadlet: ${value}.
Append the type '.${
cfg.internal.builtQuadlets.${value}.quadletData.resourceType
}' to '${baseName value}' if this is intended.

View file

@ -20,7 +20,7 @@ let
unpackPhase = ''
mkdir -p $out/quadlets
${concatStringsSep "\n" (map (v:
"ln -s ${v.out}/quadlets/${v.quadletData.serviceName}.${v.quadletData.resourceType} $out/quadlets")
"echo 'linking ${v.quadletData.serviceName}.${v.quadletData.resourceType}'; ln -s ${v.out}/quadlets/${v.quadletData.serviceName}.${v.quadletData.resourceType} $out/quadlets")
quadlet.dependencies)}
'';
@ -87,7 +87,8 @@ in {
(lib.hm.dag.entryAfter [ "reloadSystemd" ] activationCleanupScript);
services.podman.internal.builtQuadlets = listToAttrs (map (pkg: {
name = removePrefix "podman-" pkg.passthru.quadletData.serviceName;
name = (removePrefix "podman-" pkg.passthru.quadletData.serviceName) + "."
+ pkg.passthru.quadletData.resourceType;
value = pkg;
}) builtQuadlets);
};

View file

@ -9,9 +9,9 @@ ContainerName=my-container
Environment=
Image=podman-my-img.image
Label=nix.home-manager.managed=true
Network=podman-my-net.network
Network=podman-my-app.network
Network=externalnet
Volume=podman-my-vol.volume:/data
Volume=podman-my-app.volume:/data
[Install]
WantedBy=default.target
@ -29,7 +29,7 @@ Delegate=yes
Type=notify
NotifyAccess=all
SyslogIdentifier=%N
ExecStart=/nix/store/00000000000000000000000000000000-podman/bin/podman run --name my-container --cidfile=%t/%N.cid --replace --rm --cgroups=split --network my-net --network externalnet --sdnotify=conmon -d -v my-vol:/data --label nix.home-manager.managed=true docker.io/alpine:latest
ExecStart=/nix/store/00000000000000000000000000000000-podman/bin/podman run --name my-container --cidfile=%t/%N.cid --replace --rm --cgroups=split --network my-app --network externalnet --sdnotify=conmon -d -v my-app:/data --label nix.home-manager.managed=true docker.io/alpine:latest
[Unit]
Wants=podman-user-wait-network-online.service
@ -39,7 +39,7 @@ SourcePath=/nix/store/00000000000000000000000000000000-home-container-podman-my-
Requires=podman-my-img-image.service
After=podman-my-img-image.service
RequiresMountsFor=%t/containers
Requires=podman-my-net-network.service
After=podman-my-net-network.service
Requires=podman-my-vol-volume.service
After=podman-my-vol-volume.service
Requires=podman-my-app-network.service
After=podman-my-app-network.service
Requires=podman-my-app-volume.service
After=podman-my-app-volume.service

View file

@ -3,7 +3,7 @@
# Automatically generated by home-manager for podman network configuration
# DO NOT EDIT THIS FILE DIRECTLY
#
# my-net.network
# my-app.network
[Install]
WantedBy=default.target
WantedBy=multi-user.target
@ -11,7 +11,7 @@ WantedBy=multi-user.target
[X-Network]
Gateway=192.168.123.1
Label=nix.home-manager.managed=true
NetworkName=my-net
NetworkName=my-app
Subnet=192.168.123.0/24
[Service]
@ -19,7 +19,7 @@ Environment=PATH=/run/wrappers/bin:/usr/bin:/bin:/usr/sbin:/sbin:@shadow@/bin:/n
ExecStartPre=/nix/store/00000000000000000000000000000000-await-podman-unshare
RemainAfterExit=yes
TimeoutStartSec=15
ExecStart=/nix/store/00000000000000000000000000000000-podman/bin/podman network create --ignore --subnet 192.168.123.0/24 --gateway 192.168.123.1 --label nix.home-manager.managed=true my-net
ExecStart=/nix/store/00000000000000000000000000000000-podman/bin/podman network create --ignore --subnet 192.168.123.0/24 --gateway 192.168.123.1 --label nix.home-manager.managed=true my-app
SyslogIdentifier=%N
Type=oneshot
@ -27,6 +27,6 @@ Type=oneshot
Wants=podman-user-wait-network-online.service
After=podman-user-wait-network-online.service
After=network.target
Description=Service for network my-net
SourcePath=/nix/store/00000000000000000000000000000000-home-network-podman-my-net/quadlets/podman-my-net.network
Description=Service for network my-app
SourcePath=/nix/store/00000000000000000000000000000000-home-network-podman-my-app/quadlets/podman-my-app.network
RequiresMountsFor=%t/containers

View file

@ -3,7 +3,7 @@
# Automatically generated by home-manager for podman volume configuration
# DO NOT EDIT THIS FILE DIRECTLY
#
# my-vol.volume
# my-app.volume
[Install]
WantedBy=default.target
WantedBy=multi-user.target
@ -13,15 +13,15 @@ Environment=PATH=/run/wrappers/bin:/usr/bin:/bin:/usr/sbin:/sbin:@shadow@/bin:/n
ExecStartPre=/nix/store/00000000000000000000000000000000-await-podman-unshare
RemainAfterExit=yes
TimeoutStartSec=15
ExecStart=/nix/store/00000000000000000000000000000000-podman/bin/podman volume create --ignore --opt copy --opt device=tmpfs --opt type=tmpfs --label nix.home-manager.managed=true --label nix.home-manager.preserve=false my-vol
ExecStart=/nix/store/00000000000000000000000000000000-podman/bin/podman volume create --ignore --opt copy --opt device=tmpfs --opt type=tmpfs --label nix.home-manager.managed=true --label nix.home-manager.preserve=false my-app
SyslogIdentifier=%N
Type=oneshot
[Unit]
Wants=podman-user-wait-network-online.service
After=podman-user-wait-network-online.service
Description=Service for volume my-vol
SourcePath=/nix/store/00000000000000000000000000000000-home-volume-podman-my-vol/quadlets/podman-my-vol.volume
Description=Service for volume my-app
SourcePath=/nix/store/00000000000000000000000000000000-home-volume-podman-my-app/quadlets/podman-my-app.volume
RequiresMountsFor=%t/containers
[X-Volume]
@ -30,4 +30,4 @@ Device=tmpfs
Label=nix.home-manager.managed=true
Label=nix.home-manager.preserve=false
Type=tmpfs
VolumeName=my-vol
VolumeName=my-app

View file

@ -18,17 +18,17 @@
containers = {
"my-container" = {
image = "my-img.image";
network = [ "my-net.network" "externalnet" ];
volumes = [ "my-vol.volume:/data" ];
network = [ "my-app.network" "externalnet" ];
volumes = [ "my-app.volume:/data" ];
};
"my-container-bld" = { image = "my-bld.build"; };
};
images."my-img" = { image = "docker.io/alpine:latest"; };
networks."my-net" = {
networks."my-app" = {
gateway = "192.168.123.1";
subnet = "192.168.123.0/24";
};
volumes."my-vol" = {
volumes."my-app" = {
device = "tmpfs";
preserve = false;
type = "tmpfs";
@ -41,8 +41,8 @@
containerFile=$configPath/podman-my-container.service
containerBldFile=$configPath/podman-my-container-bld.service
imageFile=$configPath/podman-my-img-image.service
networkFile=$configPath/podman-my-net-network.service
volumeFile=$configPath/podman-my-vol-volume.service
networkFile=$configPath/podman-my-app-network.service
volumeFile=$configPath/podman-my-app-volume.service
assertFileExists $buildFile
assertFileExists $containerFile
assertFileExists $containerBldFile