#!/usr/bin/env python

"""Generate an initial RAM disk for the hypervisor.

Packages the VMs, initrds for the VMs and the list of secondary VMs (vms.txt)
into an initial RAM disk image.
"""

import argparse
import os
import shutil
import subprocess
import sys

def Main():
  parser = argparse.ArgumentParser()
  parser.add_argument("--primary_vm", required=True)
  parser.add_argument("--primary_vm_initrd")
  parser.add_argument("--secondary_vm", action="append", nargs=4, metavar=("MEMORY", "CORES", "NAME", "IMAGE"))
  parser.add_argument("--staging", required=True)
  parser.add_argument("--output", required=True)
  args = parser.parse_args()
  # Prepare the primary VM image.
  staged_files = ["vmlinuz"]
  shutil.copyfile(args.primary_vm, os.path.join(args.staging, "vmlinuz"))
  # Prepare the primary VM's initrd. Currently, it just makes an empty one.
  if args.primary_vm_initrd:
    raise NotImplementedError("This doesn't copy the primary VM's initrd yet")
  with open(os.path.join(args.staging, "initrd.img"), "w") as vms_txt:
    staged_files.append("initrd.img")
  # Prepare the secondary VMs.
  with open(os.path.join(args.staging, "vms.txt"), "w") as vms_txt:
    staged_files.append("vms.txt")
    if args.secondary_vm:
      for vm in args.secondary_vm:
        (vm_memory, vm_cores, vm_name, vm_image) = vm
        staged_files.append(vm_name)
        shutil.copy(vm_image, os.path.join(args.staging, vm_name))
        vms_txt.write("{} {} {}\n".format(vm_memory, vm_cores, vm_name))
  # Package files into an initial RAM disk.
  with open(args.output, "w") as initrd:
    # Move into the staging directory so the file names taken by cpio don't
    # include the path.
    os.chdir(args.staging)
    cpio = subprocess.Popen([
        "cpio",
        "--create"],
        stdin=subprocess.PIPE,
        stdout=initrd,
        stderr=subprocess.PIPE)
    cpio.communicate(input="\n".join(staged_files).encode("utf-8"))
  return 0

if __name__ == "__main__":
  sys.exit(Main())
