1 #!/usr/bin/env python2.7
2 # Copyright 2017 gRPC authors.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
16 # Defines languages, runtimes and releases for backward compatibility testing
18 from collections import OrderedDict
21 def get_github_repo(lang):
23 'dart': 'https://github.com/grpc/grpc-dart.git',
24 'go': 'https://github.com/grpc/grpc-go.git',
25 'java': 'https://github.com/grpc/grpc-java.git',
26 'node': 'https://github.com/grpc/grpc-node.git',
27 # all other languages use the grpc.git repo.
28 }.get(lang, 'https://github.com/grpc/grpc.git')
31 def get_release_tags(lang):
32 """Returns list of known releases for given language."""
33 return list(LANG_RELEASE_MATRIX[lang].keys())
36 def get_runtimes_for_lang_release(lang, release):
37 """Get list of valid runtimes for given release of lang."""
38 runtimes = list(LANG_RUNTIME_MATRIX[lang])
39 release_info = LANG_RELEASE_MATRIX[lang].get(release)
40 if release_info and release_info.runtimes:
41 runtimes = list(release_info.runtimes)
45 def should_build_docker_interop_image_from_release_tag(lang):
46 # All dockerfile definitions live in grpc/grpc repository.
47 # For language that have a separate repo, we need to use
48 # dockerfile definitions from head of grpc/grpc.
49 if lang in ['go', 'java', 'node']:
54 # Dictionary of default runtimes per language
55 LANG_RUNTIME_MATRIX = {
56 'cxx': ['cxx'], # This is actually debian8.
57 'go': ['go1.8', 'go1.11', 'go1.16'],
59 'python': ['python', 'pythonasyncio'],
63 'csharp': ['csharp', 'csharpcoreclr'],
68 """Info about a single release of a language"""
70 def __init__(self, patch=[], runtimes=[], testcases_file=None):
72 self.runtimes = runtimes
73 self.testcases_file = testcases_file
76 # Dictionary of known releases for given language.
77 LANG_RELEASE_MATRIX = {
80 ('v1.0.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
81 ('v1.1.4', ReleaseInfo(testcases_file='cxx__v1.0.1')),
82 ('v1.2.5', ReleaseInfo(testcases_file='cxx__v1.0.1')),
83 ('v1.3.9', ReleaseInfo(testcases_file='cxx__v1.0.1')),
84 ('v1.4.2', ReleaseInfo(testcases_file='cxx__v1.0.1')),
85 ('v1.6.6', ReleaseInfo(testcases_file='cxx__v1.0.1')),
86 ('v1.7.2', ReleaseInfo(testcases_file='cxx__v1.0.1')),
87 ('v1.8.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
88 ('v1.9.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
89 ('v1.10.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
90 ('v1.11.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
91 ('v1.12.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
92 ('v1.13.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
93 ('v1.14.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
94 ('v1.15.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
95 ('v1.16.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
96 ('v1.17.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
97 ('v1.18.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
98 ('v1.19.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
99 ('v1.20.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
100 ('v1.21.4', ReleaseInfo(testcases_file='cxx__v1.31.1')),
101 ('v1.22.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
102 ('v1.22.1', ReleaseInfo(testcases_file='cxx__v1.31.1')),
103 ('v1.23.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
104 ('v1.24.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
105 ('v1.25.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
106 ('v1.26.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
107 ('v1.27.3', ReleaseInfo(testcases_file='cxx__v1.31.1')),
108 ('v1.30.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
109 ('v1.31.1', ReleaseInfo(testcases_file='cxx__v1.31.1')),
110 ('v1.32.0', ReleaseInfo()),
111 ('v1.33.2', ReleaseInfo()),
112 ('v1.34.0', ReleaseInfo()),
113 ('v1.35.0', ReleaseInfo()),
114 ('v1.36.3', ReleaseInfo()),
115 ('v1.37.0', ReleaseInfo()),
116 ('v1.38.0', ReleaseInfo()),
121 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
123 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
125 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
127 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
129 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
131 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
133 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
135 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
137 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
139 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
141 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
143 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
145 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
147 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
149 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
151 ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
153 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
155 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
157 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
159 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
161 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
163 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
165 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
167 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
169 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
171 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
173 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
175 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
177 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
179 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
181 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
183 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
185 ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
186 ('v1.34.0', ReleaseInfo(runtimes=['go1.11'])),
187 ('v1.35.0', ReleaseInfo(runtimes=['go1.11'])),
188 ('v1.36.0', ReleaseInfo(runtimes=['go1.11'])),
189 ('v1.37.0', ReleaseInfo(runtimes=['go1.11'])),
190 # NOTE: starting from release v1.38.0, use runtimes=['go1.16']
191 ('v1.38.1', ReleaseInfo(runtimes=['go1.16'])),
192 ('v1.39.0', ReleaseInfo(runtimes=['go1.16'])),
197 ReleaseInfo(runtimes=['java_oracle8'],
198 testcases_file='java__v1.0.3')),
200 ReleaseInfo(runtimes=['java_oracle8'],
201 testcases_file='java__v1.0.3')),
203 ReleaseInfo(runtimes=['java_oracle8'],
204 testcases_file='java__v1.0.3')),
206 ReleaseInfo(runtimes=['java_oracle8'],
207 testcases_file='java__v1.0.3')),
209 ReleaseInfo(runtimes=['java_oracle8'],
210 testcases_file='java__v1.0.3')),
212 ReleaseInfo(runtimes=['java_oracle8'],
213 testcases_file='java__v1.0.3')),
215 ReleaseInfo(runtimes=['java_oracle8'],
216 testcases_file='java__v1.0.3')),
217 ('v1.7.1', ReleaseInfo(testcases_file='java__v1.0.3')),
219 ReleaseInfo(runtimes=['java_oracle8'],
220 testcases_file='java__v1.0.3')),
222 ReleaseInfo(runtimes=['java_oracle8'],
223 testcases_file='java__v1.0.3')),
225 ReleaseInfo(runtimes=['java_oracle8'],
226 testcases_file='java__v1.0.3')),
228 ReleaseInfo(runtimes=['java_oracle8'],
229 testcases_file='java__v1.0.3')),
230 ('v1.12.1', ReleaseInfo(testcases_file='java__v1.0.3')),
231 ('v1.13.2', ReleaseInfo(testcases_file='java__v1.0.3')),
233 ReleaseInfo(runtimes=['java_oracle8'],
234 testcases_file='java__v1.0.3')),
235 ('v1.15.1', ReleaseInfo(testcases_file='java__v1.0.3')),
237 ReleaseInfo(runtimes=['java_oracle8'],
238 testcases_file='java__v1.0.3')),
239 ('v1.17.2', ReleaseInfo(testcases_file='java__v1.0.3')),
241 ReleaseInfo(runtimes=['java_oracle8'],
242 testcases_file='java__v1.0.3')),
244 ReleaseInfo(runtimes=['java_oracle8'],
245 testcases_file='java__v1.0.3')),
246 ('v1.20.0', ReleaseInfo(runtimes=['java_oracle8'])),
247 ('v1.21.1', ReleaseInfo()),
248 ('v1.22.2', ReleaseInfo()),
249 ('v1.23.0', ReleaseInfo()),
250 ('v1.24.0', ReleaseInfo()),
251 ('v1.25.0', ReleaseInfo()),
252 ('v1.26.1', ReleaseInfo()),
253 ('v1.27.2', ReleaseInfo()),
254 ('v1.28.1', ReleaseInfo()),
255 ('v1.29.0', ReleaseInfo()),
256 ('v1.30.2', ReleaseInfo()),
257 ('v1.31.2', ReleaseInfo()),
258 ('v1.32.3', ReleaseInfo()),
259 ('v1.33.1', ReleaseInfo()),
260 ('v1.34.1', ReleaseInfo()),
261 ('v1.35.1', ReleaseInfo()),
262 ('v1.36.1', ReleaseInfo()),
263 ('v1.37.1', ReleaseInfo()),
264 ('v1.38.1', ReleaseInfo()),
265 ('v1.39.0', ReleaseInfo()),
270 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
272 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
274 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
276 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
278 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
280 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
282 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
284 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
286 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
288 ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
290 ReleaseInfo(runtimes=['python'],
291 testcases_file='python__v1.11.1')),
293 ReleaseInfo(runtimes=['python'],
294 testcases_file='python__v1.11.1')),
296 ReleaseInfo(runtimes=['python'],
297 testcases_file='python__v1.11.1')),
299 ReleaseInfo(runtimes=['python'],
300 testcases_file='python__v1.11.1')),
302 ReleaseInfo(runtimes=['python'],
303 testcases_file='python__v1.11.1')),
305 ReleaseInfo(runtimes=['python'],
306 testcases_file='python__v1.11.1')),
308 ReleaseInfo(runtimes=['python'],
309 testcases_file='python__v1.11.1')),
310 ('v1.18.0', ReleaseInfo(runtimes=['python'])),
311 ('v1.19.0', ReleaseInfo(runtimes=['python'])),
312 ('v1.20.0', ReleaseInfo(runtimes=['python'])),
313 ('v1.21.4', ReleaseInfo(runtimes=['python'])),
314 ('v1.22.0', ReleaseInfo(runtimes=['python'])),
315 ('v1.22.1', ReleaseInfo(runtimes=['python'])),
316 ('v1.23.0', ReleaseInfo(runtimes=['python'])),
317 ('v1.24.0', ReleaseInfo(runtimes=['python'])),
318 ('v1.25.0', ReleaseInfo(runtimes=['python'])),
319 ('v1.26.0', ReleaseInfo(runtimes=['python'])),
320 ('v1.27.3', ReleaseInfo(runtimes=['python'])),
321 ('v1.30.0', ReleaseInfo(runtimes=['python'])),
322 ('v1.31.1', ReleaseInfo(runtimes=['python'])),
323 ('v1.32.0', ReleaseInfo(runtimes=['python'])),
324 ('v1.33.2', ReleaseInfo(runtimes=['python'])),
325 ('v1.34.0', ReleaseInfo(runtimes=['python'])),
326 ('v1.35.0', ReleaseInfo(runtimes=['python'])),
327 ('v1.36.3', ReleaseInfo(runtimes=['python'])),
328 ('v1.37.0', ReleaseInfo(runtimes=['python'])),
329 ('v1.38.0', ReleaseInfo(runtimes=['python'])),
333 ('v1.0.1', ReleaseInfo(testcases_file='node__v1.0.1')),
334 ('v1.1.4', ReleaseInfo(testcases_file='node__v1.1.4')),
335 ('v1.2.5', ReleaseInfo(testcases_file='node__v1.1.4')),
336 ('v1.3.9', ReleaseInfo(testcases_file='node__v1.1.4')),
337 ('v1.4.2', ReleaseInfo(testcases_file='node__v1.1.4')),
338 ('v1.6.6', ReleaseInfo(testcases_file='node__v1.1.4')),
339 # TODO: https://github.com/grpc/grpc-node/issues/235.
340 # ('v1.7.2', ReleaseInfo()),
341 ('v1.8.4', ReleaseInfo()),
342 ('v1.9.1', ReleaseInfo()),
343 ('v1.10.0', ReleaseInfo()),
344 ('v1.11.3', ReleaseInfo()),
345 ('v1.12.4', ReleaseInfo()),
351 'tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile',
352 'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh',
354 testcases_file='ruby__v1.0.1')),
355 ('v1.1.4', ReleaseInfo(testcases_file='ruby__v1.1.4')),
356 ('v1.2.5', ReleaseInfo(testcases_file='ruby__v1.1.4')),
357 ('v1.3.9', ReleaseInfo(testcases_file='ruby__v1.1.4')),
358 ('v1.4.2', ReleaseInfo(testcases_file='ruby__v1.1.4')),
359 ('v1.6.6', ReleaseInfo(testcases_file='ruby__v1.1.4')),
360 ('v1.7.2', ReleaseInfo(testcases_file='ruby__v1.1.4')),
361 ('v1.8.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
362 ('v1.9.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
363 ('v1.10.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
364 ('v1.11.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
365 ('v1.12.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
366 ('v1.13.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
367 ('v1.14.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
368 ('v1.15.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
369 ('v1.16.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
370 ('v1.17.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
373 'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh',
375 ('v1.19.0', ReleaseInfo()),
376 ('v1.20.0', ReleaseInfo()),
377 ('v1.21.4', ReleaseInfo()),
378 ('v1.22.0', ReleaseInfo()),
379 ('v1.22.1', ReleaseInfo()),
380 ('v1.23.0', ReleaseInfo()),
381 ('v1.24.0', ReleaseInfo()),
382 ('v1.25.0', ReleaseInfo()),
383 # TODO: https://github.com/grpc/grpc/issues/18262.
384 # If you are not encountering the error in above issue
385 # go ahead and upload the docker image for new releases.
386 ('v1.26.0', ReleaseInfo()),
387 ('v1.27.3', ReleaseInfo()),
388 ('v1.30.0', ReleaseInfo()),
389 ('v1.31.1', ReleaseInfo()),
390 ('v1.32.0', ReleaseInfo()),
391 ('v1.33.2', ReleaseInfo()),
392 ('v1.34.0', ReleaseInfo()),
393 ('v1.35.0', ReleaseInfo()),
394 ('v1.36.3', ReleaseInfo()),
395 ('v1.37.0', ReleaseInfo()),
396 ('v1.38.0', ReleaseInfo()),
400 ('v1.0.1', ReleaseInfo(testcases_file='php__v1.0.1')),
401 ('v1.1.4', ReleaseInfo(testcases_file='php__v1.0.1')),
402 ('v1.2.5', ReleaseInfo(testcases_file='php__v1.0.1')),
403 ('v1.3.9', ReleaseInfo(testcases_file='php__v1.0.1')),
404 ('v1.4.2', ReleaseInfo(testcases_file='php__v1.0.1')),
405 ('v1.6.6', ReleaseInfo(testcases_file='php__v1.0.1')),
406 ('v1.7.2', ReleaseInfo(testcases_file='php__v1.0.1')),
407 ('v1.8.0', ReleaseInfo(testcases_file='php__v1.0.1')),
408 ('v1.9.1', ReleaseInfo(testcases_file='php__v1.0.1')),
409 ('v1.10.1', ReleaseInfo(testcases_file='php__v1.0.1')),
410 ('v1.11.1', ReleaseInfo(testcases_file='php__v1.0.1')),
411 ('v1.12.0', ReleaseInfo(testcases_file='php__v1.0.1')),
412 ('v1.13.0', ReleaseInfo(testcases_file='php__v1.0.1')),
413 ('v1.14.1', ReleaseInfo(testcases_file='php__v1.0.1')),
414 ('v1.15.0', ReleaseInfo(testcases_file='php__v1.0.1')),
415 ('v1.16.0', ReleaseInfo(testcases_file='php__v1.0.1')),
416 ('v1.17.1', ReleaseInfo(testcases_file='php__v1.0.1')),
417 ('v1.18.0', ReleaseInfo()),
418 # v1.19 and v1.20 were deliberately omitted here because of an issue.
419 # See https://github.com/grpc/grpc/issues/18264
420 ('v1.21.4', ReleaseInfo()),
421 ('v1.22.0', ReleaseInfo()),
422 ('v1.22.1', ReleaseInfo()),
423 ('v1.23.0', ReleaseInfo()),
424 ('v1.24.0', ReleaseInfo()),
425 ('v1.25.0', ReleaseInfo()),
426 ('v1.26.0', ReleaseInfo()),
427 ('v1.27.3', ReleaseInfo()),
428 ('v1.30.0', ReleaseInfo()),
429 ('v1.31.1', ReleaseInfo()),
430 ('v1.32.0', ReleaseInfo()),
431 ('v1.33.2', ReleaseInfo()),
432 ('v1.34.0', ReleaseInfo()),
433 ('v1.35.0', ReleaseInfo()),
434 ('v1.36.3', ReleaseInfo()),
435 ('v1.37.0', ReleaseInfo()),
436 ('v1.38.0', ReleaseInfo()),
442 'tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile',
443 'tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile',
445 testcases_file='csharp__v1.1.4')),
446 ('v1.1.4', ReleaseInfo(testcases_file='csharp__v1.1.4')),
447 ('v1.2.5', ReleaseInfo(testcases_file='csharp__v1.1.4')),
448 ('v1.3.9', ReleaseInfo(testcases_file='csharp__v1.3.9')),
449 ('v1.4.2', ReleaseInfo(testcases_file='csharp__v1.3.9')),
450 ('v1.6.6', ReleaseInfo(testcases_file='csharp__v1.3.9')),
451 ('v1.7.2', ReleaseInfo(testcases_file='csharp__v1.3.9')),
452 ('v1.8.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
453 ('v1.9.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
454 ('v1.10.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
455 ('v1.11.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
456 ('v1.12.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
457 ('v1.13.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
458 ('v1.14.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
459 ('v1.15.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
460 ('v1.16.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
461 ('v1.17.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
462 ('v1.18.0', ReleaseInfo(testcases_file='csharp__v1.18.0')),
463 ('v1.19.0', ReleaseInfo(testcases_file='csharp__v1.18.0')),
464 ('v1.20.0', ReleaseInfo()),
465 ('v1.21.4', ReleaseInfo()),
466 ('v1.22.0', ReleaseInfo()),
467 ('v1.22.1', ReleaseInfo()),
468 ('v1.23.0', ReleaseInfo()),
469 ('v1.24.0', ReleaseInfo()),
470 ('v1.25.0', ReleaseInfo()),
471 ('v1.26.0', ReleaseInfo()),
472 ('v1.27.3', ReleaseInfo()),
473 ('v1.30.0', ReleaseInfo()),
474 ('v1.31.1', ReleaseInfo()),
475 ('v1.32.0', ReleaseInfo()),
476 ('v1.33.2', ReleaseInfo()),
477 ('v1.34.0', ReleaseInfo()),
478 ('v1.35.0', ReleaseInfo()),
479 ('v1.36.3', ReleaseInfo()),
480 ('v1.37.0', ReleaseInfo()),