1# Copyright 2017 gRPC authors.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15# Defines languages, runtimes and releases for backward compatibility testing
16
17from collections import OrderedDict
18
19
20def get_github_repo(lang):
21    return {
22        'dart': 'https://github.com/grpc/grpc-dart.git',
23        'go': 'https://github.com/grpc/grpc-go.git',
24        'java': 'https://github.com/grpc/grpc-java.git',
25        'node': 'https://github.com/grpc/grpc-node.git',
26        # all other languages use the grpc.git repo.
27    }.get(lang, 'https://github.com/grpc/grpc.git')
28
29
30def get_release_tags(lang):
31    """Returns list of known releases for given language."""
32    return list(LANG_RELEASE_MATRIX[lang].keys())
33
34
35def get_runtimes_for_lang_release(lang, release):
36    """Get list of valid runtimes for given release of lang."""
37    runtimes = list(LANG_RUNTIME_MATRIX[lang])
38    release_info = LANG_RELEASE_MATRIX[lang].get(release)
39    if release_info and release_info.runtimes:
40        runtimes = list(release_info.runtimes)
41    return runtimes
42
43
44def should_build_docker_interop_image_from_release_tag(lang):
45    # All dockerfile definitions live in grpc/grpc repository.
46    # For language that have a separate repo, we need to use
47    # dockerfile definitions from head of grpc/grpc.
48    if lang in ['go', 'java', 'node']:
49        return False
50    return True
51
52
53# Dictionary of default runtimes per language
54LANG_RUNTIME_MATRIX = {
55    'cxx': ['cxx'],  # This is actually debian8.
56    'go': ['go1.8', 'go1.11', 'go1.16', 'go1.19'],
57    'java': ['java'],
58    'python': ['python', 'pythonasyncio'],
59    'node': ['node'],
60    'ruby': ['ruby'],
61    'php': ['php7'],
62    'csharp': ['csharp', 'csharpcoreclr'],
63}
64
65
66class ReleaseInfo:
67    """Info about a single release of a language"""
68
69    def __init__(self, patch=[], runtimes=[], testcases_file=None):
70        self.patch = patch
71        self.runtimes = runtimes
72        self.testcases_file = testcases_file
73
74
75# Dictionary of known releases for given language.
76LANG_RELEASE_MATRIX = {
77    'cxx':
78        OrderedDict([
79            ('v1.0.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
80            ('v1.1.4', ReleaseInfo(testcases_file='cxx__v1.0.1')),
81            ('v1.2.5', ReleaseInfo(testcases_file='cxx__v1.0.1')),
82            ('v1.3.9', ReleaseInfo(testcases_file='cxx__v1.0.1')),
83            ('v1.4.2', ReleaseInfo(testcases_file='cxx__v1.0.1')),
84            ('v1.6.6', ReleaseInfo(testcases_file='cxx__v1.0.1')),
85            ('v1.7.2', ReleaseInfo(testcases_file='cxx__v1.0.1')),
86            ('v1.8.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
87            ('v1.9.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
88            ('v1.10.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
89            ('v1.11.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
90            ('v1.12.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
91            ('v1.13.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
92            ('v1.14.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
93            ('v1.15.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
94            ('v1.16.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
95            ('v1.17.1', ReleaseInfo(testcases_file='cxx__v1.0.1')),
96            ('v1.18.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
97            ('v1.19.0', ReleaseInfo(testcases_file='cxx__v1.0.1')),
98            ('v1.20.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
99            ('v1.21.4', ReleaseInfo(testcases_file='cxx__v1.31.1')),
100            ('v1.22.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
101            ('v1.22.1', ReleaseInfo(testcases_file='cxx__v1.31.1')),
102            ('v1.23.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
103            ('v1.24.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
104            ('v1.25.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
105            ('v1.26.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
106            ('v1.27.3', ReleaseInfo(testcases_file='cxx__v1.31.1')),
107            ('v1.30.0', ReleaseInfo(testcases_file='cxx__v1.31.1')),
108            ('v1.31.1', ReleaseInfo(testcases_file='cxx__v1.31.1')),
109            ('v1.32.0', ReleaseInfo()),
110            ('v1.33.2', ReleaseInfo()),
111            ('v1.34.0', ReleaseInfo()),
112            ('v1.35.0', ReleaseInfo()),
113            ('v1.36.3', ReleaseInfo()),
114            ('v1.37.0', ReleaseInfo()),
115            ('v1.38.0', ReleaseInfo()),
116            ('v1.39.0', ReleaseInfo()),
117            ('v1.41.1', ReleaseInfo()),
118            ('v1.42.0', ReleaseInfo()),
119            ('v1.43.0', ReleaseInfo()),
120            ('v1.44.0', ReleaseInfo()),
121            ('v1.46.2', ReleaseInfo()),
122            ('v1.47.1', ReleaseInfo()),
123            ('v1.48.3', ReleaseInfo()),
124            ('v1.49.1', ReleaseInfo()),
125            ('v1.52.0', ReleaseInfo()),
126            ('v1.53.0', ReleaseInfo()),
127            ('v1.54.0', ReleaseInfo()),
128            ('v1.55.0', ReleaseInfo()),
129        ]),
130    'go':
131        OrderedDict([
132            ('v1.0.5',
133             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
134            ('v1.2.1',
135             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
136            ('v1.3.0',
137             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
138            ('v1.4.2',
139             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
140            ('v1.5.2',
141             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
142            ('v1.6.0',
143             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
144            ('v1.7.4',
145             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
146            ('v1.8.2',
147             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
148            ('v1.9.2',
149             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
150            ('v1.10.1',
151             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
152            ('v1.11.3',
153             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
154            ('v1.12.2',
155             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
156            ('v1.13.0',
157             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
158            ('v1.14.0',
159             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
160            ('v1.15.0',
161             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
162            ('v1.16.0',
163             ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
164            ('v1.17.0',
165             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
166            ('v1.18.0',
167             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
168            ('v1.19.0',
169             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
170            ('v1.20.0',
171             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
172            ('v1.21.3',
173             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
174            ('v1.22.3',
175             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
176            ('v1.23.1',
177             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
178            ('v1.24.0',
179             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
180            ('v1.25.0',
181             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
182            ('v1.26.0',
183             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
184            ('v1.27.1',
185             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
186            ('v1.28.0',
187             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
188            ('v1.29.0',
189             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
190            ('v1.30.0',
191             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
192            ('v1.31.1',
193             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
194            ('v1.32.0',
195             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
196            ('v1.33.1',
197             ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
198            ('v1.34.0', ReleaseInfo(runtimes=['go1.11'])),
199            ('v1.35.0', ReleaseInfo(runtimes=['go1.11'])),
200            ('v1.36.0', ReleaseInfo(runtimes=['go1.11'])),
201            ('v1.37.0', ReleaseInfo(runtimes=['go1.11'])),
202            # NOTE: starting from release v1.38.0, use runtimes=['go1.16']
203            ('v1.38.1', ReleaseInfo(runtimes=['go1.16'])),
204            ('v1.39.1', ReleaseInfo(runtimes=['go1.16'])),
205            ('v1.40.0', ReleaseInfo(runtimes=['go1.16'])),
206            ('v1.41.0', ReleaseInfo(runtimes=['go1.16'])),
207            ('v1.42.0', ReleaseInfo(runtimes=['go1.16'])),
208            ('v1.43.0', ReleaseInfo(runtimes=['go1.16'])),
209            ('v1.44.0', ReleaseInfo(runtimes=['go1.16'])),
210            ('v1.45.0', ReleaseInfo(runtimes=['go1.16'])),
211            ('v1.46.0', ReleaseInfo(runtimes=['go1.16'])),
212            ('v1.47.0', ReleaseInfo(runtimes=['go1.16'])),
213            ('v1.48.0', ReleaseInfo(runtimes=['go1.16'])),
214            ('v1.49.0', ReleaseInfo(runtimes=['go1.16'])),
215            ('v1.50.1', ReleaseInfo(runtimes=['go1.16'])),
216            ('v1.51.0', ReleaseInfo(runtimes=['go1.16'])),
217            ('v1.52.3', ReleaseInfo(runtimes=['go1.19'])),
218            ('v1.53.0', ReleaseInfo(runtimes=['go1.19'])),
219            ('v1.54.1', ReleaseInfo(runtimes=['go1.19'])),
220            ('v1.55.0', ReleaseInfo(runtimes=['go1.19'])),
221        ]),
222    'java':
223        OrderedDict([
224            ('v1.0.3',
225             ReleaseInfo(runtimes=['java_oracle8'],
226                         testcases_file='java__v1.0.3')),
227            ('v1.1.2',
228             ReleaseInfo(runtimes=['java_oracle8'],
229                         testcases_file='java__v1.0.3')),
230            ('v1.2.0',
231             ReleaseInfo(runtimes=['java_oracle8'],
232                         testcases_file='java__v1.0.3')),
233            ('v1.3.1',
234             ReleaseInfo(runtimes=['java_oracle8'],
235                         testcases_file='java__v1.0.3')),
236            ('v1.4.0',
237             ReleaseInfo(runtimes=['java_oracle8'],
238                         testcases_file='java__v1.0.3')),
239            ('v1.5.0',
240             ReleaseInfo(runtimes=['java_oracle8'],
241                         testcases_file='java__v1.0.3')),
242            ('v1.6.1',
243             ReleaseInfo(runtimes=['java_oracle8'],
244                         testcases_file='java__v1.0.3')),
245            ('v1.7.1', ReleaseInfo(testcases_file='java__v1.0.3')),
246            ('v1.8.0',
247             ReleaseInfo(runtimes=['java_oracle8'],
248                         testcases_file='java__v1.0.3')),
249            ('v1.9.1',
250             ReleaseInfo(runtimes=['java_oracle8'],
251                         testcases_file='java__v1.0.3')),
252            ('v1.10.1',
253             ReleaseInfo(runtimes=['java_oracle8'],
254                         testcases_file='java__v1.0.3')),
255            ('v1.11.0',
256             ReleaseInfo(runtimes=['java_oracle8'],
257                         testcases_file='java__v1.0.3')),
258            ('v1.12.1', ReleaseInfo(testcases_file='java__v1.0.3')),
259            ('v1.13.2', ReleaseInfo(testcases_file='java__v1.0.3')),
260            ('v1.14.0',
261             ReleaseInfo(runtimes=['java_oracle8'],
262                         testcases_file='java__v1.0.3')),
263            ('v1.15.1', ReleaseInfo(testcases_file='java__v1.0.3')),
264            ('v1.16.1',
265             ReleaseInfo(runtimes=['java_oracle8'],
266                         testcases_file='java__v1.0.3')),
267            ('v1.17.2', ReleaseInfo(testcases_file='java__v1.0.3')),
268            ('v1.18.0',
269             ReleaseInfo(runtimes=['java_oracle8'],
270                         testcases_file='java__v1.0.3')),
271            ('v1.19.0',
272             ReleaseInfo(runtimes=['java_oracle8'],
273                         testcases_file='java__v1.0.3')),
274            ('v1.20.0', ReleaseInfo(runtimes=['java_oracle8'])),
275            ('v1.21.1', ReleaseInfo()),
276            ('v1.22.2', ReleaseInfo()),
277            ('v1.23.0', ReleaseInfo()),
278            ('v1.24.0', ReleaseInfo()),
279            ('v1.25.0', ReleaseInfo()),
280            ('v1.26.1', ReleaseInfo()),
281            ('v1.27.2', ReleaseInfo()),
282            ('v1.28.1', ReleaseInfo()),
283            ('v1.29.0', ReleaseInfo()),
284            ('v1.30.2', ReleaseInfo()),
285            ('v1.31.2', ReleaseInfo()),
286            ('v1.32.3', ReleaseInfo()),
287            ('v1.33.1', ReleaseInfo()),
288            ('v1.34.1', ReleaseInfo()),
289            ('v1.35.1', ReleaseInfo()),
290            ('v1.36.3', ReleaseInfo()),
291            ('v1.37.1', ReleaseInfo()),
292            ('v1.38.1', ReleaseInfo()),
293            ('v1.39.0', ReleaseInfo()),
294            ('v1.40.2', ReleaseInfo()),
295            ('v1.41.3', ReleaseInfo()),
296            ('v1.42.3', ReleaseInfo()),
297            ('v1.43.3', ReleaseInfo()),
298            ('v1.44.2', ReleaseInfo()),
299            ('v1.45.3', ReleaseInfo()),
300            ('v1.46.1', ReleaseInfo()),
301            ('v1.47.1', ReleaseInfo()),
302            ('v1.48.2', ReleaseInfo()),
303            ('v1.49.2', ReleaseInfo()),
304            ('v1.50.2', ReleaseInfo()),
305            ('v1.51.1', ReleaseInfo()),
306            ('v1.52.0', ReleaseInfo()),
307            ('v1.54.0', ReleaseInfo()),
308        ]),
309    'python':
310        OrderedDict(
311            [
312                ('v1.0.x',
313                 ReleaseInfo(runtimes=['python'],
314                             testcases_file='python__v1.0.x')),
315                ('v1.1.4',
316                 ReleaseInfo(runtimes=['python'],
317                             testcases_file='python__v1.0.x')),
318                ('v1.2.5',
319                 ReleaseInfo(runtimes=['python'],
320                             testcases_file='python__v1.0.x')),
321                ('v1.3.9',
322                 ReleaseInfo(runtimes=['python'],
323                             testcases_file='python__v1.0.x')),
324                ('v1.4.2',
325                 ReleaseInfo(runtimes=['python'],
326                             testcases_file='python__v1.0.x')),
327                ('v1.6.6',
328                 ReleaseInfo(runtimes=['python'],
329                             testcases_file='python__v1.0.x')),
330                ('v1.7.2',
331                 ReleaseInfo(runtimes=['python'],
332                             testcases_file='python__v1.0.x')),
333                ('v1.8.1',
334                 ReleaseInfo(runtimes=['python'],
335                             testcases_file='python__v1.0.x')),
336                ('v1.9.1',
337                 ReleaseInfo(runtimes=['python'],
338                             testcases_file='python__v1.0.x')),
339                ('v1.10.1',
340                 ReleaseInfo(runtimes=['python'],
341                             testcases_file='python__v1.0.x')),
342                ('v1.11.1',
343                 ReleaseInfo(runtimes=['python'],
344                             testcases_file='python__v1.11.1')),
345                ('v1.12.0',
346                 ReleaseInfo(runtimes=['python'],
347                             testcases_file='python__v1.11.1')),
348                ('v1.13.0',
349                 ReleaseInfo(runtimes=['python'],
350                             testcases_file='python__v1.11.1')),
351                ('v1.14.1',
352                 ReleaseInfo(runtimes=['python'],
353                             testcases_file='python__v1.11.1')),
354                ('v1.15.0',
355                 ReleaseInfo(runtimes=['python'],
356                             testcases_file='python__v1.11.1')),
357                ('v1.16.0',
358                 ReleaseInfo(runtimes=['python'],
359                             testcases_file='python__v1.11.1')),
360                ('v1.17.1',
361                 ReleaseInfo(runtimes=['python'],
362                             testcases_file='python__v1.11.1')),
363                ('v1.18.0',
364                 ReleaseInfo(runtimes=['python'],
365                             testcases_file='python__v1.18.0')),
366                ('v1.19.0',
367                 ReleaseInfo(runtimes=['python'],
368                             testcases_file='python__v1.18.0')),
369                ('v1.20.0',
370                 ReleaseInfo(runtimes=['python'],
371                             testcases_file='python__v1.18.0')),
372                ('v1.21.4',
373                 ReleaseInfo(runtimes=['python'],
374                             testcases_file='python__v1.18.0')),
375                ('v1.22.0',
376                 ReleaseInfo(runtimes=['python'],
377                             testcases_file='python__v1.18.0')),
378                ('v1.22.1',
379                 ReleaseInfo(runtimes=['python'],
380                             testcases_file='python__v1.18.0')),
381                ('v1.23.0',
382                 ReleaseInfo(runtimes=['python'],
383                             testcases_file='python__v1.18.0')),
384                ('v1.24.0',
385                 ReleaseInfo(runtimes=['python'],
386                             testcases_file='python__v1.18.0')),
387                ('v1.25.0',
388                 ReleaseInfo(runtimes=['python'],
389                             testcases_file='python__v1.18.0')),
390                ('v1.26.0',
391                 ReleaseInfo(runtimes=['python'],
392                             testcases_file='python__v1.18.0')),
393                ('v1.27.3',
394                 ReleaseInfo(runtimes=['python'],
395                             testcases_file='python__v1.18.0')),
396                ('v1.30.0',
397                 ReleaseInfo(runtimes=['python'],
398                             testcases_file='python__v1.18.0')),
399                ('v1.31.1',
400                 ReleaseInfo(runtimes=['python'],
401                             testcases_file='python__v1.18.0')),
402                ('v1.32.0',
403                 ReleaseInfo(runtimes=['python'],
404                             testcases_file='python__v1.18.0')),
405                ('v1.33.2',
406                 ReleaseInfo(runtimes=['python'],
407                             testcases_file='python__v1.18.0')),
408                ('v1.34.0',
409                 ReleaseInfo(runtimes=['python'],
410                             testcases_file='python__v1.18.0')),
411                ('v1.35.0',
412                 ReleaseInfo(runtimes=['python'],
413                             testcases_file='python__v1.18.0')),
414                ('v1.36.3',
415                 ReleaseInfo(runtimes=['python'],
416                             testcases_file='python__v1.18.0')),
417                ('v1.37.0',
418                 ReleaseInfo(runtimes=['python'],
419                             testcases_file='python__v1.18.0')),
420                ('v1.38.0',
421                 ReleaseInfo(runtimes=['python'],
422                             testcases_file='python__v1.18.0')),
423                ('v1.39.0',
424                 ReleaseInfo(runtimes=['python'],
425                             testcases_file='python__v1.18.0')),
426                ('v1.41.1',
427                 ReleaseInfo(runtimes=['python'],
428                             testcases_file='python__v1.41.1')),
429                ('v1.42.0',
430                 ReleaseInfo(runtimes=['python'],
431                             testcases_file='python__v1.41.1')),
432                ('v1.43.2',
433                 ReleaseInfo(runtimes=['python'],
434                             testcases_file='python__v1.41.1')),
435                ('v1.44.0',
436                 ReleaseInfo(runtimes=['python'],
437                             testcases_file='python__master')),
438                ('v1.46.2',
439                 ReleaseInfo(runtimes=['python'],
440                             testcases_file='python__master')),
441                ('v1.47.1',
442                 ReleaseInfo(runtimes=['python'],
443                             testcases_file='python__master')),
444                ('v1.48.3',
445                 ReleaseInfo(runtimes=['python'],
446                             testcases_file='python__master')),
447                ('v1.49.1',
448                 ReleaseInfo(runtimes=['python'],
449                             testcases_file='python__master')),
450                ('v1.52.0',
451                 ReleaseInfo(runtimes=['python'],
452                             testcases_file='python__master')),
453                ('v1.53.0',
454                 ReleaseInfo(runtimes=['python'],
455                             testcases_file='python__master')),
456                ('v1.54.0',
457                 ReleaseInfo(runtimes=['python'],
458                             testcases_file='python__master')),
459                ('v1.55.0',
460                 ReleaseInfo(runtimes=['python'],
461                             testcases_file='python__master')),
462            ]),
463    'node':
464        OrderedDict([
465            ('v1.0.1', ReleaseInfo(testcases_file='node__v1.0.1')),
466            ('v1.1.4', ReleaseInfo(testcases_file='node__v1.1.4')),
467            ('v1.2.5', ReleaseInfo(testcases_file='node__v1.1.4')),
468            ('v1.3.9', ReleaseInfo(testcases_file='node__v1.1.4')),
469            ('v1.4.2', ReleaseInfo(testcases_file='node__v1.1.4')),
470            ('v1.6.6', ReleaseInfo(testcases_file='node__v1.1.4')),
471            # TODO: https://github.com/grpc/grpc-node/issues/235.
472            # ('v1.7.2', ReleaseInfo()),
473            ('v1.8.4', ReleaseInfo()),
474            ('v1.9.1', ReleaseInfo()),
475            ('v1.10.0', ReleaseInfo()),
476            ('v1.11.3', ReleaseInfo()),
477            ('v1.12.4', ReleaseInfo()),
478        ]),
479    'ruby':
480        OrderedDict([
481            ('v1.0.1',
482             ReleaseInfo(patch=[
483                 'tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile',
484                 'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh',
485             ],
486                         testcases_file='ruby__v1.0.1')),
487            ('v1.1.4', ReleaseInfo(testcases_file='ruby__v1.1.4')),
488            ('v1.2.5', ReleaseInfo(testcases_file='ruby__v1.1.4')),
489            ('v1.3.9', ReleaseInfo(testcases_file='ruby__v1.1.4')),
490            ('v1.4.2', ReleaseInfo(testcases_file='ruby__v1.1.4')),
491            ('v1.6.6', ReleaseInfo(testcases_file='ruby__v1.1.4')),
492            ('v1.7.2', ReleaseInfo(testcases_file='ruby__v1.1.4')),
493            ('v1.8.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
494            ('v1.9.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
495            ('v1.10.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
496            ('v1.11.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
497            ('v1.12.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
498            ('v1.13.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
499            ('v1.14.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
500            ('v1.15.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
501            ('v1.16.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
502            ('v1.17.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
503            ('v1.18.0',
504             ReleaseInfo(patch=[
505                 'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh',
506             ])),
507            ('v1.19.0', ReleaseInfo()),
508            ('v1.20.0', ReleaseInfo()),
509            ('v1.21.4', ReleaseInfo()),
510            ('v1.22.0', ReleaseInfo()),
511            ('v1.22.1', ReleaseInfo()),
512            ('v1.23.0', ReleaseInfo()),
513            ('v1.24.0', ReleaseInfo()),
514            ('v1.25.0', ReleaseInfo()),
515            # TODO: https://github.com/grpc/grpc/issues/18262.
516            # If you are not encountering the error in above issue
517            # go ahead and upload the docker image for new releases.
518            ('v1.26.0', ReleaseInfo()),
519            ('v1.27.3', ReleaseInfo()),
520            ('v1.30.0', ReleaseInfo()),
521            ('v1.31.1', ReleaseInfo()),
522            ('v1.32.0', ReleaseInfo()),
523            ('v1.33.2', ReleaseInfo()),
524            ('v1.34.0', ReleaseInfo()),
525            ('v1.35.0', ReleaseInfo()),
526            ('v1.36.3', ReleaseInfo()),
527            ('v1.37.0', ReleaseInfo()),
528            ('v1.38.0', ReleaseInfo()),
529            ('v1.39.0', ReleaseInfo()),
530            ('v1.41.1', ReleaseInfo()),
531            ('v1.42.0', ReleaseInfo()),
532            ('v1.43.0', ReleaseInfo()),
533            ('v1.44.0', ReleaseInfo()),
534            ('v1.46.2', ReleaseInfo()),
535            ('v1.47.1', ReleaseInfo()),
536            ('v1.48.3', ReleaseInfo()),
537            ('v1.49.1', ReleaseInfo()),
538            ('v1.52.0', ReleaseInfo()),
539            ('v1.53.0', ReleaseInfo()),
540            ('v1.54.0', ReleaseInfo()),
541            ('v1.55.0', ReleaseInfo()),
542        ]),
543    'php':
544        OrderedDict([
545            ('v1.0.1', ReleaseInfo(testcases_file='php__v1.0.1')),
546            ('v1.1.4', ReleaseInfo(testcases_file='php__v1.0.1')),
547            ('v1.2.5', ReleaseInfo(testcases_file='php__v1.0.1')),
548            ('v1.3.9', ReleaseInfo(testcases_file='php__v1.0.1')),
549            ('v1.4.2', ReleaseInfo(testcases_file='php__v1.0.1')),
550            ('v1.6.6', ReleaseInfo(testcases_file='php__v1.0.1')),
551            ('v1.7.2', ReleaseInfo(testcases_file='php__v1.0.1')),
552            ('v1.8.0', ReleaseInfo(testcases_file='php__v1.0.1')),
553            ('v1.9.1', ReleaseInfo(testcases_file='php__v1.0.1')),
554            ('v1.10.1', ReleaseInfo(testcases_file='php__v1.0.1')),
555            ('v1.11.1', ReleaseInfo(testcases_file='php__v1.0.1')),
556            ('v1.12.0', ReleaseInfo(testcases_file='php__v1.0.1')),
557            ('v1.13.0', ReleaseInfo(testcases_file='php__v1.0.1')),
558            ('v1.14.1', ReleaseInfo(testcases_file='php__v1.0.1')),
559            ('v1.15.0', ReleaseInfo(testcases_file='php__v1.0.1')),
560            ('v1.16.0', ReleaseInfo(testcases_file='php__v1.0.1')),
561            ('v1.17.1', ReleaseInfo(testcases_file='php__v1.0.1')),
562            ('v1.18.0', ReleaseInfo()),
563            # v1.19 and v1.20 were deliberately omitted here because of an issue.
564            # See https://github.com/grpc/grpc/issues/18264
565            ('v1.21.4', ReleaseInfo()),
566            ('v1.22.0', ReleaseInfo()),
567            ('v1.22.1', ReleaseInfo()),
568            ('v1.23.0', ReleaseInfo()),
569            ('v1.24.0', ReleaseInfo()),
570            ('v1.25.0', ReleaseInfo()),
571            ('v1.26.0', ReleaseInfo()),
572            ('v1.27.3', ReleaseInfo()),
573            ('v1.30.0', ReleaseInfo()),
574            ('v1.31.1', ReleaseInfo()),
575            ('v1.32.0', ReleaseInfo()),
576            ('v1.33.2', ReleaseInfo()),
577            ('v1.34.0', ReleaseInfo()),
578            ('v1.35.0', ReleaseInfo()),
579            ('v1.36.3', ReleaseInfo()),
580            ('v1.37.0', ReleaseInfo()),
581            ('v1.38.0', ReleaseInfo()),
582            ('v1.39.0', ReleaseInfo()),
583            ('v1.41.1', ReleaseInfo()),
584            ('v1.42.0', ReleaseInfo()),
585            ('v1.43.0', ReleaseInfo()),
586            ('v1.44.0', ReleaseInfo()),
587            ('v1.46.2', ReleaseInfo()),
588            ('v1.47.1', ReleaseInfo()),
589            ('v1.48.3', ReleaseInfo()),
590            ('v1.49.1', ReleaseInfo()),
591            ('v1.52.0', ReleaseInfo()),
592            ('v1.53.0', ReleaseInfo()),
593            ('v1.54.0', ReleaseInfo()),
594            ('v1.55.0', ReleaseInfo()),
595        ]),
596    'csharp':
597        OrderedDict([
598            ('v1.0.1',
599             ReleaseInfo(patch=[
600                 'tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile',
601                 'tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile',
602             ],
603                         testcases_file='csharp__v1.1.4')),
604            ('v1.1.4', ReleaseInfo(testcases_file='csharp__v1.1.4')),
605            ('v1.2.5', ReleaseInfo(testcases_file='csharp__v1.1.4')),
606            ('v1.3.9', ReleaseInfo(testcases_file='csharp__v1.3.9')),
607            ('v1.4.2', ReleaseInfo(testcases_file='csharp__v1.3.9')),
608            ('v1.6.6', ReleaseInfo(testcases_file='csharp__v1.3.9')),
609            ('v1.7.2', ReleaseInfo(testcases_file='csharp__v1.3.9')),
610            ('v1.8.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
611            ('v1.9.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
612            ('v1.10.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
613            ('v1.11.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
614            ('v1.12.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
615            ('v1.13.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
616            ('v1.14.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
617            ('v1.15.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
618            ('v1.16.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
619            ('v1.17.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
620            ('v1.18.0', ReleaseInfo(testcases_file='csharp__v1.18.0')),
621            ('v1.19.0', ReleaseInfo(testcases_file='csharp__v1.18.0')),
622            ('v1.20.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
623            ('v1.20.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
624            ('v1.21.4', ReleaseInfo(testcases_file='csharp__v1.20.0')),
625            ('v1.22.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
626            ('v1.22.1', ReleaseInfo(testcases_file='csharp__v1.20.0')),
627            ('v1.23.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
628            ('v1.24.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
629            ('v1.25.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
630            ('v1.26.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
631            ('v1.27.3', ReleaseInfo(testcases_file='csharp__v1.20.0')),
632            ('v1.30.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
633            ('v1.31.1', ReleaseInfo(testcases_file='csharp__v1.20.0')),
634            ('v1.32.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
635            ('v1.33.2', ReleaseInfo(testcases_file='csharp__v1.20.0')),
636            ('v1.34.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
637            ('v1.35.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
638            ('v1.36.3', ReleaseInfo(testcases_file='csharp__v1.20.0')),
639            ('v1.37.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
640            ('v1.38.1', ReleaseInfo(testcases_file='csharp__v1.20.0')),
641            ('v1.39.1', ReleaseInfo(testcases_file='csharp__v1.20.0')),
642            ('v1.41.1', ReleaseInfo(testcases_file='csharp__v1.20.0')),
643            ('v1.42.0', ReleaseInfo(testcases_file='csharp__v1.20.0')),
644            ('v1.43.0', ReleaseInfo()),
645            ('v1.44.0', ReleaseInfo()),
646            ('v1.46.2', ReleaseInfo()),
647        ]),
648}
649