func determineBackendClusterForSelector()

in src/go/configgenerator/routegen/util.go [72:112]


func determineBackendClusterForSelector(selector string, backendRuleBySelector map[string]*servicepb.BackendRule, serviceConfig *servicepb.Service, opts options.ConfigGeneratorOptions) (*BackendClusterSpecifier, error) {
	localCluster := &BackendClusterSpecifier{
		Name: clustergen.MakeLocalBackendClusterName(serviceConfig),
	}

	if opts.EnableBackendAddressOverride {
		return localCluster, nil
	}

	backendRule, ok := backendRuleBySelector[selector]
	if !ok {
		return localCluster, nil
	}

	// Check for HTTP backend.
	httpBackendRule := clustergen.IsHTTPBackendEnabled(backendRule)
	if httpBackendRule != nil && !util.ShouldSkipOPDiscoveryAPI(selector, opts.AllowDiscoveryAPIs) {
		if httpBackendRule.GetAddress() == "" {
			return nil, fmt.Errorf("HTTP backend rule for selector %q has empty address", selector)
		}

		httpBackend, err := makeBackendClusterSpecifierFromRule(httpBackendRule)
		if err != nil {
			return nil, fmt.Errorf("fail while processing HTTP backend rule for selector %q: %v", selector, err)
		}

		localCluster.HTTPBackend = httpBackend
	}

	if backendRule.GetAddress() == "" {
		return localCluster, nil
	}

	normalBackend, err := makeBackendClusterSpecifierFromRule(backendRule)
	if err != nil {
		return nil, fmt.Errorf("fail while processing normal (non-HTTP) backend rule for selector %q: %v", selector, err)
	}
	normalBackend.HTTPBackend = localCluster.HTTPBackend

	return normalBackend, nil
}