Fix INF-383 refactor to enrich alarmEventRecord with extension field
[pti/o2.git] / o2ims / adapter / orm.py
1 # Copyright (C) 2021 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 typing_extensions import Required
16 from retry import retry
17 from sqlalchemy import (
18     Table,
19     MetaData,
20     Column,
21     Integer,
22     String,
23     Text,
24     Enum,
25     # Date,
26     DateTime,
27     ForeignKey,
28     # Boolean,
29     # engine,
30     # event,
31     exc,
32 )
33
34 from sqlalchemy.orm import mapper, relationship, backref
35 # from sqlalchemy.sql.sqltypes import Integer
36
37 from o2ims.domain import ocloud as ocloudModel
38 from o2ims.domain import subscription_obj as subModel
39 from o2ims.domain import alarm_obj as alarmModel
40 from o2ims.domain.resource_type import ResourceTypeEnum, ResourceKindEnum
41 # from o2ims.domain.alarm_obj import AlarmLastChangeEnum, PerceivedSeverityEnum
42
43 from o2common.helper import o2logging
44 logger = o2logging.get_logger(__name__)
45
46 metadata = MetaData()
47
48 ocloud = Table(
49     "ocloud",
50     metadata,
51     Column("updatetime", DateTime),
52     Column("createtime", DateTime),
53     Column("hash", String(255)),
54     Column("version_number", Integer),
55
56     Column("oCloudId", String(255), primary_key=True),
57     Column("globalCloudId", String(255)),
58     Column("name", String(255)),
59     Column("description", String(255)),
60     Column("serviceUri", String(255)),
61     Column("smoRegistrationService", String(255))
62     # Column("extensions", String(1024))
63 )
64
65 resourcetype = Table(
66     "resourceType",
67     metadata,
68     Column("updatetime", DateTime),
69     Column("createtime", DateTime),
70     Column("hash", String(255)),
71     Column("version_number", Integer),
72
73     Column("resourceTypeId", String(255), primary_key=True),
74     Column("resourceTypeEnum", Enum(
75         ResourceTypeEnum, native_enum=False), nullable=False),
76     Column("name", String(255)),
77     Column("description", String(255)),
78     Column("vendor", String(255)),
79     Column("model", String(255)),
80     Column("version", String(255)),
81     Column("resourceKind", Enum(ResourceKindEnum)),
82     Column("resourceClass", Enum(ResourceTypeEnum)),
83     # Column("extensions", String(1024))
84
85     Column("alarmDictionaryId", ForeignKey("alarmDictionary.id"))
86 )
87
88 resourcepool = Table(
89     "resourcePool",
90     metadata,
91     Column("updatetime", DateTime),
92     Column("createtime", DateTime),
93     Column("hash", String(255)),
94     Column("version_number", Integer),
95
96     Column("resourcePoolId", String(255), primary_key=True),
97     Column("oCloudId", ForeignKey("ocloud.oCloudId")),
98     Column("globalLocationId", String(255)),
99     Column("name", String(255)),
100     Column("location", String(255)),
101     Column("description", String(255)),
102     # Column("resources", String(1024))
103     # Column("extensions", String(1024))
104 )
105
106 resource = Table(
107     "resource",
108     metadata,
109     Column("updatetime", DateTime),
110     Column("createtime", DateTime),
111     Column("hash", String(255)),
112     Column("version_number", Integer),
113
114     Column("resourceId", String(255), primary_key=True),
115     Column("resourceTypeId", ForeignKey("resourceType.resourceTypeId")),
116     Column("resourcePoolId", ForeignKey("resourcePool.resourcePoolId")),
117     Column("globalAssetId", String(255)),
118     Column("parentId", String(255)),
119     Column("description", String()),
120     Column("elements", Text()),
121     Column("extensions", String())
122 )
123
124 deploymentmanager = Table(
125     "deploymentManager",
126     metadata,
127     Column("updatetime", DateTime),
128     Column("createtime", DateTime),
129     Column("hash", String(255)),
130     Column("version_number", Integer),
131
132     Column("deploymentManagerId", String(255), primary_key=True),
133     Column("oCloudId", ForeignKey("ocloud.oCloudId")),
134     Column("name", String(255)),
135     Column("description", String(255)),
136     Column("serviceUri", String(255)),
137     Column("supportedLocations", String(255)),
138     Column("capabilities", String(255)),
139     Column("capacity", String(255)),
140     Column("profile", Text())
141     # Column("extensions", String(1024))
142 )
143
144 subscription = Table(
145     "subscription",
146     metadata,
147     Column("updatetime", DateTime),
148     Column("createtime", DateTime),
149     Column("hash", String(255)),
150     Column("version_number", Integer),
151
152     Column("subscriptionId", String(255), primary_key=True),
153     Column("callback", String(255)),
154     Column("consumerSubscriptionId", String(255)),
155     Column("filter", String(255)),
156 )
157
158 alarm_definition = Table(
159     "alarmDefinition",
160     metadata,
161     Column("updatetime", DateTime),
162     Column("createtime", DateTime),
163
164     Column("alarmDefinitionId", String(255), primary_key=True),
165     Column("alarmName", String(255), unique=True),
166     Column("alarmLastChange", String(255)),
167     Column("alarmChangeType", String(255)),
168     Column("alarmDescription", String(255)),
169     Column("proposedRepairActions", String(1024)),
170     Column("clearingType", String(255)),
171     Column("managementInterfaceId", String(255)),
172     Column("pkNotificationField", String(255))
173 )
174
175 alarm_dictionary = Table(
176     "alarmDictionary",
177     metadata,
178     Column("updatetime", DateTime),
179     Column("createtime", DateTime),
180
181     Column("id", String(255), primary_key=True),
182     Column("entityType", String(255), unique=True),
183     Column("alarmDictionaryVersion", String(255)),
184     Column("alarmDictionarySchemaVersion", String(255)),
185     Column("vendor", String(255)),
186     Column("managementInterfaceId", String(255)),
187     Column("pkNotificationField", String(255))
188
189     # Column("resourceTypeId", ForeignKey("resourceType.resourceTypeId"))
190 )
191
192 association_table1 = Table(
193     'associationAlarmDictAndAlarmDef',
194     metadata,
195     Column("alarmDictionaryId", ForeignKey(
196         'alarmDictionary.id', ondelete='cascade')),
197     Column("alarmDefinitionId", ForeignKey(
198         'alarmDefinition.alarmDefinitionId'))
199 )
200
201 alarm_event_record = Table(
202     "alarmEventRecord",
203     metadata,
204     Column("updatetime", DateTime),
205     Column("createtime", DateTime),
206     Column("hash", String(255)),
207
208     Column("alarmEventRecordId", String(255), primary_key=True),
209     Column("resourceTypeId", ForeignKey("resourceType.resourceTypeId")),
210     Column("resourceId", ForeignKey("resource.resourceId")),
211     Column("alarmDefinitionId", ForeignKey(
212         "alarmDefinition.alarmDefinitionId")),
213     Column("probableCauseId", String(255)),
214     Column("perceivedSeverity", Integer),
215     Column("alarmRaisedTime", String(255)),
216     Column("alarmChangedTime", String(255)),
217     Column("alarmAcknowledgeTime", String(255)),
218     Column("alarmAcknowledged", String(255)),
219     Column("extensions", String())
220 )
221
222 alarm_probable_cause = Table(
223     "probableCause",
224     metadata,
225     Column("updatetime", DateTime),
226     Column("createtime", DateTime),
227     Column("hash", String(255)),
228
229     Column("probableCauseId", String(255), primary_key=True),
230     Column("name", String(255)),
231     Column("description", String(255)),
232 )
233
234 alarm_subscription = Table(
235     "alarmSubscription",
236     metadata,
237     Column("updatetime", DateTime),
238     Column("createtime", DateTime),
239
240     Column("alarmSubscriptionId", String(255), primary_key=True),
241     Column("callback", String(255)),
242     Column("consumerSubscriptionId", String(255)),
243     Column("filter", String(255)),
244 )
245
246
247 @retry((exc.IntegrityError), tries=3, delay=2)
248 def wait_for_metadata_ready(engine):
249     # wait for mapper ready
250     metadata.create_all(engine, checkfirst=True)
251     logger.info("metadata is ready")
252
253
254 def start_o2ims_mappers(engine=None):
255     logger.info("Starting O2 IMS mappers")
256
257     # IMS Infrastruture Monitoring Mappering
258     mapper(alarmModel.AlarmEventRecord, alarm_event_record)
259     alarmdefinition_mapper = mapper(
260         alarmModel.AlarmDefinition, alarm_definition)
261     mapper(alarmModel.ProbableCause, alarm_probable_cause)
262     mapper(alarmModel.AlarmSubscription, alarm_subscription)
263     alarm_dictionary_mapper = mapper(
264         alarmModel.AlarmDictionary, alarm_dictionary,
265         properties={
266             "alarmDefinition": relationship(alarmdefinition_mapper,
267                                             cascade='all,delete-orphan',
268                                             secondary=association_table1,
269                                             single_parent=True,
270                                             backref='alarmDictionaries')
271         }
272     )
273
274     # IMS Infrastructure Inventory Mappering
275     dm_mapper = mapper(ocloudModel.DeploymentManager, deploymentmanager)
276     resourcepool_mapper = mapper(ocloudModel.ResourcePool, resourcepool)
277     resourcetype_mapper = mapper(
278         ocloudModel.ResourceType, resourcetype,
279         properties={
280             #     "alarmDictionary": relationship(alarmModel.AlarmDictionary,
281             #                                     uselist=False)
282             "alarmDictionary": relationship(alarm_dictionary_mapper,
283                                             backref=backref(
284                                                 'resourceType', uselist=False))
285
286         }
287     )
288     mapper(
289         ocloudModel.Ocloud,
290         ocloud,
291         properties={
292             "deploymentManagers": relationship(dm_mapper),
293             # "resourceTypes": relationship(resourcetype_mapper),
294             "resourcePools": relationship(resourcepool_mapper)
295         })
296     mapper(
297         ocloudModel.Resource,
298         resource,
299         properties={
300             "resourceTypes": relationship(resourcetype_mapper),
301             "resourcePools": relationship(resourcepool_mapper)
302         }
303     )
304     mapper(subModel.Subscription, subscription)
305
306     if engine is not None:
307         wait_for_metadata_ready(engine)