mirror of
https://github.com/containers/podman.git
synced 2025-05-22 01:27:07 +08:00
Add event logging to libpod, even display to podman
In lipod, we now log major events that occurr. These events can be displayed using the `podman events` command. Each event contains: * Type (container, image, volume, pod...) * Status (create, rm, stop, kill, ....) * Timestamp in RFC3339Nano format * Name (if applicable) * Image (if applicable) The format of the event and the varlink endpoint are to not be considered stable until cockpit has done its enablement. Signed-off-by: baude <bbaude@redhat.com>
This commit is contained in:
@ -10,6 +10,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/containers/libpod/libpod/driver"
|
||||
"github.com/containers/libpod/libpod/events"
|
||||
"github.com/containers/libpod/pkg/inspect"
|
||||
"github.com/containers/libpod/pkg/lookup"
|
||||
"github.com/containers/storage/pkg/stringid"
|
||||
@ -88,6 +89,7 @@ func (c *Container) Start(ctx context.Context, recursive bool) (err error) {
|
||||
}
|
||||
|
||||
// Start the container
|
||||
defer c.newContainerEvent(events.Start)
|
||||
return c.start()
|
||||
}
|
||||
|
||||
@ -125,7 +127,8 @@ func (c *Container) StartAndAttach(ctx context.Context, streams *AttachStreams,
|
||||
}
|
||||
close(attachChan)
|
||||
}()
|
||||
|
||||
c.newContainerEvent(events.Start)
|
||||
c.newContainerEvent(events.Attach)
|
||||
return attachChan, nil
|
||||
}
|
||||
|
||||
@ -180,7 +183,7 @@ func (c *Container) StopWithTimeout(timeout uint) error {
|
||||
c.state.State == ContainerStateExited {
|
||||
return ErrCtrStopped
|
||||
}
|
||||
|
||||
defer c.newContainerEvent(events.Stop)
|
||||
return c.stop(timeout)
|
||||
}
|
||||
|
||||
@ -198,7 +201,7 @@ func (c *Container) Kill(signal uint) error {
|
||||
if c.state.State != ContainerStateRunning {
|
||||
return errors.Wrapf(ErrCtrStateInvalid, "can only kill running containers")
|
||||
}
|
||||
|
||||
defer c.newContainerEvent(events.Kill)
|
||||
return c.runtime.ociRuntime.killContainer(c, signal)
|
||||
}
|
||||
|
||||
@ -321,7 +324,7 @@ func (c *Container) Exec(tty, privileged bool, env, cmd []string, user, workDir
|
||||
// TODO handle this better
|
||||
return errors.Wrapf(err, "error saving exec sessions %s for container %s", sessionID, c.ID())
|
||||
}
|
||||
|
||||
c.newContainerEvent(events.Exec)
|
||||
logrus.Debugf("Successfully started exec session %s in container %s", sessionID, c.ID())
|
||||
|
||||
// Unlock so other processes can use the container
|
||||
@ -351,7 +354,6 @@ func (c *Container) Exec(tty, privileged bool, env, cmd []string, user, workDir
|
||||
if err := c.save(); err != nil {
|
||||
logrus.Errorf("Error removing exec session %s from container %s state: %v", sessionID, c.ID(), err)
|
||||
}
|
||||
|
||||
return waitErr
|
||||
}
|
||||
|
||||
@ -390,7 +392,7 @@ func (c *Container) Attach(streams *AttachStreams, keys string, resize <-chan re
|
||||
c.state.State != ContainerStateExited {
|
||||
return errors.Wrapf(ErrCtrStateInvalid, "can only attach to created or running containers")
|
||||
}
|
||||
|
||||
defer c.newContainerEvent(events.Attach)
|
||||
return c.attach(streams, keys, resize, false)
|
||||
}
|
||||
|
||||
@ -405,7 +407,7 @@ func (c *Container) Mount() (string, error) {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
|
||||
defer c.newContainerEvent(events.Mount)
|
||||
return c.mount()
|
||||
}
|
||||
|
||||
@ -435,6 +437,7 @@ func (c *Container) Unmount(force bool) error {
|
||||
return errors.Wrapf(ErrInternal, "can't unmount %s last mount, it is still in use", c.ID())
|
||||
}
|
||||
}
|
||||
defer c.newContainerEvent(events.Unmount)
|
||||
return c.unmount(force)
|
||||
}
|
||||
|
||||
@ -455,7 +458,7 @@ func (c *Container) Pause() error {
|
||||
if c.state.State != ContainerStateRunning {
|
||||
return errors.Wrapf(ErrCtrStateInvalid, "%q is not running, can't pause", c.state.State)
|
||||
}
|
||||
|
||||
defer c.newContainerEvent(events.Pause)
|
||||
return c.pause()
|
||||
}
|
||||
|
||||
@ -473,7 +476,7 @@ func (c *Container) Unpause() error {
|
||||
if c.state.State != ContainerStatePaused {
|
||||
return errors.Wrapf(ErrCtrStateInvalid, "%q is not paused, can't unpause", c.ID())
|
||||
}
|
||||
|
||||
defer c.newContainerEvent(events.Unpause)
|
||||
return c.unpause()
|
||||
}
|
||||
|
||||
@ -488,7 +491,7 @@ func (c *Container) Export(path string) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
defer c.newContainerEvent(events.Export)
|
||||
return c.export(path)
|
||||
}
|
||||
|
||||
@ -542,7 +545,6 @@ func (c *Container) Inspect(size bool) (*inspect.ContainerInspectData, error) {
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "error getting graph driver info %q", c.ID())
|
||||
}
|
||||
|
||||
return c.getContainerInspectData(size, driverData)
|
||||
}
|
||||
|
||||
@ -574,6 +576,7 @@ func (c *Container) WaitWithInterval(waitTimeout time.Duration) (int32, error) {
|
||||
return 0, err
|
||||
}
|
||||
exitCode := c.state.ExitCode
|
||||
c.newContainerEvent(events.Wait)
|
||||
return exitCode, nil
|
||||
}
|
||||
|
||||
@ -597,7 +600,7 @@ func (c *Container) Cleanup(ctx context.Context) error {
|
||||
if len(c.state.ExecSessions) != 0 {
|
||||
return errors.Wrapf(ErrCtrStateInvalid, "container %s has active exec sessions, refusing to clean up", c.ID())
|
||||
}
|
||||
|
||||
defer c.newContainerEvent(events.Cleanup)
|
||||
return c.cleanup(ctx)
|
||||
}
|
||||
|
||||
@ -667,7 +670,7 @@ func (c *Container) Sync() error {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
defer c.newContainerEvent(events.Sync)
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -772,7 +775,6 @@ func (c *Container) Refresh(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -800,7 +802,7 @@ func (c *Container) Checkpoint(ctx context.Context, options ContainerCheckpointO
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
defer c.newContainerEvent(events.Checkpoint)
|
||||
return c.checkpoint(ctx, options)
|
||||
}
|
||||
|
||||
@ -815,6 +817,6 @@ func (c *Container) Restore(ctx context.Context, options ContainerCheckpointOpti
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
defer c.newContainerEvent(events.Restore)
|
||||
return c.restore(ctx, options)
|
||||
}
|
||||
|
Reference in New Issue
Block a user