mirror of
https://github.com/nix-community/home-manager.git
synced 2025-12-22 17:01:11 +01:00
podman: use type in attr name of built quadlets
This commit is contained in:
parent
8bb071912b
commit
bb72d79f5d
6 changed files with 43 additions and 37 deletions
|
|
@ -9,11 +9,17 @@ let
|
||||||
|
|
||||||
createQuadletSource = name: containerDef:
|
createQuadletSource = name: containerDef:
|
||||||
let
|
let
|
||||||
dependencyBySuffix = type: name:
|
extractQuadletReference = type: value:
|
||||||
if (hasInfix ".${type}" name) then
|
let
|
||||||
let baseName = elemAt (splitString ".${type}" name) 0;
|
regex = "([a-zA-Z0-9_-]+\\." + type + ").*";
|
||||||
in if (hasAttr baseName cfg.internal.builtQuadlets) then
|
parts = builtins.match regex value;
|
||||||
[ (cfg.internal.builtQuadlets.${baseName}) ]
|
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
|
||||||
[ ]
|
[ ]
|
||||||
else
|
else
|
||||||
|
|
@ -32,28 +38,27 @@ let
|
||||||
++ (withResolverFor "volume" containerDef.volumes);
|
++ (withResolverFor "volume" containerDef.volumes);
|
||||||
|
|
||||||
checkQuadletReference = types: value:
|
checkQuadletReference = types: value:
|
||||||
let baseName = t: elemAt (splitString ".${t}" value) 0;
|
if builtins.isList value then
|
||||||
in if builtins.isList value then
|
|
||||||
builtins.concatLists (map (checkQuadletReference types) value)
|
builtins.concatLists (map (checkQuadletReference types) value)
|
||||||
else
|
else
|
||||||
let type = findFirst (t: hasInfix ".${t}" value) null types;
|
let type = findFirst (t: hasInfix ".${t}" value) null types;
|
||||||
in if (type != null) then
|
in if (type != null) then
|
||||||
let
|
let
|
||||||
quadletBaseName = baseName type;
|
quadletName = extractQuadletReference type value;
|
||||||
quadletsOfType =
|
quadletsOfType =
|
||||||
filterAttrs (n: v: v.quadletData.resourceType == type)
|
filterAttrs (n: v: v.quadletData.resourceType == type)
|
||||||
cfg.internal.builtQuadlets;
|
cfg.internal.builtQuadlets;
|
||||||
in if (hasAttr quadletBaseName quadletsOfType) then
|
in if (hasAttr quadletName quadletsOfType) then
|
||||||
[
|
[
|
||||||
(replaceStrings [ quadletBaseName ]
|
(replaceStrings [ quadletName ] [ "podman-${quadletName}" ]
|
||||||
[ "podman-${quadletBaseName}" ] value)
|
value)
|
||||||
]
|
]
|
||||||
else
|
else
|
||||||
[ value ]
|
[ value ]
|
||||||
else if ((hasInfix "/nix/store" value) == false
|
else if ((hasInfix "/nix/store" value) == false
|
||||||
&& hasAttr value cfg.internal.builtQuadlets) then
|
&& hasAttr value cfg.internal.builtQuadlets) then
|
||||||
lib.warn ''
|
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 '.${
|
Append the type '.${
|
||||||
cfg.internal.builtQuadlets.${value}.quadletData.resourceType
|
cfg.internal.builtQuadlets.${value}.quadletData.resourceType
|
||||||
}' to '${baseName value}' if this is intended.
|
}' to '${baseName value}' if this is intended.
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ let
|
||||||
unpackPhase = ''
|
unpackPhase = ''
|
||||||
mkdir -p $out/quadlets
|
mkdir -p $out/quadlets
|
||||||
${concatStringsSep "\n" (map (v:
|
${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)}
|
quadlet.dependencies)}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
|
@ -87,7 +87,8 @@ in {
|
||||||
(lib.hm.dag.entryAfter [ "reloadSystemd" ] activationCleanupScript);
|
(lib.hm.dag.entryAfter [ "reloadSystemd" ] activationCleanupScript);
|
||||||
|
|
||||||
services.podman.internal.builtQuadlets = listToAttrs (map (pkg: {
|
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;
|
value = pkg;
|
||||||
}) builtQuadlets);
|
}) builtQuadlets);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ ContainerName=my-container
|
||||||
Environment=
|
Environment=
|
||||||
Image=podman-my-img.image
|
Image=podman-my-img.image
|
||||||
Label=nix.home-manager.managed=true
|
Label=nix.home-manager.managed=true
|
||||||
Network=podman-my-net.network
|
Network=podman-my-app.network
|
||||||
Network=externalnet
|
Network=externalnet
|
||||||
Volume=podman-my-vol.volume:/data
|
Volume=podman-my-app.volume:/data
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=default.target
|
WantedBy=default.target
|
||||||
|
|
@ -29,7 +29,7 @@ Delegate=yes
|
||||||
Type=notify
|
Type=notify
|
||||||
NotifyAccess=all
|
NotifyAccess=all
|
||||||
SyslogIdentifier=%N
|
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]
|
[Unit]
|
||||||
Wants=podman-user-wait-network-online.service
|
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
|
Requires=podman-my-img-image.service
|
||||||
After=podman-my-img-image.service
|
After=podman-my-img-image.service
|
||||||
RequiresMountsFor=%t/containers
|
RequiresMountsFor=%t/containers
|
||||||
Requires=podman-my-net-network.service
|
Requires=podman-my-app-network.service
|
||||||
After=podman-my-net-network.service
|
After=podman-my-app-network.service
|
||||||
Requires=podman-my-vol-volume.service
|
Requires=podman-my-app-volume.service
|
||||||
After=podman-my-vol-volume.service
|
After=podman-my-app-volume.service
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
# Automatically generated by home-manager for podman network configuration
|
# Automatically generated by home-manager for podman network configuration
|
||||||
# DO NOT EDIT THIS FILE DIRECTLY
|
# DO NOT EDIT THIS FILE DIRECTLY
|
||||||
#
|
#
|
||||||
# my-net.network
|
# my-app.network
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=default.target
|
WantedBy=default.target
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|
@ -11,7 +11,7 @@ WantedBy=multi-user.target
|
||||||
[X-Network]
|
[X-Network]
|
||||||
Gateway=192.168.123.1
|
Gateway=192.168.123.1
|
||||||
Label=nix.home-manager.managed=true
|
Label=nix.home-manager.managed=true
|
||||||
NetworkName=my-net
|
NetworkName=my-app
|
||||||
Subnet=192.168.123.0/24
|
Subnet=192.168.123.0/24
|
||||||
|
|
||||||
[Service]
|
[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
|
ExecStartPre=/nix/store/00000000000000000000000000000000-await-podman-unshare
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
TimeoutStartSec=15
|
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
|
SyslogIdentifier=%N
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
|
|
||||||
|
|
@ -27,6 +27,6 @@ Type=oneshot
|
||||||
Wants=podman-user-wait-network-online.service
|
Wants=podman-user-wait-network-online.service
|
||||||
After=podman-user-wait-network-online.service
|
After=podman-user-wait-network-online.service
|
||||||
After=network.target
|
After=network.target
|
||||||
Description=Service for network my-net
|
Description=Service for network my-app
|
||||||
SourcePath=/nix/store/00000000000000000000000000000000-home-network-podman-my-net/quadlets/podman-my-net.network
|
SourcePath=/nix/store/00000000000000000000000000000000-home-network-podman-my-app/quadlets/podman-my-app.network
|
||||||
RequiresMountsFor=%t/containers
|
RequiresMountsFor=%t/containers
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
# Automatically generated by home-manager for podman volume configuration
|
# Automatically generated by home-manager for podman volume configuration
|
||||||
# DO NOT EDIT THIS FILE DIRECTLY
|
# DO NOT EDIT THIS FILE DIRECTLY
|
||||||
#
|
#
|
||||||
# my-vol.volume
|
# my-app.volume
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=default.target
|
WantedBy=default.target
|
||||||
WantedBy=multi-user.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
|
ExecStartPre=/nix/store/00000000000000000000000000000000-await-podman-unshare
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
TimeoutStartSec=15
|
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
|
SyslogIdentifier=%N
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
|
|
||||||
[Unit]
|
[Unit]
|
||||||
Wants=podman-user-wait-network-online.service
|
Wants=podman-user-wait-network-online.service
|
||||||
After=podman-user-wait-network-online.service
|
After=podman-user-wait-network-online.service
|
||||||
Description=Service for volume my-vol
|
Description=Service for volume my-app
|
||||||
SourcePath=/nix/store/00000000000000000000000000000000-home-volume-podman-my-vol/quadlets/podman-my-vol.volume
|
SourcePath=/nix/store/00000000000000000000000000000000-home-volume-podman-my-app/quadlets/podman-my-app.volume
|
||||||
RequiresMountsFor=%t/containers
|
RequiresMountsFor=%t/containers
|
||||||
|
|
||||||
[X-Volume]
|
[X-Volume]
|
||||||
|
|
@ -30,4 +30,4 @@ Device=tmpfs
|
||||||
Label=nix.home-manager.managed=true
|
Label=nix.home-manager.managed=true
|
||||||
Label=nix.home-manager.preserve=false
|
Label=nix.home-manager.preserve=false
|
||||||
Type=tmpfs
|
Type=tmpfs
|
||||||
VolumeName=my-vol
|
VolumeName=my-app
|
||||||
|
|
|
||||||
|
|
@ -18,17 +18,17 @@
|
||||||
containers = {
|
containers = {
|
||||||
"my-container" = {
|
"my-container" = {
|
||||||
image = "my-img.image";
|
image = "my-img.image";
|
||||||
network = [ "my-net.network" "externalnet" ];
|
network = [ "my-app.network" "externalnet" ];
|
||||||
volumes = [ "my-vol.volume:/data" ];
|
volumes = [ "my-app.volume:/data" ];
|
||||||
};
|
};
|
||||||
"my-container-bld" = { image = "my-bld.build"; };
|
"my-container-bld" = { image = "my-bld.build"; };
|
||||||
};
|
};
|
||||||
images."my-img" = { image = "docker.io/alpine:latest"; };
|
images."my-img" = { image = "docker.io/alpine:latest"; };
|
||||||
networks."my-net" = {
|
networks."my-app" = {
|
||||||
gateway = "192.168.123.1";
|
gateway = "192.168.123.1";
|
||||||
subnet = "192.168.123.0/24";
|
subnet = "192.168.123.0/24";
|
||||||
};
|
};
|
||||||
volumes."my-vol" = {
|
volumes."my-app" = {
|
||||||
device = "tmpfs";
|
device = "tmpfs";
|
||||||
preserve = false;
|
preserve = false;
|
||||||
type = "tmpfs";
|
type = "tmpfs";
|
||||||
|
|
@ -41,8 +41,8 @@
|
||||||
containerFile=$configPath/podman-my-container.service
|
containerFile=$configPath/podman-my-container.service
|
||||||
containerBldFile=$configPath/podman-my-container-bld.service
|
containerBldFile=$configPath/podman-my-container-bld.service
|
||||||
imageFile=$configPath/podman-my-img-image.service
|
imageFile=$configPath/podman-my-img-image.service
|
||||||
networkFile=$configPath/podman-my-net-network.service
|
networkFile=$configPath/podman-my-app-network.service
|
||||||
volumeFile=$configPath/podman-my-vol-volume.service
|
volumeFile=$configPath/podman-my-app-volume.service
|
||||||
assertFileExists $buildFile
|
assertFileExists $buildFile
|
||||||
assertFileExists $containerFile
|
assertFileExists $containerFile
|
||||||
assertFileExists $containerBldFile
|
assertFileExists $containerBldFile
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue