diff options
| author | Justin Santa Barbara <justin@fathomdb.com> | 2010-07-20 00:32:42 -0700 |
|---|---|---|
| committer | Justin Santa Barbara <justin@fathomdb.com> | 2010-07-20 00:32:42 -0700 |
| commit | 63513736b0340efd197a7b905208fa90d63ab260 (patch) | |
| tree | bf8f4a60f31922266aaad5ec53e50d739f9cc797 | |
| parent | 76b16a8c618f18da62ceea4c9a0e794c15c2d2bb (diff) | |
| download | nova-63513736b0340efd197a7b905208fa90d63ab260.tar.gz nova-63513736b0340efd197a7b905208fa90d63ab260.tar.xz nova-63513736b0340efd197a7b905208fa90d63ab260.zip | |
Able to boot without kernel or ramdisk. libvirt.xml.template is now a Cheetah template
| -rw-r--r-- | nova/compute/libvirt.xml.template | 26 | ||||
| -rw-r--r-- | nova/compute/node.py | 26 | ||||
| -rw-r--r-- | nova/endpoint/cloud.py | 4 |
3 files changed, 39 insertions, 17 deletions
diff --git a/nova/compute/libvirt.xml.template b/nova/compute/libvirt.xml.template index a763e8a4d..6fb63feae 100644 --- a/nova/compute/libvirt.xml.template +++ b/nova/compute/libvirt.xml.template @@ -1,31 +1,35 @@ <domain type='kvm'> - <name>%(name)s</name> + <name>${name}</name> <os> - <type>hvm</type> - <kernel>%(basepath)s/kernel</kernel> - <initrd>%(basepath)s/ramdisk</initrd> + <type>hvm</type> +#if $getVar('kernel', None) + <kernel>${kernel}</kernel> + #if $getVar('ramdisk', None) + <initrd>${ramdisk}</initrd> + #end if <cmdline>root=/dev/vda1 console=ttyS0</cmdline> +#end if </os> <features> <acpi/> </features> - <memory>%(memory_kb)s</memory> - <vcpu>%(vcpus)s</vcpu> + <memory>${memory_kb}</memory> + <vcpu>${vcpus}</vcpu> <devices> <emulator>/usr/bin/kvm</emulator> <disk type='file'> - <source file='%(basepath)s/disk'/> + <source file='${disk}'/> <target dev='vda' bus='virtio'/> </disk> <interface type='bridge'> - <source bridge='%(bridge_name)s'/> - <mac address='%(mac_address)s'/> + <source bridge='${bridge_name}'/> + <mac address='${mac_address}'/> <!-- <model type='virtio'/> CANT RUN virtio network right now --> </interface> <serial type="file"> - <source path='%(basepath)s/console.log'/> + <source path='${basepath}/console.log'/> <target port='1'/> </serial> </devices> - <nova>%(nova)s</nova> + <nova>${nova}</nova> </domain> diff --git a/nova/compute/node.py b/nova/compute/node.py index 8f829995b..7c3b9a677 100644 --- a/nova/compute/node.py +++ b/nova/compute/node.py @@ -34,6 +34,7 @@ from twisted.internet import defer from twisted.internet import task from twisted.application import service +from Cheetah.Template import Template try: import libvirt @@ -312,13 +313,30 @@ class Instance(object): def toXml(self): # TODO(termie): cache? logging.debug("Starting the toXML method") - libvirt_xml = open(FLAGS.libvirt_xml_template).read() + template_contents = open(FLAGS.libvirt_xml_template).read() xml_info = self.datamodel.copy() # TODO(joshua): Make this xml express the attached disks as well # TODO(termie): lazy lazy hack because xml is annoying xml_info['nova'] = json.dumps(self.datamodel.copy()) - libvirt_xml = libvirt_xml % xml_info + + if xml_info['kernel_id']: + xml_info['kernel'] = xml_info['basepath'] + "/kernel" + + if xml_info['ramdisk_id']: + xml_info['ramdisk'] = xml_info['basepath'] + "/ramdisk" + + if xml_info['ramdisk_id'] or xml_info['kernel_id']: + xml_info['disk'] = xml_info['basepath'] + "/disk" + else: + xml_info['disk'] = xml_info['basepath'] + "/disk-raw" + + try: + libvirt_xml = str(Template(template_contents, searchList=[ xml_info ] )) + except Exception as e: + logging.warning("Error running template: %s" % e) + raise + logging.debug("Finished the toXML method") return libvirt_xml @@ -487,9 +505,9 @@ class Instance(object): if not os.path.exists(basepath('disk')): yield _fetch_file(data['image_id'], basepath('disk-raw')) - if not os.path.exists(basepath('kernel')): + if data['kernel_id'] and not os.path.exists(basepath('kernel')): yield _fetch_file(data['kernel_id'], basepath('kernel')) - if not os.path.exists(basepath('ramdisk')): + if data['ramdisk_id'] and not os.path.exists(basepath('ramdisk')): yield _fetch_file(data['ramdisk_id'], basepath('ramdisk')) execute = lambda cmd, input=None: self._pool.simpleExecute(cmd=cmd, diff --git a/nova/endpoint/cloud.py b/nova/endpoint/cloud.py index 3b7b4804b..b7a4fe20e 100644 --- a/nova/endpoint/cloud.py +++ b/nova/endpoint/cloud.py @@ -544,8 +544,8 @@ class CloudController(object): for num in range(int(kwargs['max_count'])): inst = self.instdir.new() inst['image_id'] = image_id - inst['kernel_id'] = kernel_id - inst['ramdisk_id'] = ramdisk_id + inst['kernel_id'] = kernel_id or '' + inst['ramdisk_id'] = ramdisk_id or '' inst['user_data'] = kwargs.get('user_data', '') inst['instance_type'] = kwargs.get('instance_type', 'm1.small') inst['reservation_id'] = reservation_id |
