xref: /aosp_15_r20/external/googleapis/google/api/routing.proto (revision d5c09012810ac0c9f33fe448fb6da8260d444cc9)
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