Fix INF-378 inventory subscription filter not take effect as expected
[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 )
220
221 alarm_probable_cause = Table(
222     "probableCause",
223     metadata,
224     Column("updatetime", DateTime),
225     Column("createtime", DateTime),
226     Column("hash", String(255)),
227
228     Column("probableCauseId", String(255), primary_key=True),
229     Column("name", String(255)),
230     Column("description", String(255)),
231 )
232
233 alarm_subscription = Table(
234     "alarmSubscription",
235     metadata,
236     Column("updatetime", DateTime),
237     Column("createtime", DateTime),
238
239     Column("alarmSubscriptionId", String(255), primary_key=True),
240     Column("callback", String(255)),
241     Column("consumerSubscriptionId", String(255)),
242     Column("filter", String(255)),
243 )
244
245
246 @retry((exc.IntegrityError), tries=3, delay=2)
247 def wait_for_metadata_ready(engine):
248     # wait for mapper ready
249     metadata.create_all(engine, checkfirst=True)
250     logger.info("metadata is ready")
251
252
253 def start_o2ims_mappers(engine=None):
254     logger.info("Starting O2 IMS mappers")
255
256     # IMS Infrastruture Monitoring Mappering
257     mapper(alarmModel.AlarmEventRecord, alarm_event_record)
258     alarmdefinition_mapper = mapper(
259         alarmModel.AlarmDefinition, alarm_definition)
260     mapper(alarmModel.ProbableCause, alarm_probable_cause)
261     mapper(alarmModel.AlarmSubscription, alarm_subscription)
262     alarm_dictionary_mapper = mapper(
263         alarmModel.AlarmDictionary, alarm_dictionary,
264         properties={
265             "alarmDefinition": relationship(alarmdefinition_mapper,
266                                             cascade='all,delete-orphan',
267                                             secondary=association_table1,
268                                             single_parent=True,
269                                             backref='alarmDictionaries')
270         }
271     )
272
273     # IMS Infrastructure Inventory Mappering
274     dm_mapper = mapper(ocloudModel.DeploymentManager, deploymentmanager)
275     resourcepool_mapper = mapper(ocloudModel.ResourcePool, resourcepool)
276     resourcetype_mapper = mapper(
277         ocloudModel.ResourceType, resourcetype,
278         properties={
279             #     "alarmDictionary": relationship(alarmModel.AlarmDictionary,
280             #                                     uselist=False)
281             "alarmDictionary": relationship(alarm_dictionary_mapper,
282                                             backref=backref(
283                                                 'resourceType', uselist=False))
284
285         }
286     )
287     mapper(
288         ocloudModel.Ocloud,
289         ocloud,
290         properties={
291             "deploymentManagers": relationship(dm_mapper),
292             # "resourceTypes": relationship(resourcetype_mapper),
293             "resourcePools": relationship(resourcepool_mapper)
294         })
295     mapper(
296         ocloudModel.Resource,
297         resource,
298         properties={
299             "resourceTypes": relationship(resourcetype_mapper),
300             "resourcePools": relationship(resourcepool_mapper)
301         }
302     )
303     mapper(subModel.Subscription, subscription)
304
305     if engine is not None:
306         wait_for_metadata_ready(engine)