#!/usr/bin/env python

import argparse
import os.path

import libvirt

templatedir = os.path.join(os.path.dirname(os.path.dirname(__file__)),
                           'templates')


def main():
    parser = argparse.ArgumentParser(
        description="Configure a kvm virtual machine for the seed image.")
    parser.add_argument('--name', default='seed',
                        help='the name to give the machine in libvirt.')
    parser.add_argument('--image',
                        help='Use a custom image file (must be qcow2).')
    parser.add_argument('--engine', default='qemu',
                        help='The virtualization engine to use')
    parser.add_argument('--arch', default='i686',
                        help='The architecture to use')
    parser.add_argument('--memory', default='2097152',
                        help="Maximum memory for the VM in KB.")
    parser.add_argument('--cpus', default='1',
                        help="CPU count for the VM.")
    parser.add_argument('--bootdev', default='hd',
                        help="What boot device to use (hd/network).")
    parser.add_argument('--network', default="brbm",
                        help='The libvirt network name to use')
    parser.add_argument('--libvirt-nic-driver', default='e1000',
                        help='The libvirt network driver to use')
    parser.add_argument('--emulator', default=None,
                        help='Path to emulator bin for vm template')
    args = parser.parse_args()
    with file(templatedir + '/vm.xml', 'rb') as f:
        source_template = f.read()
    params = {
        'name': args.name,
        'imagefile': args.image,
        'engine': args.engine,
        'arch': args.arch,
        'memory': args.memory,
        'cpus': args.cpus,
        'bootdev': args.bootdev,
        'network': args.network,
        'emulator': args.emulator,
    }

    if args.emulator:
        params['emulator'] = args.emulator
    else:
        if os.path.exists("/usr/bin/kvm"):  # Debian
            params['emulator'] = "/usr/bin/kvm"
        elif os.path.exists("/usr/bin/qemu-kvm"):  # Redhat
            params['emulator'] = "/usr/bin/qemu-kvm"

    nicparams = {
        'nicdriver': args.libvirt_nic_driver,
        'network': args.network,
    }

    params['bm_network'] = """
<!-- neutron friendly 'bare metal' network -->
<interface type='network'>
  <source network='%(network)s'/>
  <virtualport type='openvswitch'/>
  <model type='%(nicdriver)s'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</interface>""" % nicparams

    libvirt_template = source_template % params
    conn = libvirt.open("qemu:///system")
    a = conn.defineXML(libvirt_template)
    print ("Created machine %s with UUID %s" % (args.name, a.UUIDString()))

if __name__ == '__main__':
    main()
