mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-15 01:11:30 +02:00
364 lines
13 KiB
Python
364 lines
13 KiB
Python
"""
|
|
Copyright 2018-present Open Networking Foundation
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
"""
|
|
|
|
"""
|
|
Rules to build the ONOS GUI 2
|
|
|
|
The GUI2 Angular 6 elements are built here with Angular CLI 'ng'
|
|
Some work is being done in the Bazel community to integrate Bazel and
|
|
Angular 6, (Angular Buildtools Convergence -
|
|
https://docs.google.com/document/d/1OlyiUnoTirUj4gecGxJeZBcjHcFr36RvLsvpBl2mxA8/preview)
|
|
but it is in the very early stages (Aug'18) and not yet fit
|
|
for production and at present it works as a replacement for Angular CLI
|
|
(which is not desirable).
|
|
|
|
There are plans to extend Bazel it to work with Angular CLI, and if works
|
|
well this Bazel file may be rearchiteced in future.
|
|
|
|
Bazel and npm are incompatibe in how they deal with files. npm likes to
|
|
follow links to get back to the original canonical path names, and bazel
|
|
uses links extensively when populating the sandbox. To get around these
|
|
problems, the rules that follow use filegroups to specify the files as
|
|
dependencies and then use a genrule to convert the files into a tar ball.
|
|
Once the tar ball is unrolled into the sandbox, the links are broken, but
|
|
the build is still hermetic since those files are referred to as dependencies in the genrule.
|
|
"""
|
|
|
|
COMPILE_DEPS = CORE_DEPS + JACKSON + KRYO + [
|
|
"@javax_ws_rs_api//jar",
|
|
"@servlet_api//jar",
|
|
"@jetty_websocket//jar",
|
|
"@jetty_util//jar",
|
|
"@jersey_media_multipart//jar",
|
|
"@jersey_server//jar",
|
|
"//utils/rest:onlab-rest",
|
|
"//core/store/serializers:onos-core-serializers",
|
|
]
|
|
|
|
TEST_DEPS = TEST + [
|
|
"//core/api:onos-api-tests",
|
|
"//drivers/default:onos-drivers-default",
|
|
]
|
|
|
|
"""
|
|
Files that get put at the top level of the tar ball
|
|
"""
|
|
|
|
filegroup(
|
|
name = "_root_level_files",
|
|
srcs =
|
|
[
|
|
":angular.json",
|
|
":karma.conf.js",
|
|
":package.json",
|
|
":package-lock.json",
|
|
":protractor.conf.js",
|
|
":src/main/tsconfig.json",
|
|
":src/main/tslint.json",
|
|
":tsconfig.json",
|
|
],
|
|
)
|
|
|
|
filegroup(
|
|
name = "_e2e_test_files",
|
|
srcs = [
|
|
":e2e/app.e2e-spec.ts",
|
|
":e2e/app.po.ts",
|
|
":e2e/tsconfig.e2e.json",
|
|
],
|
|
)
|
|
|
|
"""
|
|
Files that get put into the WEB-INF directory of the tar ball
|
|
"""
|
|
|
|
filegroup(
|
|
name = "_web_inf_classes_files",
|
|
srcs =
|
|
[
|
|
":src/main/webapp/error.html",
|
|
":src/main/webapp/login.html",
|
|
":src/main/webapp/nav.html",
|
|
":src/main/webapp/not-ready.html",
|
|
":src/main/webapp/onos.global.css",
|
|
],
|
|
)
|
|
|
|
"""
|
|
Run ng build to create outputs in production mode
|
|
See bazel-genfiles/web/gui2/onos-gui2-ng-build-prod.log for details of the Angular CLI output
|
|
|
|
To avoid the overhead of having several "npm install" invocations, we just do
|
|
it once in the //web/gui2-fw-lib which is really the core for the whole Angular 6
|
|
structure in ONOS. This copies files in to node_modules, but because the gui2-fw-lib
|
|
has not been generated at that time we copy it in separately below with the 'tar' cmd
|
|
and then 'mv'
|
|
"""
|
|
|
|
genrule(
|
|
name = "_onos-gui2-ng-build",
|
|
srcs = [
|
|
"@nodejs//:bin/npm",
|
|
"@nodejs//:bin/node",
|
|
"@nodejs//:bin/node.js",
|
|
"@nodejs//:bin/nodejs/bin/node",
|
|
"@nodejs//:bin/nodejs/bin/npm",
|
|
"//web/gui2-fw-lib:onos-gui2-fw-npm-install",
|
|
"//web/gui2-fw-lib:onos-gui2-fw-ng-build",
|
|
"//web/gui2-fw-lib:gui2_fw_lib_ext_css",
|
|
"//apps/faultmanagement/fm-gui2-lib:fm-gui2-lib-build",
|
|
":_root_level_files",
|
|
":_web_app_all",
|
|
],
|
|
outs = [
|
|
"onos-gui2-ng-build-prod.log",
|
|
"onos-gui2-ng-build.jar",
|
|
],
|
|
cmd = "ROOT=`pwd` &&" +
|
|
" export HOME=. &&" +
|
|
" export XDG_CONFIG_HOME=$(@D)/config &&" +
|
|
" NODE=$(location @nodejs//:bin/node) &&" +
|
|
" INSTALL_FILES=($(locations //web/gui2-fw-lib:onos-gui2-fw-npm-install)) &&" + # An array of filenames - sorted by time created
|
|
" FWLIB_FILES=($(locations //web/gui2-fw-lib:onos-gui2-fw-ng-build)) &&" + # An array of filenames - sorted by time created
|
|
" mkdir -p web/gui2 && cd web/gui2 &&" +
|
|
" jar xf ../../$(location :_web_app_all) &&" +
|
|
" jar xf $$ROOT/$${INSTALL_FILES[0]} &&" +
|
|
" tar xf $$ROOT/$${FWLIB_FILES[0]} &&" +
|
|
" mv package/ node_modules/gui2-fw-lib/ &&" +
|
|
# Add in modules from external packages
|
|
" FM_GUI2_LIB_FILES=($(locations //apps/faultmanagement/fm-gui2-lib:fm-gui2-lib-build)) &&" + # An array of filenames - sorted by time created
|
|
" tar xf $$ROOT/$${FM_GUI2_LIB_FILES[0]} &&" +
|
|
" mv package/ node_modules/fm-gui2-lib/ &&" +
|
|
# End of add in modules from external packages
|
|
" mkdir -p src/main/webapp/app/fw &&" +
|
|
" (cd src/main/webapp/app/fw &&" +
|
|
" jar xf $$ROOT/$(location //web/gui2-fw-lib:gui2_fw_lib_ext_css)) &&" +
|
|
" chmod +x $$ROOT/web/gui2/node_modules/@angular/cli/bin/ng &&" +
|
|
" export PATH=$$ROOT/$$(dirname $${NODE}):$$ROOT/web/gui2/node_modules/@angular/cli/bin:$$PATH &&" +
|
|
" node -v > ../../$(location onos-gui2-ng-build-prod.log) &&" +
|
|
" npm -v >> ../../$(location onos-gui2-ng-build-prod.log) &&" +
|
|
" ng -v >> ../../$(location onos-gui2-ng-build-prod.log) &&" +
|
|
# Build it in production mode - optimization is turned off because of Angular CLI 6.0.x bug https://github.com/angular/angular-cli/issues/7799
|
|
" ng build --extract-css --prod --optimization=false --preserve-symlinks" +
|
|
" --base-href /onos/ui2/ --deploy-url /onos/ui2/ >> $$ROOT/$(location onos-gui2-ng-build-prod.log) 2>&1 ||" +
|
|
" if [ $$? -eq 0 ]; then echo 'Successfully ran build';" +
|
|
" else " +
|
|
" echo 'Error running \'ng build\' on \'//web/gui2:_onos-gui2-ng-build\'. \\\n" +
|
|
" See bazel-genfiles/web/gui2/onos-gui2-ng-build-prod.log for more details' >&2;" +
|
|
#" tail -n 100 ../../$(location onos-gui2-ng-test.log) >&2;" +
|
|
" exit 1;" +
|
|
" fi;" +
|
|
" cd src/main/webapp/dist && jar Mcf $$ROOT/$(location onos-gui2-ng-build.jar) .",
|
|
message = "Angular CLI 6 build",
|
|
)
|
|
|
|
"""
|
|
Run 'ng test' to run Angular test and 'ng lint' for checkstyle
|
|
See bazel-genfiles/web/gui2/onos-gui2-ng-lint.log or
|
|
bazel-genfiles/web/gui2/onos-gui2-ng-test.log for details of the Angular CLI output
|
|
"""
|
|
|
|
genrule(
|
|
name = "_onos-gui2-ng-test-genrule",
|
|
srcs = [
|
|
"@nodejs//:bin/npm",
|
|
"@nodejs//:bin/node",
|
|
"@nodejs//:bin/node.js",
|
|
"@nodejs//:bin/nodejs/bin/node",
|
|
"@nodejs//:bin/nodejs/bin/npm",
|
|
"//web/gui2-fw-lib:onos-gui2-fw-npm-install",
|
|
"//web/gui2-fw-lib:onos-gui2-fw-ng-build",
|
|
"//web/gui2-fw-lib:gui2_fw_lib_ext_css",
|
|
":_web_app_all",
|
|
":_web_app_tests",
|
|
":_angular_all",
|
|
],
|
|
outs = [
|
|
"onos-gui2-ng-ver.log",
|
|
"onos-gui2-ng-lint.log",
|
|
"onos-gui2-ng-test.log",
|
|
],
|
|
cmd = " ROOT=`pwd` &&" +
|
|
" export HOME=. &&" +
|
|
" export XDG_CONFIG_HOME=$(@D)/config &&" +
|
|
" NODE=$(location @nodejs//:bin/node) &&" +
|
|
" INSTALL_FILES=($(locations //web/gui2-fw-lib:onos-gui2-fw-npm-install)) &&" + # An array of filenames - sorted by time created
|
|
" FWLIB_FILES=($(locations //web/gui2-fw-lib:onos-gui2-fw-ng-build)) &&" + # An array of filenames - sorted by time created
|
|
" mkdir -p web/gui2 &&" +
|
|
" cd web/gui2 &&" +
|
|
" jar xf ../../$(location :_angular_all) &&" +
|
|
" jar xf ../../$(location :_web_app_all) &&" +
|
|
" jar xf ../../$(location :_web_app_tests) &&" +
|
|
" jar xf $$ROOT/$${INSTALL_FILES[0]} &&" +
|
|
" tar xf $$ROOT/$${FWLIB_FILES[0]} &&" +
|
|
" mv package/ node_modules/gui2-fw-lib/ &&" +
|
|
" mkdir -p src/main/webapp/app/fw &&" +
|
|
" (cd src/main/webapp/app/fw &&" +
|
|
" jar xf $$ROOT/$(location //web/gui2-fw-lib:gui2_fw_lib_ext_css)) &&" +
|
|
" chmod +x $$ROOT/web/gui2/node_modules/@angular/cli/bin/ng &&" +
|
|
" export PATH=$$ROOT/$$(dirname $${NODE}):$$ROOT/web/gui2/node_modules/@angular/cli/bin:$$PATH &&" +
|
|
" node -v > ../../$(location onos-gui2-ng-ver.log) &&" +
|
|
" npm -v >> ../../$(location onos-gui2-ng-ver.log) &&" +
|
|
" ng -v >> ../../$(location onos-gui2-ng-ver.log) &&" +
|
|
" ng lint > ../../$(location onos-gui2-ng-lint.log);" +
|
|
" if [ -f /usr/bin/chromium-browser ]; then " + # Add to this for Mac and Chrome
|
|
" export CHROME_BIN=/usr/bin/chromium-browser; " +
|
|
" elif [ -f /opt/google/chrome/chrome ]; then " +
|
|
" export CHROME_BIN=/opt/google/chrome/chrome; " +
|
|
" else " +
|
|
" MSG='Warning: Step onos-gui2-ng-test skipped because \\n" +
|
|
" no binary for ChromeHeadless browser was found at /usr/bin/chromium-browser. \\n" +
|
|
" Install Google Chrome or Chromium Browser to allow this step to run.';" +
|
|
" echo -e $$MSG >&2;" +
|
|
" echo -e $$MSG > ../../$(location onos-gui2-ng-test.log);" +
|
|
" exit 0;" +
|
|
" fi;" +
|
|
" ng test --preserve-symlinks --code-coverage --browsers=ChromeHeadless" +
|
|
" --watch=false > ../../$(location onos-gui2-ng-test.log) 2>&1 ||" +
|
|
" if [ $$? -eq 0 ]; then echo 'Successfully ran tests';" +
|
|
" else " +
|
|
" echo 'Error running \'ng test\' on \'//web/gui2:onos-gui2-ng-test\'. \\\n" +
|
|
" See bazel-genfiles/web/gui2/onos-gui2-ng-test.log for more details' >&2;" +
|
|
#" tail -n 100 ../../$(location onos-gui2-ng-test.log) >&2;" +
|
|
" exit 1;" +
|
|
" fi;",
|
|
message = "Angular CLI 6 lint and test",
|
|
)
|
|
|
|
"""
|
|
Make a jar file of all the webapp files. Useful for breaking symblic links in the sandbox
|
|
"""
|
|
|
|
genrule(
|
|
name = "_web_app_all",
|
|
srcs = glob(
|
|
[
|
|
"src/main/webapp/**",
|
|
],
|
|
exclude = [
|
|
"src/main/webapp/**/*.spec.ts", # Don't track tests here
|
|
"src/main/webapp/tests/**",
|
|
"src/main/webapp/node_modules/**",
|
|
"src/main/webapp/dist/**",
|
|
"src/main/webapp/doc/**",
|
|
"src/main/webapp/app/fw/**",
|
|
],
|
|
),
|
|
outs = ["web_app_all.jar"],
|
|
cmd = "cd web/gui2 &&" +
|
|
" find src/main/webapp -type f -exec touch -t 201808280000 {} \; &&" +
|
|
" jar Mcf ../../$@ src/main/webapp",
|
|
)
|
|
|
|
"""
|
|
Make a jar file of all the webapp test (*.spec.ts) files.
|
|
"""
|
|
|
|
genrule(
|
|
name = "_web_app_tests",
|
|
srcs = glob(
|
|
[
|
|
"src/main/webapp/**/*.spec.ts",
|
|
],
|
|
exclude = [
|
|
"src/main/webapp/tests/**",
|
|
"src/main/webapp/node_modules/**",
|
|
"src/main/webapp/dist/**",
|
|
"src/main/webapp/doc/**",
|
|
],
|
|
),
|
|
outs = ["web_app_tests.jar"],
|
|
cmd = "cd web/gui2 &&" +
|
|
" find src/main/webapp -type f -exec touch -t 201808280000 {} \; &&" +
|
|
" jar Mcf ../../$@ src/main/webapp",
|
|
)
|
|
|
|
"""
|
|
Make a jar file of all the supporting files. Useful for breaking symblic links in the sandbox
|
|
"""
|
|
|
|
genrule(
|
|
name = "_angular_all",
|
|
srcs = [
|
|
":_e2e_test_files",
|
|
":_root_level_files",
|
|
],
|
|
outs = ["angular_all.jar"],
|
|
cmd = " cd web/gui2 && jar Mcf ../../$@ .",
|
|
)
|
|
|
|
"""
|
|
Builds the java jar for the java code provided by the GUI2
|
|
"""
|
|
|
|
osgi_jar_with_tests(
|
|
name = "_onos-gui2-base-jar",
|
|
srcs =
|
|
glob([
|
|
"src/main/java/**",
|
|
]) + [
|
|
"//web/gui:onos-gui-java-for-gui2",
|
|
],
|
|
suppress_checkstyle = True,
|
|
test_deps = TEST_DEPS,
|
|
web_context = "/onos/ui2",
|
|
deps = COMPILE_DEPS,
|
|
)
|
|
|
|
"""
|
|
Builds the tar ball for the ONOS GUI2
|
|
"""
|
|
|
|
genrule(
|
|
name = "onos-gui2",
|
|
srcs = [
|
|
":_onos-gui2-ng-build",
|
|
":_onos-gui2-base-jar",
|
|
":_web_inf_classes_files",
|
|
"src/main/webapp/WEB-INF/web.xml",
|
|
],
|
|
outs = ["onos-gui2.jar"],
|
|
cmd = " ROOT=`pwd` &&" +
|
|
" mkdir -p web/gui2/WEB-INF/classes &&" +
|
|
" cd web/gui2 &&" +
|
|
" BUILD_FILES=($(locations :_onos-gui2-ng-build)) &&" + # An array of filenames - sorted by time created
|
|
" for i in $(locations :_web_inf_classes_files); do cp $$ROOT/$$i ./WEB-INF/classes/; done &&" +
|
|
" (cd WEB-INF/classes && jar xf $$ROOT/$${BUILD_FILES[1]}) &&" +
|
|
" jar xf $$ROOT/$(location :_onos-gui2-base-jar) &&" +
|
|
" find . -type f -exec touch -t 201808280000 {} \; &&" +
|
|
" jar cmf META-INF/MANIFEST.MF $$ROOT/$@ WEB-INF/web.xml WEB-INF/classes",
|
|
output_to_bindir = 1,
|
|
visibility = ["//visibility:public"],
|
|
)
|
|
|
|
"""
|
|
Wrap the genrule for testing in a test
|
|
"""
|
|
|
|
sh_test(
|
|
name = "onos-gui2-ng-tests",
|
|
size = "small",
|
|
srcs = [
|
|
":ng-test.sh",
|
|
],
|
|
data = [
|
|
":_onos-gui2-ng-test-genrule",
|
|
],
|
|
deps = [
|
|
"@bazel_tools//tools/bash/runfiles",
|
|
],
|
|
)
|