summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/compute/manager.py11
-rw-r--r--nova/flags.py2
-rw-r--r--nova/virt/libvirt_conn.py4
-rw-r--r--nova/virt/xenapi/vm_utils.py50
-rw-r--r--nova/virt/xenapi/vmops.py26
-rw-r--r--nova/virt/xenapi_conn.py2
6 files changed, 51 insertions, 44 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index f9124aa6c..cf459d96a 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -162,23 +162,20 @@ class ComputeManager(manager.Manager):
context = context.elevated()
instance_ref = self.db.instance_get(context, instance_id)
- #FIXME(sirp): update_state currently only refreshes the state field
+ #NOTE(sirp): update_state currently only refreshes the state field
# if we add is_snapshotting, we will need this refreshed too,
# potentially?
self._update_state(context, instance_id)
- #TODO(sirp): check for is_snapshotting=True here?
+ logging.debug(_('instance %s: snapshotting'), instance_ref['name'])
if instance_ref['state'] != power_state.RUNNING:
- logging.warn('trying to snapshot a non-running '
- 'instance: %s (state: %s excepted: %s)',
+ logging.warn(_('trying to snapshot a non-running '
+ 'instance: %s (state: %s excepted: %s)'),
instance_ref['internal_id'],
instance_ref['state'],
power_state.RUNNING)
- logging.debug('instance %s: snapshotting', instance_ref['name'])
- #TODO(sirp): set is_snapshotting=True here?
self.driver.snapshot(instance_ref, name)
- #self._update_state(context, instance_id)
@exception.wrap_exception
def rescue_instance(self, context, instance_id):
diff --git a/nova/flags.py b/nova/flags.py
index b61447c76..d773a7e4c 100644
--- a/nova/flags.py
+++ b/nova/flags.py
@@ -213,7 +213,7 @@ DEFINE_string('connection_type', 'libvirt', 'libvirt, xenapi or fake')
DEFINE_string('aws_access_key_id', 'admin', 'AWS Access ID')
DEFINE_string('aws_secret_access_key', 'admin', 'AWS Access Key')
DEFINE_integer('glance_port', 9292, 'glance port')
-DEFINE_string('glance_host', utils.get_my_ip(),, 'glance host')
+DEFINE_string('glance_host', utils.get_my_ip(), 'glance host')
DEFINE_integer('s3_port', 3333, 's3 port')
DEFINE_string('s3_host', utils.get_my_ip(), 's3 host (for infrastructure)')
DEFINE_string('s3_dmz', utils.get_my_ip(), 's3 dmz ip (for instances)')
diff --git a/nova/virt/libvirt_conn.py b/nova/virt/libvirt_conn.py
index 3b5954b3b..c8d0aa306 100644
--- a/nova/virt/libvirt_conn.py
+++ b/nova/virt/libvirt_conn.py
@@ -239,9 +239,9 @@ class LibvirtConnection(object):
@exception.wrap_exception
def snapshot(self, instance):
""" Create snapshot from a running VM instance """
- #TODO(sirp): only exists for XenAPI driver for now
raise NotImplementedError(
- "Instance snapshotting is not supported for libvirt at this time")
+ _("Instance snapshotting is not supported for libvirt"
+ "at this time"))
@exception.wrap_exception
def reboot(self, instance):
diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py
index f4e608e4d..5b1c36418 100644
--- a/nova/virt/xenapi/vm_utils.py
+++ b/nova/virt/xenapi/vm_utils.py
@@ -153,17 +153,22 @@ class VMHelper():
@classmethod
- def create_snapshot(cls, session, vm_ref, label):
- logging.debug("Snapshotting VM %s with label '%s'...", vm_ref, label)
+ def create_snapshot(cls, session, instance_id, vm_ref, label):
+ logging.debug(_("Snapshotting VM %s with label '%s'..."), vm_ref, label)
#TODO(sirp): Add quiesce and VSS locking support when Windows support
# is added
#TODO(sirp): Make safe_lookup_vdi for assert?
vdi_refs = VMHelper.lookup_vm_vdis(session, vm_ref)
- if vdi_refs is None or len(vdi_refs) != 1:
- raise Exception("Unexpected number of VDIs (%s) found for VM %s"
- % (len(vdi_refs), vm_ref))
+ if vdi_refs is None:
+ raise Exception(_("No VDIs found for VM %s") % vm_ref)
+ else:
+ num_vdis = len(vdi_refs)
+ if num_vdis != 1:
+ raise Exception(_("Unexpected number of VDIs (%s) found for "
+ "VM %s") % (num_vdis, vm_ref))
+
vdi_ref = vdi_refs[0]
vdi_rec = session.get_xenapi().VDI.get_record(vdi_ref)
vdi_uuid = vdi_rec["uuid"]
@@ -171,20 +176,21 @@ class VMHelper():
original_parent_uuid = get_vhd_parent_uuid(session, vdi_ref)
task = session.call_xenapi('Async.VM.snapshot', vm_ref, label)
- template_vm_ref = session.wait_for_task(task)
- logging.debug('Created snapshot %s from VM %s.', template_vm_ref,
+ template_vm_ref = session.wait_for_task(instance_id, task)
+ logging.debug(_('Created snapshot %s from VM %s.'), template_vm_ref,
vm_ref)
sr_ref = vdi_rec["SR"]
parent_uuid = wait_for_vhd_coalesce(
- session, sr_ref, vdi_ref, original_parent_uuid)
+ session, instance_id, sr_ref, vdi_ref, original_parent_uuid)
#TODO(sirp): we need to assert only one parent, not parents two deep
return template_vm_ref, [vdi_uuid, parent_uuid]
@classmethod
- def upload_image(cls, session, vdi_uuids, image_name):
- logging.debug("Asking xapi to upload %s as '%s'", vdi_uuids, image_name)
+ def upload_image(cls, session, instance_id, vdi_uuids, image_name):
+ logging.debug(_("Asking xapi to upload %s as '%s'"),
+ vdi_uuids, image_name)
params = {'vdi_uuids': vdi_uuids,
'image_name': image_name,
@@ -193,11 +199,11 @@ class VMHelper():
kwargs = {'params': pickle.dumps(params)}
task = session.async_call_plugin('glance', 'put_vdis', kwargs)
- session.wait_for_task(task)
+ session.wait_for_task(instance_id, task)
@classmethod
- def fetch_image(cls, session, image, user, project, use_sr):
+ def fetch_image(cls, session, instance_id, image, user, project, use_sr):
"""use_sr: True to put the image as a VDI in an SR, False to place
it on dom0's filesystem. The former is for VM disks, the latter for
its kernel and ramdisk (if external kernels are being used).
@@ -214,7 +220,7 @@ class VMHelper():
if use_sr:
args['add_partition'] = 'true'
task = session.async_call_plugin('objectstore', fn, args)
- uuid = session.wait_for_task(task)
+ uuid = session.wait_for_task(instance_id, task)
return uuid
@classmethod
@@ -317,7 +323,7 @@ def get_vhd_parent(session, vdi_rec):
parent_ref = session.get_xenapi().VDI.get_by_uuid(parent_uuid)
parent_rec = session.get_xenapi().VDI.get_record(parent_ref)
#NOTE(sirp): changed log -> logging
- logging.debug("VHD %s has parent %s", vdi_rec['uuid'], parent_ref)
+ logging.debug(_("VHD %s has parent %s"), vdi_rec['uuid'], parent_ref)
return parent_ref, parent_rec
else:
return None
@@ -333,25 +339,27 @@ def get_vhd_parent_uuid(session, vdi_ref):
return None
-def scan_sr(session, sr_ref):
- logging.debug("Re-scanning SR %s", sr_ref)
+def scan_sr(session, instance_id, sr_ref):
+ logging.debug(_("Re-scanning SR %s"), sr_ref)
task = session.call_xenapi('Async.SR.scan', sr_ref)
- session.wait_for_task(task)
+ session.wait_for_task(instance_id, task)
-def wait_for_vhd_coalesce(session, sr_ref, vdi_ref, original_parent_uuid):
+def wait_for_vhd_coalesce(session, instance_id, sr_ref, vdi_ref,
+ original_parent_uuid):
""" TODO Explain why coalescing has to occur here """
#NOTE(sirp): for some reason re-scan wasn't occuring automatically on
# XS5.6
#TODO(sirp): we need to timeout this req after a while
def _poll_vhds():
- scan_sr(session, sr_ref)
+ scan_sr(session, instance_id, sr_ref)
parent_uuid = get_vhd_parent_uuid(session, vdi_ref)
if original_parent_uuid and (parent_uuid != original_parent_uuid):
logging.debug(
- "Parent %s doesn't match original parent %s, "
- "waiting for coalesce...", parent_uuid, original_parent_uuid)
+ _("Parent %s doesn't match original parent %s, "
+ "waiting for coalesce..."),
+ parent_uuid, original_parent_uuid)
else:
done.send(parent_uuid)
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index d011f4489..787f959a5 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -67,11 +67,14 @@ class VMOps(object):
user = AuthManager().get_user(instance.user_id)
project = AuthManager().get_project(instance.project_id)
vdi_uuid = VMHelper.fetch_image(
- self._session, instance.image_id, user, project, True)
+ self._session, instance.id, instance.image_id, user, project,
+ True)
kernel = VMHelper.fetch_image(
- self._session, instance.kernel_id, user, project, False)
+ self._session, instance.id, instance.kernel_id, user, project,
+ False)
ramdisk = VMHelper.fetch_image(
- self._session, instance.ramdisk_id, user, project, False)
+ self._session, instance.id, instance.ramdisk_id, user, project,
+ False)
vdi_ref = self._session.call_xenapi('VDI.get_by_uuid', vdi_uuid)
vm_ref = VMHelper.create_vm(
self._session, instance, kernel, ramdisk)
@@ -90,24 +93,25 @@ class VMOps(object):
#TODO(sirp): Add quiesce and VSS locking support when Windows support
# is added
- logging.debug("Starting snapshot for VM %s", instance)
+ logging.debug(_("Starting snapshot for VM %s"), instance)
vm_ref = VMHelper.lookup(self._session, instance.name)
label = "%s-snapshot" % instance.name
try:
template_vm_ref, template_vdi_uuids = VMHelper.create_snapshot(
- self._session, vm_ref, label)
+ self._session, instance.id, vm_ref, label)
except XenAPI.Failure, exc:
- logging.error("Unable to Snapshot %s: %s", vm_ref, exc)
+ logging.error(_("Unable to Snapshot %s: %s"), vm_ref, exc)
return
try:
# call plugin to ship snapshot off to glance
- VMHelper.upload_image(self._session, template_vdi_uuids, name)
+ VMHelper.upload_image(
+ self._session, instance.id, template_vdi_uuids, name)
finally:
- self._destroy(template_vm_ref, shutdown=False)
+ self._destroy(instance, template_vm_ref, shutdown=False)
- logging.debug("Finished snapshot and upload for VM %s", instance)
+ logging.debug(_("Finished snapshot and upload for VM %s"), instance)
def reboot(self, instance):
"""Reboot VM instance"""
@@ -121,9 +125,9 @@ class VMOps(object):
def destroy(self, instance):
"""Destroy VM instance"""
vm = VMHelper.lookup(self._session, instance.name)
- return self._destroy(vm, shutdown=True)
+ return self._destroy(instance, vm, shutdown=True)
- def _destroy(self, vm, shutdown=True):
+ def _destroy(self, instance, vm, shutdown=True):
""" Destroy VM instance """
if vm is None:
# Don't complain, just return. This lets us clean up instances
diff --git a/nova/virt/xenapi_conn.py b/nova/virt/xenapi_conn.py
index e6bc80d6e..58ad6ca6a 100644
--- a/nova/virt/xenapi_conn.py
+++ b/nova/virt/xenapi_conn.py
@@ -124,8 +124,6 @@ class XenAPIConnection(object):
def snapshot(self, instance, name):
""" Create snapshot from a running VM instance """
- #TODO(sirp): Add quiesce and VSS locking support when Windows support
- # is added
self._vmops.snapshot(instance, name)
def reboot(self, instance):