ef6cb8c52b469deb2f3b51c4a2fd55686f5afa47
[pti/o2.git] / o2dms / api / dms_lcm_nfdeployment.py
1 # Copyright (C) 2021 Wind River Systems, Inc.\r
2 #\r
3 #  Licensed under the Apache License, Version 2.0 (the "License");\r
4 #  you may not use this file except in compliance with the License.\r
5 #  You may obtain a copy of the License at\r
6 #\r
7 #      http://www.apache.org/licenses/LICENSE-2.0\r
8 #\r
9 #  Unless required by applicable law or agreed to in writing, software\r
10 #  distributed under the License is distributed on an "AS IS" BASIS,\r
11 #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 #  See the License for the specific language governing permissions and\r
13 #  limitations under the License.\r
14 \r
15 from sqlalchemy import select\r
16 import uuid\r
17 from o2dms.domain.states import NfDeploymentState\r
18 from o2common.service import messagebus\r
19 from o2common.service import unit_of_work\r
20 from o2dms.adapter.orm import nfDeployment\r
21 from o2dms.api.dms_dto import DmsLcmNfDeploymentDTO\r
22 from o2dms.domain.dms import NfDeployment\r
23 from o2common.helper import o2logging\r
24 logger = o2logging.get_logger(__name__)\r
25 \r
26 \r
27 def lcm_nfdeployment_list(\r
28         deploymentManagerID: str, uow: unit_of_work.AbstractUnitOfWork):\r
29     with uow:\r
30         res = uow.session.execute(select(nfDeployment).where(\r
31             nfDeployment.c.deploymentManagerId == deploymentManagerID))\r
32     return [dict(r) for r in res]\r
33 \r
34 \r
35 def lcm_nfdeployment_one(\r
36         nfdeploymentid: str, uow: unit_of_work.AbstractUnitOfWork):\r
37     with uow:\r
38         res = uow.session.execute(select(nfDeployment).where(\r
39             nfDeployment.c.id == nfdeploymentid))\r
40         first = res.first()\r
41     return None if first is None else dict(first)\r
42 \r
43 \r
44 def lcm_nfdeployment_create(\r
45         deploymentManagerId: str,\r
46         input: DmsLcmNfDeploymentDTO.\r
47         NfDeployment_create,\r
48         bus: messagebus.MessageBus):\r
49 \r
50     uow = bus.uow\r
51     id = str(uuid.uuid4())\r
52     with uow:\r
53         _check_duplication(input, uow)\r
54         _check_dependencies(input, uow)\r
55         entity = NfDeployment(\r
56             id, input['name'], deploymentManagerId, input['description'],\r
57             input['descriptorId'], input['parentDeploymentId'])\r
58         uow.nfdeployments.add(entity)\r
59         # entity.transit_state(NfDeploymentState.NotInstalled)\r
60 \r
61         # to be refactor later according to O2 DMS API design\r
62         entity.transit_state(NfDeploymentState.Installing)\r
63         uow.commit()\r
64     _handle_events(bus)\r
65 \r
66     return id\r
67 \r
68 \r
69 def lcm_nfdeployment_update(\r
70         nfdeploymentid: str,\r
71         input: DmsLcmNfDeploymentDTO.NfDeployment_update,\r
72         bus: messagebus.MessageBus):\r
73 \r
74     uow = bus.uow\r
75     with uow:\r
76         entity: NfDeployment = uow.nfdeployments.get(nfdeploymentid)\r
77         entity.name = input['name']\r
78         entity.description = input['description']\r
79         entity.outputParams = input['parentDeploymentId']\r
80         entity.transit_state(NfDeploymentState.Updating)\r
81         uow.commit()\r
82     _handle_events(bus)\r
83     return True\r
84 \r
85 \r
86 def _handle_events(bus: messagebus.MessageBus):\r
87     # handle events\r
88     events = bus.uow.collect_new_events()\r
89     for event in events:\r
90         bus.handle(event)\r
91     return True\r
92 \r
93 \r
94 def lcm_nfdeployment_uninstall(\r
95         nfdeploymentid: str,\r
96         bus: messagebus.MessageBus):\r
97 \r
98     uow = bus.uow\r
99     with uow:\r
100         entity: NfDeployment = uow.nfdeployments.get(nfdeploymentid)\r
101         if not entity:\r
102             pass\r
103         elif entity.status == NfDeploymentState.Initial:\r
104             bus.uow.nfdeployments.delete(nfdeploymentid)\r
105         # elif entity.status == NfDeploymentState.NotInstalled:\r
106         #     bus.uow.nfdeployments.delete(nfdeploymentid)\r
107         elif entity.status == NfDeploymentState.Installing:\r
108             entity.transit_state(NfDeploymentState.Uninstalling)\r
109         elif entity.status == NfDeploymentState.Installed:\r
110             entity.transit_state(NfDeploymentState.Uninstalling)\r
111         elif entity.status == NfDeploymentState.Updating:\r
112             entity.transit_state(NfDeploymentState.Uninstalling)\r
113         elif entity.status == NfDeploymentState.Uninstalling:\r
114             pass\r
115         elif entity.status == NfDeploymentState.Abnormal:\r
116             bus.uow.nfdeployments.delete(nfdeploymentid)\r
117         else:\r
118             entity.transit_state(NfDeploymentState.Abnormal)\r
119         uow.commit()\r
120     _handle_events(bus)\r
121     return True\r
122 \r
123 \r
124 # def lcm_nfdeployment_delete(\r
125 #         nfdeploymentid: str,\r
126 #         bus: messagebus.MessageBus):\r
127 \r
128 #     uow = bus.uow\r
129 #     with uow:\r
130 #         entity = uow.nfdeployments.get(nfdeploymentid)\r
131 #         if entity.status != NfDeploymentState.Initial:\r
132 #             raise Exception(\r
133 #                 "NfDeployment {} is not in status to delete".format(\r
134 #                     nfdeploymentid))\r
135 #         uow.nfdeployments.delete(nfdeploymentid)\r
136 #         entity.transit_state(NfDeploymentState.Deleting)\r
137 #         uow.commit()\r
138 #     return True\r
139 \r
140 \r
141 def _check_duplication(\r
142         input: DmsLcmNfDeploymentDTO,\r
143         uow: unit_of_work.AbstractUnitOfWork):\r
144     name = input['name']\r
145     descriptorId = input['descriptorId']\r
146     if uow.nfdeployments.count(name=name) > 0:\r
147         raise Exception(\r
148             "NfDeployment with name {} exists already".format(name))\r
149     if uow.nfdeployments.count(descriptorId=descriptorId) > 0:\r
150         raise Exception(\r
151             "NfDeployment with descriptorId {} exists already".format(\r
152                 descriptorId))\r
153 \r
154 \r
155 def _check_dependencies(\r
156         input: DmsLcmNfDeploymentDTO,\r
157         uow: unit_of_work.AbstractUnitOfWork):\r
158     descriptorId = input['descriptorId']\r
159     if uow.nfdeployment_descs.count(id=descriptorId) == 0:\r
160         raise Exception(\r
161             "NfDeploymentDescriptor with id {} does not exist".format(\r
162                 descriptorId))\r