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  }