Merge "Fix up Service object for manifest-based backports"

This commit is contained in:
Jenkins 2015-10-23 17:42:10 +00:00 committed by Gerrit Code Review
commit 3d19aa8110
2 changed files with 16 additions and 30 deletions

View File

@ -125,8 +125,10 @@ class Service(base.NovaPersistentObject, base.NovaObject,
super(Service, self).__init__(*args, **kwargs)
self.version = SERVICE_VERSION
def obj_make_compatible(self, primitive, target_version):
super(Service, self).obj_make_compatible(primitive, target_version)
def obj_make_compatible_from_manifest(self, primitive, target_version,
version_manifest):
super(Service, self).obj_make_compatible_from_manifest(
primitive, target_version, version_manifest)
_target_version = utils.convert_version_to_tuple(target_version)
if _target_version < (1, 16) and 'version' in primitive:
del primitive['version']
@ -135,15 +137,14 @@ class Service(base.NovaPersistentObject, base.NovaObject,
if _target_version < (1, 13) and 'last_seen_up' in primitive:
del primitive['last_seen_up']
if _target_version < (1, 10):
target_compute_version = self.obj_calculate_child_version(
target_version, 'compute_node')
# service.compute_node was not lazy-loaded, we need to provide it
# when called
self._do_compute_node(self._context, primitive,
target_compute_version)
version_manifest)
def _do_compute_node(self, context, primitive, target_version):
def _do_compute_node(self, context, primitive, version_manifest):
try:
target_version = version_manifest['ComputeNode']
# NOTE(sbauza): Some drivers (VMware, Ironic) can have multiple
# nodes for the same service, but for keeping same behaviour,
# returning only the first elem of the list
@ -152,7 +153,8 @@ class Service(base.NovaPersistentObject, base.NovaObject,
except Exception:
return
primitive['compute_node'] = compute.obj_to_primitive(
target_version=target_version)
target_version=target_version,
version_manifest=version_manifest)
@staticmethod
def _from_db_object(context, service, db_service):

View File

@ -14,6 +14,7 @@
import mock
from oslo_utils import timeutils
from oslo_versionedobjects import base as ovo_base
from oslo_versionedobjects import exception as ovo_exc
from nova.compute import manager as compute_manager
@ -254,32 +255,15 @@ class _TestServiceObject(object):
service_id=fake_service['id'])
get_all_by_host.return_value = [fake_compute_obj]
service_obj.obj_make_compatible(fake_service_dict, '1.9')
versions = ovo_base.obj_tree_get_versions('Service')
versions['ComputeNode'] = '1.10'
service_obj.obj_make_compatible_from_manifest(fake_service_dict, '1.9',
versions)
self.assertEqual(
fake_compute_obj.obj_to_primitive(target_version='1.10'),
fake_compute_obj.obj_to_primitive(target_version='1.10',
version_manifest=versions),
fake_service_dict['compute_node'])
@mock.patch.object(objects.ComputeNodeList, 'get_all_by_host')
def test_obj_make_compatible_with_juno_computes(self, get_all_by_host):
service_attrs = dict(fake_service)
del service_attrs['version']
service_obj = objects.Service(
context=self.context, **service_attrs)
service_obj.binary = 'nova-compute'
fake_service_dict = fake_service.copy()
fake_service_dict['binary'] = 'nova-compute'
fake_compute_obj = objects.ComputeNode(host=fake_service['host'],
service_id=fake_service['id'])
get_all_by_host.return_value = [fake_compute_obj]
# Juno versions :
# Service : 1.4
# ComputeNode : 1.5
service_obj.obj_make_compatible(fake_service_dict, '1.4')
self.assertEqual(
'1.5',
fake_service_dict['compute_node']['nova_object.version'])
@mock.patch('nova.db.service_get_minimum_version')
def test_get_minimum_version_none(self, mock_get):
mock_get.return_value = None