From eb3e1749074a82a612c5fb84960f6fe9b6aaf8d2 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Sat, 28 Jan 2012 13:14:33 -0800 Subject: Support file injection on boot w/ Libvirt Implementes bp libvirt-file-injection Change-Id: I25a5cc1b2261726e9603349df323e29cd1ed31e8 --- nova/virt/disk/api.py | 23 +++++++++++++++++++++++ nova/virt/libvirt/connection.py | 9 +++++++++ 2 files changed, 32 insertions(+) diff --git a/nova/virt/disk/api.py b/nova/virt/disk/api.py index 1cd697347..2c7e1a034 100644 --- a/nova/virt/disk/api.py +++ b/nova/virt/disk/api.py @@ -205,6 +205,21 @@ def inject_data(image, key=None, net=None, metadata=None, raise exception.Error(img.errors) +def inject_files(image, files, partition=None, use_cow=False, + disable_auto_fsck=True): + """Injects arbitrary files into a disk image""" + img = _DiskImage(image=image, partition=partition, use_cow=use_cow, + disable_auto_fsck=disable_auto_fsck) + if img.mount(): + try: + for (path, contents) in files: + _inject_file_into_fs(img.mount_dir, path, contents) + finally: + img.umount() + else: + raise exception.Error(img.errors) + + def setup_container(image, container_dir=None, use_cow=False): """Setup the LXC container. @@ -251,6 +266,14 @@ def inject_data_into_fs(fs, key, net, metadata, execute): _inject_metadata_into_fs(metadata, fs, execute=execute) +def _inject_file_into_fs(fs, path, contents): + absolute_path = os.path.join(fs, path.lstrip('/')) + parent_dir = os.path.dirname(absolute_path) + utils.execute('mkdir', '-p', parent_dir, run_as_root=True) + utils.execute('tee', absolute_path, process_input=contents, + run_as_root=True) + + def _inject_metadata_into_fs(metadata, fs, execute=None): metadata_path = os.path.join(fs, "meta.js") metadata = dict([(m.key, m.value) for m in metadata]) diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index df0cd5725..04e10dd2b 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -718,6 +718,11 @@ class LibvirtConnection(driver.ComputeDriver): fp.write(data) return fpath + def _inject_files(self, instance, files): + disk_path = os.path.join(FLAGS.instances_path, + instance['name'], 'disk') + disk.inject_files(disk_path, files, use_cow=FLAGS.use_cow_images) + @exception.wrap_exception() def get_console_output(self, instance): console_log = os.path.join(FLAGS.instances_path, instance['name'], @@ -1065,6 +1070,10 @@ class LibvirtConnection(driver.ComputeDriver): if FLAGS.libvirt_type == 'uml': libvirt_utils.chown(basepath('disk'), 'root') + files_to_inject = inst.get('injected_files') + if files_to_inject: + self._inject_files(inst, files_to_inject) + @staticmethod def _volume_in_mapping(mount_device, block_device_info): block_device_list = [block_device.strip_dev(vol['mount_device']) -- cgit