Merge "Add status_message to objects and notifications"

This commit is contained in:
Zuul
2025-08-21 14:59:53 +00:00
committed by Gerrit Code Review
42 changed files with 336 additions and 169 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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": {

View File

@@ -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"

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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",

View File

@@ -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": {

View File

@@ -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"

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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",

View File

@@ -9,6 +9,7 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": null,

View File

@@ -9,6 +9,7 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": {

View File

@@ -9,6 +9,7 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": null,

View File

@@ -9,6 +9,7 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": null,

View File

@@ -9,6 +9,7 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": {

View File

@@ -9,6 +9,7 @@
"para1": 3.2
},
"state": "ONGOING",
"status_message": null,
"updated_at": null,
"deleted_at": null,
"fault": null,

View File

@@ -70,6 +70,7 @@
"interval": null,
"updated_at": null,
"state": "ONGOING",
"status_message": null,
"audit_type": "ONESHOT"
},
"watcher_object.namespace": "watcher",

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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),
}

View File

@@ -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 = {

View File

@@ -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 = {

View File

@@ -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)

View File

@@ -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

View File

@@ -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]

View File

@@ -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
}
}
},

View File

@@ -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

View File

@@ -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

View File

@@ -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',

View File

@@ -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')

View File

@@ -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',