summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Waldon <bcwaldon@gmail.com>2012-01-28 13:14:33 -0800
committerBrian Waldon <bcwaldon@gmail.com>2012-01-28 15:22:38 -0800
commiteb3e1749074a82a612c5fb84960f6fe9b6aaf8d2 (patch)
tree4a214ea69e667f17ba298ba6a8017a33811391bc
parent02b872625b94c3c63674d8c64b23f80215b04a15 (diff)
Support file injection on boot w/ Libvirt
Implementes bp libvirt-file-injection Change-Id: I25a5cc1b2261726e9603349df323e29cd1ed31e8
-rw-r--r--nova/virt/disk/api.py23
-rw-r--r--nova/virt/libvirt/connection.py9
2 files changed, 32 insertions, 0 deletions
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'])