From 33617adb34e458e06de9498922d991f3c78e039a Mon Sep 17 00:00:00 2001 From: Justin Santa Barbara Date: Wed, 25 Apr 2012 16:30:37 -0700 Subject: [PATCH] Add a force_config_drive flag Config drive can currently only be requested via the API. That doesn't play nice with horizon, and requires the caller to know what the image expects. Currently, only None or 'always' are documented (although any value is treated as 'always'). I expect we'll want 'never', 'byimage' etc in future. Bug #988556 Change-Id: I895a6a9fd3e6395bb00f54f26531b6faf0c9f4f1 --- nova/virt/libvirt/connection.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index af3379482a1b..ef95b12cedfa 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -151,7 +151,13 @@ libvirt_opts = [ cfg.BoolOpt('libvirt_nonblocking', default=False, help='Use a separated OS thread pool to realize non-blocking' - ' libvirt calls') + ' libvirt calls'), + # force_config_drive is a string option, to allow for future behaviors + # (e.g. use config_drive based on image properties) + cfg.StrOpt('force_config_drive', + default=None, + help='Set to force injection to take place on a config drive ' + '(if set, valid options are: always)'), ] FLAGS = flags.FLAGS @@ -1265,8 +1271,7 @@ class LibvirtConnection(driver.ComputeDriver): if not instance['kernel_id']: target_partition = "1" - config_drive_id = instance.get('config_drive_id') - config_drive = instance.get('config_drive') + config_drive, config_drive_id = self._get_config_drive_info(instance) if any((FLAGS.libvirt_type == 'lxc', config_drive, config_drive_id)): target_partition = None @@ -1389,6 +1394,18 @@ class LibvirtConnection(driver.ComputeDriver): LOG.debug(_("block_device_list %s"), block_device_list) return block_device.strip_dev(mount_device) in block_device_list + def _get_config_drive_info(self, instance): + config_drive = instance.get('config_drive') + config_drive_id = instance.get('config_drive_id') + if FLAGS.force_config_drive: + if not config_drive_id: + config_drive = True + return config_drive, config_drive_id + + def _has_config_drive(self, instance): + config_drive, config_drive_id = self._get_config_drive_info(instance) + return any((config_drive, config_drive_id)) + def get_guest_config(self, instance, network_info, image_meta, rescue, block_device_info=None): block_device_mapping = driver.block_device_info_get_mapping( @@ -1610,7 +1627,7 @@ class LibvirtConnection(driver.ComputeDriver): mountpoint) guest.add_device(cfg) - if instance.get('config_drive') or instance.get('config_drive_id'): + if self._has_config_drive(instance): diskconfig = config.LibvirtConfigGuestDisk() diskconfig.source_type = "file" diskconfig.driver_format = "raw"