summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorJustin Santa Barbara <justin@fathomdb.com>2010-07-20 14:25:43 -0700
committerJustin Santa Barbara <justin@fathomdb.com>2010-07-20 14:25:43 -0700
commit9cf32d6d65035299ecfcb0563cef8ddab3c0ee4c (patch)
tree4b9dbf10a405c03d42395a99e052a854de204dae /nova/compute
parent63513736b0340efd197a7b905208fa90d63ab260 (diff)
downloadnova-9cf32d6d65035299ecfcb0563cef8ddab3c0ee4c.tar.gz
nova-9cf32d6d65035299ecfcb0563cef8ddab3c0ee4c.tar.xz
nova-9cf32d6d65035299ecfcb0563cef8ddab3c0ee4c.zip
Able to set up DNS, and remove udev network rules
Diffstat (limited to 'nova/compute')
-rw-r--r--nova/compute/disk.py29
-rw-r--r--nova/compute/libvirt.xml.template1
-rw-r--r--nova/compute/network.py3
-rw-r--r--nova/compute/node.py57
-rw-r--r--nova/compute/resolv.conf.template1
5 files changed, 66 insertions, 25 deletions
diff --git a/nova/compute/disk.py b/nova/compute/disk.py
index 08a22556e..abbbc01c2 100644
--- a/nova/compute/disk.py
+++ b/nova/compute/disk.py
@@ -84,7 +84,7 @@ def partition(infile, outfile, local_bytes=0, local_type='ext2', execute=None):
% (infile, outfile, sector_size, primary_first))
@defer.inlineCallbacks
-def inject_data(image, key=None, net=None, partition=None, execute=None):
+def inject_data(image, key=None, net=None, dns=None, remove_network_udev=False, partition=None, execute=None):
"""Injects a ssh key and optionally net data into a disk image.
it will mount the image as a fully partitioned disk and attempt to inject
@@ -93,7 +93,7 @@ def inject_data(image, key=None, net=None, partition=None, execute=None):
If partition is not specified it mounts the image as a single partition.
"""
- out, err = yield execute('sudo losetup -f --show %s' % image)
+ out, err = yield execute('sudo losetup --find --show %s' % image)
if err:
raise exception.Error('Could not attach image to loopback: %s' % err)
device = out.strip()
@@ -107,6 +107,8 @@ def inject_data(image, key=None, net=None, partition=None, execute=None):
partition)
else:
mapped_device = device
+
+ # Configure ext2fs so that it doesn't auto-check every N boots
out, err = yield execute('sudo tune2fs -c 0 -i 0 %s' % mapped_device)
tmpdir = tempfile.mkdtemp()
@@ -123,6 +125,11 @@ def inject_data(image, key=None, net=None, partition=None, execute=None):
yield _inject_key_into_fs(key, tmpdir, execute=execute)
if net:
yield _inject_net_into_fs(net, tmpdir, execute=execute)
+ if dns:
+ yield _inject_dns_into_fs(dns, tmpdir, execute=execute)
+ if remove_network_udev:
+ yield _remove_network_udev(tmpdir, execute=execute)
+
finally:
# unmount device
yield execute('sudo umount %s' % mapped_device)
@@ -134,11 +141,11 @@ def inject_data(image, key=None, net=None, partition=None, execute=None):
yield execute('sudo kpartx -d %s' % device)
finally:
# remove loopback
- yield execute('sudo losetup -d %s' % device)
+ yield execute('sudo losetup --detach %s' % device)
@defer.inlineCallbacks
def _inject_key_into_fs(key, fs, execute=None):
- sshdir = os.path.join(os.path.join(fs, 'root'), '.ssh')
+ sshdir = os.path.join(fs, 'root', '.ssh')
yield execute('sudo mkdir -p %s' % sshdir) # existing dir doesn't matter
yield execute('sudo chown root %s' % sshdir)
yield execute('sudo chmod 700 %s' % sshdir)
@@ -147,7 +154,17 @@ def _inject_key_into_fs(key, fs, execute=None):
@defer.inlineCallbacks
def _inject_net_into_fs(net, fs, execute=None):
- netfile = os.path.join(os.path.join(os.path.join(
- fs, 'etc'), 'network'), 'interfaces')
+ netfile = os.path.join(fs, 'etc', 'network', 'interfaces')
yield execute('sudo tee %s' % netfile, net)
+@defer.inlineCallbacks
+def _inject_dns_into_fs(dns, fs, execute=None):
+ dnsfile = os.path.join(fs, 'etc', 'resolv.conf')
+ yield execute('sudo tee %s' % dnsfile, dns)
+
+@defer.inlineCallbacks
+def _remove_network_udev(fs, execute=None):
+ # This is correct for Ubuntu, but might not be right for other distros
+ rulesfile = os.path.join(fs, 'etc', 'udev', 'rules.d', '70-persistent-net.rules')
+ yield execute('rm -f %s' % rulesfile)
+
diff --git a/nova/compute/libvirt.xml.template b/nova/compute/libvirt.xml.template
index 6fb63feae..3bfec9b3a 100644
--- a/nova/compute/libvirt.xml.template
+++ b/nova/compute/libvirt.xml.template
@@ -16,6 +16,7 @@
<memory>${memory_kb}</memory>
<vcpu>${vcpus}</vcpu>
<devices>
+ <graphics type='vnc' port='-1' autoport='yes' />
<emulator>/usr/bin/kvm</emulator>
<disk type='file'>
<source file='${disk}'/>
diff --git a/nova/compute/network.py b/nova/compute/network.py
index bdb8a22f9..0b24ca7d1 100644
--- a/nova/compute/network.py
+++ b/nova/compute/network.py
@@ -62,6 +62,9 @@ flags.DEFINE_list('simple_network_ips', ['192.168.0.2'],
flags.DEFINE_string('simple_network_template',
utils.abspath('compute/interfaces.template'),
'Template file for simple network')
+flags.DEFINE_string('simple_network_dns_template',
+ utils.abspath('compute/resolv.conf.template'),
+ 'Template file for DNS settings for simple network')
flags.DEFINE_string('simple_network_netmask', '255.255.255.0',
'Netmask for simple network')
flags.DEFINE_string('simple_network_network', '192.168.0.0',
diff --git a/nova/compute/node.py b/nova/compute/node.py
index 7c3b9a677..56429b0f0 100644
--- a/nova/compute/node.py
+++ b/nova/compute/node.py
@@ -505,37 +505,56 @@ class Instance(object):
if not os.path.exists(basepath('disk')):
yield _fetch_file(data['image_id'], basepath('disk-raw'))
- if data['kernel_id'] and not os.path.exists(basepath('kernel')):
- yield _fetch_file(data['kernel_id'], basepath('kernel'))
- if data['ramdisk_id'] and not os.path.exists(basepath('ramdisk')):
- yield _fetch_file(data['ramdisk_id'], basepath('ramdisk'))
+
+ using_kernel = data['kernel_id'] and True
+
+ if using_kernel:
+ if os.path.exists(basepath('kernel')):
+ yield _fetch_file(data['kernel_id'], basepath('kernel'))
+ 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,
input=input,
error_ok=1)
+ # For now, we assume that if we're not using a kernel, we're using a partitioned disk image
+ # where the target partition is the first partition
+ target_partition = None
+ if not using_kernel:
+ target_partition = "1"
+
key = data['key_data']
net = None
+ dns = None
if FLAGS.simple_network:
+ network_info = {
+ 'address': data['private_dns_name'],
+ 'network': FLAGS.simple_network_network,
+ 'netmask': FLAGS.simple_network_netmask,
+ 'gateway': FLAGS.simple_network_gateway,
+ 'broadcast': FLAGS.simple_network_broadcast,
+ 'dns': FLAGS.simple_network_dns}
+
with open(FLAGS.simple_network_template) as f:
- net = f.read() % {'address': data['private_dns_name'],
- 'network': FLAGS.simple_network_network,
- 'netmask': FLAGS.simple_network_netmask,
- 'gateway': FLAGS.simple_network_gateway,
- 'broadcast': FLAGS.simple_network_broadcast,
- 'dns': FLAGS.simple_network_dns}
- if key or net:
+ net = f.read() % network_info
+
+ with open(FLAGS.simple_network_dns_template) as f:
+ dns =str(Template(f.read(), searchList=[ network_info ] ))
+
+ if key or net or dns:
logging.info('Injecting data into image %s', data['image_id'])
- yield disk.inject_data(basepath('disk-raw'), key, net, execute=execute)
-
- if os.path.exists(basepath('disk')):
- yield self._pool.simpleExecute('rm -f %s' % basepath('disk'))
+ yield disk.inject_data(basepath('disk-raw'), key=key, net=net, dns=dns, remove_network_udev=True, partition=target_partition, execute=execute)
- bytes = (INSTANCE_TYPES[data['instance_type']]['local_gb']
- * 1024 * 1024 * 1024)
- yield disk.partition(
- basepath('disk-raw'), basepath('disk'), bytes, execute=execute)
+ if using_kernel:
+ if os.path.exists(basepath('disk')):
+ yield self._pool.simpleExecute('rm -f %s' % basepath('disk'))
+ bytes = (INSTANCE_TYPES[data['instance_type']]['local_gb']
+ * 1024 * 1024 * 1024)
+ yield disk.partition(
+ basepath('disk-raw'), basepath('disk'), bytes, execute=execute)
+
@defer.inlineCallbacks
@exception.wrap_exception
def spawn(self):
diff --git a/nova/compute/resolv.conf.template b/nova/compute/resolv.conf.template
new file mode 100644
index 000000000..7ddb55190
--- /dev/null
+++ b/nova/compute/resolv.conf.template
@@ -0,0 +1 @@
+nameserver ${dns}