X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-xen-config.git/blobdiff_plain/80608a9b583c98d01f993a2603f9e64d6a0f2fc5..22d8af42037f3b17f516817374e1eed879e16f05:/invirt-database diff --git a/invirt-database b/invirt-database index b914701..b99b548 100644 --- a/invirt-database +++ b/invirt-database @@ -2,8 +2,6 @@ from invirt.database import models, connect from invirt.config import structs as config import re -import tempfile -from subprocess import call connect() prefix = "d_" @@ -16,20 +14,24 @@ def check(b): import sys sys.exit(1) -machine = models.Machine.query().filter_by(name=machine_name).one() +machine = models.Machine.query.filter_by(name=machine_name).one() check(machine is not None) machine_type = machine.type cdrom = None if 'cdrom_image' in locals(): - cdrom = models.CDROM.query().filter_by(cdrom_id=cdrom_image).one() + cdrom = models.CDROM.query.filter_by(cdrom_id=cdrom_image).one() check(cdrom is not None) memory = machine.memory -maxmem = '2048' +if machine_type.hvm: + # Disable populate-on-demand + maxmem = memory +else: + maxmem = '2048' check(re.match('^[A-Za-z0-9][A-Za-z0-9._-]*$', machine.name)) -name = prefix + machine.name +name = prefix + machine_name check(re.match('^[0-9a-f-]+$', machine.uuid)) -uuid = machine.uuid +uuid = str(machine.uuid) vcpus = machine.cpus @@ -50,34 +52,67 @@ else: codepath = 'paravm' if 'installer_options' in locals(): #Installer - disk.append('phy:/dev/xenvg/s_install_hda,hdb,r') - - import os - release = os.uname()[2] - kernel = '/boot/vmlinuz-%s' % release - ramdisk = '/boot/initrd.img-%s' % release - - if not machine.nics: - raise RuntimeError('You must have a nic to autoinstall') - n = machine.nics[0] - extra = 'ro noresume' - extra += (' ip=%s::%s:%s:%s:eth0:off' - % (n.ip, config.dhcp.gateway, config.dhcp.netmask, machine.name)) - extra += ' %s' % installer_options - root = '/dev/hdb1' + import shlex + install = dict(x.split("=",1) for x in shlex.split(installer_options)) + if 'preseed' in install: # d-i based installer + baseurl = install['mirror']+"/dists/"+install['dist']+"/main/installer-"+install['arch']+"/current/images" + kernelurl = baseurl + "/netboot/xen/vmlinuz" + ramdiskurl = baseurl + "/netboot/xen/initrd.gz" + + import urllib + class MyUrlOpener(urllib.FancyURLopener): + def http_error_default(self, req, fp, code, msg, hdrs): + raise IOError("%s %s" % (code, msg)) + urlopener = MyUrlOpener() + + try: + print "Fetching %s" % kernelurl + kernel, _ = urlopener.retrieve(kernelurl) + print "Fetching %s" % ramdiskurl + ramdisk, _ = urlopener.retrieve(ramdiskurl) + except IOError, _: + raise + + # For debugging, add "DEBCONF_DEBUG=5" to the arguments. + extras = ["auto=true", + "debconf/priority=critical", + "debian-installer/locale=en_US.UTF-8", + "debian-installer/exit/always_halt=true", + "url="+install['preseed'], + "--", "console=hvc0"] + + extra = str.join(" ", extras) + else: # Traditional debootstrap-based install + disk.append('phy:/dev/xenvg/s_install_hda,hdb,r') + + import os + release = os.uname()[2] + kernel = '/boot/vmlinuz-%s' % release + ramdisk = '/boot/initrd.img-%s' % release + + if not machine.nics: + raise RuntimeError('You must have a nic to autoinstall') + n = machine.nics[0] + extra = 'ro noresume' + extra += (' ip=%s::%s:%s:%s:eth0:off' + % (n.ip, config.dhcp.gateway, config.dhcp.netmask, machine.name)) + extra += ' %s' % installer_options + root = '/dev/hdb1' codepath = None + + memory = max(memory, 512) elif cdrom is not None: disk.append('phy:/dev/xenvg/image_' + cdrom.cdrom_id + ',hdc:cdrom,r') boot = 'd' codepath = 'hvm' if codepath == 'hvm': + xen_platform_pci = 1 ioemu = "ioemu:" - viftype = "type=ioemu, " - kernel = '/usr/lib/xen/boot/hvmloader' + viftype = "model=pcnet, " + kernel = '/usr/lib/xen-4.1/boot/hvmloader' builder = 'hvm' vnc = 1 - vncpasswd = 'moocow' device_model = '/usr/sbin/qemu-dm-invirt' serial = "pty" elif codepath == 'paravm': @@ -86,7 +121,10 @@ elif codepath == 'paravm': for n in machine.nics: check(re.match('^[0-9a-fA-F:]+$', n.mac_addr) and re.match('^[0-9.]*$', n.ip)) - d = '%smac=%s, ip=%s, script=vif-invirtroute netdev=eth2' % (viftype, n.mac_addr, n.ip) + if n.nic_type: + viftype = viftype.replace("pcnet", n.nic_type) + d = ('%smac=%s, ip=%s, script=vif-invirtroute netdev=%s' + % (viftype, n.mac_addr, n.ip, config.xen.iface)) vif.append(d) for d in machine.disks: