diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2021-06-02 10:37:58 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-02 10:37:58 -0400 |
commit | 52dae693da0df1447b7f5210a4c842d5c5a8a401 (patch) | |
tree | 2f0add142c8bf9fbf901cf4538ceafa747a78797 /libpod/events/filters.go | |
parent | 6df37abd502d53a695392723af0d4a4970be3e58 (diff) | |
parent | 37f39eefee72ec4fb6c6bd71642e9d384c448387 (diff) | |
download | podman-52dae693da0df1447b7f5210a4c842d5c5a8a401.tar.gz podman-52dae693da0df1447b7f5210a4c842d5c5a8a401.tar.bz2 podman-52dae693da0df1447b7f5210a4c842d5c5a8a401.zip |
Merge pull request #10514 from vrothberg/fix-10507
events: support disjunctive filters
Diffstat (limited to 'libpod/events/filters.go')
-rw-r--r-- | libpod/events/filters.go | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/libpod/events/filters.go b/libpod/events/filters.go index acfb96302..4d27e8fc4 100644 --- a/libpod/events/filters.go +++ b/libpod/events/filters.go @@ -97,18 +97,41 @@ func parseFilter(filter string) (string, string, error) { return filterSplit[0], filterSplit[1], nil } -func generateEventOptions(filters []string, since, until string) ([]EventFilter, error) { - options := make([]EventFilter, 0, len(filters)) +// applyFilters applies the EventFilter slices in sequence. Filters under the +// same key are disjunctive while each key must match (conjuctive). +func applyFilters(event *Event, filterMap map[string][]EventFilter) bool { + for _, filters := range filterMap { + success := false + for _, filter := range filters { + if filter(event) { + success = true + break + } + } + if !success { + return false + } + } + return true +} + +// generateEventFilter parses the specified filters into a filter map that can +// later on be used to filter events. Keys are conjunctive, values are +// disjunctive. +func generateEventFilters(filters []string, since, until string) (map[string][]EventFilter, error) { + filterMap := make(map[string][]EventFilter) for _, filter := range filters { key, val, err := parseFilter(filter) if err != nil { return nil, err } - funcFilter, err := generateEventFilter(key, val) + filterFunc, err := generateEventFilter(key, val) if err != nil { return nil, err } - options = append(options, funcFilter) + filterSlice := filterMap[key] + filterSlice = append(filterSlice, filterFunc) + filterMap[key] = filterSlice } if len(since) > 0 { @@ -116,7 +139,8 @@ func generateEventOptions(filters []string, since, until string) ([]EventFilter, if err != nil { return nil, errors.Wrapf(err, "unable to convert since time of %s", since) } - options = append(options, generateEventSinceOption(timeSince)) + filterFunc := generateEventSinceOption(timeSince) + filterMap["since"] = []EventFilter{filterFunc} } if len(until) > 0 { @@ -124,7 +148,8 @@ func generateEventOptions(filters []string, since, until string) ([]EventFilter, if err != nil { return nil, errors.Wrapf(err, "unable to convert until time of %s", until) } - options = append(options, generateEventUntilOption(timeUntil)) + filterFunc := generateEventUntilOption(timeUntil) + filterMap["until"] = []EventFilter{filterFunc} } - return options, nil + return filterMap, nil } |