Build API: Add validation decorators.

Simplify the easy proto validation tasks by providing decorators
that can handle the simple validation cases.

BUG=None
TEST=run_tests

Change-Id: Ib799d43c7d0dca5312a58771ff67b610e9ff4f2c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1669636
Reviewed-by: Alex Klein <saklein@chromium.org>
Tested-by: Alex Klein <saklein@chromium.org>
Commit-Queue: Alex Klein <saklein@chromium.org>
Auto-Submit: Alex Klein <saklein@chromium.org>
diff --git a/api/controller/image.py b/api/controller/image.py
index 9b6880b..aaa505b 100644
--- a/api/controller/image.py
+++ b/api/controller/image.py
@@ -13,6 +13,7 @@
 import os
 
 from chromite.api import controller
+from chromite.api import validate
 from chromite.api.gen.chromiumos import common_pb2
 from chromite.lib import cros_build_lib
 from chromite.lib import constants
@@ -42,6 +43,7 @@
 }
 
 
+@validate.require('build_target.name')
 def Create(input_proto, output_proto):
   """Build an image.
 
@@ -50,8 +52,6 @@
     output_proto (image_pb2.CreateImageResult): The output message.
   """
   board = input_proto.build_target.name
-  if not board:
-    cros_build_lib.Die('build_target.name is required.')
 
   # Build the base image if no images provided.
   to_build = input_proto.image_types or [_BASE_ID]
@@ -158,6 +158,8 @@
     new_image.build_target.name = board
 
 
+@validate.require('build_target.name', 'result.directory')
+@validate.exists('image.path')
 def Test(input_proto, output_proto):
   """Run image tests.
 
@@ -169,13 +171,6 @@
   board = input_proto.build_target.name
   result_directory = input_proto.result.directory
 
-  if not board:
-    cros_build_lib.Die('The build_target.name is required.')
-  if not result_directory:
-    cros_build_lib.Die('The result.directory is required.')
-  if not image_path:
-    cros_build_lib.Die('The image.path is required.')
-
   if not os.path.isfile(image_path) or not image_path.endswith('.bin'):
     cros_build_lib.Die(
         'The image.path must be an existing image file with a .bin extension.')