func()

in src/go/configgenerator/filtergen/service_control.go [159:256]


func (g *ServiceControlGenerator) GenFilterConfig() (proto.Message, error) {
	// TODO(b/148638212): Clean up this hacky way of specifying the protocol for Service Control report.
	// This is safe (for now) as our Service Control filter only differentiates between gRPC or non-gRPC.
	var protocol string
	if g.GRPCSupportRequired {
		protocol = "grpc"
	} else {
		// TODO(b/148638212): Must be http1 (not http) for current filter implementation.
		protocol = "http1"
	}

	service := &scpb.Service{
		ServiceName:                 g.ServiceName,
		ServiceConfigId:             g.ServiceConfigID,
		ProducerProjectId:           g.ProducerProjectID,
		ServiceConfig:               copyServiceConfigForReportMetrics(g.ServiceConfig),
		BackendProtocol:             protocol,
		ClientIpFromForwardedHeader: g.ClientIPFromForwardedHeader,
		TracingProjectId:            g.TracingProjectID,
		TracingDisabled:             g.DisableTracing,
	}

	if g.LogRequestHeaders != "" {
		service.LogRequestHeaders = strings.Split(g.LogRequestHeaders, ",")
		for i := range service.LogRequestHeaders {
			service.LogRequestHeaders[i] = strings.TrimSpace(service.LogRequestHeaders[i])
		}
	}
	if g.LogResponseHeaders != "" {
		service.LogResponseHeaders = strings.Split(g.LogResponseHeaders, ",")
		for i := range service.LogResponseHeaders {
			service.LogResponseHeaders[i] = strings.TrimSpace(service.LogResponseHeaders[i])
		}
	}
	if g.LogJwtPayloads != "" {
		service.LogJwtPayloads = strings.Split(g.LogJwtPayloads, ",")
		for i := range service.LogJwtPayloads {
			service.LogJwtPayloads[i] = strings.TrimSpace(service.LogJwtPayloads[i])
		}
	}
	if g.MinStreamReportIntervalMs != 0 {
		service.MinStreamReportIntervalMs = g.MinStreamReportIntervalMs
	}
	service.JwtPayloadMetadataName = util.JwtPayloadMetadataName
	filterConfig := &scpb.FilterConfig{
		Services:        []*scpb.Service{service},
		ScCallingConfig: g.CallingConfig,
		ServiceControlUri: &commonpb.HttpUri{
			Uri:     g.ServiceControlURI.String() + "/v1/services",
			Cluster: clustergen.ServiceControlClusterName,
			Timeout: durationpb.New(g.HttpRequestTimeout),
		},
		GeneratedHeaderPrefix:    g.GeneratedHeaderPrefix,
		Requirements:             g.MethodRequirements,
		EnableApiKeyUidReporting: g.EnableApiKeyUidReporting,
	}

	accessTokenConfig := g.AccessToken.MakeAccessTokenConfig()
	if g.CallCredentials != nil {
		// Use access token fetched from Google Cloud IAM Server to talk to Service Controller
		filterConfig.AccessToken = &scpb.FilterConfig_IamToken{
			IamToken: &commonpb.IamTokenInfo{
				IamUri: &commonpb.HttpUri{
					Uri:     fmt.Sprintf("%s%s", g.IAMURL, util.IamAccessTokenPath(g.CallCredentials.ServiceAccountEmail)),
					Cluster: clustergen.IAMServerClusterName,
					Timeout: durationpb.New(g.HttpRequestTimeout),
				},
				ServiceAccountEmail: g.CallCredentials.ServiceAccountEmail,
				Delegates:           g.CallCredentials.Delegates,
				AccessToken:         accessTokenConfig,
			},
		}
	} else {
		filterConfig.AccessToken = &scpb.FilterConfig_ImdsToken{
			ImdsToken: accessTokenConfig.GetRemoteToken(),
		}

	}

	if g.GCPAttributes != nil {
		filterConfig.GcpAttributes = g.GCPAttributes
	}
	if g.ComputePlatformOverride != "" {
		if filterConfig.GcpAttributes == nil {
			filterConfig.GcpAttributes = &scpb.GcpAttributes{}
		}
		filterConfig.GcpAttributes.Platform = g.ComputePlatformOverride
	}

	depErrorBehaviorEnum, err := ParseDepErrorBehavior(g.DependencyErrorBehavior)
	if err != nil {
		return nil, err
	}

	filterConfig.DepErrorBehavior = depErrorBehaviorEnum

	return filterConfig, nil
}