From 2b6c477884371dbcfd420971e5eebf625fddd0fb Mon Sep 17 00:00:00 2001 From: Volodymyr Pankin Date: Sun, 8 Jun 2025 21:53:29 +0200 Subject: [PATCH] quadlet: handle generate environment params that inherit from host Fixes: #26247 Signed-off-by: Volodymyr Pankin --- pkg/systemd/parser/unitfile.go | 8 ++++---- pkg/systemd/quadlet/podmancmdline.go | 8 ++++++-- pkg/systemd/quadlet/quadlet.go | 4 ++-- test/e2e/quadlet/env.container | 3 ++- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/pkg/systemd/parser/unitfile.go b/pkg/systemd/parser/unitfile.go index e11a030c30..ac04f8effe 100644 --- a/pkg/systemd/parser/unitfile.go +++ b/pkg/systemd/parser/unitfile.go @@ -839,9 +839,9 @@ func (f *UnitFile) LookupLastArgs(groupName string, key string) ([]string, bool) } // Look up 'Environment' style key-value keys -func (f *UnitFile) LookupAllKeyVal(groupName string, key string) (map[string]string, error) { +func (f *UnitFile) LookupAllKeyVal(groupName string, key string) (map[string]*string, error) { var warnings error - res := make(map[string]string) + res := make(map[string]*string) allKeyvals := f.LookupAll(groupName, key) for _, keyvals := range allKeyvals { assigns, err := splitString(keyvals, WhitespaceSeparators, SplitRelax|SplitUnquote|SplitCUnescape) @@ -852,9 +852,9 @@ func (f *UnitFile) LookupAllKeyVal(groupName string, key string) (map[string]str for _, assign := range assigns { key, value, found := strings.Cut(assign, "=") if found { - res[key] = value + res[key] = &value } else { - warnings = errors.Join(warnings, fmt.Errorf("separator was not found for %s", assign)) + res[key] = nil } } } diff --git a/pkg/systemd/quadlet/podmancmdline.go b/pkg/systemd/quadlet/podmancmdline.go index 973fee5c82..49c174ac47 100644 --- a/pkg/systemd/quadlet/podmancmdline.go +++ b/pkg/systemd/quadlet/podmancmdline.go @@ -33,7 +33,7 @@ func (c *PodmanCmdline) addf(format string, a ...interface{}) { c.add(fmt.Sprintf(format, a...)) } -func (c *PodmanCmdline) addKeys(arg string, keys map[string]string) { +func (c *PodmanCmdline) addKeys(arg string, keys map[string]*string) { ks := make([]string, 0, len(keys)) for k := range keys { ks = append(ks, k) @@ -41,7 +41,11 @@ func (c *PodmanCmdline) addKeys(arg string, keys map[string]string) { sort.Strings(ks) for _, k := range ks { - c.add(arg, fmt.Sprintf("%s=%s", k, keys[k])) + if keys[k] != nil { + c.add(arg, fmt.Sprintf("%s=%s", k, *keys[k])) + } else { + c.add(arg, k) + } } } diff --git a/pkg/systemd/quadlet/quadlet.go b/pkg/systemd/quadlet/quadlet.go index 4fd27deab9..1662dc3fa7 100644 --- a/pkg/systemd/quadlet/quadlet.go +++ b/pkg/systemd/quadlet/quadlet.go @@ -810,8 +810,8 @@ func ConvertContainer(container *parser.UnitFile, isUser bool, unitsInfoMap map[ if ok && len(update) > 0 { podman.addKeys( "--label", - map[string]string{ - autoUpdateLabel: update, + map[string]*string{ + autoUpdateLabel: &update, }, ) } diff --git a/test/e2e/quadlet/env.container b/test/e2e/quadlet/env.container index 234cfca605..5227f61af9 100644 --- a/test/e2e/quadlet/env.container +++ b/test/e2e/quadlet/env.container @@ -4,9 +4,10 @@ ## assert-podman-args --env "FOO3=foo3" ## assert-podman-args --env "REPLACE=replaced" ## assert-podman-args --env "FOO4=foo\\nfoo" +## assert-podman-args --env "FOO5" [Container] Image=localhost/imagename Environment=FOO1=foo1 "FOO2=foo2 " \ FOO3=foo3 REPLACE=replace -Environment=REPLACE=replaced 'FOO4=foo\nfoo' +Environment=REPLACE=replaced 'FOO4=foo\nfoo' FOO5