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/artifacts.py b/api/controller/artifacts.py
index 2181173..ddee4f6 100644
--- a/api/controller/artifacts.py
+++ b/api/controller/artifacts.py
@@ -9,6 +9,7 @@
 
 import os
 
+from chromite.api import validate
 from chromite.api.controller import controller_util
 from chromite.cbuildbot import commands
 from chromite.cbuildbot.stages import vm_test_stages
@@ -310,6 +311,8 @@
     output_proto.artifacts.add().path = file_name
 
 
+@validate.require('chroot.path', 'sysroot.path', 'test_results_dir',
+                  'output_dir')
 def BundleVmFiles(input_proto, output_proto):
   """Tar VM disk and memory files.
 
@@ -318,23 +321,12 @@
     output_proto (BundleResponse): The output proto.
   """
   chroot = input_proto.chroot.path
-  sysroot = input_proto.sysroot.path
-  test_results_dir = input_proto.test_results_dir
+  sysroot = input_proto.sysroot.path.lstrip(os.sep)
+  test_results_dir = input_proto.test_results_dir.lstrip(os.sep)
   output_dir = input_proto.output_dir
 
-  if not chroot:
-    cros_build_lib.Die('chroot.path is required.')
-  if not sysroot:
-    cros_build_lib.Die('sysroot.path is required.')
-  if not test_results_dir:
-    cros_build_lib.Die('test_results_dir is required.')
-  if not output_dir:
-    cros_build_lib.Die('output_dir is required.')
-
   # TODO(crbug.com/954344): Replace with a chromite/service implementation.
-  sysroot = sysroot.lstrip(os.sep)
-  result_dir = test_results_dir.lstrip(os.sep)
-  image_dir = os.path.join(chroot, sysroot, result_dir)
+  image_dir = os.path.join(chroot, sysroot, test_results_dir)
   archives = vm_test_stages.ArchiveVMFilesFromImageDir(image_dir, output_dir)
   for archive in archives:
     output_proto.artifacts.add().path = archive