diff --git a/doc/notification_samples/action-cancel-end.json b/doc/notification_samples/action-cancel-end.json index cee896693..d613ff29b 100644 --- a/doc/notification_samples/action-cancel-end.json +++ b/doc/notification_samples/action-cancel-end.json @@ -14,6 +14,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "CANCELLED", + "status_message": null, "action_plan": { "watcher_object.namespace": "watcher", "watcher_object.version": "1.0", @@ -24,6 +25,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "CANCELLING", + "status_message": null, "audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d", "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "deleted_at": null diff --git a/doc/notification_samples/action-cancel-error.json b/doc/notification_samples/action-cancel-error.json index af123eba8..3d78724fa 100644 --- a/doc/notification_samples/action-cancel-error.json +++ b/doc/notification_samples/action-cancel-error.json @@ -24,6 +24,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "FAILED", + "status_message": null, "action_plan": { "watcher_object.namespace": "watcher", "watcher_object.version": "1.0", @@ -34,6 +35,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "CANCELLING", + "status_message": null, "audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d", "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "deleted_at": null diff --git a/doc/notification_samples/action-cancel-start.json b/doc/notification_samples/action-cancel-start.json index 7f2503156..cb6c207dc 100644 --- a/doc/notification_samples/action-cancel-start.json +++ b/doc/notification_samples/action-cancel-start.json @@ -14,6 +14,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "CANCELLING", + "status_message": null, "action_plan": { "watcher_object.namespace": "watcher", "watcher_object.version": "1.0", @@ -24,6 +25,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "CANCELLING", + "status_message": null, "audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d", "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "deleted_at": null diff --git a/doc/notification_samples/action-create.json b/doc/notification_samples/action-create.json index c8dd7a44c..1fd1cd59a 100644 --- a/doc/notification_samples/action-create.json +++ b/doc/notification_samples/action-create.json @@ -13,6 +13,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "PENDING", + "status_message": null, "action_plan": { "watcher_object.namespace": "watcher", "watcher_object.version": "1.0", @@ -23,6 +24,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "ONGOING", + "status_message": null, "audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d", "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "deleted_at": null diff --git a/doc/notification_samples/action-delete.json b/doc/notification_samples/action-delete.json index dbc5ef9e3..4e1fb1597 100644 --- a/doc/notification_samples/action-delete.json +++ b/doc/notification_samples/action-delete.json @@ -13,6 +13,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "DELETED", + "status_message": null, "action_plan": { "watcher_object.namespace": "watcher", "watcher_object.version": "1.0", @@ -23,6 +24,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "ONGOING", + "status_message": null, "audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d", "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "deleted_at": null diff --git a/doc/notification_samples/action-execution-end.json b/doc/notification_samples/action-execution-end.json index 15dcc1ead..4c4575f48 100644 --- a/doc/notification_samples/action-execution-end.json +++ b/doc/notification_samples/action-execution-end.json @@ -14,6 +14,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "SUCCEEDED", + "status_message": null, "action_plan": { "watcher_object.namespace": "watcher", "watcher_object.version": "1.0", @@ -24,6 +25,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "ONGOING", + "status_message": null, "audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d", "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "deleted_at": null diff --git a/doc/notification_samples/action-execution-error.json b/doc/notification_samples/action-execution-error.json index 5e170c640..15f3440bb 100644 --- a/doc/notification_samples/action-execution-error.json +++ b/doc/notification_samples/action-execution-error.json @@ -24,6 +24,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "FAILED", + "status_message": "Action execution failed", "action_plan": { "watcher_object.namespace": "watcher", "watcher_object.version": "1.0", @@ -34,6 +35,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "ONGOING", + "status_message": null, "audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d", "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "deleted_at": null diff --git a/doc/notification_samples/action-execution-start.json b/doc/notification_samples/action-execution-start.json index ec60c0885..212846e87 100644 --- a/doc/notification_samples/action-execution-start.json +++ b/doc/notification_samples/action-execution-start.json @@ -14,6 +14,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "ONGOING", + "status_message": null, "action_plan": { "watcher_object.namespace": "watcher", "watcher_object.version": "1.0", @@ -24,6 +25,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "ONGOING", + "status_message": null, "audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d", "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "deleted_at": null diff --git a/doc/notification_samples/action-update.json b/doc/notification_samples/action-update.json index 3f4cbcb72..0ecf518d2 100644 --- a/doc/notification_samples/action-update.json +++ b/doc/notification_samples/action-update.json @@ -18,10 +18,12 @@ "watcher_object.name": "ActionStateUpdatePayload", "watcher_object.data": { "old_state": "PENDING", - "state": "ONGOING" + "state": "ONGOING", + "status_message": null } }, "state": "ONGOING", + "status_message": null, "action_plan": { "watcher_object.namespace": "watcher", "watcher_object.version": "1.0", @@ -32,6 +34,7 @@ "created_at": "2016-10-18T09:52:05Z", "updated_at": null, "state": "ONGOING", + "status_message": null, "audit_uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d", "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "deleted_at": null diff --git a/doc/notification_samples/action_plan-cancel-end.json b/doc/notification_samples/action_plan-cancel-end.json index 969954782..816a38e7d 100644 --- a/doc/notification_samples/action_plan-cancel-end.json +++ b/doc/notification_samples/action_plan-cancel-end.json @@ -21,6 +21,7 @@ "scope": [], "audit_type": "ONESHOT", "state": "SUCCEEDED", + "status_message": null, "parameters": {}, "interval": null, "updated_at": null @@ -29,6 +30,7 @@ "uuid": "76be87bd-3422-43f9-93a0-e85a577e3061", "fault": null, "state": "CANCELLED", + "status_message": null, "global_efficacy": [], "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "strategy": { diff --git a/doc/notification_samples/action_plan-cancel-error.json b/doc/notification_samples/action_plan-cancel-error.json index be7ce0900..c4cdd637d 100644 --- a/doc/notification_samples/action_plan-cancel-error.json +++ b/doc/notification_samples/action_plan-cancel-error.json @@ -52,13 +52,15 @@ "scope": [], "updated_at": null, "audit_type": "ONESHOT", + "status_message": null, "interval": null, "deleted_at": null, "state": "SUCCEEDED" } }, "global_efficacy": [], - "state": "CANCELLING" + "state": "CANCELLING", + "status_message": null } }, "timestamp": "2016-10-18 09:52:05.219414" diff --git a/doc/notification_samples/action_plan-cancel-start.json b/doc/notification_samples/action_plan-cancel-start.json index 3d6753a06..dcd9d38e9 100644 --- a/doc/notification_samples/action_plan-cancel-start.json +++ b/doc/notification_samples/action_plan-cancel-start.json @@ -21,6 +21,7 @@ "scope": [], "audit_type": "ONESHOT", "state": "SUCCEEDED", + "status_message": null, "parameters": {}, "interval": null, "updated_at": null @@ -29,6 +30,7 @@ "uuid": "76be87bd-3422-43f9-93a0-e85a577e3061", "fault": null, "state": "CANCELLING", + "status_message": null, "global_efficacy": [], "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "strategy": { diff --git a/doc/notification_samples/action_plan-create.json b/doc/notification_samples/action_plan-create.json index e8f46715e..cc725aad5 100644 --- a/doc/notification_samples/action_plan-create.json +++ b/doc/notification_samples/action_plan-create.json @@ -33,6 +33,7 @@ "interval": null, "deleted_at": null, "state": "PENDING", + "status_message": null, "created_at": "2016-10-18T09:52:05Z", "updated_at": null }, @@ -43,6 +44,7 @@ "global_efficacy": {}, "deleted_at": null, "state": "RECOMMENDED", + "status_message": null, "updated_at": null }, "watcher_object.namespace": "watcher", diff --git a/doc/notification_samples/action_plan-delete.json b/doc/notification_samples/action_plan-delete.json index a5c9f10d8..6d201ee79 100644 --- a/doc/notification_samples/action_plan-delete.json +++ b/doc/notification_samples/action_plan-delete.json @@ -18,6 +18,7 @@ "updated_at": null, "deleted_at": null, "state": "PENDING", + "status_message": null, "created_at": "2016-10-18T09:52:05Z", "parameters": {} }, @@ -43,7 +44,8 @@ "watcher_object.name": "StrategyPayload", "watcher_object.namespace": "watcher" }, - "state": "DELETED" + "state": "DELETED", + "status_message": null }, "watcher_object.version": "1.0", "watcher_object.name": "ActionPlanDeletePayload", diff --git a/doc/notification_samples/action_plan-execution-end.json b/doc/notification_samples/action_plan-execution-end.json index bc78d0b8a..7588ca375 100644 --- a/doc/notification_samples/action_plan-execution-end.json +++ b/doc/notification_samples/action_plan-execution-end.json @@ -22,6 +22,7 @@ "scope": [], "audit_type": "ONESHOT", "state": "SUCCEEDED", + "status_message": null, "parameters": {}, "interval": null, "updated_at": null @@ -30,6 +31,7 @@ "uuid": "76be87bd-3422-43f9-93a0-e85a577e3061", "fault": null, "state": "ONGOING", + "status_message": null, "global_efficacy": [], "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "strategy": { diff --git a/doc/notification_samples/action_plan-execution-error.json b/doc/notification_samples/action_plan-execution-error.json index 492d79779..00d103da7 100644 --- a/doc/notification_samples/action_plan-execution-error.json +++ b/doc/notification_samples/action_plan-execution-error.json @@ -55,11 +55,13 @@ "audit_type": "ONESHOT", "interval": null, "deleted_at": null, - "state": "PENDING" + "state": "PENDING", + "status_message": null } }, "global_efficacy": [], - "state": "ONGOING" + "state": "ONGOING", + "status_message": null } }, "timestamp": "2016-10-18 09:52:05.219414" diff --git a/doc/notification_samples/action_plan-execution-start.json b/doc/notification_samples/action_plan-execution-start.json index 9d0c779f9..373c01033 100644 --- a/doc/notification_samples/action_plan-execution-start.json +++ b/doc/notification_samples/action_plan-execution-start.json @@ -22,6 +22,7 @@ "scope": [], "audit_type": "ONESHOT", "state": "PENDING", + "status_message": null, "parameters": {}, "interval": null, "updated_at": null @@ -30,6 +31,7 @@ "uuid": "76be87bd-3422-43f9-93a0-e85a577e3061", "fault": null, "state": "ONGOING", + "status_message": null, "global_efficacy": [], "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "strategy": { diff --git a/doc/notification_samples/action_plan-update.json b/doc/notification_samples/action_plan-update.json index dc0c1dc01..7d91f57f4 100644 --- a/doc/notification_samples/action_plan-update.json +++ b/doc/notification_samples/action_plan-update.json @@ -16,6 +16,7 @@ "interval": null, "updated_at": null, "state": "PENDING", + "status_message": null, "deleted_at": null, "parameters": {} }, @@ -35,6 +36,7 @@ "watcher_object.name": "ActionPlanStateUpdatePayload" }, "state": "ONGOING", + "status_message": null, "deleted_at": null, "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", "strategy": { diff --git a/doc/notification_samples/audit-create.json b/doc/notification_samples/audit-create.json index eda083245..cb86590c2 100644 --- a/doc/notification_samples/audit-create.json +++ b/doc/notification_samples/audit-create.json @@ -9,6 +9,7 @@ "para1": 3.2 }, "state": "PENDING", + "status_message": null, "updated_at": null, "deleted_at": null, "goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a", diff --git a/doc/notification_samples/audit-delete.json b/doc/notification_samples/audit-delete.json index ebb9889ce..afbd63e27 100644 --- a/doc/notification_samples/audit-delete.json +++ b/doc/notification_samples/audit-delete.json @@ -9,6 +9,7 @@ "para1": 3.2 }, "state": "DELETED", + "status_message": null, "updated_at": null, "deleted_at": null, "goal_uuid": "bc830f84-8ae3-4fc6-8bc6-e3dd15e8b49a", diff --git a/doc/notification_samples/audit-planner-end.json b/doc/notification_samples/audit-planner-end.json index 95001ad3d..a6533c0b2 100644 --- a/doc/notification_samples/audit-planner-end.json +++ b/doc/notification_samples/audit-planner-end.json @@ -9,6 +9,7 @@ "para1": 3.2 }, "state": "ONGOING", + "status_message": null, "updated_at": null, "deleted_at": null, "fault": null, diff --git a/doc/notification_samples/audit-planner-error.json b/doc/notification_samples/audit-planner-error.json index ef6f01bca..d86dd7b9a 100644 --- a/doc/notification_samples/audit-planner-error.json +++ b/doc/notification_samples/audit-planner-error.json @@ -9,6 +9,7 @@ "para1": 3.2 }, "state": "ONGOING", + "status_message": null, "updated_at": null, "deleted_at": null, "fault": { diff --git a/doc/notification_samples/audit-planner-start.json b/doc/notification_samples/audit-planner-start.json index da29737bd..a46f5d33f 100644 --- a/doc/notification_samples/audit-planner-start.json +++ b/doc/notification_samples/audit-planner-start.json @@ -9,6 +9,7 @@ "para1": 3.2 }, "state": "ONGOING", + "status_message": null, "updated_at": null, "deleted_at": null, "fault": null, diff --git a/doc/notification_samples/audit-strategy-end.json b/doc/notification_samples/audit-strategy-end.json index b3f7306be..dd2da91b9 100644 --- a/doc/notification_samples/audit-strategy-end.json +++ b/doc/notification_samples/audit-strategy-end.json @@ -9,6 +9,7 @@ "para1": 3.2 }, "state": "ONGOING", + "status_message": null, "updated_at": null, "deleted_at": null, "fault": null, diff --git a/doc/notification_samples/audit-strategy-error.json b/doc/notification_samples/audit-strategy-error.json index 4b775066c..ee49b0e3b 100644 --- a/doc/notification_samples/audit-strategy-error.json +++ b/doc/notification_samples/audit-strategy-error.json @@ -9,6 +9,7 @@ "para1": 3.2 }, "state": "ONGOING", + "status_message": null, "updated_at": null, "deleted_at": null, "fault": { diff --git a/doc/notification_samples/audit-strategy-start.json b/doc/notification_samples/audit-strategy-start.json index f648591e2..91a926005 100644 --- a/doc/notification_samples/audit-strategy-start.json +++ b/doc/notification_samples/audit-strategy-start.json @@ -9,6 +9,7 @@ "para1": 3.2 }, "state": "ONGOING", + "status_message": null, "updated_at": null, "deleted_at": null, "fault": null, diff --git a/doc/notification_samples/audit-update.json b/doc/notification_samples/audit-update.json index d4fccb3a7..a02994d3b 100644 --- a/doc/notification_samples/audit-update.json +++ b/doc/notification_samples/audit-update.json @@ -70,6 +70,7 @@ "interval": null, "updated_at": null, "state": "ONGOING", + "status_message": null, "audit_type": "ONESHOT" }, "watcher_object.namespace": "watcher", diff --git a/watcher/notifications/action.py b/watcher/notifications/action.py index 52bf55c32..9f79ffbfa 100644 --- a/watcher/notifications/action.py +++ b/watcher/notifications/action.py @@ -43,10 +43,13 @@ class ActionPayload(notificationbase.NotificationPayloadBase): 'created_at': ('action', 'created_at'), 'updated_at': ('action', 'updated_at'), 'deleted_at': ('action', 'deleted_at'), + + 'status_message': ('action', 'status_message'), } # Version 1.0: Initial version - VERSION = '1.0' + # Version 1.1: Added 'status_message' field + VERSION = '1.1' fields = { 'uuid': wfields.UUIDField(), @@ -56,6 +59,7 @@ class ActionPayload(notificationbase.NotificationPayloadBase): 'parents': wfields.ListOfUUIDsField(nullable=False, default=[]), 'action_plan_uuid': wfields.UUIDField(), 'action_plan': wfields.ObjectField('TerseActionPlanPayload'), + 'status_message': wfields.StringField(nullable=True), 'created_at': wfields.DateTimeField(nullable=True), 'updated_at': wfields.DateTimeField(nullable=True), @@ -70,18 +74,21 @@ class ActionPayload(notificationbase.NotificationPayloadBase): @base.WatcherObjectRegistry.register_notification class ActionStateUpdatePayload(notificationbase.NotificationPayloadBase): # Version 1.0: Initial version - VERSION = '1.0' + # Version 1.1: Added 'status_message' field + VERSION = '1.1' fields = { 'old_state': wfields.StringField(nullable=True), 'state': wfields.StringField(nullable=True), + 'status_message': wfields.StringField(nullable=True), } @base.WatcherObjectRegistry.register_notification class ActionCreatePayload(ActionPayload): # Version 1.0: Initial version - VERSION = '1.0' + # Version 1.1: Added 'status_message' field + VERSION = '1.1' fields = {} def __init__(self, action, action_plan): @@ -93,7 +100,8 @@ class ActionCreatePayload(ActionPayload): @base.WatcherObjectRegistry.register_notification class ActionUpdatePayload(ActionPayload): # Version 1.0: Initial version - VERSION = '1.0' + # Version 1.1: Added 'status_message' field + VERSION = '1.1' fields = { 'state_update': wfields.ObjectField('ActionStateUpdatePayload'), } @@ -108,7 +116,8 @@ class ActionUpdatePayload(ActionPayload): @base.WatcherObjectRegistry.register_notification class ActionExecutionPayload(ActionPayload): # Version 1.0: Initial version - VERSION = '1.0' + # Version 1.1: Added 'status_message' field + VERSION = '1.1' fields = { 'fault': wfields.ObjectField('ExceptionPayload', nullable=True), } @@ -123,7 +132,8 @@ class ActionExecutionPayload(ActionPayload): @base.WatcherObjectRegistry.register_notification class ActionCancelPayload(ActionPayload): # Version 1.0: Initial version - VERSION = '1.0' + # Version 1.1: Added 'status_message' field + VERSION = '1.1' fields = { 'fault': wfields.ObjectField('ExceptionPayload', nullable=True), } @@ -138,7 +148,8 @@ class ActionCancelPayload(ActionPayload): @base.WatcherObjectRegistry.register_notification class ActionDeletePayload(ActionPayload): # Version 1.0: Initial version - VERSION = '1.0' + # Version 1.1: Added 'status_message' field + VERSION = '1.1' fields = {} def __init__(self, action, action_plan): @@ -257,7 +268,11 @@ def send_update(context, action, service='infra-optim', state_update = ActionStateUpdatePayload( old_state=old_state, - state=action.state if old_state else None) + state=action.state if old_state else None, + status_message=( + action.status_message if old_state and + action.status_message else None) + ) versioned_payload = ActionUpdatePayload( action=action, diff --git a/watcher/notifications/action_plan.py b/watcher/notifications/action_plan.py index 1cc97a620..857bd0fdb 100644 --- a/watcher/notifications/action_plan.py +++ b/watcher/notifications/action_plan.py @@ -38,6 +38,7 @@ class TerseActionPlanPayload(notificationbase.NotificationPayloadBase): 'state': ('action_plan', 'state'), 'global_efficacy': ('action_plan', 'global_efficacy'), + 'status_message': ('action_plan', 'status_message'), 'created_at': ('action_plan', 'created_at'), 'updated_at': ('action_plan', 'updated_at'), @@ -46,7 +47,8 @@ class TerseActionPlanPayload(notificationbase.NotificationPayloadBase): # Version 1.0: Initial version # Version 1.1: Changed 'global_efficacy' type Dictionary to List - VERSION = '1.1' + # Version 1.2: Added 'status_message' field + VERSION = '1.2' fields = { 'uuid': wfields.UUIDField(), @@ -54,6 +56,7 @@ class TerseActionPlanPayload(notificationbase.NotificationPayloadBase): 'global_efficacy': wfields.FlexibleListOfDictField(nullable=True), 'audit_uuid': wfields.UUIDField(), 'strategy_uuid': wfields.UUIDField(nullable=True), + 'status_message': wfields.StringField(nullable=True), 'created_at': wfields.DateTimeField(nullable=True), 'updated_at': wfields.DateTimeField(nullable=True), @@ -74,6 +77,7 @@ class ActionPlanPayload(TerseActionPlanPayload): 'state': ('action_plan', 'state'), 'global_efficacy': ('action_plan', 'global_efficacy'), + 'status_message': ('action_plan', 'status_message'), 'created_at': ('action_plan', 'created_at'), 'updated_at': ('action_plan', 'updated_at'), @@ -82,7 +86,8 @@ class ActionPlanPayload(TerseActionPlanPayload): # Version 1.0: Initial version # Vesrsion 1.1: changed global_efficacy type - VERSION = '1.1' + # Version 1.2 : Added 'status_message' field + VERSION = '1.2' fields = { 'audit': wfields.ObjectField('TerseAuditPayload'), @@ -103,11 +108,13 @@ class ActionPlanPayload(TerseActionPlanPayload): @base.WatcherObjectRegistry.register_notification class ActionPlanStateUpdatePayload(notificationbase.NotificationPayloadBase): # Version 1.0: Initial version - VERSION = '1.0' + # Version 1.1: Added 'status_message' field + VERSION = '1.1' fields = { 'old_state': wfields.StringField(nullable=True), 'state': wfields.StringField(nullable=True), + 'status_message': wfields.StringField(nullable=True), } @@ -115,7 +122,8 @@ class ActionPlanStateUpdatePayload(notificationbase.NotificationPayloadBase): class ActionPlanCreatePayload(ActionPlanPayload): # Version 1.0: Initial version # Version 1.1: Changed global_efficacy_type - VERSION = '1.1' + # Version 1.2: Added 'status_message' field + VERSION = '1.2' fields = {} def __init__(self, action_plan, audit, strategy): @@ -129,7 +137,8 @@ class ActionPlanCreatePayload(ActionPlanPayload): class ActionPlanUpdatePayload(ActionPlanPayload): # Version 1.0: Initial version # Version 1.1: Changed global_efficacy_type - VERSION = '1.1' + # Version 1.2: Added 'status_message' field + VERSION = '1.2' fields = { 'state_update': wfields.ObjectField('ActionPlanStateUpdatePayload'), } @@ -146,7 +155,8 @@ class ActionPlanUpdatePayload(ActionPlanPayload): class ActionPlanActionPayload(ActionPlanPayload): # Version 1.0: Initial version # Version 1.1: Changed global_efficacy_type - VERSION = '1.1' + # Version 1.2: Added 'status_message' field + VERSION = '1.2' fields = { 'fault': wfields.ObjectField('ExceptionPayload', nullable=True), } @@ -163,7 +173,8 @@ class ActionPlanActionPayload(ActionPlanPayload): class ActionPlanDeletePayload(ActionPlanPayload): # Version 1.0: Initial version # Version 1.1: Changed global_efficacy_type - VERSION = '1.1' + # Version 1.2: Added 'status_message' field + VERSION = '1.2' fields = {} def __init__(self, action_plan, audit, strategy): @@ -177,7 +188,8 @@ class ActionPlanDeletePayload(ActionPlanPayload): class ActionPlanCancelPayload(ActionPlanPayload): # Version 1.0: Initial version # Version 1.1: Changed global_efficacy_type - VERSION = '1.1' + # Version 1.2: Added 'status_message' field + VERSION = '1.2' fields = { 'fault': wfields.ObjectField('ExceptionPayload', nullable=True), } @@ -300,7 +312,11 @@ def send_update(context, action_plan, service='infra-optim', state_update = ActionPlanStateUpdatePayload( old_state=old_state, - state=action_plan.state if old_state else None) + state=action_plan.state if old_state else None, + status_message=( + action_plan.status_message if old_state and + action_plan.status_message else None) + ) versioned_payload = ActionPlanUpdatePayload( action_plan=action_plan, diff --git a/watcher/notifications/audit.py b/watcher/notifications/audit.py index cfdf88fa6..eb45acc25 100644 --- a/watcher/notifications/audit.py +++ b/watcher/notifications/audit.py @@ -45,6 +45,8 @@ class TerseAuditPayload(notificationbase.NotificationPayloadBase): 'created_at': ('audit', 'created_at'), 'updated_at': ('audit', 'updated_at'), 'deleted_at': ('audit', 'deleted_at'), + + 'status_message': ('audit', 'status_message'), } # Version 1.0: Initial version @@ -52,7 +54,8 @@ class TerseAuditPayload(notificationbase.NotificationPayloadBase): # Added 'next_run_time' DateTime field, # 'interval' type has been changed from Integer to String # Version 1.2: Added 'name' string field - VERSION = '1.2' + # Version 1.3: Added 'status_message' string field + VERSION = '1.3' fields = { 'uuid': wfields.UUIDField(), @@ -70,6 +73,8 @@ class TerseAuditPayload(notificationbase.NotificationPayloadBase): 'created_at': wfields.DateTimeField(nullable=True), 'updated_at': wfields.DateTimeField(nullable=True), 'deleted_at': wfields.DateTimeField(nullable=True), + + 'status_message': wfields.StringField(nullable=True), } def __init__(self, audit, goal_uuid, strategy_uuid=None, **kwargs): @@ -94,13 +99,16 @@ class AuditPayload(TerseAuditPayload): 'created_at': ('audit', 'created_at'), 'updated_at': ('audit', 'updated_at'), 'deleted_at': ('audit', 'deleted_at'), + + 'status_message': ('audit', 'status_message'), } # Version 1.0: Initial version # Version 1.1: Added 'auto_trigger' field, # Added 'next_run_time' field # Version 1.2: Added 'name' string field - VERSION = '1.2' + # Version 1.3: Added 'status_message' string field + VERSION = '1.3' fields = { 'goal': wfields.ObjectField('GoalPayload'), @@ -122,11 +130,13 @@ class AuditPayload(TerseAuditPayload): @base.WatcherObjectRegistry.register_notification class AuditStateUpdatePayload(notificationbase.NotificationPayloadBase): # Version 1.0: Initial version - VERSION = '1.0' + # Version 1.1: Added 'status_message' string field + VERSION = '1.1' fields = { 'old_state': wfields.StringField(nullable=True), 'state': wfields.StringField(nullable=True), + 'status_message': wfields.StringField(nullable=True), } @@ -135,7 +145,8 @@ class AuditCreatePayload(AuditPayload): # Version 1.0: Initial version # Version 1.1: Added 'auto_trigger' field, # Added 'next_run_time' field - VERSION = '1.1' + # Version 1.2: Added 'status_message' string field + VERSION = '1.2' fields = {} def __init__(self, audit, goal, strategy): @@ -151,7 +162,8 @@ class AuditUpdatePayload(AuditPayload): # Version 1.0: Initial version # Version 1.1: Added 'auto_trigger' field, # Added 'next_run_time' field - VERSION = '1.1' + # Version 1.2: Added 'status_message' string field + VERSION = '1.2' fields = { 'state_update': wfields.ObjectField('AuditStateUpdatePayload'), } @@ -170,7 +182,8 @@ class AuditActionPayload(AuditPayload): # Version 1.0: Initial version # Version 1.1: Added 'auto_trigger' field, # Added 'next_run_time' field - VERSION = '1.1' + # Version 1.2: Added 'status_message' string field + VERSION = '1.2' fields = { 'fault': wfields.ObjectField('ExceptionPayload', nullable=True), } @@ -189,7 +202,8 @@ class AuditDeletePayload(AuditPayload): # Version 1.0: Initial version # Version 1.1: Added 'auto_trigger' field, # Added 'next_run_time' field - VERSION = '1.1' + # Version 1.2: Added 'status_message' string field + VERSION = '1.2' fields = {} def __init__(self, audit, goal, strategy): @@ -296,7 +310,10 @@ def send_update(context, audit, service='infra-optim', state_update = AuditStateUpdatePayload( old_state=old_state, - state=audit.state if old_state else None) + state=audit.state if old_state else None, + status_message=( + audit.status_message if old_state and + audit.status_message else None)) versioned_payload = AuditUpdatePayload( audit=audit, diff --git a/watcher/objects/action.py b/watcher/objects/action.py index 95f923a23..624bebf7e 100644 --- a/watcher/objects/action.py +++ b/watcher/objects/action.py @@ -40,7 +40,8 @@ class Action(base.WatcherPersistentObject, base.WatcherObject, # Version 1.0: Initial version # Version 1.1: Added 'action_plan' object field # Version 2.0: Removed 'next' object field, Added 'parents' object field - VERSION = '2.0' + # Version 2.1: Added 'status_message' object field + VERSION = '2.1' dbapi = db_api.get_instance() @@ -52,6 +53,7 @@ class Action(base.WatcherPersistentObject, base.WatcherObject, 'input_parameters': wfields.DictField(nullable=True), 'state': wfields.StringField(nullable=True), 'parents': wfields.ListOfStringsField(nullable=True), + 'status_message': wfields.StringField(nullable=True), 'action_plan': wfields.ObjectField('ActionPlan', nullable=True), } diff --git a/watcher/objects/action_plan.py b/watcher/objects/action_plan.py index c35e8e4a6..8426532f4 100644 --- a/watcher/objects/action_plan.py +++ b/watcher/objects/action_plan.py @@ -109,7 +109,8 @@ class ActionPlan(base.WatcherPersistentObject, base.WatcherObject, # Version 2.0: Removed 'first_action_id' object field # Version 2.1: Changed global_efficacy type # Version 2.2: Added 'hostname' field - VERSION = '2.2' + # Version 2.3: Added 'status_message' field + VERSION = '2.3' dbapi = db_api.get_instance() @@ -124,6 +125,7 @@ class ActionPlan(base.WatcherPersistentObject, base.WatcherObject, 'audit': wfields.ObjectField('Audit', nullable=True), 'strategy': wfields.ObjectField('Strategy', nullable=True), + 'status_message': wfields.StringField(nullable=True), } object_fields = { diff --git a/watcher/objects/audit.py b/watcher/objects/audit.py index 434cdf583..9b53baf32 100644 --- a/watcher/objects/audit.py +++ b/watcher/objects/audit.py @@ -91,7 +91,8 @@ class Audit(base.WatcherPersistentObject, base.WatcherObject, # Version 1.5: Added 'hostname' field # Version 1.6: Added 'start_time' and 'end_time' DateTime fields # Version 1.7: Added 'force' boolean field - VERSION = '1.7' + # Version 1.8: Added 'status_message' string field + VERSION = '1.8' dbapi = db_api.get_instance() @@ -116,6 +117,8 @@ class Audit(base.WatcherPersistentObject, base.WatcherObject, 'goal': wfields.ObjectField('Goal', nullable=True), 'strategy': wfields.ObjectField('Strategy', nullable=True), + + 'status_message': wfields.StringField(nullable=True), } object_fields = { diff --git a/watcher/tests/api/v1/test_audits.py b/watcher/tests/api/v1/test_audits.py index 5ce93075a..1a2e7b859 100644 --- a/watcher/tests/api/v1/test_audits.py +++ b/watcher/tests/api/v1/test_audits.py @@ -59,7 +59,7 @@ def post_get_test_audit_with_predefined_strategy(**kw): audit = api_utils.audit_post_data(**kw) audit_template = db_utils.get_test_audit_template( strategy_id=strategy['id']) - del_keys = ['goal_id', 'strategy_id'] + del_keys = ['goal_id', 'strategy_id', 'status_message'] add_keys = {'audit_template_uuid': audit_template['uuid'], } for k in del_keys: @@ -500,7 +500,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( state=objects.audit.State.PENDING, params_to_exclude=['uuid', 'state', 'interval', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) response = self.post_json('/audits', audit_dict) self.assertEqual('application/json', response.content_type) @@ -541,7 +542,7 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( state=objects.audit.State.PENDING, params_to_exclude=['uuid', 'state', 'interval', 'scope', - 'next_run_time', 'hostname']) + 'next_run_time', 'hostname', 'status_message']) response = self.post_json('/audits', audit_dict, expect_errors=True) self.assertEqual(HTTPStatus.BAD_REQUEST, response.status_int) @@ -555,7 +556,7 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'interval', 'scope', 'next_run_time', 'hostname', - 'audit_template_uuid']) + 'audit_template_uuid', 'status_message']) response = self.post_json('/audits', audit_dict) self.assertEqual('application/json', response.content_type) @@ -571,7 +572,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'interval', 'scope', 'next_run_time', 'hostname', - 'audit_template_uuid', 'strategy']) + 'audit_template_uuid', 'strategy', + 'status_message']) response = self.post_json('/audits', audit_dict) self.assertEqual('application/json', response.content_type) @@ -587,7 +589,7 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'interval', 'scope', 'next_run_time', 'hostname', - 'audit_template_uuid'], + 'audit_template_uuid', 'status_message'], use_named_goal=True) response = self.post_json('/audits', audit_dict) @@ -604,7 +606,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'interval', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) # Make the audit template UUID some garbage value audit_dict['audit_template_uuid'] = ( '01234567-8910-1112-1314-151617181920') @@ -624,7 +627,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( state=objects.audit.State.PENDING, params_to_exclude=['uuid', 'interval', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) state = audit_dict['state'] del audit_dict['state'] with mock.patch.object(self.dbapi, 'create_audit', @@ -641,7 +645,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'interval', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) response = self.post_json('/audits', audit_dict) self.assertEqual('application/json', response.content_type) @@ -656,7 +661,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) audit_dict['audit_type'] = objects.audit.AuditType.CONTINUOUS.value audit_dict['interval'] = '1200' @@ -675,7 +681,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) audit_dict['audit_type'] = objects.audit.AuditType.CONTINUOUS.value audit_dict['interval'] = '* * * * *' @@ -694,7 +701,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) audit_dict['audit_type'] = objects.audit.AuditType.CONTINUOUS.value audit_dict['interval'] = 'zxc' @@ -714,7 +722,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'interval', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) audit_dict['audit_type'] = objects.audit.AuditType.CONTINUOUS.value response = self.post_json('/audits', audit_dict, expect_errors=True) @@ -731,7 +740,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) audit_dict['audit_type'] = objects.audit.AuditType.ONESHOT.value response = self.post_json('/audits', audit_dict, expect_errors=True) @@ -747,7 +757,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( state=objects.audit.State.PENDING, params_to_exclude=['uuid', 'state', 'interval', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) response = self.post_json('/audits', audit_dict) de_mock.assert_called_once_with(mock.ANY, response.json['uuid']) @@ -769,7 +780,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( parameters={'name': 'Tom'}, params_to_exclude=['uuid', 'state', 'interval', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) response = self.post_json('/audits', audit_dict, expect_errors=True) self.assertEqual('application/json', response.content_type) @@ -815,7 +827,7 @@ class TestPost(api_base.FunctionalTest): audit_dict['audit_template_uuid'] = audit_template['uuid'] del_keys = ['uuid', 'goal_id', 'strategy_id', 'state', 'interval', - 'scope', 'next_run_time', 'hostname'] + 'scope', 'next_run_time', 'hostname', 'status_message'] for k in del_keys: del audit_dict[k] @@ -838,7 +850,7 @@ class TestPost(api_base.FunctionalTest): audit_dict['audit_template_uuid'] = audit_template['uuid'] del_keys = ['uuid', 'goal_id', 'strategy_id', 'state', 'interval', - 'scope', 'next_run_time', 'hostname'] + 'scope', 'next_run_time', 'hostname', 'status_message'] for k in del_keys: del audit_dict[k] @@ -894,7 +906,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['state', 'interval', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) normal_name = 'this audit name is just for test' # long_name length exceeds 63 characters long_name = normal_name + audit_dict['uuid'] @@ -921,7 +934,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'scope', - 'next_run_time', 'hostname', 'goal'] + 'next_run_time', 'hostname', 'goal', + 'status_message'] ) audit_dict['audit_type'] = objects.audit.AuditType.CONTINUOUS.value audit_dict['interval'] = '1200' @@ -957,7 +971,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'scope', - 'next_run_time', 'hostname', 'goal'] + 'next_run_time', 'hostname', 'goal', + 'status_message'] ) audit_dict['audit_type'] = objects.audit.AuditType.CONTINUOUS.value audit_dict['interval'] = '1200' @@ -982,7 +997,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'interval', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) response = self.post_json( '/audits', @@ -998,7 +1014,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'interval', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) audit_dict['force'] = True response = self.post_json( @@ -1016,7 +1033,8 @@ class TestPost(api_base.FunctionalTest): audit_dict = post_get_test_audit( params_to_exclude=['uuid', 'state', 'interval', 'scope', 'next_run_time', 'hostname', 'goal', - 'audit_template_uuid', 'name']) + 'audit_template_uuid', 'name', + 'status_message']) response = self.post_json( '/audits', @@ -1141,7 +1159,8 @@ class TestAuditPolicyEnforcement(api_base.FunctionalTest): audit_dict = post_get_test_audit( state=objects.audit.State.PENDING, params_to_exclude=['uuid', 'state', 'scope', - 'next_run_time', 'hostname', 'goal']) + 'next_run_time', 'hostname', 'goal', + 'status_message']) self._common_policy_check( "audit:create", self.post_json, '/audits', audit_dict, expect_errors=True) diff --git a/watcher/tests/db/utils.py b/watcher/tests/db/utils.py index 830c9e1b3..ab19942af 100644 --- a/watcher/tests/db/utils.py +++ b/watcher/tests/db/utils.py @@ -99,8 +99,8 @@ def get_test_audit(**kwargs): 'hostname': kwargs.get('hostname', 'host_1'), 'start_time': kwargs.get('start_time'), 'end_time': kwargs.get('end_time'), - 'force': kwargs.get('force', False) - + 'force': kwargs.get('force', False), + 'status_message': kwargs.get('status_message', None), } # ObjectField doesn't allow None nor dict, so if we want to simulate a # non-eager object loading, the field should not be referenced at all. @@ -141,6 +141,7 @@ def get_test_action(**kwargs): 'created_at': kwargs.get('created_at'), 'updated_at': kwargs.get('updated_at'), 'deleted_at': kwargs.get('deleted_at'), + 'status_message': kwargs.get('status_message', None), } # ObjectField doesn't allow None nor dict, so if we want to simulate a @@ -177,6 +178,7 @@ def get_test_action_plan(**kwargs): 'updated_at': kwargs.get('updated_at'), 'deleted_at': kwargs.get('deleted_at'), 'hostname': kwargs.get('hostname', 'host_1'), + 'status_message': kwargs.get('status_message', None), } # ObjectField doesn't allow None nor dict, so if we want to simulate a diff --git a/watcher/tests/decision_engine/planner/test_weight_planner.py b/watcher/tests/decision_engine/planner/test_weight_planner.py index 56354d263..867042ccf 100644 --- a/watcher/tests/decision_engine/planner/test_weight_planner.py +++ b/watcher/tests/decision_engine/planner/test_weight_planner.py @@ -191,7 +191,7 @@ class TestActionScheduling(base.DbTestCase): for src, dst in edges: for key in ('id', 'action_plan', 'action_plan_id', 'created_at', 'input_parameters', 'deleted_at', 'updated_at', - 'state'): + 'state', 'status_message'): del src[key] del dst[key] @@ -247,7 +247,7 @@ class TestActionScheduling(base.DbTestCase): for src, dst in edges: for key in ('id', 'action_plan', 'action_plan_id', 'created_at', 'input_parameters', 'deleted_at', 'updated_at', - 'state'): + 'state', 'status_message'): del src[key] del dst[key] @@ -310,7 +310,7 @@ class TestActionScheduling(base.DbTestCase): for src, dst in edges: for key in ('id', 'action_plan', 'action_plan_id', 'created_at', 'input_parameters', 'deleted_at', 'updated_at', - 'state'): + 'state', 'status_message'): del src[key] del dst[key] @@ -406,7 +406,7 @@ class TestActionScheduling(base.DbTestCase): for src, dst in edges: for key in ('id', 'action_plan', 'action_plan_id', 'created_at', 'input_parameters', 'deleted_at', 'updated_at', - 'state'): + 'state', 'status_message'): del src[key] del dst[key] @@ -505,7 +505,7 @@ class TestActionScheduling(base.DbTestCase): for src, dst in edges: for key in ('id', 'action_plan', 'action_plan_id', 'created_at', 'input_parameters', 'deleted_at', 'updated_at', - 'state'): + 'state', 'status_message'): del src[key] del dst[key] @@ -609,7 +609,7 @@ class TestActionScheduling(base.DbTestCase): for src, dst in edges: for key in ('id', 'action_plan', 'action_plan_id', 'created_at', 'input_parameters', 'deleted_at', 'updated_at', - 'state'): + 'state', 'status_message'): del src[key] del dst[key] @@ -730,7 +730,7 @@ class TestActionScheduling(base.DbTestCase): for src, dst in edges: for key in ('id', 'action_plan', 'action_plan_id', 'created_at', 'input_parameters', 'deleted_at', 'updated_at', - 'state'): + 'state', 'status_message'): del src[key] del dst[key] @@ -885,7 +885,7 @@ class TestActionScheduling(base.DbTestCase): for src, dst in edges: for key in ('id', 'action_plan', 'action_plan_id', 'created_at', 'input_parameters', 'deleted_at', 'updated_at', - 'state'): + 'state', 'status_message'): del src[key] del dst[key] diff --git a/watcher/tests/notifications/test_action_notification.py b/watcher/tests/notifications/test_action_notification.py index 3a65da899..df7f69f9c 100644 --- a/watcher/tests/notifications/test_action_notification.py +++ b/watcher/tests/notifications/test_action_notification.py @@ -59,7 +59,8 @@ class TestActionNotification(base.DbTestCase): action = utils.create_test_action( mock.Mock(), state=objects.action.State.ONGOING, action_type='nop', input_parameters={'param1': 1, 'param2': 2}, - parents=[], action_plan_id=self.action_plan.id) + parents=[], action_plan_id=self.action_plan.id, + status_message="Test status message") notifications.action.send_update( mock.MagicMock(), action, host='node0', old_state=objects.action.State.PENDING) @@ -74,7 +75,7 @@ class TestActionNotification(base.DbTestCase): self.assertDictEqual( { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.0', + 'watcher_object.version': '1.1', 'watcher_object.name': 'ActionUpdatePayload', 'watcher_object.data': { 'uuid': '10a47dd1-4874-4298-91cf-eff046dbdb8d', @@ -86,17 +87,18 @@ class TestActionNotification(base.DbTestCase): 'updated_at': None, 'state_update': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.0', + 'watcher_object.version': '1.1', 'watcher_object.name': 'ActionStateUpdatePayload', 'watcher_object.data': { 'old_state': 'PENDING', - 'state': 'ONGOING' + 'state': 'ONGOING', + 'status_message': 'Test status message' } }, 'state': 'ONGOING', 'action_plan': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.1', + 'watcher_object.version': '1.2', 'watcher_object.name': 'TerseActionPlanPayload', 'watcher_object.data': { 'uuid': '76be87bd-3422-43f9-93a0-e85a577e3061', @@ -108,12 +110,14 @@ class TestActionNotification(base.DbTestCase): '-91cf-eff046dbdb8d', 'strategy_uuid': 'cb3d0b58-4415-4d90' '-b75b-1e96878730e3', - 'deleted_at': None + 'deleted_at': None, + 'status_message': None } }, 'parents': [], 'action_type': 'nop', - 'deleted_at': None + 'deleted_at': None, + 'status_message': 'Test status message' } }, payload @@ -135,7 +139,7 @@ class TestActionNotification(base.DbTestCase): self.assertDictEqual( { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.0', + 'watcher_object.version': '1.1', 'watcher_object.name': 'ActionCreatePayload', 'watcher_object.data': { 'uuid': '10a47dd1-4874-4298-91cf-eff046dbdb8d', @@ -148,7 +152,7 @@ class TestActionNotification(base.DbTestCase): 'state': 'PENDING', 'action_plan': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.1', + 'watcher_object.version': '1.2', 'watcher_object.name': 'TerseActionPlanPayload', 'watcher_object.data': { 'uuid': '76be87bd-3422-43f9-93a0-e85a577e3061', @@ -160,12 +164,14 @@ class TestActionNotification(base.DbTestCase): '-91cf-eff046dbdb8d', 'strategy_uuid': 'cb3d0b58-4415-4d90' '-b75b-1e96878730e3', - 'deleted_at': None + 'deleted_at': None, + 'status_message': None } }, 'parents': [], 'action_type': 'nop', - 'deleted_at': None + 'deleted_at': None, + 'status_message': None } }, payload @@ -189,7 +195,7 @@ class TestActionNotification(base.DbTestCase): self.assertDictEqual( { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.0', + 'watcher_object.version': '1.1', 'watcher_object.name': 'ActionDeletePayload', 'watcher_object.data': { 'uuid': '10a47dd1-4874-4298-91cf-eff046dbdb8d', @@ -202,7 +208,7 @@ class TestActionNotification(base.DbTestCase): 'state': 'DELETED', 'action_plan': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.1', + 'watcher_object.version': '1.2', 'watcher_object.name': 'TerseActionPlanPayload', 'watcher_object.data': { 'uuid': '76be87bd-3422-43f9-93a0-e85a577e3061', @@ -214,12 +220,14 @@ class TestActionNotification(base.DbTestCase): '-91cf-eff046dbdb8d', 'strategy_uuid': 'cb3d0b58-4415-4d90' '-b75b-1e96878730e3', - 'deleted_at': None + 'deleted_at': None, + 'status_message': None } }, 'parents': [], 'action_type': 'nop', - 'deleted_at': None + 'deleted_at': None, + 'status_message': None } }, payload @@ -244,7 +252,7 @@ class TestActionNotification(base.DbTestCase): 'event_type': 'action.execution.start', 'payload': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.0', + 'watcher_object.version': '1.1', 'watcher_object.name': 'ActionExecutionPayload', 'watcher_object.data': { 'uuid': '10a47dd1-4874-4298-91cf-eff046dbdb8d', @@ -258,7 +266,7 @@ class TestActionNotification(base.DbTestCase): 'state': 'PENDING', 'action_plan': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.1', + 'watcher_object.version': '1.2', 'watcher_object.name': 'TerseActionPlanPayload', 'watcher_object.data': { 'uuid': '76be87bd-3422-43f9-93a0-e85a577e3061', @@ -270,12 +278,14 @@ class TestActionNotification(base.DbTestCase): '-91cf-eff046dbdb8d', 'strategy_uuid': 'cb3d0b58-4415-4d90' '-b75b-1e96878730e3', - 'deleted_at': None + 'deleted_at': None, + 'status_message': None } }, 'parents': [], 'action_type': 'nop', - 'deleted_at': None + 'deleted_at': None, + 'status_message': None } } }, @@ -283,11 +293,13 @@ class TestActionNotification(base.DbTestCase): ) def test_send_action_execution_with_error(self): + self.action_plan.status_message = 'Action plan status message' + self.action_plan.save() action = utils.create_test_action( mock.Mock(), state=objects.action.State.FAILED, action_type='nop', input_parameters={'param1': 1, 'param2': 2}, - parents=[], action_plan_id=self.action_plan.id) - + parents=[], action_plan_id=self.action_plan.id, + status_message='Action status message') try: # This is to load the exception in sys.exc_info() raise exception.WatcherException("TEST") @@ -304,7 +316,7 @@ class TestActionNotification(base.DbTestCase): 'event_type': 'action.execution.error', 'payload': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.0', + 'watcher_object.version': '1.1', 'watcher_object.name': 'ActionExecutionPayload', 'watcher_object.data': { 'uuid': '10a47dd1-4874-4298-91cf-eff046dbdb8d', @@ -331,24 +343,26 @@ class TestActionNotification(base.DbTestCase): 'state': 'FAILED', 'action_plan': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.1', + 'watcher_object.version': '1.2', 'watcher_object.name': 'TerseActionPlanPayload', 'watcher_object.data': { 'uuid': '76be87bd-3422-43f9-93a0-e85a577e3061', 'global_efficacy': [], 'created_at': '2016-10-18T09:52:05Z', - 'updated_at': None, + 'updated_at': '2016-10-18T09:52:05Z', 'state': 'ONGOING', 'audit_uuid': '10a47dd1-4874-4298' '-91cf-eff046dbdb8d', 'strategy_uuid': 'cb3d0b58-4415-4d90' '-b75b-1e96878730e3', - 'deleted_at': None + 'deleted_at': None, + 'status_message': 'Action plan status message' } }, 'parents': [], 'action_type': 'nop', - 'deleted_at': None + 'deleted_at': None, + 'status_message': 'Action status message' } } }, @@ -374,7 +388,7 @@ class TestActionNotification(base.DbTestCase): 'event_type': 'action.cancel.start', 'payload': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.0', + 'watcher_object.version': '1.1', 'watcher_object.name': 'ActionCancelPayload', 'watcher_object.data': { 'uuid': '10a47dd1-4874-4298-91cf-eff046dbdb8d', @@ -388,7 +402,7 @@ class TestActionNotification(base.DbTestCase): 'state': 'PENDING', 'action_plan': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.1', + 'watcher_object.version': '1.2', 'watcher_object.name': 'TerseActionPlanPayload', 'watcher_object.data': { 'uuid': '76be87bd-3422-43f9-93a0-e85a577e3061', @@ -400,12 +414,14 @@ class TestActionNotification(base.DbTestCase): '-91cf-eff046dbdb8d', 'strategy_uuid': 'cb3d0b58-4415-4d90' '-b75b-1e96878730e3', - 'deleted_at': None + 'deleted_at': None, + 'status_message': None } }, 'parents': [], 'action_type': 'nop', - 'deleted_at': None + 'deleted_at': None, + 'status_message': None } } }, @@ -434,7 +450,7 @@ class TestActionNotification(base.DbTestCase): 'event_type': 'action.cancel.error', 'payload': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.0', + 'watcher_object.version': '1.1', 'watcher_object.name': 'ActionCancelPayload', 'watcher_object.data': { 'uuid': '10a47dd1-4874-4298-91cf-eff046dbdb8d', @@ -461,7 +477,7 @@ class TestActionNotification(base.DbTestCase): 'state': 'FAILED', 'action_plan': { 'watcher_object.namespace': 'watcher', - 'watcher_object.version': '1.1', + 'watcher_object.version': '1.2', 'watcher_object.name': 'TerseActionPlanPayload', 'watcher_object.data': { 'uuid': '76be87bd-3422-43f9-93a0-e85a577e3061', @@ -473,12 +489,14 @@ class TestActionNotification(base.DbTestCase): '-91cf-eff046dbdb8d', 'strategy_uuid': 'cb3d0b58-4415-4d90' '-b75b-1e96878730e3', - 'deleted_at': None + 'deleted_at': None, + 'status_message': None } }, 'parents': [], 'action_type': 'nop', - 'deleted_at': None + 'deleted_at': None, + 'status_message': None } } }, diff --git a/watcher/tests/notifications/test_action_plan_notification.py b/watcher/tests/notifications/test_action_plan_notification.py index 91d19d021..5c57eb6d8 100644 --- a/watcher/tests/notifications/test_action_plan_notification.py +++ b/watcher/tests/notifications/test_action_plan_notification.py @@ -57,7 +57,8 @@ class TestActionPlanNotification(base.DbTestCase): action_plan = utils.create_test_action_plan( mock.Mock(), state=objects.action_plan.State.ONGOING, audit_id=self.audit.id, strategy_id=self.strategy.id, - audit=self.audit, strategy=self.strategy) + audit=self.audit, strategy=self.strategy, + status_message="Test status message") notifications.action_plan.send_update( mock.MagicMock(), action_plan, host='node0', old_state=objects.action_plan.State.PENDING) @@ -72,7 +73,7 @@ class TestActionPlanNotification(base.DbTestCase): self.assertDictEqual( { "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1", + "watcher_object.version": "1.2", "watcher_object.data": { "global_efficacy": [], "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", @@ -108,22 +109,25 @@ class TestActionPlanNotification(base.DbTestCase): "state": "PENDING", "updated_at": None, "created_at": "2016-10-18T09:52:05Z", - "audit_type": "ONESHOT" + "audit_type": "ONESHOT", + "status_message": None }, "watcher_object.name": "TerseAuditPayload", "watcher_object.namespace": "watcher", - "watcher_object.version": "1.2" + "watcher_object.version": "1.3" }, "deleted_at": None, "state": "ONGOING", + "status_message": 'Test status message', "updated_at": None, "created_at": "2016-10-18T09:52:05Z", "state_update": { "watcher_object.namespace": "watcher", - "watcher_object.version": "1.0", + "watcher_object.version": "1.1", "watcher_object.data": { "old_state": "PENDING", - "state": "ONGOING" + "state": "ONGOING", + "status_message": "Test status message", }, "watcher_object.name": "ActionPlanStateUpdatePayload" }, @@ -149,7 +153,7 @@ class TestActionPlanNotification(base.DbTestCase): self.assertDictEqual( { "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1", + "watcher_object.version": "1.2", "watcher_object.data": { "global_efficacy": [], "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", @@ -185,14 +189,16 @@ class TestActionPlanNotification(base.DbTestCase): "state": "PENDING", "updated_at": None, "created_at": "2016-10-18T09:52:05Z", - "audit_type": "ONESHOT" + "audit_type": "ONESHOT", + "status_message": None }, "watcher_object.name": "TerseAuditPayload", "watcher_object.namespace": "watcher", - "watcher_object.version": "1.2" + "watcher_object.version": "1.3" }, "deleted_at": None, "state": "PENDING", + "status_message": None, "updated_at": None, "created_at": None, }, @@ -218,7 +224,7 @@ class TestActionPlanNotification(base.DbTestCase): self.assertDictEqual( { "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1", + "watcher_object.version": "1.2", "watcher_object.data": { "global_efficacy": [], "strategy_uuid": "cb3d0b58-4415-4d90-b75b-1e96878730e3", @@ -254,14 +260,16 @@ class TestActionPlanNotification(base.DbTestCase): "state": "PENDING", "updated_at": None, "created_at": "2016-10-18T09:52:05Z", - "audit_type": "ONESHOT" + "audit_type": "ONESHOT", + "status_message": None }, "watcher_object.name": "TerseAuditPayload", "watcher_object.namespace": "watcher", - "watcher_object.version": "1.2" + "watcher_object.version": "1.3" }, "deleted_at": None, "state": "DELETED", + "status_message": None, "updated_at": None, "created_at": "2016-10-18T09:52:05Z", }, @@ -297,7 +305,7 @@ class TestActionPlanNotification(base.DbTestCase): "audit": { "watcher_object.namespace": "watcher", "watcher_object.name": "TerseAuditPayload", - "watcher_object.version": "1.2", + "watcher_object.version": "1.3", "watcher_object.data": { "interval": None, "next_run_time": None, @@ -313,11 +321,13 @@ class TestActionPlanNotification(base.DbTestCase): "state": "PENDING", "updated_at": None, "created_at": "2016-10-18T09:52:05Z", - "audit_type": "ONESHOT" + "audit_type": "ONESHOT", + "status_message": None } }, "global_efficacy": [], "state": "ONGOING", + "status_message": None, "strategy_uuid": ( "cb3d0b58-4415-4d90-b75b-1e96878730e3"), "strategy": { @@ -339,7 +349,7 @@ class TestActionPlanNotification(base.DbTestCase): }, "watcher_object.name": "ActionPlanActionPayload", "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1" + "watcher_object.version": "1.2" } }, notification @@ -399,14 +409,16 @@ class TestActionPlanNotification(base.DbTestCase): "state": "PENDING", "updated_at": None, "created_at": "2016-10-18T09:52:05Z", - "audit_type": "ONESHOT" + "audit_type": "ONESHOT", + "status_message": None }, "watcher_object.name": "TerseAuditPayload", "watcher_object.namespace": "watcher", - "watcher_object.version": "1.2" + "watcher_object.version": "1.3" }, "global_efficacy": [], "state": "ONGOING", + "status_message": None, "strategy_uuid": ( "cb3d0b58-4415-4d90-b75b-1e96878730e3"), "strategy": { @@ -428,7 +440,7 @@ class TestActionPlanNotification(base.DbTestCase): }, "watcher_object.name": "ActionPlanActionPayload", "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1" + "watcher_object.version": "1.2" } }, notification @@ -460,7 +472,7 @@ class TestActionPlanNotification(base.DbTestCase): "audit": { "watcher_object.namespace": "watcher", "watcher_object.name": "TerseAuditPayload", - "watcher_object.version": "1.2", + "watcher_object.version": "1.3", "watcher_object.data": { "interval": None, "next_run_time": None, @@ -476,11 +488,13 @@ class TestActionPlanNotification(base.DbTestCase): "state": "PENDING", "updated_at": None, "created_at": "2016-10-18T09:52:05Z", - "audit_type": "ONESHOT" + "audit_type": "ONESHOT", + "status_message": None } }, "global_efficacy": [], "state": "ONGOING", + "status_message": None, "strategy_uuid": ( "cb3d0b58-4415-4d90-b75b-1e96878730e3"), "strategy": { @@ -502,7 +516,7 @@ class TestActionPlanNotification(base.DbTestCase): }, "watcher_object.name": "ActionPlanCancelPayload", "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1" + "watcher_object.version": "1.2" } }, notification @@ -562,14 +576,16 @@ class TestActionPlanNotification(base.DbTestCase): "state": "PENDING", "updated_at": None, "created_at": "2016-10-18T09:52:05Z", - "audit_type": "ONESHOT" + "audit_type": "ONESHOT", + "status_message": None }, "watcher_object.name": "TerseAuditPayload", "watcher_object.namespace": "watcher", - "watcher_object.version": "1.2" + "watcher_object.version": "1.3" }, "global_efficacy": [], "state": "ONGOING", + "status_message": None, "strategy_uuid": ( "cb3d0b58-4415-4d90-b75b-1e96878730e3"), "strategy": { @@ -591,7 +607,7 @@ class TestActionPlanNotification(base.DbTestCase): }, "watcher_object.name": "ActionPlanCancelPayload", "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1" + "watcher_object.version": "1.2" } }, notification diff --git a/watcher/tests/notifications/test_audit_notification.py b/watcher/tests/notifications/test_audit_notification.py index 6e060655f..bb7fdab3a 100644 --- a/watcher/tests/notifications/test_audit_notification.py +++ b/watcher/tests/notifications/test_audit_notification.py @@ -70,7 +70,7 @@ class TestAuditNotification(base.DbTestCase): self.assertDictEqual( { "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1", + "watcher_object.version": "1.2", "watcher_object.data": { "interval": None, "next_run_time": None, @@ -115,14 +115,16 @@ class TestAuditNotification(base.DbTestCase): "created_at": "2016-10-18T09:52:05Z", "state_update": { "watcher_object.namespace": "watcher", - "watcher_object.version": "1.0", + "watcher_object.version": "1.1", "watcher_object.data": { "old_state": "PENDING", - "state": "ONGOING" + "state": "ONGOING", + "status_message": None }, "watcher_object.name": "AuditStateUpdatePayload" }, - "audit_type": "ONESHOT" + "audit_type": "ONESHOT", + "status_message": None }, "watcher_object.name": "AuditUpdatePayload" }, @@ -132,7 +134,8 @@ class TestAuditNotification(base.DbTestCase): def test_send_audit_update_without_strategy(self): audit = utils.get_test_audit( mock.Mock(), interval=None, state=objects.audit.State.ONGOING, - goal_id=self.goal.id, goal=self.goal) + goal_id=self.goal.id, goal=self.goal, + status_message='Fake message') notifications.audit.send_update( mock.MagicMock(), audit, host='node0', old_state=objects.audit.State.PENDING) @@ -145,7 +148,7 @@ class TestAuditNotification(base.DbTestCase): self.assertDictEqual( { "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1", + "watcher_object.version": "1.2", "watcher_object.data": { "interval": None, "next_run_time": None, @@ -177,14 +180,16 @@ class TestAuditNotification(base.DbTestCase): "created_at": None, "state_update": { "watcher_object.namespace": "watcher", - "watcher_object.version": "1.0", + "watcher_object.version": "1.1", "watcher_object.data": { "old_state": "PENDING", - "state": "ONGOING" + "state": "ONGOING", + "status_message": "Fake message" }, "watcher_object.name": "AuditStateUpdatePayload" }, - "audit_type": "ONESHOT" + "audit_type": "ONESHOT", + "status_message": "Fake message" }, "watcher_object.name": "AuditUpdatePayload" }, @@ -207,7 +212,7 @@ class TestAuditNotification(base.DbTestCase): self.assertDictEqual( { "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1", + "watcher_object.version": "1.2", "watcher_object.data": { "interval": None, "next_run_time": None, @@ -250,7 +255,8 @@ class TestAuditNotification(base.DbTestCase): "state": "PENDING", "updated_at": None, "created_at": None, - "audit_type": "ONESHOT" + "audit_type": "ONESHOT", + "status_message": None }, "watcher_object.name": "AuditCreatePayload" }, @@ -273,7 +279,7 @@ class TestAuditNotification(base.DbTestCase): self.assertDictEqual( { "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1", + "watcher_object.version": "1.2", "watcher_object.data": { "interval": None, "next_run_time": None, @@ -316,7 +322,8 @@ class TestAuditNotification(base.DbTestCase): "state": "DELETED", "updated_at": None, "created_at": "2016-10-18T09:52:05Z", - "audit_type": "ONESHOT" + "audit_type": "ONESHOT", + "status_message": None }, "watcher_object.name": "AuditDeletePayload" }, @@ -386,11 +393,12 @@ class TestAuditNotification(base.DbTestCase): "watcher_object.version": "1.0" }, "updated_at": None, - "uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d" + "uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d", + "status_message": None }, "watcher_object.name": "AuditActionPayload", "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1" + "watcher_object.version": "1.2" } }, notification @@ -473,11 +481,12 @@ class TestAuditNotification(base.DbTestCase): "watcher_object.version": "1.0" }, "updated_at": None, - "uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d" + "uuid": "10a47dd1-4874-4298-91cf-eff046dbdb8d", + "status_message": None }, "watcher_object.name": "AuditActionPayload", "watcher_object.namespace": "watcher", - "watcher_object.version": "1.1" + "watcher_object.version": "1.2" } }, notification diff --git a/watcher/tests/notifications/test_notification.py b/watcher/tests/notifications/test_notification.py index f55a6d478..9b8a93a6f 100644 --- a/watcher/tests/notifications/test_notification.py +++ b/watcher/tests/notifications/test_notification.py @@ -254,44 +254,44 @@ expected_notification_fingerprints = { 'ExceptionNotification': '1.0-9b69de0724fda8310d05e18418178866', 'ExceptionPayload': '1.0-4516ae282a55fe2fd5c754967ee6248b', 'NotificationPublisher': '1.0-bbbc1402fb0e443a3eb227cc52b61545', - 'TerseAuditPayload': '1.2-0fda1751c39f29b539944c2b44690f65', - 'AuditPayload': '1.2-d30cc1639404ed380b0742b781db690e', - 'AuditStateUpdatePayload': '1.0-1a1b606bf14a2c468800c2b010801ce5', + 'TerseAuditPayload': '1.3-f4fa23834af600ae71b15e2eaff41dc4', + 'AuditPayload': '1.3-c6f2aa269a6ea020a0371ad4ac7236bb', + 'AuditStateUpdatePayload': '1.1-74b6a28fb14d1f8e9da6cc8a9033fbaf', 'AuditUpdateNotification': '1.0-9b69de0724fda8310d05e18418178866', - 'AuditUpdatePayload': '1.1-e32c3f69c353d47948afa44359246828', + 'AuditUpdatePayload': '1.2-12970dec38cd622f7bb5670ac1c5dc1f', 'AuditCreateNotification': '1.0-9b69de0724fda8310d05e18418178866', - 'AuditCreatePayload': '1.1-d30cc1639404ed380b0742b781db690e', + 'AuditCreatePayload': '1.2-c6f2aa269a6ea020a0371ad4ac7236bb', 'AuditDeleteNotification': '1.0-9b69de0724fda8310d05e18418178866', - 'AuditDeletePayload': '1.1-d30cc1639404ed380b0742b781db690e', + 'AuditDeletePayload': '1.2-c6f2aa269a6ea020a0371ad4ac7236bb', 'AuditActionNotification': '1.0-9b69de0724fda8310d05e18418178866', - 'AuditActionPayload': '1.1-3d19c75dd9cdf2a833d0367b234e20d2', + 'AuditActionPayload': '1.2-1558683dda8c4d947878cd721db6c50c', 'GoalPayload': '1.0-fa1fecb8b01dd047eef808ded4d50d1a', 'StrategyPayload': '1.0-94f01c137b083ac236ae82573c1fcfc1', - 'ActionPlanActionPayload': '1.1-5be9fa7ca9e544322bdded5593e36edb', + 'ActionPlanActionPayload': '1.2-9c2a2ddf6128b3ea1ad95d2fc965fdd1', 'ActionPlanCreateNotification': '1.0-9b69de0724fda8310d05e18418178866', - 'ActionPlanCreatePayload': '1.1-6a3c3bf1d1f822e33633c49088699d4e', + 'ActionPlanCreatePayload': '1.2-d5a0360b23d976d66bc8d572a54177f2', 'ActionPlanDeleteNotification': '1.0-9b69de0724fda8310d05e18418178866', - 'ActionPlanDeletePayload': '1.1-6a3c3bf1d1f822e33633c49088699d4e', - 'ActionPlanPayload': '1.1-6a3c3bf1d1f822e33633c49088699d4e', - 'ActionPlanStateUpdatePayload': '1.0-1a1b606bf14a2c468800c2b010801ce5', + 'ActionPlanDeletePayload': '1.2-d5a0360b23d976d66bc8d572a54177f2', + 'ActionPlanPayload': '1.2-d5a0360b23d976d66bc8d572a54177f2', + 'ActionPlanStateUpdatePayload': '1.1-74b6a28fb14d1f8e9da6cc8a9033fbaf', 'ActionPlanUpdateNotification': '1.0-9b69de0724fda8310d05e18418178866', - 'ActionPlanUpdatePayload': '1.1-4ecd6571784cec2656725003ce431fdd', + 'ActionPlanUpdatePayload': '1.2-29d6519e04e7fa041b6b732bc2a8638a', 'ActionPlanActionNotification': '1.0-9b69de0724fda8310d05e18418178866', 'ActionPlanCancelNotification': '1.0-9b69de0724fda8310d05e18418178866', 'ActionCancelNotification': '1.0-9b69de0724fda8310d05e18418178866', 'ActionCreateNotification': '1.0-9b69de0724fda8310d05e18418178866', - 'ActionCreatePayload': '1.0-519b93b7450319d8928b4b6e6362df31', + 'ActionCreatePayload': '1.1-2ac8ce2b37757c7bbb5c794f2021d4ce', 'ActionDeleteNotification': '1.0-9b69de0724fda8310d05e18418178866', - 'ActionDeletePayload': '1.0-519b93b7450319d8928b4b6e6362df31', + 'ActionDeletePayload': '1.1-2ac8ce2b37757c7bbb5c794f2021d4ce', 'ActionExecutionNotification': '1.0-9b69de0724fda8310d05e18418178866', - 'ActionExecutionPayload': '1.0-bff9f820a2abf7bb6d7027b7450157df', - 'ActionPayload': '1.0-519b93b7450319d8928b4b6e6362df31', - 'ActionStateUpdatePayload': '1.0-1a1b606bf14a2c468800c2b010801ce5', + 'ActionExecutionPayload': '1.1-b1932d855cc2081d45de50e9705c77fd', + 'ActionPayload': '1.1-2ac8ce2b37757c7bbb5c794f2021d4ce', + 'ActionStateUpdatePayload': '1.1-74b6a28fb14d1f8e9da6cc8a9033fbaf', 'ActionUpdateNotification': '1.0-9b69de0724fda8310d05e18418178866', - 'ActionUpdatePayload': '1.0-03306c7e7f4d49ac328c261eff6b30b8', - 'ActionPlanCancelPayload': '1.1-5be9fa7ca9e544322bdded5593e36edb', - 'ActionCancelPayload': '1.0-bff9f820a2abf7bb6d7027b7450157df', - 'TerseActionPlanPayload': '1.1-63008f013817407df9194c2a59fda6b0', + 'ActionUpdatePayload': '1.1-97da2932212857c4340e9d114dfd8985', + 'ActionPlanCancelPayload': '1.2-9c2a2ddf6128b3ea1ad95d2fc965fdd1', + 'ActionCancelPayload': '1.1-b1932d855cc2081d45de50e9705c77fd', + 'TerseActionPlanPayload': '1.2-4c63201dc30b407be0e39be2aecc3f2b', 'ServiceUpdateNotification': '1.0-9b69de0724fda8310d05e18418178866', 'ServicePayload': '1.0-9c5a9bc51e6606e0ec3cf95baf698f4f', 'ServiceStatusUpdatePayload': '1.0-1a1b606bf14a2c468800c2b010801ce5', diff --git a/watcher/tests/objects/test_action.py b/watcher/tests/objects/test_action.py index 3ed8c3d44..3db8f5aca 100644 --- a/watcher/tests/objects/test_action.py +++ b/watcher/tests/objects/test_action.py @@ -172,7 +172,8 @@ class TestCreateDeleteActionObject(base.DbTestCase): self.fake_audit = utils.create_test_audit() self.fake_action_plan = utils.create_test_action_plan() self.fake_action = utils.get_test_action( - created_at=timeutils.utcnow()) + created_at=timeutils.utcnow(), + status_message="Fake status message") @mock.patch.object(db_api.Connection, 'create_action') def test_create(self, mock_create_action): @@ -184,6 +185,7 @@ class TestCreateDeleteActionObject(base.DbTestCase): tzinfo=datetime.timezone.utc) mock_create_action.assert_called_once_with(expected_action) self.assertEqual(self.context, action._context) + self.assertEqual("Fake status message", action.status_message) @mock.patch.object(notifications.action, 'send_delete') @mock.patch.object(notifications.action, 'send_update') diff --git a/watcher/tests/objects/test_objects.py b/watcher/tests/objects/test_objects.py index a2511abab..c5230a9e7 100644 --- a/watcher/tests/objects/test_objects.py +++ b/watcher/tests/objects/test_objects.py @@ -410,9 +410,9 @@ expected_object_fingerprints = { 'Goal': '1.0-93881622db05e7b67a65ca885b4a022e', 'Strategy': '1.1-73f164491bdd4c034f48083a51bdeb7b', 'AuditTemplate': '1.1-b291973ffc5efa2c61b24fe34fdccc0b', - 'Audit': '1.7-19bc991c0b048263df021a36c8624f4d', - 'ActionPlan': '2.2-3331270cb3666c93408934826d03c08d', - 'Action': '2.0-1dd4959a7e7ac30c62ef170fe08dd935', + 'Audit': '1.8-9cadb11a1fbe7200fb32891b37672a62', + 'ActionPlan': '2.3-dad26bdb60307f461572739463108a59', + 'Action': '2.1-71073c74c2ecc3a3d7c7103d0072d366', 'EfficacyIndicator': '1.0-655b71234a82bc7478aff964639c4bb0', 'ScoringEngine': '1.0-4abbe833544000728e17bd9e83f97576', 'Service': '1.0-4b35b99ada9677a882c9de2b30212f35',