17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport logging
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport os
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport subprocess
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport tempfile
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport zipfile
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfrom lib.subcommand import SubCommand
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfrom lib.symbol import SymbolDataSources
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochLOGGER = logging.getLogger('dmprof')
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass UploadCommand(SubCommand):
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  def __init__(self):
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    super(UploadCommand, self).__init__(
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        'Usage: %prog upload [--gsutil path/to/gsutil] '
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        '<first-dump> <destination-gs-path>')
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    self._parser.add_option('--gsutil', default='gsutil',
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            help='path to GSUTIL', metavar='GSUTIL')
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  def do(self, sys_argv):
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    options, args = self._parse_args(sys_argv, 2)
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    dump_path = args[1]
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    gs_path = args[2]
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    dump_files = SubCommand._find_all_dumps(dump_path)
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bucket_files = SubCommand._find_all_buckets(dump_path)
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    prefix = SubCommand._find_prefix(dump_path)
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    symbol_data_sources = SymbolDataSources(prefix)
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    symbol_data_sources.prepare()
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    symbol_path = symbol_data_sources.path()
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    handle_zip, filename_zip = tempfile.mkstemp('.zip', 'dmprof')
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    os.close(handle_zip)
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    try:
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_zip = zipfile.ZipFile(filename_zip, 'w', zipfile.ZIP_DEFLATED)
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      for filename in dump_files:
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        file_zip.write(filename, os.path.basename(os.path.abspath(filename)))
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      for filename in bucket_files:
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        file_zip.write(filename, os.path.basename(os.path.abspath(filename)))
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      symbol_basename = os.path.basename(os.path.abspath(symbol_path))
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      for filename in os.listdir(symbol_path):
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        if not filename.startswith('.'):
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          file_zip.write(os.path.join(symbol_path, filename),
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                         os.path.join(symbol_basename, os.path.basename(
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                             os.path.abspath(filename))))
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_zip.close()
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      returncode = UploadCommand._run_gsutil(
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          options.gsutil, 'cp', '-a', 'public-read', filename_zip, gs_path)
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    finally:
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      os.remove(filename_zip)
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return returncode
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  @staticmethod
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  def _run_gsutil(gsutil, *args):
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """Run gsutil as a subprocess.
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Args:
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        *args: Arguments to pass to gsutil. The first argument should be an
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            operation such as ls, cp or cat.
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Returns:
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        The return code from the process.
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    command = [gsutil] + list(args)
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LOGGER.info("Running: %s", command)
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    try:
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      return subprocess.call(command)
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    except OSError, e:
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      LOGGER.error('Error to run gsutil: %s', e)
80