Enhance: Enable O2 DMS by exposing k8s API endpoint
[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.resource_type import ResourceTypeEnum
41
42 from o2common.helper import o2logging
43 logger = o2logging.get_logger(__name__)
44
45 metadata = MetaData()
46
47 ocloud = Table(
48     "ocloud",
49     metadata,
50     Column("updatetime", DateTime),
51     Column("createtime", DateTime),
52     Column("hash", String(255)),
53     Column("version_number", Integer),
54
55     Column("oCloudId", String(255), primary_key=True),
56     Column("globalcloudId", String(255)),
57     Column("name", String(255)),
58     Column("description", String(255)),
59     Column("infrastructureManagementServiceEndpoint", String(255))
60     # Column("extensions", String(1024))
61 )
62
63 resourcetype = Table(
64     "resourcetype",
65     metadata,
66     Column("updatetime", DateTime),
67     Column("createtime", DateTime),
68     Column("hash", String(255)),
69
70     Column("resourceTypeId", String(255), primary_key=True),
71     Column("resourceTypeEnum", Enum(
72         ResourceTypeEnum, native_enum=False), nullable=False),
73     Column("oCloudId", ForeignKey("ocloud.oCloudId")),
74     Column("name", String(255)),
75     Column("vendor", String(255)),
76     Column("model", String(255)),
77     Column("version", String(255)),
78     Column("description", String(255)),
79     # Column("extensions", String(1024))
80 )
81
82 resourcepool = Table(
83     "resourcepool",
84     metadata,
85     Column("updatetime", DateTime),
86     Column("createtime", DateTime),
87     Column("hash", String(255)),
88     Column("version_number", Integer),
89
90     Column("resourcePoolId", String(255), primary_key=True),
91     Column("oCloudId", ForeignKey("ocloud.oCloudId")),
92     Column("globalLocationId", String(255)),
93     Column("name", String(255)),
94     Column("location", String(255)),
95     Column("description", String(255)),
96     # Column("resources", String(1024))
97     # Column("extensions", String(1024))
98 )
99
100 resource = Table(
101     "resource",
102     metadata,
103     Column("updatetime", DateTime),
104     Column("createtime", DateTime),
105     Column("hash", String(255)),
106     Column("version_number", Integer),
107
108     Column("resourceId", String(255), primary_key=True),
109     Column("resourceTypeId", ForeignKey("resourcetype.resourceTypeId")),
110     Column("resourcePoolId", ForeignKey("resourcepool.resourcePoolId")),
111     Column("name", String(255)),
112     # Column("globalAssetId", String(255)),
113     Column("parentId", String(255)),
114     Column("description", String(255)),
115     Column("elements", Text())
116     # Column("extensions", String(1024))
117 )
118
119 deploymentmanager = Table(
120     "deploymentmanager",
121     metadata,
122     Column("updatetime", DateTime),
123     Column("createtime", DateTime),
124     Column("hash", String(255)),
125     Column("version_number", Integer),
126
127     Column("deploymentManagerId", String(255), primary_key=True),
128     Column("oCloudId", ForeignKey("ocloud.oCloudId")),
129     Column("name", String(255)),
130     Column("description", String(255)),
131     Column("deploymentManagementServiceEndpoint", String(255)),
132     Column("supportedLocations", String(255)),
133     Column("capabilities", String(255)),
134     Column("capacity", String(255)),
135     Column("profile", Text())
136     # Column("extensions", String(1024))
137 )
138
139 subscription = Table(
140     "subscription",
141     metadata,
142     Column("updatetime", DateTime),
143     Column("createtime", DateTime),
144     Column("hash", String(255)),
145     Column("version_number", Integer),
146
147     Column("subscriptionId", String(255), primary_key=True),
148     Column("callback", String(255)),
149     Column("consumerSubscriptionId", String(255)),
150     Column("filter", String(255)),
151 )
152
153 configuration = Table(
154     "configuration",
155     metadata,
156     Column("updatetime", DateTime),
157     Column("createtime", DateTime),
158
159     Column("configurationId", String(255), primary_key=True),
160     Column("conftype", String(255)),
161     Column("callback", String(255)),
162     Column("status", String(255)),
163     Column("comments", String(255)),
164 )
165
166
167 @retry((exc.IntegrityError), tries=3, delay=2)
168 def wait_for_metadata_ready(engine):
169     # wait for mapper ready
170     metadata.create_all(engine, checkfirst=True)
171     logger.info("metadata is ready")
172
173
174 def start_o2ims_mappers(engine=None):
175     logger.info("Starting O2 IMS mappers")
176
177     dm_mapper = mapper(ocloudModel.DeploymentManager, deploymentmanager)
178     resourcepool_mapper = mapper(ocloudModel.ResourcePool, resourcepool)
179     resourcetype_mapper = mapper(ocloudModel.ResourceType, resourcetype)
180     mapper(
181         ocloudModel.Ocloud,
182         ocloud,
183         properties={
184             "deploymentManagers": relationship(dm_mapper),
185             "resourceTypes": relationship(resourcetype_mapper),
186             "resourcePools": relationship(resourcepool_mapper)
187         })
188     mapper(
189         ocloudModel.Resource,
190         resource,
191         properties={
192             "resourceTypes": relationship(resourcetype_mapper),
193             "resourcePools": relationship(resourcepool_mapper)
194         }
195     )
196     mapper(subModel.Subscription, subscription)
197     mapper(confModel.Configuration, configuration)
198
199     if engine is not None:
200         wait_for_metadata_ready(engine)