api/types/events: define "Action" type and consts

Define consts for the Actions we use for events, instead of "ad-hoc" strings.
Having these consts makes it easier to find where specific events are triggered,
makes the events less error-prone, and allows documenting each Action (if needed).

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2023-08-26 15:24:46 +02:00
parent 10a3a3bc49
commit 0f871f8cb7
No known key found for this signature in database
GPG key ID: 76698F39D527CE8C
70 changed files with 284 additions and 156 deletions

View file

@ -104,7 +104,7 @@ func (b *Backend) PruneCache(ctx context.Context, opts types.BuildCachePruneOpti
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to prune build cache") return nil, errors.Wrap(err, "failed to prune build cache")
} }
b.eventsService.Log("prune", events.BuilderEventType, events.Actor{ b.eventsService.Log(events.ActionPrune, events.BuilderEventType, events.Actor{
Attributes: map[string]string{ Attributes: map[string]string{
"reclaimed": strconv.FormatInt(buildCacheSize, 10), "reclaimed": strconv.FormatInt(buildCacheSize, 10),
}, },

View file

@ -18,6 +18,86 @@ const (
VolumeEventType Type = "volume" // VolumeEventType is the event type that volumes generate. VolumeEventType Type = "volume" // VolumeEventType is the event type that volumes generate.
) )
// Action is used for event-actions.
type Action string
const (
ActionCreate Action = "create"
ActionStart Action = "start"
ActionRestart Action = "restart"
ActionStop Action = "stop"
ActionCheckpoint Action = "checkpoint"
ActionPause Action = "pause"
ActionUnPause Action = "unpause"
ActionAttach Action = "attach"
ActionDetach Action = "detach"
ActionResize Action = "resize"
ActionUpdate Action = "update"
ActionRename Action = "rename"
ActionKill Action = "kill"
ActionDie Action = "die"
ActionOOM Action = "oom"
ActionDestroy Action = "destroy"
ActionRemove Action = "remove"
ActionCommit Action = "commit"
ActionTop Action = "top"
ActionCopy Action = "copy"
ActionArchivePath Action = "archive-path"
ActionExtractToDir Action = "extract-to-dir"
ActionExport Action = "export"
ActionImport Action = "import"
ActionSave Action = "save"
ActionLoad Action = "load"
ActionTag Action = "tag"
ActionUnTag Action = "untag"
ActionPush Action = "push"
ActionPull Action = "pull"
ActionPrune Action = "prune"
ActionDelete Action = "delete"
ActionEnable Action = "enable"
ActionDisable Action = "disable"
ActionConnect Action = "connect"
ActionDisconnect Action = "disconnect"
ActionReload Action = "reload"
ActionMount Action = "mount"
ActionUnmount Action = "unmount"
// ActionExecCreate is the prefix used for exec_create events. These
// event-actions are commonly followed by a colon and space (": "),
// and the command that's defined for the exec, for example:
//
// exec_create: /bin/sh -c 'echo hello'
//
// This is far from ideal; it's a compromise to allow filtering and
// to preserve backward-compatibility.
ActionExecCreate Action = "exec_create"
// ActionExecStart is the prefix used for exec_create events. These
// event-actions are commonly followed by a colon and space (": "),
// and the command that's defined for the exec, for example:
//
// exec_start: /bin/sh -c 'echo hello'
//
// This is far from ideal; it's a compromise to allow filtering and
// to preserve backward-compatibility.
ActionExecStart Action = "exec_start"
ActionExecDie Action = "exec_die"
ActionExecDetach Action = "exec_detach"
// ActionHealthStatus is the prefix to use for health_status events.
//
// Health-status events can either have a pre-defined status, in which
// case the "health_status" action is followed by a colon, or can be
// "free-form", in which case they're followed by the output of the
// health-check output.
//
// This is far form ideal, and a compromise to allow filtering, and
// to preserve backward-compatibility.
ActionHealthStatus Action = "health_status"
ActionHealthStatusRunning Action = "health_status: running"
ActionHealthStatusHealthy Action = "health_status: healthy"
ActionHealthStatusUnhealthy Action = "health_status: unhealthy"
)
// Actor describes something that generates events, // Actor describes something that generates events,
// like a container, or a network, or a volume. // like a container, or a network, or a volume.
// It has a defined name and a set of attributes. // It has a defined name and a set of attributes.
@ -37,7 +117,7 @@ type Message struct {
From string `json:"from,omitempty"` // Deprecated: use Actor.Attributes["image"] instead. From string `json:"from,omitempty"` // Deprecated: use Actor.Attributes["image"] instead.
Type Type Type Type
Action string Action Action
Actor Actor Actor Actor
// Engine events are local scope. Cluster events are swarm scope. // Engine events are local scope. Cluster events are swarm scope.
Scope string `json:"scope,omitempty"` Scope string `json:"scope,omitempty"`

View file

@ -90,17 +90,17 @@ func TestEvents(t *testing.T) {
{ {
Type: events.BuilderEventType, Type: events.BuilderEventType,
Actor: events.Actor{ID: "1"}, Actor: events.Actor{ID: "1"},
Action: "create", Action: events.ActionCreate,
}, },
{ {
Type: events.BuilderEventType, Type: events.BuilderEventType,
Actor: events.Actor{ID: "1"}, Actor: events.Actor{ID: "1"},
Action: "die", Action: events.ActionDie,
}, },
{ {
Type: events.BuilderEventType, Type: events.BuilderEventType,
Actor: events.Actor{ID: "1"}, Actor: events.Actor{ID: "1"},
Action: "create", Action: events.ActionCreate,
}, },
}, },
expectedEvents: map[string]bool{ expectedEvents: map[string]bool{

View file

@ -17,6 +17,7 @@ import (
"github.com/containerd/containerd/cio" "github.com/containerd/containerd/cio"
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
mounttypes "github.com/docker/docker/api/types/mount" mounttypes "github.com/docker/docker/api/types/mount"
swarmtypes "github.com/docker/docker/api/types/swarm" swarmtypes "github.com/docker/docker/api/types/swarm"
"github.com/docker/docker/container/stream" "github.com/docker/docker/container/stream"
@ -488,26 +489,24 @@ func (container *Container) AddMountPointWithVolume(destination string, vol volu
} }
// UnmountVolumes unmounts all volumes // UnmountVolumes unmounts all volumes
func (container *Container) UnmountVolumes(volumeEventLog func(name, action string, attributes map[string]string)) error { func (container *Container) UnmountVolumes(volumeEventLog func(name string, action events.Action, attributes map[string]string)) error {
var errors []string var errs []string
for _, volumeMount := range container.MountPoints { for _, volumeMount := range container.MountPoints {
if volumeMount.Volume == nil { if volumeMount.Volume == nil {
continue continue
} }
if err := volumeMount.Cleanup(); err != nil { if err := volumeMount.Cleanup(); err != nil {
errors = append(errors, err.Error()) errs = append(errs, err.Error())
continue continue
} }
volumeEventLog(volumeMount.Volume.Name(), events.ActionUnmount, map[string]string{
attributes := map[string]string{
"driver": volumeMount.Volume.DriverName(), "driver": volumeMount.Volume.DriverName(),
"container": container.ID, "container": container.ID,
} })
volumeEventLog(volumeMount.Volume.Name(), "unmount", attributes)
} }
if len(errors) > 0 { if len(errs) > 0 {
return fmt.Errorf("error while unmounting volumes for container %s: %s", container.ID, strings.Join(errors, "; ")) return fmt.Errorf("error while unmounting volumes for container %s: %s", container.ID, strings.Join(errs, "; "))
} }
return nil return nil
} }

View file

@ -12,6 +12,7 @@ import (
"github.com/containerd/continuity/fs" "github.com/containerd/continuity/fs"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
mounttypes "github.com/docker/docker/api/types/mount" mounttypes "github.com/docker/docker/api/types/mount"
swarmtypes "github.com/docker/docker/api/types/swarm" swarmtypes "github.com/docker/docker/api/types/swarm"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
@ -365,7 +366,7 @@ func (container *Container) UpdateContainer(hostConfig *containertypes.HostConfi
// DetachAndUnmount uses a detached mount on all mount destinations, then // DetachAndUnmount uses a detached mount on all mount destinations, then
// unmounts each volume normally. // unmounts each volume normally.
// This is used from daemon/archive for `docker cp` // This is used from daemon/archive for `docker cp`
func (container *Container) DetachAndUnmount(volumeEventLog func(name, action string, attributes map[string]string)) error { func (container *Container) DetachAndUnmount(volumeEventLog func(name string, action events.Action, attributes map[string]string)) error {
ctx := context.TODO() ctx := context.TODO()
networkMounts := container.NetworkMounts() networkMounts := container.NetworkMounts()

View file

@ -7,6 +7,7 @@ import (
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
swarmtypes "github.com/docker/docker/api/types/swarm" swarmtypes "github.com/docker/docker/api/types/swarm"
"github.com/docker/docker/pkg/system" "github.com/docker/docker/pkg/system"
) )
@ -126,7 +127,7 @@ func (container *Container) ConfigMounts() []Mount {
// DetachAndUnmount unmounts all volumes. // DetachAndUnmount unmounts all volumes.
// On Windows it only delegates to `UnmountVolumes` since there is nothing to // On Windows it only delegates to `UnmountVolumes` since there is nothing to
// force unmount. // force unmount.
func (container *Container) DetachAndUnmount(volumeEventLog func(name, action string, attributes map[string]string)) error { func (container *Container) DetachAndUnmount(volumeEventLog func(name string, action events.Action, attributes map[string]string)) error {
return container.UnmountVolumes(volumeEventLog) return container.UnmountVolumes(volumeEventLog)
} }

View file

@ -9,6 +9,7 @@ import (
"path/filepath" "path/filepath"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/archive"
@ -85,7 +86,7 @@ func (daemon *Daemon) containerArchivePath(container *container.Container, path
return err return err
}) })
daemon.LogContainerEvent(container, "archive-path") daemon.LogContainerEvent(container, events.ActionArchivePath)
return content, stat, nil return content, stat, nil
} }
@ -155,7 +156,7 @@ func (daemon *Daemon) containerExtractToDir(container *container.Container, path
return err return err
} }
daemon.LogContainerEvent(container, "extract-to-dir") daemon.LogContainerEvent(container, events.ActionExtractToDir)
return nil return nil
} }
@ -205,7 +206,7 @@ func (daemon *Daemon) containerCopy(container *container.Container, resource str
container.Unlock() container.Unlock()
return err return err
}) })
daemon.LogContainerEvent(container, "copy") daemon.LogContainerEvent(container, events.ActionCopy)
return reader, nil return reader, nil
} }

View file

