daemon/events.go
4f2a5ba3
 package daemon
 
6bb0d181
 import (
72f1881d
 	"strings"
55053d35
 	"time"
72f1881d
 
6bb0d181
 	"github.com/docker/docker/container"
55053d35
 	daemonevents "github.com/docker/docker/daemon/events"
907407d0
 	"github.com/docker/engine-api/types/events"
55053d35
 	"github.com/docker/engine-api/types/filters"
72f1881d
 	"github.com/docker/libnetwork"
6bb0d181
 )
 
1d8ccc6a
 // LogContainerEvent generates an event related to a container with only the default attributes.
6bb0d181
 func (daemon *Daemon) LogContainerEvent(container *container.Container, action string) {
1d8ccc6a
 	daemon.LogContainerEventWithAttributes(container, action, map[string]string{})
 }
 
 // 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) {
 	copyAttributes(attributes, container.Config.Labels)
72f1881d
 	if container.Config.Image != "" {
 		attributes["image"] = container.Config.Image
 	}
 	attributes["name"] = strings.TrimLeft(container.Name, "/")
 
 	actor := events.Actor{
 		ID:         container.ID,
 		Attributes: attributes,
 	}
 	daemon.EventsService.Log(action, events.ContainerEventType, actor)
 }
 
718eba88
 // LogImageEvent generates an event related to an image with only the default attributes.
72f1881d
 func (daemon *Daemon) LogImageEvent(imageID, refName, action string) {
1d8ccc6a
 	daemon.LogImageEventWithAttributes(imageID, refName, action, map[string]string{})
 }
 
718eba88
 // LogImageEventWithAttributes generates an event related to an image with specific given attributes.
1d8ccc6a
 func (daemon *Daemon) LogImageEventWithAttributes(imageID, refName, action string, attributes map[string]string) {
72f1881d
 	img, err := daemon.GetImage(imageID)
 	if err == nil && img.Config != nil {
 		// image has not been removed yet.
 		// it could be missing if the event is `delete`.
1d8ccc6a
 		copyAttributes(attributes, img.Config.Labels)
72f1881d
 	}
 	if refName != "" {
 		attributes["name"] = refName
 	}
 	actor := events.Actor{
 		ID:         imageID,
 		Attributes: attributes,
 	}
 
 	daemon.EventsService.Log(action, events.ImageEventType, actor)
 }
 
4d529895
 // LogPluginEvent generates an event related to a plugin with only the default attributes.
 func (daemon *Daemon) LogPluginEvent(pluginID, refName, action string) {
 	daemon.LogPluginEventWithAttributes(pluginID, refName, action, map[string]string{})
 }
 
 // LogPluginEventWithAttributes generates an event related to a plugin with specific given attributes.
 func (daemon *Daemon) LogPluginEventWithAttributes(pluginID, refName, action string, attributes map[string]string) {
 	attributes["name"] = refName
 	actor := events.Actor{
 		ID:         pluginID,
 		Attributes: attributes,
 	}
 	daemon.EventsService.Log(action, events.PluginEventType, actor)
 }
 
72f1881d
 // LogVolumeEvent generates an event related to a volume.
 func (daemon *Daemon) LogVolumeEvent(volumeID, action string, attributes map[string]string) {
 	actor := events.Actor{
 		ID:         volumeID,
 		Attributes: attributes,
 	}
 	daemon.EventsService.Log(action, events.VolumeEventType, actor)
 }
 
 // LogNetworkEvent generates an event related to a network with only the default attributes.
 func (daemon *Daemon) LogNetworkEvent(nw libnetwork.Network, action string) {
 	daemon.LogNetworkEventWithAttributes(nw, action, map[string]string{})
 }
 
 // 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) {
 	attributes["name"] = nw.Name()
 	attributes["type"] = nw.Type()
 	actor := events.Actor{
f15af1ef
 		ID:         nw.ID(),
72f1881d
 		Attributes: attributes,
 	}
 	daemon.EventsService.Log(action, events.NetworkEventType, actor)
 }
 
382c152a
 // LogDaemonEventWithAttributes generates an event related to the daemon itself with specific given attributes.
 func (daemon *Daemon) LogDaemonEventWithAttributes(action string, attributes map[string]string) {
 	if daemon.EventsService != nil {
62014aaf
 		if info, err := daemon.SystemInfo(); err == nil && info.Name != "" {
 			attributes["name"] = info.Name
 		}
382c152a
 		actor := events.Actor{
 			ID:         daemon.ID,
 			Attributes: attributes,
 		}
 		daemon.EventsService.Log(action, events.DaemonEventType, actor)
 	}
 }
 
55053d35
 // SubscribeToEvents returns the currently record of events, a channel to stream new events from, and a function to cancel the stream of events.
 func (daemon *Daemon) SubscribeToEvents(since, until time.Time, filter filters.Args) ([]events.Message, chan interface{}) {
 	ef := daemonevents.NewFilter(filter)
 	return daemon.EventsService.SubscribeTopic(since, until, ef)
 }
 
 // UnsubscribeFromEvents stops the event subscription for a client by closing the
 // channel where the daemon sends events to.
 func (daemon *Daemon) UnsubscribeFromEvents(listener chan interface{}) {
 	daemon.EventsService.Evict(listener)
 }
 
72f1881d
 // copyAttributes guarantees that labels are not mutated by event triggers.
1d8ccc6a
 func copyAttributes(attributes, labels map[string]string) {
72f1881d
 	if labels == nil {
1d8ccc6a
 		return
72f1881d
 	}
 	for k, v := range labels {
 		attributes[k] = v
 	}
4f2a5ba3
 }