blob: beba414c191c034afb9da4d1685a3b269cada371 [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")
Carmelo Cascone6a1ae712018-08-10 12:19:47 -070025load("@io_grpc_grpc_java//:java_grpc_library.bzl", "java_grpc_library")
26
27def _auto_name():
28 return "onos-" + native.package_name().replace("/", "-")
Ray Milkey7dac7da2017-08-01 16:56:05 -070029
Ray Milkey32ea35c2018-06-06 15:28:07 -070030def _all_java_sources():
Ray Milkey0bcdfd12018-05-23 14:07:19 -070031 return native.glob(["src/main/java/**/*.java"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070032
Ray Milkey32ea35c2018-06-06 15:28:07 -070033def _all_java_test_sources():
Ray Milkey0bcdfd12018-05-23 14:07:19 -070034 return native.glob(["src/test/java/**/*.java"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070035
Ray Milkey32ea35c2018-06-06 15:28:07 -070036def _all_test_resources():
Ray Milkey0bcdfd12018-05-23 14:07:19 -070037 return native.glob(["src/test/resources/**"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070038
Ray Milkey32ea35c2018-06-06 15:28:07 -070039def _all_resources(resources_root):
Ray Milkey0bcdfd12018-05-23 14:07:19 -070040 if resources_root == None:
41 return native.glob(["src/main/resources/**"])
42 else:
43 return native.glob([resources_root + "**"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070044
Ray Milkey25747d82018-06-13 14:12:51 -070045def _webapp():
Ray Milkey6b3775a2018-06-28 11:18:44 -070046 return native.glob(["src/main/webapp/WEB-INF/web.xml"])
47
48def _include_resources_to_string(include_resources):
49 result = ""
50 for (path, filename) in include_resources.items():
51 result += (path + "=" + filename)
52 return result
Ray Milkey25747d82018-06-13 14:12:51 -070053
Ray Milkey275af2c2018-06-15 13:05:08 -070054"""
55 Implementation of the rule to call bnd to make an OSGI jar file
56"""
Ray Milkey6b3775a2018-06-28 11:18:44 -070057
Ray Milkey7dac7da2017-08-01 16:56:05 -070058def _bnd_impl(ctx):
Ray Milkey3275ae82018-05-29 15:35:36 -070059 if (len(ctx.files.source) == 1):
60 input_file = ctx.files.source[0]
61 else:
62 # this is a list of inputs. The one we want is the last one
63 # in the list that isn't a source jar
64 for file in reversed(ctx.files.source):
65 if ("-src" in file.path):
66 continue
67 else:
68 input_file = file
69 break
70
71 jar = input_file.path
Ray Milkey0bcdfd12018-05-23 14:07:19 -070072 output = ctx.outputs.osgi_jar.path
Thomas Vachuska8e022a92018-07-10 14:47:38 -070073 name = ctx.attr.name
Ray Milkey275af2c2018-06-15 13:05:08 -070074 group = ctx.attr.group
Ray Milkey0bcdfd12018-05-23 14:07:19 -070075 version = ctx.attr.version
76 license = ""
Ray Milkey12ae6ca2018-06-11 15:34:30 -070077 import_packages = ctx.attr.import_packages
Jian Li4ad86872018-08-05 03:34:35 +090078 bundle_classpath = ctx.attr.bundle_classpath
Ray Milkey0bcdfd12018-05-23 14:07:19 -070079 exportPackages = "*"
Ray Milkey6b3775a2018-06-28 11:18:44 -070080 include_resources = ctx.attr.include_resources
Ray Milkey25747d82018-06-13 14:12:51 -070081 web_context = ctx.attr.web_context
82 if web_context == None or web_context == "":
83 web_context = "NONE"
84 web_xml = ctx.attr.web_xml
Ray Milkey0bcdfd12018-05-23 14:07:19 -070085 dynamicimportPackages = ""
Ray Milkeyd84f89b2018-08-17 14:54:17 -070086 karaf_commands = ctx.attr.karaf_commands
Ray Milkey3275ae82018-05-29 15:35:36 -070087 cp = ""
Ray Milkey7dac7da2017-08-01 16:56:05 -070088
Ray Milkey3275ae82018-05-29 15:35:36 -070089 inputDependencies = [input_file]
Ray Milkey7dac7da2017-08-01 16:56:05 -070090
Ray Milkey0bcdfd12018-05-23 14:07:19 -070091 # determine the dependencies and build the class path
92 for dep in ctx.attr.deps:
Ray Milkey25b785a2018-06-12 09:59:14 -070093 if java_common.provider in dep:
94 file = dep.files.to_list()[0]
Ray Milkey25b785a2018-06-12 09:59:14 -070095 if cp:
96 cp += ":"
97 cp += file.path
98 inputDependencies = inputDependencies + [file]
Ray Milkey7dac7da2017-08-01 16:56:05 -070099
Ray Milkey25747d82018-06-13 14:12:51 -0700100 web_xml_root_path = ""
101 if len(web_xml) != 0:
102 web_xml_root = web_xml[0].files.to_list()[0]
103 inputDependencies += [web_xml_root]
104 web_xml_root_path = web_xml_root.path.replace("WEB-INF/web.xml", "")
Ray Milkey7dac7da2017-08-01 16:56:05 -0700105
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700106 # call bnd to make the OSGI jar file
107 arguments = [
108 jar,
109 output,
110 cp,
111 name,
112 group,
113 version,
114 license,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700115 import_packages,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700116 exportPackages,
Ray Milkey6b3775a2018-06-28 11:18:44 -0700117 include_resources,
Ray Milkey25747d82018-06-13 14:12:51 -0700118 web_context,
119 web_xml_root_path,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700120 dynamicimportPackages,
Thomas Vachuskae4436942018-08-07 19:27:10 -0700121 "classes",
Jian Li4ad86872018-08-05 03:34:35 +0900122 bundle_classpath,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700123 karaf_commands,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700124 ]
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700125
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700126 ctx.actions.run(
127 inputs = inputDependencies,
128 outputs = [ctx.outputs.osgi_jar],
129 arguments = arguments,
130 progress_message = "Running bnd wrapper on: %s" % ctx.attr.name,
131 executable = ctx.executable._bnd_exe,
132 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700133
Ray Milkey25b785a2018-06-12 09:59:14 -0700134 deps = []
135 if java_common.provider in ctx.attr.source:
136 deps.append(ctx.attr.source[java_common.provider])
137 deps_provider = java_common.merge(deps)
138 return struct(
Ray Milkey15053f02018-06-13 10:00:45 -0700139 providers = [deps_provider],
Ray Milkey25b785a2018-06-12 09:59:14 -0700140 )
141
Ray Milkey275af2c2018-06-15 13:05:08 -0700142"""
143 Rule definition for calling bnd to make an OSGi jar file.
144"""
Ray Milkey32ea35c2018-06-06 15:28:07 -0700145_bnd = rule(
Ray Milkey7dac7da2017-08-01 16:56:05 -0700146 attrs = {
147 "deps": attr.label_list(),
148 "version": attr.string(),
Ray Milkey275af2c2018-06-15 13:05:08 -0700149 "group": attr.string(),
Ray Milkey3275ae82018-05-29 15:35:36 -0700150 "source": attr.label(),
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700151 "import_packages": attr.string(),
Jian Li4ad86872018-08-05 03:34:35 +0900152 "bundle_classpath": attr.string(),
Ray Milkey25747d82018-06-13 14:12:51 -0700153 "web_context": attr.string(),
154 "web_xml": attr.label_list(allow_files = True),
Ray Milkey6b3775a2018-06-28 11:18:44 -0700155 "include_resources": attr.string(),
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700156 "karaf_commands": attr.string(),
Ray Milkey7dac7da2017-08-01 16:56:05 -0700157 "_bnd_exe": attr.label(
158 executable = True,
159 cfg = "host",
160 allow_files = True,
161 default = Label("//utils/osgiwrap:osgi-jar"),
162 ),
163 },
164 fragments = ["java"],
165 outputs = {
166 "osgi_jar": "lib%{name}.jar",
167 },
168 implementation = _bnd_impl,
169)
170
Ray Milkey275af2c2018-06-15 13:05:08 -0700171"""
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700172 Implementation of the rule to generate cfgdef files from java class source
173"""
174
175def _cfgdef_impl(ctx):
176 output_jar = ctx.outputs.cfgdef_jar.path
177
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700178 arguments = [
179 output_jar,
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700180 ]
181
Thomas Vachuskabef430b2018-10-22 10:55:47 -0700182 for src in ctx.files.srcs:
183 arguments.append(src.path)
184
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700185 ctx.actions.run(
186 inputs = ctx.files.srcs,
187 outputs = [ctx.outputs.cfgdef_jar],
188 arguments = arguments,
189 progress_message = "Running cfgdef generator on: %s" % ctx.attr.name,
190 executable = ctx.executable._cfgdef_generator_exe,
191 )
192
193"""
194 Rule definition to call cfgdef generator to create the *.cfgdef files from java sources
195"""
196_cfgdef = rule(
197 attrs = {
198 "srcs": attr.label_list(allow_files = True),
199 "_cfgdef_generator_exe": attr.label(
200 executable = True,
201 cfg = "host",
202 allow_files = True,
203 default = Label("//tools/build/cfgdef:cfgdef_generator"),
204 ),
205 "cfgdef_jar": attr.output(),
206 },
207 fragments = ["java"],
208 implementation = _cfgdef_impl,
209)
210
211"""
Ray Milkey275af2c2018-06-15 13:05:08 -0700212 Implementation of the rule to call swagger generator to create the registrator java class source
213"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700214
Ray Milkey275af2c2018-06-15 13:05:08 -0700215def _swagger_java_impl(ctx):
216 api_title = ctx.attr.api_title
217 api_version = ctx.attr.api_version
218 api_description = ctx.attr.api_description
219 api_package = ctx.attr.api_package
220 web_context = ctx.attr.web_context
221
222 output_java = ctx.outputs.swagger_java.path
Ray Milkey6b3775a2018-06-28 11:18:44 -0700223 output_dir = output_java[:output_java.find("generated-sources")]
Ray Milkey275af2c2018-06-15 13:05:08 -0700224
225 package_name = ctx.attr.package_name
226
227 srcs_arg = ""
Ray Milkey275af2c2018-06-15 13:05:08 -0700228
229 for file in ctx.files.srcs:
230 srcs_arg += file.path + ","
Ray Milkey275af2c2018-06-15 13:05:08 -0700231
Ray Milkey275af2c2018-06-15 13:05:08 -0700232 # call swagger generator to make the swagger JSON and java files
233 arguments = [
234 srcs_arg,
Ray Milkey8c6fe172019-01-29 17:34:04 -0800235 "",
Ray Milkey275af2c2018-06-15 13:05:08 -0700236 "",
237 package_name + "/src/main/resources",
238 output_dir,
239 output_dir,
240 web_context,
241 api_title,
242 api_version,
243 api_package,
244 api_description,
245 ]
246
247 ctx.actions.run(
248 inputs = ctx.files.srcs,
249 outputs = [ctx.outputs.swagger_java],
250 arguments = arguments,
251 progress_message = "Running swagger generator on: %s" % ctx.attr.name,
252 executable = ctx.executable._swagger_generator_exe,
253 )
254
255"""
256Implementation of the rule to call swagger generator for swagger.json file
257"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700258
Ray Milkey275af2c2018-06-15 13:05:08 -0700259def _swagger_json_impl(ctx):
260 api_title = ctx.attr.api_title
261 api_version = ctx.attr.api_version
262 api_description = ctx.attr.api_description
263 api_package = ctx.attr.api_package
264 web_context = ctx.attr.web_context
265
266 output_json = ctx.outputs.swagger_json.path
267 output_dir = output_json[:output_json.find("swagger.json")]
268
269 package_name = ctx.attr.package_name
270
271 srcs_arg = ""
Ray Milkey275af2c2018-06-15 13:05:08 -0700272
273 for file in ctx.files.srcs:
274 srcs_arg += file.path + ","
Ray Milkey275af2c2018-06-15 13:05:08 -0700275
Ray Milkey275af2c2018-06-15 13:05:08 -0700276 # call swagger generator to make the swagger JSON and java files
277 arguments = [
278 srcs_arg,
Ray Milkey8c6fe172019-01-29 17:34:04 -0800279 "",
Ray Milkey275af2c2018-06-15 13:05:08 -0700280 "",
281 package_name + "/src/main/resources",
282 output_dir,
283 output_dir,
284 web_context,
285 api_title,
286 api_version,
287 api_package,
288 api_description,
289 ]
290
291 ctx.actions.run(
292 inputs = ctx.files.srcs,
293 outputs = [ctx.outputs.swagger_json],
294 arguments = arguments,
295 progress_message = "Running swagger generator on: %s" % ctx.attr.name,
296 executable = ctx.executable._swagger_generator_exe,
297 )
298
299"""
300 Rule definition to call swagger generator to create the registrator java class source
301"""
302_swagger_java = rule(
303 attrs = {
304 "srcs": attr.label_list(allow_files = True),
305 "package_name": attr.string(),
306 "api_title": attr.string(),
307 "api_version": attr.string(),
308 "api_description": attr.string(),
309 "api_package": attr.string(),
310 "web_context": attr.string(),
311 "_swagger_generator_exe": attr.label(
312 executable = True,
313 cfg = "host",
314 allow_files = True,
Thomas Vachuska22ea6122018-10-24 12:28:59 -0700315 default = Label("//tools/build/swagger:swagger_generator"),
Ray Milkey275af2c2018-06-15 13:05:08 -0700316 ),
317 "swagger_java": attr.output(),
318 },
319 fragments = ["java"],
320 implementation = _swagger_java_impl,
321)
322
323"""
324 Rule definition to call swagger generator to create the swagger JSON
325"""
326_swagger_json = rule(
327 attrs = {
328 "srcs": attr.label_list(allow_files = True),
329 "package_name": attr.string(),
330 "api_title": attr.string(),
331 "api_version": attr.string(),
332 "api_description": attr.string(),
333 "api_package": attr.string(),
334 "web_context": attr.string(),
335 "_swagger_generator_exe": attr.label(
336 executable = True,
337 cfg = "host",
338 allow_files = True,
Thomas Vachuska22ea6122018-10-24 12:28:59 -0700339 default = Label("//tools/build/swagger:swagger_generator"),
Ray Milkey275af2c2018-06-15 13:05:08 -0700340 ),
341 "swagger_json": attr.output(),
342 },
343 fragments = ["java"],
344 implementation = _swagger_json_impl,
345)
346
347"""
348 Converts a jar file to an OSGI compatible jar file.
349
350 Args:
351 name: name of the rule to create the OSGI jar file - required
352 jar: jar file to convert - required target
353 deps: dependencies needed by the jar file - required list of targets
354 version: Version of the generated jar file. Optional, defaults to the current ONOS version
355 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
356 import_packages: OSGI import list. Optional, comma separated list, defaults to "*"
357 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to private
358"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700359
Ray Milkey25747d82018-06-13 14:12:51 -0700360def wrapped_osgi_jar(
361 name,
362 jar,
363 deps,
364 version = ONOS_VERSION,
Ray Milkey275af2c2018-06-15 13:05:08 -0700365 group = "org.onosproject",
Ray Milkey25747d82018-06-13 14:12:51 -0700366 import_packages = "*",
Carmelo Casconec0b23a42019-04-25 13:50:54 -0700367 visibility = ["//visibility:private"],
368 generate_pom = False):
Ray Milkey25747d82018-06-13 14:12:51 -0700369 _bnd(
370 name = name,
371 source = jar,
372 deps = deps,
373 version = version,
Ray Milkey275af2c2018-06-15 13:05:08 -0700374 group = group,
Ray Milkey25747d82018-06-13 14:12:51 -0700375 visibility = visibility,
376 import_packages = import_packages,
Ray Milkey275af2c2018-06-15 13:05:08 -0700377 web_xml = None,
Ray Milkey25747d82018-06-13 14:12:51 -0700378 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700379
Carmelo Casconec0b23a42019-04-25 13:50:54 -0700380 if generate_pom:
381 pom_file(
382 name = name + "-pom",
383 artifact = name,
384 deps = deps,
385 visibility = visibility,
386 )
387
Ray Milkey275af2c2018-06-15 13:05:08 -0700388"""
389 Creates an OSGI jar and test jar file from a set of source and test files.
390 See osgi_jar() for a description of shared parameters.
391 Args:
392 test_srcs: Test source file(s) to compile. Optional list of targets, defaults to src/test/java/**/*.java
393 test_deps: Dependencies for the test jar. Optional list of targets, defaults to a common set of dependencies
394 test_resources: Resources to include in the test jar. Optional list of targets, defaults to src/test/resources/**
395 exclude_tests: Tests that should not be run. Useful for excluding things like test files without any @Test methods.
396 Optional ist of targets, defaults to []
397"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700398
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700399def osgi_jar_with_tests(
400 name = None,
401 deps = None,
402 test_deps = None,
Ray Milkey275af2c2018-06-15 13:05:08 -0700403 group = "org.onosproject",
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700404 srcs = None,
405 resources_root = None,
406 resources = None,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700407 resource_jars = [],
Ray Milkey6b3775a2018-06-28 11:18:44 -0700408 include_resources = {},
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700409 test_srcs = None,
410 exclude_tests = None,
Thomas Vachuskaa79bf6e2018-08-07 11:24:40 -0700411 medium_tests = [],
412 large_tests = [],
413 enormous_tests = [],
414 flaky_tests = [],
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700415 test_resources = None,
416 visibility = ["//visibility:public"],
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700417 version = ONOS_VERSION,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700418 suppress_errorprone = False,
Ray Milkey134d2922018-07-15 15:24:01 -0700419 suppress_checkstyle = False,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700420 suppress_javadocs = False,
Ray Milkey25747d82018-06-13 14:12:51 -0700421 web_context = None,
422 api_title = "",
423 api_version = "",
424 api_description = "",
425 api_package = "",
Jian Li4ad86872018-08-05 03:34:35 +0900426 import_packages = None,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700427 bundle_classpath = "",
428 karaf_command_packages = []):
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700429 if name == None:
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700430 name = _auto_name()
Ray Milkey7dac7da2017-08-01 16:56:05 -0700431 if srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700432 srcs = _all_java_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700433 if resources == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700434 resources = _all_resources(resources_root)
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700435 if test_srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700436 test_srcs = _all_java_test_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700437 if test_resources == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700438 test_resources = _all_test_resources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700439 if exclude_tests == None:
440 exclude_tests = []
Ray Milkey7dac7da2017-08-01 16:56:05 -0700441 if deps == None:
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700442 deps = COMPILE
443 if test_deps == None:
444 test_deps = TEST
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700445 if import_packages == None:
446 import_packages = "*"
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700447 tests_name = name + "-tests"
448 tests_jar_deps = list(depset(deps + test_deps)) + [name]
449 all_test_deps = tests_jar_deps + [tests_name]
Ray Milkey25747d82018-06-13 14:12:51 -0700450 web_xml = _webapp()
Ray Milkey7dac7da2017-08-01 16:56:05 -0700451
Ray Milkey275af2c2018-06-15 13:05:08 -0700452 native_srcs = srcs
453 native_resources = resources
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700454
Andrea Campanella4005c062019-01-17 16:05:03 +0100455 if web_context != None and api_title != "":
Ray Milkey275af2c2018-06-15 13:05:08 -0700456 # generate Swagger files if needed
457 _swagger_java(
458 name = name + "_swagger_java",
459 srcs = srcs + resources,
460 package_name = native.package_name(),
461 api_title = api_title,
462 api_version = api_version,
463 api_description = api_description,
464 web_context = web_context,
465 api_package = api_package,
466 swagger_java = ("src/main/resources/apidoc/generated-sources/" +
Ray Milkey6b3775a2018-06-28 11:18:44 -0700467 api_package.replace(".", "/") +
468 "/ApiDocRegistrator.java").replace("//", "/"),
Ray Milkey275af2c2018-06-15 13:05:08 -0700469 )
470 _swagger_json(
471 name = name + "_swagger_json",
472 srcs = srcs + resources,
473 package_name = native.package_name(),
474 api_title = api_title,
475 api_version = api_version,
476 api_description = api_description,
477 web_context = web_context,
478 api_package = api_package,
479 swagger_json = "src/main/resources/apidoc/swagger.json",
480 )
481 native_resources = []
482 for r in resources:
Ray Milkey6b3775a2018-06-28 11:18:44 -0700483 if not "definitions" in r:
Ray Milkey275af2c2018-06-15 13:05:08 -0700484 native_resources.append(r)
Ray Milkey6b3775a2018-06-28 11:18:44 -0700485 native_srcs = srcs + [name + "_swagger_java"]
486 native_resources.append(name + "_swagger_json")
Ray Milkey275af2c2018-06-15 13:05:08 -0700487
Ray Milkey5063f5b2018-08-15 16:22:30 -0700488 javacopts = ["-XepDisableAllChecks"] if suppress_errorprone else []
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700489
Thomas Vachuskabef430b2018-10-22 10:55:47 -0700490 _cfgdef(
491 name = name + "_cfgdef_jar",
492 srcs = native_srcs,
493 visibility = visibility,
494 cfgdef_jar = name + "_cfgdef.jar",
495 )
496
Ray Milkey25747d82018-06-13 14:12:51 -0700497 # compile the Java code
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700498 if len(resource_jars) > 0:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700499 native.java_library(
500 name = name + "-native",
501 srcs = native_srcs,
Thomas Vachuskabef430b2018-10-22 10:55:47 -0700502 resource_jars = resource_jars + [name + "_cfgdef_jar"],
Ray Milkey5063f5b2018-08-15 16:22:30 -0700503 deps = deps,
504 visibility = visibility,
505 javacopts = javacopts,
506 )
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700507 else:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700508 native.java_library(
509 name = name + "-native",
510 srcs = native_srcs,
Thomas Vachuskabef430b2018-10-22 10:55:47 -0700511 resource_jars = [name + "_cfgdef_jar"],
Ray Milkey5063f5b2018-08-15 16:22:30 -0700512 resources = native_resources,
513 deps = deps,
514 visibility = visibility,
515 javacopts = javacopts,
516 )
Ray Milkey25747d82018-06-13 14:12:51 -0700517
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700518 karaf_command_packages_string = ",".join(karaf_command_packages)
Ray Milkey32ea35c2018-06-06 15:28:07 -0700519 _bnd(
Ray Milkey25b785a2018-06-12 09:59:14 -0700520 name = name,
521 source = name + "-native",
Ray Milkey32ea35c2018-06-06 15:28:07 -0700522 deps = deps,
523 version = version,
Ray Milkey275af2c2018-06-15 13:05:08 -0700524 group = group,
Ray Milkey32ea35c2018-06-06 15:28:07 -0700525 visibility = visibility,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700526 import_packages = import_packages,
Jian Li4ad86872018-08-05 03:34:35 +0900527 bundle_classpath = bundle_classpath,
Ray Milkey25747d82018-06-13 14:12:51 -0700528 web_context = web_context,
529 web_xml = web_xml,
Ray Milkey6b3775a2018-06-28 11:18:44 -0700530 include_resources = _include_resources_to_string(include_resources),
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700531 karaf_commands = karaf_command_packages_string,
Ray Milkey32ea35c2018-06-06 15:28:07 -0700532 )
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700533
Thomas Vachuskaac9e5242018-07-19 16:15:39 -0700534 # rule for generating pom file for publishing
535 pom_file(name = name + "-pom", artifact = name, deps = deps, visibility = visibility)
536
537 # rule for building source jar
Thomas Vachuska50ac0982018-07-19 10:17:37 -0700538 if not suppress_javadocs:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700539 java_sources(name = name + "-sources", srcs = srcs, visibility = visibility)
Thomas Vachuska50ac0982018-07-19 10:17:37 -0700540
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700541 # rule for building javadocs
542 if not suppress_javadocs:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700543 javadoc(name = name + "-javadoc", deps = deps, srcs = srcs, visibility = visibility)
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700544
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700545 if test_srcs != []:
546 native.java_library(
547 name = tests_name,
548 srcs = test_srcs,
549 resources = test_resources,
550 deps = tests_jar_deps,
551 visibility = visibility,
552 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700553
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700554 generate_test_rules(
555 name = name + "-tests-gen",
556 test_files = test_srcs,
557 exclude_tests = exclude_tests,
Thomas Vachuskaa79bf6e2018-08-07 11:24:40 -0700558 medium_tests = medium_tests,
559 large_tests = large_tests,
560 enormous_tests = enormous_tests,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700561 deps = all_test_deps,
562 )
563
Ray Milkey134d2922018-07-15 15:24:01 -0700564 if not suppress_checkstyle:
565 checkstyle_test(
566 name = name + "_checkstyle_test",
567 srcs = srcs,
568 )
Ray Milkeyb64fe822018-08-30 09:18:16 -0700569 if test_srcs != []:
570 checkstyle_test(
571 name = name + "_checkstyle_tests_test",
572 srcs = test_srcs,
573 )
Ray Milkeyb7949e72018-06-19 18:31:02 -0700574
Ray Milkey275af2c2018-06-15 13:05:08 -0700575"""
576 Creates an OSGI jar file from a set of source files.
577
578 Args:
579 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
580 For example apps/mcast/app becomes onos-apps-mcast-app
581 deps: Dependencies of the generated jar file. Expressed as a list of targets
582 import_packages: OSGI import list. Optional, comma separated list, defaults to "*"
Jian Li4ad86872018-08-05 03:34:35 +0900583 bundle_classpath: intended for including dependencies in our bundle, so that our bundle can be deployed standalone
Ray Milkey275af2c2018-06-15 13:05:08 -0700584 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
585 srcs: Source file(s) to compile. Optional list of targets, defaults to src/main/java/**/*.java
586 resources_root: Relative path to the root of the tree of resources for this jar. Optional, defaults to src/main/resources
587 resources: Resources to include in the jar file. Optional list of targets, defaults to all files beneath resources_root
588 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
589 version: Version of the generated jar file. Optional, defaults to the current ONOS version
Ray Milkey134d2922018-07-15 15:24:01 -0700590 suppress_errorprone: If true, don't run ErrorProne tests. Default is false
591 suppress_checkstyle: If true, don't run checkstyle tests. Default is false
Ray Milkey275af2c2018-06-15 13:05:08 -0700592 web_context: Web context for a WAB file if needed. Only needed if the jar file provides a REST API. Optional string
593 api_title: Swagger API title. Optional string, only used if the jar file provides a REST API and has swagger annotations
594 api_version: Swagger API version. Optional string, only used if the jar file provides a REST API and has swagger annotations
595 api_description: Swagger API description. Optional string, only used if the jar file provides a REST API and has swagger annotations
596 api_package: Swagger API package name. Optional string, only used if the jar file provides a REST API and has swagger annotations
597"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700598
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700599def osgi_jar(
600 name = None,
601 deps = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700602 import_packages = None,
Ray Milkey275af2c2018-06-15 13:05:08 -0700603 group = "org.onosproject",
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700604 srcs = None,
605 resources_root = None,
606 resources = None,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700607 resource_jars = [],
Ray Milkey6b3775a2018-06-28 11:18:44 -0700608 include_resources = {},
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700609 visibility = ["//visibility:public"],
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700610 version = ONOS_VERSION,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700611 suppress_errorprone = False,
Ray Milkey134d2922018-07-15 15:24:01 -0700612 suppress_checkstyle = False,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700613 suppress_javadocs = False,
Ray Milkey25747d82018-06-13 14:12:51 -0700614 web_context = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700615 api_title = "",
616 api_version = "",
617 api_description = "",
Jian Li4ad86872018-08-05 03:34:35 +0900618 api_package = "",
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700619 bundle_classpath = "",
620 karaf_command_packages = []):
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700621 if srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700622 srcs = _all_java_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700623 if deps == None:
624 deps = COMPILE
625
626 osgi_jar_with_tests(
627 name = name,
628 deps = deps,
629 test_deps = [],
Ray Milkey275af2c2018-06-15 13:05:08 -0700630 group = group,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700631 srcs = srcs,
632 resources = resources,
633 resources_root = resources_root,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700634 resource_jars = resource_jars,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700635 test_srcs = [],
636 exclude_tests = [],
637 test_resources = [],
638 visibility = visibility,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700639 suppress_errorprone = suppress_errorprone,
Ray Milkey134d2922018-07-15 15:24:01 -0700640 suppress_checkstyle = suppress_checkstyle,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700641 suppress_javadocs = suppress_javadocs,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700642 version = version,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700643 import_packages = import_packages,
Ray Milkey275af2c2018-06-15 13:05:08 -0700644 api_title = api_title,
645 api_version = api_version,
646 api_description = api_description,
647 api_package = api_package,
Ray Milkey25747d82018-06-13 14:12:51 -0700648 web_context = web_context,
Jian Li4ad86872018-08-05 03:34:35 +0900649 bundle_classpath = bundle_classpath,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700650 karaf_command_packages = karaf_command_packages,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700651 )
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700652
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700653"""
654 Creates an OSGI jar file from a set of protobuf and gRPC libraries.
655
656 Args:
657 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
658 For example apps/mcast/app becomes onos-apps-mcast-app
659 proto_libs: (required) list of proto_library targets which generated Java classes will be included to this OSGi
660 jar. It is important that all the given targets reference to a single proto source files, for example
661 only the first 2 rules are good:
662
663 proto_library(
664 name = "foo_proto",
665 srcs = ["foo.proto"],
666 )
667
668 proto_library(
669 name = "bar_proto",
670 srcs = ["bar.proto"],
671 )
672
673 # THIS WILL NOT WORK
674 proto_library(
675 name = "foo_and_bar_proto",
676 srcs = ["foo.proto", "bar.proto"],
677 )
678
679 grpc_proto_lib: (optional) proto_library target that contains the schema of a gRPC service. If not passed,
680 the produced jar will NOT have any gRPC stub classes.
681 deps: Dependencies of the generated jar file. Expressed as a list of targets
682 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
683 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
684 version: Version of the generated jar file. Optional, defaults to the current ONOS version
685"""
686
687def osgi_proto_jar(
688 proto_libs,
689 grpc_proto_lib = None,
690 name = None,
691 deps = [],
692 group = "org.onosproject",
693 visibility = ["//visibility:public"],
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700694 version = ONOS_VERSION,
695 karaf_command_packages = []):
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700696 if name == None:
697 name = _auto_name()
698 native.java_proto_library(
699 name = name + "-java-proto",
700 deps = proto_libs,
701 )
702 java_sources_alt(
703 name = name + "-proto-srcjar",
704 srcs = [":%s-java-proto" % name],
705 )
706 osgi_srcs = [
707 ":%s-proto-srcjar" % name,
708 ]
709 base_deps = [
Carmelo Casconec0b23a42019-04-25 13:50:54 -0700710 "//lib:com_google_protobuf_protobuf_java",
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700711 ]
712 if grpc_proto_lib != None:
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700713 java_grpc_library(
714 name = name + "-java-grpc",
715 srcs = [grpc_proto_lib],
716 deps = [":%s-java-proto" % name],
717 )
718 osgi_srcs.append(
Ray Milkey5063f5b2018-08-15 16:22:30 -0700719 ":%s-java-grpc__do_not_reference__srcjar" % name,
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700720 )
721 base_deps.extend([
722 "@com_google_guava_guava//jar",
Carmelo Casconec0b23a42019-04-25 13:50:54 -0700723 "//lib:io_grpc_grpc_core_context",
724 "//lib:io_grpc_grpc_stub",
725 "//lib:io_grpc_grpc_protobuf",
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700726 ])
727 osgi_jar(
728 name = name,
729 srcs = osgi_srcs,
730 deps = base_deps + deps,
731 group = group,
732 visibility = visibility,
733 version = version,
734 suppress_errorprone = True,
735 suppress_checkstyle = True,
736 suppress_javadocs = True,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700737 karaf_command_packages = karaf_command_packages,
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700738 )