Adding Bazel support for YANG models.

Change-Id: Icdb620bdb99ae9eeb042a84a8ca7563588c813c1
diff --git a/tools/build/bazel/yang.bzl b/tools/build/bazel/yang.bzl
new file mode 100644
index 0000000..c0d77fd
--- /dev/null
+++ b/tools/build/bazel/yang.bzl
@@ -0,0 +1,197 @@
+"""
+ 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.
+"""
+
+load("//tools/build/bazel:generate_workspace.bzl", "CORE_DEPS", "ONOS_YANG")
+load("//tools/build/bazel:osgi_java_library.bzl", "osgi_jar")
+load("//tools/build/bazel:onos_app.bzl", "onos_app")
+load(
+    "//tools/build/bazel:variables.bzl",
+    "APP_PREFIX",
+    "DEFAULT_APP_CATEGORY",
+    "ONOS_ARTIFACT_BASE",
+    "ONOS_GROUP_ID",
+    "ONOS_ORIGIN",
+    "ONOS_VERSION",
+)
+
+REGISTRATOR = \
+    "// Auto-generated code\n" + \
+    "package org.onosproject.model.registrator.impl;\n" + \
+    "\n" + \
+    "import org.onosproject.yang.AbstractYangModelRegistrator;\n" + \
+    "import org.apache.felix.scr.annotations.Component;\n" + \
+    "\n" + \
+    "@Component(immediate = true)\n" + \
+    "public class YangModelRegistrator extends AbstractYangModelRegistrator {\n" + \
+    "    public YangModelRegistrator() {\n" + \
+    "        super(YangModelRegistrator.class);\n" + \
+    "    }\n" + \
+    "}"
+
+REGISTRATOR_FILE = "src/org/onosproject/model/registrator/impl/YangModelRegistrator.java"
+
+# Implementation of the YANG library rule
+def _yang_library_impl(ctx):
+    generated_sources = ctx.actions.declare_directory("generated-sources")
+
+    arguments = [
+        ctx.attr.model_id,
+        generated_sources.path,
+    ]
+    inputs = []
+
+    for dep in ctx.files.deps:
+        arguments += ["-d", dep.path]
+        inputs += [dep]
+
+    for source in ctx.files.srcs:
+        arguments += [source.path]
+        inputs += [source]
+
+    ctx.actions.run(
+        inputs = inputs,
+        outputs = [generated_sources],
+        arguments = arguments,
+        progress_message = "Compiling YANG library: %s" % ctx.attr.name,
+        executable = ctx.executable._yang_compiler,
+    )
+
+    ctx.actions.run_shell(
+        inputs = [generated_sources],
+        outputs = [ctx.outputs.srcjar],
+        arguments = [
+            ctx.outputs.srcjar.path,
+            generated_sources.path,
+        ],
+        command = "jar cf $1 -C $2 src",
+        progress_message = "Assembling YANG Java sources: %s" % ctx.attr.name,
+    )
+
+    ctx.actions.run_shell(
+        inputs = [generated_sources],
+        outputs = [ctx.outputs.schema],
+        arguments = [
+            ctx.outputs.schema.path,
+            generated_sources.path
+        ],
+        command = "jar cf $1 -C $2 schema",
+        progress_message = "Assembling YANG compiled schema: %s" % ctx.attr.name,
+    )
+
+
+# Rule to generate YANG library from the specified set of YANG models.
+_yang_library = rule(
+    attrs = {
+        "deps": attr.label_list(),
+        "srcs": attr.label_list(allow_files = True),
+        "model_id": attr.string(),
+        "_yang_compiler": attr.label(
+            executable = True,
+            cfg = "host",
+            allow_files = True,
+            default = Label("//tools/build/bazel:onos_yang_compiler"),
+        ),
+    },
+    outputs = {
+        "srcjar": "model.srcjar",
+        "schema": "schema.jar",
+    },
+    fragments = ["java"],
+    implementation = _yang_library_impl,
+)
+
+def yang_library(
+    name = None,
+    deps = None,
+    yang_srcs = None,
+    java_srcs = None,
+    custom_registrator = False,
+    visibility = ["//visibility:public"]):
+
+    if name == None:
+        name = "onos-" + native.package_name().replace("/", "-")
+    if yang_srcs == None:
+        yang_srcs = native.glob(["src/main/yang/**/*.yang"])
+    if java_srcs == None:
+        java_srcs = native.glob(["src/main/java/**/*.java"])
+    if deps == None:
+        deps = []
+
+    deps += CORE_DEPS + ONOS_YANG + [
+        "@onos_yang_runtime//jar",
+        "//apps/yang:onos-apps-yang"
+    ]
+
+    # Generate the Java sources from YANG model
+    _yang_library(name = name + "-generate", model_id = name, deps = deps, srcs = yang_srcs)
+
+    srcs = [name + "-generate"]
+
+    if len(java_srcs):
+        srcs += [name + "-srcjar"]
+        native.genrule(
+            name = name + "-srcjar",
+            srcs = java_srcs,
+            outs = [name + ".srcjar"],
+            cmd = "jar cf $(location %s.srcjar) $(SRCS)" % name
+        )
+
+    if not custom_registrator:
+        srcs += [name + "-registrator"]
+        native.genrule(
+            name = name + "-registrator",
+            outs = [REGISTRATOR_FILE],
+            cmd = "echo '%s' > $(location %s)" % (REGISTRATOR, REGISTRATOR_FILE)
+        )
+
+    # Produce a Java library from the generated Java sources
+    osgi_jar(name = name, srcs = srcs,
+             resource_jars = [name + "-generate"], deps = deps,
+             visibility = ["//visibility:public"])
+
+def yang_model(
+    name = None,
+    app_name = None,
+    title = None,
+    description = None,
+    url = "http://onosproject.org/",
+    custom_registrator = False,
+    deps = None,
+    yang_srcs = None,
+    java_srcs = None,
+    required_apps = [],
+    visibility = ["//visibility:public"]):
+
+    if name == None:
+        name = "onos-" + native.package_name().replace("/", "-")
+
+    yang_library(name = name, deps = deps,
+                 yang_srcs = yang_srcs, java_srcs = java_srcs,
+                 custom_registrator = custom_registrator,
+                 visibility = ["//visibility:public"])
+
+    onos_app(
+        app_name = app_name,
+        title = title,
+        description = description,
+        feature_name = name,
+        version = ONOS_VERSION,
+        url = url,
+        category = "Models",
+        included_bundles = [ name ],
+        required_apps = required_apps + ["org.onosproject.yang"],
+        visibility = ["//visibility:public"],
+    )
\ No newline at end of file