ONOS-7251 - Initial implementation of fabric.p4 L2 broadcast feature.

Thrift client cherry-picked from the commit dd5792ac9ee38a702c3128a34224852b5c284687

Change-Id: I989f2b2074485a892195889a7c976b518510da88
diff --git a/protocols/bmv2/thrift-api/BUCK b/protocols/bmv2/thrift-api/BUCK
new file mode 100644
index 0000000..b1d766a
--- /dev/null
+++ b/protocols/bmv2/thrift-api/BUCK
@@ -0,0 +1,102 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//lib:libthrift',
+]
+
+# BMV2_COMMIT should be set to the same value as specified in install-p4-tools.sh
+BMV2_COMMIT = 'ed130d01be985d814c17de949839d484e76400b1'
+BMV2_BASEURL = 'https://cdn.rawgit.com/p4lang/behavioral-model/' + BMV2_COMMIT
+BMV2_NAMESPACE = 'org.onosproject.bmv2.thriftapi'
+
+THRIFT_EXE_BASEURL = 'https://cdn.rawgit.com/ccascone/mvn-thrift-compiler/1.1_0.9.3/exe/'
+THRIFT_EXE_SHA1S = {
+    'thrift-linux-x86_64.exe':'9b7b5d6eabc9552b8227e8f63981bc15c0985dd5',
+    'thrift-osx-x86_64.exe':'b9215c5141f56fd277b7cf41d9745af847afe498'
+}
+
+def prebuilt_thrift_compiler():
+    import platform
+    os_name = platform.system().lower()
+    if os_name == 'darwin':
+        os_name = 'osx'
+    arch = '%s-%s' % (os_name, platform.machine())
+    fname = 'thrift-%s.exe' % arch
+    if fname not in THRIFT_EXE_SHA1S:
+        raise Exception('Cannot download thrift compiler, architecture %s not supported' % arch)
+    remote_file(
+        name = 'thrift-binary',
+        out = 'thrift.binary',
+        url = THRIFT_EXE_BASEURL + fname,
+        sha1 = THRIFT_EXE_SHA1S[fname],
+    )
+    genrule (
+        name = 'thrift-exe',
+        srcs = [ ':thrift-binary' ],
+        bash = 'cp $(location :thrift-binary) $OUT && chmod +x $OUT',
+        executable = True,
+        out = 'thrift.exe'
+    )
+
+prebuilt_thrift_compiler()
+
+# TODO: or export local thrift executable
+# export_file(
+#       name = 'thrift-exe',
+#       src = '/usr/bin/thrift',
+#     )
+
+def remote_thrift_def(
+    name,
+    url,
+    sha1):
+    # Download *.thrift definition file.
+    remote_file(
+        name = name + '-rem',
+        out = name + '.thrift',
+        url = url,
+        sha1 = sha1,
+    )
+    # Add java namespace.
+    genrule (
+        name = name+'-ns',
+        srcs = [':' + name + '-rem'],
+        bash = 'cp $(location :' + name + '-rem) $OUT && '
+                + 'echo "namespace java ' + BMV2_NAMESPACE + '" | '
+                + 'cat - $OUT > temp && mv temp $OUT',
+        out = name + '.thrift',
+    )
+    # Generate Java sources.
+    genrule (
+        name = name+'-gen',
+        srcs = [':' + name + '-ns'],
+        # FIXME: is there a better way to get just the output dir of this rule?
+        # ...not the full file path in $OUT
+        cmd = '$(exe :thrift-exe) -o $SRCDIR/../' + name + '-gen '
+                + '--gen java $SRCDIR/' + name + '.thrift',
+        out = 'gen-java',
+    )
+    # Zip them.
+    zip_file(
+        name = name,
+        out = name + '.src.zip',
+        srcs = [':' + name + '-gen']
+    )
+
+
+remote_thrift_def(
+    name = 'simple_pre_lag',
+    url = BMV2_BASEURL + '/thrift_src/simple_pre_lag.thrift',
+    sha1 = 'f468ebebc7bb8577f11ca950939f34add5f5634c',
+)
+
+osgi_jar(
+    # If a source ending with *.src.zip is passed, Buck automatically looks for *.java files inside.
+    srcs = [':simple_pre_lag'],
+    deps = COMPILE_DEPS,
+    do_javadocs = False,
+    do_checkstyle = False
+)
+
+project_config(
+    src_target = ':onos-protocols-bmv2-thrift-api'
+)
\ No newline at end of file