6a8ed32a83aafa74c9cdf3b1e24f23084a219dcd
[platform/upstream/grpc.git] / tools / interop_matrix / client_matrix.py
1 #!/usr/bin/env python2.7
2 # Copyright 2017 gRPC authors.
3 #
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
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
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.
15
16 # Defines languages, runtimes and releases for backward compatibility testing
17
18 from collections import OrderedDict
19
20
21 def get_github_repo(lang):
22     return {
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')
29
30
31 def get_release_tags(lang):
32     """Returns list of known releases for given language."""
33     return list(LANG_RELEASE_MATRIX[lang].keys())
34
35
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)
42     return runtimes
43
44
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']:
50         return False
51     return True
52
53
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'],
58     'java': ['java'],
59     'python': ['python', 'pythonasyncio'],
60     'node': ['node'],
61     'ruby': ['ruby'],
62     'php': ['php7'],
63     'csharp': ['csharp', 'csharpcoreclr'],
64 }
65
66
67 class ReleaseInfo:
68     """Info about a single release of a language"""
69
70     def __init__(self, patch=[], runtimes=[], testcases_file=None):
71         self.patch = patch
72         self.runtimes = runtimes
73         self.testcases_file = testcases_file
74
75
76 # Dictionary of known releases for given language.
77 LANG_RELEASE_MATRIX = {
78     'cxx':
79         OrderedDict([
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()),
117         ]),
118     'go':
119         OrderedDict([
120             ('v1.0.5',
121              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
122             ('v1.2.1',
123              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
124             ('v1.3.0',
125              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
126             ('v1.4.2',
127              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
128             ('v1.5.2',
129              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
130             ('v1.6.0',
131              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
132             ('v1.7.4',
133              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
134             ('v1.8.2',
135              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
136             ('v1.9.2',
137              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
138             ('v1.10.1',
139              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
140             ('v1.11.3',
141              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
142             ('v1.12.2',
143              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
144             ('v1.13.0',
145              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
146             ('v1.14.0',
147              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
148             ('v1.15.0',
149              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
150             ('v1.16.0',
151              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
152             ('v1.17.0',
153              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
154             ('v1.18.0',
155              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
156             ('v1.19.0',
157              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
158             ('v1.20.0',
159              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
160             ('v1.21.3',
161              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
162             ('v1.22.3',
163              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
164             ('v1.23.1',
165              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
166             ('v1.24.0',
167              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
168             ('v1.25.0',
169              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
170             ('v1.26.0',
171              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
172             ('v1.27.1',
173              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
174             ('v1.28.0',
175              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
176             ('v1.29.0',
177              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
178             ('v1.30.0',
179              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
180             ('v1.31.1',
181              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
182             ('v1.32.0',
183              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
184             ('v1.33.1',
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'])),
193         ]),
194     'java':
195         OrderedDict([
196             ('v1.0.3',
197              ReleaseInfo(runtimes=['java_oracle8'],
198                          testcases_file='java__v1.0.3')),
199             ('v1.1.2',
200              ReleaseInfo(runtimes=['java_oracle8'],
201                          testcases_file='java__v1.0.3')),
202             ('v1.2.0',
203              ReleaseInfo(runtimes=['java_oracle8'],
204                          testcases_file='java__v1.0.3')),
205             ('v1.3.1',
206              ReleaseInfo(runtimes=['java_oracle8'],
207                          testcases_file='java__v1.0.3')),
208             ('v1.4.0',
209              ReleaseInfo(runtimes=['java_oracle8'],
210                          testcases_file='java__v1.0.3')),
211             ('v1.5.0',
212              ReleaseInfo(runtimes=['java_oracle8'],
213                          testcases_file='java__v1.0.3')),
214             ('v1.6.1',
215              ReleaseInfo(runtimes=['java_oracle8'],
216                          testcases_file='java__v1.0.3')),
217             ('v1.7.1', ReleaseInfo(testcases_file='java__v1.0.3')),
218             ('v1.8.0',
219              ReleaseInfo(runtimes=['java_oracle8'],
220                          testcases_file='java__v1.0.3')),
221             ('v1.9.1',
222              ReleaseInfo(runtimes=['java_oracle8'],
223                          testcases_file='java__v1.0.3')),
224             ('v1.10.1',
225              ReleaseInfo(runtimes=['java_oracle8'],
226                          testcases_file='java__v1.0.3')),
227             ('v1.11.0',
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')),
232             ('v1.14.0',
233              ReleaseInfo(runtimes=['java_oracle8'],
234                          testcases_file='java__v1.0.3')),
235             ('v1.15.1', ReleaseInfo(testcases_file='java__v1.0.3')),
236             ('v1.16.1',
237              ReleaseInfo(runtimes=['java_oracle8'],
238                          testcases_file='java__v1.0.3')),
239             ('v1.17.2', ReleaseInfo(testcases_file='java__v1.0.3')),
240             ('v1.18.0',
241              ReleaseInfo(runtimes=['java_oracle8'],
242                          testcases_file='java__v1.0.3')),
243             ('v1.19.0',
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()),
266         ]),
267     'python':
268         OrderedDict([
269             ('v1.0.x',
270              ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
271             ('v1.1.4',
272              ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
273             ('v1.2.5',
274              ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
275             ('v1.3.9',
276              ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
277             ('v1.4.2',
278              ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
279             ('v1.6.6',
280              ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
281             ('v1.7.2',
282              ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
283             ('v1.8.1',
284              ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
285             ('v1.9.1',
286              ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
287             ('v1.10.1',
288              ReleaseInfo(runtimes=['python'], testcases_file='python__v1.0.x')),
289             ('v1.11.1',
290              ReleaseInfo(runtimes=['python'],
291                          testcases_file='python__v1.11.1')),
292             ('v1.12.0',
293              ReleaseInfo(runtimes=['python'],
294                          testcases_file='python__v1.11.1')),
295             ('v1.13.0',
296              ReleaseInfo(runtimes=['python'],
297                          testcases_file='python__v1.11.1')),
298             ('v1.14.1',
299              ReleaseInfo(runtimes=['python'],
300                          testcases_file='python__v1.11.1')),
301             ('v1.15.0',
302              ReleaseInfo(runtimes=['python'],
303                          testcases_file='python__v1.11.1')),
304             ('v1.16.0',
305              ReleaseInfo(runtimes=['python'],
306                          testcases_file='python__v1.11.1')),
307             ('v1.17.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'])),
330         ]),
331     'node':
332         OrderedDict([
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()),
346         ]),
347     'ruby':
348         OrderedDict([
349             ('v1.0.1',
350              ReleaseInfo(patch=[
351                  'tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile',
352                  'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh',
353              ],
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')),
371             ('v1.18.0',
372              ReleaseInfo(patch=[
373                  'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh',
374              ])),
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()),
397         ]),
398     'php':
399         OrderedDict([
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()),
437         ]),
438     'csharp':
439         OrderedDict([
440             ('v1.0.1',
441              ReleaseInfo(patch=[
442                  'tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile',
443                  'tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile',
444              ],
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()),
481         ]),
482 }