github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/libpod/events/filters.go (about) 1 package events 2 3 import ( 4 "strings" 5 "time" 6 7 "github.com/containers/podman/v2/pkg/util" 8 "github.com/pkg/errors" 9 ) 10 11 func generateEventFilter(filter, filterValue string) (func(e *Event) bool, error) { 12 switch strings.ToUpper(filter) { 13 case "CONTAINER": 14 return func(e *Event) bool { 15 if e.Type != Container { 16 return false 17 } 18 if e.Name == filterValue { 19 return true 20 } 21 return strings.HasPrefix(e.ID, filterValue) 22 }, nil 23 case "EVENT", "STATUS": 24 return func(e *Event) bool { 25 return string(e.Status) == filterValue 26 }, nil 27 case "IMAGE": 28 return func(e *Event) bool { 29 if e.Type != Image { 30 return false 31 } 32 if e.Name == filterValue { 33 return true 34 } 35 return strings.HasPrefix(e.ID, filterValue) 36 }, nil 37 case "POD": 38 return func(e *Event) bool { 39 if e.Type != Pod { 40 return false 41 } 42 if e.Name == filterValue { 43 return true 44 } 45 return strings.HasPrefix(e.ID, filterValue) 46 }, nil 47 case "VOLUME": 48 return func(e *Event) bool { 49 if e.Type != Volume { 50 return false 51 } 52 return strings.HasPrefix(e.ID, filterValue) 53 }, nil 54 case "TYPE": 55 return func(e *Event) bool { 56 return string(e.Type) == filterValue 57 }, nil 58 59 case "LABEL": 60 return func(e *Event) bool { 61 var found bool 62 // iterate labels and see if we match a key and value 63 for eventKey, eventValue := range e.Attributes { 64 filterValueSplit := strings.SplitN(filterValue, "=", 2) 65 // if the filter isn't right, just return false 66 if len(filterValueSplit) < 2 { 67 return false 68 } 69 if eventKey == filterValueSplit[0] && eventValue == filterValueSplit[1] { 70 found = true 71 break 72 } 73 } 74 return found 75 }, nil 76 } 77 return nil, errors.Errorf("%s is an invalid filter", filter) 78 } 79 80 func generateEventSinceOption(timeSince time.Time) func(e *Event) bool { 81 return func(e *Event) bool { 82 return e.Time.After(timeSince) 83 } 84 } 85 86 func generateEventUntilOption(timeUntil time.Time) func(e *Event) bool { 87 return func(e *Event) bool { 88 return e.Time.Before(timeUntil) 89 90 } 91 } 92 93 func parseFilter(filter string) (string, string, error) { 94 filterSplit := strings.SplitN(filter, "=", 2) 95 if len(filterSplit) != 2 { 96 return "", "", errors.Errorf("%s is an invalid filter", filter) 97 } 98 return filterSplit[0], filterSplit[1], nil 99 } 100 101 func generateEventOptions(filters []string, since, until string) ([]EventFilter, error) { 102 options := make([]EventFilter, 0, len(filters)) 103 for _, filter := range filters { 104 key, val, err := parseFilter(filter) 105 if err != nil { 106 return nil, err 107 } 108 funcFilter, err := generateEventFilter(key, val) 109 if err != nil { 110 return nil, err 111 } 112 options = append(options, funcFilter) 113 } 114 115 if len(since) > 0 { 116 timeSince, err := util.ParseInputTime(since) 117 if err != nil { 118 return nil, errors.Wrapf(err, "unable to convert since time of %s", since) 119 } 120 options = append(options, generateEventSinceOption(timeSince)) 121 } 122 123 if len(until) > 0 { 124 timeUntil, err := util.ParseInputTime(until) 125 if err != nil { 126 return nil, errors.Wrapf(err, "unable to convert until time of %s", until) 127 } 128 options = append(options, generateEventUntilOption(timeUntil)) 129 } 130 return options, nil 131 }