From 3b5805d521b8fa8a948efe74133ad1148a4c180d Mon Sep 17 00:00:00 2001
From: Matthew Heon <matthew.heon@pm.me>
Date: Tue, 12 Mar 2019 16:12:09 -0400
Subject: Add event on container death

Signed-off-by: Matthew Heon <matthew.heon@pm.me>
---
 libpod/container_api.go      |  2 --
 libpod/container_internal.go |  5 +++++
 libpod/events.go             | 13 +++++++++++++
 libpod/events/events.go      |  2 ++
 libpod/oci.go                |  2 +-
 5 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/libpod/container_api.go b/libpod/container_api.go
index 3698a15ec..8db12c14a 100644
--- a/libpod/container_api.go
+++ b/libpod/container_api.go
@@ -89,7 +89,6 @@ func (c *Container) Start(ctx context.Context, recursive bool) (err error) {
 	}
 
 	// Start the container
-	defer c.newContainerEvent(events.Start)
 	return c.start()
 }
 
@@ -127,7 +126,6 @@ func (c *Container) StartAndAttach(ctx context.Context, streams *AttachStreams,
 		}
 		close(attachChan)
 	}()
-	c.newContainerEvent(events.Start)
 	c.newContainerEvent(events.Attach)
 	return attachChan, nil
 }
diff --git a/libpod/container_internal.go b/libpod/container_internal.go
index 330745314..bea7acd69 100644
--- a/libpod/container_internal.go
+++ b/libpod/container_internal.go
@@ -211,6 +211,9 @@ func (c *Container) handleExitFile(exitFile string, fi os.FileInfo) error {
 
 	c.state.Exited = true
 
+	// Write an event for the container's death
+	c.newContainerExitedEvent(c.state.ExitCode)
+
 	return nil
 }
 
@@ -948,6 +951,8 @@ func (c *Container) start() error {
 
 	c.state.State = ContainerStateRunning
 
+	defer c.newContainerEvent(events.Start)
+
 	return c.save()
 }
 
diff --git a/libpod/events.go b/libpod/events.go
index 9806c117b..879aeb6c5 100644
--- a/libpod/events.go
+++ b/libpod/events.go
@@ -19,6 +19,19 @@ func (c *Container) newContainerEvent(status events.Status) {
 	}
 }
 
+// newContainerExitedEvent creates a new event for a container's death
+func (c *Container) newContainerExitedEvent(exitCode int32) {
+	e := events.NewEvent(events.Exited)
+	e.ID = c.ID()
+	e.Name = c.Name()
+	e.Image = c.config.RootfsImageName
+	e.Type = events.Container
+	e.ContainerExitCode = int(exitCode)
+	if err := e.Write(c.runtime.config.EventsLogFilePath); err != nil {
+		logrus.Errorf("unable to write event to %s", c.runtime.config.EventsLogFilePath)
+	}
+}
+
 // newPodEvent creates a new event for a libpod pod
 func (p *Pod) newPodEvent(status events.Status) {
 	e := events.NewEvent(status)
diff --git a/libpod/events/events.go b/libpod/events/events.go
index 186790500..48bbbb00e 100644
--- a/libpod/events/events.go
+++ b/libpod/events/events.go
@@ -60,6 +60,8 @@ const (
 	Create Status = "create"
 	// Exec ...
 	Exec Status = "exec"
+	// Exited indicates that a container's process died
+	Exited Status = "died"
 	// Export ...
 	Export Status = "export"
 	// History ...
diff --git a/libpod/oci.go b/libpod/oci.go
index c3b5f9af2..30360d289 100644
--- a/libpod/oci.go
+++ b/libpod/oci.go
@@ -477,7 +477,7 @@ func (r *OCIRuntime) updateContainerStatus(ctr *Container, useRunc bool) error {
 	// If not using runc, we don't need to do most of this.
 	if !useRunc {
 		// If the container's not running, nothing to do.
-		if ctr.state.State != ContainerStateRunning {
+		if ctr.state.State != ContainerStateRunning && ctr.state.State != ContainerStatePaused {
 			return nil
 		}
 
-- 
cgit v1.2.3-54-g00ecf