Swarming bots: Add support for perf steps
authorborenet <borenet@google.com>
Wed, 2 Mar 2016 16:06:27 +0000 (08:06 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 2 Mar 2016 16:06:27 +0000 (08:06 -0800)
NOTRY=true
BUG=skia:4763
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1754843002

Review URL: https://codereview.chromium.org/1754843002

infra/bots/common.py
infra/bots/perf_skia.isolate [new file with mode: 0644]
infra/bots/perf_skia.py [new file with mode: 0644]

index b387777..b532d5d 100644 (file)
@@ -276,7 +276,8 @@ class BotInfo(object):
         flat.append(self.bot_cfg[k])
     return flat
 
-  def test_steps(self, got_revision, master_name, slave_name, build_number):
+  def test_steps(self, got_revision, master_name, slave_name, build_number,
+                 issue=None, patchset=None):
     """Run the DM test."""
     self.build_number = build_number
     self.got_revision = got_revision
@@ -319,9 +320,13 @@ class BotInfo(object):
       'build_number', self.build_number,
     ]
     if self.is_trybot:
+      if not issue:
+        raise Exception('issue is required for trybots.')
+      if not patchset:
+        raise Exception('patchset is required for trybots.')
       properties.extend([
-        'issue',    self.m.properties['issue'],
-        'patchset', self.m.properties['patchset'],
+        'issue',    issue,
+        'patchset', patchset,
       ])
 
     args = [
@@ -361,10 +366,91 @@ class BotInfo(object):
 
     # See skia:2789.
     if ('Valgrind' in self.name and
-        self.builder_cfg.get('cpu_or_gpu') == 'GPU'):
+        self.bot_cfg.get('cpu_or_gpu') == 'GPU'):
       abandonGpuContext = list(args)
       abandonGpuContext.append('--abandonGpuContext')
       self.flavor.run(abandonGpuContext)
       preAbandonGpuContext = list(args)
       preAbandonGpuContext.append('--preAbandonGpuContext')
       self.flavor.run(preAbandonGpuContext)
+
+    self.flavor.cleanup_steps()
+
+  def perf_steps(self, got_revision, master_name, slave_name, build_number,
+                 issue=None, patchset=None):
+    """Run Skia benchmarks."""
+    self.build_number = build_number
+    self.got_revision = got_revision
+    self.master_name = master_name
+    self.slave_name = slave_name
+    self._run_once(self.install)
+    if self.upload_perf_results:
+      self.flavor.create_clean_device_dir(self.device_dirs.perf_data_dir)
+
+    # Run nanobench.
+    properties = [
+      '--properties',
+      'gitHash',      self.got_revision,
+      'build_number', self.build_number,
+    ]
+    if self.is_trybot:
+      if not issue:
+        raise Exception('issue is required for trybots.')
+      if not patchset:
+        raise Exception('patchset is required for trybots.')
+      properties.extend([
+        'issue',    issue,
+        'patchset', patchset,
+      ])
+
+    target = 'nanobench'
+    if 'VisualBench' in self.name:
+      target = 'visualbench'
+    args = [
+        target,
+        '--undefok',   # This helps branches that may not know new flags.
+        '-i',       self.device_dirs.resource_dir,
+        '--skps',   self.device_dirs.skp_dir,
+        '--images', self.flavor.device_path_join(
+            self.device_dirs.images_dir, 'dm'),  # Using DM images for now.
+    ]
+
+    skip_flag = None
+    if self.bot_cfg.get('cpu_or_gpu') == 'CPU':
+      skip_flag = '--nogpu'
+    elif self.bot_cfg.get('cpu_or_gpu') == 'GPU':
+      skip_flag = '--nocpu'
+    if skip_flag:
+      args.append(skip_flag)
+    args.extend(self.nanobench_flags)
+
+    if self.upload_perf_results:
+      json_path = self.flavor.device_path_join(
+          self.device_dirs.perf_data_dir,
+          'nanobench_%s.json' % self.got_revision)
+      args.extend(['--outResultsFile', json_path])
+      args.extend(properties)
+
+      keys_blacklist = ['configuration', 'role', 'is_trybot']
+      args.append('--key')
+      for k in sorted(self.bot_cfg.keys()):
+        if not k in keys_blacklist:
+          args.extend([k, self.bot_cfg[k]])
+
+    self.flavor.run(args, env=self.default_env)
+
+    # See skia:2789.
+    if ('Valgrind' in self.name and
+        self.bot_cfg.get('cpu_or_gpu') == 'GPU'):
+      abandonGpuContext = list(args)
+      abandonGpuContext.extend(['--abandonGpuContext', '--nocpu'])
+      self.flavor.run(abandonGpuContext, env=self.default_env)
+
+    # Copy results to host.
+    if self.upload_perf_results:
+      if not os.path.exists(self.perf_data_dir):
+        os.makedirs(self.perf_data_dir)
+      self.flavor.copy_directory_contents_to_host(
+          self.device_dirs.perf_data_dir, self.perf_data_dir)
+
+    self.flavor.cleanup_steps()
diff --git a/infra/bots/perf_skia.isolate b/infra/bots/perf_skia.isolate
new file mode 100644 (file)
index 0000000..420a0d0
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  'includes': [
+    'images.isolate',
+    'skia_repo.isolate',
+    'skps.isolate',
+  ],
+  'variables': {
+    'command': [
+      'python', 'perf_skia.py', '--master_name', '<(MASTER_NAME)', '--builder_name', '<(BUILDER_NAME)', '--build_number', '<(BUILD_NUMBER)', '--slave_name', '<(SLAVE_NAME)', '--revision', '<(REVISION)', '--swarm_out_dir', '${ISOLATED_OUTDIR}',
+    ],
+  },
+}
diff --git a/infra/bots/perf_skia.py b/infra/bots/perf_skia.py
new file mode 100644 (file)
index 0000000..0e32fee
--- /dev/null
@@ -0,0 +1,30 @@
+#!/usr/bin/env python
+#
+# Copyright 2016 Google Inc.
+#
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+import argparse
+import common
+import os
+import sys
+
+
+def main():
+  parser = argparse.ArgumentParser()
+  parser.add_argument('--master_name', required=True)
+  parser.add_argument('--builder_name', required=True)
+  parser.add_argument('--build_number', required=True)
+  parser.add_argument('--slave_name', required=True)
+  parser.add_argument('--revision', required=True)
+  parser.add_argument('--swarm_out_dir', required=True)
+  args = parser.parse_args()
+  bot = common.BotInfo(args.builder_name, os.path.abspath(args.swarm_out_dir))
+  bot.perf_steps(args.revision, args.master_name, args.slave_name,
+                 args.build_number)
+
+
+if __name__ == '__main__':
+  main()