Build API: Implement validate_only calls.

Add validate-only support to all existing endpoints and
tests to enforce the setting is respected.
Add is_in validator to help transition some endpoints
to decorator-only validation.
Some cleanup and standardization in the controller tests.

BUG=chromium:987263
TEST=run_tests

Cq-Depend: chromium:1726252
Change-Id: I108dfc1a221847eae47a18f2f60e12d2575c9ea8
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1726253
Reviewed-by: David Burger <dburger@chromium.org>
Commit-Queue: Alex Klein <saklein@chromium.org>
Tested-by: Alex Klein <saklein@chromium.org>
diff --git a/api/controller/packages.py b/api/controller/packages.py
index b314091..090b54c 100644
--- a/api/controller/packages.py
+++ b/api/controller/packages.py
@@ -24,14 +24,11 @@
 }
 
 
-def Uprev(input_proto, output_proto):
+@validate.require('overlay_type')
+@validate.is_in('overlay_type', _OVERLAY_TYPE_TO_NAME)
+@validate.validation_complete
+def Uprev(input_proto, output_proto, _config):
   """Uprev all cros workon ebuilds that have changes."""
-  if not input_proto.overlay_type:
-    cros_build_lib.Die('Overlay type is required.')
-  elif input_proto.overlay_type not in _OVERLAY_TYPE_TO_NAME:
-    cros_build_lib.Die('Overlay type must be one of: %s',
-                       ', '.join(_OVERLAY_TYPE_TO_NAME.values()))
-
   target_names = [t.name for t in input_proto.build_targets]
   build_targets = [build_target_util.BuildTarget(t) for t in target_names]
   overlay_type = _OVERLAY_TYPE_TO_NAME[input_proto.overlay_type]
@@ -48,6 +45,8 @@
   for path in uprevved:
     output_proto.modified_ebuilds.add().path = path
 
+
+@validate.validation_complete
 def UprevVersionedPackage(_input_proto, _output_proto):
   """Uprev a versioned package.
 
@@ -55,8 +54,10 @@
   """
   pass
 
+
 @validate.require('atom')
-def GetBestVisible(input_proto, output_proto):
+@validate.validation_complete
+def GetBestVisible(input_proto, output_proto, _config):
   """Returns the best visible PackageInfo for the indicated atom."""
   cpv = packages.get_best_visible(input_proto.atom)
   package_info = common_pb2.PackageInfo()