diff --git a/pkg/systemd/quadlet/quadlet.go b/pkg/systemd/quadlet/quadlet.go index b6681865b6..f11ab25c59 100644 --- a/pkg/systemd/quadlet/quadlet.go +++ b/pkg/systemd/quadlet/quadlet.go @@ -2,6 +2,7 @@ package quadlet import ( "fmt" + "path/filepath" "regexp" "strings" @@ -617,6 +618,18 @@ func ConvertKube(kube *parser.UnitFile) (*parser.UnitFile, error) { return nil, fmt.Errorf("no Yaml key specified") } + if !filepath.IsAbs(yamlPath) { + if len(kube.Path) > 0 { + yamlPath = filepath.Join(filepath.Dir(kube.Path), yamlPath) + } else { + var err error + yamlPath, err = filepath.Abs(yamlPath) + if err != nil { + return nil, err + } + } + } + // Only allow mixed or control-group, as nothing else works well killMode, ok := service.Lookup(ServiceGroup, "KillMode") if !ok || !(killMode == "mixed" || killMode == "control-group") { diff --git a/test/e2e/quadlet/absolute.path.kube b/test/e2e/quadlet/absolute.path.kube new file mode 100644 index 0000000000..88e8c7d8f2 --- /dev/null +++ b/test/e2e/quadlet/absolute.path.kube @@ -0,0 +1,17 @@ +## assert-podman-args "kube" +## assert-podman-args "play" +## assert-podman-final-args /opt/k8s/deployment.yml +## assert-podman-args "--replace" +## assert-podman-args "--service-container=true" +## assert-podman-stop-args "kube" +## assert-podman-stop-args "down" +## assert-podman-stop-final-args /opt/k8s/deployment.yml +## assert-key-is "Unit" "RequiresMountsFor" "%t/containers" +## assert-key-is "Service" "KillMode" "mixed" +## assert-key-is "Service" "Type" "notify" +## assert-key-is "Service" "NotifyAccess" "all" +## assert-key-is "Service" "Environment" "PODMAN_SYSTEMD_UNIT=%n" + + +[Kube] +Yaml=/opt/k8s/deployment.yml diff --git a/test/e2e/quadlet/basic.kube b/test/e2e/quadlet/basic.kube index 59b18a30d0..727ab84a56 100644 --- a/test/e2e/quadlet/basic.kube +++ b/test/e2e/quadlet/basic.kube @@ -1,11 +1,11 @@ ## assert-podman-args "kube" ## assert-podman-args "play" -## assert-podman-final-args deployment.yml +## assert-podman-final-args-regex /tmp/podman_test.*/quadlet/deployment.yml ## assert-podman-args "--replace" ## assert-podman-args "--service-container=true" ## assert-podman-stop-args "kube" ## assert-podman-stop-args "down" -## assert-podman-stop-final-args deployment.yml +## assert-podman-stop-final-args-regex /tmp/podman_test.*/quadlet/deployment.yml ## assert-key-is "Unit" "RequiresMountsFor" "%t/containers" ## assert-key-is "Service" "KillMode" "mixed" ## assert-key-is "Service" "Type" "notify" diff --git a/test/e2e/quadlet/syslog.identifier.kube b/test/e2e/quadlet/syslog.identifier.kube index 8b8e8d9400..a45a8c7220 100644 --- a/test/e2e/quadlet/syslog.identifier.kube +++ b/test/e2e/quadlet/syslog.identifier.kube @@ -1,16 +1,3 @@ -## assert-podman-args "kube" -## assert-podman-args "play" -## assert-podman-final-args deployment.yml -## assert-podman-args "--replace" -## assert-podman-args "--service-container=true" -## assert-podman-stop-args "kube" -## assert-podman-stop-args "down" -## assert-podman-stop-final-args deployment.yml -## assert-key-is "Unit" "RequiresMountsFor" "%t/containers" -## assert-key-is "Service" "KillMode" "mixed" -## assert-key-is "Service" "Type" "notify" -## assert-key-is "Service" "NotifyAccess" "all" -## assert-key-is "Service" "Environment" "PODMAN_SYSTEMD_UNIT=%n" ## assert-key-is "Service" "SyslogIdentifier" "mytest" [Service] diff --git a/test/e2e/quadlet_test.go b/test/e2e/quadlet_test.go index f9bea6b0e0..8c14d712b4 100644 --- a/test/e2e/quadlet_test.go +++ b/test/e2e/quadlet_test.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path/filepath" + "regexp" "strings" "github.com/containers/podman/v4/pkg/systemd/parser" @@ -64,6 +65,20 @@ func matchSublistAt(full []string, pos int, sublist []string) bool { return true } +func matchSublistRegexAt(full []string, pos int, sublist []string) bool { + if len(sublist) > len(full)-pos { + return false + } + + for i := range sublist { + matched, err := regexp.MatchString(sublist[i], full[pos+i]) + if err != nil || !matched { + return false + } + } + return true +} + func findSublist(full []string, sublist []string) int { if len(sublist) > len(full) { return -1 @@ -123,6 +138,14 @@ func (t *quadletTestcase) assertPodmanFinalArgs(args []string, unit *parser.Unit return matchSublistAt(podmanArgs, len(podmanArgs)-len(args), args) } +func (t *quadletTestcase) assertPodmanFinalArgsRegex(args []string, unit *parser.UnitFile, key string) bool { + podmanArgs, _ := unit.LookupLastArgs("Service", key) + if len(podmanArgs) < len(args) { + return false + } + return matchSublistRegexAt(podmanArgs, len(podmanArgs)-len(args), args) +} + func (t *quadletTestcase) assertStartPodmanArgs(args []string, unit *parser.UnitFile) bool { return t.assertPodmanArgs(args, unit, "ExecStart") } @@ -131,6 +154,10 @@ func (t *quadletTestcase) assertStartPodmanFinalArgs(args []string, unit *parser return t.assertPodmanFinalArgs(args, unit, "ExecStart") } +func (t *quadletTestcase) assertStartPodmanFinalArgsRegex(args []string, unit *parser.UnitFile) bool { + return t.assertPodmanFinalArgsRegex(args, unit, "ExecStart") +} + func (t *quadletTestcase) assertStopPodmanArgs(args []string, unit *parser.UnitFile) bool { return t.assertPodmanArgs(args, unit, "ExecStop") } @@ -139,6 +166,10 @@ func (t *quadletTestcase) assertStopPodmanFinalArgs(args []string, unit *parser. return t.assertPodmanFinalArgs(args, unit, "ExecStop") } +func (t *quadletTestcase) assertStopPodmanFinalArgsRegex(args []string, unit *parser.UnitFile) bool { + return t.assertPodmanFinalArgsRegex(args, unit, "ExecStop") +} + func (t *quadletTestcase) assertSymlink(args []string, unit *parser.UnitFile) bool { symlink := args[0] expectedTarget := args[1] @@ -180,12 +211,16 @@ func (t *quadletTestcase) doAssert(check []string, unit *parser.UnitFile, sessio ok = t.assertStartPodmanArgs(args, unit) case "assert-podman-final-args": ok = t.assertStartPodmanFinalArgs(args, unit) + case "assert-podman-final-args-regex": + ok = t.assertStartPodmanFinalArgsRegex(args, unit) case "assert-symlink": ok = t.assertSymlink(args, unit) case "assert-podman-stop-args": ok = t.assertStopPodmanArgs(args, unit) case "assert-podman-stop-final-args": ok = t.assertStopPodmanFinalArgs(args, unit) + case "assert-podman-stop-final-args-regex": + ok = t.assertStopPodmanFinalArgsRegex(args, unit) default: return fmt.Errorf("Unsupported assertion %s", op) } @@ -323,6 +358,7 @@ var _ = Describe("quadlet system generator", func() { Entry("Basic kube", "basic.kube"), Entry("Syslog Identifier", "syslog.identifier.kube"), + Entry("Absolute Path", "absolute.path.kube"), ) })