From cd3492304ea5cd9f0cc8f140fee5aeed677be7fc Mon Sep 17 00:00:00 2001 From: Leonardo Rossetti Date: Thu, 22 Dec 2022 15:47:13 -0300 Subject: [PATCH] adding -dryrun flag Signed-off-by: Leonardo Rossetti --- cmd/quadlet/main.go | 48 +++++++++++++++++++++------- test/e2e/quadlet_test.go | 67 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 11 deletions(-) diff --git a/cmd/quadlet/main.go b/cmd/quadlet/main.go index fd5a17deb7..d2be163ff0 100644 --- a/cmd/quadlet/main.go +++ b/cmd/quadlet/main.go @@ -26,6 +26,7 @@ var ( verboseFlag bool // True if -v passed noKmsgFlag bool isUser bool // True if run as quadlet-user-generator executable + dryRun bool // True if -dryrun is used ) var ( @@ -291,27 +292,32 @@ func warnIfAmbigiousName(container *parser.UnitFile) { } func main() { + exitCode := 0 prgname := path.Base(os.Args[0]) isUser = strings.Contains(prgname, "user") flag.Parse() - if verboseFlag { + if verboseFlag || dryRun { enableDebug() } - if noKmsgFlag { + if noKmsgFlag || dryRun { noKmsg = true } - if flag.NArg() < 1 { + if !dryRun && flag.NArg() < 1 { Logf("Missing output directory argument") os.Exit(1) } - outputPath := flag.Arg(0) + var outputPath string - Debugf("Starting quadlet-generator, output to: %s", outputPath) + if !dryRun { + outputPath = flag.Arg(0) + + Debugf("Starting quadlet-generator, output to: %s", outputPath) + } sourcePaths := getUnitDirs(isUser) @@ -320,12 +326,19 @@ func main() { loadUnitsFromDir(d, units) } - err := os.MkdirAll(outputPath, os.ModePerm) - if err != nil { - Logf("Can't create dir %s: %s", outputPath, err) + if len(units) == 0 { + Debugf("No files to parse from %s", sourcePaths) os.Exit(1) } + if !dryRun { + err := os.MkdirAll(outputPath, os.ModePerm) + if err != nil { + Logf("Can't create dir %s: %s", outputPath, err) + os.Exit(1) + } + } + for name, unit := range units { var service *parser.UnitFile var err error @@ -350,16 +363,29 @@ func main() { } else { service.Path = path.Join(outputPath, service.Filename) - if err := generateServiceFile(service); err != nil { - Logf("Error writing '%s'o: %s", service.Path, err) + if dryRun { + data, err := service.ToString() + if err != nil { + Debugf("Error parsing %s\n---\n", service.Path) + exitCode = 1 + } else { + fmt.Printf("---%s---\n%s\n", service.Path, data) + } + } else { + if err := generateServiceFile(service); err != nil { + Logf("Error writing '%s'o: %s", service.Path, err) + } + enableServiceFile(outputPath, service) } - enableServiceFile(outputPath, service) } } + + os.Exit(exitCode) } func init() { flag.BoolVar(&verboseFlag, "v", false, "Print debug information") flag.BoolVar(&noKmsgFlag, "no-kmsg-log", false, "Don't log to kmsg") flag.BoolVar(&isUser, "user", false, "Run as systemd user") + flag.BoolVar(&dryRun, "dryrun", false, "run in dryrun mode printing debug information") } diff --git a/test/e2e/quadlet_test.go b/test/e2e/quadlet_test.go index 0129f2572f..3ad9e8cf45 100644 --- a/test/e2e/quadlet_test.go +++ b/test/e2e/quadlet_test.go @@ -328,6 +328,73 @@ var _ = Describe("quadlet system generator", func() { }) + Describe("Running quadlet dryrun tests", func() { + It("Should exit with an error because of no files are found to parse", func() { + fileName := "basic.kube" + testcase := loadQuadletTestcase(filepath.Join("quadlet", fileName)) + + // Write the tested file to the quadlet dir + err = os.WriteFile(filepath.Join(quadletDir, fileName), testcase.data, 0644) + Expect(err).ToNot(HaveOccurred()) + + session := podmanTest.Quadlet([]string{"-dryrun"}, "/something") + session.WaitWithDefaultTimeout() + Expect(session).Should(Exit(1)) + + current := session.ErrorToStringArray() + expected := "No files to parse from [/something]" + + Expect(strings.Contains(current[0], expected)).To(BeTrue()) + }) + + It("Should parse a kube file and print it to stdout", func() { + fileName := "basic.kube" + testcase := loadQuadletTestcase(filepath.Join("quadlet", fileName)) + + // Write the tested file to the quadlet dir + err = os.WriteFile(filepath.Join(quadletDir, fileName), testcase.data, 0644) + Expect(err).ToNot(HaveOccurred()) + + session := podmanTest.Quadlet([]string{"-dryrun"}, quadletDir) + session.WaitWithDefaultTimeout() + Expect(session).Should(Exit(0)) + + current := session.OutputToStringArray() + expected := []string{ + "---basic.service---", + "## assert-podman-args \"kube\"", + "## assert-podman-args \"play\"", + "## 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-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\"", + "## assert-key-is \"Service\" \"NotifyAccess\" \"all\"", + "## assert-key-is \"Service\" \"Environment\" \"PODMAN_SYSTEMD_UNIT=%n\"", + "## assert-key-is \"Service\" \"SyslogIdentifier\" \"%N\"", + "[X-Kube]", + "Yaml=deployment.yml", + "[Unit]", + fmt.Sprintf("SourcePath=%s/basic.kube", quadletDir), + "RequiresMountsFor=%t/containers", + "[Service]", + "KillMode=mixed", + "Environment=PODMAN_SYSTEMD_UNIT=%n", + "Type=notify", + "NotifyAccess=all", + "SyslogIdentifier=%N", + fmt.Sprintf("ExecStart=/usr/local/bin/podman kube play --replace --service-container=true %s/deployment.yml", quadletDir), + fmt.Sprintf("ExecStop=/usr/local/bin/podman kube down %s/deployment.yml", quadletDir), + } + + Expect(expected).To(Equal(current)) + }) + }) + DescribeTable("Running quadlet test case", func(fileName string) { testcase := loadQuadletTestcase(filepath.Join("quadlet", fileName))