diff --git a/nova/objects/instance_action.py b/nova/objects/instance_action.py index 1009383b5ec1..1c6d64eefd6b 100644 --- a/nova/objects/instance_action.py +++ b/nova/objects/instance_action.py @@ -13,6 +13,7 @@ # under the License. from oslo_utils import timeutils +from oslo_utils import versionutils from nova import db from nova import objects @@ -120,7 +121,8 @@ class InstanceActionEvent(base.NovaPersistentObject, base.NovaObject, base.NovaObjectDictCompat): # Version 1.0: Initial version # Version 1.1: event_finish_with_failure decorated with serialize_args - VERSION = '1.1' + # Version 1.2: Add 'host' field + VERSION = '1.2' fields = { 'id': fields.IntegerField(), 'event': fields.StringField(nullable=True), @@ -129,8 +131,14 @@ class InstanceActionEvent(base.NovaPersistentObject, base.NovaObject, 'finish_time': fields.DateTimeField(nullable=True), 'result': fields.StringField(nullable=True), 'traceback': fields.StringField(nullable=True), + 'host': fields.StringField(nullable=True), } + def obj_make_compatible(self, primitive, target_version): + target_version = versionutils.convert_version_to_tuple(target_version) + if target_version < (1, 2) and 'host' in primitive: + del primitive['host'] + @staticmethod def _from_db_object(context, event, db_event): for field in event.fields: @@ -140,11 +148,13 @@ class InstanceActionEvent(base.NovaPersistentObject, base.NovaObject, return event @staticmethod - def pack_action_event_start(context, instance_uuid, event_name): + def pack_action_event_start(context, instance_uuid, event_name, + host=None): values = {'event': event_name, 'instance_uuid': instance_uuid, 'request_id': context.request_id, - 'start_time': timeutils.utcnow()} + 'start_time': timeutils.utcnow(), + 'host': host} return values @staticmethod @@ -168,9 +178,10 @@ class InstanceActionEvent(base.NovaPersistentObject, base.NovaObject, return cls._from_db_object(context, cls(), db_event) @base.remotable_classmethod - def event_start(cls, context, instance_uuid, event_name, want_result=True): + def event_start(cls, context, instance_uuid, event_name, want_result=True, + host=None): values = cls.pack_action_event_start(context, instance_uuid, - event_name) + event_name, host=host) db_event = db.action_event_start(context, values) if want_result: return cls._from_db_object(context, cls(), db_event) diff --git a/nova/tests/unit/api/openstack/compute/test_instance_actions.py b/nova/tests/unit/api/openstack/compute/test_instance_actions.py index d15f58819c2d..861baeb682e0 100644 --- a/nova/tests/unit/api/openstack/compute/test_instance_actions.py +++ b/nova/tests/unit/api/openstack/compute/test_instance_actions.py @@ -53,12 +53,14 @@ def format_action(action, expect_traceback=True): return action -def format_event(event, expect_traceback=True): +def format_event(event, expect_traceback=True, expect_host=False): '''Remove keys that aren't serialized.''' to_delete = ['id', 'created_at', 'updated_at', 'deleted_at', 'deleted', 'action_id'] if not expect_traceback: to_delete.append('traceback') + if not expect_host: + to_delete.append('host') for key in to_delete: if key in event: del(event[key]) diff --git a/nova/tests/unit/fake_server_actions.py b/nova/tests/unit/fake_server_actions.py index d22f08cb7a1f..e3ddee228941 100644 --- a/nova/tests/unit/fake_server_actions.py +++ b/nova/tests/unit/fake_server_actions.py @@ -70,6 +70,7 @@ FAKE_EVENTS = { 'updated_at': None, 'deleted_at': None, 'deleted': False, + 'host': 'host1' }, {'id': 2, 'action_id': FAKE_ACTION_ID1, @@ -84,6 +85,7 @@ FAKE_EVENTS = { 'updated_at': None, 'deleted_at': None, 'deleted': False, + 'host': 'host1' } ], FAKE_ACTION_ID2: [{'id': 3, @@ -99,6 +101,7 @@ FAKE_EVENTS = { 'updated_at': None, 'deleted_at': None, 'deleted': False, + 'host': 'host2' } ] } diff --git a/nova/tests/unit/objects/test_instance_action.py b/nova/tests/unit/objects/test_instance_action.py index d2ff70f3ddf8..59588450551b 100644 --- a/nova/tests/unit/objects/test_instance_action.py +++ b/nova/tests/unit/objects/test_instance_action.py @@ -54,6 +54,7 @@ fake_event = { 'finish_time': None, 'result': 'fake-result', 'traceback': 'fake-tb', + 'host': 'fake-host', } diff --git a/nova/tests/unit/objects/test_objects.py b/nova/tests/unit/objects/test_objects.py index f0fc5673abed..97c69e08f7be 100644 --- a/nova/tests/unit/objects/test_objects.py +++ b/nova/tests/unit/objects/test_objects.py @@ -1097,7 +1097,7 @@ object_data = { 'ImageMetaProps': '1.20-ffd686cde289814695d5f89522aa5aef', 'Instance': '2.4-4437eb8b2737c3054ea579b8efe31dc5', 'InstanceAction': '1.1-f9f293e526b66fca0d05c3b3a2d13914', - 'InstanceActionEvent': '1.1-e56a64fa4710e43ef7af2ad9d6028b33', + 'InstanceActionEvent': '1.2-b2f368b8a29d8d872b1f6ea841e820a0', 'InstanceActionEventList': '1.1-13d92fb953030cdbfee56481756e02be', 'InstanceActionList': '1.1-a2b2fb6006b47c27076d3a1d48baa759', 'InstanceDeviceMetadata': '1.0-74d78dd36aa32d26d2769a1b57caf186',