From f2dff41dbc95812b4fa9f36279e6daf6999e4452 Mon Sep 17 00:00:00 2001
From: Daniel J Walsh <dwalsh@redhat.com>
Date: Fri, 18 Jun 2021 17:33:31 -0400
Subject: Support log_tag defaults from containers.conf

Fixes: https://github.com/containers/podman/issues/10204

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
---
 pkg/specgen/generate/container.go        | 13 +++++++++++++
 test/e2e/config/containers-journald.conf |  4 ++++
 test/e2e/containers_conf_test.go         | 30 ++++++++++++++++++++++++------
 3 files changed, 41 insertions(+), 6 deletions(-)
 create mode 100644 test/e2e/config/containers-journald.conf

diff --git a/pkg/specgen/generate/container.go b/pkg/specgen/generate/container.go
index d00e51e82..1f6d00eb7 100644
--- a/pkg/specgen/generate/container.go
+++ b/pkg/specgen/generate/container.go
@@ -7,12 +7,14 @@ import (
 
 	"github.com/containers/common/libimage"
 	"github.com/containers/podman/v3/libpod"
+	"github.com/containers/podman/v3/libpod/define"
 	ann "github.com/containers/podman/v3/pkg/annotations"
 	envLib "github.com/containers/podman/v3/pkg/env"
 	"github.com/containers/podman/v3/pkg/signal"
 	"github.com/containers/podman/v3/pkg/specgen"
 	spec "github.com/opencontainers/runtime-spec/specs-go"
 	"github.com/pkg/errors"
+	"github.com/sirupsen/logrus"
 	"golang.org/x/sys/unix"
 )
 
@@ -203,6 +205,17 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
 	if len(s.LogConfiguration.Driver) < 1 {
 		s.LogConfiguration.Driver = rtc.Containers.LogDriver
 	}
+	if len(rtc.Containers.LogTag) > 0 {
+		if s.LogConfiguration.Driver != define.JSONLogging {
+			if s.LogConfiguration.Options == nil {
+				s.LogConfiguration.Options = make(map[string]string)
+			}
+
+			s.LogConfiguration.Options["tag"] = rtc.Containers.LogTag
+		} else {
+			logrus.Warnf("log_tag %q is not allowed with %q log_driver", rtc.Containers.LogTag, define.JSONLogging)
+		}
+	}
 
 	warnings, err := verifyContainerResources(s)
 	if err != nil {
diff --git a/test/e2e/config/containers-journald.conf b/test/e2e/config/containers-journald.conf
new file mode 100644
index 000000000..463f9a9fa
--- /dev/null
+++ b/test/e2e/config/containers-journald.conf
@@ -0,0 +1,4 @@
+[containers]
+
+log_driver="journald"
+log_tag="{{.ImageName}}"
diff --git a/test/e2e/containers_conf_test.go b/test/e2e/containers_conf_test.go
index a354de3b2..054454798 100644
--- a/test/e2e/containers_conf_test.go
+++ b/test/e2e/containers_conf_test.go
@@ -167,16 +167,34 @@ var _ = Describe("Podman run", func() {
 		verifyNSHandling("/proc/self/ns/cgroup", "--cgroupns")
 	})
 
+	It("using journald for container with container log_tag", func() {
+		SkipIfInContainer("journalctl inside a container doesn't work correctly")
+		os.Setenv("CONTAINERS_CONF", "config/containers-journald.conf")
+		if IsRemote() {
+			podmanTest.RestartRemoteService()
+		}
+		logc := podmanTest.Podman([]string{"run", "-d", ALPINE, "sh", "-c", "echo podman; sleep 0.1; echo podman; sleep 0.1; echo podman"})
+		logc.WaitWithDefaultTimeout()
+		Expect(logc.ExitCode()).To(Equal(0))
+		cid := logc.OutputToString()
+
+		wait := podmanTest.Podman([]string{"wait", cid})
+		wait.WaitWithDefaultTimeout()
+		Expect(wait.ExitCode()).To(Equal(0))
+
+		cmd := exec.Command("journalctl", "--no-pager", "-o", "json", "--output-fields=CONTAINER_TAG", fmt.Sprintf("CONTAINER_ID_FULL=%s", cid))
+		out, err := cmd.CombinedOutput()
+		Expect(err).To(BeNil())
+		Expect(string(out)).To(ContainSubstring("alpine"))
+	})
+
 	It("podman containers.conf additionalvolumes", func() {
 		conffile := filepath.Join(podmanTest.TempDir, "container.conf")
 		tempdir, err = CreateTempDirInTempDir()
-		if err != nil {
-			os.Exit(1)
-		}
+		Expect(err).To(BeNil())
+
 		err := ioutil.WriteFile(conffile, []byte(fmt.Sprintf("[containers]\nvolumes=[\"%s:%s:Z\",]\n", tempdir, tempdir)), 0755)
-		if err != nil {
-			os.Exit(1)
-		}
+		Expect(err).To(BeNil())
 
 		os.Setenv("CONTAINERS_CONF", conffile)
 		if IsRemote() {
-- 
cgit v1.2.3-54-g00ecf