service: optimize repetitive android depgraph generation

These android funcs call determine_android_package internally which
turns into a full `emerge -pv virtual/target-os` call which can be
pretty slow.  The calls all do the same exact work each time, so we
end up just wasting CPU cycles.  Hoist the call up a level so we can
share the results and only build the depgraph once.

BUG=chromium:1051161
TEST=CQ passes

Change-Id: I7f9321836e149b9e2072f99893632a186d81e9ec
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2739376
Tested-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Michael Mortensen <mmortensen@google.com>
diff --git a/api/controller/packages.py b/api/controller/packages.py
index dc9d29a..81ee246 100644
--- a/api/controller/packages.py
+++ b/api/controller/packages.py
@@ -159,21 +159,27 @@
 def GetTargetVersions(input_proto, output_proto, _config):
   """Returns the target versions."""
   build_target = controller_util.ParseBuildTarget(input_proto.build_target)
-  # Android version.
-  android_version = packages.determine_android_version(build_target.name)
-  logging.info('Found android version: %s', android_version)
-  if android_version:
-    output_proto.android_version = android_version
-  # Android branch version.
-  android_branch_version = packages.determine_android_branch(build_target.name)
-  logging.info('Found android branch version: %s', android_branch_version)
-  if android_branch_version:
-    output_proto.android_branch_version = android_branch_version
-  # Android target version.
-  android_target_version = packages.determine_android_target(build_target.name)
-  logging.info('Found android target version: %s', android_target_version)
-  if android_target_version:
-    output_proto.android_target_version = android_target_version
+  # Look up the android package here once since the operation is so slow.
+  android_package = packages.determine_android_package(build_target.name)
+  if android_package:
+    # Android version.
+    android_version = packages.determine_android_version(
+        build_target.name, package=android_package)
+    logging.info('Found android version: %s', android_version)
+    if android_version:
+      output_proto.android_version = android_version
+    # Android branch version.
+    android_branch_version = packages.determine_android_branch(
+        build_target.name, package=android_package)
+    logging.info('Found android branch version: %s', android_branch_version)
+    if android_branch_version:
+      output_proto.android_branch_version = android_branch_version
+    # Android target version.
+    android_target_version = packages.determine_android_target(
+        build_target.name, package=android_package)
+    logging.info('Found android target version: %s', android_target_version)
+    if android_target_version:
+      output_proto.android_target_version = android_target_version
 
   # TODO(crbug/1019770): Investigate cases where builds_chrome is true but
   # chrome_version is None.