blob: 64d9cafce9ad92ee775349d091d91fac9958098a [file] [log] [blame]
Dario Faccin39301762023-04-17 16:56:37 +02001#######################################################################################
2# Copyright ETSI Contributors and Others.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13# implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
Dario Faccin39301762023-04-17 16:56:37 +020017import asynctest
Gulsum Atici36365402023-04-07 00:07:07 +030018from copy import deepcopy
Gulsum Atici50d12e02023-04-27 16:41:43 +030019from unittest import TestCase
20from unittest.mock import Mock, patch
21
Dario Faccin39301762023-04-17 16:56:37 +020022from osm_common.dbbase import DbException
Dario Faccinf5d65b52023-06-19 12:35:33 +020023from osm_common.temporal_task_queues.task_queues_mappings import LCM_TASK_QUEUE
24from osm_lcm.temporal.vnf_activities import (
Patricia Reinoso14406d22023-07-11 15:17:49 +000025 DeleteVnfRecordImpl,
Dario Faccinf5d65b52023-06-19 12:35:33 +020026 ChangeVnfInstantiationStateImpl,
27 ChangeVnfStateImpl,
Daniel Arndtc5982f52023-07-10 09:51:58 -030028 GetModelNamesImpl,
Dario Faccinf5d65b52023-06-19 12:35:33 +020029 GetTaskQueueImpl,
30 GetVimCloudImpl,
31 GetVnfDescriptorImpl,
32 GetVnfRecordImpl,
33 SetVnfModelImpl,
34 VnfSpecifications,
Patricia Reinoso38fb5da2023-04-27 13:48:50 +000035)
Dario Faccinf5d65b52023-06-19 12:35:33 +020036from osm_common.temporal.dataclasses_common import VduComputeConstraints
37from osm_common.temporal.states import VnfState, VnfInstantiationState
Dario Faccin39301762023-04-17 16:56:37 +020038from temporalio.testing import ActivityEnvironment
Dario Faccin39301762023-04-17 16:56:37 +020039
Gulsum Atici50d12e02023-04-27 16:41:43 +030040
41vnfr_uuid = "9f472177-95c0-4335-b357-5cdc17a79965"
42vnfd_uuid = "97784f19-d254-4252-946c-cf92d85443ca"
43vim_uuid = "a64f7c6c-bc27-4ec8-b664-5500a3324eca"
44model_name = "my-model-name"
Dario Faccinf5d65b52023-06-19 12:35:33 +020045set_vnf_model_input = SetVnfModelImpl.Input(vnfr_uuid=vnfr_uuid, model_name=model_name)
Gulsum Aticia1898b42023-04-25 15:48:10 +030046cloud = "microk8s"
Daniel Arndtc5982f52023-07-10 09:51:58 -030047nsr_uuid = "dcf4c922-5a73-41bf-a6ca-870c22d6336c"
Gulsum Aticia1898b42023-04-25 15:48:10 +030048sample_vim_record = {
Gulsum Atici50d12e02023-04-27 16:41:43 +030049 "_id": vim_uuid,
Gulsum Aticia1898b42023-04-25 15:48:10 +030050 "name": "juju",
51 "vim_type": "paas",
52 "vim_url": "192.168.1.100:17070",
53 "vim_user": "admin",
54 "vim_password": "c16gylWEepEREN6vWw==",
55 "config": {
56 "paas_provider": "juju",
57 "cloud": cloud,
58 "cloud_credentials": "microk8s",
59 "authorized_keys": "$HOME/.local/share/juju/ssh/juju_id_rsa.pub",
60 "ca_cert_content": "-----BEGIN-----",
61 },
62}
Gulsum Atici50d12e02023-04-27 16:41:43 +030063vim_account_id = "9b0bedc3-ea8e-42fd-acc9-dd03f4dee73c"
64vdu_id = "hackfest_basic-VM"
65vnf_index = "vnf-profile-id"
66sample_vnfr = {
67 "_id": vnfr_uuid,
68 "id": vnfr_uuid,
Daniel Arndtc5982f52023-07-10 09:51:58 -030069 "nsr-id-ref": nsr_uuid,
Gulsum Atici50d12e02023-04-27 16:41:43 +030070 "vnfd-ref": "jar_vnfd_scalable",
71 "vnfd-id": "f1b38eac-190c-485d-9a74-c6e169c929d8",
72 "vim-account-id": vim_account_id,
73 "namespace": model_name,
74 "member-vnf-index-ref": vnf_index,
75}
76vnf_config = {
77 "member-vnf-index": vnf_index,
78 "vdu": [
79 {
80 "id": vdu_id,
81 "configurable-properties": {
82 "config::redirect-map": "https://osm.instantiation.params"
83 },
84 }
85 ],
86}
87app_config = {"domain_name1": "osm.org", "domain_name2": "osm.com"}
88config = [
89 {"key": "config::domain_name1", "value": "osm.org"},
90 {"key": "config::domain_name2", "value": "osm.com"},
91 {"key": "track", "value": "latest"},
92 {"key": "channel", "value": "stable"},
93]
94vdu = {
95 "id": vdu_id,
96 "name": "hackfest_basic-VM",
97 "sw-image-desc": "ubuntu18.04",
98 "virtual-compute-desc": "hackfest_basic-VM-compute",
99 "virtual-storage-desc": ["hackfest_basic-VM-storage"],
100 "configurable-properties": config,
101}
102vnfd_id = "97784f19-d254-4252-946c-cf92d85443ca"
103flavor_1 = {
104 "id": "compute-id-1",
105 "virtual-memory": {"size": "4"},
106 "virtual-cpu": {"cpu-architecture": "x86", "num-virtual-cpu": 2},
107}
108flavor_2 = {
109 "id": "compute-id-2",
110 "virtual-cpu": {"cpu-architecture": "x86", "num-virtual-cpu": 2},
111}
112flavor_3 = {
113 "id": "compute-id-2",
114 "virtual-memory": {"size": "4"},
115}
116sample_vnfd = {
117 "_id": vnfd_id,
118 "id": "sol006-vnf",
119 "provider": "Canonical",
120 "product-name": "test-vnf",
121 "software-version": "1.0",
122 "vdu": [vdu],
123 "virtual-compute-desc": [flavor_1, flavor_2],
124}
125
126
127class TestException(Exception):
128 pass
Dario Faccin39301762023-04-17 16:56:37 +0200129
130
131class TestVnfDbActivity(asynctest.TestCase):
132 def setUp(self):
133 self.db = Mock()
134 self.env = ActivityEnvironment()
Dario Faccinf5d65b52023-06-19 12:35:33 +0200135 self.change_vnf_state = ChangeVnfStateImpl(self.db)
136 self.change_vnf_instantiation_state = ChangeVnfInstantiationStateImpl(self.db)
137 self.set_vnf_model = SetVnfModelImpl(self.db)
Dario Faccin39301762023-04-17 16:56:37 +0200138
Gulsum Atici50d12e02023-04-27 16:41:43 +0300139 async def test_change_vnf_state__successful__db_updated_as_expected(self):
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000140 vnf_state = VnfState.STOPPED
Dario Faccinf5d65b52023-06-19 12:35:33 +0200141 change_vnf_state_input = ChangeVnfStateImpl.Input(vnfr_uuid, vnf_state)
142 await self.env.run(self.change_vnf_state, change_vnf_state_input)
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000143 self.db.set_one.assert_called_with(
144 "vnfrs", {"_id": vnfr_uuid}, {"vnfState": vnf_state.name}
145 )
146
Gulsum Atici50d12e02023-04-27 16:41:43 +0300147 async def test_change_vnf_state__failed__raises_db_exception(self):
Dario Faccinf5d65b52023-06-19 12:35:33 +0200148 change_vnf_state_input = ChangeVnfStateImpl.Input(vnfr_uuid, VnfState.STARTED)
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000149 self.db.set_one.side_effect = DbException("not found")
150 with self.assertRaises(DbException):
Dario Faccinf5d65b52023-06-19 12:35:33 +0200151 await self.env.run(self.change_vnf_state, change_vnf_state_input)
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000152
Gulsum Atici50d12e02023-04-27 16:41:43 +0300153 async def test_change_vnf_instantiation_state__successful__db_updated_as_expected(
154 self,
155 ):
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000156 instantiation_state = VnfInstantiationState.NOT_INSTANTIATED
Dario Faccinf5d65b52023-06-19 12:35:33 +0200157 change_instantiation_input = ChangeVnfInstantiationStateImpl.Input(
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000158 vnfr_uuid, instantiation_state
159 )
160 await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200161 self.change_vnf_instantiation_state,
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000162 change_instantiation_input,
163 )
164 self.db.set_one.assert_called_with(
165 "vnfrs",
166 {"_id": vnfr_uuid},
167 {"instantiationState": instantiation_state.name},
168 )
169
Gulsum Atici50d12e02023-04-27 16:41:43 +0300170 async def test_change_vnf_instantiation_state__failed__raises_db_exception(self):
Dario Faccinf5d65b52023-06-19 12:35:33 +0200171 change_instantiation_input = ChangeVnfInstantiationStateImpl.Input(
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000172 vnfr_uuid, VnfInstantiationState.INSTANTIATED
173 )
174 self.db.set_one.side_effect = DbException("not found")
175 with self.assertRaises(DbException):
176 await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200177 self.change_vnf_instantiation_state,
Gulsum Atici50d12e02023-04-27 16:41:43 +0300178 change_instantiation_input,
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000179 )
180
Gulsum Atici50d12e02023-04-27 16:41:43 +0300181 async def test_set_vnf_model__successful__db_updated_as_expected(self):
Dario Faccinf5d65b52023-06-19 12:35:33 +0200182 await self.env.run(self.set_vnf_model, set_vnf_model_input)
Dario Faccin39301762023-04-17 16:56:37 +0200183 self.db.set_one.assert_called_with(
184 "vnfrs", {"_id": vnfr_uuid}, {"namespace": model_name}
185 )
186
Gulsum Atici50d12e02023-04-27 16:41:43 +0300187 async def test_set_vnf_model__failed__raises_db_exception(self):
Dario Faccin39301762023-04-17 16:56:37 +0200188 self.db.set_one.side_effect = DbException("not found")
189 with self.assertRaises(DbException):
Dario Faccinf5d65b52023-06-19 12:35:33 +0200190 await self.env.run(self.set_vnf_model, set_vnf_model_input)
Gulsum Atici36365402023-04-07 00:07:07 +0300191
192
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000193class TestGetTaskQueue(asynctest.TestCase):
194 async def setUp(self):
195 self.db = Mock()
Dario Faccinf5d65b52023-06-19 12:35:33 +0200196 self.get_task_queue = GetTaskQueueImpl(self.db)
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000197 self.env = ActivityEnvironment()
Dario Faccinf5d65b52023-06-19 12:35:33 +0200198 self.get_task_queue_input = GetTaskQueueImpl.Input(vnfr_uuid=sample_vnfr["id"])
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000199
Gulsum Atici50d12e02023-04-27 16:41:43 +0300200 async def test_activity__succeeded__get_expected_task_queue(self):
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000201 self.db.get_one.side_effect = [sample_vnfr, sample_vim_record]
202 activity_result = await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200203 self.get_task_queue,
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000204 self.get_task_queue_input,
205 )
206 self.assertEqual(activity_result.task_queue, LCM_TASK_QUEUE)
207
Gulsum Atici50d12e02023-04-27 16:41:43 +0300208 async def test_activity__failed__raises_db_exception(self):
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000209 self.db.get_one.side_effect = DbException("not found")
210 with self.assertRaises(DbException):
211 await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200212 self.get_task_queue,
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000213 self.get_task_queue_input,
214 )
215
Gulsum Atici50d12e02023-04-27 16:41:43 +0300216 async def test_activity__invalid_task_queue__raises_key_error(self):
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000217 vim_record = deepcopy(sample_vim_record)
218 vim_record["vim_type"] = "some-vim-type"
219 self.db.get_one.side_effect = [sample_vnfr, vim_record]
220 with self.assertRaises(KeyError):
221 await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200222 self.get_task_queue,
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000223 self.get_task_queue_input,
224 )
225
Patricia Reinoso38fb5da2023-04-27 13:48:50 +0000226
Gulsum Atici50d12e02023-04-27 16:41:43 +0300227class TestGetVnfDescriptor(asynctest.TestCase):
Gulsum Atici36365402023-04-07 00:07:07 +0300228 async def setUp(self):
229 self.db = Mock()
Dario Faccinf5d65b52023-06-19 12:35:33 +0200230 self.get_vnf_descriptor = GetVnfDescriptorImpl(self.db)
Gulsum Atici36365402023-04-07 00:07:07 +0300231 self.env = ActivityEnvironment()
232
Gulsum Atici50d12e02023-04-27 16:41:43 +0300233 async def test_activity__succeeded__get_expected_vnfd(self):
234 self.db.get_one.return_value = sample_vnfd
Gulsum Atici36365402023-04-07 00:07:07 +0300235 activity_result = await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200236 self.get_vnf_descriptor,
237 GetVnfDescriptorImpl.Input(vnfd_uuid=vnfd_uuid),
Gulsum Atici36365402023-04-07 00:07:07 +0300238 )
239 self.assertEqual(activity_result.vnfd, sample_vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300240
241 async def test_activity__failed__raises_db_exception(self):
242 self.db.get_one.side_effect = DbException("Can not connect to Database.")
243 with self.assertRaises(DbException):
244 await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200245 self.get_vnf_descriptor,
246 GetVnfDescriptorImpl.Input(vnfd_uuid=vnfd_uuid),
Gulsum Atici50d12e02023-04-27 16:41:43 +0300247 )
248
249
250class TestGetVnfRecord(asynctest.TestCase):
251 async def setUp(self):
252 self.db = Mock()
Dario Faccinf5d65b52023-06-19 12:35:33 +0200253 self.get_vnf_record = GetVnfRecordImpl(self.db)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300254 self.env = ActivityEnvironment()
255
256 async def test_activity__succeeded__get_expected_vnfr(self):
257 self.db.get_one.return_value = sample_vnfr
258 activity_result = await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200259 self.get_vnf_record,
260 GetVnfRecordImpl.Input(vnfr_uuid=vnfr_uuid),
Gulsum Atici50d12e02023-04-27 16:41:43 +0300261 )
Gulsum Atici36365402023-04-07 00:07:07 +0300262 self.assertEqual(activity_result.vnfr, sample_vnfr)
263
Gulsum Atici50d12e02023-04-27 16:41:43 +0300264 async def test_activity__failed__raise_db_exception(self):
Gulsum Atici36365402023-04-07 00:07:07 +0300265 self.db.get_one.side_effect = DbException("Can not connect to Database.")
Gulsum Atici50d12e02023-04-27 16:41:43 +0300266 with self.assertRaises(DbException):
267 await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200268 self.get_vnf_record,
269 GetVnfRecordImpl.Input(vnfr_uuid=vnfr_uuid),
Gulsum Atici36365402023-04-07 00:07:07 +0300270 )
Gulsum Atici36365402023-04-07 00:07:07 +0300271
272
Patricia Reinoso14406d22023-07-11 15:17:49 +0000273class TestDeleteVnfRecord(asynctest.TestCase):
274 async def setUp(self):
275 self.db = Mock()
276 self.delete_vnf_record = DeleteVnfRecordImpl(self.db)
277 self.env = ActivityEnvironment()
278
279 async def test_activity__succeeded__expected_record_is_deleted(self):
280 self.db.del_one.return_value = None
281 await self.env.run(
282 self.delete_vnf_record,
283 DeleteVnfRecordImpl.Input(vnfr_uuid=vnfr_uuid),
284 )
285 self.db.del_one.assert_called_with(
286 "vnfrs", {"_id": vnfr_uuid}, fail_on_empty=False
287 )
288
289 async def test_activity__failed__raise_db_exception(self):
290 self.db.del_one.side_effect = DbException("Can not connect to Database.")
291 with self.assertRaises(DbException):
292 await self.env.run(
293 self.delete_vnf_record,
294 DeleteVnfRecordImpl.Input(vnfr_uuid=vnfr_uuid),
295 )
296
297
Gulsum Aticia1898b42023-04-25 15:48:10 +0300298class TestGetVimCloud(asynctest.TestCase):
299 async def setUp(self):
300 self.db = Mock()
Dario Faccinf5d65b52023-06-19 12:35:33 +0200301 self.get_vim_cloud = GetVimCloudImpl(self.db)
Gulsum Aticia1898b42023-04-25 15:48:10 +0300302 self.env = ActivityEnvironment()
303
Gulsum Atici50d12e02023-04-27 16:41:43 +0300304 async def test_activity__succeeded__get_vim_cloud(self):
Gulsum Aticia1898b42023-04-25 15:48:10 +0300305 self.db.get_one.side_effect = [sample_vnfr, sample_vim_record]
306 activity_result = await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200307 self.get_vim_cloud,
308 GetVimCloudImpl.Input(vnfr_uuid=sample_vnfr["id"]),
Gulsum Aticia1898b42023-04-25 15:48:10 +0300309 )
310 self.assertEqual(activity_result.cloud, cloud)
311
Gulsum Atici50d12e02023-04-27 16:41:43 +0300312 async def test_activity__vim_record_without_cloud__no_cloud_info(self):
Gulsum Aticia1898b42023-04-25 15:48:10 +0300313 vim_record = deepcopy(sample_vim_record)
314 vim_record["config"].pop("cloud")
315 self.db.get_one.side_effect = [sample_vnfr, vim_record]
316 activity_result = await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200317 self.get_vim_cloud,
318 GetVimCloudImpl.Input(vnfr_uuid=sample_vnfr["id"]),
Gulsum Aticia1898b42023-04-25 15:48:10 +0300319 )
320 self.assertEqual(activity_result.cloud, "")
321
Gulsum Atici50d12e02023-04-27 16:41:43 +0300322 async def test_activity__failed__raise_db_exception(self):
Gulsum Aticia1898b42023-04-25 15:48:10 +0300323 self.db.get_one.side_effect = DbException("Can not connect to Database.")
Gulsum Atici50d12e02023-04-27 16:41:43 +0300324 with self.assertRaises(DbException):
325 await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200326 self.get_vim_cloud,
327 GetVimCloudImpl.Input(vnfr_uuid=sample_vnfr["id"]),
Gulsum Aticia1898b42023-04-25 15:48:10 +0300328 )
Gulsum Aticia1898b42023-04-25 15:48:10 +0300329
Gulsum Atici50d12e02023-04-27 16:41:43 +0300330 async def test_activity__wrong_vim_record__raise_key_error(self):
Gulsum Aticia1898b42023-04-25 15:48:10 +0300331 vim_record = deepcopy(sample_vim_record)
332 vim_record.pop("config")
333 self.db.get_one.side_effect = [sample_vnfr, vim_record]
Gulsum Atici50d12e02023-04-27 16:41:43 +0300334 with self.assertRaises(KeyError):
335 await self.env.run(
Dario Faccinf5d65b52023-06-19 12:35:33 +0200336 self.get_vim_cloud,
337 GetVimCloudImpl.Input(vnfr_uuid=sample_vnfr["id"]),
Gulsum Aticia1898b42023-04-25 15:48:10 +0300338 )
Gulsum Aticia1898b42023-04-25 15:48:10 +0300339
Gulsum Atici50d12e02023-04-27 16:41:43 +0300340
341class TestGetVduInstantiateInfoMethods(TestCase):
342 def test_get_flavor_details__successful__get_flavor(self):
343 compute_desc_id = "compute-id-1"
Dario Faccinf5d65b52023-06-19 12:35:33 +0200344 result = VnfSpecifications._get_flavor_details(compute_desc_id, sample_vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300345 self.assertEqual(result, flavor_1)
346
347 def test_get_flavor_details__empty_compute_desc__flavor_is_none(self):
348 compute_desc_id = ""
Dario Faccinf5d65b52023-06-19 12:35:33 +0200349 result = VnfSpecifications._get_flavor_details(compute_desc_id, sample_vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300350 self.assertEqual(result, None)
351
352 def test_get_flavor_details__compute_desc_not_found__flavor_is_none(self):
353 compute_desc_id = "compute-id-5"
Dario Faccinf5d65b52023-06-19 12:35:33 +0200354 result = VnfSpecifications._get_flavor_details(compute_desc_id, sample_vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300355 self.assertEqual(result, None)
356
357 def test_get_flavor_details__empty_vnfd__flavor_is_none(self):
358 compute_desc_id = "compute-id-5"
Dario Faccinf5d65b52023-06-19 12:35:33 +0200359 result = VnfSpecifications._get_flavor_details(compute_desc_id, {})
Gulsum Atici50d12e02023-04-27 16:41:43 +0300360 self.assertEqual(result, None)
361
362 def test_get_flavor_details__wrong_vnfd_format__flavor_is_none(self):
363 compute_desc_id = "compute-id-2"
364 sample_vnfd = {
365 "_id": vnfd_id,
366 "vdu": [vdu],
367 "virtual-compute-desc": [
368 {
369 "virtual-memory": {"size": "4"},
370 }
371 ],
372 }
Dario Faccinf5d65b52023-06-19 12:35:33 +0200373 result = VnfSpecifications._get_flavor_details(compute_desc_id, sample_vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300374 self.assertEqual(result, None)
375
Dario Faccinf5d65b52023-06-19 12:35:33 +0200376 @patch("osm_lcm.temporal.vnf_activities.VnfSpecifications._get_flavor_details")
Gulsum Atici50d12e02023-04-27 16:41:43 +0300377 def test_get_compute_constraints__succeeded__get_constraints(
378 self, mock_get_flavor_details
379 ):
380 mock_get_flavor_details.return_value = flavor_1
Dario Faccinf5d65b52023-06-19 12:35:33 +0200381 result = VnfSpecifications.get_compute_constraints(vdu, sample_vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300382 self.assertEqual(VduComputeConstraints(cores=2, mem=4), result)
383
Dario Faccinf5d65b52023-06-19 12:35:33 +0200384 @patch("osm_lcm.temporal.vnf_activities.VnfSpecifications._get_flavor_details")
Gulsum Atici50d12e02023-04-27 16:41:43 +0300385 def test_get_compute_constraints__empty_flavor_details__no_constraints(
386 self, mock_get_flavor_details
387 ):
388 mock_get_flavor_details.return_value = {}
Dario Faccinf5d65b52023-06-19 12:35:33 +0200389 result = VnfSpecifications.get_compute_constraints(vdu, sample_vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300390 self.assertEqual(VduComputeConstraints(cores=0, mem=0), result)
391
Dario Faccinf5d65b52023-06-19 12:35:33 +0200392 @patch("osm_lcm.temporal.vnf_activities.VnfSpecifications._get_flavor_details")
Gulsum Atici50d12e02023-04-27 16:41:43 +0300393 def test_get_compute_constraints__flavor_details_is_none__no_constraints(
394 self, mock_get_flavor_details
395 ):
396 mock_get_flavor_details.return_value = None
Dario Faccinf5d65b52023-06-19 12:35:33 +0200397 result = VnfSpecifications.get_compute_constraints(vdu, sample_vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300398 self.assertEqual(VduComputeConstraints(cores=0, mem=0), result)
399
Dario Faccinf5d65b52023-06-19 12:35:33 +0200400 @patch("osm_lcm.temporal.vnf_activities.VnfSpecifications._get_flavor_details")
Gulsum Atici50d12e02023-04-27 16:41:43 +0300401 def test_get_compute_constraints__flavor_has_only_cpu__get_cpu_constraint(
402 self, mock_get_flavor_details
403 ):
404 mock_get_flavor_details.return_value = flavor_2
Dario Faccinf5d65b52023-06-19 12:35:33 +0200405 result = VnfSpecifications.get_compute_constraints(vdu, sample_vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300406 self.assertEqual(VduComputeConstraints(cores=2, mem=0), result)
407
Dario Faccinf5d65b52023-06-19 12:35:33 +0200408 @patch("osm_lcm.temporal.vnf_activities.VnfSpecifications._get_flavor_details")
Gulsum Atici50d12e02023-04-27 16:41:43 +0300409 def test_get_compute_constraints__flavor_has_only_memory__get_memory_constraint(
410 self, mock_get_flavor_details
411 ):
412 mock_get_flavor_details.return_value = flavor_3
Dario Faccinf5d65b52023-06-19 12:35:33 +0200413 result = VnfSpecifications.get_compute_constraints(vdu, sample_vnfd)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300414 self.assertEqual(VduComputeConstraints(cores=0, mem=4), result)
415
416 def test_list_to_dict__config_has_several_items__get_expected_dict(self):
417 config = [
418 {"key": "config::domain_name1", "value": "osm.org"},
419 {"key": "domain_name2", "value": "osm.com"},
420 ]
Dario Faccinf5d65b52023-06-19 12:35:33 +0200421 result = VnfSpecifications._list_to_dict(config)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300422 self.assertEqual(
423 result, {"config::domain_name1": "osm.org", "domain_name2": "osm.com"}
424 )
425
426 def test_list_to_dict__empty_input__get_empty_dict(self):
427 config = []
Dario Faccinf5d65b52023-06-19 12:35:33 +0200428 result = VnfSpecifications._list_to_dict(config)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300429 self.assertEqual(result, {})
430
431 def test_get_only_config_items__with_identifier__get_expected_config(self):
432 config = {"config::redirect-map": "https://osm.instantiation.params"}
Dario Faccinf5d65b52023-06-19 12:35:33 +0200433 result = VnfSpecifications._get_only_config_items(config)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300434 self.assertEqual(result, {"redirect-map": "https://osm.instantiation.params"})
435
436 def test_get_only_config_items__without_identifier__no_config(self):
437 config = {"key": "domain_name1", "value": "osm.org"}
Dario Faccinf5d65b52023-06-19 12:35:33 +0200438 result = VnfSpecifications._get_only_config_items(config)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300439 self.assertEqual(result, {})
440
441 def test_get_only_config_items__empty_input__no_config(self):
442 config = {}
Dario Faccinf5d65b52023-06-19 12:35:33 +0200443 result = VnfSpecifications._get_only_config_items(config)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300444 self.assertEqual(result, {})
445
446 def test_get_vdu_instantiation_params__empty_vnf_config__get_params(self):
Dario Faccinf5d65b52023-06-19 12:35:33 +0200447 result = VnfSpecifications.get_vdu_instantiation_params(vdu_id, vnf_config)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300448 self.assertEqual(
449 result, {"config::redirect-map": "https://osm.instantiation.params"}
450 )
451
452 def test_get_vdu_instantiation_params__empty_vnf_config__no_params(self):
Dario Faccinf5d65b52023-06-19 12:35:33 +0200453 result = VnfSpecifications.get_vdu_instantiation_params(vdu_id, {})
Gulsum Atici50d12e02023-04-27 16:41:43 +0300454 self.assertEqual(result, {})
455
456 def test_get_vdu_instantiation_params__vdu_id_mismatch__no_params(self):
457 config = deepcopy(vnf_config)
458 config["vdu"][0]["id"] = "other-vdu-id"
Dario Faccinf5d65b52023-06-19 12:35:33 +0200459 result = VnfSpecifications.get_vdu_instantiation_params(vdu_id, config)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300460 self.assertEqual(result, {})
461
462 def test_get_vdu_instantiation_params__empty_configurable_properties__no_params(
463 self,
464 ):
465 config = deepcopy(vnf_config)
466 config["vdu"][0]["configurable-properties"] = {}
Dario Faccinf5d65b52023-06-19 12:35:33 +0200467 result = VnfSpecifications.get_vdu_instantiation_params(vdu_id, config)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300468 self.assertEqual(result, {})
469
Dario Faccinf5d65b52023-06-19 12:35:33 +0200470 @patch("osm_lcm.temporal.vnf_activities.VnfSpecifications._get_only_config_items")
471 @patch("osm_lcm.temporal.vnf_activities.VnfSpecifications._list_to_dict")
Gulsum Atici50d12e02023-04-27 16:41:43 +0300472 def test_get_application_config__instantiate_config_overrides_vdu_config__get_expected_application_config(
473 self,
474 mock_list_to_dict,
475 mock_get_only_config_items,
476 ):
477 vdu_instantiate_config = {"config::domain_name1": "osm.public"}
478 mock_get_only_config_items.side_effect = [
479 {
480 "domain_name1": "osm.org",
481 "domain_name2": "osm.com",
482 },
483 {"domain_name1": "osm.public"},
484 ]
Dario Faccinf5d65b52023-06-19 12:35:33 +0200485 result = VnfSpecifications.get_application_config(vdu, vdu_instantiate_config)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300486 self.assertEqual(
487 result, {"domain_name1": "osm.public", "domain_name2": "osm.com"}
488 )
489
Dario Faccinf5d65b52023-06-19 12:35:33 +0200490 @patch("osm_lcm.temporal.vnf_activities.VnfSpecifications._get_only_config_items")
491 @patch("osm_lcm.temporal.vnf_activities.VnfSpecifications._list_to_dict")
Gulsum Atici50d12e02023-04-27 16:41:43 +0300492 def test_get_application_config__empty_instantiate_config__get_descriptor_config(
493 self,
494 mock_list_to_dict,
495 mock_get_only_config_items,
496 ):
497 vdu_instantiate_config = {}
498 mock_get_only_config_items.side_effect = [
499 {
500 "domain_name1": "osm.org",
501 "domain_name2": "osm.com",
502 },
503 {},
504 ]
Dario Faccinf5d65b52023-06-19 12:35:33 +0200505 result = VnfSpecifications.get_application_config(vdu, vdu_instantiate_config)
Gulsum Atici50d12e02023-04-27 16:41:43 +0300506 self.assertEqual(result, app_config)
507
Dario Faccinf5d65b52023-06-19 12:35:33 +0200508 @patch("osm_lcm.temporal.vnf_activities.VnfSpecifications._get_only_config_items")
509 @patch("osm_lcm.temporal.vnf_activities.VnfSpecifications._list_to_dict")
Gulsum Atici50d12e02023-04-27 16:41:43 +0300510 def test_get_application_config__no_config__empty_application_config(
511 self,
512 mock_list_to_dict,
513 mock_get_only_config_items,
514 ):
515 vdu_instantiate_config = {}
516 vdu_copy = deepcopy(vdu)
517 vdu_copy["configurable-properties"] = []
518 mock_get_only_config_items.side_effect = [{}, {}]
Dario Faccinf5d65b52023-06-19 12:35:33 +0200519 result = VnfSpecifications.get_application_config(
520 vdu_copy, vdu_instantiate_config
521 )
Gulsum Atici50d12e02023-04-27 16:41:43 +0300522 self.assertEqual(result, {})
Gulsum Aticia1898b42023-04-25 15:48:10 +0300523
524
Daniel Arndtc5982f52023-07-10 09:51:58 -0300525class TestGetModelNames(asynctest.TestCase):
526 async def setUp(self):
527 self.db = Mock()
528 self.get_model_names = GetModelNamesImpl(self.db)
529 self.env = ActivityEnvironment()
530
531 async def test_activity__success(self):
532 # Two namespaces, one of them repeated
533 self.db.get_list.return_value = [
534 {
535 "nsr-id-ref": nsr_uuid,
536 "namespace": namespace,
537 }
538 for namespace in ["namespace1", "namespace1", "namespace2"]
539 ]
540
541 activity_result = await self.env.run(
542 self.get_model_names,
543 GetModelNamesImpl.Input(ns_uuid=nsr_uuid),
544 )
545
546 self.assertEqual(activity_result.model_names, {"namespace1", "namespace2"})
547
548 async def test_activity__raise_db_exception(self):
549 self.db.get_list.side_effect = DbException("Can not connect to Database.")
550
551 with self.assertRaises(DbException):
552 await self.env.run(
553 self.get_model_names,
554 GetModelNamesImpl.Input(ns_uuid=nsr_uuid),
555 )
556
557
Gulsum Atici36365402023-04-07 00:07:07 +0300558if __name__ == "__main__":
559 asynctest.main()