From 03c7f47aa8356cf815822814436cbaf034f74580 Mon Sep 17 00:00:00 2001
From: Valentin Rothberg <vrothberg@redhat.com>
Date: Tue, 3 Jan 2023 16:36:40 +0100
Subject: [PATCH] kube play: fix the error logic with --quiet

Fix a bug where kube play would print format errors such as
`Error: %!s(<nil>)`.

Signed-off-by: Valentin Rothberg <vrothberg@redhat.com>
---
 cmd/podman/kube/play.go    | 24 +++++++++++++++---------
 test/e2e/play_kube_test.go | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 9 deletions(-)

diff --git a/cmd/podman/kube/play.go b/cmd/podman/kube/play.go
index 01451bad4f..d4ee11f737 100644
--- a/cmd/podman/kube/play.go
+++ b/cmd/podman/kube/play.go
@@ -344,10 +344,12 @@ func teardown(body io.Reader, options entities.PlayKubeDownOptions, quiet bool)
 		fmt.Println("Pods stopped:")
 	}
 	for _, stopped := range reports.StopReport {
-		if len(stopped.Errs) == 0 && !quiet {
-			fmt.Println(stopped.Id)
-		} else {
+		switch {
+		case len(stopped.Errs) > 0:
 			podStopErrors = append(podStopErrors, stopped.Errs...)
+		case quiet:
+		default:
+			fmt.Println(stopped.Id)
 		}
 	}
 	// Dump any stop errors
@@ -361,10 +363,12 @@ func teardown(body io.Reader, options entities.PlayKubeDownOptions, quiet bool)
 		fmt.Println("Pods removed:")
 	}
 	for _, removed := range reports.RmReport {
-		if removed.Err == nil && !quiet {
-			fmt.Println(removed.Id)
-		} else {
+		switch {
+		case removed.Err != nil:
 			podRmErrors = append(podRmErrors, removed.Err)
+		case quiet:
+		default:
+			fmt.Println(removed.Id)
 		}
 	}
 
@@ -378,10 +382,12 @@ func teardown(body io.Reader, options entities.PlayKubeDownOptions, quiet bool)
 		fmt.Println("Volumes removed:")
 	}
 	for _, removed := range reports.VolumeRmReport {
-		if removed.Err == nil && !quiet {
-			fmt.Println(removed.Id)
-		} else {
+		switch {
+		case removed.Err != nil:
 			volRmErrors = append(volRmErrors, removed.Err)
+		case quiet:
+		default:
+			fmt.Println(removed.Id)
 		}
 	}
 
diff --git a/test/e2e/play_kube_test.go b/test/e2e/play_kube_test.go
index ff884831a9..c37a87c5b5 100644
--- a/test/e2e/play_kube_test.go
+++ b/test/e2e/play_kube_test.go
@@ -4519,6 +4519,38 @@ cgroups="disabled"`), 0644)
 		Expect(kube).Should(Exit(0))
 	})
 
+	It("podman kube --quiet with error", func() {
+		yaml := `
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: frontend
+spec:
+  replicas: 2
+  template:
+    metadata:
+      labels:
+        app: guestbook
+        tier: frontend
+    spec:
+      containers:
+      - name: php-redis
+        image: quay.io/libpod/alpine_nginx:latest
+        ports:
+        - containerPort: 1234
+`
+
+		err = writeYaml(yaml, kubeYaml)
+		Expect(err).ToNot(HaveOccurred())
+
+		kube := podmanTest.Podman([]string{"kube", "play", "--quiet", kubeYaml})
+		kube.WaitWithDefaultTimeout()
+		Expect(kube).To(ExitWithError())
+		// The ugly format-error exited once in Podman. The test makes
+		// sure it's not coming back.
+		Expect(kube.ErrorToString()).To(Not(ContainSubstring("Error: %!s(<nil>)")))
+	})
+
 	It("podman kube play invalid yaml should clean up pod that was created before failure", func() {
 		podTemplate := `---
 apiVersion: v1