# -*- mode: python; -*- from invirt.database import models, connect, session from invirt.config import structs as config import re connect() prefix = "d_" # 'machine_name', and optionally 'cdrom_image', should get passed in # from the xm create call def check(b): if not b: import sys sys.exit(1) 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() check(cdrom is not None) memory = machine.memory 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 check(re.match('^[0-9a-f-]+$', machine.uuid)) uuid = str(machine.uuid) vcpus = machine.cpus diskioemu = "" viftype = "" pae = machine_type.pae acpi = machine_type.acpi apic = machine_type.apic vif = [] disk = [] if machine_type.hvm: codepath = 'hvm' else: codepath = 'paravm' if 'installer_options' in locals(): #Installer import shlex install = dict(x.split("=",1) for x in shlex.split(installer_options)) if 'ks' in install or 'preseed' in install: if 'ks' in install: # anaconda based installer baseurl = install['mirror']+"/releases/"+install['dist']+"/Everything/"+install['arch']+"/os" kernelurl = baseurl + "/images/pxeboot/vmlinuz" ramdiskurl = baseurl + "/images/pxeboot/initrd.img" extras = ["inst.text", "inst.repo="+baseurl, "inst.ks="+install['ks'], "--", "console=hvc0", ] elif '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" # 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"] else: raise RuntimeError('unknown new-style autoinstall') 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 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, n.gateway, n.netmask, machine.name)) extra += ' %s' % installer_options root = '/dev/hdb1' codepath = None memory = max(memory, 768) maxmem = memory 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 = "model=pcnet, " kernel = '/usr/lib/xen-4.1/boot/hvmloader' builder = 'hvm' vnc = 1 device_model = '/usr/sbin/qemu-dm-invirt' serial = "pty" elif codepath == 'paravm': bootloader = '/usr/bin/pygrub' for n in machine.nics: other_netparams = '' other_action = n.other_action if n.other_action else '' if other_action == 'renumber': (n.ip, n.netmask, n.gateway, n.other_ip, n.other_netmask, n.other_gateway) = ( n.other_ip, n.other_netmask, n.other_gateway, n.ip, n.netmask, n.gateway) other_action = n.other_action = 'dnat' session.add(n) session.flush() if other_action == 'dnat': other_netparams = ('other_ip=%s other_gateway=%s' % (n.other_ip, n.other_gateway)) if other_action == 'remove': n.other_ip = n.other_netmask = n.other_gateway = n.other_action = None session.add(n) session.flush() check(re.match('^[0-9a-fA-F:]+$', n.mac_addr) and re.match('^[0-9.]*$', n.ip)) if n.nic_type: viftype = viftype.replace("pcnet", n.nic_type) d = ('%smac=%s, ip=%s, script=vif-invirtroute netdev=%s gateway=%s %s' % (viftype, n.mac_addr, n.ip, config.xen.iface, n.gateway, other_netparams)) vif.append(d) for d in machine.disks: check(re.match('^[A-Za-z0-9]+$', d.guest_device_name)) device = '/dev/xenvg/' + prefix + machine.name + '_' + d.guest_device_name dspec = 'phy:%s,%s%s,w' % (device, diskioemu, d.guest_device_name) disk.append(dspec) usbdevice = 'tablet' on_poweroff = 'destroy' on_reboot = 'restart' on_crash = 'destroy' if machine.autorestart: on_crash = 'restart'