mirror of
https://github.com/containers/podman.git
synced 2025-06-19 16:33:24 +08:00
Merge pull request #3505 from baude/getlastevent
get last container event
This commit is contained in:
@ -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
|
||||
}
|
||||
|
@ -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")
|
||||
)
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user