mirror of
https://github.com/containers/podman.git
synced 2025-06-20 00:51:16 +08:00
Merge pull request #3505 from baude/getlastevent
get last container event
This commit is contained in:
@ -1,7 +1,10 @@
|
|||||||
package libpod
|
package libpod
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/containers/libpod/libpod/events"
|
"github.com/containers/libpod/libpod/events"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -79,3 +82,55 @@ func (r *Runtime) Events(options events.ReadOptions) error {
|
|||||||
}
|
}
|
||||||
return eventer.Read(options)
|
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 (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// EventerType ...
|
// EventerType ...
|
||||||
@ -158,3 +160,12 @@ const (
|
|||||||
|
|
||||||
// EventFilter for filtering events
|
// EventFilter for filtering events
|
||||||
type EventFilter func(*Event) bool
|
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
|
return System, nil
|
||||||
case Volume.String():
|
case Volume.String():
|
||||||
return Volume, nil
|
return Volume, nil
|
||||||
|
case "":
|
||||||
|
return "", ErrEventTypeBlank
|
||||||
}
|
}
|
||||||
return "", errors.Errorf("unknown event type %q", name)
|
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.
|
// We can't decode this event.
|
||||||
// Don't fail hard - that would make events unusable.
|
// Don't fail hard - that would make events unusable.
|
||||||
// Instead, log and continue.
|
// 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
|
continue
|
||||||
}
|
}
|
||||||
include := true
|
include := true
|
||||||
|
Reference in New Issue
Block a user