func()

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
}