[CodeHealth] Migrate scripts under testing/trigger_scripts to Python3

compatible syntax to permit future migration of all presubmit checks
under testing/ to Python3.

Bug: 1262363
Change-Id: Id39d1fedb106b73a5aa4e4f726e9649cc20e25a4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3472947
Reviewed-by: Mike Pinkerton <[email protected]>
Commit-Queue: Joshua Hood <[email protected]>
Cr-Commit-Position: refs/heads/main@{#976264}
diff --git a/testing/PRESUBMIT.py b/testing/PRESUBMIT.py
index 65f2d62..7ba136f 100644
--- a/testing/PRESUBMIT.py
+++ b/testing/PRESUBMIT.py
@@ -20,7 +20,10 @@
 
   output = []
   output.extend(input_api.canned_checks.RunUnitTestsInDirectory(
-      input_api, output_api, '.', [r'^.+_unittest\.py$']))
+      input_api,
+      output_api,
+      '.',
+      [r'^.+_unittest\.py$']))
   output.extend(input_api.canned_checks.RunUnitTestsInDirectory(
       input_api,
       output_api,
@@ -29,7 +32,16 @@
       [r'^.+_unittest\.py$'],
       env=testing_env))
   output.extend(input_api.canned_checks.RunPylint(
-      input_api, output_api, files_to_skip=[r'gmock.*', r'gtest.*']))
+      input_api,
+      output_api,
+      files_to_skip=[r'gmock.*', r'gtest.*', r'trigger_scripts.*']))
+  # Pylint2.7 is run on subdirs whose presubmit checks are migrated to Python3
+  output.extend(input_api.canned_checks.RunPylint(
+      input_api,
+      output_api,
+      files_to_check=[r'trigger_scripts.*\.py$'],
+      version='2.7'))
+
   return output
 
 
diff --git a/testing/trigger_scripts/base_test_triggerer.py b/testing/trigger_scripts/base_test_triggerer.py
index bdf3ee8b..047f15f 100755
--- a/testing/trigger_scripts/base_test_triggerer.py
+++ b/testing/trigger_scripts/base_test_triggerer.py
@@ -63,7 +63,7 @@
     return obj
 
 
-class BaseTestTriggerer(object):
+class BaseTestTriggerer(object): # pylint: disable=useless-object-inheritance
     def __init__(self):
         self._bot_configs = None
         self._bot_statuses = []
@@ -133,9 +133,9 @@
             self._bot_configs = strip_unicode(
                 json.loads(args.multiple_trigger_configs))
         except Exception as e:
