diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-09-07 23:00:04 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-09-07 23:00:04 +0000 |
| commit | 8ee8a91470a4960eebcbd3d54815608bcb1fcfd5 (patch) | |
| tree | 1dd6ce601ad3a3c5700574eed98b72a2384d7243 /nova | |
| parent | 2caf52e5b0d725abf124cfe289859900c334eeb8 (diff) | |
| parent | 6392ad2924874487b7428e70f7cd49748fff8e5c (diff) | |
| download | nova-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.py | 6 | ||||
| -rw-r--r-- | nova/tests/xenapi/stubs.py | 7 | ||||
| -rw-r--r-- | nova/virt/xenapi/driver.py | 6 | ||||
| -rw-r--r-- | nova/virt/xenapi/fake.py | 9 | ||||
| -rw-r--r-- | nova/virt/xenapi/vm_utils.py | 33 | ||||
| -rw-r--r-- | nova/virt/xenapi/vmops.py | 13 |
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) |
