blob: 10da9a5f7541115747d2172d92dd527d2e055815 [file] [log] [blame]
Patricia Reinoso15ce47b2022-10-26 08:58:39 +00001#!/usr/bin/python3
2
3# Copyright 2022 Canonical Ltd.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17import asyncio
18from unittest import TestCase
19from unittest.mock import Mock, patch
20from osm_common import msgbase
21from osm_common.dbbase import DbException
22from osm_lcm.paas import PaasLcm
23
24
25class TestPaasLcm(TestCase):
26 @patch("osm_lcm.lcm_utils.Database")
27 @patch("osm_lcm.lcm_utils.Filesystem")
28 def setUp(self, mock_filesystem, mock_database):
29 self.loop = asyncio.get_event_loop()
30 self.msg = Mock(msgbase.MsgBase())
31 self.lcm_tasks = Mock()
32 self.lcm_tasks.lock_HA.return_value = True
33 self.config = {"database": {"driver": "mongo"}}
34 self.paas_lcm = PaasLcm(self.msg, self.lcm_tasks, self.config, self.loop)
35 self.paas_lcm.db = Mock()
36 self.paas_lcm.fs = Mock()
37 self.paas_lcm.update_db_2 = Mock()
38 self.op_id = "op-id"
39 self.paas_id = "paas-id"
40 self.order_id = "order-id"
41 self.paas_content = {"op_id": self.op_id, "_id": self.paas_id}
42 self.db_paas = {
43 "_id": "_id",
44 "name": "paas-name",
45 "secret": "secret",
46 "schema_version": "1.11",
47 }
48
49 def check_assert_not_called_when_legacy_nbi(self):
50 self.paas_lcm.db.get_one.assert_not_called()
51 self.paas_lcm.db.encrypt_decrypt_fields.assert_not_called()
52 self.paas_lcm.update_db_2.assert_not_called()
53 self.lcm_tasks.unlock_HA.assert_not_called()
54 self.lcm_tasks.remove.assert_not_called()
55
56 def check_db_update_when_successful_connectivity(self):
57 self.paas_lcm.update_db_2.assert_called_with(
58 "paas",
59 self.paas_id,
60 {
61 "_admin.operationalState": "ENABLED",
62 "_admin.detailed-status": "Connectivity: ok",
63 },
64 )
65
66 def check_db_update_when_db_exception(self):
67 self.paas_lcm.update_db_2.assert_called_with(
68 "paas",
69 self.paas_id,
70 {
71 "_admin.operationalState": "ERROR",
72 "_admin.detailed-status": "Failed with exception: database exception failed",
73 },
74 )
75
76 def test_paas_lcm_create_legacy_nbi(self):
77 self.lcm_tasks.lock_HA.return_value = False
78 self.loop.run_until_complete(
79 self.paas_lcm.create(self.paas_content, self.order_id)
80 )
81 self.check_assert_not_called_when_legacy_nbi()
82
83 def test_paas_lcm_create(self):
84 self.paas_lcm.db.get_one.return_value = self.db_paas
85 self.loop.run_until_complete(
86 self.paas_lcm.create(self.paas_content, self.order_id)
87 )
88
89 self.lcm_tasks.lock_HA.assert_called_with("paas", "create", self.op_id)
90 self.paas_lcm.db.encrypt_decrypt_fields.assert_called_with(
91 self.db_paas, "decrypt", ["secret"], schema_version="1.11", salt="_id"
92 )
93 self.check_db_update_when_successful_connectivity()
94 self.lcm_tasks.unlock_HA.assert_called_with(
95 "paas",
96 "create",
97 self.op_id,
98 operationState="COMPLETED",
99 detailed_status="PaaS validated",
100 )
101 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)
102
103 def test_paas_lcm_create_exception_getting_and_updating_db(self):
104 self.paas_lcm.db.get_one.side_effect = DbException("failed")
105 self.paas_lcm.update_db_2.side_effect = DbException("failed")
106 self.loop.run_until_complete(
107 self.paas_lcm.create(self.paas_content, self.order_id)
108 )
109
110 self.lcm_tasks.lock_HA.assert_called_with("paas", "create", self.op_id)
111 self.paas_lcm.db.encrypt_decrypt_fields.assert_not_called()
112
113 self.check_db_update_when_db_exception()
114 self.lcm_tasks.unlock_HA.assert_not_called()
115 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)
116
117 def test_paas_lcm_create_exception_updating_db(self):
118
119 self.paas_lcm.db.get_one.return_value = self.db_paas
120 self.paas_lcm.update_db_2.side_effect = DbException("failed")
121 self.loop.run_until_complete(
122 self.paas_lcm.create(self.paas_content, self.order_id)
123 )
124
125 self.lcm_tasks.lock_HA.assert_called_with("paas", "create", self.op_id)
126 self.paas_lcm.db.encrypt_decrypt_fields.assert_called_with(
127 self.db_paas, "decrypt", ["secret"], schema_version="1.11", salt="_id"
128 )
129 self.check_db_update_when_successful_connectivity()
130 self.lcm_tasks.unlock_HA.assert_not_called()
131 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)
132
133 def test_paas_lcm_create_exception_getting_from_db(self):
134 self.paas_lcm.db.get_one.side_effect = DbException("failed")
135 self.loop.run_until_complete(
136 self.paas_lcm.create(self.paas_content, self.order_id)
137 )
138 self.lcm_tasks.lock_HA.assert_called_with("paas", "create", self.op_id)
139 self.paas_lcm.db.encrypt_decrypt_fields.assert_not_called()
140 self.check_db_update_when_db_exception()
141 self.lcm_tasks.unlock_HA.assert_called_with(
142 "paas",
143 "create",
144 self.op_id,
145 operationState="FAILED",
146 detailed_status="Failed with exception: database exception failed",
147 )
148 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)
149
150 def test_paas_lcm_edit_legacy_nbi(self):
151 self.lcm_tasks.lock_HA.return_value = False
152 self.loop.run_until_complete(
153 self.paas_lcm.edit(self.paas_content, self.order_id)
154 )
155 self.check_assert_not_called_when_legacy_nbi()
156
157 def test_paas_lcm_edit(self):
158
159 self.paas_lcm.db.get_one.return_value = self.db_paas
160 self.loop.run_until_complete(
161 self.paas_lcm.edit(self.paas_content, self.order_id)
162 )
163
164 self.lcm_tasks.lock_HA.assert_called_with("paas", "edit", self.op_id)
165 self.paas_lcm.db.encrypt_decrypt_fields.assert_called_with(
166 self.db_paas, "decrypt", ["secret"], schema_version="1.11", salt="_id"
167 )
168 self.check_db_update_when_successful_connectivity()
169 self.lcm_tasks.unlock_HA.assert_called_with(
170 "paas",
171 "edit",
172 self.op_id,
173 operationState="COMPLETED",
174 detailed_status="PaaS validated",
175 )
176 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)
177
178 def test_paas_lcm_edit_exception_getting_and_updating_db(self):
179 self.paas_lcm.db.get_one.side_effect = DbException("failed")
180 self.paas_lcm.update_db_2.side_effect = DbException("failed")
181 self.loop.run_until_complete(
182 self.paas_lcm.edit(self.paas_content, self.order_id)
183 )
184
185 self.lcm_tasks.lock_HA.assert_called_with("paas", "edit", self.op_id)
186 self.paas_lcm.db.encrypt_decrypt_fields.assert_not_called()
187
188 self.check_db_update_when_db_exception()
189 self.lcm_tasks.unlock_HA.assert_not_called()
190 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)
191
192 def test_paas_lcm_edit_exception_updating_db(self):
193 self.paas_lcm.db.get_one.return_value = self.db_paas
194 self.paas_lcm.update_db_2.side_effect = DbException("failed")
195 self.loop.run_until_complete(
196 self.paas_lcm.edit(self.paas_content, self.order_id)
197 )
198
199 self.lcm_tasks.lock_HA.assert_called_with("paas", "edit", self.op_id)
200 self.paas_lcm.db.encrypt_decrypt_fields.assert_called_with(
201 self.db_paas, "decrypt", ["secret"], schema_version="1.11", salt="_id"
202 )
203 self.check_db_update_when_successful_connectivity()
204 self.lcm_tasks.unlock_HA.assert_not_called()
205 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)
206
207 def test_paas_lcm_edit_exception_getting_from_db(self):
208 self.paas_lcm.db.get_one.side_effect = DbException("failed")
209 self.loop.run_until_complete(
210 self.paas_lcm.edit(self.paas_content, self.order_id)
211 )
212 self.lcm_tasks.lock_HA.assert_called_with("paas", "edit", self.op_id)
213 self.paas_lcm.db.encrypt_decrypt_fields.assert_not_called()
214 self.check_db_update_when_db_exception()
215 self.lcm_tasks.unlock_HA.assert_called_with(
216 "paas",
217 "edit",
218 self.op_id,
219 operationState="FAILED",
220 detailed_status="Failed with exception: database exception failed",
221 )
222 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)
223
224 def test_paas_lcm_delete_legacy_nbi(self):
225 self.lcm_tasks.lock_HA.return_value = False
226 self.loop.run_until_complete(
227 self.paas_lcm.delete(self.paas_content, self.order_id)
228 )
229 self.check_assert_not_called_when_legacy_nbi()
230
231 def test_paas_lcm_delete(self):
232 self.loop.run_until_complete(
233 self.paas_lcm.delete(self.paas_content, self.order_id)
234 )
235
236 self.lcm_tasks.lock_HA.assert_called_with("paas", "delete", self.op_id)
237 self.paas_lcm.db.del_one.assert_called_with("paas", {"_id": self.paas_id})
238 self.paas_lcm.update_db_2.assert_called_with("paas", self.paas_id, None)
239 self.lcm_tasks.unlock_HA.assert_called_with(
240 "paas",
241 "delete",
242 self.op_id,
243 operationState="COMPLETED",
244 detailed_status="deleted",
245 )
246 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)
247
248 def test_paas_lcm_delete_exception_deleting_from_db(self):
249 self.paas_lcm.db.del_one.side_effect = Exception("failed deleting")
250 self.loop.run_until_complete(
251 self.paas_lcm.delete(self.paas_content, self.order_id)
252 )
253
254 self.lcm_tasks.lock_HA.assert_called_with("paas", "delete", self.op_id)
255 self.paas_lcm.db.del_one.assert_called_with("paas", {"_id": self.paas_id})
256 self.paas_lcm.update_db_2.assert_called_with(
257 "paas",
258 self.paas_id,
259 {
260 "_admin.operationalState": "ERROR",
261 "_admin.detailed-status": "Failed with exception: failed deleting",
262 },
263 )
264 self.lcm_tasks.unlock_HA.assert_called_with(
265 "paas",
266 "delete",
267 self.op_id,
268 operationState="FAILED",
269 detailed_status="Failed with exception: failed deleting",
270 )
271 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)
272
273 def test_paas_lcm_delete_exception_updating_db(self):
274 self.loop.run_until_complete(
275 self.paas_lcm.delete(self.paas_content, self.order_id)
276 )
277
278 self.lcm_tasks.lock_HA.assert_called_with("paas", "delete", self.op_id)
279 self.paas_lcm.db.del_one.assert_called_with("paas", {"_id": self.paas_id})
280 self.paas_lcm.update_db_2.assert_called_with("paas", self.paas_id, None)
281 self.lcm_tasks.unlock_HA.not_called()
282 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)
283
284 def test_paas_lcm_delete_exception_deleting_and_updating_db(self):
285 self.paas_lcm.db.del_one.side_effect = Exception("failed deleting")
286 self.paas_lcm.update_db_2.side_effect = DbException("failed")
287
288 self.loop.run_until_complete(
289 self.paas_lcm.delete(self.paas_content, self.order_id)
290 )
291
292 self.lcm_tasks.lock_HA.assert_called_with("paas", "delete", self.op_id)
293 self.paas_lcm.db.del_one.assert_called_with("paas", {"_id": self.paas_id})
294 self.paas_lcm.update_db_2.assert_called_with(
295 "paas",
296 self.paas_id,
297 {
298 "_admin.operationalState": "ERROR",
299 "_admin.detailed-status": "Failed with exception: failed deleting",
300 },
301 )
302 self.lcm_tasks.unlock_HA.not_called()
303 self.lcm_tasks.remove.assert_called_with("paas", self.paas_id, self.order_id)