(rlsProto *rlspb.RouteLookupConfig)
| 184 | } |
| 185 | |
| 186 | func parseRLSProto(rlsProto *rlspb.RouteLookupConfig) (*lbConfig, error) { |
| 187 | // Validations specified on the `grpc_keybuilders` field are performed here. |
| 188 | kbMap, err := keys.MakeBuilderMap(rlsProto) |
| 189 | if err != nil { |
| 190 | return nil, err |
| 191 | } |
| 192 | |
| 193 | // `lookup_service` field must be set and must parse as a target URI. |
| 194 | lookupService := rlsProto.GetLookupService() |
| 195 | if lookupService == "" { |
| 196 | return nil, fmt.Errorf("rls: empty lookup_service in route lookup config %+v", rlsProto) |
| 197 | } |
| 198 | parsedTarget, err := url.Parse(lookupService) |
| 199 | if err != nil { |
| 200 | // url.Parse() fails if scheme is missing. Retry with default scheme. |
| 201 | parsedTarget, err = url.Parse(resolver.GetDefaultScheme() + ":///" + lookupService) |
| 202 | if err != nil { |
| 203 | return nil, fmt.Errorf("rls: invalid target URI in lookup_service %s", lookupService) |
| 204 | } |
| 205 | } |
| 206 | if parsedTarget.Scheme == "" { |
| 207 | parsedTarget.Scheme = resolver.GetDefaultScheme() |
| 208 | } |
| 209 | if resolver.Get(parsedTarget.Scheme) == nil { |
| 210 | return nil, fmt.Errorf("rls: unregistered scheme in lookup_service %s", lookupService) |
| 211 | } |
| 212 | |
| 213 | lookupServiceTimeout, err := convertDuration(rlsProto.GetLookupServiceTimeout()) |
| 214 | if err != nil { |
| 215 | return nil, fmt.Errorf("rls: failed to parse lookup_service_timeout in route lookup config %+v: %v", rlsProto, err) |
| 216 | } |
| 217 | if lookupServiceTimeout == 0 { |
| 218 | lookupServiceTimeout = defaultLookupServiceTimeout |
| 219 | } |
| 220 | |
| 221 | // Validations performed here: |
| 222 | // - if `max_age` > 5m, it should be set to 5 minutes |
| 223 | // only if stale age is not set |
| 224 | // - if `stale_age` > `max_age`, ignore it |
| 225 | // - if `stale_age` is set, then `max_age` must also be set |
| 226 | maxAgeSet := false |
| 227 | maxAge, err := convertDuration(rlsProto.GetMaxAge()) |
| 228 | if err != nil { |
| 229 | return nil, fmt.Errorf("rls: failed to parse max_age in route lookup config %+v: %v", rlsProto, err) |
| 230 | } |
| 231 | if maxAge == 0 { |
| 232 | maxAge = maxMaxAge |
| 233 | } else { |
| 234 | maxAgeSet = true |
| 235 | } |
| 236 | |
| 237 | staleAgeSet := false |
| 238 | staleAge, err := convertDuration(rlsProto.GetStaleAge()) |
| 239 | if err != nil { |
| 240 | return nil, fmt.Errorf("rls: failed to parse staleAge in route lookup config %+v: %v", rlsProto, err) |
| 241 | } |
| 242 | if staleAge == 0 { |
| 243 | staleAge = maxMaxAge |
no test coverage detected