diff --git a/nova/tests/unit/notifications/objects/test_notification.py b/nova/tests/unit/notifications/objects/test_notification.py index 616484e45d72..ae377b85f1b3 100644 --- a/nova/tests/unit/notifications/objects/test_notification.py +++ b/nova/tests/unit/notifications/objects/test_notification.py @@ -11,15 +11,18 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. +import collections import mock from oslo_utils import timeutils +from oslo_versionedobjects import fixture from nova.notifications.objects import base as notification from nova import objects from nova.objects import base from nova.objects import fields from nova import test +from nova.tests.unit.objects import test_objects class TestNotificationBase(test.NoDBTestCase): @@ -242,3 +245,67 @@ class TestNotificationBase(test.NoDBTestCase): 'nova_object.data': {'extra_field': u'test string'}, 'nova_object.version': '1.0', 'nova_object.namespace': 'nova'}) + + +notification_object_data = { + 'EventType': '1.0-21dc35de314fc5fc0a7965211c0c00f7', + 'NotificationPublisher': '1.0-bbbc1402fb0e443a3eb227cc52b61545', + 'ServiceStatusNotification': '1.0-a73147b93b520ff0061865849d3dfa56', + 'ServiceStatusPayload': '1.0-a5e7b4fd6cc5581be45b31ff1f3a3f7f', +} + + +class TestNotificationObjectVersions(test.NoDBTestCase): + def setUp(self): + super(test.NoDBTestCase, self).setUp() + base.NovaObjectRegistry.register_notification_objects() + + def test_versions(self): + checker = fixture.ObjectVersionChecker( + base.NovaObjectRegistry.obj_classes()) + notification_object_data.update(test_objects.object_data) + expected, actual = checker.test_hashes(notification_object_data) + self.assertEqual(expected, actual, + 'Some notification objects have changed; please make ' + 'sure the versions have been bumped, and then update ' + 'their hashes here.') + + def test_notification_payload_version_depends_on_the_schema(self): + @base.NovaObjectRegistry.register_if(False) + class TestNotificationPayload(notification.NotificationPayloadBase): + VERSION = '1.0' + + SCHEMA = { + 'field_1': ('source_field', 'field_1'), + 'field_2': ('source_field', 'field_2'), + } + + fields = { + 'extra_field': fields.StringField(), # filled by ctor + 'field_1': fields.StringField(), # filled by the schema + 'field_2': fields.IntegerField(), # filled by the schema + } + + checker = fixture.ObjectVersionChecker( + {'TestNotificationPayload': (TestNotificationPayload,)}) + + old_hash = checker.get_hashes(extra_data_func=get_extra_data) + TestNotificationPayload.SCHEMA['field_3'] = ('source_field', + 'field_3') + new_hash = checker.get_hashes(extra_data_func=get_extra_data) + + self.assertNotEqual(old_hash, new_hash) + + +def get_extra_data(obj_class): + extra_data = tuple() + + # Get the SCHEMA items to add to the fingerprint + # if we are looking at a notification + if issubclass(obj_class, notification.NotificationPayloadBase): + schema_data = collections.OrderedDict( + sorted(obj_class.SCHEMA.items())) + + extra_data += (schema_data,) + + return extra_data diff --git a/nova/tests/unit/objects/test_objects.py b/nova/tests/unit/objects/test_objects.py index bc2a3c6b872d..e8262cf96aee 100644 --- a/nova/tests/unit/objects/test_objects.py +++ b/nova/tests/unit/objects/test_objects.py @@ -12,7 +12,6 @@ # License for the specific language governing permissions and limitations # under the License. -import collections import contextlib import copy import datetime @@ -32,7 +31,6 @@ import six from nova import context from nova import exception -from nova.notifications.objects import base as notification from nova import objects from nova.objects import base from nova.objects import fields @@ -1120,7 +1118,6 @@ object_data = { 'EC2InstanceMapping': '1.0-a4556eb5c5e94c045fe84f49cf71644f', 'EC2SnapshotMapping': '1.0-47e7ddabe1af966dce0cfd0ed6cd7cd1', 'EC2VolumeMapping': '1.0-5b713751d6f97bad620f3378a521020d', - 'EventType': '1.0-21dc35de314fc5fc0a7965211c0c00f7', 'FixedIP': '1.14-53e1c10b539f1a82fe83b1af4720efae', 'FixedIPList': '1.14-87a39361c8f08f059004d6b15103cdfd', 'Flavor': '1.1-b6bb7a730a79d720344accefafacf7ee', @@ -1162,7 +1159,6 @@ object_data = { 'MigrationList': '1.3-55595bfc1a299a5962614d0821a3567e', 'MonitorMetric': '1.1-53b1db7c4ae2c531db79761e7acc52ba', 'MonitorMetricList': '1.1-15ecf022a68ddbb8c2a6739cfc9f8f5e', - 'NotificationPublisher': '1.0-bbbc1402fb0e443a3eb227cc52b61545', 'NUMACell': '1.2-74fc993ac5c83005e76e34e8487f1c05', 'NUMAPagesTopology': '1.1-edab9fa2dc43c117a38d600be54b4542', 'NUMATopology': '1.2-c63fad38be73b6afd04715c9c1b29220', @@ -1191,8 +1187,6 @@ object_data = { 'SecurityGroupRuleList': '1.2-0005c47fcd0fb78dd6d7fd32a1409f5b', 'Service': '1.20-0f9c0bf701e68640b78638fd09e2cddc', 'ServiceList': '1.18-6c52cb616621c1af2415dcc11faf5c1a', - 'ServiceStatusNotification': '1.0-a73147b93b520ff0061865849d3dfa56', - 'ServiceStatusPayload': '1.0-a5e7b4fd6cc5581be45b31ff1f3a3f7f', 'TaskLog': '1.0-78b0534366f29aa3eebb01860fbe18fe', 'TaskLogList': '1.0-cc8cce1af8a283b9d28b55fcd682e777', 'Tag': '1.1-8b8d7d5b48887651a0e01241672e2963', @@ -1209,15 +1203,10 @@ object_data = { class TestObjectVersions(test.NoDBTestCase): - - def setUp(self): - super(test.NoDBTestCase, self).setUp() - base.NovaObjectRegistry.register_notification_objects() - def test_versions(self): checker = fixture.ObjectVersionChecker( base.NovaObjectRegistry.obj_classes()) - fingerprints = checker.get_hashes(extra_data_func=get_extra_data) + fingerprints = checker.get_hashes() if os.getenv('GENERATE_HASHES'): open('object_hashes.txt', 'w').write( @@ -1231,32 +1220,6 @@ class TestObjectVersions(test.NoDBTestCase): 'versions have been bumped, and then update their ' 'hashes here.') - def test_notification_payload_version_depends_on_the_schema(self): - @base.NovaObjectRegistry.register_if(False) - class TestNotificationPayload(notification.NotificationPayloadBase): - VERSION = '1.0' - - SCHEMA = { - 'field_1': ('source_field', 'field_1'), - 'field_2': ('source_field', 'field_2'), - } - - fields = { - 'extra_field': fields.StringField(), # filled by ctor - 'field_1': fields.StringField(), # filled by the schema - 'field_2': fields.IntegerField(), # filled by the schema - } - - checker = fixture.ObjectVersionChecker( - {'TestNotificationPayload': (TestNotificationPayload,)}) - - old_hash = checker.get_hashes(extra_data_func=get_extra_data) - TestNotificationPayload.SCHEMA['field_3'] = ('source_field', - 'field_3') - new_hash = checker.get_hashes(extra_data_func=get_extra_data) - - self.assertNotEqual(old_hash, new_hash) - def test_obj_make_compatible(self): # NOTE(danms): This is normally not registered because it is just a # base class. However, the test fixture below requires it to be @@ -1379,17 +1342,3 @@ class TestObjMethodOverrides(test.NoDBTestCase): obj_class = obj_classes[obj_name][0] self.assertEqual(args, inspect.getargspec(obj_class.obj_reset_changes)) - - -def get_extra_data(obj_class): - extra_data = tuple() - - # Get the SCHEMA items to add to the fingerprint - # if we are looking at a notification - if issubclass(obj_class, notification.NotificationPayloadBase): - schema_data = collections.OrderedDict( - sorted(obj_class.SCHEMA.items())) - - extra_data += (schema_data,) - - return extra_data