summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Santa Barbara <justin@fathomdb.com>2010-07-20 00:32:42 -0700
committerJustin Santa Barbara <justin@fathomdb.com>2010-07-20 00:32:42 -0700
commit63513736b0340efd197a7b905208fa90d63ab260 (patch)
treebf8f4a60f31922266aaad5ec53e50d739f9cc797
parent76b16a8c618f18da62ceea4c9a0e794c15c2d2bb (diff)
downloadnova-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.template26
-rw-r--r--nova/compute/node.py26
-rw-r--r--nova/endpoint/cloud.py4
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