Home | History | Annotate | Download | only in skp
      1 #!/usr/bin/env python
      2 #
      3 # Copyright 2016 Google Inc.
      4 #
      5 # Use of this source code is governed by a BSD-style license that can be
      6 # found in the LICENSE file.
      7 
      8 
      9 """Create the SKP asset."""
     10 
     11 
     12 import argparse
     13 import common
     14 import os
     15 import shutil
     16 import subprocess
     17 import utils
     18 
     19 
     20 SKIA_TOOLS = os.path.join(common.INFRA_BOTS_DIR, os.pardir, os.pardir, 'tools')
     21 
     22 PRIVATE_SKPS_GS = 'gs://skia-skps/private/skps'
     23 
     24 
     25 def create_asset(chrome_src_path, browser_executable, target_dir,
     26                  upload_to_partner_bucket):
     27   """Create the asset."""
     28   browser_executable = os.path.realpath(browser_executable)
     29   chrome_src_path = os.path.realpath(chrome_src_path)
     30   target_dir = os.path.realpath(target_dir)
     31 
     32   if not os.path.exists(target_dir):
     33     os.makedirs(target_dir)
     34 
     35   with utils.tmp_dir():
     36     if os.environ.get('CHROME_HEADLESS'):
     37       # Start Xvfb if running on a bot.
     38       try:
     39         subprocess.Popen(['sudo', 'Xvfb', ':0', '-screen', '0', '1280x1024x24'])
     40       except Exception:
     41         # It is ok if the above command fails, it just means that DISPLAY=:0
     42         # is already up.
     43         pass
     44 
     45     webpages_playback_cmd = [
     46       'python', os.path.join(SKIA_TOOLS, 'skp', 'webpages_playback.py'),
     47       '--page_sets', 'all',
     48       '--browser_executable', browser_executable,
     49       '--non-interactive',
     50       '--output_dir', os.getcwd(),
     51       '--chrome_src_path', chrome_src_path,
     52     ]
     53     if upload_to_partner_bucket:
     54       webpages_playback_cmd.append('--upload_to_partner_bucket')
     55     print 'Running webpages_playback command:\n$ %s' % (
     56         ' '.join(webpages_playback_cmd))
     57     try:
     58       subprocess.check_call(webpages_playback_cmd)
     59     finally:
     60       # Clean up any leftover browser instances. This can happen if there are
     61       # telemetry crashes, processes are not always cleaned up appropriately by
     62       # the webpagereplay and telemetry frameworks.
     63       procs = subprocess.check_output(['ps', 'ax'])
     64       for line in procs.splitlines():
     65         if browser_executable in line:
     66           pid = line.strip().split(' ')[0]
     67           if pid != str(os.getpid()) and not 'python' in line:
     68             try:
     69               subprocess.check_call(['kill', '-9', pid])
     70             except subprocess.CalledProcessError as e:
     71               print e
     72           else:
     73             print 'Refusing to kill self.'
     74     src = os.path.join(os.getcwd(), 'playback', 'skps')
     75     for f in os.listdir(src):
     76       if f.endswith('.skp'):
     77         shutil.copyfile(os.path.join(src, f), os.path.join(target_dir, f))
     78 
     79   # Copy over private SKPs from Google storage into the target_dir.
     80   subprocess.check_call([
     81         'gsutil', 'cp', os.path.join(PRIVATE_SKPS_GS, '*'), target_dir])
     82 
     83 
     84 def main():
     85   parser = argparse.ArgumentParser()
     86   parser.add_argument('--target_dir', '-t', required=True)
     87   parser.add_argument('--chrome_src_path', '-c', required=True)
     88   parser.add_argument('--browser_executable', '-e', required=True)
     89   parser.add_argument('--upload_to_partner_bucket', action='store_true')
     90   args = parser.parse_args()
     91   create_asset(args.chrome_src_path, args.browser_executable, args.target_dir,
     92                args.upload_to_partner_bucket)
     93 
     94 
     95 if __name__ == '__main__':
     96   main()
     97