Make change_instance_metadata() use objects

This patch makes the compute manager change_instance_metadata()
method take an instance object.

Related to blueprint compute-manager-objects

Change-Id: I4139ef8db87bb42cc05cbfb7cbe38aea27235f8b
This commit is contained in:
Dan Smith 2013-12-19 13:19:09 -08:00
parent f474441263
commit 74b7be410f
11 changed files with 57 additions and 43 deletions

View File

@ -1757,7 +1757,8 @@ class CloudController(object):
for ec2_id in resources:
instance_uuid = ec2utils.ec2_inst_id_to_uuid(context, ec2_id)
instance = self.compute_api.get(context, instance_uuid)
instance = self.compute_api.get(context, instance_uuid,
want_objects=True)
self.compute_api.update_instance_metadata(context,
instance, metadata)
@ -1791,7 +1792,8 @@ class CloudController(object):
for ec2_id in resources:
instance_uuid = ec2utils.ec2_inst_id_to_uuid(context, ec2_id)
instance = self.compute_api.get(context, instance_uuid)
instance = self.compute_api.get(context, instance_uuid,
want_objects=True)
for tag in tags:
if not isinstance(tag, dict):
msg = _('Expecting tagSet to be key/value pairs')

View File

@ -104,7 +104,8 @@ class ServerMetadataController(wsgi.Controller):
def _update_instance_metadata(self, context, server_id, metadata,
delete=False):
try:
server = self.compute_api.get(context, server_id)
server = self.compute_api.get(context, server_id,
want_objects=True)
return self.compute_api.update_instance_metadata(context,
server,
metadata,
@ -155,7 +156,8 @@ class ServerMetadataController(wsgi.Controller):
raise exc.HTTPNotFound(explanation=msg)
try:
server = self.compute_api.get(context, server_id)
server = self.compute_api.get(context, server_id,
want_objects=True)
self.compute_api.delete_instance_metadata(context, server, id)
except exception.InstanceNotFound:

View File

@ -111,7 +111,8 @@ class Controller(object):
def _update_instance_metadata(self, context, server_id, metadata,
delete=False):
try:
server = self.compute_api.get(context, server_id)
server = self.compute_api.get(context, server_id,
want_objects=True)
return self.compute_api.update_instance_metadata(context,
server,
metadata,
@ -165,7 +166,8 @@ class Controller(object):
raise exc.HTTPNotFound(explanation=msg)
try:
server = self.compute_api.get(context, server_id)
server = self.compute_api.get(context, server_id,
want_objects=True)
self.compute_api.delete_instance_metadata(context, server, id)
except exception.InstanceNotFound:

View File

@ -2907,19 +2907,17 @@ class API(base.Base):
`metadata` argument will be deleted.
"""
orig = self.get_instance_metadata(context, instance)
orig = dict(instance.metadata)
if delete:
_metadata = metadata
else:
_metadata = orig.copy()
_metadata = dict(instance.metadata)
_metadata.update(metadata)
self._check_metadata_properties_quota(context, _metadata)
metadata = self.db.instance_metadata_update(context, instance['uuid'],
_metadata, True)
instance['metadata'] = metadata
notifications.send_update(context, instance, instance)
diff = _diff_dict(orig, _metadata)
instance.metadata = _metadata
instance.save()
diff = _diff_dict(orig, instance.metadata)
self.compute_rpcapi.change_instance_metadata(context,
instance=instance,
diff=diff)

View File

@ -406,7 +406,7 @@ class ComputeVirtAPI(virtapi.VirtAPI):
class ComputeManager(manager.Manager):
"""Manages the running instances from creation to destruction."""
target = messaging.Target(version='3.6')
target = messaging.Target(version='3.7')
def __init__(self, compute_driver=None, *args, **kwargs):
"""Load configuration options and connect to the hypervisor."""
@ -2766,6 +2766,7 @@ class ComputeManager(manager.Manager):
"unrescue.end",
network_info=network_info)
@object_compat
@wrap_exception()
@reverts_task_state
@wrap_instance_fault

View File

@ -220,6 +220,7 @@ class ComputeAPI(object):
3.4 - Update rebuild_instance() to take an instance object
3.5 - Pass preserve_ephemeral flag to rebuild_instance()
3.6 - Make volume_snapshot_{create,delete} use new-world objects
3.7 - Update change_instance_metadata() to take an instance object
'''
VERSION_ALIASES = {
@ -305,13 +306,16 @@ class ComputeAPI(object):
mountpoint=mountpoint)
def change_instance_metadata(self, ctxt, instance, diff):
# NOTE(russellb) Havana compat
version = self._get_compat_version('3.0', '2.0')
instance_p = jsonutils.to_primitive(instance)
if self.client.can_send_version('3.7'):
version = '3.7'
else:
# NOTE(russellb) Havana compat
version = self._get_compat_version('3.0', '2.0')
instance = jsonutils.to_primitive(instance)
cctxt = self.client.prepare(server=_compute_host(None, instance),
version=version)
cctxt.cast(ctxt, 'change_instance_metadata',
instance=instance_p, diff=diff)
instance=instance, diff=diff)
def check_can_live_migrate_destination(self, ctxt, instance, destination,
block_migration, disk_over_commit):

View File

@ -115,6 +115,7 @@ def get_instances_with_cached_ips(orig_func, get_floating,
if kwargs.get('want_objects', False):
info_cache = instance_info_cache_obj.InstanceInfoCache()
info_cache.network_info = get_fake_cache(get_floating)
info_cache.obj_reset_changes()
else:
info_cache = {'network_info': get_fake_cache(get_floating)}

View File

@ -23,6 +23,7 @@ from nova.compute import rpcapi as compute_rpcapi
from nova.compute import vm_states
import nova.db
from nova import exception
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova.openstack.common import timeutils
from nova import test
@ -41,6 +42,11 @@ def return_create_instance_metadata(context, server_id, metadata, delete):
return stub_server_metadata()
def fake_instance_save(inst, **kwargs):
inst.metadata = stub_server_metadata()
inst.obj_reset_changes()
def return_server_metadata(context, server_id):
if not isinstance(server_id, str) or not len(server_id) == 36:
msg = 'id %s must be a uuid in return server metadata' % server_id
@ -90,6 +96,7 @@ def return_server_by_uuid(context, server_uuid,
'name': 'fake',
'locked': False,
'launched_at': timeutils.utcnow(),
'metadata': stub_server_metadata(),
'vm_state': vm_states.ACTIVE})
@ -201,8 +208,7 @@ class ServerMetaDataTest(BaseTest):
def test_create(self):
self.stubs.Set(nova.db, 'instance_metadata_get',
return_server_metadata)
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
self.stubs.Set(instance_obj.Instance, 'save', fake_instance_save)
req = fakes.HTTPRequest.blank(self.url)
req.method = 'POST'
req.content_type = "application/json"
@ -278,8 +284,7 @@ class ServerMetaDataTest(BaseTest):
self.controller.create, req, self.uuid, body)
def test_update_metadata(self):
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
self.stubs.Set(instance_obj.Instance, 'save', fake_instance_save)
req = fakes.HTTPRequest.blank(self.url)
req.method = 'POST'
req.content_type = 'application/json'
@ -294,8 +299,7 @@ class ServerMetaDataTest(BaseTest):
self.assertEqual(expected, response)
def test_update_all(self):
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
self.stubs.Set(instance_obj.Instance, 'save', fake_instance_save)
req = fakes.HTTPRequest.blank(self.url)
req.method = 'PUT'
req.content_type = "application/json"
@ -311,8 +315,7 @@ class ServerMetaDataTest(BaseTest):
self.assertEqual(expected, res_dict)
def test_update_all_empty_container(self):
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
self.stubs.Set(instance_obj.Instance, 'save', fake_instance_save)
req = fakes.HTTPRequest.blank(self.url)
req.method = 'PUT'
req.content_type = "application/json"
@ -358,8 +361,7 @@ class ServerMetaDataTest(BaseTest):
self.controller.update_all, req, '100', body)
def test_update_item(self):
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
self.stubs.Set(instance_obj.Instance, 'save', fake_instance_save)
req = fakes.HTTPRequest.blank(self.url + '/key1')
req.method = 'PUT'
body = {"metadata": {"key1": "value1"}}

View File

@ -24,6 +24,7 @@ from nova.compute import rpcapi as compute_rpcapi
from nova.compute import vm_states
import nova.db
from nova import exception
from nova.objects import instance as instance_obj
from nova.openstack.common import jsonutils
from nova.openstack.common import timeutils
from nova import test
@ -42,6 +43,11 @@ def return_create_instance_metadata(context, server_id, metadata, delete):
return stub_server_metadata()
def fake_instance_save(inst, **kwargs):
inst.metadata = stub_server_metadata()
inst.obj_reset_changes()
def return_server_metadata(context, server_id):
if not isinstance(server_id, six.string_types) or not len(server_id) == 36:
msg = 'id %s must be a uuid in return server metadata' % server_id
@ -91,6 +97,7 @@ def return_server_by_uuid(context, server_uuid,
'name': 'fake',
'locked': False,
'launched_at': timeutils.utcnow(),
'metadata': stub_server_metadata(),
'vm_state': vm_states.ACTIVE})
@ -200,10 +207,7 @@ class ServerMetaDataTest(BaseTest):
self.controller.delete, req, self.uuid, 'key6')
def test_create(self):
self.stubs.Set(nova.db, 'instance_metadata_get',
return_server_metadata)
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
self.stubs.Set(instance_obj.Instance, 'save', fake_instance_save)
req = fakes.HTTPRequest.blank(self.url)
req.method = 'POST'
req.content_type = "application/json"
@ -266,8 +270,7 @@ class ServerMetaDataTest(BaseTest):
self.controller.create, req, self.uuid, body)
def test_update_metadata(self):
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
self.stubs.Set(instance_obj.Instance, 'save', fake_instance_save)
req = fakes.HTTPRequest.blank(self.url)
req.method = 'POST'
req.content_type = 'application/json'
@ -282,8 +285,7 @@ class ServerMetaDataTest(BaseTest):
self.assertEqual(expected, response)
def test_update_all(self):
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
self.stubs.Set(instance_obj.Instance, 'save', fake_instance_save)
req = fakes.HTTPRequest.blank(self.url)
req.method = 'PUT'
req.content_type = "application/json"
@ -299,8 +301,7 @@ class ServerMetaDataTest(BaseTest):
self.assertEqual(expected, res_dict)
def test_update_all_empty_container(self):
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
self.stubs.Set(instance_obj.Instance, 'save', fake_instance_save)
req = fakes.HTTPRequest.blank(self.url)
req.method = 'PUT'
req.content_type = "application/json"
@ -346,8 +347,7 @@ class ServerMetaDataTest(BaseTest):
self.controller.update_all, req, '100', body)
def test_update_item(self):
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
self.stubs.Set(instance_obj.Instance, 'save', fake_instance_save)
req = fakes.HTTPRequest.blank(self.url + '/key1')
req.method = 'PUT'
body = {"meta": {"key1": "value1"}}
@ -495,6 +495,8 @@ class ServerMetaDataTest(BaseTest):
self.controller.update_all, req, self.uuid, data)
def test_invalid_metadata_items_on_update_item(self):
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
self.stubs.Set(nova.db, 'instance_metadata_update',
return_create_instance_metadata)
data = {"metadata": {}}

View File

@ -7314,8 +7314,8 @@ class ComputeAPITestCase(BaseTestCase):
fake_change_instance_metadata)
_context = context.get_admin_context()
instance = self._create_fake_instance({'metadata': {'key1': 'value1'}})
instance = dict(instance.iteritems())
instance = self._create_fake_instance_obj({'metadata':
{'key1': 'value1'}})
metadata = self.compute_api.get_instance_metadata(_context, instance)
self.assertEqual(metadata, {'key1': 'value1'})

View File

@ -134,7 +134,7 @@ class ComputeRpcAPITestCase(test.TestCase):
def test_change_instance_metadata(self):
self._test_compute_api('change_instance_metadata', 'cast',
instance=self.fake_instance, diff={})
instance=self.fake_instance, diff={}, version='3.7')
# NOTE(russellb) Havana compat
self.flags(compute='havana', group='upgrade_levels')