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
}