#!/usr/bin/python

"""Upload a local build to Google Compute Engine and run it."""

import argparse
import glob
import os
import subprocess


def gcloud_ssh(args):
  command = 'gcloud compute ssh %s@%s ' % (args.user, args.instance)
  if args.zone:
    command += '--zone=%s ' % args.zone
  return command


def upload_artifacts(args):
  dir = os.getcwd()
  try:
    os.chdir(args.image_dir)
    artifacts = []
    artifact_patterns = ['*.img', 'bootloader']
    for artifact_pattern in artifact_patterns:
      artifacts.extend(glob.glob(artifact_pattern))
    if len(artifacts) == 0:
      raise OSError('No images found in: %s' + args.image_dir)
    subprocess.check_call(
        'tar -c -f - --lzop -S ' + ' '.join(artifacts) +
        ' | ' +
        gcloud_ssh(args) + '-- tar -x -f - --lzop -S',
        shell=True)
  finally:
    os.chdir(dir)

  host_package = os.path.join(args.host_dir, 'cvd-host_package.tar.gz')
  subprocess.check_call(
      gcloud_ssh(args) + '-- tar -x -z -f - < %s' % host_package,
      shell=True)


def launch_cvd(args):
  launch_cvd_args = ''
  if args.data_image:
    launch_cvd_args = (
      '--data-image %s '
      '--data-policy create_if_missing '
      '--blank-data-image-mb %d ' % (args.data_image, args.blank_data_image_mb))

  subprocess.check_call(
      gcloud_ssh(args) + '-- ./bin/launch_cvd ' + launch_cvd_args,
      shell=True)


def stop_cvd(args):
  subprocess.call(
      gcloud_ssh(args) + '-- ./bin/stop_cvd',
      shell=True)


def __get_default_hostdir():
  soong_host_dir = os.environ.get('ANDROID_SOONG_HOST_OUT')
  if soong_host_dir:
    return soong_host_dir
  return os.environ.get('ANDROID_HOST_OUT', '.')


def main():
  parser = argparse.ArgumentParser(
      description='Upload a local build to Google Compute Engine and run it')
  parser.add_argument(
      '-host_dir',
      type=str,
      default=__get_default_hostdir(),
      help='path to the dist directory')
  parser.add_argument(
      '-image_dir',
      type=str,
      default=os.environ.get('ANDROID_PRODUCT_OUT', '.'),
      help='path to the img files')
  parser.add_argument(
      '-instance', type=str, required=True,
      help='instance to update')
  parser.add_argument(
      '-zone', type=str, default=None,
      help='zone containing the instance')
  parser.add_argument(
      '-user', type=str, default=os.environ.get('USER', 'vsoc-01'),
      help='user to update on the instance')
  parser.add_argument(
      '-data-image', type=str, default=None,
      help='userdata image file name, this file will be used instead of default one')
  parser.add_argument(
      '-blank-data-image-mb', type=int, default=4098,
      help='custom userdata image size in megabytes')
  parser.add_argument(
      '-launch', default=False,
      action='store_true',
      help='launch the device')
  args = parser.parse_args()
  stop_cvd(args)
  upload_artifacts(args)
  if args.launch:
    launch_cvd(args)


if __name__ == '__main__':
  main()
