blob: 0ca20478a7801ddb70e214acb594684541a5b6c5 [file] [log] [blame]
Ray Milkey3275ae82018-05-29 15:35:36 -07001"""
2 Copyright 2018-present Open Networking Foundation
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
Ray Milkey7dac7da2017-08-01 16:56:05 -070017load("//tools/build/bazel:generate_workspace.bzl", "COMPILE", "TEST")
18load("//tools/build/bazel:variables.bzl", "ONOS_VERSION")
19load("//tools/build/bazel:generate_test_rules.bzl", "generate_test_rules")
Ray Milkeyb7949e72018-06-19 18:31:02 -070020load("//tools/build/bazel:checkstyle.bzl", "checkstyle_test")
Thomas Vachuskaac9e5242018-07-19 16:15:39 -070021load("//tools/build/bazel:pom_file.bzl", "pom_file")
Thomas Vachuska50ac0982018-07-19 10:17:37 -070022load("//tools/build/bazel:java_sources.bzl", "java_sources")
Carmelo Cascone6a1ae712018-08-10 12:19:47 -070023load("//tools/build/bazel:java_sources.bzl", "java_sources_alt")
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -070024load("//tools/build/bazel:javadoc.bzl", "javadoc")
Ray Milkey24ba24a2019-04-26 11:53:02 -070025load("//tools/build/bazel:minimal_jar.bzl", "minimal_jar")
Carmelo Cascone6a1ae712018-08-10 12:19:47 -070026load("@io_grpc_grpc_java//:java_grpc_library.bzl", "java_grpc_library")
27
28def _auto_name():
29 return "onos-" + native.package_name().replace("/", "-")
Ray Milkey7dac7da2017-08-01 16:56:05 -070030
Ray Milkey32ea35c2018-06-06 15:28:07 -070031def _all_java_sources():
Ray Milkey0bcdfd12018-05-23 14:07:19 -070032 return native.glob(["src/main/java/**/*.java"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070033
Ray Milkey32ea35c2018-06-06 15:28:07 -070034def _all_java_test_sources():
Ray Milkey0bcdfd12018-05-23 14:07:19 -070035 return native.glob(["src/test/java/**/*.java"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070036
Ray Milkey32ea35c2018-06-06 15:28:07 -070037def _all_test_resources():
Ray Milkey0bcdfd12018-05-23 14:07:19 -070038 return native.glob(["src/test/resources/**"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070039
Ray Milkey32ea35c2018-06-06 15:28:07 -070040def _all_resources(resources_root):
Ray Milkey0bcdfd12018-05-23 14:07:19 -070041 if resources_root == None:
42 return native.glob(["src/main/resources/**"])
43 else:
44 return native.glob([resources_root + "**"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070045
Ray Milkey25747d82018-06-13 14:12:51 -070046def _webapp():
Ray Milkey6b3775a2018-06-28 11:18:44 -070047 return native.glob(["src/main/webapp/WEB-INF/web.xml"])
48
49def _include_resources_to_string(include_resources):
50 result = ""
51 for (path, filename) in include_resources.items():
52 result += (path + "=" + filename)
53 return result
Ray Milkey25747d82018-06-13 14:12:51 -070054
Ray Milkey275af2c2018-06-15 13:05:08 -070055"""
56 Implementation of the rule to call bnd to make an OSGI jar file
57"""
Ray Milkey6b3775a2018-06-28 11:18:44 -070058
Ray Milkey7dac7da2017-08-01 16:56:05 -070059def _bnd_impl(ctx):
Ray Milkey3275ae82018-05-29 15:35:36 -070060 if (len(ctx.files.source) == 1):
61 input_file = ctx.files.source[0]
62 else:
63 # this is a list of inputs. The one we want is the last one
64 # in the list that isn't a source jar
65 for file in reversed(ctx.files.source):
66 if ("-src" in file.path):
67 continue
68 else:
69 input_file = file
70 break
71
72 jar = input_file.path
Ray Milkey0bcdfd12018-05-23 14:07:19 -070073 output = ctx.outputs.osgi_jar.path
Thomas Vachuska8e022a92018-07-10 14:47:38 -070074 name = ctx.attr.name
Ray Milkey275af2c2018-06-15 13:05:08 -070075 group = ctx.attr.group
Ray Milkey0bcdfd12018-05-23 14:07:19 -070076 version = ctx.attr.version
77 license = ""
Ray Milkey12ae6ca2018-06-11 15:34:30 -070078 import_packages = ctx.attr.import_packages
Jian Li4ad86872018-08-05 03:34:35 +090079 bundle_classpath = ctx.attr.bundle_classpath
Ray Milkey0bcdfd12018-05-23 14:07:19 -070080 exportPackages = "*"
Ray Milkey6b3775a2018-06-28 11:18:44 -070081 include_resources = ctx.attr.include_resources
Ray Milkey25747d82018-06-13 14:12:51 -070082 web_context = ctx.attr.web_context
83 if web_context == None or web_context == "":
84 web_context = "NONE"
85 web_xml = ctx.attr.web_xml
Ray Milkey0bcdfd12018-05-23 14:07:19 -070086 dynamicimportPackages = ""
Ray Milkeyd84f89b2018-08-17 14:54:17 -070087 karaf_commands = ctx.attr.karaf_commands
Ray Milkey3275ae82018-05-29 15:35:36 -070088 cp = ""
Ray Milkey7dac7da2017-08-01 16:56:05 -070089
Ray Milkey3275ae82018-05-29 15:35:36 -070090 inputDependencies = [input_file]
Ray Milkey7dac7da2017-08-01 16:56:05 -070091
Ray Milkey0bcdfd12018-05-23 14:07:19 -070092 # determine the dependencies and build the class path
93 for dep in ctx.attr.deps:
Ray Milkey25b785a2018-06-12 09:59:14 -070094 if java_common.provider in dep:
95 file = dep.files.to_list()[0]
Ray Milkey25b785a2018-06-12 09:59:14 -070096 if cp:
97 cp += ":"
98 cp += file.path
99 inputDependencies = inputDependencies + [file]
Ray Milkey7dac7da2017-08-01 16:56:05 -0700100
Ray Milkey25747d82018-06-13 14:12:51 -0700101 web_xml_root_path = ""
102 if len(web_xml) != 0:
103 web_xml_root = web_xml[0].files.to_list()[0]
104 inputDependencies += [web_xml_root]
105 web_xml_root_path = web_xml_root.path.replace("WEB-INF/web.xml", "")
Ray Milkey7dac7da2017-08-01 16:56:05 -0700106
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700107 # call bnd to make the OSGI jar file
108 arguments = [
109 jar,
110 output,
111 cp,
112 name,
113 group,
114 version,
115 license,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700116 import_packages,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700117 exportPackages,
Ray Milkey6b3775a2018-06-28 11:18:44 -0700118 include_resources,
Ray Milkey25747d82018-06-13 14:12:51 -0700119 web_context,
120 web_xml_root_path,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700121 dynamicimportPackages,
Thomas Vachuskae4436942018-08-07 19:27:10 -0700122 "classes",
Jian Li4ad86872018-08-05 03:34:35 +0900123 bundle_classpath,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700124 karaf_commands,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700125 ]
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700126
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700127 ctx.actions.run(
128 inputs = inputDependencies,
129 outputs = [ctx.outputs.osgi_jar],
130 arguments = arguments,
131 progress_message = "Running bnd wrapper on: %s" % ctx.attr.name,
132 executable = ctx.executable._bnd_exe,
133 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700134
Ray Milkey25b785a2018-06-12 09:59:14 -0700135 deps = []
136 if java_common.provider in ctx.attr.source:
137 deps.append(ctx.attr.source[java_common.provider])
138 deps_provider = java_common.merge(deps)
139 return struct(
Ray Milkey15053f02018-06-13 10:00:45 -0700140 providers = [deps_provider],
Ray Milkey25b785a2018-06-12 09:59:14 -0700141 )
142
Ray Milkey275af2c2018-06-15 13:05:08 -0700143"""
144 Rule definition for calling bnd to make an OSGi jar file.
145"""
Ray Milkey32ea35c2018-06-06 15:28:07 -0700146_bnd = rule(
Ray Milkey7dac7da2017-08-01 16:56:05 -0700147 attrs = {
148 "deps": attr.label_list(),
149 "version": attr.string(),
Ray Milkey275af2c2018-06-15 13:05:08 -0700150 "group": attr.string(),
Ray Milkey3275ae82018-05-29 15:35:36 -0700151 "source": attr.label(),
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700152 "import_packages": attr.string(),
Jian Li4ad86872018-08-05 03:34:35 +0900153 "bundle_classpath": attr.string(),
Ray Milkey25747d82018-06-13 14:12:51 -0700154 "web_context": attr.string(),
155 "web_xml": attr.label_list(allow_files = True),
Ray Milkey6b3775a2018-06-28 11:18:44 -0700156 "include_resources": attr.string(),
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700157 "karaf_commands": attr.string(),
Ray Milkey7dac7da2017-08-01 16:56:05 -0700158 "_bnd_exe": attr.label(
159 executable = True,
160 cfg = "host",
161 allow_files = True,
162 default = Label("//utils/osgiwrap:osgi-jar"),
163 ),
164 },
165 fragments = ["java"],
166 outputs = {
167 "osgi_jar": "lib%{name}.jar",
168 },
169 implementation = _bnd_impl,
170)
171
Ray Milkey275af2c2018-06-15 13:05:08 -0700172"""
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700173 Implementation of the rule to generate cfgdef files from java class source
174"""
175
176def _cfgdef_impl(ctx):
177 output_jar = ctx.outputs.cfgdef_jar.path
178
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700179 arguments = [
180 output_jar,
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700181 ]
182
Thomas Vachuskabef430b2018-10-22 10:55:47 -0700183 for src in ctx.files.srcs:
184 arguments.append(src.path)
185
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700186 ctx.actions.run(
187 inputs = ctx.files.srcs,
188 outputs = [ctx.outputs.cfgdef_jar],
189 arguments = arguments,
190 progress_message = "Running cfgdef generator on: %s" % ctx.attr.name,
191 executable = ctx.executable._cfgdef_generator_exe,
192 )
193
194"""
195 Rule definition to call cfgdef generator to create the *.cfgdef files from java sources
196"""
197_cfgdef = rule(
198 attrs = {
199 "srcs": attr.label_list(allow_files = True),
200 "_cfgdef_generator_exe": attr.label(
201 executable = True,
202 cfg = "host",
203 allow_files = True,
204 default = Label("//tools/build/cfgdef:cfgdef_generator"),
205 ),
206 "cfgdef_jar": attr.output(),
207 },
208 fragments = ["java"],
209 implementation = _cfgdef_impl,
210)
211
212"""
Ray Milkey275af2c2018-06-15 13:05:08 -0700213 Implementation of the rule to call swagger generator to create the registrator java class source
214"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700215
Ray Milkey275af2c2018-06-15 13:05:08 -0700216def _swagger_java_impl(ctx):
217 api_title = ctx.attr.api_title
218 api_version = ctx.attr.api_version
219 api_description = ctx.attr.api_description
220 api_package = ctx.attr.api_package
221 web_context = ctx.attr.web_context
222
223 output_java = ctx.outputs.swagger_java.path
Ray Milkey6b3775a2018-06-28 11:18:44 -0700224 output_dir = output_java[:output_java.find("generated-sources")]
Ray Milkey275af2c2018-06-15 13:05:08 -0700225
226 package_name = ctx.attr.package_name
227
228 srcs_arg = ""
Ray Milkey275af2c2018-06-15 13:05:08 -0700229
230 for file in ctx.files.srcs:
231 srcs_arg += file.path + ","
Ray Milkey275af2c2018-06-15 13:05:08 -0700232
Ray Milkey275af2c2018-06-15 13:05:08 -0700233 # call swagger generator to make the swagger JSON and java files
234 arguments = [
235 srcs_arg,
Ray Milkey8c6fe172019-01-29 17:34:04 -0800236 "",
Ray Milkey275af2c2018-06-15 13:05:08 -0700237 "",
238 package_name + "/src/main/resources",
239 output_dir,
240 output_dir,
241 web_context,
242 api_title,
243 api_version,
244 api_package,
245 api_description,
246 ]
247
248 ctx.actions.run(
249 inputs = ctx.files.srcs,
250 outputs = [ctx.outputs.swagger_java],
251 arguments = arguments,
252 progress_message = "Running swagger generator on: %s" % ctx.attr.name,
253 executable = ctx.executable._swagger_generator_exe,
254 )
255
256"""
257Implementation of the rule to call swagger generator for swagger.json file
258"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700259
Ray Milkey275af2c2018-06-15 13:05:08 -0700260def _swagger_json_impl(ctx):
261 api_title = ctx.attr.api_title
262 api_version = ctx.attr.api_version
263 api_description = ctx.attr.api_description
264 api_package = ctx.attr.api_package
265 web_context = ctx.attr.web_context
266
267 output_json = ctx.outputs.swagger_json.path
268 output_dir = output_json[:output_json.find("swagger.json")]
269
270 package_name = ctx.attr.package_name
271
272 srcs_arg = ""
Ray Milkey275af2c2018-06-15 13:05:08 -0700273
274 for file in ctx.files.srcs:
275 srcs_arg += file.path + ","
Ray Milkey275af2c2018-06-15 13:05:08 -0700276
Ray Milkey275af2c2018-06-15 13:05:08 -0700277 # call swagger generator to make the swagger JSON and java files
278 arguments = [
279 srcs_arg,
Ray Milkey8c6fe172019-01-29 17:34:04 -0800280 "",
Ray Milkey275af2c2018-06-15 13:05:08 -0700281 "",
282 package_name + "/src/main/resources",
283 output_dir,
284 output_dir,
285 web_context,
286 api_title,
287 api_version,
288 api_package,
289 api_description,
290 ]
291
292 ctx.actions.run(
293 inputs = ctx.files.srcs,
294 outputs = [ctx.outputs.swagger_json],
295 arguments = arguments,
296 progress_message = "Running swagger generator on: %s" % ctx.attr.name,
297 executable = ctx.executable._swagger_generator_exe,
298 )
299
300"""
301 Rule definition to call swagger generator to create the registrator java class source
302"""
303_swagger_java = rule(
304 attrs = {
305 "srcs": attr.label_list(allow_files = True),
306 "package_name": attr.string(),
307 "api_title": attr.string(),
308 "api_version": attr.string(),
309 "api_description": attr.string(),
310 "api_package": attr.string(),
311 "web_context": attr.string(),
312 "_swagger_generator_exe": attr.label(
313 executable = True,
314 cfg = "host",
315 allow_files = True,
Thomas Vachuska22ea6122018-10-24 12:28:59 -0700316 default = Label("//tools/build/swagger:swagger_generator"),
Ray Milkey275af2c2018-06-15 13:05:08 -0700317 ),
318 "swagger_java": attr.output(),
319 },
320 fragments = ["java"],
321 implementation = _swagger_java_impl,
322)
323
324"""
325 Rule definition to call swagger generator to create the swagger JSON
326"""
327_swagger_json = rule(
328 attrs = {
329 "srcs": attr.label_list(allow_files = True),
330 "package_name": attr.string(),
331 "api_title": attr.string(),
332 "api_version": attr.string(),
333 "api_description": attr.string(),
334 "api_package": attr.string(),
335 "web_context": attr.string(),
336 "_swagger_generator_exe": attr.label(
337 executable = True,
338 cfg = "host",
339 allow_files = True,
Thomas Vachuska22ea6122018-10-24 12:28:59 -0700340 default = Label("//tools/build/swagger:swagger_generator"),
Ray Milkey275af2c2018-06-15 13:05:08 -0700341 ),
342 "swagger_json": attr.output(),
343 },
344 fragments = ["java"],
345 implementation = _swagger_json_impl,
346)
347
348"""
349 Converts a jar file to an OSGI compatible jar file.
350
351 Args:
352 name: name of the rule to create the OSGI jar file - required
353 jar: jar file to convert - required target
354 deps: dependencies needed by the jar file - required list of targets
355 version: Version of the generated jar file. Optional, defaults to the current ONOS version
356 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
357 import_packages: OSGI import list. Optional, comma separated list, defaults to "*"
358 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to private
359"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700360
Ray Milkey25747d82018-06-13 14:12:51 -0700361def wrapped_osgi_jar(
362 name,
363 jar,
364 deps,
365 version = ONOS_VERSION,
Ray Milkey275af2c2018-06-15 13:05:08 -0700366 group = "org.onosproject",
Ray Milkey25747d82018-06-13 14:12:51 -0700367 import_packages = "*",
Carmelo Casconec0b23a42019-04-25 13:50:54 -0700368 visibility = ["//visibility:private"],
369 generate_pom = False):
Ray Milkey25747d82018-06-13 14:12:51 -0700370 _bnd(
371 name = name,
372 source = jar,
373 deps = deps,
374 version = version,
Ray Milkey275af2c2018-06-15 13:05:08 -0700375 group = group,
Ray Milkey25747d82018-06-13 14:12:51 -0700376 visibility = visibility,
377 import_packages = import_packages,
Ray Milkey275af2c2018-06-15 13:05:08 -0700378 web_xml = None,
Ray Milkey25747d82018-06-13 14:12:51 -0700379 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700380
Carmelo Casconec0b23a42019-04-25 13:50:54 -0700381 if generate_pom:
382 pom_file(
383 name = name + "-pom",
384 artifact = name,
385 deps = deps,
386 visibility = visibility,
387 )
Ray Milkey24ba24a2019-04-26 11:53:02 -0700388 minimal_jar(name = name + "-sources", visibility = visibility)
389 minimal_jar(name = name + "-javadoc", visibility = visibility)
Carmelo Casconec0b23a42019-04-25 13:50:54 -0700390
Ray Milkey275af2c2018-06-15 13:05:08 -0700391"""
392 Creates an OSGI jar and test jar file from a set of source and test files.
393 See osgi_jar() for a description of shared parameters.
394 Args:
395 test_srcs: Test source file(s) to compile. Optional list of targets, defaults to src/test/java/**/*.java
396 test_deps: Dependencies for the test jar. Optional list of targets, defaults to a common set of dependencies
397 test_resources: Resources to include in the test jar. Optional list of targets, defaults to src/test/resources/**
398 exclude_tests: Tests that should not be run. Useful for excluding things like test files without any @Test methods.
399 Optional ist of targets, defaults to []
400"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700401
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700402def osgi_jar_with_tests(
403 name = None,
404 deps = None,
405 test_deps = None,
Ray Milkey275af2c2018-06-15 13:05:08 -0700406 group = "org.onosproject",
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700407 srcs = None,
408 resources_root = None,
409 resources = None,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700410 resource_jars = [],
Ray Milkey6b3775a2018-06-28 11:18:44 -0700411 include_resources = {},
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700412 test_srcs = None,
413 exclude_tests = None,
Thomas Vachuskaa79bf6e2018-08-07 11:24:40 -0700414 medium_tests = [],
415 large_tests = [],
416 enormous_tests = [],
417 flaky_tests = [],
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700418 test_resources = None,
419 visibility = ["//visibility:public"],
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700420 version = ONOS_VERSION,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700421 suppress_errorprone = False,
Ray Milkey134d2922018-07-15 15:24:01 -0700422 suppress_checkstyle = False,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700423 suppress_javadocs = False,
Ray Milkey25747d82018-06-13 14:12:51 -0700424 web_context = None,
425 api_title = "",
426 api_version = "",
427 api_description = "",
428 api_package = "",
Jian Li4ad86872018-08-05 03:34:35 +0900429 import_packages = None,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700430 bundle_classpath = "",
431 karaf_command_packages = []):
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700432 if name == None:
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700433 name = _auto_name()
Ray Milkey7dac7da2017-08-01 16:56:05 -0700434 if srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700435 srcs = _all_java_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700436 if resources == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700437 resources = _all_resources(resources_root)
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700438 if test_srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700439 test_srcs = _all_java_test_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700440 if test_resources == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700441 test_resources = _all_test_resources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700442 if exclude_tests == None:
443 exclude_tests = []
Ray Milkey7dac7da2017-08-01 16:56:05 -0700444 if deps == None:
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700445 deps = COMPILE
446 if test_deps == None:
447 test_deps = TEST
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700448 if import_packages == None:
449 import_packages = "*"
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700450 tests_name = name + "-tests"
Carmelo Cascone21eb0422019-06-17 12:00:33 -0700451 tests_jar_deps = depset(deps + test_deps).to_list() + [name]
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700452 all_test_deps = tests_jar_deps + [tests_name]
Ray Milkey25747d82018-06-13 14:12:51 -0700453 web_xml = _webapp()
Ray Milkey7dac7da2017-08-01 16:56:05 -0700454
Ray Milkey275af2c2018-06-15 13:05:08 -0700455 native_srcs = srcs
456 native_resources = resources
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700457
Andrea Campanella4005c062019-01-17 16:05:03 +0100458 if web_context != None and api_title != "":
Ray Milkey275af2c2018-06-15 13:05:08 -0700459 # generate Swagger files if needed
460 _swagger_java(
461 name = name + "_swagger_java",
462 srcs = srcs + resources,
463 package_name = native.package_name(),
464 api_title = api_title,
465 api_version = api_version,
466 api_description = api_description,
467 web_context = web_context,
468 api_package = api_package,
469 swagger_java = ("src/main/resources/apidoc/generated-sources/" +
Ray Milkey6b3775a2018-06-28 11:18:44 -0700470 api_package.replace(".", "/") +
471 "/ApiDocRegistrator.java").replace("//", "/"),
Ray Milkey275af2c2018-06-15 13:05:08 -0700472 )
473 _swagger_json(
474 name = name + "_swagger_json",
475 srcs = srcs + resources,
476 package_name = native.package_name(),
477 api_title = api_title,
478 api_version = api_version,
479 api_description = api_description,
480 web_context = web_context,
481 api_package = api_package,
482 swagger_json = "src/main/resources/apidoc/swagger.json",
483 )
484 native_resources = []
485 for r in resources:
Ray Milkey6b3775a2018-06-28 11:18:44 -0700486 if not "definitions" in r:
Ray Milkey275af2c2018-06-15 13:05:08 -0700487 native_resources.append(r)
Ray Milkey6b3775a2018-06-28 11:18:44 -0700488 native_srcs = srcs + [name + "_swagger_java"]
489 native_resources.append(name + "_swagger_json")
Ray Milkey275af2c2018-06-15 13:05:08 -0700490
Ray Milkey5063f5b2018-08-15 16:22:30 -0700491 javacopts = ["-XepDisableAllChecks"] if suppress_errorprone else []
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700492
Thomas Vachuskabef430b2018-10-22 10:55:47 -0700493 _cfgdef(
494 name = name + "_cfgdef_jar",
495 srcs = native_srcs,
496 visibility = visibility,
497 cfgdef_jar = name + "_cfgdef.jar",
498 )
499
Ray Milkey25747d82018-06-13 14:12:51 -0700500 # compile the Java code
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700501 if len(resource_jars) > 0:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700502 native.java_library(
503 name = name + "-native",
504 srcs = native_srcs,
Thomas Vachuskabef430b2018-10-22 10:55:47 -0700505 resource_jars = resource_jars + [name + "_cfgdef_jar"],
Ray Milkey5063f5b2018-08-15 16:22:30 -0700506 deps = deps,
507 visibility = visibility,
508 javacopts = javacopts,
509 )
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700510 else:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700511 native.java_library(
512 name = name + "-native",
513 srcs = native_srcs,
Thomas Vachuskabef430b2018-10-22 10:55:47 -0700514 resource_jars = [name + "_cfgdef_jar"],
Ray Milkey5063f5b2018-08-15 16:22:30 -0700515 resources = native_resources,
516 deps = deps,
517 visibility = visibility,
518 javacopts = javacopts,
519 )
Ray Milkey25747d82018-06-13 14:12:51 -0700520
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700521 karaf_command_packages_string = ",".join(karaf_command_packages)
Ray Milkey32ea35c2018-06-06 15:28:07 -0700522 _bnd(
Ray Milkey25b785a2018-06-12 09:59:14 -0700523 name = name,
524 source = name + "-native",
Ray Milkey32ea35c2018-06-06 15:28:07 -0700525 deps = deps,
526 version = version,
Ray Milkey275af2c2018-06-15 13:05:08 -0700527 group = group,
Ray Milkey32ea35c2018-06-06 15:28:07 -0700528 visibility = visibility,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700529 import_packages = import_packages,
Jian Li4ad86872018-08-05 03:34:35 +0900530 bundle_classpath = bundle_classpath,
Ray Milkey25747d82018-06-13 14:12:51 -0700531 web_context = web_context,
532 web_xml = web_xml,
Ray Milkey6b3775a2018-06-28 11:18:44 -0700533 include_resources = _include_resources_to_string(include_resources),
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700534 karaf_commands = karaf_command_packages_string,
Ray Milkey32ea35c2018-06-06 15:28:07 -0700535 )
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700536
Thomas Vachuskaac9e5242018-07-19 16:15:39 -0700537 # rule for generating pom file for publishing
538 pom_file(name = name + "-pom", artifact = name, deps = deps, visibility = visibility)
539
540 # rule for building source jar
Thomas Vachuska50ac0982018-07-19 10:17:37 -0700541 if not suppress_javadocs:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700542 java_sources(name = name + "-sources", srcs = srcs, visibility = visibility)
Thomas Vachuska50ac0982018-07-19 10:17:37 -0700543
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700544 # rule for building javadocs
545 if not suppress_javadocs:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700546 javadoc(name = name + "-javadoc", deps = deps, srcs = srcs, visibility = visibility)
Ray Milkey522a3bd2019-04-25 17:32:57 -0700547 else:
Ray Milkey24ba24a2019-04-26 11:53:02 -0700548 minimal_jar(name = name + "-javadoc", visibility = visibility)
549 minimal_jar(name = name + "-sources", visibility = visibility)
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700550
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700551 if test_srcs != []:
552 native.java_library(
553 name = tests_name,
554 srcs = test_srcs,
555 resources = test_resources,
556 deps = tests_jar_deps,
557 visibility = visibility,
558 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700559
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700560 generate_test_rules(
561 name = name + "-tests-gen",
562 test_files = test_srcs,
563 exclude_tests = exclude_tests,
Thomas Vachuskaa79bf6e2018-08-07 11:24:40 -0700564 medium_tests = medium_tests,
565 large_tests = large_tests,
566 enormous_tests = enormous_tests,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700567 deps = all_test_deps,
568 )
569
Ray Milkey134d2922018-07-15 15:24:01 -0700570 if not suppress_checkstyle:
571 checkstyle_test(
572 name = name + "_checkstyle_test",
573 srcs = srcs,
574 )
Ray Milkeyb64fe822018-08-30 09:18:16 -0700575 if test_srcs != []:
576 checkstyle_test(
577 name = name + "_checkstyle_tests_test",
578 srcs = test_srcs,
579 )
Ray Milkeyb7949e72018-06-19 18:31:02 -0700580
Ray Milkey275af2c2018-06-15 13:05:08 -0700581"""
582 Creates an OSGI jar file from a set of source files.
583
584 Args:
585 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
586 For example apps/mcast/app becomes onos-apps-mcast-app
587 deps: Dependencies of the generated jar file. Expressed as a list of targets
588 import_packages: OSGI import list. Optional, comma separated list, defaults to "*"
Jian Li4ad86872018-08-05 03:34:35 +0900589 bundle_classpath: intended for including dependencies in our bundle, so that our bundle can be deployed standalone
Ray Milkey275af2c2018-06-15 13:05:08 -0700590 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
591 srcs: Source file(s) to compile. Optional list of targets, defaults to src/main/java/**/*.java
592 resources_root: Relative path to the root of the tree of resources for this jar. Optional, defaults to src/main/resources
593 resources: Resources to include in the jar file. Optional list of targets, defaults to all files beneath resources_root
594 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
595 version: Version of the generated jar file. Optional, defaults to the current ONOS version
Ray Milkey134d2922018-07-15 15:24:01 -0700596 suppress_errorprone: If true, don't run ErrorProne tests. Default is false
597 suppress_checkstyle: If true, don't run checkstyle tests. Default is false
Ray Milkey275af2c2018-06-15 13:05:08 -0700598 web_context: Web context for a WAB file if needed. Only needed if the jar file provides a REST API. Optional string
599 api_title: Swagger API title. Optional string, only used if the jar file provides a REST API and has swagger annotations
600 api_version: Swagger API version. Optional string, only used if the jar file provides a REST API and has swagger annotations
601 api_description: Swagger API description. Optional string, only used if the jar file provides a REST API and has swagger annotations
602 api_package: Swagger API package name. Optional string, only used if the jar file provides a REST API and has swagger annotations
603"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700604
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700605def osgi_jar(
606 name = None,
607 deps = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700608 import_packages = None,
Ray Milkey275af2c2018-06-15 13:05:08 -0700609 group = "org.onosproject",
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700610 srcs = None,
611 resources_root = None,
612 resources = None,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700613 resource_jars = [],
Ray Milkey6b3775a2018-06-28 11:18:44 -0700614 include_resources = {},
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700615 visibility = ["//visibility:public"],
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700616 version = ONOS_VERSION,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700617 suppress_errorprone = False,
Ray Milkey134d2922018-07-15 15:24:01 -0700618 suppress_checkstyle = False,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700619 suppress_javadocs = False,
Ray Milkey25747d82018-06-13 14:12:51 -0700620 web_context = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700621 api_title = "",
622 api_version = "",
623 api_description = "",
Jian Li4ad86872018-08-05 03:34:35 +0900624 api_package = "",
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700625 bundle_classpath = "",
626 karaf_command_packages = []):
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700627 if srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700628 srcs = _all_java_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700629 if deps == None:
630 deps = COMPILE
631
632 osgi_jar_with_tests(
633 name = name,
634 deps = deps,
635 test_deps = [],
Ray Milkey275af2c2018-06-15 13:05:08 -0700636 group = group,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700637 srcs = srcs,
638 resources = resources,
639 resources_root = resources_root,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700640 resource_jars = resource_jars,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700641 test_srcs = [],
642 exclude_tests = [],
643 test_resources = [],
644 visibility = visibility,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700645 suppress_errorprone = suppress_errorprone,
Ray Milkey134d2922018-07-15 15:24:01 -0700646 suppress_checkstyle = suppress_checkstyle,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700647 suppress_javadocs = suppress_javadocs,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700648 version = version,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700649 import_packages = import_packages,
Ray Milkey275af2c2018-06-15 13:05:08 -0700650 api_title = api_title,
651 api_version = api_version,
652 api_description = api_description,
653 api_package = api_package,
Ray Milkey25747d82018-06-13 14:12:51 -0700654 web_context = web_context,
Jian Li4ad86872018-08-05 03:34:35 +0900655 bundle_classpath = bundle_classpath,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700656 karaf_command_packages = karaf_command_packages,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700657 )
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700658
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700659"""
660 Creates an OSGI jar file from a set of protobuf and gRPC libraries.
661
662 Args:
663 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
664 For example apps/mcast/app becomes onos-apps-mcast-app
665 proto_libs: (required) list of proto_library targets which generated Java classes will be included to this OSGi
666 jar. It is important that all the given targets reference to a single proto source files, for example
667 only the first 2 rules are good:
668
669 proto_library(
670 name = "foo_proto",
671 srcs = ["foo.proto"],
672 )
673
674 proto_library(
675 name = "bar_proto",
676 srcs = ["bar.proto"],
677 )
678
679 # THIS WILL NOT WORK
680 proto_library(
681 name = "foo_and_bar_proto",
682 srcs = ["foo.proto", "bar.proto"],
683 )
684
685 grpc_proto_lib: (optional) proto_library target that contains the schema of a gRPC service. If not passed,
686 the produced jar will NOT have any gRPC stub classes.
687 deps: Dependencies of the generated jar file. Expressed as a list of targets
688 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
689 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
690 version: Version of the generated jar file. Optional, defaults to the current ONOS version
691"""
692
693def osgi_proto_jar(
694 proto_libs,
695 grpc_proto_lib = None,
696 name = None,
697 deps = [],
698 group = "org.onosproject",
699 visibility = ["//visibility:public"],
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700700 version = ONOS_VERSION,
701 karaf_command_packages = []):
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700702 if name == None:
703 name = _auto_name()
Carmelo Casconeb9536692019-05-28 18:15:23 -0700704 proto_name = name + "-java-proto"
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700705 native.java_proto_library(
Carmelo Casconeb9536692019-05-28 18:15:23 -0700706 name = proto_name,
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700707 deps = proto_libs,
708 )
709 java_sources_alt(
Carmelo Casconeb9536692019-05-28 18:15:23 -0700710 name = proto_name + "-srcjar",
711 srcs = [":" + proto_name],
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700712 )
713 osgi_srcs = [
Carmelo Casconeb9536692019-05-28 18:15:23 -0700714 proto_name + "-srcjar",
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700715 ]
716 base_deps = [
Carmelo Casconed33d3b42019-06-18 12:12:36 -0700717 "//deps:com_google_protobuf_protobuf_java",
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700718 ]
719 if grpc_proto_lib != None:
Carmelo Casconeb9536692019-05-28 18:15:23 -0700720 grpc_name = name + "-java-grpc"
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700721 java_grpc_library(
Carmelo Casconeb9536692019-05-28 18:15:23 -0700722 name = grpc_name,
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700723 srcs = [grpc_proto_lib],
Carmelo Casconeb9536692019-05-28 18:15:23 -0700724 deps = [":" + proto_name],
725 )
726 java_sources_alt(
727 name = grpc_name + "-srcjar",
728 srcs = [":lib%s-src.jar" % grpc_name],
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700729 )
730 osgi_srcs.append(
Carmelo Casconeb9536692019-05-28 18:15:23 -0700731 ":" + grpc_name + "-srcjar",
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700732 )
733 base_deps.extend([
734 "@com_google_guava_guava//jar",
Carmelo Casconed33d3b42019-06-18 12:12:36 -0700735 "//deps:io_grpc_grpc_api_context",
736 "//deps:io_grpc_grpc_stub",
737 "//deps:io_grpc_grpc_protobuf",
Carmelo Casconeb9536692019-05-28 18:15:23 -0700738 "@javax_annotation_javax_annotation_api//jar",
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700739 ])
740 osgi_jar(
741 name = name,
742 srcs = osgi_srcs,
743 deps = base_deps + deps,
744 group = group,
745 visibility = visibility,
746 version = version,
747 suppress_errorprone = True,
748 suppress_checkstyle = True,
749 suppress_javadocs = True,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700750 karaf_command_packages = karaf_command_packages,
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700751 )