Reland "Build API: Refactor service/lib and commands.py to use artifacts.BundleFirmware"

This reverts commit 568ec138fbbc3d967f8bf934b13007ad728bd1dd to reland
the BUILD API refactor but now directly calls the service rather than calling
the Build API -- this avoids tip of tree code trying to execute old code via
Build API invocation. This change also takes advantage of the @validate
library.

Reason for revert: Reland refactor in a way that avoids breaking legacy
builder.

BUG=chromium:954300
TEST=manual, run_tests

Original change's description:
> Revert "Build API: Refactor service/lib and commands.py to use artifacts.BundleFirmware"
>
> BUG=b:136134313
> TEST=manual, run_tests
>
> This reverts commit 3df9c76a49990d758076452ea8aef60da7916085.
>
> Reason for revert: Causing failures for atlas (b/136134313)
>
> Original change's description:
> > Build API: Refactor service/lib and commands.py to use artifacts.BundleFirmware
> >
> > BUG=chromium:954300
> > TEST=manual, run_tests
> >
> > Change-Id: I50d45449ed775cd8a1fc563f678a4f773a7cbd98
> > Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1667502
> > Tested-by: Michael Mortensen <mmortensen@google.com>
> > Reviewed-by: Andrew Lamb <andrewlamb@chromium.org>
> > Reviewed-by: Alex Klein <saklein@chromium.org>
> > Commit-Queue: Michael Mortensen <mmortensen@google.com>
>
> Bug: chromium:954300
> Change-Id: I8fde3807bf6fff767d90d11739cf01db47d5503b
> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1680449
> Reviewed-by: Alex Klein <saklein@chromium.org>
> Reviewed-by: David Burger <dburger@chromium.org>
> Commit-Queue: Alex Klein <saklein@chromium.org>
> Commit-Queue: Michael Mortensen <mmortensen@google.com>
> Tested-by: Michael Mortensen <mmortensen@google.com>

Bug: b:136134313, chromium:954300
Change-Id: I980a4a38340ff4ebb36f1cbc29567cd9895ba0c1
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1681002
Tested-by: Michael Mortensen <mmortensen@google.com>
Reviewed-by: Alex Klein <saklein@chromium.org>
Reviewed-by: Andrew Lamb <andrewlamb@chromium.org>
Commit-Queue: Michael Mortensen <mmortensen@google.com>
diff --git a/api/controller/artifacts_unittest.py b/api/controller/artifacts_unittest.py
index d4e5631..a9a1cb7 100644
--- a/api/controller/artifacts_unittest.py
+++ b/api/controller/artifacts_unittest.py
@@ -30,6 +30,9 @@
     self.input_proto.build_target.name = 'target'
     self.input_proto.output_dir = '/tmp/artifacts'
     self.output_proto = artifacts_pb2.BundleResponse()
+    self.sysroot_input_proto = artifacts_pb2.BundleRequest()
+    self.sysroot_input_proto.sysroot.path = '/tmp/sysroot'
+    self.sysroot_input_proto.output_dir = '/tmp/artifacts'
 
     self.PatchObject(constants, 'SOURCE_ROOT', new='/cros')
 
@@ -244,16 +247,25 @@
 class BundleFirmwareTest(BundleTestCase):
   """Unittests for BundleFirmware."""
 
+  def setUp(self):
+    self.sysroot_path = '/build/target'
+    # Empty input_proto object.
+    self.input_proto = artifacts_pb2.BundleRequest()
+    # Input proto object with sysroot.path and output_dir set up when invoking
+    # the controller BundleFirmware method which will validate proto fields.
+    self.sysroot_input_proto = artifacts_pb2.BundleRequest()
+    self.sysroot_input_proto.sysroot.path = '/tmp/sysroot'
+    self.sysroot_input_proto.output_dir = '/tmp/artifacts'
+    self.output_proto = artifacts_pb2.BundleResponse()
+
   def testBundleFirmware(self):
     """BundleFirmware calls cbuildbot/commands with correct args."""
-    build_firmware_archive = self.PatchObject(
-        commands, 'BuildFirmwareArchive', return_value='firmware.tar.gz')
-    artifacts.BundleFirmware(self.input_proto, self.output_proto)
+    self.PatchObject(artifacts_svc,
+                     'BuildFirmwareArchive', return_value='firmware.tar.gz')
+    artifacts.BundleFirmware(self.sysroot_input_proto, self.output_proto)
     self.assertEqual(
         [artifact.path for artifact in self.output_proto.artifacts],
         ['/tmp/artifacts/firmware.tar.gz'])
-    self.assertEqual(build_firmware_archive.call_args_list,
-                     [mock.call('/cros', 'target', '/tmp/artifacts')])
 
   def testBundleFirmwareNoLogs(self):
     """BundleFirmware dies when no firmware found."""