in traffic_monitor/datareq/cachestatfilter.go [105:196]
func NewCacheStatFilter(path string, params url.Values, cacheTypes map[tc.CacheName]tc.CacheType) (cache.Filter, error) {
validParams := map[string]struct{}{
"hc": struct{}{},
"stats": struct{}{},
"interfaceStats": struct{}{},
"wildcard": struct{}{},
"type": struct{}{},
"hosts": struct{}{},
"cache": struct{}{},
}
if len(params) > len(validParams) {
return nil, fmt.Errorf("invalid query parameters")
}
for param := range params {
if _, ok := validParams[param]; !ok {
return nil, fmt.Errorf("invalid query parameter '%v'", param)
}
}
var historyCount uint64 = 1
if paramHc, exists := params["hc"]; exists && len(paramHc) > 0 {
v, err := strconv.ParseUint(paramHc[0], 10, 64)
if err == nil {
historyCount = v
}
}
statsToUse := map[string]struct{}{}
if paramStats, exists := params["stats"]; exists && len(paramStats) > 0 {
commaStats := strings.Split(paramStats[0], ",")
for _, stat := range commaStats {
statsToUse[stat] = struct{}{}
}
}
interfaceStatsToUse := map[string]struct{}{}
if paramStats, exists := params["interfaceStats"]; exists {
for _, paramStat := range paramStats {
for _, stat := range strings.Split(paramStat, ",") {
interfaceStatsToUse[stat] = struct{}{}
}
}
}
wildcard := false
if paramWildcard, exists := params["wildcard"]; exists && len(paramWildcard) > 0 {
wildcard, _ = strconv.ParseBool(paramWildcard[0]) // ignore errors, error => false
}
cacheType := tc.CacheTypeInvalid
if paramType, exists := params["type"]; exists && len(paramType) > 0 {
cacheType = tc.CacheTypeFromString(paramType[0])
if cacheType == tc.CacheTypeInvalid {
return nil, fmt.Errorf("invalid query parameter type '%v' - valid types are: {edge, mid}", paramType[0])
}
}
hosts := map[tc.CacheName]struct{}{}
if paramHosts, exists := params["hosts"]; exists && len(paramHosts) > 0 {
commaHosts := strings.Split(paramHosts[0], ",")
for _, host := range commaHosts {
hosts[tc.CacheName(host)] = struct{}{}
}
}
if paramHosts, exists := params["cache"]; exists && len(paramHosts) > 0 {
commaHosts := strings.Split(paramHosts[0], ",")
for _, host := range commaHosts {
hosts[tc.CacheName(host)] = struct{}{}
}
}
pathArgument := getPathArgument(path)
if pathArgument != "" {
hosts[tc.CacheName(pathArgument)] = struct{}{}
}
// parameters without values are considered hosts, e.g. `?my-cache-0`
for maybeHost, val := range params {
if len(val) == 0 || (len(val) == 1 && val[0] == "") {
hosts[tc.CacheName(maybeHost)] = struct{}{}
}
}
return &CacheStatFilter{
historyCount: historyCount,
statsToUse: statsToUse,
wildcard: wildcard,
cacheType: cacheType,
hosts: hosts,
cacheTypes: cacheTypes,
}, nil
}