From 24d31a5174dd763fd427c40e528cac310265e7cc Mon Sep 17 00:00:00 2001 From: Daniel J Walsh Date: Mon, 21 Oct 2024 15:36:32 -0400 Subject: [PATCH] Honor users requests in quadlet files Fixes: https://github.com/containers/podman/issues/24322 Signed-off-by: Daniel J Walsh --- pkg/systemd/quadlet/quadlet.go | 45 ++++++++++++++-------------------- test/e2e/quadlet/basic.build | 2 +- test/e2e/quadlet/ipv6.network | 8 ++++++ test/e2e/quadlet/network.build | 5 ++++ test/e2e/quadlet/uid.volume | 7 ++++++ test/e2e/quadlet/volume.build | 4 +++ 6 files changed, 44 insertions(+), 27 deletions(-) diff --git a/pkg/systemd/quadlet/quadlet.go b/pkg/systemd/quadlet/quadlet.go index 3e957200de..c6fbca7867 100644 --- a/pkg/systemd/quadlet/quadlet.go +++ b/pkg/systemd/quadlet/quadlet.go @@ -876,6 +876,21 @@ func ConvertContainer(container *parser.UnitFile, isUser bool, unitsInfoMap map[ return service, nil } +func defaultOneshotServiceGroup(service *parser.UnitFile, remainAfterExit bool) { + // The default syslog identifier is the exec basename (podman) which isn't very useful here + if _, ok := service.Lookup(ServiceGroup, "SyslogIdentifier"); !ok { + service.Set(ServiceGroup, "SyslogIdentifier", "%N") + } + if _, ok := service.Lookup(ServiceGroup, "Type"); !ok { + service.Set(ServiceGroup, "Type", "oneshot") + } + if remainAfterExit { + if _, ok := service.Lookup(ServiceGroup, "RemainAfterExit"); !ok { + service.Set(ServiceGroup, "RemainAfterExit", "yes") + } + } +} + // Convert a quadlet network file (unit file with a Network group) to a systemd // service file (unit file with Service group) based on the options in the // Network group. @@ -976,12 +991,7 @@ func ConvertNetwork(network *parser.UnitFile, name string, unitsInfoMap map[stri service.AddCmdline(ServiceGroup, "ExecStart", podman.Args) - service.Setv(ServiceGroup, - "Type", "oneshot", - "RemainAfterExit", "yes", - - // The default syslog identifier is the exec basename (podman) which isn't very useful here - "SyslogIdentifier", "%N") + defaultOneshotServiceGroup(service, true) // Store the name of the created resource unitInfo.ResourceName = networkName @@ -1124,12 +1134,7 @@ func ConvertVolume(volume *parser.UnitFile, name string, unitsInfoMap map[string service.AddCmdline(ServiceGroup, "ExecStart", podman.Args) - service.Setv(ServiceGroup, - "Type", "oneshot", - "RemainAfterExit", "yes", - - // The default syslog identifier is the exec basename (podman) which isn't very useful here - "SyslogIdentifier", "%N") + defaultOneshotServiceGroup(service, true) // Store the name of the created resource unitInfo.ResourceName = volumeName @@ -1342,12 +1347,7 @@ func ConvertImage(image *parser.UnitFile, unitsInfoMap map[string]*UnitInfo, isU service.AddCmdline(ServiceGroup, "ExecStart", podman.Args) - service.Setv(ServiceGroup, - "Type", "oneshot", - "RemainAfterExit", "yes", - - // The default syslog identifier is the exec basename (podman) which isn't very useful here - "SyslogIdentifier", "%N") + defaultOneshotServiceGroup(service, true) if name, ok := image.Lookup(ImageGroup, KeyImageTag); ok && len(name) > 0 { imageName = name @@ -1475,14 +1475,7 @@ func ConvertBuild(build *parser.UnitFile, unitsInfoMap map[string]*UnitInfo, isU service.AddCmdline(ServiceGroup, "ExecStart", podman.Args) - service.Setv(ServiceGroup, - "Type", "oneshot", - "RemainAfterExit", "yes", - - // The default syslog identifier is the exec basename (podman) - // which isn't very useful here - "SyslogIdentifier", "%N") - + defaultOneshotServiceGroup(service, false) return service, nil } diff --git a/test/e2e/quadlet/basic.build b/test/e2e/quadlet/basic.build index ebc7cbc791..40d961dc65 100644 --- a/test/e2e/quadlet/basic.build +++ b/test/e2e/quadlet/basic.build @@ -5,7 +5,7 @@ ## assert-key-is "Unit" "RequiresMountsFor" "%t/containers" ## assert-key-is-regex "Service" "WorkingDirectory" "/.*/podman-e2e-.*/subtest-.*/quadlet" ## assert-key-is "Service" "Type" "oneshot" -## assert-key-is "Service" "RemainAfterExit" "yes" +## !assert-key-is "Service" "RemainAfterExit" "yes" ## assert-key-is "Service" "SyslogIdentifier" "%N" [Build] diff --git a/test/e2e/quadlet/ipv6.network b/test/e2e/quadlet/ipv6.network index b1662fb95c..2540899436 100644 --- a/test/e2e/quadlet/ipv6.network +++ b/test/e2e/quadlet/ipv6.network @@ -1,5 +1,13 @@ ## assert-podman-final-args systemd-ipv6 ## assert-podman-args "--ipv6" +## assert-key-is Service Type exec +## assert-key-is Service RemainAfterExit yes +## assert-key-is Service SyslogIdentifier "Modify %N" [Network] IPv6=yes + +[Service] +Type=exec +RemainAfterExit=no +SyslogIdentifier="Modify %N" diff --git a/test/e2e/quadlet/network.build b/test/e2e/quadlet/network.build index bb7b8edff4..efc3eb68ff 100644 --- a/test/e2e/quadlet/network.build +++ b/test/e2e/quadlet/network.build @@ -1,8 +1,13 @@ ## assert-podman-final-args-regex /.*/podman-e2e-.*/subtest-.*/quadlet ## assert-podman-args "--tag" "localhost/imagename" ## assert-podman-args "--network" "host" +## assert-key-is "Service" "Type" "oneshot" +## assert-key-is "Service" "RemainAfterExit" "no" [Build] ImageTag=localhost/imagename SetWorkingDirectory=unit Network=host + +[Service] +RemainAfterExit=no diff --git a/test/e2e/quadlet/uid.volume b/test/e2e/quadlet/uid.volume index f48badde36..926b4367c2 100644 --- a/test/e2e/quadlet/uid.volume +++ b/test/e2e/quadlet/uid.volume @@ -1,6 +1,13 @@ ## assert-key-contains Service ExecStart " --opt o=uid=0,gid=11 " +## assert-key-is Service Type oneshot +## assert-key-is Service RemainAfterExit no +## assert-key-is Service SyslogIdentifier "Modify %N" [Volume] # Test usernames too User=root Group=11 + +[Service] +RemainAfterExit=no +SyslogIdentifier="Modify %N" diff --git a/test/e2e/quadlet/volume.build b/test/e2e/quadlet/volume.build index bcbbf37157..8a8777da1a 100644 --- a/test/e2e/quadlet/volume.build +++ b/test/e2e/quadlet/volume.build @@ -4,6 +4,7 @@ ## assert-podman-args -v named:/container/named ## assert-podman-args -v systemd-basic:/container/quadlet ## assert-podman-args -v %h/container:/container/volume4 +## assert-key-is "Service" "Type" "notify" [Build] ImageTag=localhost/imagename @@ -15,3 +16,6 @@ Volume=/container/empty Volume=named:/container/named Volume=basic.volume:/container/quadlet Volume=%h/container:/container/volume4 + +[Service] +Type=notify