diff --git a/libpod/events/config.go b/libpod/events/config.go index c67f0daae2..deb8f9e4f1 100644 --- a/libpod/events/config.go +++ b/libpod/events/config.go @@ -41,6 +41,8 @@ type Event struct { Type Type // Health status of the current container HealthStatus string `json:"health_status,omitempty"` + // Error code for certain events involving errors. + Error error `json:"error,omitempty"` Details } @@ -170,6 +172,8 @@ const ( Prune Status = "prune" // Pull ... Pull Status = "pull" + // PullError is an error pulling an image + PullError Status = "pull-error" // Push ... Push Status = "push" // Refresh indicates that the system refreshed the state after a diff --git a/libpod/events/events.go b/libpod/events/events.go index 18f5314691..11a1785b3d 100644 --- a/libpod/events/events.go +++ b/libpod/events/events.go @@ -194,6 +194,8 @@ func StringToStatus(name string) (Status, error) { return Prune, nil case Pull.String(): return Pull, nil + case PullError.String(): + return PullError, nil case Push.String(): return Push, nil case Refresh.String(): diff --git a/libpod/events/journal_linux.go b/libpod/events/journal_linux.go index 273c5307dc..e31c63c6b7 100644 --- a/libpod/events/journal_linux.go +++ b/libpod/events/journal_linux.go @@ -43,6 +43,9 @@ func (e EventJournalD) Write(ee Event) error { case Image: m["PODMAN_NAME"] = ee.Name m["PODMAN_ID"] = ee.ID + if ee.Error != nil { + m["ERROR"] = ee.Error.Error() + } case Container, Pod: m["PODMAN_IMAGE"] = ee.Image m["PODMAN_NAME"] = ee.Name @@ -228,6 +231,9 @@ func newEventFromJournalEntry(entry *sdjournal.JournalEntry) (*Event, error) { newEvent.Network = entry.Fields["PODMAN_NETWORK_NAME"] case Image: newEvent.ID = entry.Fields["PODMAN_ID"] + if _, ok := entry.Fields["ERROR"]; ok { + newEvent.Error = errors.New(entry.Fields["ERROR"]) + } } return &newEvent, nil } diff --git a/libpod/runtime.go b/libpod/runtime.go index 50b2c75eb9..d430f3a421 100644 --- a/libpod/runtime.go +++ b/libpod/runtime.go @@ -696,15 +696,16 @@ func (r *Runtime) GetConfig() (*config.Config, error) { // libimageEventsMap translates a libimage event type to a libpod event status. var libimageEventsMap = map[libimage.EventType]events.Status{ - libimage.EventTypeImagePull: events.Pull, - libimage.EventTypeImagePush: events.Push, - libimage.EventTypeImageRemove: events.Remove, - libimage.EventTypeImageLoad: events.LoadFromArchive, - libimage.EventTypeImageSave: events.Save, - libimage.EventTypeImageTag: events.Tag, - libimage.EventTypeImageUntag: events.Untag, - libimage.EventTypeImageMount: events.Mount, - libimage.EventTypeImageUnmount: events.Unmount, + libimage.EventTypeImagePull: events.Pull, + libimage.EventTypeImagePullError: events.PullError, + libimage.EventTypeImagePush: events.Push, + libimage.EventTypeImageRemove: events.Remove, + libimage.EventTypeImageLoad: events.LoadFromArchive, + libimage.EventTypeImageSave: events.Save, + libimage.EventTypeImageTag: events.Tag, + libimage.EventTypeImageUntag: events.Untag, + libimage.EventTypeImageMount: events.Mount, + libimage.EventTypeImageUnmount: events.Unmount, } // libimageEvents spawns a goroutine which will listen for events on