summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.openstack.org>2018-08-03 21:51:58 +0000
committerGerrit Code Review <review@openstack.org>2018-08-03 21:51:58 +0000
commitb81d17fbbe4f05dd614edc781a69ea7e22bb62f9 (patch)
tree64ebb7f94524252d0eb0cc53e301633444f9cce0
parent02be0637059d31b2445e5222216705f2679a1767 (diff)
parentfa0cb98c2119edffbb9c10aaefa929d4a8767f70 (diff)
downloadironic-b81d17fbbe4f05dd614edc781a69ea7e22bb62f9.tar.gz
Merge "Use max version of an object"
-rw-r--r--ironic/common/release_mappings.py7
-rw-r--r--ironic/objects/base.py24
-rw-r--r--ironic/tests/unit/objects/test_objects.py30
3 files changed, 55 insertions, 6 deletions
diff --git a/ironic/common/release_mappings.py b/ironic/common/release_mappings.py
index 99ac4851a..52396bb83 100644
--- a/ironic/common/release_mappings.py
+++ b/ironic/common/release_mappings.py
@@ -40,9 +40,10 @@ from ironic.common.i18n import _
# sent over RPC. Notifications/Payloads are not being included here since we
# don't need to pin them during rolling upgrades.
#
-# For each object, the versions of that object are listed from latest version
-# to oldest version. This is a list since an object could be in more than one
-# version in a particular release.
+# For each object, list the versions that the object can be in for a particular
+# release. That is, any new versions that were added in that release. If there
+# were no new versions, it should have the same (latest) version as the
+# previous release.
# NOTE(rloo): We need a list, not just the latest version, for the DB queries
# that filter for objects that are not in particular versions; for more info,
# see comments after L1128 of
diff --git a/ironic/objects/base.py b/ironic/objects/base.py
index f29e4e347..a26621539 100644
--- a/ironic/objects/base.py
+++ b/ironic/objects/base.py
@@ -27,6 +27,24 @@ from ironic.objects import fields as object_fields
LOG = log.getLogger(__name__)
+def max_version(versions):
+ """Return the maximum version in the list.
+
+ :param versions: a list of (string) versions; assumed to have at
+ least one entry
+ :returns: the maximum version (string)
+ """
+ if len(versions) == 1:
+ return versions[0]
+
+ int_versions = []
+ for v in versions:
+ int_versions.append(versionutils.convert_version_to_int(v))
+ max_val = max(int_versions)
+ ind = int_versions.index(max_val)
+ return versions[ind]
+
+
class IronicObjectRegistry(object_base.VersionedObjectRegistry):
def registration_hook(self, cls, index):
# NOTE(jroll): blatantly stolen from nova
@@ -187,9 +205,9 @@ class IronicObject(object_base.VersionedObject):
return cls.VERSION
version_manifest = versions.RELEASE_MAPPING[pin]['objects']
- pinned_version = version_manifest.get(cls.obj_name())
- if pinned_version:
- pinned_version = pinned_version[0]
+ pinned_versions = version_manifest.get(cls.obj_name())
+ if pinned_versions:
+ pinned_version = max_version(pinned_versions)
if not versionutils.is_compatible(pinned_version,
cls.VERSION):
LOG.error(
diff --git a/ironic/tests/unit/objects/test_objects.py b/ironic/tests/unit/objects/test_objects.py
index 2e89f0ebb..3c7d1782e 100644
--- a/ironic/tests/unit/objects/test_objects.py
+++ b/ironic/tests/unit/objects/test_objects.py
@@ -386,6 +386,19 @@ class _TestObject(object):
}
self._test_get_changes(target_version='1.4')
+ @mock.patch('ironic.common.release_mappings.RELEASE_MAPPING',
+ autospec=True)
+ def test_get_changes_pinned_2versions(self, mock_release_mapping):
+ # obj_get_changes() is not affected by pinning
+ CONF.set_override('pin_release_version',
+ release_mappings.RELEASE_VERSIONS[-1])
+ mock_release_mapping.__getitem__.return_value = {
+ 'objects': {
+ 'MyObj': ['1.3', '1.4'],
+ }
+ }
+ self._test_get_changes(target_version='1.4')
+
def test_convert_to_version_same(self):
# no changes
obj = MyObj(self.context)
@@ -986,3 +999,20 @@ class TestRegistry(test_base.TestCase):
self.assertEqual(MyObj, mock_objects.MyObj)
reg.registration_hook(MyOlderObj, 0)
self.assertEqual(MyObj, mock_objects.MyObj)
+
+
+class TestMisc(test_base.TestCase):
+ def test_max_version(self):
+ versions = ['1.25', '1.33', '1.3']
+ maxv = base.max_version(versions)
+ self.assertEqual('1.33', maxv)
+
+ def test_max_version_one(self):
+ versions = ['1.25']
+ maxv = base.max_version(versions)
+ self.assertEqual('1.25', maxv)
+
+ def test_max_version_two(self):
+ versions = ['1.25', '1.26']
+ maxv = base.max_version(versions)
+ self.assertEqual('1.26', maxv)