@ -9,6 +9,7 @@ import (
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/archive"
@ -136,7 +137,7 @@ func (daemon *Daemon) containerArchivePath(container *container.Container, path
return err return err
}) })
daemon.LogContainerEvent(container, "archive-path") daemon.LogContainerEvent(container, events.ActionArchivePath)
return content, stat, nil return content, stat, nil
} }
@ -254,7 +255,7 @@ func (daemon *Daemon) containerExtractToDir(container *container.Container, path
return err return err
} }
daemon.LogContainerEvent(container, "extract-to-dir") daemon.LogContainerEvent(container, events.ActionExtractToDir)
return nil return nil
} }
@ -328,7 +329,7 @@ func (daemon *Daemon) containerCopy(container *container.Container, resource str
container.Unlock() container.Unlock()
return err return err
}) })
daemon.LogContainerEvent(container, "copy") daemon.LogContainerEvent(container, events.ActionCopy)
return reader, nil return reader, nil
} }

View file

@ -7,6 +7,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types/backend" "github.com/docker/docker/api/types/backend"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/container/stream" "github.com/docker/docker/container/stream"
"github.com/docker/docker/daemon/logger" "github.com/docker/docker/daemon/logger"
@ -146,7 +147,7 @@ func (daemon *Daemon) containerAttach(c *container.Container, cfg *stream.Attach
} }
} }
daemon.LogContainerEvent(c, "attach") daemon.LogContainerEvent(c, events.ActionAttach)
if !doStream { if !doStream {
return nil return nil
@ -179,7 +180,7 @@ func (daemon *Daemon) containerAttach(c *container.Container, cfg *stream.Attach
if err != nil { if err != nil {
var ierr term.EscapeError var ierr term.EscapeError
if errors.Is(err, context.Canceled) || errors.As(err, &ierr) { if errors.Is(err, context.Canceled) || errors.As(err, &ierr) {
daemon.LogContainerEvent(c, "detach") daemon.LogContainerEvent(c, events.ActionDetach)
} else { } else {
log.G(ctx).Errorf("attach failed with error: %v", err) log.G(ctx).Errorf("attach failed with error: %v", err)
} }

View file

@ -7,6 +7,7 @@ import (
"path/filepath" "path/filepath"
"github.com/docker/docker/api/types/checkpoint" "github.com/docker/docker/api/types/checkpoint"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/daemon/names" "github.com/docker/docker/daemon/names"
) )
@ -79,7 +80,7 @@ func (daemon *Daemon) CheckpointCreate(name string, config checkpoint.CreateOpti
return fmt.Errorf("Cannot checkpoint container %s: %s", name, err) return fmt.Errorf("Cannot checkpoint container %s: %s", name, err)
} }
daemon.LogContainerEvent(container, "checkpoint") daemon.LogContainerEvent(container, events.ActionCheckpoint)
return nil return nil
} }

View file

@ -254,7 +254,7 @@ func (r *controller) Start(ctx context.Context) error {
} }
switch event.Action { switch event.Action {
case "die": // exit on terminal events case events.ActionDie: // exit on terminal events
ctnr, err := r.adapter.inspect(ctx) ctnr, err := r.adapter.inspect(ctx)
if err != nil { if err != nil {
return errors.Wrap(err, "die event received") return errors.Wrap(err, "die event received")
@ -263,18 +263,18 @@ func (r *controller) Start(ctx context.Context) error {
} }
return nil return nil
case "destroy": case events.ActionDestroy:
// If we get here, something has gone wrong but we want to exit // If we get here, something has gone wrong but we want to exit
// and report anyways. // and report anyways.
return ErrContainerDestroyed return ErrContainerDestroyed
case "health_status: unhealthy": case events.ActionHealthStatusUnhealthy:
// in this case, we stop the container and report unhealthy status // in this case, we stop the container and report unhealthy status
if err := r.Shutdown(ctx); err != nil { if err := r.Shutdown(ctx); err != nil {
return errors.Wrap(err, "unhealthy container shutdown failed") return errors.Wrap(err, "unhealthy container shutdown failed")
} }
// set health check error, and wait for container to fully exit ("die" event) // set health check error, and wait for container to fully exit ("die" event)
healthErr = ErrContainerUnhealthy healthErr = ErrContainerUnhealthy
case "health_status: healthy": case events.ActionHealthStatusHealthy:
if err := r.adapter.activateServiceBinding(); err != nil { if err := r.adapter.activateServiceBinding(); err != nil {
log.G(ctx).WithError(err).Errorf("failed to activate service binding for container %s after healthy event", r.adapter.container.name()) log.G(ctx).WithError(err).Errorf("failed to activate service binding for container %s after healthy event", r.adapter.container.name())
return err return err
@ -716,7 +716,7 @@ func (r *controller) checkHealth(ctx context.Context) error {
} }
switch event.Action { switch event.Action {
case "health_status: unhealthy": case events.ActionHealthStatusUnhealthy:
return ErrContainerUnhealthy return ErrContainerUnhealthy
} }
} }

View file

@ -8,6 +8,7 @@ import (
"time" "time"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
eventtypes "github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/daemon" "github.com/docker/docker/daemon"
"github.com/docker/docker/daemon/events" "github.com/docker/docker/daemon/events"
@ -71,7 +72,7 @@ func TestHealthStates(t *testing.T) {
// send an event and expect to get expectedErr // send an event and expect to get expectedErr
// if expectedErr is nil, shouldn't get any error // if expectedErr is nil, shouldn't get any error
logAndExpect := func(msg string, expectedErr error) { logAndExpect := func(msg eventtypes.Action, expectedErr error) {
daemon.LogContainerEvent(c, msg) daemon.LogContainerEvent(c, msg)
timer := time.NewTimer(1 * time.Second) timer := time.NewTimer(1 * time.Second)
@ -90,10 +91,10 @@ func TestHealthStates(t *testing.T) {
} }
// events that are ignored by checkHealth // events that are ignored by checkHealth
logAndExpect("health_status: running", nil) logAndExpect(eventtypes.ActionHealthStatusRunning, nil)
logAndExpect("health_status: healthy", nil) logAndExpect(eventtypes.ActionHealthStatusHealthy, nil)
logAndExpect("die", nil) logAndExpect(eventtypes.ActionDie, nil)
// unhealthy event will be caught by checkHealth // unhealthy event will be caught by checkHealth
logAndExpect("health_status: unhealthy", ErrContainerUnhealthy) logAndExpect(eventtypes.ActionHealthStatusUnhealthy, ErrContainerUnhealthy)
} }

View file

@ -10,6 +10,7 @@ import (
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/backend" "github.com/docker/docker/api/types/backend"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/builder/dockerfile" "github.com/docker/docker/builder/dockerfile"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -180,7 +181,7 @@ func (daemon *Daemon) CreateImageFromContainer(ctx context.Context, name string,
} }
imageRef = reference.FamiliarString(c.Tag) imageRef = reference.FamiliarString(c.Tag)
} }
daemon.LogContainerEventWithAttributes(container, "commit", map[string]string{ daemon.LogContainerEventWithAttributes(container, events.ActionCommit, map[string]string{
"comment": c.Comment, "comment": c.Comment,
"imageID": id.String(), "imageID": id.String(),
"imageRef": imageRef, "imageRef": imageRef,

View file

@ -12,6 +12,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
networktypes "github.com/docker/docker/api/types/network" networktypes "github.com/docker/docker/api/types/network"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/daemon/config" "github.com/docker/docker/daemon/config"
@ -772,7 +773,7 @@ func (daemon *Daemon) connectToNetwork(cfg *config.Config, container *container.
container.NetworkSettings.Ports = getPortMapInfo(sb) container.NetworkSettings.Ports = getPortMapInfo(sb)
daemon.LogNetworkEventWithAttributes(n, "connect", map[string]string{"container": container.ID}) daemon.LogNetworkEventWithAttributes(n, events.ActionConnect, map[string]string{"container": container.ID})
networkActions.WithValues("connect").UpdateSince(start) networkActions.WithValues("connect").UpdateSince(start)
return nil return nil
} }
@ -880,7 +881,7 @@ func (daemon *Daemon) tryDetachContainerFromClusterNetwork(network *libnetwork.N
} }
} }
} }
daemon.LogNetworkEventWithAttributes(network, "disconnect", map[string]string{ daemon.LogNetworkEventWithAttributes(network, events.ActionDisconnect, map[string]string{
"container": container.ID, "container": container.ID,
}) })
} }
@ -1051,7 +1052,7 @@ func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, netw
} }
if n != nil { if n != nil {
daemon.LogNetworkEventWithAttributes(n, "disconnect", map[string]string{ daemon.LogNetworkEventWithAttributes(n, events.ActionDisconnect, map[string]string{
"container": container.ID, "container": container.ID,
}) })
} }

View file

@ -10,6 +10,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
@ -76,7 +77,7 @@ func (i *ImageService) ImageDelete(ctx context.Context, imageRef string, force,
if err != nil { if err != nil {
return nil, err return nil, err
} }
i.LogImageEvent(imgID.String(), imgID.String(), "untag") i.LogImageEvent(imgID.String(), imgID.String(), events.ActionUnTag)
records := []types.ImageDeleteResponseItem{{Untagged: reference.FamiliarString(reference.TagNameOnly(parsedRef))}} records := []types.ImageDeleteResponseItem{{Untagged: reference.FamiliarString(reference.TagNameOnly(parsedRef))}}
return records, nil return records, nil
} }
@ -107,7 +108,7 @@ func (i *ImageService) ImageDelete(ctx context.Context, imageRef string, force,
return nil, err return nil, err
} }
i.LogImageEvent(imgID.String(), imgID.String(), "untag") i.LogImageEvent(imgID.String(), imgID.String(), events.ActionUnTag)
records := []types.ImageDeleteResponseItem{{Untagged: reference.FamiliarString(reference.TagNameOnly(parsedRef))}} records := []types.ImageDeleteResponseItem{{Untagged: reference.FamiliarString(reference.TagNameOnly(parsedRef))}}
return records, nil return records, nil
} }
@ -159,7 +160,7 @@ func (i *ImageService) deleteAll(ctx context.Context, img images.Image, force, p
return records, err return records, err
} }
} }
i.LogImageEvent(imgID, imgID, "delete") i.LogImageEvent(imgID, imgID, events.ActionDelete)
records = append(records, types.ImageDeleteResponseItem{Deleted: imgID}) records = append(records, types.ImageDeleteResponseItem{Deleted: imgID})
for _, parent := range parents { for _, parent := range parents {
@ -172,7 +173,7 @@ func (i *ImageService) deleteAll(ctx context.Context, img images.Image, force, p
break break
} }
parentID := parent.img.Target.Digest.String() parentID := parent.img.Target.Digest.String()
i.LogImageEvent(parentID, parentID, "delete") i.LogImageEvent(parentID, parentID, events.ActionDelete)
records = append(records, types.ImageDeleteResponseItem{Deleted: parentID}) records = append(records, types.ImageDeleteResponseItem{Deleted: parentID})
} }
@ -259,7 +260,7 @@ func (i *ImageService) imageDeleteHelper(ctx context.Context, img images.Image,
return err return err
} }
i.LogImageEvent(imgID.String(), imgID.String(), "untag") i.LogImageEvent(imgID.String(), imgID.String(), events.ActionUnTag)
*records = append(*records, types.ImageDeleteResponseItem{Untagged: reference.FamiliarString(untaggedRef)}) *records = append(*records, types.ImageDeleteResponseItem{Untagged: reference.FamiliarString(untaggedRef)})
return nil return nil

