summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-09-07 23:00:04 +0000
committerGerrit Code Review <review@openstack.org>2012-09-07 23:00:04 +0000
commit8ee8a91470a4960eebcbd3d54815608bcb1fcfd5 (patch)
tree1dd6ce601ad3a3c5700574eed98b72a2384d7243 /nova
parent2caf52e5b0d725abf124cfe289859900c334eeb8 (diff)
parent6392ad2924874487b7428e70f7cd49748fff8e5c (diff)
downloadnova-8ee8a91470a4960eebcbd3d54815608bcb1fcfd5.tar.gz
nova-8ee8a91470a4960eebcbd3d54815608bcb1fcfd5.tar.xz
nova-8ee8a91470a4960eebcbd3d54815608bcb1fcfd5.zip
Merge "xenapi: Make dom0 serialization consistent."
Diffstat (limited to 'nova')
-rw-r--r--nova/tests/test_xenapi.py6
-rw-r--r--nova/tests/xenapi/stubs.py7
-rw-r--r--nova/virt/xenapi/driver.py6
-rw-r--r--nova/virt/xenapi/fake.py9
-rw-r--r--nova/virt/xenapi/vm_utils.py33
-rw-r--r--nova/virt/xenapi/vmops.py13
6 files changed, 34 insertions, 40 deletions
diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py
index ea6ed857c..2bf7429bd 100644
--- a/nova/tests/test_xenapi.py
+++ b/nova/tests/test_xenapi.py
@@ -2105,6 +2105,10 @@ class VmUtilsTestCase(test.TestCase):
def call_plugin(session_self, service, command, kwargs):
self.kwargs = kwargs
+ def call_plugin_serialized(session_self, service, command, *args,
+ **kwargs):
+ self.kwargs = kwargs
+
def fake_dumps(thing):
return thing
@@ -2119,7 +2123,7 @@ class VmUtilsTestCase(test.TestCase):
session = FakeSession()
vm_utils.upload_image(ctx, session, instance, "vmi uuids", "image id")
- actual = self.kwargs['params']['properties']
+ actual = self.kwargs['properties']
expected = dict(a=1, b=2, c='c', d='d',
auto_disk_config='auto disk config',
os_type='os type')
diff --git a/nova/tests/xenapi/stubs.py b/nova/tests/xenapi/stubs.py
index bb31a5327..3bfdd3dbe 100644
--- a/nova/tests/xenapi/stubs.py
+++ b/nova/tests/xenapi/stubs.py
@@ -16,6 +16,7 @@
"""Stubouts, mocks and fixtures for the test suite"""
import contextlib
+import pickle
import random
import sys
@@ -169,7 +170,7 @@ class FakeSessionForVMTests(fake.SessionBase):
def host_call_plugin(self, _1, _2, plugin, method, _5):
if (plugin, method) == ('glance', 'download_vhd'):
root_uuid = _make_fake_vdi()
- return jsonutils.dumps(dict(root=dict(uuid=root_uuid)))
+ return pickle.dumps(dict(root=dict(uuid=root_uuid)))
elif (plugin, method) == ("xenhost", "iptables_config"):
return fake.as_json(out=self._fake_iptables_save_output,
err='')
@@ -181,8 +182,8 @@ class FakeSessionForVMTests(fake.SessionBase):
if (plugin, method) == ('glance', 'download_vhd'):
root_uuid = _make_fake_vdi()
swap_uuid = _make_fake_vdi()
- return jsonutils.dumps(dict(root=dict(uuid=root_uuid),
- swap=dict(uuid=swap_uuid)))
+ return pickle.dumps(dict(root=dict(uuid=root_uuid),
+ swap=dict(uuid=swap_uuid)))
else:
return (super(FakeSessionForVMTests, self).
host_call_plugin(_1, _2, plugin, method, _5))
diff --git a/nova/virt/xenapi/driver.py b/nova/virt/xenapi/driver.py
index 644f598ca..09eba2489 100644
--- a/nova/virt/xenapi/driver.py
+++ b/nova/virt/xenapi/driver.py
@@ -38,6 +38,7 @@ A driver for XenServer or Xen Cloud Platform.
"""
import contextlib
+import cPickle as pickle
import time
import urlparse
import xmlrpclib
@@ -710,6 +711,11 @@ class XenAPISession(object):
session.xenapi.host.call_plugin,
host, plugin, fn, args)
+ def call_plugin_serialized(self, plugin, fn, *args, **kwargs):
+ params = {'params': pickle.dumps(dict(args=args, kwargs=kwargs))}
+ rv = self.call_plugin(plugin, fn, params)
+ return pickle.loads(rv)
+
def _create_session(self, url):
"""Stubout point. This can be replaced with a mock session."""
return self.XenAPI.Session(url)
diff --git a/nova/virt/xenapi/fake.py b/nova/virt/xenapi/fake.py
index 3b3100f21..27feb3a05 100644
--- a/nova/virt/xenapi/fake.py
+++ b/nova/virt/xenapi/fake.py
@@ -50,7 +50,7 @@
A fake XenAPI SDK.
"""
-
+import pickle
import random
import uuid
from xml.sax import saxutils
@@ -561,12 +561,15 @@ class SessionBase(object):
def _plugin_noop(self, method, args):
return ''
- _plugin_glance_upload_vhd = _plugin_noop
+ def _plugin_pickle_noop(self, method, args):
+ return pickle.dumps(None)
+
+ _plugin_glance_upload_vhd = _plugin_pickle_noop
_plugin_kernel_copy_vdi = _plugin_noop
_plugin_kernel_create_kernel_ramdisk = _plugin_noop
_plugin_kernel_remove_kernel_ramdisk = _plugin_noop
_plugin_migration_move_vhds_into_sr = _plugin_noop
- _plugin_migration_transfer_vhd = _plugin_noop
+ _plugin_migration_transfer_vhd = _plugin_pickle_noop
def _plugin_xenhost_host_data(self, method, args):
return jsonutils.dumps({'host_memory': {'total': 10,
diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py
index 97650b248..458b0dcad 100644
--- a/nova/virt/xenapi/vm_utils.py
+++ b/nova/virt/xenapi/vm_utils.py
@@ -22,7 +22,6 @@ their attributes like VDIs, VIFs, as well as their lookup functions.
"""
import contextlib
-import cPickle as pickle
import decimal
import os
import re
@@ -44,7 +43,6 @@ from nova import flags
from nova.image import glance
from nova.openstack.common import cfg
from nova.openstack.common import excutils
-from nova.openstack.common import jsonutils
from nova.openstack.common import log as logging
from nova import utils
from nova.virt.disk import api as disk
@@ -467,17 +465,11 @@ def _safe_copy_vdi(session, sr_ref, instance, vdi_to_copy_ref):
"""
with _dummy_vm(session, instance, vdi_to_copy_ref) as vm_ref:
label = "snapshot"
-
with snapshot_attached_here(
session, instance, vm_ref, label) as vdi_uuids:
- params = {'sr_path': get_sr_path(session),
- 'vdi_uuids': vdi_uuids,
- 'uuid_stack': _make_uuid_stack()}
-
- kwargs = {'params': pickle.dumps(params)}
- result = session.call_plugin(
- 'workarounds', 'safe_copy_vdis', kwargs)
- imported_vhds = jsonutils.loads(result)
+ imported_vhds = session.call_plugin_serialized(
+ 'workarounds', 'safe_copy_vdis', sr_path=get_sr_path(session),
+ vdi_uuids=vdi_uuids, uuid_stack=_make_uuid_stack())
root_uuid = imported_vhds['root']['uuid']
@@ -674,8 +666,7 @@ def upload_image(context, session, instance, vdi_uuids, image_id):
'auth_token': getattr(context, 'auth_token', None),
'properties': properties}
- kwargs = {'params': pickle.dumps(params)}
- session.call_plugin('glance', 'upload_vhd', kwargs)
+ session.call_plugin_serialized('glance', 'upload_vhd', **params)
def resize_disk(session, instance, vdi_ref, instance_type):
@@ -971,9 +962,9 @@ def _fetch_using_dom0_plugin_with_retry(context, session, image_id,
try:
if callback:
callback(params)
- kwargs = {'params': pickle.dumps(params)}
- result = session.call_plugin(plugin_name, 'download_vhd', kwargs)
- return jsonutils.loads(result)
+
+ return session.call_plugin_serialized(
+ plugin_name, 'download_vhd', **params)
except session.XenAPI.Failure as exc:
_type, _method, error = exc.details[:3]
if error == 'RetryableError':
@@ -2163,13 +2154,9 @@ def ensure_correct_host(session):
def move_disks(session, instance, disk_info):
"""Move and possibly link VHDs via the XAPI plugin."""
- params = {'instance_uuid': instance['uuid'],
- 'sr_path': get_sr_path(session),
- 'uuid_stack': _make_uuid_stack()}
-
- result = session.call_plugin(
- 'migration', 'move_vhds_into_sr', {'params': pickle.dumps(params)})
- imported_vhds = jsonutils.loads(result)
+ imported_vhds = session.call_plugin_serialized(
+ 'migration', 'move_vhds_into_sr', instance_uuid=instance['uuid'],
+ sr_path=get_sr_path(session), uuid_stack=_make_uuid_stack())
# Now we rescan the SR so we find the VHDs
scan_default_sr(session)
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index 090a16d46..813158246 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -19,7 +19,6 @@
Management class for VM-related functions (spawn, reboot, etc).
"""
-import cPickle as pickle
import functools
import itertools
import time
@@ -610,16 +609,10 @@ class VMOps(object):
LOG.debug(_("Migrating VHD '%(vdi_uuid)s' with seq_num %(seq_num)d"),
locals(), instance=instance)
instance_uuid = instance['uuid']
- params = {'host': dest,
- 'vdi_uuid': vdi_uuid,
- 'instance_uuid': instance_uuid,
- 'sr_path': sr_path,
- 'seq_num': seq_num}
-
try:
- _params = {'params': pickle.dumps(params)}
- self._session.call_plugin('migration', 'transfer_vhd',
- _params)
+ self._session.call_plugin_serialized('migration', 'transfer_vhd',
+ instance_uuid=instance_uuid, host=dest, vdi_uuid=vdi_uuid,
+ sr_path=sr_path, seq_num=seq_num)
except self._session.XenAPI.Failure:
msg = _("Failed to transfer vhd to new host")
raise exception.MigrationError(reason=msg)