Skip to content

Commit

Permalink
Add validation for querier address flags
Browse files Browse the repository at this point in the history
Signed-off-by: Saswata Mukherjee <saswataminsta@yahoo.com>
  • Loading branch information
saswatamcode committed Nov 24, 2021
1 parent 7cda7cc commit 17c0f14
Showing 1 changed file with 31 additions and 18 deletions.
49 changes: 31 additions & 18 deletions cmd/thanos/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,20 +191,24 @@ func registerQuery(app *extkingpin.App) {
}
}

if dup := firstDuplicate(*stores); dup != "" {
return errors.Errorf("Address %s is duplicated for --store flag.", dup)
if err := validateAddrs(*endpoints); err != nil {
return errors.Wrap(err, "validating --endpoint flags")
}

if dup := firstDuplicate(*ruleEndpoints); dup != "" {
return errors.Errorf("Address %s is duplicated for --rule flag.", dup)
if err := validateAddrs(*stores); err != nil {
return errors.Wrap(err, "validating --store flags")
}

if dup := firstDuplicate(*metadataEndpoints); dup != "" {
return errors.Errorf("Address %s is duplicated for --metadata flag.", dup)
if err := validateAddrs(*ruleEndpoints); err != nil {
return errors.Wrap(err, "validating --rule flags")
}

if dup := firstDuplicate(*exemplarEndpoints); dup != "" {
return errors.Errorf("Address %s is duplicated for --exemplar flag.", dup)
if err := validateAddrs(*metadataEndpoints); err != nil {
return errors.Wrap(err, "validating --metadata flags")
}

if err := validateAddrs(*exemplarEndpoints); err != nil {
return errors.Wrap(err, "validating --exemplar flags")
}

httpLogOpts, err := logging.ParseHTTPOptions(*reqLogDecision, reqLogConfig)
Expand All @@ -217,8 +221,8 @@ func registerQuery(app *extkingpin.App) {
return errors.Wrap(err, "error while parsing config for request logging")
}

if dup := firstDuplicate(*targetEndpoints); dup != "" {
return errors.Errorf("Address %s is duplicated for --target flag.", dup)
if err := validateAddrs(*targetEndpoints); err != nil {
return errors.Wrap(err, "validating --target flags")
}

var fileSD *file.Discovery
Expand Down Expand Up @@ -733,20 +737,29 @@ func removeDuplicateEndpointSpecs(logger log.Logger, duplicatedStores prometheus
return deduplicated
}

// firstDuplicate returns the first duplicate string in the given string slice
// or empty string if none was found.
func firstDuplicate(ss []string) string {
// validateAddrs checks an address slice for duplicates and empty or invalid elements.
func validateAddrs(addrs []string) error {
set := map[string]struct{}{}

for _, s := range ss {
if _, ok := set[s]; ok {
return s
for _, addr := range addrs {
if addr == "" {
return errors.New("Address is empty.")
}

qtypeAndName := strings.SplitN(addr, "+", 2)
hostAndPort := strings.SplitN(addr, ":", 2)
if len(qtypeAndName) != 2 && len(hostAndPort) != 2 {
return errors.Errorf("Address %s is not of <host>:<port> format or a valid DNS query.", addr)
}

set[s] = struct{}{}
if _, ok := set[addr]; ok {
return errors.Errorf("Address %s is duplicated.", addr)
}

set[addr] = struct{}{}
}

return ""
return nil
}

// engineFactory creates from 1 to 3 promql.Engines depending on
Expand Down

0 comments on commit 17c0f14

Please sign in to comment.