Add packages handling to builds call / GetBuildDependency.

Add optional packages contraint in the builds call and
GetBuildDependency call along with routing from the controller to enable
checking the dependency graph in the case of only building a limited
number of packages. See the attached bug for motivation.

TEST=./run_tests
BUG=chromium:1011436

Change-Id: I970e39c2f6dfb0ebb4470f35a5fe65062835881b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1848192
Tested-by: David Burger <dburger@chromium.org>
Reviewed-by: Alex Klein <saklein@chromium.org>
diff --git a/api/controller/packages_unittest.py b/api/controller/packages_unittest.py
index 6a7e305..b7aa15a 100644
--- a/api/controller/packages_unittest.py
+++ b/api/controller/packages_unittest.py
@@ -10,7 +10,9 @@
 import mock
 
 from chromite.api.api_config import ApiConfigMixin
+from chromite.api.controller import controller_util
 from chromite.api.controller import packages as packages_controller
+from chromite.api.gen.chromiumos import common_pb2
 from chromite.api.gen.chromite.api import binhost_pb2
 from chromite.api.gen.chromite.api import packages_pb2
 from chromite.lib import constants
@@ -267,13 +269,16 @@
   def setUp(self):
     self.response = packages_pb2.BuildsChromeResponse()
 
-  def _GetRequest(self, board=None):
+  def _GetRequest(self, board=None, packages=None):
     """Helper to build out a request."""
     request = packages_pb2.BuildsChromeRequest()
 
     if board:
       request.build_target.name = board
 
+    if packages:
+      request.packages.extend(packages)
+
     return request
 
   def testValidateOnly(self):
@@ -299,4 +304,19 @@
     request = self._GetRequest(board='foo')
     packages_controller.BuildsChrome(request, self.response, self.api_config)
     self.assertTrue(self.response.builds_chrome)
-    patch.assert_called_once_with(constants.CHROME_CP, BuildTarget('foo'))
+    patch.assert_called_once_with(constants.CHROME_CP, BuildTarget('foo'), [])
+
+  def testBuildsChromeWithPackages(self):
+    """Test successful call with packages handling."""
+    patch = self.PatchObject(packages_service, 'builds', return_value=True)
+
+    package = common_pb2.PackageInfo(
+        category='category',
+        package_name='name',
+        version='1.01',
+    )
+    request = self._GetRequest(board='foo', packages=[package])
+    packages_controller.BuildsChrome(request, self.response, self.api_config)
+    self.assertTrue(self.response.builds_chrome)
+    patch.assert_called_once_with(constants.CHROME_CP, BuildTarget('foo'),
+                                  [controller_util.PackageInfoToCPV(package)])