Fix INF-383 refactor to enrich alarmEventRecord with extension field
[pti/o2.git] / o2ims / domain / alarm_obj.py
1 # Copyright (C) 2022 Wind River Systems, Inc.
2 #
3 #  Licensed under the Apache License, Version 2.0 (the "License");
4 #  you may not use this file except in compliance with the License.
5 #  You may obtain a copy of the License at
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
9 #  Unless required by applicable law or agreed to in writing, software
10 #  distributed under the License is distributed on an "AS IS" BASIS,
11 #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 #  See the License for the specific language governing permissions and
13 #  limitations under the License.
14
15 from __future__ import annotations
16 from enum import Enum
17 import json
18 import datetime
19
20 from o2common.domain.base import AgRoot, Serializer
21
22 from o2common.helper import o2logging
23 logger = o2logging.get_logger(__name__)
24
25
26 class FaultGenericModel(AgRoot):
27     def __init__(self, type: str,
28                  api_response: dict = None, content_hash=None) -> None:
29         super().__init__()
30         if api_response:
31             self.id = str(api_response.uuid)
32             self.name = self.id
33             self.alarm_type = api_response.alarm_type
34             self.alarm_def_name = api_response.alarm_id
35             self.alarm_def_id = api_response.alarm_def_id
36             self.probable_cause_id = api_response.probable_cause_id
37             self.status = api_response.state
38             # TODO: time less than second
39             self.timestamp = datetime.datetime.strptime(
40                 api_response.timestamp.split('.')[0], "%Y-%m-%dT%H:%M:%S") \
41                 if api_response.timestamp else None
42
43             # if hasattr(api_response, 'alarm_id'):
44             #     self.alarm_id = api_response.alarm_id
45             # elif hasattr(api_response, 'event_log_id'):
46             #     self.alarm_id = api_response.event_log_id
47
48             self.hash = content_hash
49             if not self.hash:
50                 if hasattr(api_response, 'filtered'):
51                     self.filtered = api_response.filtered
52                     self.hash = str(hash((self.id, str(self.filtered))))
53                 else:
54                     self.hash = str(hash((self.id, self.updatetime)))
55             self.content = json.dumps(api_response.to_dict())
56             if EventTypeEnum.ALARM == type:
57                 pass
58
59     def is_outdated(self, newmodel) -> bool:
60         # return self.updatetime < newmodel.updatetime
61         # logger.warning("hash1: " + self.hash + " vs hash2: " + newmodel.hash)
62         return self.hash != newmodel.hash
63
64     def update_by(self, newmodel) -> None:
65         if self.id != newmodel.id:
66             pass
67             # raise MismatchedModel("Mismatched model")
68         self.name = newmodel.name
69         self.createtime = newmodel.createtime
70         self.updatetime = newmodel.updatetime
71         self.content = newmodel.content
72
73
74 class EventTypeEnum(Enum):
75     ALARM = 'alarm'
76     EVENT = 'event'
77
78
79 class PerceivedSeverityEnum(str, Enum):
80     CRITICAL = 0
81     MAJOR = 1
82     MINOR = 2
83     WARNING = 3
84     INDETERMINATE = 4
85     CLEARED = 5
86
87
88 class AlarmEventRecord(AgRoot, Serializer):
89     def __init__(self, id: str, res_type_id: str, res_id: str,
90                  alarm_def_id: str, probable_cause_id: str,
91                  raised_time: str,
92                  perc_severity: PerceivedSeverityEnum =
93                  PerceivedSeverityEnum.WARNING
94                  ) -> None:
95         super().__init__()
96         self.alarmEventRecordId = id
97         self.resourceTypeId = res_type_id
98         self.resourceId = res_id
99         self.alarmDefinitionId = alarm_def_id
100         self.probableCauseId = probable_cause_id
101         self.perceivedSeverity = perc_severity
102         self.alarmRaisedTime = raised_time
103         self.alarmChangedTime = ''
104         self.alarmAcknowledgeTime = ''
105         self.alarmAcknowledged = False
106         self.extensions = ''
107
108
109 class ProbableCause(AgRoot, Serializer):
110     def __init__(self, id: str, name: str, desc: str = '') -> None:
111         super().__init__()
112         self.probableCauseId = id
113         self.name = name
114         self.description = desc
115
116
117 class AlarmChangeTypeEnum(str, Enum):
118     ADDED = 'ADDED'
119     DELETED = 'DELETED'
120     MODIFYED = 'MODIFYED'
121
122
123 class ClearingTypeEnum(str, Enum):
124     AUTOMATIC = 'AUTOMATIC'
125     MANUAL = 'MANUAL'
126
127
128 class AlarmDefinition(AgRoot, Serializer):
129     def __init__(self, id: str, name: str, change_type: AlarmChangeTypeEnum,
130                  desc: str, prop_action: str, clearing_type: ClearingTypeEnum,
131                  pk_noti_field: str) -> None:
132         super().__init__()
133         self.alarmDefinitionId = id
134         self.alarmName = name
135         self.alarmLastChange = '0.1'
136         self.alarmChangeType = change_type
137         self.alarmDescription = desc
138         self.proposedRepairActions = prop_action
139         self.clearingType = clearing_type
140         self.managementInterfaceId = "O2IMS"
141         self.pkNotificationField = pk_noti_field
142         self.alarmAdditionalFields = ""
143
144
145 class AlarmDictionary(AgRoot, Serializer):
146     def __init__(self, id: str) -> None:
147         super().__init__()
148         self.id = id
149         self.alarmDictionaryVersion = ""
150         self.alarmDictionarySchemaVersion = ""
151         self.entityType = ""
152         self.vendor = ""
153         self.managementInterfaceId = "O2IMS"
154         self.pkNotificationField = ""
155         self.alarmDefinition = []
156
157     def serialize(self):
158         d = Serializer.serialize(self)
159         if 'alarmDefinition' in d and len(d['alarmDefinition']) > 0:
160             d['alarmDefinition'] = self.serialize_list(d['alarmDefinition'])
161         return d
162
163
164 class AlarmNotificationEventEnum(str, Enum):
165     NEW = 0
166     CHANGE = 1
167     CLEAR = 2
168     ACKNOWLEDGE = 3
169
170
171 class AlarmEvent2SMO(Serializer):
172     def __init__(self, eventtype: AlarmNotificationEventEnum,
173                  id: str, ref: str, updatetime: str) -> None:
174         self.notificationEventType = eventtype
175         self.objectRef = ref
176         self.id = id
177         self.updatetime = updatetime
178
179
180 class AlarmSubscription(AgRoot, Serializer):
181     def __init__(self, id: str, callback: str, consumersubid: str = '',
182                  filter: str = '') -> None:
183         super().__init__()
184         self.alarmSubscriptionId = id
185         self.version_number = 0
186         self.callback = callback
187         self.consumerSubscriptionId = consumersubid
188         self.filter = filter
189
190
191 class AlarmEventNotification(AgRoot, Serializer):
192     def __init__(self, alarm: AlarmEventRecord, to_smo: AlarmEvent2SMO,
193                  consumersubid: str) -> None:
194         super().__init__()
195         self.globalCloudId = ''
196         self.consumerSubscriptionId = consumersubid
197         self._convert_params(alarm, to_smo)
198
199     def _convert_params(self, alarm: AlarmEventRecord, to_smo: AlarmEvent2SMO):
200         self.notificationEventType = to_smo.notificationEventType
201         self.objectRef = to_smo.objectRef
202
203         self.alarmEventRecordId = alarm.alarmEventRecordId
204         self.resourceTypeId = alarm.resourceTypeId
205         self.resourceId = alarm.resourceId
206         self.alarmDefinitionId = alarm.alarmDefinitionId
207         self.probableCauseId = alarm.probableCauseId
208         self.perceivedSeverity = alarm.perceivedSeverity
209         self.alarmRaisedTime = alarm.alarmRaisedTime
210         self.alarmChangedTime = alarm.alarmChangedTime
211         self.alarmAcknowledgeTime = alarm.alarmAcknowledgeTime
212         self.alarmAcknowledged = alarm.alarmAcknowledged
213         self.extensions = alarm.extensions