summaryrefslogtreecommitdiffstats
path: root/nova/virt/libvirt/connection.py
diff options
context:
space:
mode:
Diffstat (limited to 'nova/virt/libvirt/connection.py')
-rw-r--r--nova/virt/libvirt/connection.py133
1 files changed, 82 insertions, 51 deletions
diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py
index 4455dacec..37ad07736 100644
--- a/nova/virt/libvirt/connection.py
+++ b/nova/virt/libvirt/connection.py
@@ -54,7 +54,6 @@ from xml.etree import ElementTree
from nova.auth import manager
from nova import block_device
-from nova.common import cfg
from nova.compute import instance_types
from nova.compute import power_state
from nova import context as nova_context
@@ -63,10 +62,13 @@ from nova import exception
from nova import flags
import nova.image
from nova import log as logging
+from nova.openstack.common import cfg
from nova import utils
-from nova.virt.disk import api as disk
from nova.virt import driver
from nova.virt import images
+from nova.virt.disk import api as disk
+from nova.virt.libvirt import firewall
+from nova.virt.libvirt import imagecache
from nova.virt.libvirt import utils as libvirt_utils
@@ -186,10 +188,12 @@ class LibvirtConnection(driver.ComputeDriver):
super(LibvirtConnection, self).__init__()
self._host_state = None
+ self._initiator = None
self._wrapped_conn = None
self.container = None
self.read_only = read_only
-
+ if FLAGS.firewall_driver not in firewall.drivers:
+ FLAGS['firewall_driver'].SetDefault(firewall.drivers[0])
fw_class = utils.import_class(FLAGS.firewall_driver)
self.firewall_driver = fw_class(get_connection=self._get_connection)
self.vif_driver = utils.import_object(FLAGS.libvirt_vif_driver)
@@ -209,6 +213,8 @@ class LibvirtConnection(driver.ComputeDriver):
self.default_ephemeral_device = self._disk_prefix + 'b'
self.default_swap_device = self._disk_prefix + 'c'
+ self.image_cache_manager = imagecache.ImageCacheManager()
+
@property
def host_state(self):
if not self._host_state:
@@ -420,6 +426,16 @@ class LibvirtConnection(driver.ComputeDriver):
if os.path.exists(target):
shutil.rmtree(target)
+ def get_volume_connector(self, _instance):
+ if not self._initiator:
+ self._initiator = libvirt_utils.get_iscsi_initiator()
+ if not self._initiator:
+ LOG.warn(_('Could not determine iscsi initiator name'))
+ return {
+ 'ip': FLAGS.my_ip,
+ 'initiator': self._initiator,
+ }
+
def volume_driver_method(self, method_name, connection_info,
*args, **kwargs):
driver_type = connection_info.get('driver_volume_type')
@@ -690,8 +706,7 @@ class LibvirtConnection(driver.ComputeDriver):
block_device_info=block_device_info)
domain = self._create_new_domain(xml)
- LOG.debug(_("instance %s: is running"), instance['name'],
- instance=instance)
+ LOG.debug(_("instance is running"), instance=instance)
self.firewall_driver.apply_instance_filter(instance, network_info)
def _wait_for_boot():
@@ -701,13 +716,13 @@ class LibvirtConnection(driver.ComputeDriver):
try:
state = self.get_info(instance_name)['state']
except exception.NotFound:
- msg = _("During reboot, %s disappeared.") % instance_name
- LOG.error(msg, instance=instance)
+ LOG.error(_("During reboot, instance disappeared."),
+ instance=instance)
raise utils.LoopingCallDone
if state == power_state.RUNNING:
- msg = _("Instance %s spawned successfully.") % instance_name
- LOG.info(msg, instance=instance)
+ LOG.info(_("Instance spawned successfully."),
+ instance=instance)
raise utils.LoopingCallDone
timer = utils.LoopingCall(_wait_for_boot)
@@ -720,7 +735,7 @@ class LibvirtConnection(driver.ComputeDriver):
if virsh_output.startswith('/dev/'):
LOG.info(_("cool, it's a device"))
out, err = utils.execute('dd',
- "if=%s" % virsh_output,
+ 'if=%s' % virsh_output,
'iflag=nonblock',
run_as_root=True,
check_exit_code=False)
@@ -734,10 +749,11 @@ class LibvirtConnection(driver.ComputeDriver):
fp.write(data)
return fpath
- def _inject_files(self, instance, files):
+ def _inject_files(self, instance, files, partition):
disk_path = os.path.join(FLAGS.instances_path,
instance['name'], 'disk')
- disk.inject_files(disk_path, files, use_cow=FLAGS.use_cow_images)
+ disk.inject_files(disk_path, files, partition=partition,
+ use_cow=FLAGS.use_cow_images)
@exception.wrap_exception()
def get_console_output(self, instance):
@@ -748,7 +764,8 @@ class LibvirtConnection(driver.ComputeDriver):
if FLAGS.libvirt_type == 'xen':
# Xen is special
- virsh_output = utils.execute('virsh', 'ttyconsole',
+ virsh_output = utils.execute('virsh',
+ 'ttyconsole',
instance['name'])
data = self._flush_xen_console(virsh_output)
fpath = self._append_to_file(data, console_log)
@@ -823,7 +840,6 @@ class LibvirtConnection(driver.ComputeDriver):
"""
generating = 'image_id' not in kwargs
-
if not os.path.exists(target):
base_dir = os.path.join(FLAGS.instances_path, '_base')
if not os.path.exists(base_dir):
@@ -866,6 +882,16 @@ class LibvirtConnection(driver.ComputeDriver):
"""Grab image to raw format"""
images.fetch_to_raw(context, image_id, target, user_id, project_id)
+ if FLAGS.checksum_base_images:
+ f = open(target, 'r')
+ checksum = utils.hash_file(f)
+ f.close()
+
+ checksum_fname = '%s.sha1' % target
+ fd = os.open(checksum_filename, os.O_WRONLY, mode=0444)
+ os.write(fd, checksum)
+ os.close(fd)
+
@staticmethod
def _create_local(target, local_size, unit='G', fs_format=None):
"""Create a blank image of specified size"""
@@ -888,7 +914,7 @@ class LibvirtConnection(driver.ComputeDriver):
libvirt_utils.create_image('raw', target, '%dM' % swap_mb)
libvirt_utils.mkfs('swap', target)
- def _create_image(self, context, inst, libvirt_xml, suffix='',
+ def _create_image(self, context, instance, libvirt_xml, suffix='',
disk_images=None, network_info=None,
block_device_info=None):
if not suffix:
@@ -897,13 +923,13 @@ class LibvirtConnection(driver.ComputeDriver):
# syntactic nicety
def basepath(fname='', suffix=suffix):
return os.path.join(FLAGS.instances_path,
- inst['name'],
+ instance['name'],
fname + suffix)
# ensure directories exist and are writable
libvirt_utils.ensure_tree(basepath(suffix=''))
- LOG.info(_('instance %s: Creating image'), inst['name'])
+ LOG.info(_('Creating image'), instance=instance)
libvirt_utils.write_to_file(basepath('libvirt.xml'), libvirt_xml)
if FLAGS.libvirt_type == 'lxc':
@@ -914,9 +940,9 @@ class LibvirtConnection(driver.ComputeDriver):
libvirt_utils.write_to_file(basepath('console.log', ''), '', 007)
if not disk_images:
- disk_images = {'image_id': inst['image_ref'],
- 'kernel_id': inst['kernel_id'],
- 'ramdisk_id': inst['ramdisk_id']}
+ disk_images = {'image_id': instance['image_ref'],
+ 'kernel_id': instance['kernel_id'],
+ 'ramdisk_id': instance['ramdisk_id']}
if disk_images['kernel_id']:
fname = disk_images['kernel_id']
@@ -925,8 +951,8 @@ class LibvirtConnection(driver.ComputeDriver):
target=basepath('kernel'),
fname=fname,
image_id=disk_images['kernel_id'],
- user_id=inst['user_id'],
- project_id=inst['project_id'])
+ user_id=instance['user_id'],
+ project_id=instance['project_id'])
if disk_images['ramdisk_id']:
fname = disk_images['ramdisk_id']
self._cache_image(fn=libvirt_utils.fetch_image,
@@ -934,19 +960,19 @@ class LibvirtConnection(driver.ComputeDriver):
target=basepath('ramdisk'),
fname=fname,
image_id=disk_images['ramdisk_id'],
- user_id=inst['user_id'],
- project_id=inst['project_id'])
+ user_id=instance['user_id'],
+ project_id=instance['project_id'])
root_fname = hashlib.sha1(str(disk_images['image_id'])).hexdigest()
- size = inst['root_gb'] * 1024 * 1024 * 1024
+ size = instance['root_gb'] * 1024 * 1024 * 1024
- inst_type_id = inst['instance_type_id']
+ inst_type_id = instance['instance_type_id']
inst_type = instance_types.get_instance_type(inst_type_id)
if size == 0 or suffix == '.rescue':
size = None
root_fname += "_sm"
else:
- root_fname += "_%d" % inst['root_gb']
+ root_fname += "_%d" % instance['root_gb']
if not self._volume_in_mapping(self.default_root_device,
block_device_info):
@@ -956,31 +982,31 @@ class LibvirtConnection(driver.ComputeDriver):
fname=root_fname,
cow=FLAGS.use_cow_images,
image_id=disk_images['image_id'],
- user_id=inst['user_id'],
- project_id=inst['project_id'],
+ user_id=instance['user_id'],
+ project_id=instance['project_id'],
size=size)
- ephemeral_gb = inst['ephemeral_gb']
+ ephemeral_gb = instance['ephemeral_gb']
if ephemeral_gb and not self._volume_in_mapping(
self.default_ephemeral_device, block_device_info):
fn = functools.partial(self._create_ephemeral,
fs_label='ephemeral0',
- os_type=inst.os_type)
+ os_type=instance.os_type)
self._cache_image(fn=fn,
target=basepath('disk.local'),
fname="ephemeral_%s_%s_%s" %
- ("0", ephemeral_gb, inst.os_type),
+ ("0", ephemeral_gb, instance.os_type),
cow=FLAGS.use_cow_images,
ephemeral_size=ephemeral_gb)
for eph in driver.block_device_info_get_ephemerals(block_device_info):
fn = functools.partial(self._create_ephemeral,
fs_label='ephemeral%d' % eph['num'],
- os_type=inst.os_type)
+ os_type=instance.os_type)
self._cache_image(fn=fn,
target=basepath(_get_eph_disk(eph)),
fname="ephemeral_%s_%s_%s" %
- (eph['num'], eph['size'], inst.os_type),
+ (eph['num'], eph['size'], instance.os_type),
cow=FLAGS.use_cow_images,
ephemeral_size=eph['size'])
@@ -1005,11 +1031,11 @@ class LibvirtConnection(driver.ComputeDriver):
# partitioned disk image where the target partition is the first
# partition
target_partition = None
- if not inst['kernel_id']:
+ if not instance['kernel_id']:
target_partition = "1"
- config_drive_id = inst.get('config_drive_id')
- config_drive = inst.get('config_drive')
+ config_drive_id = instance.get('config_drive_id')
+ config_drive = instance.get('config_drive')
if any((FLAGS.libvirt_type == 'lxc', config_drive, config_drive_id)):
target_partition = None
@@ -1020,14 +1046,14 @@ class LibvirtConnection(driver.ComputeDriver):
target=basepath('disk.config'),
fname=fname,
image_id=config_drive_id,
- user_id=inst['user_id'],
- project_id=inst['project_id'],)
+ user_id=instance['user_id'],
+ project_id=instance['project_id'],)
elif config_drive:
self._create_local(basepath('disk.config'), 64, unit='M',
fs_format='msdos') # 64MB
- if inst['key_data']:
- key = str(inst['key_data'])
+ if instance['key_data']:
+ key = str(instance['key_data'])
else:
key = None
net = None
@@ -1069,22 +1095,21 @@ class LibvirtConnection(driver.ComputeDriver):
searchList=[{'interfaces': nets,
'use_ipv6': FLAGS.use_ipv6}]))
- metadata = inst.get('metadata')
+ metadata = instance.get('metadata')
if any((key, net, metadata)):
- inst_name = inst['name']
+ instance_name = instance['name']
if config_drive: # Should be True or None by now.
injection_path = basepath('disk.config')
img_id = 'config-drive'
else:
injection_path = basepath('disk')
- img_id = inst.image_ref
+ img_id = instance.image_ref
for injection in ('metadata', 'key', 'net'):
if locals()[injection]:
- LOG.info(_('instance %(inst_name)s: injecting '
- '%(injection)s into image %(img_id)s'
- % locals()))
+ LOG.info(_('Injecting %(injection)s into image %(img_id)s'
+ % locals()), instance=instance)
try:
disk.inject_data(injection_path, key, net, metadata,
partition=target_partition,
@@ -1092,8 +1117,9 @@ class LibvirtConnection(driver.ComputeDriver):
except Exception as e:
# This could be a windows image, or a vmdk format disk
- LOG.warn(_('instance %(inst_name)s: ignoring error injecting'
- ' data into image %(img_id)s (%(e)s)') % locals())
+ LOG.warn(_('Ignoring error injecting data into image '
+ '%(img_id)s (%(e)s)') % locals(),
+ instance=instance)
if FLAGS.libvirt_type == 'lxc':
self.container = disk.setup_container(basepath('disk'),
@@ -1103,9 +1129,10 @@ class LibvirtConnection(driver.ComputeDriver):
if FLAGS.libvirt_type == 'uml':
libvirt_utils.chown(basepath('disk'), 'root')
- files_to_inject = inst.get('injected_files')
+ files_to_inject = instance.get('injected_files')
if files_to_inject:
- self._inject_files(inst, files_to_inject)
+ self._inject_files(instance, files_to_inject,
+ partition=target_partition)
@staticmethod
def _volume_in_mapping(mount_device, block_device_info):
@@ -1996,6 +2023,10 @@ class LibvirtConnection(driver.ComputeDriver):
"""Sets the specified host's ability to accept new instances."""
pass
+ def manage_image_cache(self, context):
+ """Manage the local cache of images."""
+ self.image_cache_manager.verify_base_images(context)
+
class HostState(object):
"""Manages information about the compute node through libvirt"""