1*cc02d7e2SAndroid Build Coastguard Worker# xDS (Load-Balancing) Interop Test Case Descriptions 2*cc02d7e2SAndroid Build Coastguard Worker 3*cc02d7e2SAndroid Build Coastguard WorkerClient and server use [test.proto](../src/proto/grpc/testing/test.proto). 4*cc02d7e2SAndroid Build Coastguard Worker 5*cc02d7e2SAndroid Build Coastguard Worker## Server 6*cc02d7e2SAndroid Build Coastguard Worker 7*cc02d7e2SAndroid Build Coastguard WorkerThe code for the xDS test server can be found at: 8*cc02d7e2SAndroid Build Coastguard Worker[Java](https://github.com/grpc/grpc-java/blob/master/interop-testing/src/main/java/io/grpc/testing/integration/XdsTestServer.java) (other language implementations are in progress). 9*cc02d7e2SAndroid Build Coastguard Worker 10*cc02d7e2SAndroid Build Coastguard WorkerServer should accept these arguments: 11*cc02d7e2SAndroid Build Coastguard Worker 12*cc02d7e2SAndroid Build Coastguard Worker* --port=PORT 13*cc02d7e2SAndroid Build Coastguard Worker * The port the test server will run on. 14*cc02d7e2SAndroid Build Coastguard Worker* --maintenance_port=PORT 15*cc02d7e2SAndroid Build Coastguard Worker * The port for the maintenance server running health, channelz, and admin(CSDS) services. 16*cc02d7e2SAndroid Build Coastguard Worker* --secure_mode=BOOLEAN 17*cc02d7e2SAndroid Build Coastguard Worker * When set to true it uses XdsServerCredentials with the test server for security test cases. 18*cc02d7e2SAndroid Build Coastguard Worker In case of secure mode, port and maintenance_port should be different. 19*cc02d7e2SAndroid Build Coastguard Worker 20*cc02d7e2SAndroid Build Coastguard WorkerIn addition, when handling requests, if the initial request metadata contains the `rpc-behavior` key, it should modify its handling of the request as follows: 21*cc02d7e2SAndroid Build Coastguard Worker 22*cc02d7e2SAndroid Build Coastguard Worker - If the value matches `sleep-<int>`, the server should wait the specified number of seconds before resuming behavior matching and RPC processing. 23*cc02d7e2SAndroid Build Coastguard Worker - If the value matches `keep-open`, the server should never respond to the request and behavior matching ends. 24*cc02d7e2SAndroid Build Coastguard Worker - If the value matches `error-code-<int>`, the server should respond with the specified status code and behavior matching ends. 25*cc02d7e2SAndroid Build Coastguard Worker - If the value matches `succeed-on-retry-attempt-<int>`, and the value of the `grpc-previous-rpc-attempts` metadata field is equal to the specified number, the normal RPC processing should resume and behavior matching ends. 26*cc02d7e2SAndroid Build Coastguard Worker - A value can have a prefix `hostname=<string>` followed by a space. In that case, the rest of the value should only be applied if the specified hostname matches the server's hostname. 27*cc02d7e2SAndroid Build Coastguard Worker 28*cc02d7e2SAndroid Build Coastguard WorkerThe `rpc-behavior` header value can have multiple options separated by commas. In that case, the value should be split by commas and the options should be applied in the order specified. If a request has multiple `rpc-behavior` metadata values, each one should be processed that way in order. 29*cc02d7e2SAndroid Build Coastguard Worker 30*cc02d7e2SAndroid Build Coastguard Worker## Client 31*cc02d7e2SAndroid Build Coastguard Worker 32*cc02d7e2SAndroid Build Coastguard WorkerThe base behavior of the xDS test client is to send a constant QPS of unary 33*cc02d7e2SAndroid Build Coastguard Workermessages and record the remote-peer distribution of the responses. Further, the 34*cc02d7e2SAndroid Build Coastguard Workerclient must expose an implementation of the `LoadBalancerStatsService` gRPC 35*cc02d7e2SAndroid Build Coastguard Workerservice to allow the test driver to validate the load balancing behavior for a 36*cc02d7e2SAndroid Build Coastguard Workerparticular test case (see below for more details). 37*cc02d7e2SAndroid Build Coastguard Worker 38*cc02d7e2SAndroid Build Coastguard WorkerThe code for the xDS test client can be at: 39*cc02d7e2SAndroid Build Coastguard Worker[Java](https://github.com/grpc/grpc-java/blob/master/interop-testing/src/main/java/io/grpc/testing/integration/XdsTestClient.java) (other language implementations are in progress). 40*cc02d7e2SAndroid Build Coastguard Worker 41*cc02d7e2SAndroid Build Coastguard WorkerClients should accept these arguments: 42*cc02d7e2SAndroid Build Coastguard Worker 43*cc02d7e2SAndroid Build Coastguard Worker* --fail_on_failed_rpcs=BOOL 44*cc02d7e2SAndroid Build Coastguard Worker * If true, the client should exit with a non-zero return code if any RPCs 45*cc02d7e2SAndroid Build Coastguard Worker fail after at least one RPC has succeeded, indicating a valid xDS config 46*cc02d7e2SAndroid Build Coastguard Worker was received. This accounts for any startup-related delays in receiving 47*cc02d7e2SAndroid Build Coastguard Worker an initial config from the load balancer. Default is false. 48*cc02d7e2SAndroid Build Coastguard Worker* --num_channels=CHANNELS 49*cc02d7e2SAndroid Build Coastguard Worker * The number of channels to create to the server. 50*cc02d7e2SAndroid Build Coastguard Worker* --qps=QPS 51*cc02d7e2SAndroid Build Coastguard Worker * The QPS per channel. 52*cc02d7e2SAndroid Build Coastguard Worker* --server=HOSTNAME:PORT 53*cc02d7e2SAndroid Build Coastguard Worker * The server host to connect to. For example, "localhost:8080" 54*cc02d7e2SAndroid Build Coastguard Worker* --stats_port=PORT 55*cc02d7e2SAndroid Build Coastguard Worker * The port for to expose the client's `LoadBalancerStatsService` 56*cc02d7e2SAndroid Build Coastguard Worker implementation. 57*cc02d7e2SAndroid Build Coastguard Worker* --rpc_timeout_sec=SEC 58*cc02d7e2SAndroid Build Coastguard Worker * The timeout to set on all outbound RPCs. Default is 20. 59*cc02d7e2SAndroid Build Coastguard Worker* --secure_mode=BOOLEAN 60*cc02d7e2SAndroid Build Coastguard Worker * When set to true it uses XdsChannelCredentials with the test client for security test cases. 61*cc02d7e2SAndroid Build Coastguard Worker 62*cc02d7e2SAndroid Build Coastguard Worker### XdsUpdateClientConfigureService 63*cc02d7e2SAndroid Build Coastguard Worker 64*cc02d7e2SAndroid Build Coastguard WorkerThe xDS test client's behavior can be dynamically changed in the middle of tests. 65*cc02d7e2SAndroid Build Coastguard WorkerThis is achieved by invoking the `XdsUpdateClientConfigureService` gRPC service 66*cc02d7e2SAndroid Build Coastguard Workeron the test client. This can be useful for tests requiring special client behaviors 67*cc02d7e2SAndroid Build Coastguard Workerthat are not desirable at test initialization and client warmup. The service is 68*cc02d7e2SAndroid Build Coastguard Workerdefined as: 69*cc02d7e2SAndroid Build Coastguard Worker 70*cc02d7e2SAndroid Build Coastguard Worker``` 71*cc02d7e2SAndroid Build Coastguard Workermessage ClientConfigureRequest { 72*cc02d7e2SAndroid Build Coastguard Worker // Type of RPCs to send. 73*cc02d7e2SAndroid Build Coastguard Worker enum RpcType { 74*cc02d7e2SAndroid Build Coastguard Worker EMPTY_CALL = 0; 75*cc02d7e2SAndroid Build Coastguard Worker UNARY_CALL = 1; 76*cc02d7e2SAndroid Build Coastguard Worker } 77*cc02d7e2SAndroid Build Coastguard Worker 78*cc02d7e2SAndroid Build Coastguard Worker // Metadata to be attached for the given type of RPCs. 79*cc02d7e2SAndroid Build Coastguard Worker message Metadata { 80*cc02d7e2SAndroid Build Coastguard Worker RpcType type = 1; 81*cc02d7e2SAndroid Build Coastguard Worker string key = 2; 82*cc02d7e2SAndroid Build Coastguard Worker string value = 3; 83*cc02d7e2SAndroid Build Coastguard Worker } 84*cc02d7e2SAndroid Build Coastguard Worker 85*cc02d7e2SAndroid Build Coastguard Worker // The types of RPCs the client sends. 86*cc02d7e2SAndroid Build Coastguard Worker repeated RpcType types = 1; 87*cc02d7e2SAndroid Build Coastguard Worker // The collection of custom metadata to be attached to RPCs sent by the client. 88*cc02d7e2SAndroid Build Coastguard Worker repeated Metadata metadata = 2; 89*cc02d7e2SAndroid Build Coastguard Worker // The deadline to use, in seconds, for all RPCs. If unset or zero, the 90*cc02d7e2SAndroid Build Coastguard Worker // client will use the default from the command-line. 91*cc02d7e2SAndroid Build Coastguard Worker int32 timeout_sec = 3; 92*cc02d7e2SAndroid Build Coastguard Worker} 93*cc02d7e2SAndroid Build Coastguard Worker 94*cc02d7e2SAndroid Build Coastguard Workermessage ClientConfigureResponse {} 95*cc02d7e2SAndroid Build Coastguard Worker 96*cc02d7e2SAndroid Build Coastguard Workerservice XdsUpdateClientConfigureService { 97*cc02d7e2SAndroid Build Coastguard Worker // Update the tes client's configuration. 98*cc02d7e2SAndroid Build Coastguard Worker rpc Configure(ClientConfigureRequest) returns (ClientConfigureResponse); 99*cc02d7e2SAndroid Build Coastguard Worker} 100*cc02d7e2SAndroid Build Coastguard Worker``` 101*cc02d7e2SAndroid Build Coastguard Worker 102*cc02d7e2SAndroid Build Coastguard WorkerThe test client changes its behavior right after receiving the 103*cc02d7e2SAndroid Build Coastguard Worker`ClientConfigureRequest`. Currently it only supports configuring the type(s) 104*cc02d7e2SAndroid Build Coastguard Workerof RPCs sent by the test client, metadata attached to each type of RPCs, and the timeout. 105*cc02d7e2SAndroid Build Coastguard Worker 106*cc02d7e2SAndroid Build Coastguard Worker## Test Driver 107*cc02d7e2SAndroid Build Coastguard Worker 108*cc02d7e2SAndroid Build Coastguard WorkerNote that, unlike our other interop tests, neither the client nor the server has 109*cc02d7e2SAndroid Build Coastguard Workerany notion of which of the following test scenarios is under test. Instead, a 110*cc02d7e2SAndroid Build Coastguard Workerseparate test driver is responsible for configuring the load balancer and the 111*cc02d7e2SAndroid Build Coastguard Workerserver backends, running the client, and then querying the client's 112*cc02d7e2SAndroid Build Coastguard Worker`LoadBalancerStatsService` to validate load balancer behavior for each of the 113*cc02d7e2SAndroid Build Coastguard Workertests described below. 114*cc02d7e2SAndroid Build Coastguard Worker 115*cc02d7e2SAndroid Build Coastguard Worker## LoadBalancerStatsService 116*cc02d7e2SAndroid Build Coastguard Worker 117*cc02d7e2SAndroid Build Coastguard WorkerThe service is defined as: 118*cc02d7e2SAndroid Build Coastguard Worker 119*cc02d7e2SAndroid Build Coastguard Worker``` 120*cc02d7e2SAndroid Build Coastguard Workermessage LoadBalancerStatsRequest { 121*cc02d7e2SAndroid Build Coastguard Worker // Request stats for the next num_rpcs sent by client. 122*cc02d7e2SAndroid Build Coastguard Worker int32 num_rpcs = 1; 123*cc02d7e2SAndroid Build Coastguard Worker // If num_rpcs have not completed within timeout_sec, return partial results. 124*cc02d7e2SAndroid Build Coastguard Worker int32 timeout_sec = 2; 125*cc02d7e2SAndroid Build Coastguard Worker} 126*cc02d7e2SAndroid Build Coastguard Worker 127*cc02d7e2SAndroid Build Coastguard Workermessage LoadBalancerStatsResponse { 128*cc02d7e2SAndroid Build Coastguard Worker message RpcsByPeer { 129*cc02d7e2SAndroid Build Coastguard Worker // The number of completed RPCs for each peer. 130*cc02d7e2SAndroid Build Coastguard Worker map<string, int32> rpcs_by_peer = 1; 131*cc02d7e2SAndroid Build Coastguard Worker } 132*cc02d7e2SAndroid Build Coastguard Worker // The number of completed RPCs for each peer. 133*cc02d7e2SAndroid Build Coastguard Worker map<string, int32> rpcs_by_peer = 1; 134*cc02d7e2SAndroid Build Coastguard Worker // The number of RPCs that failed to record a remote peer. 135*cc02d7e2SAndroid Build Coastguard Worker int32 num_failures = 2; 136*cc02d7e2SAndroid Build Coastguard Worker map<string, RpcsByPeer> rpcs_by_method = 3; 137*cc02d7e2SAndroid Build Coastguard Worker} 138*cc02d7e2SAndroid Build Coastguard Worker 139*cc02d7e2SAndroid Build Coastguard Workermessage LoadBalancerAccumulatedStatsRequest {} 140*cc02d7e2SAndroid Build Coastguard Worker 141*cc02d7e2SAndroid Build Coastguard Workermessage LoadBalancerAccumulatedStatsResponse { 142*cc02d7e2SAndroid Build Coastguard Worker // The total number of RPCs have ever issued for each type. 143*cc02d7e2SAndroid Build Coastguard Worker // Deprecated: use stats_per_method.rpcs_started instead. 144*cc02d7e2SAndroid Build Coastguard Worker map<string, int32> num_rpcs_started_by_method = 1 [deprecated = true]; 145*cc02d7e2SAndroid Build Coastguard Worker // The total number of RPCs have ever completed successfully for each type. 146*cc02d7e2SAndroid Build Coastguard Worker // Deprecated: use stats_per_method.result instead. 147*cc02d7e2SAndroid Build Coastguard Worker map<string, int32> num_rpcs_succeeded_by_method = 2 [deprecated = true]; 148*cc02d7e2SAndroid Build Coastguard Worker // The total number of RPCs have ever failed for each type. 149*cc02d7e2SAndroid Build Coastguard Worker // Deprecated: use stats_per_method.result instead. 150*cc02d7e2SAndroid Build Coastguard Worker map<string, int32> num_rpcs_failed_by_method = 3 [deprecated = true]; 151*cc02d7e2SAndroid Build Coastguard Worker 152*cc02d7e2SAndroid Build Coastguard Worker message MethodStats { 153*cc02d7e2SAndroid Build Coastguard Worker // The number of RPCs that were started for this method. 154*cc02d7e2SAndroid Build Coastguard Worker int32 rpcs_started = 1; 155*cc02d7e2SAndroid Build Coastguard Worker 156*cc02d7e2SAndroid Build Coastguard Worker // The number of RPCs that completed with each status for this method. The 157*cc02d7e2SAndroid Build Coastguard Worker // key is the integral value of a google.rpc.Code; the value is the count. 158*cc02d7e2SAndroid Build Coastguard Worker map<int32, int32> result = 2; 159*cc02d7e2SAndroid Build Coastguard Worker } 160*cc02d7e2SAndroid Build Coastguard Worker 161*cc02d7e2SAndroid Build Coastguard Worker // Per-method RPC statistics. The key is the RpcType in string form; e.g. 162*cc02d7e2SAndroid Build Coastguard Worker // 'EMPTY_CALL' or 'UNARY_CALL' 163*cc02d7e2SAndroid Build Coastguard Worker map<string, MethodStats> stats_per_method = 4; 164*cc02d7e2SAndroid Build Coastguard Worker} 165*cc02d7e2SAndroid Build Coastguard Worker 166*cc02d7e2SAndroid Build Coastguard Workerservice LoadBalancerStatsService { 167*cc02d7e2SAndroid Build Coastguard Worker // Gets the backend distribution for RPCs sent by a test client. 168*cc02d7e2SAndroid Build Coastguard Worker rpc GetClientStats(LoadBalancerStatsRequest) 169*cc02d7e2SAndroid Build Coastguard Worker returns (LoadBalancerStatsResponse) {} 170*cc02d7e2SAndroid Build Coastguard Worker // Gets the accumulated stats for RPCs sent by a test client. 171*cc02d7e2SAndroid Build Coastguard Worker rpc GetClientAccumulatedStats(LoadBalancerAccumulatedStatsRequest) 172*cc02d7e2SAndroid Build Coastguard Worker returns (LoadBalancerAccumulatedStatsResponse) {} 173*cc02d7e2SAndroid Build Coastguard Worker} 174*cc02d7e2SAndroid Build Coastguard Worker``` 175*cc02d7e2SAndroid Build Coastguard Worker 176*cc02d7e2SAndroid Build Coastguard WorkerNote that the `LoadBalancerStatsResponse` contains the remote peer distribution 177*cc02d7e2SAndroid Build Coastguard Workerof the next `num_rpcs` *sent* by the client after receiving the 178*cc02d7e2SAndroid Build Coastguard Worker`LoadBalancerStatsRequest`. It is important that the remote peer distribution be 179*cc02d7e2SAndroid Build Coastguard Workerrecorded for a block of consecutive outgoing RPCs, to validate the intended 180*cc02d7e2SAndroid Build Coastguard Workerdistribution from the load balancer, rather than just looking at the next 181*cc02d7e2SAndroid Build Coastguard Worker`num_rpcs` responses received from backends, as different backends may respond 182*cc02d7e2SAndroid Build Coastguard Workerat different rates. 183*cc02d7e2SAndroid Build Coastguard Worker 184*cc02d7e2SAndroid Build Coastguard Worker## Test Cases 185*cc02d7e2SAndroid Build Coastguard Worker 186*cc02d7e2SAndroid Build Coastguard Worker### ping_pong 187*cc02d7e2SAndroid Build Coastguard Worker 188*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that every backend receives traffic. 189*cc02d7e2SAndroid Build Coastguard Worker 190*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 191*cc02d7e2SAndroid Build Coastguard Worker 192*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 193*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 194*cc02d7e2SAndroid Build Coastguard Worker1. --fail_on_failed_rpc=true 195*cc02d7e2SAndroid Build Coastguard Worker 196*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 197*cc02d7e2SAndroid Build Coastguard Worker 198*cc02d7e2SAndroid Build Coastguard Worker1. 4 backends are created in a single managed instance group (MIG). 199*cc02d7e2SAndroid Build Coastguard Worker 200*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 201*cc02d7e2SAndroid Build Coastguard Worker 202*cc02d7e2SAndroid Build Coastguard Worker1. All backends receive at least one RPC 203*cc02d7e2SAndroid Build Coastguard Worker 204*cc02d7e2SAndroid Build Coastguard Worker### round_robin 205*cc02d7e2SAndroid Build Coastguard Worker 206*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that RPCs are evenly routed according to an unweighted round 207*cc02d7e2SAndroid Build Coastguard Workerrobin policy. 208*cc02d7e2SAndroid Build Coastguard Worker 209*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 210*cc02d7e2SAndroid Build Coastguard Worker 211*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 212*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 213*cc02d7e2SAndroid Build Coastguard Worker1. --fail_on_failed_rpc=true 214*cc02d7e2SAndroid Build Coastguard Worker 215*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 216*cc02d7e2SAndroid Build Coastguard Worker 217*cc02d7e2SAndroid Build Coastguard Worker1. 4 backends are created in a single MIG. 218*cc02d7e2SAndroid Build Coastguard Worker 219*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts that: 220*cc02d7e2SAndroid Build Coastguard Worker 221*cc02d7e2SAndroid Build Coastguard Worker1. Once all backends receive at least one RPC, the following 100 RPCs are 222*cc02d7e2SAndroid Build Coastguard Worker evenly distributed across the 4 backends. 223*cc02d7e2SAndroid Build Coastguard Worker 224*cc02d7e2SAndroid Build Coastguard Worker### backends_restart 225*cc02d7e2SAndroid Build Coastguard Worker 226*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the load balancer will resume sending traffic to a set 227*cc02d7e2SAndroid Build Coastguard Workerof backends that is stopped and then resumed. 228*cc02d7e2SAndroid Build Coastguard Worker 229*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 230*cc02d7e2SAndroid Build Coastguard Worker 231*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 232*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 233*cc02d7e2SAndroid Build Coastguard Worker 234*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 235*cc02d7e2SAndroid Build Coastguard Worker 236*cc02d7e2SAndroid Build Coastguard Worker1. 4 backends are created in a single MIG. 237*cc02d7e2SAndroid Build Coastguard Worker 238*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 239*cc02d7e2SAndroid Build Coastguard Worker 240*cc02d7e2SAndroid Build Coastguard Worker1. All backends receive at least one RPC. 241*cc02d7e2SAndroid Build Coastguard Worker 242*cc02d7e2SAndroid Build Coastguard WorkerThe test driver records the peer distribution for a subsequent block of 100 RPCs 243*cc02d7e2SAndroid Build Coastguard Workerthen stops the backends. 244*cc02d7e2SAndroid Build Coastguard Worker 245*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 246*cc02d7e2SAndroid Build Coastguard Worker 247*cc02d7e2SAndroid Build Coastguard Worker1. No RPCs from the client are successful. 248*cc02d7e2SAndroid Build Coastguard Worker 249*cc02d7e2SAndroid Build Coastguard WorkerThe test driver resumes the backends. 250*cc02d7e2SAndroid Build Coastguard Worker 251*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 252*cc02d7e2SAndroid Build Coastguard Worker 253*cc02d7e2SAndroid Build Coastguard Worker1. Once all backends receive at least one RPC, the distribution for a block of 254*cc02d7e2SAndroid Build Coastguard Worker 100 RPCs is the same as the distribution recorded prior to restart. 255*cc02d7e2SAndroid Build Coastguard Worker 256*cc02d7e2SAndroid Build Coastguard Worker### secondary_locality_gets_requests_on_primary_failure 257*cc02d7e2SAndroid Build Coastguard Worker 258*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that backends in a secondary locality receive traffic when 259*cc02d7e2SAndroid Build Coastguard Workerall backends in the primary locality fail. 260*cc02d7e2SAndroid Build Coastguard Worker 261*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 262*cc02d7e2SAndroid Build Coastguard Worker 263*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 264*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 265*cc02d7e2SAndroid Build Coastguard Worker 266*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 267*cc02d7e2SAndroid Build Coastguard Worker 268*cc02d7e2SAndroid Build Coastguard Worker1. The primary MIG with 2 backends in the same zone as the client 269*cc02d7e2SAndroid Build Coastguard Worker1. The secondary MIG with 2 backends in a different zone 270*cc02d7e2SAndroid Build Coastguard Worker 271*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 272*cc02d7e2SAndroid Build Coastguard Worker 273*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the primary locality receive at least 1 RPC. 274*cc02d7e2SAndroid Build Coastguard Worker1. No backends in the secondary locality receive RPCs. 275*cc02d7e2SAndroid Build Coastguard Worker 276*cc02d7e2SAndroid Build Coastguard WorkerThe test driver stops the backends in the primary locality. 277*cc02d7e2SAndroid Build Coastguard Worker 278*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 279*cc02d7e2SAndroid Build Coastguard Worker 280*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the secondary locality receive at least 1 RPC. 281*cc02d7e2SAndroid Build Coastguard Worker 282*cc02d7e2SAndroid Build Coastguard WorkerThe test driver resumes the backends in the primary locality. 283*cc02d7e2SAndroid Build Coastguard Worker 284*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 285*cc02d7e2SAndroid Build Coastguard Worker 286*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the primary locality receive at least 1 RPC. 287*cc02d7e2SAndroid Build Coastguard Worker1. No backends in the secondary locality receive RPCs. 288*cc02d7e2SAndroid Build Coastguard Worker 289*cc02d7e2SAndroid Build Coastguard Worker### secondary_locality_gets_no_requests_on_partial_primary_failure 290*cc02d7e2SAndroid Build Coastguard Worker 291*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that backends in a failover locality do not receive traffic 292*cc02d7e2SAndroid Build Coastguard Workerwhen at least one of the backends in the primary locality remain healthy. 293*cc02d7e2SAndroid Build Coastguard Worker 294*cc02d7e2SAndroid Build Coastguard Worker**Note:** Future TD features may change the expected behavior and require 295*cc02d7e2SAndroid Build Coastguard Workerchanges to this test case. 296*cc02d7e2SAndroid Build Coastguard Worker 297*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 298*cc02d7e2SAndroid Build Coastguard Worker 299*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 300*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 301*cc02d7e2SAndroid Build Coastguard Worker 302*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 303*cc02d7e2SAndroid Build Coastguard Worker 304*cc02d7e2SAndroid Build Coastguard Worker1. The primary MIG with 2 backends in the same zone as the client 305*cc02d7e2SAndroid Build Coastguard Worker1. The secondary MIG with 2 backends in a different zone 306*cc02d7e2SAndroid Build Coastguard Worker 307*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 308*cc02d7e2SAndroid Build Coastguard Worker 309*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the primary locality receive at least 1 RPC. 310*cc02d7e2SAndroid Build Coastguard Worker1. No backends in the secondary locality receive RPCs. 311*cc02d7e2SAndroid Build Coastguard Worker 312*cc02d7e2SAndroid Build Coastguard WorkerThe test driver stops one of the backends in the primary locality. 313*cc02d7e2SAndroid Build Coastguard Worker 314*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 315*cc02d7e2SAndroid Build Coastguard Worker 316*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the primary locality receive at least 1 RPC. 317*cc02d7e2SAndroid Build Coastguard Worker1. No backends in the secondary locality receive RPCs. 318*cc02d7e2SAndroid Build Coastguard Worker 319*cc02d7e2SAndroid Build Coastguard Worker### remove_instance_group 320*cc02d7e2SAndroid Build Coastguard Worker 321*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that a remaining instance group can successfully serve RPCs 322*cc02d7e2SAndroid Build Coastguard Workerafter removal of another instance group in the same zone. 323*cc02d7e2SAndroid Build Coastguard Worker 324*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 325*cc02d7e2SAndroid Build Coastguard Worker 326*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 327*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 328*cc02d7e2SAndroid Build Coastguard Worker 329*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 330*cc02d7e2SAndroid Build Coastguard Worker 331*cc02d7e2SAndroid Build Coastguard Worker1. Two MIGs with two backends each, using rate balancing mode. 332*cc02d7e2SAndroid Build Coastguard Worker 333*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 334*cc02d7e2SAndroid Build Coastguard Worker 335*cc02d7e2SAndroid Build Coastguard Worker1. All backends receive at least one RPC. 336*cc02d7e2SAndroid Build Coastguard Worker 337*cc02d7e2SAndroid Build Coastguard WorkerThe test driver removes one MIG. 338*cc02d7e2SAndroid Build Coastguard Worker 339*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 340*cc02d7e2SAndroid Build Coastguard Worker 341*cc02d7e2SAndroid Build Coastguard Worker1. All RPCs are directed to the two remaining backends (no RPC failures). 342*cc02d7e2SAndroid Build Coastguard Worker 343*cc02d7e2SAndroid Build Coastguard Worker### change_backend_service 344*cc02d7e2SAndroid Build Coastguard Worker 345*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the backend service can be replaced and traffic routed 346*cc02d7e2SAndroid Build Coastguard Workerto the new backends. 347*cc02d7e2SAndroid Build Coastguard Worker 348*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 349*cc02d7e2SAndroid Build Coastguard Worker 350*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 351*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 352*cc02d7e2SAndroid Build Coastguard Worker1. --fail_on_failed_rpc=true 353*cc02d7e2SAndroid Build Coastguard Worker 354*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 355*cc02d7e2SAndroid Build Coastguard Worker 356*cc02d7e2SAndroid Build Coastguard Worker1. One MIG with two backends 357*cc02d7e2SAndroid Build Coastguard Worker 358*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 359*cc02d7e2SAndroid Build Coastguard Worker 360*cc02d7e2SAndroid Build Coastguard Worker1. All backends receive at least one RPC. 361*cc02d7e2SAndroid Build Coastguard Worker 362*cc02d7e2SAndroid Build Coastguard WorkerThe test driver creates a new backend service containing a MIG with two backends 363*cc02d7e2SAndroid Build Coastguard Workerand changes the TD URL map to point to this new backend service. 364*cc02d7e2SAndroid Build Coastguard Worker 365*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 366*cc02d7e2SAndroid Build Coastguard Worker 367*cc02d7e2SAndroid Build Coastguard Worker1. All RPCs are directed to the new backend service. 368*cc02d7e2SAndroid Build Coastguard Worker 369*cc02d7e2SAndroid Build Coastguard Worker### traffic_splitting 370*cc02d7e2SAndroid Build Coastguard Worker 371*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the traffic will be distributed between backend 372*cc02d7e2SAndroid Build Coastguard Workerservices with the correct weights when route action is set to weighted 373*cc02d7e2SAndroid Build Coastguard Workerbackend services. 374*cc02d7e2SAndroid Build Coastguard Worker 375*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 376*cc02d7e2SAndroid Build Coastguard Worker 377*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 378*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 379*cc02d7e2SAndroid Build Coastguard Worker 380*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 381*cc02d7e2SAndroid Build Coastguard Worker 382*cc02d7e2SAndroid Build Coastguard Worker1. One MIG with one backend 383*cc02d7e2SAndroid Build Coastguard Worker 384*cc02d7e2SAndroid Build Coastguard WorkerAssert: 385*cc02d7e2SAndroid Build Coastguard Worker 386*cc02d7e2SAndroid Build Coastguard Worker1. Once all backends receive at least one RPC, the following 1000 RPCs are 387*cc02d7e2SAndroid Build Coastguard Workerall sent to MIG_a. 388*cc02d7e2SAndroid Build Coastguard Worker 389*cc02d7e2SAndroid Build Coastguard WorkerThe test driver adds a new MIG with 1 backend, and changes the route action 390*cc02d7e2SAndroid Build Coastguard Workerto weighted backend services with {a: 20, b: 80}. 391*cc02d7e2SAndroid Build Coastguard Worker 392*cc02d7e2SAndroid Build Coastguard WorkerAssert: 393*cc02d7e2SAndroid Build Coastguard Worker 394*cc02d7e2SAndroid Build Coastguard Worker1. Once all backends receive at least one RPC, the following 1000 RPCs are 395*cc02d7e2SAndroid Build Coastguard Workerdistributed across the 2 backends as a: 20, b: 80. 396*cc02d7e2SAndroid Build Coastguard Worker### path_matching 397*cc02d7e2SAndroid Build Coastguard Worker 398*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the traffic for a certain RPC can be routed to a 399*cc02d7e2SAndroid Build Coastguard Workerspecific cluster based on the RPC path. 400*cc02d7e2SAndroid Build Coastguard Worker 401*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 402*cc02d7e2SAndroid Build Coastguard Worker 403*cc02d7e2SAndroid Build Coastguard Worker1. –num_channels=1 404*cc02d7e2SAndroid Build Coastguard Worker1. –qps=10 405*cc02d7e2SAndroid Build Coastguard Worker1. –fail_on_failed_rpc=true 406*cc02d7e2SAndroid Build Coastguard Worker1. –rpc=“EmptyCall,UnaryCall” 407*cc02d7e2SAndroid Build Coastguard Worker 408*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 409*cc02d7e2SAndroid Build Coastguard Worker 410*cc02d7e2SAndroid Build Coastguard Worker1. 2 MIGs, each with 1 backend 411*cc02d7e2SAndroid Build Coastguard Worker1. routes 412*cc02d7e2SAndroid Build Coastguard Worker - “/”: MIG_default 413*cc02d7e2SAndroid Build Coastguard Worker 414*cc02d7e2SAndroid Build Coastguard WorkerAssert: 415*cc02d7e2SAndroid Build Coastguard Worker 416*cc02d7e2SAndroid Build Coastguard Worker1. UnaryCall RPCs are sent to MIG_default 417*cc02d7e2SAndroid Build Coastguard Worker1. EmptyCall RPCs are sent to MIG_default 418*cc02d7e2SAndroid Build Coastguard Worker 419*cc02d7e2SAndroid Build Coastguard WorkerThe test driver changes route and asserts RPCs are sent to expected backends. **Note** that the default route `"/"` is always pointing to MIG_default, so all RPCs not matching the new route will be sent to MIG_default. 420*cc02d7e2SAndroid Build Coastguard Worker 421*cc02d7e2SAndroid Build Coastguard Worker- {path: `/grpc.testing.TestService/EmptyCall`}: MIG_2 422*cc02d7e2SAndroid Build Coastguard Worker - UnaryCall -> MIG_default 423*cc02d7e2SAndroid Build Coastguard Worker - EmptyCall -> MIG_2 424*cc02d7e2SAndroid Build Coastguard Worker 425*cc02d7e2SAndroid Build Coastguard Worker- {prefix: `/grpc.testing.TestService/Unary`}: MIG_2 426*cc02d7e2SAndroid Build Coastguard Worker - UnaryCall -> MIG_2 427*cc02d7e2SAndroid Build Coastguard Worker - EmptyCall -> MIG_default 428*cc02d7e2SAndroid Build Coastguard Worker 429*cc02d7e2SAndroid Build Coastguard Worker- {prefix: `/grpc.testing.TestService/Unary`}: MIG_default & {path: `/grpc.testing.TestService/EmptyCall`}: MIG_2 430*cc02d7e2SAndroid Build Coastguard Worker - UnaryCall -> MIG_default 431*cc02d7e2SAndroid Build Coastguard Worker - EmptyCall -> MIG_2 432*cc02d7e2SAndroid Build Coastguard Worker 433*cc02d7e2SAndroid Build Coastguard Worker- {regex: `^\/.*\/UnaryCall$`}: MIG_2 434*cc02d7e2SAndroid Build Coastguard Worker - UnaryCall -> MIG_2 435*cc02d7e2SAndroid Build Coastguard Worker - EmptyCall -> MIG_default 436*cc02d7e2SAndroid Build Coastguard Worker 437*cc02d7e2SAndroid Build Coastguard Worker- {path: `/gRpC.tEsTinG.tEstseRvice/empTycaLl`, ignoreCase: `True`}: MIG_2 438*cc02d7e2SAndroid Build Coastguard Worker - UnaryCall -> MIG_default 439*cc02d7e2SAndroid Build Coastguard Worker - EmptyCall -> MIG_2 440*cc02d7e2SAndroid Build Coastguard Worker 441*cc02d7e2SAndroid Build Coastguard Worker### header_matching 442*cc02d7e2SAndroid Build Coastguard Worker 443*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the traffic for a certain RPC can be routed to a 444*cc02d7e2SAndroid Build Coastguard Workerspecific cluster based on the RPC header (metadata). 445*cc02d7e2SAndroid Build Coastguard Worker 446*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 447*cc02d7e2SAndroid Build Coastguard Worker 448*cc02d7e2SAndroid Build Coastguard Worker1. –num_channels=1 449*cc02d7e2SAndroid Build Coastguard Worker1. –qps=10 450*cc02d7e2SAndroid Build Coastguard Worker1. –fail_on_failed_rpc=true 451*cc02d7e2SAndroid Build Coastguard Worker1. –rpc=“EmptyCall,UnaryCall” 452*cc02d7e2SAndroid Build Coastguard Worker1. –rpc=“EmptyCall:xds_md:exact_match” 453*cc02d7e2SAndroid Build Coastguard Worker 454*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 455*cc02d7e2SAndroid Build Coastguard Worker 456*cc02d7e2SAndroid Build Coastguard Worker1. 2 MIGs, each with 1 backend 457*cc02d7e2SAndroid Build Coastguard Worker1. routes 458*cc02d7e2SAndroid Build Coastguard Worker - “/”: MIG_default 459*cc02d7e2SAndroid Build Coastguard Worker 460*cc02d7e2SAndroid Build Coastguard WorkerAssert: 461*cc02d7e2SAndroid Build Coastguard Worker 462*cc02d7e2SAndroid Build Coastguard Worker1. UnaryCall RPCs are sent to MIG_default 463*cc02d7e2SAndroid Build Coastguard Worker1. EmptyCall RPCs are sent to MIG_default 464*cc02d7e2SAndroid Build Coastguard Worker 465*cc02d7e2SAndroid Build Coastguard WorkerThe test driver changes route and asserts RPCs are sent to expected backends. **Note** that the default route `"/"` is always pointing to MIG_default, so all RPCs not matching the new route will be sent to MIG_default. 466*cc02d7e2SAndroid Build Coastguard Worker 467*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md`, exact: `empty_ytpme`}: MIG_2 468*cc02d7e2SAndroid Build Coastguard Worker - Unary -> MIG_default 469*cc02d7e2SAndroid Build Coastguard Worker - Empty -> MIG_2 470*cc02d7e2SAndroid Build Coastguard Worker 471*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md`, prefix: `un`}: MIG_2 472*cc02d7e2SAndroid Build Coastguard Worker - `un` is the prefix of metadata sent with UnaryCall 473*cc02d7e2SAndroid Build Coastguard Worker - Unary -> MIG_2 474*cc02d7e2SAndroid Build Coastguard Worker - Empty -> MIG_default 475*cc02d7e2SAndroid Build Coastguard Worker 476*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md`, suffix: `me`}: MIG_2 477*cc02d7e2SAndroid Build Coastguard Worker - `me` is the suffix of metadata sent with EmptyCall 478*cc02d7e2SAndroid Build Coastguard Worker - Unary -> MIG_default 479*cc02d7e2SAndroid Build Coastguard Worker - Empty to MIG_2 480*cc02d7e2SAndroid Build Coastguard Worker 481*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md_numeric`, present: `True`}: MIG_2 482*cc02d7e2SAndroid Build Coastguard Worker - Unary is sent with the metadata, so will be sent to alternative 483*cc02d7e2SAndroid Build Coastguard Worker - Unary -> MIG_2 484*cc02d7e2SAndroid Build Coastguard Worker - Empty -> MIG_default 485*cc02d7e2SAndroid Build Coastguard Worker 486*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md`, exact: `unary_yranu`, invert: `True`}: MIG_2 487*cc02d7e2SAndroid Build Coastguard Worker - Unary is sent with the metadata, so this will not match Unary, but will match Empty 488*cc02d7e2SAndroid Build Coastguard Worker - Unary -> MIG_default 489*cc02d7e2SAndroid Build Coastguard Worker - Empty to MIG_2 490*cc02d7e2SAndroid Build Coastguard Worker 491*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md_numeric`, range `[100,200]`}: MIG_2 492*cc02d7e2SAndroid Build Coastguard Worker - Unary is sent with the metadata in range 493*cc02d7e2SAndroid Build Coastguard Worker - Unary -> MIG_2 494*cc02d7e2SAndroid Build Coastguard Worker - Empty -> MIG_default 495*cc02d7e2SAndroid Build Coastguard Worker 496*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md`, regex: `^em.*me$`}: MIG_2 497*cc02d7e2SAndroid Build Coastguard Worker - EmptyCall is sent with the metadata 498*cc02d7e2SAndroid Build Coastguard Worker - Unary -> MIG_default 499*cc02d7e2SAndroid Build Coastguard Worker - Empty -> MIG_2 500*cc02d7e2SAndroid Build Coastguard Worker 501*cc02d7e2SAndroid Build Coastguard Worker### gentle_failover 502*cc02d7e2SAndroid Build Coastguard Worker 503*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that traffic is partially diverted to a secondary locality 504*cc02d7e2SAndroid Build Coastguard Workerwhen > 50% of the instances in the primary locality are unhealthy. 505*cc02d7e2SAndroid Build Coastguard Worker 506*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 507*cc02d7e2SAndroid Build Coastguard Worker 508*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 509*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 510*cc02d7e2SAndroid Build Coastguard Worker 511*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 512*cc02d7e2SAndroid Build Coastguard Worker 513*cc02d7e2SAndroid Build Coastguard Worker1. The primary MIG with 3 backends in the same zone as the client 514*cc02d7e2SAndroid Build Coastguard Worker1. The secondary MIG with 2 backends in a different zone 515*cc02d7e2SAndroid Build Coastguard Worker 516*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 517*cc02d7e2SAndroid Build Coastguard Worker 518*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the primary locality receive at least 1 RPC. 519*cc02d7e2SAndroid Build Coastguard Worker1. No backends in the secondary locality receive RPCs. 520*cc02d7e2SAndroid Build Coastguard Worker 521*cc02d7e2SAndroid Build Coastguard WorkerThe test driver stops 2 of 3 backends in the primary locality. 522*cc02d7e2SAndroid Build Coastguard Worker 523*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 524*cc02d7e2SAndroid Build Coastguard Worker 525*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the secondary locality receive at least 1 RPC. 526*cc02d7e2SAndroid Build Coastguard Worker1. The remaining backend in the primary locality receives at least 1 RPC. 527*cc02d7e2SAndroid Build Coastguard Worker 528*cc02d7e2SAndroid Build Coastguard WorkerThe test driver resumes the backends in the primary locality. 529*cc02d7e2SAndroid Build Coastguard Worker 530*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 531*cc02d7e2SAndroid Build Coastguard Worker 532*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the primary locality receive at least 1 RPC. 533*cc02d7e2SAndroid Build Coastguard Worker1. No backends in the secondary locality receive RPCs. 534*cc02d7e2SAndroid Build Coastguard Worker 535*cc02d7e2SAndroid Build Coastguard Worker 536*cc02d7e2SAndroid Build Coastguard Worker### load_based_failover 537*cc02d7e2SAndroid Build Coastguard Worker 538*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that traffic is partially diverted to a secondary locality 539*cc02d7e2SAndroid Build Coastguard Workerwhen the QPS is greater than the configured RPS in the priority locality. 540*cc02d7e2SAndroid Build Coastguard Worker 541*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 542*cc02d7e2SAndroid Build Coastguard Worker 543*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 544*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 545*cc02d7e2SAndroid Build Coastguard Worker 546*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 547*cc02d7e2SAndroid Build Coastguard Worker 548*cc02d7e2SAndroid Build Coastguard Worker1. The primary MIG with 2 backends in the same zone as the client 549*cc02d7e2SAndroid Build Coastguard Worker1. The secondary MIG with 2 backends in a different zone 550*cc02d7e2SAndroid Build Coastguard Worker 551*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 552*cc02d7e2SAndroid Build Coastguard Worker 553*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the primary locality receive at least 1 RPC. 554*cc02d7e2SAndroid Build Coastguard Worker1. No backends in the secondary locality receive RPCs. 555*cc02d7e2SAndroid Build Coastguard Worker 556*cc02d7e2SAndroid Build Coastguard WorkerThe test driver sets `balancingMode` is `RATE`, and `maxRate` to 20 in the primary locality. 557*cc02d7e2SAndroid Build Coastguard Worker 558*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 559*cc02d7e2SAndroid Build Coastguard Worker 560*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the primary locality receive at least 1 RPC. 561*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the secondary locality receive at least 1 RPC. 562*cc02d7e2SAndroid Build Coastguard Worker 563*cc02d7e2SAndroid Build Coastguard WorkerThe test driver set `maxRate` to 120 in the primary locality. 564*cc02d7e2SAndroid Build Coastguard Worker 565*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 566*cc02d7e2SAndroid Build Coastguard Worker 567*cc02d7e2SAndroid Build Coastguard Worker1. All backends in the primary locality receive at least 1 RPC. 568*cc02d7e2SAndroid Build Coastguard Worker1. No backends in the secondary locality receive RPCs. 569*cc02d7e2SAndroid Build Coastguard Worker 570*cc02d7e2SAndroid Build Coastguard Worker 571*cc02d7e2SAndroid Build Coastguard Worker### circuit_breaking 572*cc02d7e2SAndroid Build Coastguard Worker 573*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the maximum number of outstanding requests is limited 574*cc02d7e2SAndroid Build Coastguard Workerby circuit breakers of the backend service. 575*cc02d7e2SAndroid Build Coastguard Worker 576*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 577*cc02d7e2SAndroid Build Coastguard Worker 578*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 579*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 580*cc02d7e2SAndroid Build Coastguard Worker 581*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 582*cc02d7e2SAndroid Build Coastguard Worker 583*cc02d7e2SAndroid Build Coastguard Worker1. Two MIGs with each having two backends. 584*cc02d7e2SAndroid Build Coastguard Worker 585*cc02d7e2SAndroid Build Coastguard WorkerThe test driver configures the backend services with: 586*cc02d7e2SAndroid Build Coastguard Worker 587*cc02d7e2SAndroid Build Coastguard Worker1. path{“/grpc.testing.TestService/UnaryCall"}: MIG_1 588*cc02d7e2SAndroid Build Coastguard Worker1. path{“/grpc.testing.TestService/EmptyCall"}: MIG_2 589*cc02d7e2SAndroid Build Coastguard Worker1. MIG_1 circuit_breakers with max_requests = 500 590*cc02d7e2SAndroid Build Coastguard Worker1. MIG_2 circuit breakers with max_requests = 1000 591*cc02d7e2SAndroid Build Coastguard Worker 592*cc02d7e2SAndroid Build Coastguard WorkerThe test driver configures the test client to send both UnaryCall and EmptyCall, 593*cc02d7e2SAndroid Build Coastguard Workerwith all RPCs keep-open. 594*cc02d7e2SAndroid Build Coastguard Worker 595*cc02d7e2SAndroid Build Coastguard WorkerAssert: 596*cc02d7e2SAndroid Build Coastguard Worker 597*cc02d7e2SAndroid Build Coastguard Worker1. After reaching steady state, there are 500 UnaryCall RPCs in-flight 598*cc02d7e2SAndroid Build Coastguard Workerand 1000 EmptyCall RPCs in-flight. 599*cc02d7e2SAndroid Build Coastguard Worker 600*cc02d7e2SAndroid Build Coastguard WorkerThe test driver updates MIG_1's circuit breakers with max_request = 800. 601*cc02d7e2SAndroid Build Coastguard Worker 602*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts: 603*cc02d7e2SAndroid Build Coastguard Worker 604*cc02d7e2SAndroid Build Coastguard Worker1. After reaching steady state, there are 800 UnaryCall RPCs in-flight. 605*cc02d7e2SAndroid Build Coastguard Worker 606*cc02d7e2SAndroid Build Coastguard Worker### timeout 607*cc02d7e2SAndroid Build Coastguard Worker 608*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that traffic along a route with a `max_stream_duration` set 609*cc02d7e2SAndroid Build Coastguard Workerwill cause timeouts on streams open longer than that duration. 610*cc02d7e2SAndroid Build Coastguard Worker 611*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 612*cc02d7e2SAndroid Build Coastguard Worker 613*cc02d7e2SAndroid Build Coastguard Worker1. `--num_channels=1` 614*cc02d7e2SAndroid Build Coastguard Worker1. `--qps=100` 615*cc02d7e2SAndroid Build Coastguard Worker 616*cc02d7e2SAndroid Build Coastguard WorkerRoute Configuration: 617*cc02d7e2SAndroid Build Coastguard Worker 618*cc02d7e2SAndroid Build Coastguard WorkerTwo routes: 619*cc02d7e2SAndroid Build Coastguard Worker 620*cc02d7e2SAndroid Build Coastguard Worker1. Path match for `/grpc.testing.TestService/UnaryCall`, with a `route_action` 621*cc02d7e2SAndroid Build Coastguard Worker containing `max_stream_duration` of 3 seconds. 622*cc02d7e2SAndroid Build Coastguard Worker1. Default route containing no `max_stream_duration` setting. 623*cc02d7e2SAndroid Build Coastguard Worker 624*cc02d7e2SAndroid Build Coastguard WorkerThere are four sub-tests: 625*cc02d7e2SAndroid Build Coastguard Worker 626*cc02d7e2SAndroid Build Coastguard Worker1. `app_timeout_exceeded` 627*cc02d7e2SAndroid Build Coastguard Worker 1. Test client configured to send UnaryCall RPCs with a 1s application 628*cc02d7e2SAndroid Build Coastguard Worker timeout, and metadata of `rpc-behavior: sleep-2`. 629*cc02d7e2SAndroid Build Coastguard Worker 1. Test driver asserts client recieves ~100% status `DEADLINE_EXCEEDED`. 630*cc02d7e2SAndroid Build Coastguard Worker1. `timeout_not_exceeded` 631*cc02d7e2SAndroid Build Coastguard Worker 1. Test client configured to send UnaryCall RPCs with the default 632*cc02d7e2SAndroid Build Coastguard Worker application timeout (20 seconds), and no metadata. 633*cc02d7e2SAndroid Build Coastguard Worker 1. Test driver asserts client recieves ~100% status `OK`. 634*cc02d7e2SAndroid Build Coastguard Worker1. `timeout_exceeded` (executed with the below test case) 635*cc02d7e2SAndroid Build Coastguard Worker1. `timeout_different_route` 636*cc02d7e2SAndroid Build Coastguard Worker 1. Test client configured to send UnaryCall RPCs and EmptyCall RPCs with 637*cc02d7e2SAndroid Build Coastguard Worker the default application timeout (20 seconds), and metadata of 638*cc02d7e2SAndroid Build Coastguard Worker `rpc-behavior: sleep-4`. 639*cc02d7e2SAndroid Build Coastguard Worker 1. Test driver asserts client recieves ~100% status `OK` for EmptyCall 640*cc02d7e2SAndroid Build Coastguard Worker and ~100% status `DEADLINE_EXCEEDED` for UnaryCall. 641*cc02d7e2SAndroid Build Coastguard Worker 642*cc02d7e2SAndroid Build Coastguard Worker### api_listener 643*cc02d7e2SAndroid Build Coastguard WorkerThe test case verifies a specific use case where it creates a second TD API 644*cc02d7e2SAndroid Build Coastguard Workerlistener using the same name as the existing one and then delete the old one. 645*cc02d7e2SAndroid Build Coastguard WorkerThe test driver verifies this is a safe way to update the API listener 646*cc02d7e2SAndroid Build Coastguard Workerconfiguration while keep using the existing name. 647*cc02d7e2SAndroid Build Coastguard Worker 648*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 649*cc02d7e2SAndroid Build Coastguard Worker 650*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 651*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 652*cc02d7e2SAndroid Build Coastguard Worker 653*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 654*cc02d7e2SAndroid Build Coastguard Worker 655*cc02d7e2SAndroid Build Coastguard Worker1. One MIG with two backends. 656*cc02d7e2SAndroid Build Coastguard Worker 657*cc02d7e2SAndroid Build Coastguard WorkerAssert: 658*cc02d7e2SAndroid Build Coastguard Worker 659*cc02d7e2SAndroid Build Coastguard WorkerThe test driver configuration steps: 660*cc02d7e2SAndroid Build Coastguard Worker1. The test driver creates the first set of forwarding rule + target proxy + 661*cc02d7e2SAndroid Build Coastguard WorkerURL map with a test host name. 662*cc02d7e2SAndroid Build Coastguard Worker1. Then the test driver creates a second set of forwarding rule + target proxy + 663*cc02d7e2SAndroid Build Coastguard WorkerURL map with the same test host name. 664*cc02d7e2SAndroid Build Coastguard Worker1. The test driver deletes the first set of configurations in step 1. 665*cc02d7e2SAndroid Build Coastguard Worker 666*cc02d7e2SAndroid Build Coastguard WorkerThe test driver verifies, at each configuration step, the traffic is always able 667*cc02d7e2SAndroid Build Coastguard Workerto reach the designated hosts. 668*cc02d7e2SAndroid Build Coastguard Worker 669*cc02d7e2SAndroid Build Coastguard Worker### metadata_filter 670*cc02d7e2SAndroid Build Coastguard WorkerThis test case verifies that metadata filter configurations in URL map match 671*cc02d7e2SAndroid Build Coastguard Workerrule are effective at Traffic Director for routing selection against downstream 672*cc02d7e2SAndroid Build Coastguard Workernode metadata. 673*cc02d7e2SAndroid Build Coastguard Worker 674*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 675*cc02d7e2SAndroid Build Coastguard Worker 676*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 677*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 678*cc02d7e2SAndroid Build Coastguard Worker 679*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 680*cc02d7e2SAndroid Build Coastguard Worker 681*cc02d7e2SAndroid Build Coastguard Worker1. Two MIGs in the same zone, each having two backends. 682*cc02d7e2SAndroid Build Coastguard Worker 683*cc02d7e2SAndroid Build Coastguard WorkerThere are four test sub-cases: 684*cc02d7e2SAndroid Build Coastguard Worker1. Test `MATCH_ALL` metadata filter criteria. 685*cc02d7e2SAndroid Build Coastguard Worker1. Test `MATCH_ANY` metadata filter criteria. 686*cc02d7e2SAndroid Build Coastguard Worker1. Test mixed `MATCH_ALL` and `MATCH_ANY` metadata filter criteria. 687*cc02d7e2SAndroid Build Coastguard Worker1. Test when multiple match rules with metadata filter all match. 688*cc02d7e2SAndroid Build Coastguard Worker 689*cc02d7e2SAndroid Build Coastguard WorkerAssert: 690*cc02d7e2SAndroid Build Coastguard Worker 691*cc02d7e2SAndroid Build Coastguard WorkerAt each test sub-case described above, the test driver configures 692*cc02d7e2SAndroid Build Coastguard Workerand verifies: 693*cc02d7e2SAndroid Build Coastguard Worker 694*cc02d7e2SAndroid Build Coastguard Worker1. Set default URL map, and verify traffic goes to the original backend hosts. 695*cc02d7e2SAndroid Build Coastguard Worker1. Then patch URL map to update the match rule with metadata filter 696*cc02d7e2SAndroid Build Coastguard Workerconfiguration under test added. 697*cc02d7e2SAndroid Build Coastguard Worker1. Then it verifies traffic switches to alternate backend service hosts. 698*cc02d7e2SAndroid Build Coastguard Worker 699*cc02d7e2SAndroid Build Coastguard WorkerThis way, we test that TD correctly evaluates both matching and non-matching 700*cc02d7e2SAndroid Build Coastguard Workerconfiguration scenario. 701*cc02d7e2SAndroid Build Coastguard Worker 702*cc02d7e2SAndroid Build Coastguard Worker### forwarding_rule_port_match 703*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that request server uri port should match with the GCP 704*cc02d7e2SAndroid Build Coastguard Workerforwarding rule configuration port. 705*cc02d7e2SAndroid Build Coastguard Worker 706*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 707*cc02d7e2SAndroid Build Coastguard Worker 708*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 709*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 710*cc02d7e2SAndroid Build Coastguard Worker 711*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 712*cc02d7e2SAndroid Build Coastguard Worker 713*cc02d7e2SAndroid Build Coastguard Worker1. One MIG with two backends. 714*cc02d7e2SAndroid Build Coastguard Worker 715*cc02d7e2SAndroid Build Coastguard WorkerAssert: 716*cc02d7e2SAndroid Build Coastguard Worker1. The test driver configures matching port in the forwarding rule and in the 717*cc02d7e2SAndroid Build Coastguard Workerrequest server uri, then verifies traffic reaches backend service instances. 718*cc02d7e2SAndroid Build Coastguard Worker1. The test driver updates the forwarding rule to use a different port, then 719*cc02d7e2SAndroid Build Coastguard Workerverifies that the traffic stops going to those backend service instances. 720*cc02d7e2SAndroid Build Coastguard Worker 721*cc02d7e2SAndroid Build Coastguard Worker### forwarding_rule_default_port 722*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that omitting port in the request server uri should only 723*cc02d7e2SAndroid Build Coastguard Workermatch with the default port(80) configuration in the forwarding rule. 724*cc02d7e2SAndroid Build Coastguard WorkerIn addition, request server uri port should exactly match that in the URL map 725*cc02d7e2SAndroid Build Coastguard Workerhost rule, as described in 726*cc02d7e2SAndroid Build Coastguard Worker[public doc](https://cloud.google.com/traffic-director/docs/proxyless-overview#proxyless-url-map). 727*cc02d7e2SAndroid Build Coastguard Worker 728*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 729*cc02d7e2SAndroid Build Coastguard Worker 730*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 731*cc02d7e2SAndroid Build Coastguard Worker1. --qps=100 732*cc02d7e2SAndroid Build Coastguard Worker 733*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 734*cc02d7e2SAndroid Build Coastguard Worker 735*cc02d7e2SAndroid Build Coastguard Worker1. One MIG with two backends. 736*cc02d7e2SAndroid Build Coastguard Worker 737*cc02d7e2SAndroid Build Coastguard WorkerAssert: 738*cc02d7e2SAndroid Build Coastguard Worker 739*cc02d7e2SAndroid Build Coastguard WorkerTest driver configures and verifies: 740*cc02d7e2SAndroid Build Coastguard Worker1. No traffic goes to backends when configuring the target URI 741*cc02d7e2SAndroid Build Coastguard Worker`xds:///myservice`, the forwarding rule with port *x != 80*, the URL map 742*cc02d7e2SAndroid Build Coastguard Workerhost rule `myservice::x`. 743*cc02d7e2SAndroid Build Coastguard Worker1. Traffic goes to backends when configuring the target URI `xds:///myservice`, 744*cc02d7e2SAndroid Build Coastguard Workerthe forwarding rule port `80` and the URL map host rule `myservice`. 745*cc02d7e2SAndroid Build Coastguard Worker1. No traffic goes to backends when configuring the target URI 746*cc02d7e2SAndroid Build Coastguard Worker`xds:///myservice`, the forwarding rule port `80` and the host rule 747*cc02d7e2SAndroid Build Coastguard Worker`myservice::80`. 748*cc02d7e2SAndroid Build Coastguard Worker 749*cc02d7e2SAndroid Build Coastguard Worker### outlier_detection 750*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the client applies the outlier detection configuration 751*cc02d7e2SAndroid Build Coastguard Workerand temporarily drops traffic to a server that fails requests. 752*cc02d7e2SAndroid Build Coastguard Worker 753*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 754*cc02d7e2SAndroid Build Coastguard Worker 755*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 756*cc02d7e2SAndroid Build Coastguard Worker2. --qps=100 757*cc02d7e2SAndroid Build Coastguard Worker 758*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 759*cc02d7e2SAndroid Build Coastguard Worker 760*cc02d7e2SAndroid Build Coastguard Worker1. One MIG with five backends, with a `backendService` configuration with the 761*cc02d7e2SAndroid Build Coastguard Worker following `outlierDetection` entry 762*cc02d7e2SAndroid Build Coastguard Worker ```json 763*cc02d7e2SAndroid Build Coastguard Worker { 764*cc02d7e2SAndroid Build Coastguard Worker "interval": { 765*cc02d7e2SAndroid Build Coastguard Worker "seconds": 2, 766*cc02d7e2SAndroid Build Coastguard Worker "nanos": 0 767*cc02d7e2SAndroid Build Coastguard Worker }, 768*cc02d7e2SAndroid Build Coastguard Worker "successRateRequestVolume": 20 769*cc02d7e2SAndroid Build Coastguard Worker } 770*cc02d7e2SAndroid Build Coastguard Worker ``` 771*cc02d7e2SAndroid Build Coastguard WorkerAssert: 772*cc02d7e2SAndroid Build Coastguard Worker 773*cc02d7e2SAndroid Build Coastguard Worker1. The test driver asserts that traffic is equally distribted among the 774*cc02d7e2SAndroid Build Coastguard Workerfive backends, and all requests end with the `OK` status. 775*cc02d7e2SAndroid Build Coastguard Worker2. The test driver chooses one of the five backends to fail requests, and 776*cc02d7e2SAndroid Build Coastguard Workerconfigures the client to send the metadata 777*cc02d7e2SAndroid Build Coastguard Worker`rpc-behavior: hostname=<chosen backend> error-code-2`. The driver asserts 778*cc02d7e2SAndroid Build Coastguard Workerthat during some 10-second interval, all traffic goes to the other four 779*cc02d7e2SAndroid Build Coastguard Workerbackends and all requests end with the `OK` status. 780*cc02d7e2SAndroid Build Coastguard Worker3. The test driver removes the client configuration to send metadata. The 781*cc02d7e2SAndroid Build Coastguard Workerdriver asserts that during some 10-second interval, traffic is equally 782*cc02d7e2SAndroid Build Coastguard Workerdistributed among the five backends, and all requests end with the `OK` status. 783*cc02d7e2SAndroid Build Coastguard Worker 784*cc02d7e2SAndroid Build Coastguard Worker### custom_lb 785*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that a custom load balancer policy can be configured in the 786*cc02d7e2SAndroid Build Coastguard Workerclient. It also verifies that when given a list of policies the client can 787*cc02d7e2SAndroid Build Coastguard Workerignore a bad one and try the next one on the list until it finds a good one. 788*cc02d7e2SAndroid Build Coastguard Worker 789*cc02d7e2SAndroid Build Coastguard WorkerClient parameters: 790*cc02d7e2SAndroid Build Coastguard Worker 791*cc02d7e2SAndroid Build Coastguard Worker1. --num_channels=1 792*cc02d7e2SAndroid Build Coastguard Worker2. --qps=100 793*cc02d7e2SAndroid Build Coastguard Worker 794*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration: 795*cc02d7e2SAndroid Build Coastguard Worker 796*cc02d7e2SAndroid Build Coastguard WorkerOne MIG with a single backend. 797*cc02d7e2SAndroid Build Coastguard Worker 798*cc02d7e2SAndroid Build Coastguard WorkerThe `backendService` will have the following `localityLbPolicies` entry: 799*cc02d7e2SAndroid Build Coastguard Worker```json 800*cc02d7e2SAndroid Build Coastguard Worker[ 801*cc02d7e2SAndroid Build Coastguard Worker { 802*cc02d7e2SAndroid Build Coastguard Worker "customPolicy": { 803*cc02d7e2SAndroid Build Coastguard Worker "name": "test.ThisLoadBalancerDoesNotExist", 804*cc02d7e2SAndroid Build Coastguard Worker "data": "{ \"foo\": \"bar\" }" 805*cc02d7e2SAndroid Build Coastguard Worker } 806*cc02d7e2SAndroid Build Coastguard Worker }, 807*cc02d7e2SAndroid Build Coastguard Worker { 808*cc02d7e2SAndroid Build Coastguard Worker "customPolicy": { 809*cc02d7e2SAndroid Build Coastguard Worker "name": "test.RpcBehaviorLoadBalancer", 810*cc02d7e2SAndroid Build Coastguard Worker "data": "{ \"rpcBehavior\": \"error-code-15\" }" 811*cc02d7e2SAndroid Build Coastguard Worker } 812*cc02d7e2SAndroid Build Coastguard Worker } 813*cc02d7e2SAndroid Build Coastguard Worker] 814*cc02d7e2SAndroid Build Coastguard Worker``` 815*cc02d7e2SAndroid Build Coastguard Worker 816*cc02d7e2SAndroid Build Coastguard WorkerThe client **should not** implement the `test.ThisLoadBalancerDoesNotExist`, but 817*cc02d7e2SAndroid Build Coastguard Workerit **should** implement `test.RpcBehaviorLoadBalancer`. The 818*cc02d7e2SAndroid Build Coastguard Worker`RpcBehaviorLoadBalancer` implementation should set the rpcBehavior request 819*cc02d7e2SAndroid Build Coastguard Workerheader based on the configuration it is provided. The `rpcBehavior` field value 820*cc02d7e2SAndroid Build Coastguard Workerin the config should be used as the header value. 821*cc02d7e2SAndroid Build Coastguard Worker 822*cc02d7e2SAndroid Build Coastguard WorkerAssert: 823*cc02d7e2SAndroid Build Coastguard Worker 824*cc02d7e2SAndroid Build Coastguard Worker1. The first custom policy is ignored as the client does not have an 825*cc02d7e2SAndroid Build Coastguard Workerimplementation for it. 826*cc02d7e2SAndroid Build Coastguard Worker2. The second policy, that **is** implemented by the client, has been applied 827*cc02d7e2SAndroid Build Coastguard Workerby the client. This can be asserted by confirming that each request has 828*cc02d7e2SAndroid Build Coastguard Workerfailed with the configured error code 15 (DATA_LOSS). We should get this error 829*cc02d7e2SAndroid Build Coastguard Workerbecause the test server knows to look for the `rpcBehavior` header and fail 830*cc02d7e2SAndroid Build Coastguard Workera request with a provided error code. 831*cc02d7e2SAndroid Build Coastguard Worker 832*cc02d7e2SAndroid Build Coastguard WorkerNote that while this test is for load balancing, we can get by with a single 833*cc02d7e2SAndroid Build Coastguard Workerbackend as our test load balancer does not perform any actual load balancing, 834*cc02d7e2SAndroid Build Coastguard Workerinstead only applying the `rpcBehavior` header to each request. 835