-            raise ValueError(
+            six.raise_from(ValueError(
                 'Error while parsing JSON from bot config string %s: %s' %
-                (args.multiple_trigger_configs, str(e)))
+                (args.multiple_trigger_configs, str(e))), e)
         # Validate the input.
         if not isinstance(self._bot_configs, list):
             raise ValueError('Bot configurations must be a list, were: %s' %
@@ -273,12 +273,11 @@
         triggered."""
         if args.shard_index is None:
             return list(range(args.shards))
-        else:
-            return [args.shard_index]
+        return [args.shard_index]
 
     def generate_shard_map(self, args, buildername, selected_config):
         """Returns shard map generated on runtime if needed."""
-        pass
+        pass # pylint: disable=unnecessary-pass
 
     def trigger_tasks(self, args, remaining):
         """Triggers tasks for each bot.
@@ -316,10 +315,12 @@
         logging.info('DEBUG: After filtered: %s', filtered_remaining_args)
 
         merged_json = {}
+        #pylint: disable=assignment-from-no-return
         selected_config = self.select_config_indices(args)
         shard_map = self.generate_shard_map(
             args, self._findBuilderName(filtered_remaining_args),
             selected_config)
+        #pylint: enable=assignment-from-no-return
         # Choose selected configs for this run of the test suite.
         for shard_index, bot_index in selected_config:
             # For each shard that we're going to distribute, do the following:
@@ -351,12 +352,14 @@
         self.write_json_to_file(merged_json, args.dump_json)
         return 0
 
+    # pylint: disable=inconsistent-return-statements
     def _findBuilderName(self, args):
         args_length = len(args)
         for i in range(args_length):
             if (args[i] == '--tag' and i < args_length - 1
                     and args[i + 1].startswith('buildername:')):
                 return args[i + 1].split(':', 1)[1]
+    # pylint: enable=inconsistent-return-statements
 
     @staticmethod
     def setup_parser_contract(parser):
diff --git a/testing/trigger_scripts/perf_device_trigger.py b/testing/trigger_scripts/perf_device_trigger.py
index 20b14d8..edd7a8d 100755
--- a/testing/trigger_scripts/perf_device_trigger.py
+++ b/testing/trigger_scripts/perf_device_trigger.py
@@ -64,7 +64,7 @@
 from core import bot_platforms
 
 
-class Bot(object):
+class Bot(object):  # pylint: disable=useless-object-inheritance
     """Eligible bots to run the task."""
 
     def __init__(self, bot_id, is_alive):
@@ -83,7 +83,9 @@
 
 class PerfDeviceTriggerer(base_test_triggerer.BaseTestTriggerer):
     def __init__(self, args, swarming_args):
+        # pylint: disable=super-with-arguments
         super(PerfDeviceTriggerer, self).__init__()
+        # pylint: enable=super-with-arguments
         self._sharded_query_failed = False
 
         if not args.multiple_trigger_configs:
@@ -131,12 +133,13 @@
         if '--' in args:
             dash_ind = args.index('--')
             return args[:dash_ind] + shard_tag + args[dash_ind:]
-        else:
-            return args + shard_tag
+        return args + shard_tag
 
     def parse_bot_configs(self, args):
         if args.multiple_trigger_configs:
+            # pylint: disable=super-with-arguments
             super(PerfDeviceTriggerer, self).parse_bot_configs(args)
+            # pylint: enable=super-with-arguments
         else:
             self._bot_configs = []
             # For each eligible bot, append the dimension
@@ -363,6 +366,7 @@
                 dimensions[args[i + 1]] = args[i + 2]
         return dimensions
 
+    # pylint: disable=inconsistent-return-statements
     def _get_swarming_server(self, args):
         for i in range(len(args)):
             if '--swarming' in args[i]:
@@ -370,6 +374,7 @@
                 slashes_index = server.index('//') + 2
                 # Strip out the protocol
                 return server[slashes_index:]
+    # pylint: enable=inconsistent-return-statements
 
 
 def main():
diff --git a/testing/trigger_scripts/perf_device_trigger_unittest.py b/testing/trigger_scripts/perf_device_trigger_unittest.py
index 933f4268..6d6c7c471 100755
--- a/testing/trigger_scripts/perf_device_trigger_unittest.py
+++ b/testing/trigger_scripts/perf_device_trigger_unittest.py
@@ -9,7 +9,7 @@
 import perf_device_trigger
 
 
-class Args(object):
+class Args(object): # pylint: disable=useless-object-inheritance
     def __init__(self):
         self.shards = 1
         self.shard_index = None
@@ -29,7 +29,9 @@
         self._triggered_with_swarming_go = 0
         self._list_bots_result = list_bots_result
         self._list_tasks_results = list_tasks_results
+        # pylint: disable=super-with-arguments
         super(FakeTriggerer, self).__init__(args, swarming_args)
+        # pylint: enable=super-with-arguments
 
     def set_files(self, files):
         self._files = files
@@ -141,8 +143,7 @@
             # out of the tags.
             if shard % 2:
                 return [{'bot_id': bot_id}]
-            else:
-                return [{'tags': ['id:%s' % bot_id]}]
+            return [{'tags': ['id:%s' % bot_id]}]
         return []
 
     def generate_list_of_eligible_bots_query_response(self, alive_bots,