afdo: Implement build API of benchmark-afdo-generate builder.

This patch implements the wrapper build API and the core
functionalities in the benchmark-afdo-generate builder.

The implementation is mostly the same as orderfile generation,
so there's some refactoring of the orderfile generation to support
both AFDO and orderfile generation.

BUG=chromium:947345
TEST=Tryjob passed https://ci.chromium.org/p/chromeos/builders/general/Try/b8905015841960278192

Change-Id: I3253dd69054dd108348cab7b2bc9dd19549ae787
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1732051
Commit-Queue: Tiancong Wang <tcwang@google.com>
Tested-by: Tiancong Wang <tcwang@google.com>
Reviewed-by: George Burgess <gbiv@chromium.org>
Reviewed-by: Alex Klein <saklein@chromium.org>
diff --git a/api/controller/artifacts.py b/api/controller/artifacts.py
index 07f0ed4..40b6db8 100644
--- a/api/controller/artifacts.py
+++ b/api/controller/artifacts.py
@@ -12,6 +12,7 @@
 from chromite.api import controller
 from chromite.api import validate
 from chromite.api.controller import controller_util
+from chromite.api.gen.chromite.api import artifacts_pb2
 from chromite.cbuildbot import commands
 from chromite.lib import build_target_util
 from chromite.lib import chroot_lib
@@ -399,26 +400,33 @@
     output_proto.artifacts.add().path = archive
 
 
+_VALID_ARTIFACT_TYPES = [artifacts_pb2.BENCHMARK_AFDO,
+                         artifacts_pb2.ORDERFILE]
 @validate.require('build_target.name', 'output_dir')
+@validate.is_in('artifact_type', _VALID_ARTIFACT_TYPES)
 @validate.exists('output_dir')
 @validate.validation_complete
-def BundleOrderfileGenerationArtifacts(input_proto, output_proto, _config):
-  """Create tarballs of all the artifacts of orderfile_generate builder.
+def BundleAFDOGenerationArtifacts(input_proto, output_proto, _config):
+  """Generic function for creating tarballs of both AFDO and orerfile.
 
   Args:
-    input_proto (BundleRequest): The input proto.
+    input_proto (BundleChromeAFDORequest): The input proto.
     output_proto (BundleResponse): The output proto.
     _config (api_config.ApiConfig): The API call config.
   """
+
   # Required args.
   build_target = build_target_util.BuildTarget(input_proto.build_target.name)
   output_dir = input_proto.output_dir
+  artifact_type = input_proto.artifact_type
 
   chroot = controller_util.ParseChroot(input_proto.chroot)
 
   try:
-    results = artifacts.BundleOrderfileGenerationArtifacts(
-        chroot, build_target, output_dir)
+    is_orderfile = bool(artifact_type is artifacts_pb2.ORDERFILE)
+    results = artifacts.BundleAFDOGenerationArtifacts(
+        is_orderfile, chroot,
+        build_target, output_dir)
   except artifacts.Error as e:
     cros_build_lib.Die('Error %s raised in BundleSimpleChromeArtifacts: %s',
                        type(e), e)