Begin implementing GetTargetVersions by porting code to get android
versions.

Regenerated api/gen/chromite/api/packages_pb2.py by running
api/compile_build_api_proto.

BUG=chromium:1004438
TEST=manual, run_tests

Change-Id: I77b669af261248384de96e4079b8cedece40563b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1854566
Reviewed-by: Alex Klein <saklein@chromium.org>
Tested-by: Michael Mortensen <mmortensen@google.com>
Commit-Queue: Michael Mortensen <mmortensen@google.com>
diff --git a/api/controller/packages.py b/api/controller/packages.py
index 04f87bf..3f977cf 100644
--- a/api/controller/packages.py
+++ b/api/controller/packages.py
@@ -117,6 +117,21 @@
   output_proto.has_prebuilt = True
 
 
+@faux.all_empty
+@validate.require('build_target.name')
+@validate.validation_complete
+def GetTargetVersions(input_proto, output_proto, _config):
+  """Returns the target versions."""
+  build_target = controller_util.ParseBuildTarget(input_proto.build_target)
+  output_proto.android_version = packages.determine_android_version(
+      build_target)
+  output_proto.android_branch_version = packages.determine_android_branch(
+      build_target)
+  output_proto.android_target_version = packages.determine_android_target(
+      build_target)
+  # TODO(crbug.com/1004438): Implement remaining version fields.
+
+
 @faux.success(_HasChromePrebuiltSuccess)
 @faux.empty_error
 @validate.require('build_target.name')
diff --git a/api/controller/packages_unittest.py b/api/controller/packages_unittest.py
index b7aa15a..f70845a 100644
--- a/api/controller/packages_unittest.py
+++ b/api/controller/packages_unittest.py
@@ -230,6 +230,46 @@
     self.assertEqual(package_info.version, cpv.version)
 
 
+class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
+  """GetTargetVersions tests."""
+
+  def setUp(self):
+    self.response = packages_pb2.GetTargetVersionsResponse()
+
+  def _GetRequest(self, board=None):
+    """Helper to build out a request."""
+    request = packages_pb2.GetTargetVersionsRequest()
+
+    if board:
+      request.build_target.name = board
+
+    return request
+
+  def testValidateOnly(self):
+    """Sanity check that a validate only call does not execute any logic."""
+    patch_version = self.PatchObject(packages_service,
+                                     'determine_android_version')
+    patch_branch_version = self.PatchObject(packages_service,
+                                            'determine_android_branch')
+    patch_target_version = self.PatchObject(packages_service,
+                                            'determine_android_target')
+
+    request = self._GetRequest(board='betty')
+    packages_controller.GetTargetVersions(request, self.response,
+                                          self.validate_only_config)
+    patch_version.assert_not_called()
+    patch_branch_version.assert_not_called()
+    patch_target_version.assert_not_called()
+
+  def testNoBuildTargetFails(self):
+    """No build target argument should fail."""
+    request = self._GetRequest()
+
+    with self.assertRaises(cros_build_lib.DieSystemExit):
+      packages_controller.GetTargetVersions(request, self.response,
+                                            self.api_config)
+
+
 class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
   """HasChromePrebuilt tests."""