#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Transporter copies log files to GS storage.

Must be a member of "chromiumos-test-logs-ninja" group or will get
"Access Denied" error from gsutil.

"""

from __future__ import print_function
import argparse
import os

def main():
  gs_path = {'broadcom':'gs://chromeos-partner-broadcom-wifi-bucket/',
             'bugs':'gs://chromiumos-test-logs/',
             'imgtech':'gs://chromeos-partner-imgtech-wifi-bucket/',
             'intel':'gs://chromeos-partner-intel-wifi-bucket/',
             'marvell':'gs://chromeos-partner-marvell-wifi-bucket/'}

  usage_desc = ('Please make sure you are part of chromiumos-test-logs-ninja '
                'group. Ping rohitbm/krisr to get yourself added to the group.')
  parser = argparse.ArgumentParser(description=usage_desc)
  parser.add_argument('-t', '--tracker', dest='tracker',
                      help='[crosp|cr|misc] bug\'s tracker name.')
  parser.add_argument('-b', '--bug', dest='bug_id',
                      help='Bug number for which the logs belong.')
  parser.add_argument('-p', '--path', dest='logs_path',
                      help='Logs local path.')
  parser.add_argument('--broadcom', action='store_true', default=False,
                      dest='broadcom',
                      help='Store logs in the Broadcom storage.')
  parser.add_argument('--imgtech', action='store_true', default=False,
                      dest='imgtech', help='Store logs in the Imgtech storage.')
  parser.add_argument('--intel', action='store_true', default=False,
                      dest='intel', help='Store logs in the Intel storage.')
  parser.add_argument('--marvell', action='store_true', default=False,
                      dest='marvell', help='Store logs in the Marvell storage.')

  arguments = parser.parse_args()

  if [arguments.broadcom, arguments.imgtech,
      arguments.intel, arguments.marvell].count(True) > 1:
    print('Error: logs can be uploaded only for one partner.')
    return 1

  if arguments.broadcom:
    final_gs_path = gs_path['broadcom']
  elif arguments.imgtech:
    final_gs_path = gs_path['imgtech']
  elif arguments.intel:
    final_gs_path = gs_path['intel']
  elif arguments.marvell:
    final_gs_path = gs_path['marvell']
  else:
    trackers = ['crosp', 'cr', 'misc']
    if arguments.tracker not in trackers:
      print('Error: invalid tracker name. Select %s' % trackers)
      return 1
    if not os.path.exists(arguments.logs_path):
      print('Error: logs file %s is not available.' % arguments.logs_path)
      return 1
    logs_dir = arguments.tracker + '_' + arguments.bug_id
    final_gs_path = gs_path['bugs'] + logs_dir + '/'

  gsutilPath = os.popen('which gsutil').read().rstrip()
  if not gsutilPath:
    print('Error: gsutil not found.')
    return 1
  file_name = os.path.basename(arguments.logs_path)
  if os.path.isfile(arguments.logs_path):
    os.popen('%s cp \'%s\' %s%s' %
             (gsutilPath, arguments.logs_path,
              final_gs_path, file_name))
  elif os.path.isdir(arguments.logs_path):
    os.popen('%s cp -R \'%s\' %s' %
             (gsutilPath, arguments.logs_path, final_gs_path))
  else:
    print('%s is neither a file nor a directory.' % arguments.logs_path)
    return 1
  link = 'https://storage.cloud.google.com/' + final_gs_path[5:]
  print('Logs link: %s%s' %
        (link, os.path.basename(arguments.logs_path)))

if __name__ == '__main__':
  main()
