1*d5c09012SAndroid Build Coastguard Worker// Copyright 2023 Google LLC 2*d5c09012SAndroid Build Coastguard Worker// 3*d5c09012SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*d5c09012SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*d5c09012SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*d5c09012SAndroid Build Coastguard Worker// 7*d5c09012SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*d5c09012SAndroid Build Coastguard Worker// 9*d5c09012SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*d5c09012SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*d5c09012SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*d5c09012SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*d5c09012SAndroid Build Coastguard Worker// limitations under the License. 14*d5c09012SAndroid Build Coastguard Worker 15*d5c09012SAndroid Build Coastguard Workersyntax = "proto3"; 16*d5c09012SAndroid Build Coastguard Worker 17*d5c09012SAndroid Build Coastguard Workerpackage google.api; 18*d5c09012SAndroid Build Coastguard Worker 19*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/descriptor.proto"; 20*d5c09012SAndroid Build Coastguard Worker 21*d5c09012SAndroid Build Coastguard Workeroption go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; 22*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true; 23*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "RoutingProto"; 24*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.api"; 25*d5c09012SAndroid Build Coastguard Workeroption objc_class_prefix = "GAPI"; 26*d5c09012SAndroid Build Coastguard Worker 27*d5c09012SAndroid Build Coastguard Workerextend google.protobuf.MethodOptions { 28*d5c09012SAndroid Build Coastguard Worker // See RoutingRule. 29*d5c09012SAndroid Build Coastguard Worker google.api.RoutingRule routing = 72295729; 30*d5c09012SAndroid Build Coastguard Worker} 31*d5c09012SAndroid Build Coastguard Worker 32*d5c09012SAndroid Build Coastguard Worker// Specifies the routing information that should be sent along with the request 33*d5c09012SAndroid Build Coastguard Worker// in the form of routing header. 34*d5c09012SAndroid Build Coastguard Worker// **NOTE:** All service configuration rules follow the "last one wins" order. 35*d5c09012SAndroid Build Coastguard Worker// 36*d5c09012SAndroid Build Coastguard Worker// The examples below will apply to an RPC which has the following request type: 37*d5c09012SAndroid Build Coastguard Worker// 38*d5c09012SAndroid Build Coastguard Worker// Message Definition: 39*d5c09012SAndroid Build Coastguard Worker// 40*d5c09012SAndroid Build Coastguard Worker// message Request { 41*d5c09012SAndroid Build Coastguard Worker// // The name of the Table 42*d5c09012SAndroid Build Coastguard Worker// // Values can be of the following formats: 43*d5c09012SAndroid Build Coastguard Worker// // - `projects/<project>/tables/<table>` 44*d5c09012SAndroid Build Coastguard Worker// // - `projects/<project>/instances/<instance>/tables/<table>` 45*d5c09012SAndroid Build Coastguard Worker// // - `region/<region>/zones/<zone>/tables/<table>` 46*d5c09012SAndroid Build Coastguard Worker// string table_name = 1; 47*d5c09012SAndroid Build Coastguard Worker// 48*d5c09012SAndroid Build Coastguard Worker// // This value specifies routing for replication. 49*d5c09012SAndroid Build Coastguard Worker// // It can be in the following formats: 50*d5c09012SAndroid Build Coastguard Worker// // - `profiles/<profile_id>` 51*d5c09012SAndroid Build Coastguard Worker// // - a legacy `profile_id` that can be any string 52*d5c09012SAndroid Build Coastguard Worker// string app_profile_id = 2; 53*d5c09012SAndroid Build Coastguard Worker// } 54*d5c09012SAndroid Build Coastguard Worker// 55*d5c09012SAndroid Build Coastguard Worker// Example message: 56*d5c09012SAndroid Build Coastguard Worker// 57*d5c09012SAndroid Build Coastguard Worker// { 58*d5c09012SAndroid Build Coastguard Worker// table_name: projects/proj_foo/instances/instance_bar/table/table_baz, 59*d5c09012SAndroid Build Coastguard Worker// app_profile_id: profiles/prof_qux 60*d5c09012SAndroid Build Coastguard Worker// } 61*d5c09012SAndroid Build Coastguard Worker// 62*d5c09012SAndroid Build Coastguard Worker// The routing header consists of one or multiple key-value pairs. Every key 63*d5c09012SAndroid Build Coastguard Worker// and value must be percent-encoded, and joined together in the format of 64*d5c09012SAndroid Build Coastguard Worker// `key1=value1&key2=value2`. 65*d5c09012SAndroid Build Coastguard Worker// In the examples below I am skipping the percent-encoding for readablity. 66*d5c09012SAndroid Build Coastguard Worker// 67*d5c09012SAndroid Build Coastguard Worker// Example 1 68*d5c09012SAndroid Build Coastguard Worker// 69*d5c09012SAndroid Build Coastguard Worker// Extracting a field from the request to put into the routing header 70*d5c09012SAndroid Build Coastguard Worker// unchanged, with the key equal to the field name. 71*d5c09012SAndroid Build Coastguard Worker// 72*d5c09012SAndroid Build Coastguard Worker// annotation: 73*d5c09012SAndroid Build Coastguard Worker// 74*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 75*d5c09012SAndroid Build Coastguard Worker// // Take the `app_profile_id`. 76*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 77*d5c09012SAndroid Build Coastguard Worker// field: "app_profile_id" 78*d5c09012SAndroid Build Coastguard Worker// } 79*d5c09012SAndroid Build Coastguard Worker// }; 80*d5c09012SAndroid Build Coastguard Worker// 81*d5c09012SAndroid Build Coastguard Worker// result: 82*d5c09012SAndroid Build Coastguard Worker// 83*d5c09012SAndroid Build Coastguard Worker// x-goog-request-params: app_profile_id=profiles/prof_qux 84*d5c09012SAndroid Build Coastguard Worker// 85*d5c09012SAndroid Build Coastguard Worker// Example 2 86*d5c09012SAndroid Build Coastguard Worker// 87*d5c09012SAndroid Build Coastguard Worker// Extracting a field from the request to put into the routing header 88*d5c09012SAndroid Build Coastguard Worker// unchanged, with the key different from the field name. 89*d5c09012SAndroid Build Coastguard Worker// 90*d5c09012SAndroid Build Coastguard Worker// annotation: 91*d5c09012SAndroid Build Coastguard Worker// 92*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 93*d5c09012SAndroid Build Coastguard Worker// // Take the `app_profile_id`, but name it `routing_id` in the header. 94*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 95*d5c09012SAndroid Build Coastguard Worker// field: "app_profile_id" 96*d5c09012SAndroid Build Coastguard Worker// path_template: "{routing_id=**}" 97*d5c09012SAndroid Build Coastguard Worker// } 98*d5c09012SAndroid Build Coastguard Worker// }; 99*d5c09012SAndroid Build Coastguard Worker// 100*d5c09012SAndroid Build Coastguard Worker// result: 101*d5c09012SAndroid Build Coastguard Worker// 102*d5c09012SAndroid Build Coastguard Worker// x-goog-request-params: routing_id=profiles/prof_qux 103*d5c09012SAndroid Build Coastguard Worker// 104*d5c09012SAndroid Build Coastguard Worker// Example 3 105*d5c09012SAndroid Build Coastguard Worker// 106*d5c09012SAndroid Build Coastguard Worker// Extracting a field from the request to put into the routing 107*d5c09012SAndroid Build Coastguard Worker// header, while matching a path template syntax on the field's value. 108*d5c09012SAndroid Build Coastguard Worker// 109*d5c09012SAndroid Build Coastguard Worker// NB: it is more useful to send nothing than to send garbage for the purpose 110*d5c09012SAndroid Build Coastguard Worker// of dynamic routing, since garbage pollutes cache. Thus the matching. 111*d5c09012SAndroid Build Coastguard Worker// 112*d5c09012SAndroid Build Coastguard Worker// Sub-example 3a 113*d5c09012SAndroid Build Coastguard Worker// 114*d5c09012SAndroid Build Coastguard Worker// The field matches the template. 115*d5c09012SAndroid Build Coastguard Worker// 116*d5c09012SAndroid Build Coastguard Worker// annotation: 117*d5c09012SAndroid Build Coastguard Worker// 118*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 119*d5c09012SAndroid Build Coastguard Worker// // Take the `table_name`, if it's well-formed (with project-based 120*d5c09012SAndroid Build Coastguard Worker// // syntax). 121*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 122*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 123*d5c09012SAndroid Build Coastguard Worker// path_template: "{table_name=projects/*/instances/*/**}" 124*d5c09012SAndroid Build Coastguard Worker// } 125*d5c09012SAndroid Build Coastguard Worker// }; 126*d5c09012SAndroid Build Coastguard Worker// 127*d5c09012SAndroid Build Coastguard Worker// result: 128*d5c09012SAndroid Build Coastguard Worker// 129*d5c09012SAndroid Build Coastguard Worker// x-goog-request-params: 130*d5c09012SAndroid Build Coastguard Worker// table_name=projects/proj_foo/instances/instance_bar/table/table_baz 131*d5c09012SAndroid Build Coastguard Worker// 132*d5c09012SAndroid Build Coastguard Worker// Sub-example 3b 133*d5c09012SAndroid Build Coastguard Worker// 134*d5c09012SAndroid Build Coastguard Worker// The field does not match the template. 135*d5c09012SAndroid Build Coastguard Worker// 136*d5c09012SAndroid Build Coastguard Worker// annotation: 137*d5c09012SAndroid Build Coastguard Worker// 138*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 139*d5c09012SAndroid Build Coastguard Worker// // Take the `table_name`, if it's well-formed (with region-based 140*d5c09012SAndroid Build Coastguard Worker// // syntax). 141*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 142*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 143*d5c09012SAndroid Build Coastguard Worker// path_template: "{table_name=regions/*/zones/*/**}" 144*d5c09012SAndroid Build Coastguard Worker// } 145*d5c09012SAndroid Build Coastguard Worker// }; 146*d5c09012SAndroid Build Coastguard Worker// 147*d5c09012SAndroid Build Coastguard Worker// result: 148*d5c09012SAndroid Build Coastguard Worker// 149*d5c09012SAndroid Build Coastguard Worker// <no routing header will be sent> 150*d5c09012SAndroid Build Coastguard Worker// 151*d5c09012SAndroid Build Coastguard Worker// Sub-example 3c 152*d5c09012SAndroid Build Coastguard Worker// 153*d5c09012SAndroid Build Coastguard Worker// Multiple alternative conflictingly named path templates are 154*d5c09012SAndroid Build Coastguard Worker// specified. The one that matches is used to construct the header. 155*d5c09012SAndroid Build Coastguard Worker// 156*d5c09012SAndroid Build Coastguard Worker// annotation: 157*d5c09012SAndroid Build Coastguard Worker// 158*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 159*d5c09012SAndroid Build Coastguard Worker// // Take the `table_name`, if it's well-formed, whether 160*d5c09012SAndroid Build Coastguard Worker// // using the region- or projects-based syntax. 161*d5c09012SAndroid Build Coastguard Worker// 162*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 163*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 164*d5c09012SAndroid Build Coastguard Worker// path_template: "{table_name=regions/*/zones/*/**}" 165*d5c09012SAndroid Build Coastguard Worker// } 166*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 167*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 168*d5c09012SAndroid Build Coastguard Worker// path_template: "{table_name=projects/*/instances/*/**}" 169*d5c09012SAndroid Build Coastguard Worker// } 170*d5c09012SAndroid Build Coastguard Worker// }; 171*d5c09012SAndroid Build Coastguard Worker// 172*d5c09012SAndroid Build Coastguard Worker// result: 173*d5c09012SAndroid Build Coastguard Worker// 174*d5c09012SAndroid Build Coastguard Worker// x-goog-request-params: 175*d5c09012SAndroid Build Coastguard Worker// table_name=projects/proj_foo/instances/instance_bar/table/table_baz 176*d5c09012SAndroid Build Coastguard Worker// 177*d5c09012SAndroid Build Coastguard Worker// Example 4 178*d5c09012SAndroid Build Coastguard Worker// 179*d5c09012SAndroid Build Coastguard Worker// Extracting a single routing header key-value pair by matching a 180*d5c09012SAndroid Build Coastguard Worker// template syntax on (a part of) a single request field. 181*d5c09012SAndroid Build Coastguard Worker// 182*d5c09012SAndroid Build Coastguard Worker// annotation: 183*d5c09012SAndroid Build Coastguard Worker// 184*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 185*d5c09012SAndroid Build Coastguard Worker// // Take just the project id from the `table_name` field. 186*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 187*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 188*d5c09012SAndroid Build Coastguard Worker// path_template: "{routing_id=projects/*}/**" 189*d5c09012SAndroid Build Coastguard Worker// } 190*d5c09012SAndroid Build Coastguard Worker// }; 191*d5c09012SAndroid Build Coastguard Worker// 192*d5c09012SAndroid Build Coastguard Worker// result: 193*d5c09012SAndroid Build Coastguard Worker// 194*d5c09012SAndroid Build Coastguard Worker// x-goog-request-params: routing_id=projects/proj_foo 195*d5c09012SAndroid Build Coastguard Worker// 196*d5c09012SAndroid Build Coastguard Worker// Example 5 197*d5c09012SAndroid Build Coastguard Worker// 198*d5c09012SAndroid Build Coastguard Worker// Extracting a single routing header key-value pair by matching 199*d5c09012SAndroid Build Coastguard Worker// several conflictingly named path templates on (parts of) a single request 200*d5c09012SAndroid Build Coastguard Worker// field. The last template to match "wins" the conflict. 201*d5c09012SAndroid Build Coastguard Worker// 202*d5c09012SAndroid Build Coastguard Worker// annotation: 203*d5c09012SAndroid Build Coastguard Worker// 204*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 205*d5c09012SAndroid Build Coastguard Worker// // If the `table_name` does not have instances information, 206*d5c09012SAndroid Build Coastguard Worker// // take just the project id for routing. 207*d5c09012SAndroid Build Coastguard Worker// // Otherwise take project + instance. 208*d5c09012SAndroid Build Coastguard Worker// 209*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 210*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 211*d5c09012SAndroid Build Coastguard Worker// path_template: "{routing_id=projects/*}/**" 212*d5c09012SAndroid Build Coastguard Worker// } 213*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 214*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 215*d5c09012SAndroid Build Coastguard Worker// path_template: "{routing_id=projects/*/instances/*}/**" 216*d5c09012SAndroid Build Coastguard Worker// } 217*d5c09012SAndroid Build Coastguard Worker// }; 218*d5c09012SAndroid Build Coastguard Worker// 219*d5c09012SAndroid Build Coastguard Worker// result: 220*d5c09012SAndroid Build Coastguard Worker// 221*d5c09012SAndroid Build Coastguard Worker// x-goog-request-params: 222*d5c09012SAndroid Build Coastguard Worker// routing_id=projects/proj_foo/instances/instance_bar 223*d5c09012SAndroid Build Coastguard Worker// 224*d5c09012SAndroid Build Coastguard Worker// Example 6 225*d5c09012SAndroid Build Coastguard Worker// 226*d5c09012SAndroid Build Coastguard Worker// Extracting multiple routing header key-value pairs by matching 227*d5c09012SAndroid Build Coastguard Worker// several non-conflicting path templates on (parts of) a single request field. 228*d5c09012SAndroid Build Coastguard Worker// 229*d5c09012SAndroid Build Coastguard Worker// Sub-example 6a 230*d5c09012SAndroid Build Coastguard Worker// 231*d5c09012SAndroid Build Coastguard Worker// Make the templates strict, so that if the `table_name` does not 232*d5c09012SAndroid Build Coastguard Worker// have an instance information, nothing is sent. 233*d5c09012SAndroid Build Coastguard Worker// 234*d5c09012SAndroid Build Coastguard Worker// annotation: 235*d5c09012SAndroid Build Coastguard Worker// 236*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 237*d5c09012SAndroid Build Coastguard Worker// // The routing code needs two keys instead of one composite 238*d5c09012SAndroid Build Coastguard Worker// // but works only for the tables with the "project-instance" name 239*d5c09012SAndroid Build Coastguard Worker// // syntax. 240*d5c09012SAndroid Build Coastguard Worker// 241*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 242*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 243*d5c09012SAndroid Build Coastguard Worker// path_template: "{project_id=projects/*}/instances/*/**" 244*d5c09012SAndroid Build Coastguard Worker// } 245*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 246*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 247*d5c09012SAndroid Build Coastguard Worker// path_template: "projects/*/{instance_id=instances/*}/**" 248*d5c09012SAndroid Build Coastguard Worker// } 249*d5c09012SAndroid Build Coastguard Worker// }; 250*d5c09012SAndroid Build Coastguard Worker// 251*d5c09012SAndroid Build Coastguard Worker// result: 252*d5c09012SAndroid Build Coastguard Worker// 253*d5c09012SAndroid Build Coastguard Worker// x-goog-request-params: 254*d5c09012SAndroid Build Coastguard Worker// project_id=projects/proj_foo&instance_id=instances/instance_bar 255*d5c09012SAndroid Build Coastguard Worker// 256*d5c09012SAndroid Build Coastguard Worker// Sub-example 6b 257*d5c09012SAndroid Build Coastguard Worker// 258*d5c09012SAndroid Build Coastguard Worker// Make the templates loose, so that if the `table_name` does not 259*d5c09012SAndroid Build Coastguard Worker// have an instance information, just the project id part is sent. 260*d5c09012SAndroid Build Coastguard Worker// 261*d5c09012SAndroid Build Coastguard Worker// annotation: 262*d5c09012SAndroid Build Coastguard Worker// 263*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 264*d5c09012SAndroid Build Coastguard Worker// // The routing code wants two keys instead of one composite 265*d5c09012SAndroid Build Coastguard Worker// // but will work with just the `project_id` for tables without 266*d5c09012SAndroid Build Coastguard Worker// // an instance in the `table_name`. 267*d5c09012SAndroid Build Coastguard Worker// 268*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 269*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 270*d5c09012SAndroid Build Coastguard Worker// path_template: "{project_id=projects/*}/**" 271*d5c09012SAndroid Build Coastguard Worker// } 272*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 273*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 274*d5c09012SAndroid Build Coastguard Worker// path_template: "projects/*/{instance_id=instances/*}/**" 275*d5c09012SAndroid Build Coastguard Worker// } 276*d5c09012SAndroid Build Coastguard Worker// }; 277*d5c09012SAndroid Build Coastguard Worker// 278*d5c09012SAndroid Build Coastguard Worker// result (is the same as 6a for our example message because it has the instance 279*d5c09012SAndroid Build Coastguard Worker// information): 280*d5c09012SAndroid Build Coastguard Worker// 281*d5c09012SAndroid Build Coastguard Worker// x-goog-request-params: 282*d5c09012SAndroid Build Coastguard Worker// project_id=projects/proj_foo&instance_id=instances/instance_bar 283*d5c09012SAndroid Build Coastguard Worker// 284*d5c09012SAndroid Build Coastguard Worker// Example 7 285*d5c09012SAndroid Build Coastguard Worker// 286*d5c09012SAndroid Build Coastguard Worker// Extracting multiple routing header key-value pairs by matching 287*d5c09012SAndroid Build Coastguard Worker// several path templates on multiple request fields. 288*d5c09012SAndroid Build Coastguard Worker// 289*d5c09012SAndroid Build Coastguard Worker// NB: note that here there is no way to specify sending nothing if one of the 290*d5c09012SAndroid Build Coastguard Worker// fields does not match its template. E.g. if the `table_name` is in the wrong 291*d5c09012SAndroid Build Coastguard Worker// format, the `project_id` will not be sent, but the `routing_id` will be. 292*d5c09012SAndroid Build Coastguard Worker// The backend routing code has to be aware of that and be prepared to not 293*d5c09012SAndroid Build Coastguard Worker// receive a full complement of keys if it expects multiple. 294*d5c09012SAndroid Build Coastguard Worker// 295*d5c09012SAndroid Build Coastguard Worker// annotation: 296*d5c09012SAndroid Build Coastguard Worker// 297*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 298*d5c09012SAndroid Build Coastguard Worker// // The routing needs both `project_id` and `routing_id` 299*d5c09012SAndroid Build Coastguard Worker// // (from the `app_profile_id` field) for routing. 300*d5c09012SAndroid Build Coastguard Worker// 301*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 302*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 303*d5c09012SAndroid Build Coastguard Worker// path_template: "{project_id=projects/*}/**" 304*d5c09012SAndroid Build Coastguard Worker// } 305*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 306*d5c09012SAndroid Build Coastguard Worker// field: "app_profile_id" 307*d5c09012SAndroid Build Coastguard Worker// path_template: "{routing_id=**}" 308*d5c09012SAndroid Build Coastguard Worker// } 309*d5c09012SAndroid Build Coastguard Worker// }; 310*d5c09012SAndroid Build Coastguard Worker// 311*d5c09012SAndroid Build Coastguard Worker// result: 312*d5c09012SAndroid Build Coastguard Worker// 313*d5c09012SAndroid Build Coastguard Worker// x-goog-request-params: 314*d5c09012SAndroid Build Coastguard Worker// project_id=projects/proj_foo&routing_id=profiles/prof_qux 315*d5c09012SAndroid Build Coastguard Worker// 316*d5c09012SAndroid Build Coastguard Worker// Example 8 317*d5c09012SAndroid Build Coastguard Worker// 318*d5c09012SAndroid Build Coastguard Worker// Extracting a single routing header key-value pair by matching 319*d5c09012SAndroid Build Coastguard Worker// several conflictingly named path templates on several request fields. The 320*d5c09012SAndroid Build Coastguard Worker// last template to match "wins" the conflict. 321*d5c09012SAndroid Build Coastguard Worker// 322*d5c09012SAndroid Build Coastguard Worker// annotation: 323*d5c09012SAndroid Build Coastguard Worker// 324*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 325*d5c09012SAndroid Build Coastguard Worker// // The `routing_id` can be a project id or a region id depending on 326*d5c09012SAndroid Build Coastguard Worker// // the table name format, but only if the `app_profile_id` is not set. 327*d5c09012SAndroid Build Coastguard Worker// // If `app_profile_id` is set it should be used instead. 328*d5c09012SAndroid Build Coastguard Worker// 329*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 330*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 331*d5c09012SAndroid Build Coastguard Worker// path_template: "{routing_id=projects/*}/**" 332*d5c09012SAndroid Build Coastguard Worker// } 333*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 334*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 335*d5c09012SAndroid Build Coastguard Worker// path_template: "{routing_id=regions/*}/**" 336*d5c09012SAndroid Build Coastguard Worker// } 337*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 338*d5c09012SAndroid Build Coastguard Worker// field: "app_profile_id" 339*d5c09012SAndroid Build Coastguard Worker// path_template: "{routing_id=**}" 340*d5c09012SAndroid Build Coastguard Worker// } 341*d5c09012SAndroid Build Coastguard Worker// }; 342*d5c09012SAndroid Build Coastguard Worker// 343*d5c09012SAndroid Build Coastguard Worker// result: 344*d5c09012SAndroid Build Coastguard Worker// 345*d5c09012SAndroid Build Coastguard Worker// x-goog-request-params: routing_id=profiles/prof_qux 346*d5c09012SAndroid Build Coastguard Worker// 347*d5c09012SAndroid Build Coastguard Worker// Example 9 348*d5c09012SAndroid Build Coastguard Worker// 349*d5c09012SAndroid Build Coastguard Worker// Bringing it all together. 350*d5c09012SAndroid Build Coastguard Worker// 351*d5c09012SAndroid Build Coastguard Worker// annotation: 352*d5c09012SAndroid Build Coastguard Worker// 353*d5c09012SAndroid Build Coastguard Worker// option (google.api.routing) = { 354*d5c09012SAndroid Build Coastguard Worker// // For routing both `table_location` and a `routing_id` are needed. 355*d5c09012SAndroid Build Coastguard Worker// // 356*d5c09012SAndroid Build Coastguard Worker// // table_location can be either an instance id or a region+zone id. 357*d5c09012SAndroid Build Coastguard Worker// // 358*d5c09012SAndroid Build Coastguard Worker// // For `routing_id`, take the value of `app_profile_id` 359*d5c09012SAndroid Build Coastguard Worker// // - If it's in the format `profiles/<profile_id>`, send 360*d5c09012SAndroid Build Coastguard Worker// // just the `<profile_id>` part. 361*d5c09012SAndroid Build Coastguard Worker// // - If it's any other literal, send it as is. 362*d5c09012SAndroid Build Coastguard Worker// // If the `app_profile_id` is empty, and the `table_name` starts with 363*d5c09012SAndroid Build Coastguard Worker// // the project_id, send that instead. 364*d5c09012SAndroid Build Coastguard Worker// 365*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 366*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 367*d5c09012SAndroid Build Coastguard Worker// path_template: "projects/*/{table_location=instances/*}/tables/*" 368*d5c09012SAndroid Build Coastguard Worker// } 369*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 370*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 371*d5c09012SAndroid Build Coastguard Worker// path_template: "{table_location=regions/*/zones/*}/tables/*" 372*d5c09012SAndroid Build Coastguard Worker// } 373*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 374*d5c09012SAndroid Build Coastguard Worker// field: "table_name" 375*d5c09012SAndroid Build Coastguard Worker// path_template: "{routing_id=projects/*}/**" 376*d5c09012SAndroid Build Coastguard Worker// } 377*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 378*d5c09012SAndroid Build Coastguard Worker// field: "app_profile_id" 379*d5c09012SAndroid Build Coastguard Worker// path_template: "{routing_id=**}" 380*d5c09012SAndroid Build Coastguard Worker// } 381*d5c09012SAndroid Build Coastguard Worker// routing_parameters { 382*d5c09012SAndroid Build Coastguard Worker// field: "app_profile_id" 383*d5c09012SAndroid Build Coastguard Worker// path_template: "profiles/{routing_id=*}" 384*d5c09012SAndroid Build Coastguard Worker// } 385*d5c09012SAndroid Build Coastguard Worker// }; 386*d5c09012SAndroid Build Coastguard Worker// 387*d5c09012SAndroid Build Coastguard Worker// result: 388*d5c09012SAndroid Build Coastguard Worker// 389*d5c09012SAndroid Build Coastguard Worker// x-goog-request-params: 390*d5c09012SAndroid Build Coastguard Worker// table_location=instances/instance_bar&routing_id=prof_qux 391*d5c09012SAndroid Build Coastguard Workermessage RoutingRule { 392*d5c09012SAndroid Build Coastguard Worker // A collection of Routing Parameter specifications. 393*d5c09012SAndroid Build Coastguard Worker // **NOTE:** If multiple Routing Parameters describe the same key 394*d5c09012SAndroid Build Coastguard Worker // (via the `path_template` field or via the `field` field when 395*d5c09012SAndroid Build Coastguard Worker // `path_template` is not provided), "last one wins" rule 396*d5c09012SAndroid Build Coastguard Worker // determines which Parameter gets used. 397*d5c09012SAndroid Build Coastguard Worker // See the examples for more details. 398*d5c09012SAndroid Build Coastguard Worker repeated RoutingParameter routing_parameters = 2; 399*d5c09012SAndroid Build Coastguard Worker} 400*d5c09012SAndroid Build Coastguard Worker 401*d5c09012SAndroid Build Coastguard Worker// A projection from an input message to the GRPC or REST header. 402*d5c09012SAndroid Build Coastguard Workermessage RoutingParameter { 403*d5c09012SAndroid Build Coastguard Worker // A request field to extract the header key-value pair from. 404*d5c09012SAndroid Build Coastguard Worker string field = 1; 405*d5c09012SAndroid Build Coastguard Worker 406*d5c09012SAndroid Build Coastguard Worker // A pattern matching the key-value field. Optional. 407*d5c09012SAndroid Build Coastguard Worker // If not specified, the whole field specified in the `field` field will be 408*d5c09012SAndroid Build Coastguard Worker // taken as value, and its name used as key. If specified, it MUST contain 409*d5c09012SAndroid Build Coastguard Worker // exactly one named segment (along with any number of unnamed segments) The 410*d5c09012SAndroid Build Coastguard Worker // pattern will be matched over the field specified in the `field` field, then 411*d5c09012SAndroid Build Coastguard Worker // if the match is successful: 412*d5c09012SAndroid Build Coastguard Worker // - the name of the single named segment will be used as a header name, 413*d5c09012SAndroid Build Coastguard Worker // - the match value of the segment will be used as a header value; 414*d5c09012SAndroid Build Coastguard Worker // if the match is NOT successful, nothing will be sent. 415*d5c09012SAndroid Build Coastguard Worker // 416*d5c09012SAndroid Build Coastguard Worker // Example: 417*d5c09012SAndroid Build Coastguard Worker // 418*d5c09012SAndroid Build Coastguard Worker // -- This is a field in the request message 419*d5c09012SAndroid Build Coastguard Worker // | that the header value will be extracted from. 420*d5c09012SAndroid Build Coastguard Worker // | 421*d5c09012SAndroid Build Coastguard Worker // | -- This is the key name in the 422*d5c09012SAndroid Build Coastguard Worker // | | routing header. 423*d5c09012SAndroid Build Coastguard Worker // V | 424*d5c09012SAndroid Build Coastguard Worker // field: "table_name" v 425*d5c09012SAndroid Build Coastguard Worker // path_template: "projects/*/{table_location=instances/*}/tables/*" 426*d5c09012SAndroid Build Coastguard Worker // ^ ^ 427*d5c09012SAndroid Build Coastguard Worker // | | 428*d5c09012SAndroid Build Coastguard Worker // In the {} brackets is the pattern that -- | 429*d5c09012SAndroid Build Coastguard Worker // specifies what to extract from the | 430*d5c09012SAndroid Build Coastguard Worker // field as a value to be sent. | 431*d5c09012SAndroid Build Coastguard Worker // | 432*d5c09012SAndroid Build Coastguard Worker // The string in the field must match the whole pattern -- 433*d5c09012SAndroid Build Coastguard Worker // before brackets, inside brackets, after brackets. 434*d5c09012SAndroid Build Coastguard Worker // 435*d5c09012SAndroid Build Coastguard Worker // When looking at this specific example, we can see that: 436*d5c09012SAndroid Build Coastguard Worker // - A key-value pair with the key `table_location` 437*d5c09012SAndroid Build Coastguard Worker // and the value matching `instances/*` should be added 438*d5c09012SAndroid Build Coastguard Worker // to the x-goog-request-params routing header. 439*d5c09012SAndroid Build Coastguard Worker // - The value is extracted from the request message's `table_name` field 440*d5c09012SAndroid Build Coastguard Worker // if it matches the full pattern specified: 441*d5c09012SAndroid Build Coastguard Worker // `projects/*/instances/*/tables/*`. 442*d5c09012SAndroid Build Coastguard Worker // 443*d5c09012SAndroid Build Coastguard Worker // **NB:** If the `path_template` field is not provided, the key name is 444*d5c09012SAndroid Build Coastguard Worker // equal to the field name, and the whole field should be sent as a value. 445*d5c09012SAndroid Build Coastguard Worker // This makes the pattern for the field and the value functionally equivalent 446*d5c09012SAndroid Build Coastguard Worker // to `**`, and the configuration 447*d5c09012SAndroid Build Coastguard Worker // 448*d5c09012SAndroid Build Coastguard Worker // { 449*d5c09012SAndroid Build Coastguard Worker // field: "table_name" 450*d5c09012SAndroid Build Coastguard Worker // } 451*d5c09012SAndroid Build Coastguard Worker // 452*d5c09012SAndroid Build Coastguard Worker // is a functionally equivalent shorthand to: 453*d5c09012SAndroid Build Coastguard Worker // 454*d5c09012SAndroid Build Coastguard Worker // { 455*d5c09012SAndroid Build Coastguard Worker // field: "table_name" 456*d5c09012SAndroid Build Coastguard Worker // path_template: "{table_name=**}" 457*d5c09012SAndroid Build Coastguard Worker // } 458*d5c09012SAndroid Build Coastguard Worker // 459*d5c09012SAndroid Build Coastguard Worker // See Example 1 for more details. 460*d5c09012SAndroid Build Coastguard Worker string path_template = 2; 461*d5c09012SAndroid Build Coastguard Worker} 462