Convert file endlines to Unix (LF)
[pti/o2.git] / o2app / adapter / unit_of_work.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 # pylint: disable=attribute-defined-outside-init
16 from __future__ import annotations
17 from sqlalchemy import create_engine
18 from sqlalchemy.orm import sessionmaker
19 from sqlalchemy.orm.session import Session
20
21 from o2common.config import config
22 from o2common.service.unit_of_work import AbstractUnitOfWork
23
24 from o2ims.adapter import ocloud_repository
25 from o2dms.adapter import dms_repository
26
27 from o2common.helper import o2logging
28 logger = o2logging.get_logger(__name__)
29
30
31 engine = create_engine(
32     config.get_postgres_uri(),
33     isolation_level="REPEATABLE READ",
34     pool_size=200, max_overflow=0,
35     pool_recycle=3600
36 )
37
38 DEFAULT_SESSION_FACTORY = sessionmaker(
39     autocommit=False, autoflush=False, bind=engine
40 )
41
42
43 class SqlAlchemyUnitOfWork(AbstractUnitOfWork):
44
45     def __init__(self, session_factory=DEFAULT_SESSION_FACTORY):
46         self.session_factory = session_factory
47
48     def __enter__(self):
49         self.session = self.session_factory()  # type: Session
50         self.oclouds = ocloud_repository\
51             .OcloudSqlAlchemyRepository(self.session)
52         self.resource_types = ocloud_repository\
53             .ResouceTypeSqlAlchemyRepository(self.session)
54         self.resource_pools = ocloud_repository\
55             .ResourcePoolSqlAlchemyRepository(self.session)
56         self.resources = ocloud_repository\
57             .ResourceSqlAlchemyRepository(self.session)
58         self.subscriptions = ocloud_repository\
59             .SubscriptionSqlAlchemyRepository(self.session)
60         self.configurations = ocloud_repository\
61             .ConfigurationSqlAlchemyRepository(self.session)
62         self.deployment_managers = ocloud_repository\
63             .DeploymentManagerSqlAlchemyRepository(self.session)
64         self.nfdeployment_descs = dms_repository\
65             .NfDeploymentDescSqlAlchemyRepository(self.session)
66         self.nfdeployments = dms_repository\
67             .NfDeploymentSqlAlchemyRepository(self.session)
68         self.ocloudvresources = dms_repository\
69             .NfOCloudVResourceSqlAlchemyRepository(self.session)
70         return super().__enter__()
71
72     def __exit__(self, *args):
73         super().__exit__(*args)
74         self.session.close()
75
76     def _commit(self):
77         self.session.commit()
78
79     def rollback(self):
80         self.session.rollback()
81
82     def _collect_new_events(self):
83         for entry in self.oclouds.seen:
84             # while hasattr(entry, 'events') and len(entry.events) > 0:
85             while entry.events is not None and len(entry.events) > 0:
86                 yield entry.events.pop(0)
87         for entry in self.resource_pools.seen:
88             while entry.events is not None and len(entry.events) > 0:
89                 yield entry.events.pop(0)
90         for entry in self.resources.seen:
91             while entry.events is not None and len(entry.events) > 0:
92                 yield entry.events.pop(0)
93         for entry in self.resource_types.seen:
94             while hasattr(entry, 'events') and len(entry.events) > 0:
95                 yield entry.events.pop(0)
96         for entry in self.deployment_managers.seen:
97             while hasattr(entry, 'events') and len(entry.events) > 0:
98                 yield entry.events.pop(0)
99         for entry in self.subscriptions.seen:
100             while hasattr(entry, 'events') and len(entry.events) > 0:
101                 yield entry.events.pop(0)
102         for entry in self.configurations.seen:
103             while hasattr(entry, 'events') and len(entry.events) > 0:
104                 yield entry.events.pop(0)
105         for entry in self.nfdeployment_descs.seen:
106             while hasattr(entry, 'events') and len(entry.events) > 0:
107                 yield entry.events.pop(0)
108         for entry in self.nfdeployments.seen:
109             while hasattr(entry, 'events') and len(entry.events) > 0:
110                 yield entry.events.pop(0)
111         for entry in self.ocloudvresources.seen:
112             while hasattr(entry, 'events') and len(entry.events) > 0:
113                 yield entry.events.pop(0)