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:
parent
f474441263
commit
74b7be410f
@ -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')
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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)}
|
||||
|
||||
|
@ -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"}}
|
||||
|
@ -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": {}}
|
||||
|
@ -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'})
|
||||
|
@ -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')
|
||||
|
Loading…
Reference in New Issue
Block a user