1 # Copyright (C) 2021 Wind River Systems, Inc.
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
7 # http://www.apache.org/licenses/LICENSE-2.0
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.
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
21 from o2common.config import config
22 from o2common.service.unit_of_work import AbstractUnitOfWork
24 from o2ims.adapter import ocloud_repository, alarm_repository
25 from o2dms.adapter import dms_repository
27 from o2common.helper import o2logging
28 logger = o2logging.get_logger(__name__)
31 engine = create_engine(
32 config.get_postgres_uri(),
33 isolation_level="REPEATABLE READ",
34 pool_size=200, max_overflow=0,
38 DEFAULT_SESSION_FACTORY = sessionmaker(
39 autocommit=False, autoflush=False, bind=engine
43 class SqlAlchemyUnitOfWork(AbstractUnitOfWork):
45 def __init__(self, session_factory=DEFAULT_SESSION_FACTORY):
46 self.session_factory = session_factory
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.deployment_managers = ocloud_repository\
61 .DeploymentManagerSqlAlchemyRepository(self.session)
62 self.nfdeployment_descs = dms_repository\
63 .NfDeploymentDescSqlAlchemyRepository(self.session)
64 self.nfdeployments = dms_repository\
65 .NfDeploymentSqlAlchemyRepository(self.session)
66 self.ocloudvresources = dms_repository\
67 .NfOCloudVResourceSqlAlchemyRepository(self.session)
68 self.alarm_event_records = alarm_repository\
69 .AlarmEventRecordSqlAlchemyRepository(self.session)
70 self.alarm_definitions = alarm_repository\
71 .AlarmDefinitionSqlAlchemyRepository(self.session)
72 self.alarm_dictionaries = alarm_repository\
73 .AlarmDictionarySqlAlchemyRepository(self.session)
74 self.alarm_subscriptions = alarm_repository\
75 .AlarmSubscriptionSqlAlchemyRepository(self.session)
76 self.alarm_probable_causes = alarm_repository\
77 .AlarmProbableCauseSqlAlchemyRepository(self.session)
79 return super().__enter__()
81 def __exit__(self, *args):
82 super().__exit__(*args)
89 self.session.rollback()
91 def _collect_new_events(self):
92 for entry in self.oclouds.seen:
93 # while hasattr(entry, 'events') and len(entry.events) > 0:
94 while entry.events is not None and len(entry.events) > 0:
95 yield entry.events.pop(0)
96 for entry in self.resource_pools.seen:
97 while entry.events is not None and len(entry.events) > 0:
98 yield entry.events.pop(0)
99 for entry in self.resources.seen:
100 while entry.events is not None and len(entry.events) > 0:
101 yield entry.events.pop(0)
102 for entry in self.resource_types.seen:
103 while hasattr(entry, 'events') and len(entry.events) > 0:
104 yield entry.events.pop(0)
105 for entry in self.deployment_managers.seen:
106 while hasattr(entry, 'events') and len(entry.events) > 0:
107 yield entry.events.pop(0)
108 for entry in self.subscriptions.seen:
109 while hasattr(entry, 'events') and len(entry.events) > 0:
110 yield entry.events.pop(0)
111 for entry in self.nfdeployment_descs.seen:
112 while hasattr(entry, 'events') and len(entry.events) > 0:
113 yield entry.events.pop(0)
114 for entry in self.nfdeployments.seen:
115 while hasattr(entry, 'events') and len(entry.events) > 0:
116 yield entry.events.pop(0)
117 for entry in self.ocloudvresources.seen:
118 while hasattr(entry, 'events') and len(entry.events) > 0:
119 yield entry.events.pop(0)
120 for entry in self.alarm_event_records.seen:
121 while hasattr(entry, 'events') and len(entry.events) > 0:
122 yield entry.events.pop(0)
123 for entry in self.alarm_subscriptions.seen:
124 while hasattr(entry, 'events') and len(entry.events) > 0:
125 yield entry.events.pop(0)