234c71295b356e7d4336b345fe4c53f783692aea
[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.runtime_subset:
41         runtimes = list(release_info.runtime_subset)
42
43     # check that all selected runtimes are valid for given language
44     for runtime in runtimes:
45         assert runtime in LANG_RUNTIME_MATRIX[lang]
46     return runtimes
47
48
49 def should_build_docker_interop_image_from_release_tag(lang):
50     # All dockerfile definitions live in grpc/grpc repository.
51     # For language that have a separate repo, we need to use
52     # dockerfile definitions from head of grpc/grpc.
53     if lang in ['go', 'java', 'node']:
54         return False
55     return True
56
57
58 # Dictionary of runtimes per language
59 LANG_RUNTIME_MATRIX = {
60     'cxx': ['cxx'],  # This is actually debian8.
61     'go': ['go1.8', 'go1.11'],
62     'java': ['java_oracle8'],
63     'python': ['python'],
64     'node': ['node'],
65     'ruby': ['ruby'],
66     'php': ['php', 'php7'],
67     'csharp': ['csharp', 'csharpcoreclr'],
68 }
69
70
71 class ReleaseInfo:
72     """Info about a single release of a language"""
73
74     def __init__(self, patch=[], runtime_subset=[], testcases_file=None):
75         self.patch = patch
76         self.runtime_subset = runtime_subset
77         self.testcases_file = testcases_file
78
79
80 # Dictionary of known releases for given language.
81 LANG_RELEASE_MATRIX = {
82     'cxx':
83     OrderedDict([
84         ('v1.0.1', ReleaseInfo()),
85         ('v1.1.4', ReleaseInfo()),
86         ('v1.2.5', ReleaseInfo()),
87         ('v1.3.9', ReleaseInfo()),
88         ('v1.4.2', ReleaseInfo()),
89         ('v1.6.6', ReleaseInfo()),
90         ('v1.7.2', ReleaseInfo()),
91         ('v1.8.0', ReleaseInfo()),
92         ('v1.9.1', ReleaseInfo()),
93         ('v1.10.1', ReleaseInfo()),
94         ('v1.11.1', ReleaseInfo()),
95         ('v1.12.0', ReleaseInfo()),
96         ('v1.13.0', ReleaseInfo()),
97         ('v1.14.1', ReleaseInfo()),
98         ('v1.15.0', ReleaseInfo()),
99         ('v1.16.0', ReleaseInfo()),
100         ('v1.17.1', ReleaseInfo()),
101         ('v1.18.0', ReleaseInfo()),
102         ('v1.19.0', ReleaseInfo()),
103         ('v1.20.0', ReleaseInfo()),
104     ]),
105     'go':
106     OrderedDict([
107         ('v1.0.5', ReleaseInfo(runtime_subset=['go1.8'])),
108         ('v1.2.1', ReleaseInfo(runtime_subset=['go1.8'])),
109         ('v1.3.0', ReleaseInfo(runtime_subset=['go1.8'])),
110         ('v1.4.2', ReleaseInfo(runtime_subset=['go1.8'])),
111         ('v1.5.2', ReleaseInfo(runtime_subset=['go1.8'])),
112         ('v1.6.0', ReleaseInfo(runtime_subset=['go1.8'])),
113         ('v1.7.4', ReleaseInfo(runtime_subset=['go1.8'])),
114         ('v1.8.2', ReleaseInfo(runtime_subset=['go1.8'])),
115         ('v1.9.2', ReleaseInfo(runtime_subset=['go1.8'])),
116         ('v1.10.1', ReleaseInfo(runtime_subset=['go1.8'])),
117         ('v1.11.3', ReleaseInfo(runtime_subset=['go1.8'])),
118         ('v1.12.2', ReleaseInfo(runtime_subset=['go1.8'])),
119         ('v1.13.0', ReleaseInfo(runtime_subset=['go1.8'])),
120         ('v1.14.0', ReleaseInfo(runtime_subset=['go1.8'])),
121         ('v1.15.0', ReleaseInfo(runtime_subset=['go1.8'])),
122         ('v1.16.0', ReleaseInfo(runtime_subset=['go1.8'])),
123         ('v1.17.0', ReleaseInfo(runtime_subset=['go1.11'])),
124         ('v1.18.0', ReleaseInfo(runtime_subset=['go1.11'])),
125         ('v1.19.0', ReleaseInfo(runtime_subset=['go1.11'])),
126         ('v1.20.0', ReleaseInfo(runtime_subset=['go1.11'])),
127     ]),
128     'java':
129     OrderedDict([
130         ('v1.0.3', ReleaseInfo()),
131         ('v1.1.2', ReleaseInfo()),
132         ('v1.2.0', ReleaseInfo()),
133         ('v1.3.1', ReleaseInfo()),
134         ('v1.4.0', ReleaseInfo()),
135         ('v1.5.0', ReleaseInfo()),
136         ('v1.6.1', ReleaseInfo()),
137         ('v1.7.0', ReleaseInfo()),
138         ('v1.8.0', ReleaseInfo()),
139         ('v1.9.1', ReleaseInfo()),
140         ('v1.10.1', ReleaseInfo()),
141         ('v1.11.0', ReleaseInfo()),
142         ('v1.12.0', ReleaseInfo()),
143         ('v1.13.1', ReleaseInfo()),
144         ('v1.14.0', ReleaseInfo()),
145         ('v1.15.0', ReleaseInfo()),
146         ('v1.16.1', ReleaseInfo()),
147         ('v1.17.1', ReleaseInfo()),
148         ('v1.18.0', ReleaseInfo()),
149         ('v1.19.0', ReleaseInfo()),
150         ('v1.20.0', ReleaseInfo()),
151     ]),
152     'python':
153     OrderedDict([
154         ('v1.0.x', ReleaseInfo(testcases_file='python__v1.0.x')),
155         ('v1.1.4', ReleaseInfo(testcases_file='python__v1.0.x')),
156         ('v1.2.5', ReleaseInfo(testcases_file='python__v1.0.x')),
157         ('v1.3.9', ReleaseInfo(testcases_file='python__v1.0.x')),
158         ('v1.4.2', ReleaseInfo(testcases_file='python__v1.0.x')),
159         ('v1.6.6', ReleaseInfo(testcases_file='python__v1.0.x')),
160         ('v1.7.2', ReleaseInfo(testcases_file='python__v1.0.x')),
161         ('v1.8.1', ReleaseInfo(testcases_file='python__v1.0.x')),
162         ('v1.9.1', ReleaseInfo(testcases_file='python__v1.0.x')),
163         ('v1.10.1', ReleaseInfo(testcases_file='python__v1.0.x')),
164         ('v1.11.1', ReleaseInfo(testcases_file='python__v1.11.1')),
165         ('v1.12.0', ReleaseInfo(testcases_file='python__v1.11.1')),
166         ('v1.13.0', ReleaseInfo(testcases_file='python__v1.11.1')),
167         ('v1.14.1', ReleaseInfo(testcases_file='python__v1.11.1')),
168         ('v1.15.0', ReleaseInfo(testcases_file='python__v1.11.1')),
169         ('v1.16.0', ReleaseInfo(testcases_file='python__v1.11.1')),
170         ('v1.17.1', ReleaseInfo(testcases_file='python__v1.11.1')),
171         ('v1.18.0', ReleaseInfo()),
172         ('v1.19.0', ReleaseInfo()),
173         ('v1.20.0', ReleaseInfo()),
174     ]),
175     'node':
176     OrderedDict([
177         ('v1.0.1', ReleaseInfo(testcases_file='node__v1.0.1')),
178         ('v1.1.4', ReleaseInfo(testcases_file='node__v1.1.4')),
179         ('v1.2.5', ReleaseInfo(testcases_file='node__v1.1.4')),
180         ('v1.3.9', ReleaseInfo(testcases_file='node__v1.1.4')),
181         ('v1.4.2', ReleaseInfo(testcases_file='node__v1.1.4')),
182         ('v1.6.6', ReleaseInfo(testcases_file='node__v1.1.4')),
183         # TODO: https://github.com/grpc/grpc-node/issues/235.
184         # ('v1.7.2', ReleaseInfo()),
185         ('v1.8.4', ReleaseInfo()),
186         ('v1.9.1', ReleaseInfo()),
187         ('v1.10.0', ReleaseInfo()),
188         ('v1.11.3', ReleaseInfo()),
189         ('v1.12.4', ReleaseInfo()),
190     ]),
191     'ruby':
192     OrderedDict([
193         ('v1.0.1',
194          ReleaseInfo(
195              patch=[
196                  'tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile',
197                  'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh',
198              ],
199              testcases_file='ruby__v1.0.1')),
200         ('v1.1.4', ReleaseInfo()),
201         ('v1.2.5', ReleaseInfo()),
202         ('v1.3.9', ReleaseInfo()),
203         ('v1.4.2', ReleaseInfo()),
204         ('v1.6.6', ReleaseInfo()),
205         ('v1.7.2', ReleaseInfo()),
206         ('v1.8.0', ReleaseInfo()),
207         ('v1.9.1', ReleaseInfo()),
208         ('v1.10.1', ReleaseInfo()),
209         ('v1.11.1', ReleaseInfo()),
210         ('v1.12.0', ReleaseInfo()),
211         ('v1.13.0', ReleaseInfo()),
212         ('v1.14.1', ReleaseInfo()),
213         ('v1.15.0', ReleaseInfo()),
214         ('v1.16.0', ReleaseInfo()),
215         ('v1.17.1', ReleaseInfo()),
216         ('v1.18.0',
217          ReleaseInfo(patch=[
218              'tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh',
219          ])),
220         # TODO: https://github.com/grpc/grpc/issues/18262.
221         # If you are not encountering the error in above issue
222         # go ahead and upload the docker image for new releases.
223     ]),
224     'php':
225     OrderedDict([
226         ('v1.0.1', ReleaseInfo()),
227         ('v1.1.4', ReleaseInfo()),
228         ('v1.2.5', ReleaseInfo()),
229         ('v1.3.9', ReleaseInfo()),
230         ('v1.4.2', ReleaseInfo()),
231         ('v1.6.6', ReleaseInfo()),
232         ('v1.7.2', ReleaseInfo()),
233         ('v1.8.0', ReleaseInfo()),
234         ('v1.9.1', ReleaseInfo()),
235         ('v1.10.1', ReleaseInfo()),
236         ('v1.11.1', ReleaseInfo()),
237         ('v1.12.0', ReleaseInfo()),
238         ('v1.13.0', ReleaseInfo()),
239         ('v1.14.1', ReleaseInfo()),
240         ('v1.15.0', ReleaseInfo()),
241         ('v1.16.0', ReleaseInfo()),
242         ('v1.17.1', ReleaseInfo()),
243         ('v1.18.0', ReleaseInfo()),
244         # TODO:https://github.com/grpc/grpc/issues/18264
245         # Error in above issues needs to be resolved.
246     ]),
247     'csharp':
248     OrderedDict([
249         ('v1.0.1',
250          ReleaseInfo(
251              patch=[
252                  'tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile',
253                  'tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile',
254              ],
255              testcases_file='csharp__v1.1.4')),
256         ('v1.1.4', ReleaseInfo(testcases_file='csharp__v1.1.4')),
257         ('v1.2.5', ReleaseInfo(testcases_file='csharp__v1.1.4')),
258         ('v1.3.9', ReleaseInfo(testcases_file='csharp__v1.3.9')),
259         ('v1.4.2', ReleaseInfo(testcases_file='csharp__v1.3.9')),
260         ('v1.6.6', ReleaseInfo(testcases_file='csharp__v1.3.9')),
261         ('v1.7.2', ReleaseInfo(testcases_file='csharp__v1.3.9')),
262         ('v1.8.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
263         ('v1.9.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
264         ('v1.10.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
265         ('v1.11.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
266         ('v1.12.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
267         ('v1.13.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
268         ('v1.14.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
269         ('v1.15.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
270         ('v1.16.0', ReleaseInfo(testcases_file='csharp__v1.3.9')),
271         ('v1.17.1', ReleaseInfo(testcases_file='csharp__v1.3.9')),
272         ('v1.18.0', ReleaseInfo(testcases_file='csharp__v1.18.0')),
273         ('v1.19.0', ReleaseInfo(testcases_file='csharp__v1.18.0')),
274         ('v1.20.0', ReleaseInfo()),
275     ]),
276 }