4775f29dd5941e807273858ba7916213920666ab
[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
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 configuration_obj as confModel
40 from o2ims.domain import alarm_obj as alarmModel
41 from o2ims.domain.resource_type import ResourceTypeEnum
42 # from o2ims.domain.alarm_obj import AlarmLastChangeEnum, PerceivedSeverityEnum
43
44 from o2common.helper import o2logging
45 logger = o2logging.get_logger(__name__)
46
47 metadata = MetaData()
48
49 ocloud = Table(
50     "ocloud",
51     metadata,
52     Column("updatetime", DateTime),
53     Column("createtime", DateTime),
54     Column("hash", String(255)),
55     Column("version_number", Integer),
56
57     Column("oCloudId", String(255), primary_key=True),
58     Column("globalcloudId", String(255)),
59     Column("name", String(255)),
60     Column("description", String(255)),
61     Column("infrastructureManagementServiceEndpoint", 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
72     Column("resourceTypeId", String(255), primary_key=True),
73     Column("resourceTypeEnum", Enum(
74         ResourceTypeEnum, native_enum=False), nullable=False),
75     Column("oCloudId", ForeignKey("ocloud.oCloudId")),
76     Column("name", String(255)),
77     Column("vendor", String(255)),
78     Column("model", String(255)),
79     Column("version", String(255)),
80     Column("description", String(255)),
81     # Column("extensions", String(1024))
82 )
83
84 resourcepool = Table(
85     "resourcepool",
86     metadata,
87     Column("updatetime", DateTime),
88     Column("createtime", DateTime),
89     Column("hash", String(255)),
90     Column("version_number", Integer),
91
92     Column("resourcePoolId", String(255), primary_key=True),
93     Column("oCloudId", ForeignKey("ocloud.oCloudId")),
94     Column("globalLocationId", String(255)),
95     Column("name", String(255)),
96     Column("location", String(255)),
97     Column("description", String(255)),
98     # Column("resources", String(1024))
99     # Column("extensions", String(1024))
100 )
101
102 resource = Table(
103     "resource",
104     metadata,
105     Column("updatetime", DateTime),
106     Column("createtime", DateTime),
107     Column("hash", String(255)),
108     Column("version_number", Integer),
109
110     Column("resourceId", String(255), primary_key=True),
111     Column("resourceTypeId", ForeignKey("resourcetype.resourceTypeId")),
112     Column("resourcePoolId", ForeignKey("resourcepool.resourcePoolId")),
113     Column("name", String(255)),
114     # Column("globalAssetId", String(255)),
115     Column("parentId", String(255)),
116     Column("description", String(255)),
117     Column("elements", Text())
118     # Column("extensions", String(1024))
119 )
120
121 deploymentmanager = Table(
122     "deploymentmanager",
123     metadata,
124     Column("updatetime", DateTime),
125     Column("createtime", DateTime),
126     Column("hash", String(255)),
127     Column("version_number", Integer),
128
129     Column("deploymentManagerId", String(255), primary_key=True),
130     Column("oCloudId", ForeignKey("ocloud.oCloudId")),
131     Column("name", String(255)),
132     Column("description", String(255)),
133     Column("deploymentManagementServiceEndpoint", String(255)),
134     Column("supportedLocations", String(255)),
135     Column("capabilities", String(255)),
136     Column("capacity", String(255)),
137     Column("profile", Text())
138     # Column("extensions", String(1024))
139 )
140
141 subscription = Table(
142     "subscription",
143     metadata,
144     Column("updatetime", DateTime),
145     Column("createtime", DateTime),
146     Column("hash", String(255)),
147     Column("version_number", Integer),
148
149     Column("subscriptionId", String(255), primary_key=True),
150     Column("callback", String(255)),
151     Column("consumerSubscriptionId", String(255)),
152     Column("filter", String(255)),
153 )
154
155 configuration = Table(
156     "configuration",
157     metadata,
158     Column("updatetime", DateTime),
159     Column("createtime", DateTime),
160
161     Column("configurationId", String(255), primary_key=True),
162     Column("conftype", String(255)),
163     Column("callback", String(255)),
164     Column("status", String(255)),
165     Column("comments", String(255)),
166 )
167
168 alarm_definition = Table(
169     "alarmDefinition",
170     metadata,
171     Column("updatetime", DateTime),
172     Column("createtime", DateTime),
173
174     Column("alarmDefinitionId", String(255), primary_key=True),
175     Column("alarmName", String(255), unique=True),
176     Column("alarmLastChange", String(255)),
177     Column("alarmDescription", String(255)),
178     Column("proposeRepairActions", String(255)),
179     Column("clearingType", String(255)),
180     Column("managementInterfaceId", String(255)),
181     Column("pkNotificationField", String(255))
182 )
183
184 alarm_event_record = Table(
185     "alarmEventRecord",
186     metadata,
187     Column("updatetime", DateTime),
188     Column("createtime", DateTime),
189     Column("hash", String(255)),
190
191     Column("alarmEventRecordId", String(255), primary_key=True),
192     Column("resourceTypeId", ForeignKey("resourcetype.resourceTypeId")),
193     Column("resourceId", ForeignKey("resource.resourceId")),
194     Column("alarmDefinitionId", ForeignKey(
195         "alarmDefinition.alarmDefinitionId")),
196     Column("probableCauseId", String(255)),
197     Column("perceivedSeverity", Integer),
198     Column("alarmRaisedTime", String(255)),
199     Column("alarmChangedTime", String(255)),
200     Column("alarmAcknowledgeTime", String(255)),
201     Column("alarmAcknowledged", String(255)),
202 )
203
204 alarm_probable_cause = Table(
205     "probableCause",
206     metadata,
207     Column("updatetime", DateTime),
208     Column("createtime", DateTime),
209     Column("hash", String(255)),
210
211     Column("probableCauseId", String(255), primary_key=True),
212     Column("name", String(255)),
213     Column("description", String(255)),
214 )
215
216 alarm_subscription = Table(
217     "alarmSubscription",
218     metadata,
219     Column("updatetime", DateTime),
220     Column("createtime", DateTime),
221
222     Column("alarmSubscriptionId", String(255), primary_key=True),
223     Column("callback", String(255)),
224     Column("consumerSubscriptionId", String(255)),
225     Column("filter", String(255)),
226 )
227
228
229 @retry((exc.IntegrityError), tries=3, delay=2)
230 def wait_for_metadata_ready(engine):
231     # wait for mapper ready
232     metadata.create_all(engine, checkfirst=True)
233     logger.info("metadata is ready")
234
235
236 def start_o2ims_mappers(engine=None):
237     logger.info("Starting O2 IMS mappers")
238
239     # IMS Infrastructure Inventory Mappering
240     dm_mapper = mapper(ocloudModel.DeploymentManager, deploymentmanager)
241     resourcepool_mapper = mapper(ocloudModel.ResourcePool, resourcepool)
242     resourcetype_mapper = mapper(ocloudModel.ResourceType, resourcetype)
243     mapper(
244         ocloudModel.Ocloud,
245         ocloud,
246         properties={
247             "deploymentManagers": relationship(dm_mapper),
248             "resourceTypes": relationship(resourcetype_mapper),
249             "resourcePools": relationship(resourcepool_mapper)
250         })
251     mapper(
252         ocloudModel.Resource,
253         resource,
254         properties={
255             "resourceTypes": relationship(resourcetype_mapper),
256             "resourcePools": relationship(resourcepool_mapper)
257         }
258     )
259     mapper(subModel.Subscription, subscription)
260     mapper(confModel.Configuration, configuration)
261
262     # IMS Infrastruture Monitoring Mappering
263     mapper(alarmModel.AlarmEventRecord, alarm_event_record)
264     mapper(alarmModel.AlarmDefinition, alarm_definition)
265     mapper(alarmModel.ProbableCause, alarm_probable_cause)
266     mapper(alarmModel.AlarmSubscription, alarm_subscription)
267
268     if engine is not None:
269         wait_for_metadata_ready(engine)