func()

in src/go/configgenerator/routegen/proxy_backend.go [61:119]


func (g *ProxyBackendGenerator) GenRouteConfig(filterGens []filtergen.FilterGenerator) ([]*routepb.Route, error) {
	var routes []*routepb.Route
	for _, httpPattern := range g.HTTPPatterns {
		selector := httpPattern.Operation

		method, ok := g.MethodBySelector[selector]
		if !ok {
			return nil, fmt.Errorf("could not find any API method for selector %q", selector)
		}

		backendCluster, ok := g.BackendClusterBySelector[selector]
		if !ok {
			return nil, fmt.Errorf("could not find any backend cluster for selector %q", selector)
		}

		deadlineSpecifier, ok := g.DeadlineBySelector[selector]
		if !ok {
			deadlineSpecifier = &DeadlineSpecifier{
				Deadline: 0,
			}
		}

		methodCfg := &helpers.MethodCfg{
			OperationName:      selector,
			BackendClusterName: backendCluster.Name,
			HostRewrite:        backendCluster.HostName,
			Deadline:           deadlineSpecifier.Deadline,
			IsStreaming:        method.GetRequestStreaming() || method.GetResponseStreaming(),
			HTTPPattern:        httpPattern.Pattern,
		}

		if backendCluster.HTTPBackend != nil {
			// Special support for HTTP backend.
			isGrpc, err := httpPattern.IsGRPCPathForOperation(selector)
			if err != nil {
				return nil, err
			}

			if !isGrpc {
				methodCfg.BackendClusterName = backendCluster.HTTPBackend.Name
				// No need to configure host rewrite for http backend.
				// This solution is designed in go/cloud-esf-http-backends and is used to serve
				// traffic with dual backends (http, grpc). The cluster config though is not owned by Cloud
				// ESF so the below configuration is test only.
				methodCfg.HostRewrite = ""
				methodCfg.Deadline = deadlineSpecifier.HTTPBackendDeadline
				methodCfg.IsStreaming = false
			}
		}

		methodRoutes, err := g.BackendRouteGen.GenRoutesForMethod(methodCfg, filterGens)
		if err != nil {
			return nil, fmt.Errorf("fail to generate routes for operation %q with HTTP pattern %q: %v", selector, httpPattern.String(), err)
		}
		routes = append(routes, methodRoutes...)
	}

	return routes, nil
}