mirror of https://github.com/grpc/grpc-go.git
interop: let the interop client send additional metadata, controlled by a flag (#6295)
This commit is contained in:
parent
9b7a947cdc
commit
511a96359f
|
@ -24,12 +24,14 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"flag"
|
"flag"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
|
@ -41,6 +43,7 @@ import (
|
||||||
"google.golang.org/grpc/credentials/oauth"
|
"google.golang.org/grpc/credentials/oauth"
|
||||||
"google.golang.org/grpc/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
"google.golang.org/grpc/interop"
|
"google.golang.org/grpc/interop"
|
||||||
|
"google.golang.org/grpc/metadata"
|
||||||
"google.golang.org/grpc/resolver"
|
"google.golang.org/grpc/resolver"
|
||||||
"google.golang.org/grpc/testdata"
|
"google.golang.org/grpc/testdata"
|
||||||
|
|
||||||
|
@ -75,6 +78,7 @@ var (
|
||||||
soakOverallTimeoutSeconds = flag.Int("soak_overall_timeout_seconds", 10, "The overall number of seconds after which a soak test should stop and fail, if the desired number of iterations have not yet completed.")
|
soakOverallTimeoutSeconds = flag.Int("soak_overall_timeout_seconds", 10, "The overall number of seconds after which a soak test should stop and fail, if the desired number of iterations have not yet completed.")
|
||||||
soakMinTimeMsBetweenRPCs = flag.Int("soak_min_time_ms_between_rpcs", 0, "The minimum time in milliseconds between consecutive RPCs in a soak test (rpc_soak or channel_soak), useful for limiting QPS")
|
soakMinTimeMsBetweenRPCs = flag.Int("soak_min_time_ms_between_rpcs", 0, "The minimum time in milliseconds between consecutive RPCs in a soak test (rpc_soak or channel_soak), useful for limiting QPS")
|
||||||
tlsServerName = flag.String("server_host_override", "", "The server name used to verify the hostname returned by TLS handshake if it is not empty. Otherwise, --server_host is used.")
|
tlsServerName = flag.String("server_host_override", "", "The server name used to verify the hostname returned by TLS handshake if it is not empty. Otherwise, --server_host is used.")
|
||||||
|
additionalMetadata = flag.String("additional_metadata", "", "Additional metadata to send in each request, as a semicolon-separated list of key:value pairs.")
|
||||||
testCase = flag.String("test_case", "large_unary",
|
testCase = flag.String("test_case", "large_unary",
|
||||||
`Configure different test cases. Valid options are:
|
`Configure different test cases. Valid options are:
|
||||||
empty_unary : empty (zero bytes) request and response;
|
empty_unary : empty (zero bytes) request and response;
|
||||||
|
@ -115,6 +119,34 @@ const (
|
||||||
credsComputeEngineCreds
|
credsComputeEngineCreds
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Parses the --additional_metadata flag and returns metadata to send on each RPC,
|
||||||
|
// formatted as per https://pkg.go.dev/google.golang.org/grpc/metadata#Pairs.
|
||||||
|
// Allow any character but semicolons in values. If the flag is empty, return a nil map.
|
||||||
|
func parseAdditionalMetadataFlag() []string {
|
||||||
|
if len(*additionalMetadata) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
r := *additionalMetadata
|
||||||
|
addMd := make([]string, 0)
|
||||||
|
for len(r) > 0 {
|
||||||
|
i := strings.Index(r, ":")
|
||||||
|
if i < 0 {
|
||||||
|
logger.Fatalf("Error parsing --additional_metadata flag: missing colon separator")
|
||||||
|
}
|
||||||
|
addMd = append(addMd, r[:i]) // append key
|
||||||
|
r = r[i+1:]
|
||||||
|
i = strings.Index(r, ";")
|
||||||
|
// append value
|
||||||
|
if i < 0 {
|
||||||
|
addMd = append(addMd, r)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
addMd = append(addMd, r[:i])
|
||||||
|
r = r[i+1:]
|
||||||
|
}
|
||||||
|
return addMd
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
logger.Infof("Client running with test case %q", *testCase)
|
logger.Infof("Client running with test case %q", *testCase)
|
||||||
|
@ -214,6 +246,17 @@ func main() {
|
||||||
if len(*serviceConfigJSON) > 0 {
|
if len(*serviceConfigJSON) > 0 {
|
||||||
opts = append(opts, grpc.WithDisableServiceConfig(), grpc.WithDefaultServiceConfig(*serviceConfigJSON))
|
opts = append(opts, grpc.WithDisableServiceConfig(), grpc.WithDefaultServiceConfig(*serviceConfigJSON))
|
||||||
}
|
}
|
||||||
|
if addMd := parseAdditionalMetadataFlag(); addMd != nil {
|
||||||
|
unaryAddMd := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
|
||||||
|
ctx = metadata.AppendToOutgoingContext(ctx, addMd...)
|
||||||
|
return invoker(ctx, method, req, reply, cc, opts...)
|
||||||
|
}
|
||||||
|
streamingAddMd := func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
|
||||||
|
ctx = metadata.AppendToOutgoingContext(ctx, addMd...)
|
||||||
|
return streamer(ctx, desc, cc, method, opts...)
|
||||||
|
}
|
||||||
|
opts = append(opts, grpc.WithUnaryInterceptor(unaryAddMd), grpc.WithStreamInterceptor(streamingAddMd))
|
||||||
|
}
|
||||||
conn, err := grpc.Dial(serverAddr, opts...)
|
conn, err := grpc.Dial(serverAddr, opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Fatalf("Fail to dial: %v", err)
|
logger.Fatalf("Fail to dial: %v", err)
|
||||||
|
|
Loading…
Reference in New Issue