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/toolchain.py b/api/controller/toolchain.py
index 46bb62d..ab6645a 100644
--- a/api/controller/toolchain.py
+++ b/api/controller/toolchain.py
@@ -9,31 +9,36 @@
 
 import os
 
+from chromite.api import validate
 from chromite.lib import cros_logging as logging
 from chromite.lib import gs
 from chromite.lib import toolchain_util
 
 
-def UpdateChromeEbuildWithOrderfile(input_proto, _output_proto):
+@validate.require('build_target.name')
+@validate.validation_complete
+def UpdateChromeEbuildWithOrderfile(input_proto, _output_proto, _config):
   """Update Chrome ebuild with most recent unvetted orderfile.
 
   Args:
     input_proto (UpdateChromeEbuildRequest): The input proto
-    output_proto (UpdateChromeEbuildResponse): Empty output proto
+    _output_proto (UpdateChromeEbuildResponse): Empty output proto
+    _config (api_config.ApiConfig): The API call config.
   """
 
   board = input_proto.build_target.name
   toolchain_util.OrderfileUpdateChromeEbuild(board)
 
 
-def UploadVettedOrderfile(_input_proto, output_proto):
+@validate.validation_complete
+def UploadVettedOrderfile(_input_proto, output_proto, _config):
   """Upload a vetted orderfile to GS bucket.
 
   Args:
-    input_proto (UploadVettedOrderfileRequest): Empty input proto
+    _input_proto (UploadVettedOrderfileRequest): Empty input proto
     output_proto (UploadVettedOrderfileResponse): The output proto
+    _config (api_config.ApiConfig): The API call config.
   """
-
   gs_context = gs.GSContext()
   orderfile = toolchain_util.FindLatestChromeOrderfile(
       toolchain_util.ORDERFILE_GS_URL_UNVETTED)