[build api] Add proto that represents the depgraph.

BUG=chromium:917174
TEST=unittests, run: `./api/build_api
chromite.api.DependencyService/GetBuildDependencyGraph --input-json=input.json --output-json=output.json`

Change-Id: Ic489343fac3ab673d5844d5f8295d7e624352fe6
Reviewed-on: https://chromium-review.googlesource.com/1478371
Commit-Ready: Ned Nguyen <nednguyen@google.com>
Tested-by: Ned Nguyen <nednguyen@google.com>
Reviewed-by: Ned Nguyen <nednguyen@google.com>
Reviewed-by: Alex Klein <saklein@chromium.org>
diff --git a/api/service/board_build_dependency.py b/api/service/board_build_dependency.py
index 8358dfe..93f35dc 100644
--- a/api/service/board_build_dependency.py
+++ b/api/service/board_build_dependency.py
@@ -11,10 +11,43 @@
 
 from __future__ import print_function
 
-import json
-
+from chromite.api.gen import depgraph_pb2
 from chromite.lib.api import dependency
+from chromite.lib import portage_util
 
+from google.protobuf import json_format
+
+
+def CreateDepGraphProtoFromJsonMap(json_map):
+  """Return the depgraph proto message from package deps json map.
+
+  Args:
+    json_map: the json object that stores the portage package. This is
+      generated from chromite.lib.api.dependency.GetBuildDependency()
+  """
+  graph = depgraph_pb2.DepGraph()
+  graph.build_target.name = json_map['target_board']
+
+  for data in json_map['package_deps'].itervalues():
+    package_dep_info = graph.package_deps.add()
+    package_info = package_dep_info.package_info
+    package_info.package_name = data['name']
+    package_info.category = data['category']
+    package_info.version = data['version']
+    for dep in data['deps']:
+      cpv = portage_util.SplitCPV(dep, strict=False)
+      dep_package = package_dep_info.dependency_packages.add()
+      dep_package.package_name = cpv.package
+      dep_package.category = cpv.category
+      if cpv.version:
+        dep_package.version = cpv.version
+
+    package_CP = '%s/%s' % (package_info.category, package_info.package_name)
+    for path in json_map['source_path_mapping'][package_CP]:
+      source_path = package_dep_info.dependency_source_paths.add()
+      source_path.path = path
+
+  return graph
 
 def GetBuildDependencyGraph(input_proto, output_proto):
   """Create the build dependency graph.
@@ -29,8 +62,12 @@
   assert board, 'Missing build target name'
   assert output_path, 'Missing output file'
 
+
   json_map = dependency.GetBuildDependency(board)
+  graph = CreateDepGraphProtoFromJsonMap(json_map)
+
   with open(output_path, 'w') as f:
-    json.dump(json_map, f, indent=2, sort_keys=True)
+    f.write(
+        json_format.MessageToJson(graph, including_default_value_fields=True))
 
   output_proto.build_dependency_graph_file = output_path