github.com/google/cloudprober@v0.11.3/rds/server/filter/utils.go (about) 1 package filter 2 3 import ( 4 "fmt" 5 "strings" 6 7 pb "github.com/google/cloudprober/rds/proto" 8 ) 9 10 // Filters encapsulates all types of filters. Its main purpose is to serve as a 11 // return type for ParseFilters. 12 type Filters struct { 13 RegexFilters map[string]*RegexFilter 14 *LabelsFilter 15 *FreshnessFilter 16 } 17 18 // ParseFilters parses filter protobufs into Filters struct. Filters are parsed 19 // based on the following criteria: 20 // - There can be multiple regex filters. Keys for these filters should be 21 // provided through the regexFilterKeys argument. 22 // - Labels filter keys always starts with the prefix "labels.". 23 // - There can be only one freshness filter, key for which should be provided 24 // through the freshnessFilterKey argument. 25 func ParseFilters(filters []*pb.Filter, regexFilterKeys []string, freshnessFilterKey string) (*Filters, error) { 26 r := &Filters{ 27 RegexFilters: make(map[string]*RegexFilter), 28 } 29 30 // Initialize r.RegexFilters with expected regex filter keys for quick lookup. 31 for _, k := range regexFilterKeys { 32 r.RegexFilters[k] = nil 33 } 34 35 labels := make(map[string]string) 36 37 for _, f := range filters { 38 39 // If we expect this filter to be a regex filter. 40 if _, ok := r.RegexFilters[f.GetKey()]; ok { 41 rf, err := NewRegexFilter(f.GetValue()) 42 if err != nil { 43 return nil, fmt.Errorf("filter: error creating regex filter from: %s=%s, err: %v", f.GetKey(), f.GetValue(), err) 44 } 45 r.RegexFilters[f.GetKey()] = rf 46 continue 47 } 48 49 // If we expect this filter to be a freshness filter. 50 if f.GetKey() == freshnessFilterKey { 51 ff, err := NewFreshnessFilter(f.GetValue()) 52 if err != nil { 53 return nil, fmt.Errorf("filter: error creating freshness filter from: %s=%s, err: %v", f.GetKey(), f.GetValue(), err) 54 } 55 r.FreshnessFilter = ff 56 continue 57 } 58 59 // If it is a labels filter (starting with labels.). 60 // Note: labels.<key> format matches with gcloud's filter options. 61 if strings.HasPrefix(f.GetKey(), "labels.") { 62 labels[strings.TrimPrefix(f.GetKey(), "labels.")] = f.GetValue() 63 continue 64 } 65 66 // Unexpected filter key. 67 return nil, fmt.Errorf("unsupported filter key: %s", f.GetKey()) 68 } 69 70 if len(labels) != 0 { 71 var err error 72 if r.LabelsFilter, err = NewLabelsFilter(labels); err != nil { 73 return nil, fmt.Errorf("filter: error creating labels filter from: %v, err: %v", labels, err) 74 } 75 } 76 77 return r, nil 78 }