Merge pull request #3019 from mheon/system_events

Add System event type and renumber, refresh events
This commit is contained in:
OpenShift Merge Robot
2019-04-26 11:16:27 -07:00
committed by GitHub
8 changed files with 66 additions and 17 deletions

View File

@ -50,6 +50,16 @@ func (p *Pod) newPodEvent(status events.Status) {
} }
} }
// newSystemEvent creates a new event for libpod as a whole.
func (r *Runtime) newSystemEvent(status events.Status) {
e := events.NewEvent(status)
e.Type = events.System
if err := r.eventer.Write(e); err != nil {
logrus.Errorf("unable to write system event: %q", err)
}
}
// newVolumeEvent creates a new event for a libpod volume // newVolumeEvent creates a new event for a libpod volume
func (v *Volume) newVolumeEvent(status events.Status) { func (v *Volume) newVolumeEvent(status events.Status) {
e := events.NewEvent(status) e := events.NewEvent(status)

View File

@ -84,6 +84,9 @@ const (
Image Type = "image" Image Type = "image"
// Pod - event is related to pods // Pod - event is related to pods
Pod Type = "pod" Pod Type = "pod"
// System - event is related to Podman whole and not to any specific
// container/pod/image/volume
System Type = "system"
// Volume - event is related to volumes // Volume - event is related to volumes
Volume Type = "volume" Volume Type = "volume"
@ -123,8 +126,14 @@ const (
Pull Status = "pull" Pull Status = "pull"
// Push ... // Push ...
Push Status = "push" Push Status = "push"
// Refresh indicates that the system refreshed the state after a
// reboot.
Refresh Status = "refresh"
// Remove ... // Remove ...
Remove Status = "remove" Remove Status = "remove"
// Renumber indicates that lock numbers were reallocated at user
// request.
Renumber Status = "renumber"
// Restore ... // Restore ...
Restore Status = "restore" Restore Status = "restore"
// Save ... // Save ...

View File

@ -49,6 +49,8 @@ func (e *Event) ToHumanReadable() string {
humanFormat = fmt.Sprintf("%s %s %s %s (image=%s, name=%s)", e.Time, e.Type, e.Status, e.ID, e.Image, e.Name) humanFormat = fmt.Sprintf("%s %s %s %s (image=%s, name=%s)", e.Time, e.Type, e.Status, e.ID, e.Image, e.Name)
case Image: case Image:
humanFormat = fmt.Sprintf("%s %s %s %s %s", e.Time, e.Type, e.Status, e.ID, e.Name) humanFormat = fmt.Sprintf("%s %s %s %s %s", e.Time, e.Type, e.Status, e.ID, e.Name)
case System:
humanFormat = fmt.Sprintf("%s %s %s", e.Time, e.Type, e.Status)
case Volume: case Volume:
humanFormat = fmt.Sprintf("%s %s %s %s", e.Time, e.Type, e.Status, e.Name) humanFormat = fmt.Sprintf("%s %s %s %s", e.Time, e.Type, e.Status, e.Name)
} }
@ -85,10 +87,12 @@ func StringToType(name string) (Type, error) {
return Image, nil return Image, nil
case Pod.String(): case Pod.String():
return Pod, nil return Pod, nil
case System.String():
return System, nil
case Volume.String(): case Volume.String():
return Volume, nil return Volume, nil
} }
return "", errors.Errorf("unknown event type %s", name) return "", errors.Errorf("unknown event type %q", name)
} }
// StringToStatus converts a string to an Event Status // StringToStatus converts a string to an Event Status
@ -107,7 +111,6 @@ func StringToStatus(name string) (Status, error) {
case Commit.String(): case Commit.String():
return Commit, nil return Commit, nil
case Create.String(): case Create.String():
return Create, nil return Create, nil
case Exec.String(): case Exec.String():
return Exec, nil return Exec, nil
@ -135,8 +138,14 @@ func StringToStatus(name string) (Status, error) {
return Pull, nil return Pull, nil
case Push.String(): case Push.String():
return Push, nil return Push, nil
case Refresh.String():
return Refresh, nil
case Remove.String(): case Remove.String():
return Remove, nil return Remove, nil
case Renumber.String():
return Renumber, nil
case Restore.String():
return Restore, nil
case Save.String(): case Save.String():
return Save, nil return Save, nil
case Start.String(): case Start.String():
@ -154,7 +163,7 @@ func StringToStatus(name string) (Status, error) {
case Untag.String(): case Untag.String():
return Untag, nil return Untag, nil
} }
return "", errors.Errorf("unknown event status %s", name) return "", errors.Errorf("unknown event status %q", name)
} }
func (e EventLogFile) getTail(options ReadOptions) (*tail.Tail, error) { func (e EventLogFile) getTail(options ReadOptions) (*tail.Tail, error) {

View File

@ -1,13 +1,16 @@
package events package events
import ( import (
"github.com/pkg/errors"
"strings" "strings"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
) )
// NewEventer creates an eventer based on the eventer type // NewEventer creates an eventer based on the eventer type
func NewEventer(options EventerOptions) (Eventer, error) { func NewEventer(options EventerOptions) (Eventer, error) {
var eventer Eventer var eventer Eventer
logrus.Debugf("Initializing event backend %s", options.EventerType)
switch strings.ToUpper(options.EventerType) { switch strings.ToUpper(options.EventerType) {
case strings.ToUpper(Journald.String()): case strings.ToUpper(Journald.String()):
eventer = EventJournalD{options} eventer = EventJournalD{options}

View File

@ -7,6 +7,7 @@ import (
"github.com/coreos/go-systemd/journal" "github.com/coreos/go-systemd/journal"
"github.com/coreos/go-systemd/sdjournal" "github.com/coreos/go-systemd/sdjournal"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus"
) )
// EventJournalD is the journald implementation of an eventer // EventJournalD is the journald implementation of an eventer
@ -87,7 +88,11 @@ func (e EventJournalD) Read(options ReadOptions) error {
} }
newEvent, err := newEventFromJournalEntry(entry) newEvent, err := newEventFromJournalEntry(entry)
if err != nil { if err != nil {
return err // 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)
continue
} }
include := true include := true
for _, filter := range eventOptions { for _, filter := range eventOptions {

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/containers/storage"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
@ -15,6 +16,13 @@ type EventLogFile struct {
// Writes to the log file // Writes to the log file
func (e EventLogFile) Write(ee Event) error { func (e EventLogFile) Write(ee Event) error {
// We need to lock events file
lock, err := storage.GetLockfile(e.options.LogFilePath + ".lock")
if err != nil {
return err
}
lock.Lock()
defer lock.Unlock()
f, err := os.OpenFile(e.options.LogFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0700) f, err := os.OpenFile(e.options.LogFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0700)
if err != nil { if err != nil {
return err return err

View File

@ -2,7 +2,6 @@ package libpod
import ( import (
"fmt" "fmt"
"github.com/containers/libpod/libpod/events"
"io/ioutil" "io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
@ -12,6 +11,7 @@ import (
"github.com/BurntSushi/toml" "github.com/BurntSushi/toml"
is "github.com/containers/image/storage" is "github.com/containers/image/storage"
"github.com/containers/image/types" "github.com/containers/image/types"
"github.com/containers/libpod/libpod/events"
"github.com/containers/libpod/libpod/image" "github.com/containers/libpod/libpod/image"
"github.com/containers/libpod/libpod/lock" "github.com/containers/libpod/libpod/lock"
"github.com/containers/libpod/pkg/firewall" "github.com/containers/libpod/pkg/firewall"
@ -754,6 +754,17 @@ func makeRuntime(runtime *Runtime) (err error) {
if err != nil { if err != nil {
return err return err
} }
defer func() {
if err != nil && store != nil {
// Don't forcibly shut down
// We could be opening a store in use by another libpod
_, err2 := store.Shutdown(false)
if err2 != nil {
logrus.Errorf("Error removing store for partially-created runtime: %s", err2)
}
}
}()
} }
runtime.store = store runtime.store = store
@ -780,17 +791,6 @@ func makeRuntime(runtime *Runtime) (err error) {
runtime.eventer = eventer runtime.eventer = eventer
ir.Eventer = eventer ir.Eventer = eventer
defer func() {
if err != nil && store != nil {
// Don't forcibly shut down
// We could be opening a store in use by another libpod
_, err2 := store.Shutdown(false)
if err2 != nil {
logrus.Errorf("Error removing store for partially-created runtime: %s", err2)
}
}
}()
// Set up a storage service for creating container root filesystems from // Set up a storage service for creating container root filesystems from
// images // images
storageService, err := getStorageService(runtime.store) storageService, err := getStorageService(runtime.store)
@ -1074,6 +1074,8 @@ func (r *Runtime) refresh(alivePath string) error {
} }
defer file.Close() defer file.Close()
r.newSystemEvent(events.Refresh)
return nil return nil
} }

View File

@ -1,6 +1,7 @@
package libpod package libpod
import ( import (
"github.com/containers/libpod/libpod/events"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
@ -53,5 +54,7 @@ func (r *Runtime) renumberLocks() error {
} }
} }
r.newSystemEvent(events.Renumber)
return nil return nil
} }