mirror of
https://github.com/containers/podman.git
synced 2025-06-23 02:18:13 +08:00
Merge pull request #3019 from mheon/system_events
Add System event type and renumber, refresh events
This commit is contained in:
@ -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)
|
||||||
|
@ -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 ...
|
||||||
|
@ -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) {
|
||||||
|
@ -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}
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user