PackageService: add NeedsChromeSource.

Add endpoint to allow the build to check if it needs the chrome
source to avoid callers needing to understand which packages
have that dependency.

BUG=chromium:1086714
TEST=manual

Change-Id: I960a00d122efaa5fe831e6f960179c1878016b5f
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2411177
Tested-by: Alex Klein <saklein@chromium.org>
Reviewed-by: Michael Mortensen <mmortensen@google.com>
Commit-Queue: Alex Klein <saklein@chromium.org>
diff --git a/api/field_handler.py b/api/field_handler.py
index 0eff8c8..ae3571f 100644
--- a/api/field_handler.py
+++ b/api/field_handler.py
@@ -42,7 +42,7 @@
   def __init__(self, clear_field):
     self.clear_field = clear_field
 
-  def handle(self, message):
+  def handle(self, message, recurse=True):
     """Parse a message for a chroot field."""
     # Find the Chroot field. Search for the field by type to prevent it being
     # tied to a naming convention.
@@ -54,6 +54,17 @@
           message.ClearField(descriptor.name)
         return self.parse_chroot(chroot)
 
+    # Recurse down one level. This is handy for meta-endpoints that use another
+    # endpoint's request to produce data for or about the second endpoint.
+    # e.g. PackageService/NeedsChromeSource.
+    if recurse:
+      for descriptor in message.DESCRIPTOR.fields:
+        field = getattr(message, descriptor.name)
+        if isinstance(field, protobuf_message.Message):
+          chroot = self.handle(field, recurse=False)
+          if chroot:
+            return chroot
+
     return None
 
   def parse_chroot(self, chroot_message):