Merge pull request #3505 from baude/getlastevent

get last container event
This commit is contained in:
OpenShift Merge Robot
2019-07-08 16:23:22 +02:00
committed by GitHub
4 changed files with 71 additions and 1 deletions

View File

@ -1,7 +1,10 @@
package libpod
import (
"fmt"
"github.com/containers/libpod/libpod/events"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
@ -79,3 +82,55 @@ func (r *Runtime) Events(options events.ReadOptions) error {
}
return eventer.Read(options)
}
// GetEvents reads the event log and returns events based on input filters
func (r *Runtime) GetEvents(filters []string) ([]*events.Event, error) {
var (
logEvents []*events.Event
readErr error
)
eventChannel := make(chan *events.Event)
options := events.ReadOptions{
EventChannel: eventChannel,
Filters: filters,
FromStart: true,
Stream: false,
}
eventer, err := r.newEventer()
if err != nil {
return nil, err
}
go func() {
readErr = eventer.Read(options)
}()
if readErr != nil {
return nil, readErr
}
for e := range eventChannel {
logEvents = append(logEvents, e)
}
return logEvents, nil
}
// GetLastContainerEvent takes a container name or ID and an event status and returns
// the last occurrence of the container event
func (r *Runtime) GetLastContainerEvent(nameOrID string, containerEvent events.Status) (*events.Event, error) {
// check to make sure the event.Status is valid
if _, err := events.StringToStatus(containerEvent.String()); err != nil {
return nil, err
}
filters := []string{
fmt.Sprintf("container=%s", nameOrID),
fmt.Sprintf("event=%s", containerEvent),
"type=container",
}
containerEvents, err := r.GetEvents(filters)
if err != nil {
return nil, err
}
if len(containerEvents) < 1 {
return nil, errors.Wrapf(events.ErrEventNotFound, "%s not found", containerEvent.String())
}
// return the last element in the slice
return containerEvents[len(containerEvents)-1], nil
}

View File

@ -2,6 +2,8 @@ package events
import (
"time"
"github.com/pkg/errors"
)
// EventerType ...
@ -158,3 +160,12 @@ const (
// EventFilter for filtering events
type EventFilter func(*Event) bool
var (
// ErrEventTypeBlank indicates the event log found something done by podman
// but it isnt likely an event
ErrEventTypeBlank = errors.New("event type blank")
// ErrEventNotFound indicates that the event was not found in the event log
ErrEventNotFound = errors.New("unable to find event")
)

View File

@ -95,6 +95,8 @@ func StringToType(name string) (Type, error) {
return System, nil
case Volume.String():
return Volume, nil
case "":
return "", ErrEventTypeBlank
}
return "", errors.Errorf("unknown event type %q", name)
}

View File

@ -101,7 +101,9 @@ func (e EventJournalD) Read(options ReadOptions) error {
// We can't decode this event.
// Don't fail hard - that would make events unusable.
// Instead, log and continue.
logrus.Errorf("Unable to decode event: %v", err)
if errors.Cause(err) != ErrEventTypeBlank {
logrus.Errorf("Unable to decode event: %v", err)
}
continue
}
include := true