in src/go/configinfo/service_info.go [529:567]
func (s *ServiceInfo) processBackendRule() error {
backendRoutingClustersMap := make(map[string]string)
for _, r := range s.ServiceConfig().GetBackend().GetRules() {
selector := r.GetSelector()
if s.shouldSkipDiscoveryAPI(selector) {
glog.Warningf("Skip backend rule %q because discovery API is not supported.", selector)
continue
}
method := s.Methods[selector]
if method == nil {
continue
}
if r.Address == "" || s.Options.EnableBackendAddressOverride {
// Processing a backend rule associated with the local backend.
bi, err := s.ruleToBackendInfo(r, "", "", "", s.LocalBackendClusterName(), 0)
if err != nil {
return fmt.Errorf("error processing local backend rule for operation (%v), %v", r.Selector, err)
}
method.BackendInfo = bi
} else {
if err := s.addBackendRuleToMethod(r, backendRoutingClustersMap, method, false); err != nil {
return err
}
}
httpBackendRule := r.GetOverridesByRequestProtocol()[util.HTTPBackendProtocolKey]
if httpBackendRule == nil {
continue
}
// TODO(yangshuo): remove this after the API compiler ensures it.
httpBackendRule.Selector = r.Selector
if err := s.addBackendRuleToMethod(httpBackendRule, backendRoutingClustersMap, method, true); err != nil {
return err
}
}
return nil
}