From 6390508fc9622fdc1ed87974ce416f17e9983592 Mon Sep 17 00:00:00 2001 From: Nikola Dipanov Date: Wed, 31 Oct 2012 16:24:30 +0100 Subject: Make bdms primitive in rpcapi.terminate_instance This patch converts bdms (a list of block device mappings) passed to nova.compute.rpcapi.terminate_instance to primitive types that are safe to be sent to the rpc backend. Also fixes the fake BDM classes used in: * nova.tests.api.ec2.test_cloud * nova.tests.api.openstack.compute.test_server_actions to pass through josnutils.to_primitive properly and not confuse it due to wrongly delegated dotted lookups fixes bug #1073240 Change-Id: I329a48c1a53dde5895a329b39f32854c286de071 --- nova/compute/rpcapi.py | 3 ++- nova/tests/api/ec2/test_cloud.py | 28 ++++++++++++++++++---- .../api/openstack/compute/test_server_actions.py | 12 +++++++++- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py index 38d9b3426..1eec56833 100644 --- a/nova/compute/rpcapi.py +++ b/nova/compute/rpcapi.py @@ -513,8 +513,9 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy): def terminate_instance(self, ctxt, instance, bdms): instance_p = jsonutils.to_primitive(instance) + bdms_p = jsonutils.to_primitive(bdms) self.cast(ctxt, self.make_msg('terminate_instance', - instance=instance_p, bdms=bdms), + instance=instance_p, bdms=bdms_p), topic=_compute_topic(self.topic, ctxt, None, instance), version='2.4') diff --git a/nova/tests/api/ec2/test_cloud.py b/nova/tests/api/ec2/test_cloud.py index 1abde1069..a6995945b 100644 --- a/nova/tests/api/ec2/test_cloud.py +++ b/nova/tests/api/ec2/test_cloud.py @@ -1825,19 +1825,30 @@ class CloudTestCase(test.TestCase): class BDM(object): def __init__(self): self.no_device = None - self.values = dict(snapshot_id=snapshots[0], + self.values = dict(id=1, + snapshot_id=snapshots[0], volume_id=volumes[0], virtual_name=None, volume_size=1, device_name='sda1', - delete_on_termination=False) + delete_on_termination=False, + connection_info='{"foo":"bar"}') def __getattr__(self, name): - return self.values.get(name) + """Properly delegate dotted lookups""" + if name in self.__dict__['values']: + return self.values.get(name) + try: + return self.__dict__[name] + except KeyError: + raise AttributeError def __getitem__(self, key): return self.values.get(key) + def iteritems(self): + return self.values.iteritems() + return [BDM()] self.stubs.Set(db, 'block_device_mapping_get_all_by_instance', @@ -1913,11 +1924,20 @@ class CloudTestCase(test.TestCase): delete_on_termination=False) def __getattr__(self, name): - return self.values.get(name) + """Properly delegate dotted lookups""" + if name in self.__dict__['values']: + return self.values.get(name) + try: + return self.__dict__[name] + except KeyError: + raise AttributeError def __getitem__(self, key): return self.values.get(key) + def iteritems(self): + return self.values.iteritems() + return [BDM()] self.stubs.Set(db, 'block_device_mapping_get_all_by_instance', diff --git a/nova/tests/api/openstack/compute/test_server_actions.py b/nova/tests/api/openstack/compute/test_server_actions.py index 995e566f3..0afa00f2b 100644 --- a/nova/tests/api/openstack/compute/test_server_actions.py +++ b/nova/tests/api/openstack/compute/test_server_actions.py @@ -722,14 +722,24 @@ class ServerActionsControllerTest(test.TestCase): virtual_name=None, volume_size=1, device_name='vda', + snapshot_id=1, delete_on_termination=False) def __getattr__(self, name): - return self.values.get(name) + """Properly delegate dotted lookups""" + if name in self.__dict__['values']: + return self.values.get(name) + try: + return self.__dict__[name] + except KeyError: + raise AttributeError def __getitem__(self, key): return self.values.get(key) + def iteritems(self): + return self.values.iteritems() + return [BDM()] self.stubs.Set(db, 'block_device_mapping_get_all_by_instance', -- cgit