View file

@ -8,7 +8,7 @@ import (
) )
// LogImageEvent generates an event related to an image with only the default attributes. // LogImageEvent generates an event related to an image with only the default attributes.
func (i *ImageService) LogImageEvent(imageID, refName, action string) { func (i *ImageService) LogImageEvent(imageID, refName string, action events.Action) {
ctx := context.TODO() ctx := context.TODO()
attributes := map[string]string{} attributes := map[string]string{}

View file

@ -14,6 +14,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
cplatforms "github.com/containerd/containerd/platforms" cplatforms "github.com/containerd/containerd/platforms"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/docker/docker/pkg/platforms" "github.com/docker/docker/pkg/platforms"
@ -216,7 +217,7 @@ func (i *ImageService) LoadImage(ctx context.Context, inTar io.ReadCloser, outSt
} }
fmt.Fprintf(progress, "%s: %s\n", loadedMsg, name) fmt.Fprintf(progress, "%s: %s\n", loadedMsg, name)
i.LogImageEvent(img.Target.Digest.String(), img.Target.Digest.String(), "load") i.LogImageEvent(img.Target.Digest.String(), img.Target.Digest.String(), events.ActionLoad)
} }
return nil return nil

View file

@ -16,6 +16,7 @@ import (
"github.com/containerd/containerd/platforms" "github.com/containerd/containerd/platforms"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/builder/dockerfile" "github.com/docker/docker/builder/dockerfile"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/docker/docker/image" "github.com/docker/docker/image"
@ -146,7 +147,7 @@ func (i *ImageService) ImportImage(ctx context.Context, ref reference.Named, pla
if err != nil { if err != nil {
logger.WithError(err).Debug("failed to unpack image") logger.WithError(err).Debug("failed to unpack image")
} else { } else {
i.LogImageEvent(id.String(), id.String(), "import") i.LogImageEvent(id.String(), id.String(), events.ActionImport)
} }
return id, err return id, err

View file

@ -7,6 +7,7 @@ import (
containerdimages "github.com/containerd/containerd/images" containerdimages "github.com/containerd/containerd/images"
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -39,7 +40,7 @@ func (i *ImageService) TagImage(ctx context.Context, imageID image.ID, newTag re
// Check if image we would replace already resolves to the same target. // Check if image we would replace already resolves to the same target.
// No need to do anything. // No need to do anything.
if replacedImg.Target.Digest == target.Digest { if replacedImg.Target.Digest == target.Digest {
i.LogImageEvent(imageID.String(), reference.FamiliarString(newTag), "tag") i.LogImageEvent(imageID.String(), reference.FamiliarString(newTag), events.ActionTag)
return nil return nil
} }
@ -60,7 +61,7 @@ func (i *ImageService) TagImage(ctx context.Context, imageID image.ID, newTag re
}) })
logger.Info("image created") logger.Info("image created")
defer i.LogImageEvent(imageID.String(), reference.FamiliarString(newTag), "tag") defer i.LogImageEvent(imageID.String(), reference.FamiliarString(newTag), events.ActionTag)
// The tag succeeded, check if the source image is dangling // The tag succeeded, check if the source image is dangling
sourceDanglingImg, err := is.Get(context.Background(), danglingImageName(target.Digest)) sourceDanglingImg, err := is.Get(context.Background(), danglingImageName(target.Digest))

View file

@ -13,6 +13,7 @@ import (
"github.com/containerd/containerd/platforms" "github.com/containerd/containerd/platforms"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
imagetypes "github.com/docker/docker/api/types/image" imagetypes "github.com/docker/docker/api/types/image"
networktypes "github.com/docker/docker/api/types/network" networktypes "github.com/docker/docker/api/types/network"
"github.com/docker/docker/container" "github.com/docker/docker/container"
@ -235,7 +236,7 @@ func (daemon *Daemon) create(ctx context.Context, daemonCfg *config.Config, opts
return nil, err return nil, err
} }
stateCtr.set(ctr.ID, "stopped") stateCtr.set(ctr.ID, "stopped")
daemon.LogContainerEvent(ctr, "create") daemon.LogContainerEvent(ctr, events.ActionCreate)
return ctr, nil return ctr, nil
} }

View file

@ -13,6 +13,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/daemon/config" "github.com/docker/docker/daemon/config"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
@ -182,6 +183,6 @@ func (daemon *Daemon) cleanupContainer(container *container.Container, config ty
container.SetRemoved() container.SetRemoved()
stateCtr.del(container.ID) stateCtr.del(container.ID)
daemon.LogContainerEvent(container, "destroy") daemon.LogContainerEvent(container, events.ActionDestroy)
return nil return nil
} }

View file

