Add: flask api include resource type, resource pool, resource and deployment manager
[pti/o2.git] / o2ims / bootstrap.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 import inspect
16 from typing import Callable
17 from o2ims.adapter import orm, redis_eventpublisher
18 from o2ims.adapter.notifications import AbstractNotifications,\
19     SmoO2Notifications
20
21 from o2ims.service import handlers, messagebus, unit_of_work
22 from o2ims.adapter.unit_of_work import SqlAlchemyUnitOfWork
23 from o2ims.adapter.clients import orm_stx
24
25
26 def bootstrap(
27     start_orm: bool = True,
28     uow: unit_of_work.AbstractUnitOfWork = SqlAlchemyUnitOfWork(),
29     notifications: AbstractNotifications = None,
30     publish: Callable = redis_eventpublisher.publish,
31 ) -> messagebus.MessageBus:
32
33     if notifications is None:
34         notifications = SmoO2Notifications()
35
36     if start_orm:
37         orm_stx.start_o2ims_stx_mappers(uow)
38         with uow:
39             # get default engine if uow is by default
40             engine = uow.session.get_bind()
41             orm.start_o2ims_mappers(engine)
42
43     dependencies = {"uow": uow, "notifications": notifications,
44                     "publish": publish}
45     injected_event_handlers = {
46         event_type: [
47             inject_dependencies(handler, dependencies)
48             for handler in event_handlers
49         ]
50         for event_type, event_handlers in handlers.EVENT_HANDLERS.items()
51     }
52     injected_command_handlers = {
53         command_type: inject_dependencies(handler, dependencies)
54         for command_type, handler in handlers.COMMAND_HANDLERS.items()
55     }
56
57     return messagebus.MessageBus(
58         uow=uow,
59         event_handlers=injected_event_handlers,
60         command_handlers=injected_command_handlers,
61     )
62
63
64 def inject_dependencies(handler, dependencies):
65     params = inspect.signature(handler).parameters
66     deps = {
67         name: dependency
68         for name, dependency in dependencies.items()
69         if name in params
70     }
71     return lambda message: handler(message, **deps)