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

podman: use dependency quadlets directly in build for generator

This commit is contained in:
Nicholas Hassan 2025-02-12 22:10:25 +10:30 committed by Austin Horstman
parent eb5d59dac9
commit 4108ec3aa8
4 changed files with 80 additions and 64 deletions

View file

@ -9,54 +9,46 @@ let
createQuadletSource = name: containerDef:
let
formatServiceNameForType = type: name:
{
image = "podman-${name}-image.service";
build = "podman-${name}-build.service";
network = "podman-${name}-network.service";
volume = "podman-${name}-volume.service";
}."${type}";
# formatServiceNameForType = type: name:
# {
# image = "${name}-image.service";
# build = "${name}-build.service";
# network = "${name}-network.service";
# volume = "${name}-volume.service";
# }."${type}";
dependencyByHomeManagerQuadlet = type: name:
let
definitionsOfType =
filter (q: q.resourceType == type) cfg.internal.quadletDefinitions;
matchingName =
filter (q: q.serviceName == "podman-${name}") definitionsOfType;
in if ((length matchingName) == 1) then
[ (formatServiceNameForType type name) ]
dependencyBySuffix = type: name:
if (hasInfix ".${type}" name) then
let
baseName = elemAt (splitString ".${type}" name) 0;
in
if (hasAttr (builtins.trace (baseName) baseName) cfg.internal.builtQuadlets) then
[ (cfg.internal.builtQuadlets.${baseName}) ]
else
[ ]
else
[ ];
forEachValue = type: value:
let resolve = v: dependencyByHomeManagerQuadlet type v;
in if isList value then
concatLists (map resolve value)
else
resolve value;
withResolverFor = type: value:
{
"image" = forEachValue "image" value;
"build" = forEachValue "build" value;
"network" = forEachValue "network" value;
"volume" = let
a = if isList value then value else [ value ];
volumes = map (v: elemAt (splitString ":" v) 0) a;
in forEachValue "volume" volumes;
}.${type};
let
resolve = v: dependencyBySuffix type v;
in
if builtins.isList value
then builtins.concatLists (map resolve value) # Flatten list of lists
else resolve value;
dependencyServices = (withResolverFor "image" containerDef.image)
++ (withResolverFor "build" containerDef.image)
++ (withResolverFor "network" containerDef.network)
++ (withResolverFor "volume" containerDef.volumes);
dependencyServices = (withResolverFor "image" containerDef.image) ++
(withResolverFor "build" containerDef.image) ++
(withResolverFor "network" containerDef.network) ++
(withResolverFor "volume" containerDef.volumes);
resolvedImage = if (builtins.hasAttr containerDef.image cfg.images) then
cfg.images."${containerDef.image}".image
else if (builtins.hasAttr containerDef.image cfg.builds) then
"localhost/homemanager/${containerDef.image}"
else
containerDef.image;
getActualImage =
if (builtins.hasAttr containerDef.image cfg.images) then
cfg.images."${containerDef.image}".image
else if (builtins.hasAttr containerDef.image cfg.builds) then
"localhost/homemanager/${containerDef.image}"
else
containerDef.image;
quadlet = (podman-lib.deepMerge {
Container = {
@ -101,29 +93,34 @@ let
TimeoutStopSec = 30;
};
Unit = {
After = dependencyServices;
Requires = dependencyServices;
Description = (if (builtins.isString containerDef.description) then
containerDef.description
else
"Service for container ${name}");
};
} containerDef.extraConfig);
in ''
# Automatically generated by home-manager podman container configuration
# DO NOT EDIT THIS FILE DIRECTLY
#
# ${name}.container
${podman-lib.toQuadletIni quadlet}
'';
in
{
dependencies = dependencyServices;
text = ''
# Automatically generated by home-manager podman container configuration
# DO NOT EDIT THIS FILE DIRECTLY
#
# ${name}.container
${podman-lib.toQuadletIni quadlet}
'';
};
toQuadletInternal = name: containerDef: {
toQuadletInternal = name: containerDef: let
quadletSrc = createQuadletSource name containerDef;
in {
assertions = podman-lib.buildConfigAsserts name containerDef.extraConfig;
dependencies = quadletSrc.dependencies;
resourceType = "container";
serviceName =
"podman-${name}"; # quadlet service name: 'podman-<name>.service'
source =
podman-lib.removeBlankLines (createQuadletSource name containerDef);
podman-lib.removeBlankLines quadletSrc.text;
};
# Define the container user type as the user interface