github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/daemon/events/filter.go (about) 1 package events 2 3 import ( 4 "github.com/docker/docker/api/types/events" 5 "github.com/docker/docker/api/types/filters" 6 "github.com/docker/docker/reference" 7 ) 8 9 // Filter can filter out docker events from a stream 10 type Filter struct { 11 filter filters.Args 12 } 13 14 // NewFilter creates a new Filter 15 func NewFilter(filter filters.Args) *Filter { 16 return &Filter{filter: filter} 17 } 18 19 // Include returns true when the event ev is included by the filters 20 func (ef *Filter) Include(ev events.Message) bool { 21 return ef.filter.ExactMatch("event", ev.Action) && 22 ef.filter.ExactMatch("type", ev.Type) && 23 ef.matchDaemon(ev) && 24 ef.matchContainer(ev) && 25 ef.matchPlugin(ev) && 26 ef.matchVolume(ev) && 27 ef.matchNetwork(ev) && 28 ef.matchImage(ev) && 29 ef.matchLabels(ev.Actor.Attributes) 30 } 31 32 func (ef *Filter) matchLabels(attributes map[string]string) bool { 33 if !ef.filter.Include("label") { 34 return true 35 } 36 return ef.filter.MatchKVList("label", attributes) 37 } 38 39 func (ef *Filter) matchDaemon(ev events.Message) bool { 40 return ef.fuzzyMatchName(ev, events.DaemonEventType) 41 } 42 43 func (ef *Filter) matchContainer(ev events.Message) bool { 44 return ef.fuzzyMatchName(ev, events.ContainerEventType) 45 } 46 47 func (ef *Filter) matchPlugin(ev events.Message) bool { 48 return ef.fuzzyMatchName(ev, events.PluginEventType) 49 } 50 51 func (ef *Filter) matchVolume(ev events.Message) bool { 52 return ef.fuzzyMatchName(ev, events.VolumeEventType) 53 } 54 55 func (ef *Filter) matchNetwork(ev events.Message) bool { 56 return ef.fuzzyMatchName(ev, events.NetworkEventType) 57 } 58 59 func (ef *Filter) fuzzyMatchName(ev events.Message, eventType string) bool { 60 return ef.filter.FuzzyMatch(eventType, ev.Actor.ID) || 61 ef.filter.FuzzyMatch(eventType, ev.Actor.Attributes["name"]) 62 } 63 64 // matchImage matches against both event.Actor.ID (for image events) 65 // and event.Actor.Attributes["image"] (for container events), so that any container that was created 66 // from an image will be included in the image events. Also compare both 67 // against the stripped repo name without any tags. 68 func (ef *Filter) matchImage(ev events.Message) bool { 69 id := ev.Actor.ID 70 nameAttr := "image" 71 var imageName string 72 73 if ev.Type == events.ImageEventType { 74 nameAttr = "name" 75 } 76 77 if n, ok := ev.Actor.Attributes[nameAttr]; ok { 78 imageName = n 79 } 80 return ef.filter.ExactMatch("image", id) || 81 ef.filter.ExactMatch("image", imageName) || 82 ef.filter.ExactMatch("image", stripTag(id)) || 83 ef.filter.ExactMatch("image", stripTag(imageName)) 84 } 85 86 func stripTag(image string) string { 87 ref, err := reference.ParseNamed(image) 88 if err != nil { 89 return image 90 } 91 return ref.Name() 92 }