@ -17,12 +17,12 @@ import (
) )
// LogContainerEvent generates an event related to a container with only the default attributes. // LogContainerEvent generates an event related to a container with only the default attributes.
func (daemon *Daemon) LogContainerEvent(container *container.Container, action string) { func (daemon *Daemon) LogContainerEvent(container *container.Container, action events.Action) {
daemon.LogContainerEventWithAttributes(container, action, map[string]string{}) daemon.LogContainerEventWithAttributes(container, action, map[string]string{})
} }
// LogContainerEventWithAttributes generates an event related to a container with specific given attributes. // LogContainerEventWithAttributes generates an event related to a container with specific given attributes.
func (daemon *Daemon) LogContainerEventWithAttributes(container *container.Container, action string, attributes map[string]string) { func (daemon *Daemon) LogContainerEventWithAttributes(container *container.Container, action events.Action, attributes map[string]string) {
copyAttributes(attributes, container.Config.Labels) copyAttributes(attributes, container.Config.Labels)
if container.Config.Image != "" { if container.Config.Image != "" {
attributes["image"] = container.Config.Image attributes["image"] = container.Config.Image
@ -35,7 +35,7 @@ func (daemon *Daemon) LogContainerEventWithAttributes(container *container.Conta
} }
// LogPluginEvent generates an event related to a plugin with only the default attributes. // LogPluginEvent generates an event related to a plugin with only the default attributes.
func (daemon *Daemon) LogPluginEvent(pluginID, refName, action string) { func (daemon *Daemon) LogPluginEvent(pluginID, refName string, action events.Action) {
daemon.EventsService.Log(action, events.PluginEventType, events.Actor{ daemon.EventsService.Log(action, events.PluginEventType, events.Actor{
ID: pluginID, ID: pluginID,
Attributes: map[string]string{"name": refName}, Attributes: map[string]string{"name": refName},
@ -43,7 +43,7 @@ func (daemon *Daemon) LogPluginEvent(pluginID, refName, action string) {
} }
// LogVolumeEvent generates an event related to a volume. // LogVolumeEvent generates an event related to a volume.
func (daemon *Daemon) LogVolumeEvent(volumeID, action string, attributes map[string]string) { func (daemon *Daemon) LogVolumeEvent(volumeID string, action events.Action, attributes map[string]string) {
daemon.EventsService.Log(action, events.VolumeEventType, events.Actor{ daemon.EventsService.Log(action, events.VolumeEventType, events.Actor{
ID: volumeID, ID: volumeID,
Attributes: attributes, Attributes: attributes,
@ -51,12 +51,12 @@ func (daemon *Daemon) LogVolumeEvent(volumeID, action string, attributes map[str
} }
// LogNetworkEvent generates an event related to a network with only the default attributes. // LogNetworkEvent generates an event related to a network with only the default attributes.
func (daemon *Daemon) LogNetworkEvent(nw *libnetwork.Network, action string) { func (daemon *Daemon) LogNetworkEvent(nw *libnetwork.Network, action events.Action) {
daemon.LogNetworkEventWithAttributes(nw, action, map[string]string{}) daemon.LogNetworkEventWithAttributes(nw, action, map[string]string{})
} }
// LogNetworkEventWithAttributes generates an event related to a network with specific given attributes. // LogNetworkEventWithAttributes generates an event related to a network with specific given attributes.
func (daemon *Daemon) LogNetworkEventWithAttributes(nw *libnetwork.Network, action string, attributes map[string]string) { func (daemon *Daemon) LogNetworkEventWithAttributes(nw *libnetwork.Network, action events.Action, attributes map[string]string) {
attributes["name"] = nw.Name() attributes["name"] = nw.Name()
attributes["type"] = nw.Type() attributes["type"] = nw.Type()
daemon.EventsService.Log(action, events.NetworkEventType, events.Actor{ daemon.EventsService.Log(action, events.NetworkEventType, events.Actor{
@ -66,7 +66,7 @@ func (daemon *Daemon) LogNetworkEventWithAttributes(nw *libnetwork.Network, acti
} }
// LogDaemonEventWithAttributes generates an event related to the daemon itself with specific given attributes. // LogDaemonEventWithAttributes generates an event related to the daemon itself with specific given attributes.
func (daemon *Daemon) LogDaemonEventWithAttributes(action string, attributes map[string]string) { func (daemon *Daemon) LogDaemonEventWithAttributes(action events.Action, attributes map[string]string) {
if daemon.EventsService != nil { if daemon.EventsService != nil {
if name := hostName(); name != "" { if name := hostName(); name != "" {
attributes["name"] = name attributes["name"] = name
@ -248,10 +248,10 @@ func (daemon *Daemon) logServiceEvent(action swarmapi.WatchActionKind, service *
daemon.logClusterEvent(action, service.ID, events.ServiceEventType, eventTime, attributes) daemon.logClusterEvent(action, service.ID, events.ServiceEventType, eventTime, attributes)
} }
var clusterEventAction = map[swarmapi.WatchActionKind]string{ var clusterEventAction = map[swarmapi.WatchActionKind]events.Action{
swarmapi.WatchActionKindCreate: "create", swarmapi.WatchActionKindCreate: events.ActionCreate,
swarmapi.WatchActionKindUpdate: "update", swarmapi.WatchActionKindUpdate: events.ActionUpdate,
swarmapi.WatchActionKindRemove: "remove", swarmapi.WatchActionKindRemove: events.ActionRemove,
} }
func (daemon *Daemon) logClusterEvent(action swarmapi.WatchActionKind, id string, eventType events.Type, eventTime time.Time, attributes map[string]string) { func (daemon *Daemon) logClusterEvent(action swarmapi.WatchActionKind, id string, eventType events.Type, eventTime time.Time, attributes map[string]string) {

View file

@ -79,7 +79,7 @@ func (e *Events) Evict(l chan interface{}) {
} }
// Log creates a local scope message and publishes it // Log creates a local scope message and publishes it
func (e *Events) Log(action string, eventType eventtypes.Type, actor eventtypes.Actor) { func (e *Events) Log(action eventtypes.Action, eventType eventtypes.Type, actor eventtypes.Actor) {
now := time.Now().UTC() now := time.Now().UTC()
jm := eventtypes.Message{ jm := eventtypes.Message{
Action: action, Action: action,
@ -94,11 +94,11 @@ func (e *Events) Log(action string, eventType eventtypes.Type, actor eventtypes.
switch eventType { switch eventType {
case eventtypes.ContainerEventType: case eventtypes.ContainerEventType:
jm.ID = actor.ID jm.ID = actor.ID
jm.Status = action jm.Status = string(action)
jm.From = actor.Attributes["image"] jm.From = actor.Attributes["image"]
case eventtypes.ImageEventType: case eventtypes.ImageEventType:
jm.ID = actor.ID jm.ID = actor.ID
jm.Status = action jm.Status = string(action)
} }
e.PublishMessage(jm) e.PublishMessage(jm)

View file

@ -20,7 +20,7 @@ import (
// TODO remove this once we removed the deprecated `ID`, `Status`, and `From` fields. // TODO remove this once we removed the deprecated `ID`, `Status`, and `From` fields.
func validateLegacyFields(t *testing.T, msg events.Message) { func validateLegacyFields(t *testing.T, msg events.Message) {
t.Helper() t.Helper()
assert.Check(t, is.Equal(msg.Status, msg.Action), "Legacy Status field does not match Action") assert.Check(t, is.Equal(msg.Status, string(msg.Action)), "Legacy Status field does not match Action")
assert.Check(t, is.Equal(msg.ID, msg.Actor.ID), "Legacy ID field does not match Actor.ID") assert.Check(t, is.Equal(msg.ID, msg.Actor.ID), "Legacy ID field does not match Actor.ID")
assert.Check(t, is.Equal(msg.From, msg.Actor.Attributes["image"]), "Legacy From field does not match Actor.Attributes.image") assert.Check(t, is.Equal(msg.From, msg.Actor.Attributes["image"]), "Legacy From field does not match Actor.Attributes.image")
} }
@ -45,7 +45,7 @@ func TestEventsLog(t *testing.T) {
jmsg, ok := msg.(events.Message) jmsg, ok := msg.(events.Message)
assert.Assert(t, ok, "unexpected type: %T", msg) assert.Assert(t, ok, "unexpected type: %T", msg)
validateLegacyFields(t, jmsg) validateLegacyFields(t, jmsg)
assert.Check(t, is.Equal(jmsg.Action, "test")) assert.Check(t, is.Equal(jmsg.Action, events.Action("test")))
assert.Check(t, is.Equal(jmsg.Actor.ID, "cont")) assert.Check(t, is.Equal(jmsg.Actor.ID, "cont"))
assert.Check(t, is.Equal(jmsg.Actor.Attributes["image"], "image")) assert.Check(t, is.Equal(jmsg.Actor.Attributes["image"], "image"))
case <-time.After(1 * time.Second): case <-time.After(1 * time.Second):
@ -58,7 +58,7 @@ func TestEventsLog(t *testing.T) {
jmsg, ok := msg.(events.Message) jmsg, ok := msg.(events.Message)
assert.Assert(t, ok, "unexpected type: %T", msg) assert.Assert(t, ok, "unexpected type: %T", msg)
validateLegacyFields(t, jmsg) validateLegacyFields(t, jmsg)
assert.Check(t, is.Equal(jmsg.Action, "test")) assert.Check(t, is.Equal(jmsg.Action, events.Action("test")))
assert.Check(t, is.Equal(jmsg.Actor.ID, "cont")) assert.Check(t, is.Equal(jmsg.Actor.ID, "cont"))
assert.Check(t, is.Equal(jmsg.Actor.Attributes["image"], "image")) assert.Check(t, is.Equal(jmsg.Actor.Attributes["image"], "image"))
case <-time.After(1 * time.Second): case <-time.After(1 * time.Second):
@ -91,7 +91,7 @@ func TestLogEvents(t *testing.T) {
for i := 0; i < eventsLimit+16; i++ { for i := 0; i < eventsLimit+16; i++ {
num := strconv.Itoa(i) num := strconv.Itoa(i)
e.Log("action_"+num, events.ContainerEventType, events.Actor{ e.Log(events.Action("action_"+num), events.ContainerEventType, events.Actor{
ID: "cont_" + num, ID: "cont_" + num,
Attributes: map[string]string{"image": "image_" + num}, Attributes: map[string]string{"image": "image_" + num},
}) })
@ -100,7 +100,7 @@ func TestLogEvents(t *testing.T) {
current, l, _ := e.Subscribe() current, l, _ := e.Subscribe()
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
num := strconv.Itoa(i + eventsLimit + 16) num := strconv.Itoa(i + eventsLimit + 16)
e.Log("action_"+num, events.ContainerEventType, events.Actor{ e.Log(events.Action("action_"+num), events.ContainerEventType, events.Actor{
ID: "cont_" + num, ID: "cont_" + num,
Attributes: map[string]string{"image": "image_" + num}, Attributes: map[string]string{"image": "image_" + num},
}) })
@ -121,16 +121,16 @@ func TestLogEvents(t *testing.T) {
first := current[0] first := current[0]
validateLegacyFields(t, first) validateLegacyFields(t, first)
assert.Check(t, is.Equal(first.Action, "action_16")) assert.Check(t, is.Equal(first.Action, events.Action("action_16")))
last := current[len(current)-1] last := current[len(current)-1]
assert.Check(t, is.Equal(last.Action, "action_271")) assert.Check(t, is.Equal(last.Action, events.Action("action_271")))
firstC := msgs[0] firstC := msgs[0]
assert.Check(t, is.Equal(firstC.Action, "action_272")) assert.Check(t, is.Equal(firstC.Action, events.Action("action_272")))
lastC := msgs[len(msgs)-1] lastC := msgs[len(msgs)-1]
assert.Check(t, is.Equal(lastC.Action, "action_281")) assert.Check(t, is.Equal(lastC.Action, events.Action("action_281")))
} }
// Regression-test for https://github.com/moby/moby/issues/20999 // Regression-test for https://github.com/moby/moby/issues/20999

View file

@ -38,9 +38,9 @@ func (ef *Filter) matchEvent(ev events.Message) bool {
// #25798 if an event filter contains either health_status, exec_create or exec_start without a colon // #25798 if an event filter contains either health_status, exec_create or exec_start without a colon
// Let's to a FuzzyMatch instead of an ExactMatch. // Let's to a FuzzyMatch instead of an ExactMatch.
if ef.filterContains("event", map[string]struct{}{"health_status": {}, "exec_create": {}, "exec_start": {}}) { if ef.filterContains("event", map[string]struct{}{"health_status": {}, "exec_create": {}, "exec_start": {}}) {
return ef.filter.FuzzyMatch("event", ev.Action) return ef.filter.FuzzyMatch("event", string(ev.Action))
} }
return ef.filter.ExactMatch("event", ev.Action) return ef.filter.ExactMatch("event", string(ev.Action))
} }
func (ef *Filter) filterContains(field string, values map[string]struct{}) bool { func (ef *Filter) filterContains(field string, values map[string]struct{}) bool {

View file

@ -66,7 +66,7 @@ func Scan(text string) (*events.Message, error) {
Time: t, Time: t,
TimeNano: time.Unix(t, tn).UnixNano(), TimeNano: time.Unix(t, tn).UnixNano(),
Type: events.Type(md["eventType"]), Type: events.Type(md["eventType"]),
Action: md["action"], Action: events.Action(md["action"]),
Actor: events.Actor{ Actor: events.Actor{
ID: md["id"], ID: md["id"],
Attributes: attrs, Attributes: attrs,

View file

@ -29,7 +29,7 @@ func TestLogContainerEventCopyLabels(t *testing.T) {
daemon := &Daemon{ daemon := &Daemon{
EventsService: e, EventsService: e,
} }
daemon.LogContainerEvent(ctr, "create") daemon.LogContainerEvent(ctr, eventtypes.ActionCreate)
if _, mutated := ctr.Config.Labels["image"]; mutated { if _, mutated := ctr.Config.Labels["image"]; mutated {
t.Fatalf("Expected to not mutate the container labels, got %q", ctr.Config.Labels) t.Fatalf("Expected to not mutate the container labels, got %q", ctr.Config.Labels)
@ -59,7 +59,7 @@ func TestLogContainerEventWithAttributes(t *testing.T) {
daemon := &Daemon{ daemon := &Daemon{
EventsService: e, EventsService: e,
} }
daemon.LogContainerEventWithAttributes(ctr, "create", map[string]string{ daemon.LogContainerEventWithAttributes(ctr, eventtypes.ActionCreate, map[string]string{
"node": "2", "node": "2",
"foo": "bar", "foo": "bar",
}) })

View file

@ -13,6 +13,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/strslice" "github.com/docker/docker/api/types/strslice"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/container/stream" "github.com/docker/docker/container/stream"
@ -137,7 +138,7 @@ func (daemon *Daemon) ContainerExecCreate(name string, config *types.ExecConfig)
} }
daemon.registerExecCommand(cntr, execConfig) daemon.registerExecCommand(cntr, execConfig)
daemon.LogContainerEventWithAttributes(cntr, "exec_create: "+execConfig.Entrypoint+" "+strings.Join(execConfig.Args, " "), map[string]string{ daemon.LogContainerEventWithAttributes(cntr, events.Action(string(events.ActionExecCreate)+": "+execConfig.Entrypoint+" "+strings.Join(execConfig.Args, " ")), map[string]string{
"execID": execConfig.ID, "execID": execConfig.ID,
}) })
@ -173,7 +174,7 @@ func (daemon *Daemon) ContainerExecStart(ctx context.Context, name string, optio
ec.Unlock() ec.Unlock()
log.G(ctx).Debugf("starting exec command %s in container %s", ec.ID, ec.Container.ID) log.G(ctx).Debugf("starting exec command %s in container %s", ec.ID, ec.Container.ID)
daemon.LogContainerEventWithAttributes(ec.Container, "exec_start: "+ec.Entrypoint+" "+strings.Join(ec.Args, " "), map[string]string{ daemon.LogContainerEventWithAttributes(ec.Container, events.Action(string(events.ActionExecStart)+": "+ec.Entrypoint+" "+strings.Join(ec.Args, " ")), map[string]string{
"execID": ec.ID, "execID": ec.ID,
}) })
@ -308,7 +309,7 @@ func (daemon *Daemon) ContainerExecStart(ctx context.Context, name string, optio
if _, ok := err.(term.EscapeError); !ok { if _, ok := err.(term.EscapeError); !ok {
return errdefs.System(errors.Wrap(err, "exec attach failed")) return errdefs.System(errors.Wrap(err, "exec attach failed"))
} }
daemon.LogContainerEventWithAttributes(ec.Container, "exec_detach", map[string]string{ daemon.LogContainerEventWithAttributes(ec.Container, events.ActionExecDetach, map[string]string{
"execID": ec.ID, "execID": ec.ID,
}) })
} }

View file

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"io" "io"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/archive"
@ -58,6 +59,6 @@ func (daemon *Daemon) containerExport(ctx context.Context, container *container.
if err != nil { if err != nil {
return err return err
} }
daemon.LogContainerEvent(container, "export") daemon.LogContainerEvent(container, events.ActionExport)
return nil return nil
} }

View file

@ -12,6 +12,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/strslice" "github.com/docker/docker/api/types/strslice"
"github.com/docker/docker/container" "github.com/docker/docker/container"
) )
@ -87,7 +88,7 @@ func (p *cmdProbe) run(ctx context.Context, d *Daemon, cntr *container.Container
execConfig.Env = container.ReplaceOrAppendEnvValues(cntr.CreateDaemonEnvironment(execConfig.Tty, linkedEnv), execConfig.Env) execConfig.Env = container.ReplaceOrAppendEnvValues(cntr.CreateDaemonEnvironment(execConfig.Tty, linkedEnv), execConfig.Env)
d.registerExecCommand(cntr, execConfig) d.registerExecCommand(cntr, execConfig)
d.LogContainerEventWithAttributes(cntr, "exec_create: "+execConfig.Entrypoint+" "+strings.Join(execConfig.Args, " "), map[string]string{ d.LogContainerEventWithAttributes(cntr, events.Action(string(events.ActionExecCreate)+": "+execConfig.Entrypoint+" "+strings.Join(execConfig.Args, " ")), map[string]string{
"execID": execConfig.ID, "execID": execConfig.ID,
}) })
@ -239,7 +240,7 @@ func handleProbeResult(d *Daemon, c *container.Container, result *types.Healthch
current := h.Status() current := h.Status()
if oldStatus != current { if oldStatus != current {
d.LogContainerEvent(c, "health_status: "+current) d.LogContainerEvent(c, events.Action(string(events.ActionHealthStatus)+": "+current))
} }
} }

View file

@ -49,7 +49,7 @@ func TestHealthStates(t *testing.T) {
_, l, _ := e.Subscribe() _, l, _ := e.Subscribe()
defer e.Evict(l) defer e.Evict(l)
expect := func(expected string) { expect := func(expected eventtypes.Action) {
select { select {
case event := <-l: case event := <-l:
ev := event.(eventtypes.Message) ev := event.(eventtypes.Message)
@ -97,13 +97,13 @@ func TestHealthStates(t *testing.T) {
// starting -> failed -> success -> failed // starting -> failed -> success -> failed
handleResult(c.State.StartedAt.Add(1*time.Second), 1) handleResult(c.State.StartedAt.Add(1*time.Second), 1)
expect("health_status: unhealthy") expect(eventtypes.ActionHealthStatusUnhealthy)
handleResult(c.State.StartedAt.Add(2*time.Second), 0) handleResult(c.State.StartedAt.Add(2*time.Second), 0)
expect("health_status: healthy") expect(eventtypes.ActionHealthStatusHealthy)
handleResult(c.State.StartedAt.Add(3*time.Second), 1) handleResult(c.State.StartedAt.Add(3*time.Second), 1)
expect("health_status: unhealthy") expect(eventtypes.ActionHealthStatusUnhealthy)
// Test retries // Test retries
@ -119,10 +119,10 @@ func TestHealthStates(t *testing.T) {
t.Errorf("Expecting FailingStreak=2, but got %d\n", c.State.Health.FailingStreak) t.Errorf("Expecting FailingStreak=2, but got %d\n", c.State.Health.FailingStreak)
} }
handleResult(c.State.StartedAt.Add(60*time.Second), 1) handleResult(c.State.StartedAt.Add(60*time.Second), 1)
expect("health_status: unhealthy") expect(eventtypes.ActionHealthStatusUnhealthy)
handleResult(c.State.StartedAt.Add(80*time.Second), 0) handleResult(c.State.StartedAt.Add(80*time.Second), 0)
expect("health_status: healthy") expect(eventtypes.ActionHealthStatusHealthy)
if c.State.Health.FailingStreak != 0 { if c.State.Health.FailingStreak != 0 {
t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak) t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak)
} }
@ -148,7 +148,7 @@ func TestHealthStates(t *testing.T) {
t.Errorf("Expecting FailingStreak=1, but got %d\n", c.State.Health.FailingStreak) t.Errorf("Expecting FailingStreak=1, but got %d\n", c.State.Health.FailingStreak)
} }
handleResult(c.State.StartedAt.Add(80*time.Second), 0) handleResult(c.State.StartedAt.Add(80*time.Second), 0)
expect("health_status: healthy") expect(eventtypes.ActionHealthStatusHealthy)
if c.State.Health.FailingStreak != 0 { if c.State.Health.FailingStreak != 0 {
t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak) t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak)
} }

View file

@ -7,6 +7,7 @@ import (
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/backend" "github.com/docker/docker/api/types/backend"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
imagetype "github.com/docker/docker/api/types/image" imagetype "github.com/docker/docker/api/types/image"
"github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/registry"
@ -34,7 +35,7 @@ type ImageService interface {
PerformWithBaseFS(ctx context.Context, c *container.Container, fn func(string) error) error PerformWithBaseFS(ctx context.Context, c *container.Container, fn func(string) error) error
LoadImage(ctx context.Context, inTar io.ReadCloser, outStream io.Writer, quiet bool) error LoadImage(ctx context.Context, inTar io.ReadCloser, outStream io.Writer, quiet bool) error
Images(ctx context.Context, opts types.ImageListOptions) ([]*types.ImageSummary, error) Images(ctx context.Context, opts types.ImageListOptions) ([]*types.ImageSummary, error)
LogImageEvent(imageID, refName, action string) LogImageEvent(imageID, refName string, action events.Action)
CountImages() int CountImages() int
ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error) ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error)
ImportImage(ctx context.Context, ref reference.Named, platform *ocispec.Platform, msg string, layerReader io.Reader, changes []string) (image.ID, error) ImportImage(ctx context.Context, ref reference.Named, platform *ocispec.Platform, msg string, layerReader io.Reader, changes []string) (image.ID, error)

View file

@ -8,6 +8,7 @@ import (
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/events"
imagetypes "github.com/docker/docker/api/types/image" imagetypes "github.com/docker/docker/api/types/image"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
@ -105,7 +106,7 @@ func (i *ImageService) ImageDelete(ctx context.Context, imageRef string, force,
untaggedRecord := types.ImageDeleteResponseItem{Untagged: reference.FamiliarString(parsedRef)} untaggedRecord := types.ImageDeleteResponseItem{Untagged: reference.FamiliarString(parsedRef)}
i.LogImageEvent(imgID.String(), imgID.String(), "untag") i.LogImageEvent(imgID.String(), imgID.String(), events.ActionUnTag)
records = append(records, untaggedRecord) records = append(records, untaggedRecord)
repoRefs = i.referenceStore.References(imgID.Digest()) repoRefs = i.referenceStore.References(imgID.Digest())
@ -167,7 +168,7 @@ func (i *ImageService) ImageDelete(ctx context.Context, imageRef string, force,
untaggedRecord := types.ImageDeleteResponseItem{Untagged: reference.FamiliarString(parsedRef)} untaggedRecord := types.ImageDeleteResponseItem{Untagged: reference.FamiliarString(parsedRef)}
i.LogImageEvent(imgID.String(), imgID.String(), "untag") i.LogImageEvent(imgID.String(), imgID.String(), events.ActionUnTag)
records = append(records, untaggedRecord) records = append(records, untaggedRecord)
} }
} }
@ -248,7 +249,7 @@ func (i *ImageService) removeAllReferencesToImageID(imgID image.ID, records *[]t
if err != nil { if err != nil {
return err return err
} }
i.LogImageEvent(imgID.String(), imgID.String(), "untag") i.LogImageEvent(imgID.String(), imgID.String(), events.ActionUnTag)
*records = append(*records, types.ImageDeleteResponseItem{ *records = append(*records, types.ImageDeleteResponseItem{
Untagged: reference.FamiliarString(parsedRef), Untagged: reference.FamiliarString(parsedRef),
}) })
@ -325,7 +326,7 @@ func (i *ImageService) imageDeleteHelper(imgID image.ID, records *[]types.ImageD
return err return err
} }
i.LogImageEvent(imgID.String(), imgID.String(), "delete") i.LogImageEvent(imgID.String(), imgID.String(), events.ActionDelete)
*records = append(*records, types.ImageDeleteResponseItem{Deleted: imgID.String()}) *records = append(*records, types.ImageDeleteResponseItem{Deleted: imgID.String()})
for _, removedLayer := range removedLayers { for _, removedLayer := range removedLayers {
*records = append(*records, types.ImageDeleteResponseItem{Deleted: removedLayer.ChainID.String()}) *records = append(*records, types.ImageDeleteResponseItem{Deleted: removedLayer.ChainID.String()})

View file

@ -8,7 +8,7 @@ import (
) )
// LogImageEvent generates an event related to an image with only the default attributes. // LogImageEvent generates an event related to an image with only the default attributes.
func (i *ImageService) LogImageEvent(imageID, refName, action string) { func (i *ImageService) LogImageEvent(imageID, refName string, action events.Action) {
ctx := context.TODO() ctx := context.TODO()
attributes := map[string]string{} attributes := map[string]string{}

View file

@ -9,6 +9,7 @@ import (
"github.com/containerd/containerd/platforms" "github.com/containerd/containerd/platforms"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/builder/dockerfile" "github.com/docker/docker/builder/dockerfile"
"github.com/docker/docker/dockerversion" "github.com/docker/docker/dockerversion"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
@ -85,6 +86,6 @@ func (i *ImageService) ImportImage(ctx context.Context, newRef reference.Named,
} }
} }
i.LogImageEvent(id.String(), id.String(), "import") i.LogImageEvent(id.String(), id.String(), events.ActionImport)
return id, nil return id, nil
} }

View file

@ -147,7 +147,7 @@ deleteImagesLoop:
if canceled { if canceled {
log.G(ctx).Debugf("ImagesPrune operation cancelled: %#v", *rep) log.G(ctx).Debugf("ImagesPrune operation cancelled: %#v", *rep)
} }
i.eventsService.Log("prune", events.ImageEventType, events.Actor{ i.eventsService.Log(events.ActionPrune, events.ImageEventType, events.Actor{
Attributes: map[string]string{ Attributes: map[string]string{
"reclaimed": strconv.FormatUint(rep.SpaceReclaimed, 10), "reclaimed": strconv.FormatUint(rep.SpaceReclaimed, 10),
}, },

View file

@ -4,6 +4,7 @@ import (
"context" "context"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/image" "github.com/docker/docker/image"
) )
@ -16,6 +17,6 @@ func (i *ImageService) TagImage(ctx context.Context, imageID image.ID, newTag re
if err := i.imageStore.SetLastUpdated(imageID); err != nil { if err := i.imageStore.SetLastUpdated(imageID); err != nil {
return err return err
} }
i.LogImageEvent(imageID.String(), reference.FamiliarString(newTag), "tag") i.LogImageEvent(imageID.String(), reference.FamiliarString(newTag), events.ActionTag)
return nil return nil
} }

View file

@ -9,6 +9,7 @@ import (
"time" "time"
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types/events"
containerpkg "github.com/docker/docker/container" containerpkg "github.com/docker/docker/container"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/moby/sys/signal" "github.com/moby/sys/signal"
@ -126,7 +127,7 @@ func (daemon *Daemon) killWithSignal(container *containerpkg.Container, stopSign
} }
} }
daemon.LogContainerEventWithAttributes(container, "kill", map[string]string{ daemon.LogContainerEventWithAttributes(container, events.ActionKill, map[string]string{
"signal": strconv.Itoa(int(stopSignal)), "signal": strconv.Itoa(int(stopSignal)),
}) })
return nil return nil

View file

@ -7,6 +7,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/daemon/config" "github.com/docker/docker/daemon/config"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
@ -110,7 +111,7 @@ func (daemon *Daemon) handleContainerExit(c *container.Container, e *libcontaine
daemon.setStateCounter(c) daemon.setStateCounter(c)
checkpointErr := c.CheckpointTo(daemon.containersReplica) checkpointErr := c.CheckpointTo(daemon.containersReplica)
daemon.LogContainerEventWithAttributes(c, "die", attributes) daemon.LogContainerEventWithAttributes(c, events.ActionDie, attributes)
if restart { if restart {
go func() { go func() {
@ -168,7 +169,7 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerdtypes.EventType, ei
return err return err
} }
daemon.LogContainerEvent(c, "oom") daemon.LogContainerEvent(c, events.ActionOOM)
case libcontainerdtypes.EventExit: case libcontainerdtypes.EventExit:
if ei.ProcessID == ei.ContainerID { if ei.ProcessID == ei.ContainerID {
return daemon.handleContainerExit(c, &ei) return daemon.handleContainerExit(c, &ei)
@ -219,7 +220,7 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerdtypes.EventType, ei
}() }()
} }
} }
daemon.LogContainerEventWithAttributes(c, "exec_die", map[string]string{ daemon.LogContainerEventWithAttributes(c, events.ActionExecDie, map[string]string{
"execID": ei.ProcessID, "execID": ei.ProcessID,
"exitCode": strconv.Itoa(exitCode), "exitCode": strconv.Itoa(exitCode),
}) })
@ -263,7 +264,7 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerdtypes.EventType, ei
if err := c.CheckpointTo(daemon.containersReplica); err != nil { if err := c.CheckpointTo(daemon.containersReplica); err != nil {
return err return err
} }
daemon.LogContainerEvent(c, "start") daemon.LogContainerEvent(c, events.ActionStart)
} }
case libcontainerdtypes.EventPaused: case libcontainerdtypes.EventPaused:
@ -277,7 +278,7 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerdtypes.EventType, ei
if err := c.CheckpointTo(daemon.containersReplica); err != nil { if err := c.CheckpointTo(daemon.containersReplica); err != nil {
return err return err
} }
daemon.LogContainerEvent(c, "pause") daemon.LogContainerEvent(c, events.ActionPause)
} }
case libcontainerdtypes.EventResumed: case libcontainerdtypes.EventResumed:
c.Lock() c.Lock()
@ -291,7 +292,7 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerdtypes.EventType, ei
if err := c.CheckpointTo(daemon.containersReplica); err != nil { if err := c.CheckpointTo(daemon.containersReplica); err != nil {
return err return err
} }
daemon.LogContainerEvent(c, "unpause") daemon.LogContainerEvent(c, events.ActionUnPause)
} }
} }
return nil return nil

View file

@ -13,6 +13,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
"github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/network"
"github.com/docker/docker/container" "github.com/docker/docker/container"
@ -388,7 +389,7 @@ func (daemon *Daemon) createNetwork(cfg *config.Config, create types.NetworkCrea
if create.IPAM != nil { if create.IPAM != nil {
daemon.pluginRefCount(create.IPAM.Driver, ipamapi.PluginEndpointType, plugingetter.Acquire) daemon.pluginRefCount(create.IPAM.Driver, ipamapi.PluginEndpointType, plugingetter.Acquire)
} }
daemon.LogNetworkEvent(n, "create") daemon.LogNetworkEvent(n, events.ActionCreate)
return &types.NetworkCreateResponse{ return &types.NetworkCreateResponse{
ID: n.ID(), ID: n.ID(),
@ -555,7 +556,7 @@ func (daemon *Daemon) deleteNetwork(nw *libnetwork.Network, dynamic bool) error
daemon.pluginRefCount(nw.Type(), driverapi.NetworkPluginEndpointType, plugingetter.Release) daemon.pluginRefCount(nw.Type(), driverapi.NetworkPluginEndpointType, plugingetter.Release)
ipamType, _, _, _ := nw.IpamConfig() ipamType, _, _, _ := nw.IpamConfig()
daemon.pluginRefCount(ipamType, ipamapi.PluginEndpointType, plugingetter.Release) daemon.pluginRefCount(ipamType, ipamapi.PluginEndpointType, plugingetter.Release)
daemon.LogNetworkEvent(nw, "destroy") daemon.LogNetworkEvent(nw, events.ActionDestroy)
} }
return nil return nil

View file

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
) )
@ -46,7 +47,7 @@ func (daemon *Daemon) containerPause(container *container.Container) error {
container.Paused = true container.Paused = true
daemon.setStateCounter(container) daemon.setStateCounter(container)
daemon.updateHealthMonitor(container) daemon.updateHealthMonitor(container)
daemon.LogContainerEvent(container, "pause") daemon.LogContainerEvent(container, events.ActionPause)
if err := container.CheckpointTo(daemon.containersReplica); err != nil { if err := container.CheckpointTo(daemon.containersReplica); err != nil {
log.G(context.TODO()).WithError(err).Warn("could not save container to disk") log.G(context.TODO()).WithError(err).Warn("could not save container to disk")

View file

@ -89,7 +89,7 @@ func (daemon *Daemon) ContainersPrune(ctx context.Context, pruneFilters filters.
rep.ContainersDeleted = append(rep.ContainersDeleted, c.ID) rep.ContainersDeleted = append(rep.ContainersDeleted, c.ID)
} }
} }
daemon.EventsService.Log("prune", events.ContainerEventType, events.Actor{ daemon.EventsService.Log(events.ActionPrune, events.ContainerEventType, events.Actor{
Attributes: map[string]string{"reclaimed": strconv.FormatUint(rep.SpaceReclaimed, 10)}, Attributes: map[string]string{"reclaimed": strconv.FormatUint(rep.SpaceReclaimed, 10)},
}) })
return rep, nil return rep, nil
@ -216,7 +216,7 @@ func (daemon *Daemon) NetworksPrune(ctx context.Context, pruneFilters filters.Ar
return rep, nil return rep, nil
default: default:
} }
daemon.EventsService.Log("prune", events.NetworkEventType, events.Actor{ daemon.EventsService.Log(events.ActionPrune, events.NetworkEventType, events.Actor{
Attributes: map[string]string{"reclaimed": "0"}, Attributes: map[string]string{"reclaimed": "0"},
}) })
return rep, nil return rep, nil

View file

@ -7,6 +7,7 @@ import (
"strconv" "strconv"
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types/events"
"github.com/hashicorp/go-multierror" "github.com/hashicorp/go-multierror"
"github.com/mitchellh/copystructure" "github.com/mitchellh/copystructure"
@ -127,7 +128,7 @@ func (daemon *Daemon) Reload(conf *config.Config) error {
}) })
log.G(context.TODO()).Infof("Reloaded configuration: %s", jsonString) log.G(context.TODO()).Infof("Reloaded configuration: %s", jsonString)
daemon.configStore.Store(newCfg) daemon.configStore.Store(newCfg)
daemon.LogDaemonEventWithAttributes("reload", attributes) daemon.LogDaemonEventWithAttributes(events.ActionReload, attributes)
return txn.Commit() return txn.Commit()
} }

View file

@ -5,6 +5,7 @@ import (
"strings" "strings"
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types/events"
dockercontainer "github.com/docker/docker/container" dockercontainer "github.com/docker/docker/container"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/docker/docker/libnetwork" "github.com/docker/docker/libnetwork"
@ -93,7 +94,7 @@ func (daemon *Daemon) ContainerRename(oldName, newName string) error {
} }
if !container.Running { if !container.Running {
daemon.LogContainerEventWithAttributes(container, "rename", attributes) daemon.LogContainerEventWithAttributes(container, events.ActionRename, attributes)
return nil return nil
} }
@ -120,6 +121,6 @@ func (daemon *Daemon) ContainerRename(oldName, newName string) error {
} }
} }
daemon.LogContainerEventWithAttributes(container, "rename", attributes) daemon.LogContainerEventWithAttributes(container, events.ActionRename, attributes)
return nil return nil
} }

View file

@ -6,6 +6,7 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
) )
@ -25,7 +26,7 @@ func (daemon *Daemon) ContainerResize(name string, height, width int) error {
} }
if err = tsk.Resize(context.Background(), uint32(width), uint32(height)); err == nil { if err = tsk.Resize(context.Background(), uint32(width), uint32(height)); err == nil {
daemon.LogContainerEventWithAttributes(container, "resize", map[string]string{ daemon.LogContainerEventWithAttributes(container, events.ActionResize, map[string]string{
"height": strconv.Itoa(height), "height": strconv.Itoa(height),
"width": strconv.Itoa(width), "width": strconv.Itoa(width),
}) })

View file

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
) )
@ -64,6 +65,6 @@ func (daemon *Daemon) containerRestart(ctx context.Context, daemonCfg *configSto
return err return err
} }
daemon.LogContainerEvent(container, "restart") daemon.LogContainerEvent(container, events.ActionRestart)
return nil return nil
} }

View file

@ -8,6 +8,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/docker/docker/libcontainerd" "github.com/docker/docker/libcontainerd"
@ -222,7 +223,7 @@ func (daemon *Daemon) containerStart(ctx context.Context, daemonCfg *configStore
Errorf("failed to store container") Errorf("failed to store container")
} }
daemon.LogContainerEvent(container, "start") daemon.LogContainerEvent(container, events.ActionStart)
containerActions.WithValues("start").UpdateSince(start) containerActions.WithValues("start").UpdateSince(start)
return nil return nil

View file

@ -6,6 +6,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
containertypes "github.com/docker/docker/api/types/container" containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/moby/sys/signal" "github.com/moby/sys/signal"
@ -73,7 +74,7 @@ func (daemon *Daemon) containerStop(_ context.Context, ctr *container.Container,
} }
defer func() { defer func() {
if retErr == nil { if retErr == nil {
daemon.LogContainerEvent(ctr, "stop") daemon.LogContainerEvent(ctr, events.ActionStop)
} }
}() }()

View file

@ -12,6 +12,7 @@ import (
"strings" "strings"
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
libcontainerdtypes "github.com/docker/docker/libcontainerd/types" libcontainerdtypes "github.com/docker/docker/libcontainerd/types"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -198,6 +199,6 @@ func (daemon *Daemon) ContainerTop(name string, psArgs string) (*container.Conta
if err != nil { if err != nil {
return nil, err return nil, err
} }
daemon.LogContainerEvent(ctr, "top") daemon.LogContainerEvent(ctr, events.ActionTop)
return procList, nil return procList, nil
} }

View file

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/container" "github.com/docker/docker/container"
) )
@ -38,7 +39,7 @@ func (daemon *Daemon) containerUnpause(ctr *container.Container) error {
ctr.Paused = false ctr.Paused = false
daemon.setStateCounter(ctr) daemon.setStateCounter(ctr)
daemon.updateHealthMonitor(ctr) daemon.updateHealthMonitor(ctr)
daemon.LogContainerEvent(ctr, "unpause") daemon.LogContainerEvent(ctr, events.ActionUnPause)
if err := ctr.CheckpointTo(daemon.containersReplica); err != nil { if err := ctr.CheckpointTo(daemon.containersReplica); err != nil {
log.G(context.TODO()).WithError(err).Warn("could not save container to disk") log.G(context.TODO()).WithError(err).Warn("could not save container to disk")

View file

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
@ -75,7 +76,7 @@ func (daemon *Daemon) update(name string, hostConfig *container.HostConfig) erro
ctr.UpdateMonitor(hostConfig.RestartPolicy) ctr.UpdateMonitor(hostConfig.RestartPolicy)
} }
defer daemon.LogContainerEvent(ctr, "update") defer daemon.LogContainerEvent(ctr, events.ActionUpdate)
// If container is not running, update hostConfig struct is enough, // If container is not running, update hostConfig struct is enough,
// resources will be updated when the container is started again. // resources will be updated when the container is started again.

View file

@ -9,6 +9,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/docker/docker/api/types/events"
mounttypes "github.com/docker/docker/api/types/mount" mounttypes "github.com/docker/docker/api/types/mount"
"github.com/docker/docker/container" "github.com/docker/docker/container"
volumemounts "github.com/docker/docker/volume/mounts" volumemounts "github.com/docker/docker/volume/mounts"
@ -73,7 +74,7 @@ func (daemon *Daemon) setupMounts(c *container.Container) ([]container.Mount, er
mnt.ReadOnlyForceRecursive = m.Spec.BindOptions.ReadOnlyForceRecursive mnt.ReadOnlyForceRecursive = m.Spec.BindOptions.ReadOnlyForceRecursive
} }
if m.Volume != nil { if m.Volume != nil {
daemon.LogVolumeEvent(m.Volume.Name(), "mount", map[string]string{ daemon.LogVolumeEvent(m.Volume.Name(), events.ActionMount, map[string]string{
"driver": m.Volume.DriverName(), "driver": m.Volume.DriverName(),
"container": c.ID, "container": c.ID,
"destination": m.Destination, "destination": m.Destination,

View file

@ -9,6 +9,7 @@ import (
"github.com/docker/distribution" "github.com/docker/distribution"
"github.com/docker/distribution/manifest/schema2" "github.com/docker/distribution/manifest/schema2"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/distribution/metadata" "github.com/docker/docker/distribution/metadata"
"github.com/docker/docker/distribution/xfer" "github.com/docker/docker/distribution/xfer"
@ -38,7 +39,7 @@ type Config struct {
// and endpoint lookup. // and endpoint lookup.
RegistryService RegistryResolver RegistryService RegistryResolver
// ImageEventLogger notifies events for a given image // ImageEventLogger notifies events for a given image
ImageEventLogger func(id, name, action string) ImageEventLogger func(id, name string, action events.Action)
// MetadataStore is the storage backend for distribution-specific // MetadataStore is the storage backend for distribution-specific
// metadata. // metadata.
MetadataStore metadata.Store MetadataStore metadata.Store

View file

@ -7,6 +7,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api" "github.com/docker/docker/api"
"github.com/docker/docker/api/types/events"
refstore "github.com/docker/docker/reference" refstore "github.com/docker/docker/reference"
"github.com/opencontainers/go-digest" "github.com/opencontainers/go-digest"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -73,7 +74,7 @@ func Pull(ctx context.Context, ref reference.Named, config *ImagePullConfig, loc
return translatePullError(err, ref) return translatePullError(err, ref)
} }
config.ImageEventLogger(reference.FamiliarString(ref), reference.FamiliarName(repoInfo.Name), "pull") config.ImageEventLogger(reference.FamiliarString(ref), reference.FamiliarName(repoInfo.Name), events.ActionPull)
return nil return nil
} }

View file

@ -9,6 +9,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/pkg/progress" "github.com/docker/docker/pkg/progress"
) )
@ -77,7 +78,7 @@ func Push(ctx context.Context, ref reference.Named, config *ImagePushConfig) err
return err return err
} }
config.ImageEventLogger(reference.FamiliarString(ref), reference.FamiliarName(repoInfo.Name), "push") config.ImageEventLogger(reference.FamiliarString(ref), reference.FamiliarName(repoInfo.Name), events.ActionPush)
return nil return nil
} }

View file

@ -14,6 +14,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/distribution" "github.com/docker/distribution"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/image" "github.com/docker/docker/image"
v1 "github.com/docker/docker/image/v1" v1 "github.com/docker/docker/image/v1"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
@ -137,7 +138,7 @@ func (l *tarexporter) Load(inTar io.ReadCloser, outStream io.Writer, quiet bool)
} }
parentLinks = append(parentLinks, parentLink{imgID, m.Parent}) parentLinks = append(parentLinks, parentLink{imgID, m.Parent})
l.loggerImgEvent.LogImageEvent(imgID.String(), imgID.String(), "load") l.loggerImgEvent.LogImageEvent(imgID.String(), imgID.String(), events.ActionLoad)
} }
for _, p := range validatedParentLinks(parentLinks) { for _, p := range validatedParentLinks(parentLinks) {

View file

@ -12,6 +12,7 @@ import (
"github.com/containerd/containerd/images" "github.com/containerd/containerd/images"
"github.com/docker/distribution" "github.com/docker/distribution"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/image" "github.com/docker/docker/image"
v1 "github.com/docker/docker/image/v1" v1 "github.com/docker/docker/image/v1"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
@ -290,7 +291,7 @@ func (s *saveSession) save(outStream io.Writer) error {
parentID, _ := s.is.GetParent(id) parentID, _ := s.is.GetParent(id)
parentLinks = append(parentLinks, parentLink{id, parentID}) parentLinks = append(parentLinks, parentLink{id, parentID})
s.tarexporter.loggerImgEvent.LogImageEvent(id.String(), id.String(), "save") s.tarexporter.loggerImgEvent.LogImageEvent(id.String(), id.String(), events.ActionSave)
} }
for i, p := range validatedParentLinks(parentLinks) { for i, p := range validatedParentLinks(parentLinks) {

View file

@ -2,6 +2,7 @@ package tarexport // import "github.com/docker/docker/image/tarexport"
import ( import (
"github.com/docker/distribution" "github.com/docker/distribution"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/image" "github.com/docker/docker/image"
"github.com/docker/docker/layer" "github.com/docker/docker/layer"
refstore "github.com/docker/docker/reference" refstore "github.com/docker/docker/reference"
@ -36,7 +37,7 @@ type tarexporter struct {
// LogImageEvent defines interface for event generation related to image tar(load and save) operations // LogImageEvent defines interface for event generation related to image tar(load and save) operations
type LogImageEvent interface { type LogImageEvent interface {
// LogImageEvent generates an event related to an image operation // LogImageEvent generates an event related to an image operation
LogImageEvent(imageID, refName, action string) LogImageEvent(imageID, refName string, action events.Action)
} }
// NewTarExporter returns new Exporter for tar packages // NewTarExporter returns new Exporter for tar packages

View file

@ -736,7 +736,7 @@ func (s *DockerCLIEventSuite) TestEventsFormat(c *testing.T) {
break break
} }
assert.NilError(c, err) assert.NilError(c, err)
if ev.Action == "start" { if ev.Action == eventtypes.ActionStart {
startCount++ startCount++
} }
} }

View file

@ -50,7 +50,7 @@ func TestPause(t *testing.T) {
Until: until, Until: until,
Filters: filters.NewArgs(filters.Arg(string(events.ContainerEventType), cID)), Filters: filters.NewArgs(filters.Arg(string(events.ContainerEventType), cID)),
}) })
assert.Check(t, is.DeepEqual([]string{"pause", "unpause"}, getEventActions(t, messages, errs))) assert.Check(t, is.DeepEqual([]events.Action{events.ActionPause, events.ActionUnPause}, getEventActions(t, messages, errs)))
} }
func TestPauseFailsOnWindowsServerContainers(t *testing.T) { func TestPauseFailsOnWindowsServerContainers(t *testing.T) {
@ -87,9 +87,9 @@ func TestPauseStopPausedContainer(t *testing.T) {
poll.WaitOn(t, container.IsStopped(ctx, apiClient, cID), poll.WithDelay(100*time.Millisecond)) poll.WaitOn(t, container.IsStopped(ctx, apiClient, cID), poll.WithDelay(100*time.Millisecond))
} }
func getEventActions(t *testing.T, messages <-chan events.Message, errs <-chan error) []string { func getEventActions(t *testing.T, messages <-chan events.Message, errs <-chan error) []events.Action {
t.Helper() t.Helper()
var actions []string var actions []events.Action
for { for {
select { select {
case err := <-errs: case err := <-errs:

View file

@ -232,10 +232,10 @@ func TestAuthZPluginAllowEventStream(t *testing.T) {
select { select {
case event := <-events: case event := <-events:
if event.Type == eventtypes.ContainerEventType && event.Actor.ID == cID { if event.Type == eventtypes.ContainerEventType && event.Actor.ID == cID {
if event.Action == "create" { if event.Action == eventtypes.ActionCreate {
created = true created = true
} }
if event.Action == "start" { if event.Action == eventtypes.ActionStart {
started = true started = true
} }
} }

View file

@ -46,7 +46,7 @@ func TestEventsExecDie(t *testing.T) {
msg, errs := client.Events(ctx, types.EventsOptions{ msg, errs := client.Events(ctx, types.EventsOptions{
Filters: filters.NewArgs( Filters: filters.NewArgs(
filters.Arg("container", cID), filters.Arg("container", cID),
filters.Arg("event", "exec_die"), filters.Arg("event", string(events.ActionExecDie)),
), ),
}) })
@ -62,7 +62,7 @@ func TestEventsExecDie(t *testing.T) {
case m := <-msg: case m := <-msg:
assert.Equal(t, m.Type, events.ContainerEventType) assert.Equal(t, m.Type, events.ContainerEventType)
assert.Equal(t, m.Actor.ID, cID) assert.Equal(t, m.Actor.ID, cID)
assert.Equal(t, m.Action, "exec_die") assert.Equal(t, m.Action, events.ActionExecDie)
assert.Equal(t, m.Actor.Attributes["execID"], id.ID) assert.Equal(t, m.Actor.Attributes["execID"], id.ID)
assert.Equal(t, m.Actor.Attributes["exitCode"], "0") assert.Equal(t, m.Actor.Attributes["exitCode"], "0")
case err = <-errs: case err = <-errs:

View file

@ -23,6 +23,7 @@ import (
"github.com/docker/distribution/manifest/schema2" "github.com/docker/distribution/manifest/schema2"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
"github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/dockerversion" "github.com/docker/docker/dockerversion"
@ -69,7 +70,7 @@ func (pm *Manager) Disable(refOrID string, config *types.PluginDisableConfig) er
return err return err
} }
pm.publisher.Publish(EventDisable{Plugin: p.PluginObj}) pm.publisher.Publish(EventDisable{Plugin: p.PluginObj})
pm.config.LogPluginEvent(p.GetID(), refOrID, "disable") pm.config.LogPluginEvent(p.GetID(), refOrID, events.ActionDisable)
return nil return nil
} }
@ -85,7 +86,7 @@ func (pm *Manager) Enable(refOrID string, config *types.PluginEnableConfig) erro
return err return err
} }
pm.publisher.Publish(EventEnable{Plugin: p.PluginObj}) pm.publisher.Publish(EventEnable{Plugin: p.PluginObj})
pm.config.LogPluginEvent(p.GetID(), refOrID, "enable") pm.config.LogPluginEvent(p.GetID(), refOrID, events.ActionEnable)
return nil return nil
} }
@ -239,7 +240,7 @@ func (pm *Manager) Upgrade(ctx context.Context, ref reference.Named, name string
if err := pm.fetch(ctx, ref, authConfig, out, metaHeader, storeFetchMetadata(&md), childrenHandler(pm.blobStore), applyLayer(pm.blobStore, tmpRootFSDir, out)); err != nil { if err := pm.fetch(ctx, ref, authConfig, out, metaHeader, storeFetchMetadata(&md), childrenHandler(pm.blobStore), applyLayer(pm.blobStore, tmpRootFSDir, out)); err != nil {
return err return err
} }
pm.config.LogPluginEvent(reference.FamiliarString(ref), name, "pull") pm.config.LogPluginEvent(reference.FamiliarString(ref), name, events.ActionPull)
if err := validateFetchedMetadata(md); err != nil { if err := validateFetchedMetadata(md); err != nil {
return err return err
@ -285,7 +286,7 @@ func (pm *Manager) Pull(ctx context.Context, ref reference.Named, name string, m
if err := pm.fetch(ctx, ref, authConfig, out, metaHeader, storeFetchMetadata(&md), childrenHandler(pm.blobStore), applyLayer(pm.blobStore, tmpRootFSDir, out)); err != nil { if err := pm.fetch(ctx, ref, authConfig, out, metaHeader, storeFetchMetadata(&md), childrenHandler(pm.blobStore), applyLayer(pm.blobStore, tmpRootFSDir, out)); err != nil {
return err return err
} }
pm.config.LogPluginEvent(reference.FamiliarString(ref), name, "pull") pm.config.LogPluginEvent(reference.FamiliarString(ref), name, events.ActionPull)
if err := validateFetchedMetadata(md); err != nil { if err := validateFetchedMetadata(md); err != nil {
return err return err
@ -599,7 +600,7 @@ func (pm *Manager) Remove(name string, config *types.PluginRmConfig) error {
} }
pm.config.Store.Remove(p) pm.config.Store.Remove(p)
pm.config.LogPluginEvent(id, name, "remove") pm.config.LogPluginEvent(id, name, events.ActionRemove)
pm.publisher.Publish(EventRemove{Plugin: p.PluginObj}) pm.publisher.Publish(EventRemove{Plugin: p.PluginObj})
return nil return nil
} }
@ -727,7 +728,7 @@ func (pm *Manager) CreateFromContext(ctx context.Context, tarCtx io.ReadCloser,
p.PluginObj.PluginReference = name p.PluginObj.PluginReference = name
pm.publisher.Publish(EventCreate{Plugin: p.PluginObj}) pm.publisher.Publish(EventCreate{Plugin: p.PluginObj})
pm.config.LogPluginEvent(p.PluginObj.ID, name, "create") pm.config.LogPluginEvent(p.PluginObj.ID, name, events.ActionCreate)
return nil return nil
} }

View file

@ -17,6 +17,7 @@ import (
"github.com/containerd/containerd/content/local" "github.com/containerd/containerd/content/local"
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/pkg/authorization" "github.com/docker/docker/pkg/authorization"
"github.com/docker/docker/pkg/containerfs" "github.com/docker/docker/pkg/containerfs"
"github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/ioutils"
@ -56,7 +57,7 @@ func (pm *Manager) restorePlugin(p *v2.Plugin, c *controller) error {
return nil return nil
} }
type eventLogger func(id, name, action string) type eventLogger func(id, name string, action events.Action)
// ManagerConfig defines configuration needed to start new manager. // ManagerConfig defines configuration needed to start new manager.
type ManagerConfig struct { type ManagerConfig struct {

View file

@ -9,6 +9,7 @@ import (
"testing" "testing"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/pkg/containerfs" "github.com/docker/docker/pkg/containerfs"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
v2 "github.com/docker/docker/plugin/v2" v2 "github.com/docker/docker/plugin/v2"
@ -40,7 +41,7 @@ func TestManagerWithPluginMounts(t *testing.T) {
Root: managerRoot, Root: managerRoot,
ExecRoot: filepath.Join(root, "exec"), ExecRoot: filepath.Join(root, "exec"),
CreateExecutor: func(*Manager) (Executor, error) { return nil, nil }, CreateExecutor: func(*Manager) (Executor, error) { return nil, nil },
LogPluginEvent: func(_, _, _ string) {}, LogPluginEvent: func(_, _ string, _ events.Action) {},
}) })
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@ -112,7 +113,7 @@ func TestCreateFailed(t *testing.T) {
Root: managerRoot, Root: managerRoot,
ExecRoot: filepath.Join(root, "exec"), ExecRoot: filepath.Join(root, "exec"),
CreateExecutor: func(*Manager) (Executor, error) { return &simpleExecutor{}, nil }, CreateExecutor: func(*Manager) (Executor, error) { return &simpleExecutor{}, nil },
LogPluginEvent: func(_, _, _ string) {}, LogPluginEvent: func(_, _ string, _ events.Action) {},
}) })
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@ -181,13 +182,13 @@ func TestPluginAlreadyRunningOnStartup(t *testing.T) {
{ {
desc: "live-restore-disabled", desc: "live-restore-disabled",
config: ManagerConfig{ config: ManagerConfig{
LogPluginEvent: func(_, _, _ string) {}, LogPluginEvent: func(_, _ string, _ events.Action) {},
}, },
}, },
{ {
desc: "live-restore-enabled", desc: "live-restore-enabled",
config: ManagerConfig{ config: ManagerConfig{
LogPluginEvent: func(_, _, _ string) {}, LogPluginEvent: func(_, _ string, _ events.Action) {},
LiveRestoreEnabled: true, LiveRestoreEnabled: true,
}, },
}, },

View file

@ -781,7 +781,7 @@ func (d *Daemon) ReloadConfig() error {
if e.Type != events.DaemonEventType { if e.Type != events.DaemonEventType {
continue continue
} }
if e.Action != "reload" { if e.Action != events.ActionReload {
continue continue
} }
close(errCh) // notify that we are done close(errCh) // notify that we are done

View file

@ -10,6 +10,7 @@ import (
"time" "time"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/registry"
"github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/archive"
"github.com/docker/docker/plugin" "github.com/docker/docker/plugin"
@ -117,7 +118,7 @@ func CreateInRegistry(ctx context.Context, repo string, auth *registry.AuthConfi
Root: filepath.Join(tmpDir, "root"), Root: filepath.Join(tmpDir, "root"),
ExecRoot: "/run/docker", // manager init fails if not set ExecRoot: "/run/docker", // manager init fails if not set
CreateExecutor: dummyExec, CreateExecutor: dummyExec,
LogPluginEvent: func(id, name, action string) {}, // panics when not set LogPluginEvent: func(id, name string, action events.Action) {}, // panics when not set
} }
manager, err := plugin.NewManager(managerConfig) manager, err := plugin.NewManager(managerConfig)
if err != nil { if err != nil {

View file

@ -7,6 +7,7 @@ import (
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
volumetypes "github.com/docker/docker/api/types/volume" volumetypes "github.com/docker/docker/api/types/volume"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
@ -27,7 +28,7 @@ type ds interface {
// VolumeEventLogger interface provides methods to log volume-related events // VolumeEventLogger interface provides methods to log volume-related events
type VolumeEventLogger interface { type VolumeEventLogger interface {
// LogVolumeEvent generates an event related to a volume. // LogVolumeEvent generates an event related to a volume.
LogVolumeEvent(volumeID, action string, attributes map[string]string) LogVolumeEvent(volumeID string, action events.Action, attributes map[string]string)
} }
// VolumesService manages access to volumes // VolumesService manages access to volumes
@ -248,7 +249,7 @@ func (s *VolumesService) Prune(ctx context.Context, filter filters.Args) (*types
rep.SpaceReclaimed += uint64(vSize) rep.SpaceReclaimed += uint64(vSize)
rep.VolumesDeleted = append(rep.VolumesDeleted, v.Name()) rep.VolumesDeleted = append(rep.VolumesDeleted, v.Name())
} }
s.eventLogger.LogVolumeEvent("", "prune", map[string]string{ s.eventLogger.LogVolumeEvent("", events.ActionPrune, map[string]string{
"reclaimed": strconv.FormatInt(int64(rep.SpaceReclaimed), 10), "reclaimed": strconv.FormatInt(int64(rep.SpaceReclaimed), 10),
}) })
return rep, nil return rep, nil

View file

@ -5,6 +5,7 @@ import (
"os" "os"
"testing" "testing"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/docker/docker/volume" "github.com/docker/docker/volume"
@ -248,4 +249,4 @@ func newTestService(t *testing.T, ds *volumedrivers.Store) (*VolumesService, fun
type dummyEventLogger struct{} type dummyEventLogger struct{}
func (dummyEventLogger) LogVolumeEvent(_, _ string, _ map[string]string) {} func (dummyEventLogger) LogVolumeEvent(_ string, _ events.Action, _ map[string]string) {}

View file

@ -10,6 +10,7 @@ import (
"time" "time"
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/errdefs" "github.com/docker/docker/errdefs"
"github.com/docker/docker/volume" "github.com/docker/docker/volume"
"github.com/docker/docker/volume/drivers" "github.com/docker/docker/volume/drivers"
@ -501,7 +502,7 @@ func (s *VolumeStore) Create(ctx context.Context, name, driverName string, creat
} }
if created && s.eventLogger != nil { if created && s.eventLogger != nil {
s.eventLogger.LogVolumeEvent(v.Name(), "create", map[string]string{"driver": v.DriverName()}) s.eventLogger.LogVolumeEvent(v.Name(), events.ActionCreate, map[string]string{"driver": v.DriverName()})
} }
s.setNamed(v, cfg.Reference) s.setNamed(v, cfg.Reference)
return v, nil return v, nil
@ -833,7 +834,7 @@ func (s *VolumeStore) Remove(ctx context.Context, v volume.Volume, rmOpts ...opt
} }
} }
if err == nil && s.eventLogger != nil { if err == nil && s.eventLogger != nil {
s.eventLogger.LogVolumeEvent(v.Name(), "destroy", map[string]string{"driver": v.DriverName()}) s.eventLogger.LogVolumeEvent(v.Name(), events.ActionDestroy, map[string]string{"driver": v.DriverName()})
} }
return err return err
} }