api: migrate to python3 only [reland]

Convert all the API modules to require Python 3.6.  These only get
imported by two programs, and we've migrated those to Python 3.6.
We omit chromite.api.gen for now because that is widely imported
by other programs that still support Python 2.

We fixed the breakage in the service layer so we can reland this.

BUG=chromium:997354, chromium:1052524
TEST=`./run_tests` passes

Change-Id: Ia0bdfd8740bd82f3b16ed8955ac0c4e3e8128bf2
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2058045
Reviewed-by: Alex Klein <saklein@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
diff --git a/api/controller/android.py b/api/controller/android.py
index cbddc71..d216afc 100644
--- a/api/controller/android.py
+++ b/api/controller/android.py
@@ -8,6 +8,7 @@
 from __future__ import print_function
 
 import os
+import sys
 
 from chromite.api import faux
 from chromite.api import validate
@@ -19,6 +20,9 @@
 from chromite.service import packages
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 ANDROIDPIN_MASK_PATH = os.path.join(constants.SOURCE_ROOT,
                                     constants.CHROMIUMOS_OVERLAY_DIR,
                                     'profiles', 'default', 'linux',
diff --git a/api/controller/android_unittest b/api/controller/android_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/android_unittest
+++ b/api/controller/android_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/android_unittest.py b/api/controller/android_unittest.py
index 4e5d65c..2a53c74 100644
--- a/api/controller/android_unittest.py
+++ b/api/controller/android_unittest.py
@@ -7,6 +7,8 @@
 
 from __future__ import print_function
 
+import sys
+
 import mock
 
 from chromite.api import api_config
@@ -21,6 +23,9 @@
 from chromite.service import packages
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class MarkStableTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
   """Unittests for MarkStable."""
 
diff --git a/api/controller/api.py b/api/controller/api.py
index e0c5d5a..117de05 100644
--- a/api/controller/api.py
+++ b/api/controller/api.py
@@ -7,10 +7,15 @@
 
 from __future__ import print_function
 
+import sys
+
 from chromite.api import faux
 from chromite.api import router as router_lib
 from chromite.api import validate
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 # API version number.
 # The major version MUST be updated on breaking changes.
 VERSION_MAJOR = 1
diff --git a/api/controller/api_unittest b/api/controller/api_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/api_unittest
+++ b/api/controller/api_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/api_unittest.py b/api/controller/api_unittest.py
index 040cd75..c2ad971 100644
--- a/api/controller/api_unittest.py
+++ b/api/controller/api_unittest.py
@@ -7,6 +7,8 @@
 
 from __future__ import print_function
 
+import sys
+
 from chromite.api import api_config
 from chromite.api import router
 from chromite.api.controller import api as api_controller
@@ -14,6 +16,9 @@
 from chromite.lib import cros_test_lib
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class GetMethodsTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
   """GetMethods tests."""
 
diff --git a/api/controller/artifacts.py b/api/controller/artifacts.py
index 4a69f6f..c7f3793 100644
--- a/api/controller/artifacts.py
+++ b/api/controller/artifacts.py
@@ -8,6 +8,7 @@
 from __future__ import print_function
 
 import os
+import sys
 
 from chromite.api import controller
 from chromite.api import faux
@@ -24,6 +25,9 @@
 from chromite.service import artifacts
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 def _GetImageDir(build_root, target):
   """Return path containing images for the given build target.
 
diff --git a/api/controller/artifacts_unittest b/api/controller/artifacts_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/artifacts_unittest
+++ b/api/controller/artifacts_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/artifacts_unittest.py b/api/controller/artifacts_unittest.py
index a3b8f19..5f44e13 100644
--- a/api/controller/artifacts_unittest.py
+++ b/api/controller/artifacts_unittest.py
@@ -9,6 +9,7 @@
 
 import collections
 import os
+import sys
 
 import mock
 
@@ -26,6 +27,9 @@
 from chromite.service import artifacts as artifacts_svc
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 PinnedGuestImage = collections.namedtuple('PinnedGuestImage',
                                           ['filename', 'uri'])
 
diff --git a/api/controller/binhost.py b/api/controller/binhost.py
index 0721649..1e231f1 100644
--- a/api/controller/binhost.py
+++ b/api/controller/binhost.py
@@ -9,6 +9,7 @@
 
 import os
 import shutil
+import sys
 
 from six.moves import urllib
 
@@ -24,6 +25,10 @@
 from chromite.lib import sysroot_lib
 from chromite.service import binhost
 
+
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 _OVERLAY_TYPE_TO_NAME = {
     binhost_pb2.OVERLAYTYPE_PUBLIC: constants.PUBLIC_OVERLAYS,
     binhost_pb2.OVERLAYTYPE_PRIVATE: constants.PRIVATE_OVERLAYS,
diff --git a/api/controller/binhost_unittest b/api/controller/binhost_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/binhost_unittest
+++ b/api/controller/binhost_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/binhost_unittest.py b/api/controller/binhost_unittest.py
index e494c64..ddd5889 100644
--- a/api/controller/binhost_unittest.py
+++ b/api/controller/binhost_unittest.py
@@ -8,6 +8,8 @@
 from __future__ import print_function
 
 import os
+import sys
+
 import mock
 
 from chromite.api import api_config
@@ -19,6 +21,9 @@
 from chromite.service import binhost as binhost_service
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class GetBinhostsTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
   """Unittests for GetBinhosts."""
 
diff --git a/api/controller/controller_util.py b/api/controller/controller_util.py
index ba4031b..3b1bf52 100644
--- a/api/controller/controller_util.py
+++ b/api/controller/controller_util.py
@@ -7,6 +7,8 @@
 
 from __future__ import print_function
 
+import sys
+
 from chromite.api.gen.chromiumos import common_pb2
 from chromite.cbuildbot import goma_util
 from chromite.lib import constants
@@ -15,6 +17,9 @@
 from chromite.lib.chroot_lib import Chroot
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class Error(Exception):
   """Base error class for the module."""
 
diff --git a/api/controller/controller_util_unittest b/api/controller/controller_util_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/controller_util_unittest
+++ b/api/controller/controller_util_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/controller_util_unittest.py b/api/controller/controller_util_unittest.py
index 687a478..7202c0d 100644
--- a/api/controller/controller_util_unittest.py
+++ b/api/controller/controller_util_unittest.py
@@ -7,6 +7,8 @@
 
 from __future__ import print_function
 
+import sys
+
 from chromite.api.controller import controller_util
 from chromite.api.gen.chromite.api import build_api_test_pb2
 from chromite.api.gen.chromiumos import common_pb2
@@ -16,6 +18,9 @@
 from chromite.lib.chroot_lib import Chroot
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class ParseChrootTest(cros_test_lib.MockTestCase):
   """ParseChroot tests."""
 
diff --git a/api/controller/dependency.py b/api/controller/dependency.py
index 2f725fb..ea243c1 100644
--- a/api/controller/dependency.py
+++ b/api/controller/dependency.py
@@ -11,6 +11,8 @@
 
 from __future__ import print_function
 
+import sys
+
 from chromite.api import faux
 from chromite.api import validate
 from chromite.api.controller import controller_util
@@ -18,6 +20,9 @@
 from chromite.service import dependency
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 def AugmentDepGraphProtoFromJsonMap(json_map, graph):
   """Augment package deps from |json_map| to graph object.
 
diff --git a/api/controller/dependency_unittest b/api/controller/dependency_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/dependency_unittest
+++ b/api/controller/dependency_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/dependency_unittest.py b/api/controller/dependency_unittest.py
index a350a24..7713fa9 100644
--- a/api/controller/dependency_unittest.py
+++ b/api/controller/dependency_unittest.py
@@ -6,6 +6,8 @@
 
 from __future__ import print_function
 
+import sys
+
 from chromite.api import api_config
 from chromite.api.controller import controller_util
 from chromite.api.controller import dependency
@@ -15,6 +17,9 @@
 from chromite.service import dependency as dependency_service
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class BoardBuildDependencyTest(cros_test_lib.MockTestCase,
                                api_config.ApiConfigMixin):
   """Unittests for board_build_dependency."""
diff --git a/api/controller/image.py b/api/controller/image.py
index 937d582..66fc9a6 100644
--- a/api/controller/image.py
+++ b/api/controller/image.py
@@ -11,6 +11,7 @@
 from __future__ import print_function
 
 import os
+import sys
 
 from chromite.api import controller
 from chromite.api import faux
@@ -23,6 +24,10 @@
 from chromite.service import image
 from chromite.utils import metrics
 
+
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 # The image.proto ImageType enum ids.
 _BASE_ID = common_pb2.BASE
 _DEV_ID = common_pb2.DEV
diff --git a/api/controller/image_unittest b/api/controller/image_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/image_unittest
+++ b/api/controller/image_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/image_unittest.py b/api/controller/image_unittest.py
index 56de3c3..793f19c 100644
--- a/api/controller/image_unittest.py
+++ b/api/controller/image_unittest.py
@@ -8,6 +8,7 @@
 from __future__ import print_function
 
 import os
+import sys
 
 import mock
 
@@ -24,6 +25,9 @@
 from chromite.service import image as image_service
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class CreateTest(cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin):
   """Create image tests."""
 
diff --git a/api/controller/packages.py b/api/controller/packages.py
index 43ee02a..541e715 100644
--- a/api/controller/packages.py
+++ b/api/controller/packages.py
@@ -7,6 +7,8 @@
 
 from __future__ import print_function
 
+import sys
+
 from chromite.api import faux
 from chromite.api import validate
 from chromite.api.controller import controller_util
@@ -20,6 +22,9 @@
 from chromite.service import packages
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 _OVERLAY_TYPE_TO_NAME = {
     binhost_pb2.OVERLAYTYPE_PUBLIC: constants.PUBLIC_OVERLAYS,
     binhost_pb2.OVERLAYTYPE_PRIVATE: constants.PRIVATE_OVERLAYS,
diff --git a/api/controller/packages_unittest b/api/controller/packages_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/packages_unittest
+++ b/api/controller/packages_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/packages_unittest.py b/api/controller/packages_unittest.py
index fc71c60..1404a6a 100644
--- a/api/controller/packages_unittest.py
+++ b/api/controller/packages_unittest.py
@@ -7,6 +7,8 @@
 
 from __future__ import print_function
 
+import sys
+
 import mock
 
 from chromite.api.api_config import ApiConfigMixin
@@ -23,6 +25,9 @@
 from chromite.service import packages as packages_service
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class UprevTest(cros_test_lib.MockTestCase, ApiConfigMixin):
   """Uprev tests."""
 
diff --git a/api/controller/payload.py b/api/controller/payload.py
index 7b85f17..8b7e934 100644
--- a/api/controller/payload.py
+++ b/api/controller/payload.py
@@ -7,6 +7,8 @@
 
 from __future__ import print_function
 
+import sys
+
 from chromite.api import controller
 from chromite.lib import cros_build_lib
 from chromite.api import faux
@@ -14,6 +16,9 @@
 from chromite.service import payload
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 _VALID_IMAGE_PAIRS = (('src_signed_image', 'tgt_signed_image'),
                       ('src_unsigned_image', 'tgt_unsigned_image'),
                       ('full_update', 'tgt_unsigned_image'),
diff --git a/api/controller/payload_unittest b/api/controller/payload_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/payload_unittest
+++ b/api/controller/payload_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/payload_unittest.py b/api/controller/payload_unittest.py
index d161b99..a0086aa 100644
--- a/api/controller/payload_unittest.py
+++ b/api/controller/payload_unittest.py
@@ -7,6 +7,8 @@
 
 from __future__ import print_function
 
+import sys
+
 from chromite.api import api_config
 from chromite.api import controller
 from chromite.api.controller import payload
@@ -16,6 +18,9 @@
 from chromite.lib.paygen import paygen_payload_lib
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class PayloadApiTests(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
   """Unittests for SetBinhost."""
 
diff --git a/api/controller/sdk.py b/api/controller/sdk.py
index a627702..ffa7cad 100644
--- a/api/controller/sdk.py
+++ b/api/controller/sdk.py
@@ -8,6 +8,7 @@
 from __future__ import print_function
 
 import os
+import sys
 
 from chromite.api import controller
 from chromite.api import faux
@@ -17,6 +18,9 @@
 from chromite.service import sdk
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 def _ChrootVersionResponse(_input_proto, output_proto, _config):
   """Add a fake chroot version to a successful response."""
   output_proto.version.version = 168
diff --git a/api/controller/sdk_unittest b/api/controller/sdk_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/sdk_unittest
+++ b/api/controller/sdk_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/sdk_unittest.py b/api/controller/sdk_unittest.py
index b8e11b4..09147ba 100644
--- a/api/controller/sdk_unittest.py
+++ b/api/controller/sdk_unittest.py
@@ -7,6 +7,8 @@
 
 from __future__ import print_function
 
+import sys
+
 import mock
 
 from chromite.api import api_config
@@ -17,6 +19,9 @@
 from chromite.service import sdk as sdk_service
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class SdkCreateTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
   """Create tests."""
 
diff --git a/api/controller/sysroot.py b/api/controller/sysroot.py
index 4c21eca..25f712c 100644
--- a/api/controller/sysroot.py
+++ b/api/controller/sysroot.py
@@ -8,6 +8,7 @@
 from __future__ import print_function
 
 import os
+import sys
 
 from chromite.api import controller
 from chromite.api import faux
@@ -24,6 +25,10 @@
 from chromite.service import sysroot
 from chromite.utils import metrics
 
+
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 _ACCEPTED_LICENSES = '@CHROMEOS'
 
 
diff --git a/api/controller/sysroot_unittest b/api/controller/sysroot_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/sysroot_unittest
+++ b/api/controller/sysroot_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/sysroot_unittest.py b/api/controller/sysroot_unittest.py
index cd335ee..789f4f8 100644
--- a/api/controller/sysroot_unittest.py
+++ b/api/controller/sysroot_unittest.py
@@ -9,6 +9,7 @@
 
 import datetime
 import os
+import sys
 
 from chromite.api import api_config
 from chromite.api import controller
@@ -24,6 +25,9 @@
 from chromite.service import sysroot as sysroot_service
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class CreateTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
   """Create function tests."""
 
diff --git a/api/controller/test.py b/api/controller/test.py
index 43d5399..5a7ecdb 100644
--- a/api/controller/test.py
+++ b/api/controller/test.py
@@ -11,6 +11,7 @@
 from __future__ import print_function
 
 import os
+import sys
 
 from chromite.api import controller
 from chromite.api import faux
@@ -32,6 +33,9 @@
 from chromite.utils import metrics
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 @faux.empty_success
 @faux.empty_completed_unsuccessfully_error
 def DebugInfoTest(input_proto, _output_proto, config):
diff --git a/api/controller/test_unittest b/api/controller/test_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/test_unittest
+++ b/api/controller/test_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/test_unittest.py b/api/controller/test_unittest.py
index 156a3d2..b0a36dc 100644
--- a/api/controller/test_unittest.py
+++ b/api/controller/test_unittest.py
@@ -7,9 +7,10 @@
 
 from __future__ import print_function
 
-import os
-
 import contextlib
+import os
+import sys
+
 import mock
 
 from chromite.api import api_config
@@ -28,6 +29,9 @@
 from chromite.utils import key_value_store
 
 
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 class DebugInfoTestTest(cros_test_lib.MockTempDirTestCase,
                         api_config.ApiConfigMixin):
   """Tests for the DebugInfoTest function."""
diff --git a/api/controller/toolchain.py b/api/controller/toolchain.py
index 9a809cc..56d2129 100644
--- a/api/controller/toolchain.py
+++ b/api/controller/toolchain.py
@@ -8,6 +8,7 @@
 from __future__ import print_function
 
 import collections
+import sys
 
 from chromite.api import controller
 from chromite.api import faux
@@ -18,6 +19,10 @@
 from chromite.lib import cros_logging as logging
 from chromite.lib import toolchain_util
 
+
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 # TODO(crbug/1019868): Add handlers as needed.
 _Handlers = collections.namedtuple('_Handlers', ['name', 'prepare', 'bundle'])
 _TOOLCHAIN_ARTIFACT_HANDLERS = {
diff --git a/api/controller/toolchain_unittest b/api/controller/toolchain_unittest
index ef3e37b..9ba0b80 120000
--- a/api/controller/toolchain_unittest
+++ b/api/controller/toolchain_unittest
@@ -1 +1 @@
-../../scripts/wrapper.py
\ No newline at end of file
+../../scripts/wrapper3.py
\ No newline at end of file
diff --git a/api/controller/toolchain_unittest.py b/api/controller/toolchain_unittest.py
index 6e51625..a139c25 100644
--- a/api/controller/toolchain_unittest.py
+++ b/api/controller/toolchain_unittest.py
@@ -7,6 +7,8 @@
 
 from __future__ import print_function
 
+import sys
+
 from chromite.api import api_config
 from chromite.api import controller
 from chromite.api.controller import toolchain
@@ -20,6 +22,10 @@
 from chromite.lib import cros_test_lib
 from chromite.lib import toolchain_util
 
+
+assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
+
+
 # pylint: disable=protected-access
 
 class UpdateEbuildWithAFDOArtifactsTest(cros_test_lib.MockTestCase,