Merge "Fix INF-344 resourceType fields on alarmDictionary"
[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("name", String(255)),
118     Column("globalAssetId", String(255)),
119     Column("parentId", String(255)),
120     Column("description", String()),
121     Column("elements", Text()),
122     Column("extensions", String())
123 )
124
125 deploymentmanager = Table(
126     "deploymentManager",
127     metadata,
128     Column("updatetime", DateTime),
129     Column("createtime", DateTime),
130     Column("hash", String(255)),
131     Column("version_number", Integer),
132
133     Column("deploymentManagerId", String(255), primary_key=True),
134     Column("oCloudId", ForeignKey("ocloud.oCloudId")),
135     Column("name", String(255)),
136     Column("description", String(255)),
137     Column("serviceUri", String(255)),
138     Column("supportedLocations", String(255)),
139     Column("capabilities", String(255)),
140     Column("capacity", String(255)),
141     Column("profile", Text())
142     # Column("extensions", String(1024))
143 )
144
145 subscription = Table(
146     "subscription",
147     metadata,
148     Column("updatetime", DateTime),
149     Column("createtime", DateTime),
150     Column("hash", String(255)),
151     Column("version_number", Integer),
152
153     Column("subscriptionId", String(255), primary_key=True),
154     Column("callback", String(255)),
155     Column("consumerSubscriptionId", String(255)),
156     Column("filter", String(255)),
157 )
158
159 alarm_definition = Table(
160     "alarmDefinition",
161     metadata,
162     Column("updatetime", DateTime),
163     Column("createtime", DateTime),
164
165     Column("alarmDefinitionId", String(255), primary_key=True),
166     Column("alarmName", String(255), unique=True),
167     Column("alarmLastChange", String(255)),
168     Column("alarmChangeType", String(255)),
169     Column("alarmDescription", String(255)),
170     Column("proposedRepairActions", String(1024)),
171     Column("clearingType", String(255)),
172     Column("managementInterfaceId", String(255)),
173     Column("pkNotificationField", String(255))
174 )
175
176 alarm_dictionary = Table(
177     "alarmDictionary",
178     metadata,
179     Column("updatetime", DateTime),
180     Column("createtime", DateTime),
181
182     Column("id", String(255), primary_key=True),
183     Column("entityType", String(255), unique=True),
184     Column("alarmDictionaryVersion", String(255)),
185     Column("alarmDictionarySchemaVersion", String(255)),
186     Column("vendor", String(255)),
187     Column("managementInterfaceId", String(255)),
188     Column("pkNotificationField", String(255))
189
190     # Column("resourceTypeId", ForeignKey("resourceType.resourceTypeId"))
191 )
192
193 association_table1 = Table(
194     'associationAlarmDictAndAlarmDef',
195     metadata,
196     Column("alarmDictionaryId", ForeignKey(
197         'alarmDictionary.id', ondelete='cascade')),
198     Column("alarmDefinitionId", ForeignKey(
199         'alarmDefinition.alarmDefinitionId'))
200 )
201
202 alarm_event_record = Table(
203     "alarmEventRecord",
204     metadata,
205     Column("updatetime", DateTime),
206     Column("createtime", DateTime),
207     Column("hash", String(255)),
208
209     Column("alarmEventRecordId", String(255), primary_key=True),
210     Column("resourceTypeId", ForeignKey("resourceType.resourceTypeId")),
211     Column("resourceId", ForeignKey("resource.resourceId")),
212     Column("alarmDefinitionId", ForeignKey(
213         "alarmDefinition.alarmDefinitionId")),
214     Column("probableCauseId", String(255)),
215     Column("perceivedSeverity", Integer),
216     Column("alarmRaisedTime", String(255)),
217     Column("alarmChangedTime", String(255)),
218     Column("alarmAcknowledgeTime", String(255)),
219     Column("alarmAcknowledged", String(255)),
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)