Imported Upstream version 1.22.0
[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'],
58     'java': ['java'],
59     'python': ['python'],
60     'node': ['node'],
61     'ruby': ['ruby'],
62     'php': ['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()),
100         ('v1.21.4', ReleaseInfo()),
101     ]),
102     'go':
103     OrderedDict(
104         [
105             ('v1.0.5',
106              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
107             ('v1.2.1',
108              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
109             ('v1.3.0',
110              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
111             ('v1.4.2',
112              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
113             ('v1.5.2',
114              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
115             ('v1.6.0',
116              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
117             ('v1.7.4',
118              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
119             ('v1.8.2',
120              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
121             ('v1.9.2',
122              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
123             ('v1.10.1',
124              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
125             ('v1.11.3',
126              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
127             ('v1.12.2',
128              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
129             ('v1.13.0',
130              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
131             ('v1.14.0',
132              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
133             ('v1.15.0',
134              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
135             ('v1.16.0',
136              ReleaseInfo(runtimes=['go1.8'], testcases_file='go__v1.0.5')),
137             ('v1.17.0',
138              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
139             ('v1.18.0',
140              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
141             ('v1.19.0',
142              ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.0.5')),
143             ('v1.20.0', ReleaseInfo(runtimes=['go1.11'])),
144             ('v1.21.0', ReleaseInfo(runtimes=['go1.11'])),
145         ]),
146     'java':
147     OrderedDict([
148         ('v1.0.3',
149          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
150         ('v1.1.2',
151          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
152         ('v1.2.0',
153          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
154         ('v1.3.1',
155          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
156         ('v1.4.0',
157          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
158         ('v1.5.0',
159          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
160         ('v1.6.1',
161          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
162         ('v1.7.0',
163          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
164         ('v1.8.0',
165          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
166         ('v1.9.1',
167          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
168         ('v1.10.1',
169          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
170         ('v1.11.0',
171          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
172         ('v1.12.0',
173          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
174         ('v1.13.1',
175          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
176         ('v1.14.0',
177          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
178         ('v1.15.0',
179          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
180         ('v1.16.1',
181          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
182         ('v1.17.1',
183          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
184         ('v1.18.0',
185          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
186         ('v1.19.0',
187          ReleaseInfo(runtimes=['java_oracle8'], testcases_file='java__v1.0.3')),
188         ('v1.20.0', ReleaseInfo(runtimes=['java_oracle8'])),
189         ('v1.21.0', ReleaseInfo(runtimes=['java_oracle8'])),
190     ]),
191     'python':
192     OrderedDict([
193         ('v1.0.x', ReleaseInfo(testcases_file='python__v1.0.x')),
194         ('v1.1.4', ReleaseInfo(testcases_file='python__v1.0.x')),
195         ('v1.2.5', ReleaseInfo(testcases_file='python__v1.0.x')),
196         ('v1.3.9', ReleaseInfo(testcases_file='python__v1.0.x')),
197         ('v1.4.2', ReleaseInfo(testcases_file='python__v1.0.x')),
198         ('v1.6.6', ReleaseInfo(testcases_file='python__v1.0.x')),
199         ('v1.7.2', ReleaseInfo(testcases_file='python__v1.0.x')),
200         ('v1.8.1', ReleaseInfo(testcases_file='python__v1.0.x')),
201         ('v1.9.1', ReleaseInfo(testcases_file='python__v1.0.x')),
202         ('v1.10.1', ReleaseInfo(testcases_file='python__v1.0.x')),
203         ('v1.11.1', ReleaseInfo(testcases_file='python__v1.11.1')),
204         ('v1.12.0', ReleaseInfo(testcases_file='python__v1.11.1')),
205         ('v1.13.0', ReleaseInfo(testcases_file='python__v1.11.1')),
206         ('v1.14.1', ReleaseInfo(testcases_file='python__v1.11.1')),
207         ('v1.15.0', ReleaseInfo(testcases_file='python__v1.11.1')),
208         ('v1.16.0', ReleaseInfo(testcases_file='python__v1.11.1')),
209         ('v1.17.1', ReleaseInfo(testcases_file='python__v1.11.1')),
210         ('v1.18.0', ReleaseInfo()),
211         ('v1.19.0', ReleaseInfo()),
212         ('v1.20.0', ReleaseInfo()),
213         ('v1.21.4', ReleaseInfo()),
214     ]),
215     'node':
216     OrderedDict([
217         ('v1.0.1', ReleaseInfo(testcases_file='node__v1.0.1')),
218         ('v1.1.4', ReleaseInfo(testcases_file='node__v1.1.4')),
219         ('v1.2.5', ReleaseInfo(testcases_file='node__v1.1.4')),
220         ('v1.3.9', ReleaseInfo(testcases_file='node__v1.1.4')),
221         ('v1.4.2', ReleaseInfo(testcases_file='node__v1.1.4')),
222         ('v1.6.6', ReleaseInfo(testcases_file='node__v1.1.4')),
223         # TODO: https://github.com/grpc/grpc-node/issues/235.
224         # ('v1.7.2', ReleaseInfo()),
225         ('v1.8.4', ReleaseInfo()),
226         ('v1.9.1', ReleaseInfo()),
227         ('v1.10.0', ReleaseInfo()),
228         ('v1.11.3', ReleaseInfo()),
229         ('v1.12.4', ReleaseInfo()),
230     ]),
231     'ruby':
232     OrderedDict([
233         ('v1.0.1',
234          ReleaseInfo(
235              patch=[
236                  'tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile',
237                  'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh',
238              ],
239              testcases_file='ruby__v1.0.1')),
240         ('v1.1.4', ReleaseInfo(testcases_file='ruby__v1.1.4')),
241         ('v1.2.5', ReleaseInfo(testcases_file='ruby__v1.1.4')),
242         ('v1.3.9', ReleaseInfo(testcases_file='ruby__v1.1.4')),
243         ('v1.4.2', ReleaseInfo(testcases_file='ruby__v1.1.4')),
244         ('v1.6.6', ReleaseInfo(testcases_file='ruby__v1.1.4')),
245         ('v1.7.2', ReleaseInfo(testcases_file='ruby__v1.1.4')),
246         ('v1.8.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
247         ('v1.9.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
248         ('v1.10.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
249         ('v1.11.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
250         ('v1.12.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
251         ('v1.13.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
252         ('v1.14.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
253         ('v1.15.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
254         ('v1.16.0', ReleaseInfo(testcases_file='ruby__v1.1.4')),
255         ('v1.17.1', ReleaseInfo(testcases_file='ruby__v1.1.4')),
256         ('v1.18.0',
257          ReleaseInfo(patch=[
258              'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh',
259          ])),
260         ('v1.19.0', ReleaseInfo()),
261         ('v1.20.0', ReleaseInfo()),
262         ('v1.21.4', ReleaseInfo()),
263         # TODO: https://github.com/grpc/grpc/issues/18262.
264         # If you are not encountering the error in above issue
265         # go ahead and upload the docker image for new releases.
266     ]),
267     'php':
268     OrderedDict([
269         ('v1.0.1', ReleaseInfo(testcases_file='php__v1.0.1')),
270         ('v1.1.4', ReleaseInfo(testcases_file='php__v1.0.1')),
271         ('v1.2.5', ReleaseInfo(testcases_file='php__v1.0.1')),
272         ('v1.3.9', ReleaseInfo(testcases_file='php__v1.0.1')),
273         ('v1.4.2', ReleaseInfo(testcases_file='php__v1.0.1')),
274         ('v1.6.6', ReleaseInfo(testcases_file='php__v1.0.1')),
275         ('v1.7.2', ReleaseInfo(testcases_file='php__v1.0.1')),
276         ('v1.8.0', ReleaseInfo(testcases_file='php__v1.0.1')),
277         ('v1.9.1', ReleaseInfo(testcases_file='php__v1.0.1')),
278         ('v1.10.1', ReleaseInfo(testcases_file='php__v1.0.1')),
279         ('v1.11.1', ReleaseInfo(testcases_file='php__v1.0.1')),
280         ('v1.12.0', ReleaseInfo(testcases_file='php__v1.0.1')),
281         ('v1.13.0', ReleaseInfo(testcases_file='php__v1.0.1')),
282         ('v1.14.1', ReleaseInfo(testcases_file='php__v1.0.1')),
283         ('v1.15.0', ReleaseInfo(testcases_file='php__v1.0.1')),
284         ('v1.16.0', ReleaseInfo(testcases_file='php__v1.0.1')),
285         ('v1.17.1', ReleaseInfo(testcases_file='php__v1.0.1')),
286         ('v1.18.0', ReleaseInfo()),
287         ('v1.21.4', ReleaseInfo()),
288         # TODO:https://github.com/grpc/grpc/issues/18264
289         # Error in above issues needs to be resolved.
290     ]),
291     'csharp':
292     OrderedDict([
293         ('v1.0.1',
294          ReleaseInfo(
295              patch=[
296                  'tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile',
297                  'tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile',
298              ],
299              testcases_file='csharp__v1.1.4')),
300         ('v1.1.4', ReleaseInfo(testcases_file='csharp__v1.1.4')),
301         ('v1.2.5', ReleaseInfo(testcases_file='csharp__v1.1.4')),
302         ('v1.3.9', ReleaseInfo(testcases_file='csharp__v1.3.9')),
303         ('v1.4.2', ReleaseInfo(testcases_file='csharp__v1.3.9')),
304         ('v1.6.6', ReleaseInfo(testcases_file='csharp__v1.3.9')),
305         ('v1.7.2', ReleaseInfo(testcases_file='csharp__v1.3.9')),
306         ('v1.8.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
307         ('v1.9.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
308         ('v1.10.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
309         ('v1.11.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
310         ('v1.12.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
311         ('v1.13.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
312         ('v1.14.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
313         ('v1.15.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
314         ('v1.16.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
315         ('v1.17.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
316         ('v1.18.0', ReleaseInfo(testcases_file='csharp__v1.18.0')),
317         ('v1.19.0', ReleaseInfo(testcases_file='csharp__v1.18.0')),
318         ('v1.20.0', ReleaseInfo()),
319         ('v1.21.4', ReleaseInfo()),
320     ]),
321 }