commandline: Remove build-target type.

build_target_lib now requires proto for the prebuilts overhaul.
commandline imports build_target_lib for the build-target type.
wrapper3.py imports commandline.
The compile_build_api_proto wrapper imports proto due to the
import chain above. Failed proto compilations can mean the protos
do not exist, so then generating the next round of protos is
impossible.

This removes the indirect dependency on the protos. The final solution
will be to 1) totally decouple compile_build_api_proto from chromite
-- since it's setting up a component of chromite it shouldn't depend
on it -- and 2) find a better scheme to inject types into the argument
parser rather than having them pre-defined in commandline.

BUG=chromium:1124331, chromium:1124332
TEST=run_tests

Change-Id: Iac776f15357c6f71a439103d54888ea150d416b8
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2390843
Tested-by: Alex Klein <saklein@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Alex Klein <saklein@chromium.org>
diff --git a/api/contrib/gen_call_scripts.py b/api/contrib/gen_call_scripts.py
index 727fd4f..e177751 100644
--- a/api/contrib/gen_call_scripts.py
+++ b/api/contrib/gen_call_scripts.py
@@ -29,6 +29,7 @@
 from chromite.api import message_util
 from chromite.api import router as router_lib
 from chromite.api.gen.chromite.api import build_api_config_pb2
+from chromite.lib import build_target_lib
 from chromite.lib import commandline
 from chromite.lib import cros_logging as logging
 from chromite.lib import osutils
@@ -160,8 +161,7 @@
   parser.add_argument(
       '-b',
       '--build-target',
-      type='build_target',
-      dest='build_target',
+      dest='build_target_name',
       default='amd64-generic',
       help='Generate the configs with the given build target. Implies --force '
            'when generating for a new build target. Defaults to amd64-generic.')
@@ -200,6 +200,7 @@
   parser = GetParser()
   opts = parser.parse_args(argv)
 
+  opts.build_target = build_target_lib.BuildTarget(opts.build_target_name)
   opts.force = opts.force or opts.build_target.name != read_build_target_file()
 
   opts.Freeze()
diff --git a/cli/cros/cros_workon.py b/cli/cros/cros_workon.py
index 11fe7ff..475b1c2 100644
--- a/cli/cros/cros_workon.py
+++ b/cli/cros/cros_workon.py
@@ -16,6 +16,7 @@
 import sys
 
 from chromite.cli import command
+from chromite.lib import build_target_lib
 from chromite.lib import commandline
 from chromite.lib import cros_build_lib
 from chromite.lib import terminal
@@ -94,8 +95,7 @@
         '-b',
         '--board',
         '--build-target',
-        dest='build_target',
-        type='build_target',
+        dest='build_target_name',
         help='The name of the build target whose package is being worked on.')
     target_group.add_argument(
         '--host',
@@ -124,6 +124,12 @@
     return parser
 
   def Run(self):
+    if self.options.build_target_name:
+      self.options.build_target = build_target_lib.BuildTarget(
+          self.options.build_target_name)
+    else:
+      self.options.build_target = None
+
     self.options.Freeze()
 
     has_target = self.options.host or self.options.build_target
diff --git a/lib/commandline.py b/lib/commandline.py
index 1239aee..972126e 100644
--- a/lib/commandline.py
+++ b/lib/commandline.py
@@ -23,7 +23,6 @@
 import six
 from six.moves import urllib
 
-from chromite.lib import build_target_lib
 from chromite.lib import constants
 from chromite.lib import cros_build_lib
 from chromite.lib import cros_collections
@@ -177,16 +176,6 @@
     return NormalizeLocalOrGSPath(value)
 
 
-def ParseBuildTarget(value):
-  """Parse a build target argument into a build target object."""
-  if not build_target_lib.is_valid_name(value):
-    msg = 'Invalid build target name.'
-    logging.error(msg)
-    raise ValueError(msg)
-
-  return build_target_lib.BuildTarget(value)
-
-
 # A Device object holds information parsed from the command line input:
 #   scheme: DEVICE_SCHEME_SSH, DEVICE_SCHEME_USB, DEVICE_SCHEME_SERVO,
 #     or DEVICE_SCHEME_FILE.
@@ -459,7 +448,6 @@
 VALID_TYPES = {
     'ab_url': NormalizeAbUrl,
     'bool': ParseBool,
-    'build_target': ParseBuildTarget,
     'cipd': ValidateCipdURL,
     'date': ParseDate,
     'path': osutils.ExpandPath,
diff --git a/lib/commandline_unittest.py b/lib/commandline_unittest.py
index 6a016ae..d5e1ac9 100644
--- a/lib/commandline_unittest.py
+++ b/lib/commandline_unittest.py
@@ -14,7 +14,6 @@
 import sys
 
 from chromite.cli import command
-from chromite.lib import build_target_lib
 from chromite.lib import commandline
 from chromite.lib import cros_build_lib
 from chromite.lib import cros_logging as logging
@@ -118,35 +117,6 @@
     self._RunBoolTestCase('FaLse', False)
 
 
-class BuildTargetTest(cros_test_lib.TestCase):
-  """Test type='build_target' functionality."""
-
-  @staticmethod
-  def _ParseCommandLine(argv):
-    parser = commandline.ArgumentParser()
-    parser.add_argument('--build-target', type='build_target',
-                        help='Build Target Argument.')
-    return parser.parse_args(argv)
-
-  def _RunBuildTargetTestCase(self, build_target_name, expected):
-    options = self._ParseCommandLine(['--build-target', build_target_name])
-    self.assertEqual(options.build_target, expected)
-
-  def _CheckBuildTargetParseFails(self, build_target_name):
-    """Checks that parsing a device input fails."""
-    with self.assertRaises(SystemExit):
-      self._ParseCommandLine(['--build-target', build_target_name])
-
-  def test_valid_build_target(self):
-    """Test valid build target name."""
-    self._RunBuildTargetTestCase(
-        'build-target-name', build_target_lib.BuildTarget('build-target-name'))
-
-  def test_invalid_build_target(self):
-    """Test invalid build target name."""
-    self._CheckBuildTargetParseFails('invalid-name-!@#$%^&*()+=')
-
-
 class DeviceParseTest(cros_test_lib.OutputTestCase):
   """Test device parsing functionality."""
 
diff --git a/scripts/has_prebuilt.py b/scripts/has_prebuilt.py
index 2ecb222..f96c5fc 100644
--- a/scripts/has_prebuilt.py
+++ b/scripts/has_prebuilt.py
@@ -30,7 +30,7 @@
   parser.add_argument(
       '-b',
       '--build-target',
-      type='build_target',
+      dest='build_target_name',
       help='The build target that is being checked.')
   parser.add_argument(
       '--output',
@@ -71,7 +71,7 @@
   opts = _ParseArguments(argv)
   cros_build_lib.AssertInsideChroot()
 
-  board = opts.build_target.name if opts.build_target else None
+  board = opts.build_target_name
   bests = {}
   for cpv in opts.packages:
     bests[cpv.cp] = portage_util.PortageqBestVisible(cpv.cp, board=board)