1 # Copyright 2020 Canonical Ltd.
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.
18 from unittest
.mock
import Mock
, MagicMock
19 from unittest
.mock
import patch
23 from n2vc
.definitions
import Offer
, RelationEndpoint
24 from n2vc
.n2vc_juju_conn
import N2VCJujuConnector
25 from osm_common
import fslocal
26 from osm_common
.dbmemory
import DbMemory
27 from n2vc
.exceptions
import (
28 N2VCBadArgumentsException
,
30 JujuApplicationNotFound
,
32 from n2vc
.tests
.unit
.utils
import AsyncMock
33 from n2vc
.vca
.connection_data
import ConnectionData
34 from n2vc
.tests
.unit
.testdata
import test_db_descriptors
as descriptors
38 class N2VCJujuConnTestCase(asynctest
.TestCase
):
39 @asynctest.mock
.patch("n2vc.n2vc_juju_conn.MotorStore")
40 @asynctest.mock
.patch("n2vc.n2vc_juju_conn.get_connection")
41 @asynctest.mock
.patch("n2vc.vca.connection_data.base64_to_cacert")
43 self
, mock_base64_to_cacert
=None, mock_get_connection
=None, mock_store
=None
45 self
.loop
= asyncio
.get_event_loop()
47 mock_base64_to_cacert
.return_value
= """
48 -----BEGIN CERTIFICATE-----
50 -----END CERTIFICATE-----"""
51 mock_store
.return_value
= AsyncMock()
52 mock_vca_connection
= Mock()
53 mock_get_connection
.return_value
= mock_vca_connection
54 mock_vca_connection
.data
.return_value
= ConnectionData(
56 "endpoints": ["1.2.3.4:17070"],
62 "lxd-credentials": "credentials",
63 "k8s-cloud": "k8s_cloud",
64 "k8s-credentials": "k8s_credentials",
66 "api-proxy": "api_proxy",
69 logging
.disable(logging
.CRITICAL
)
71 N2VCJujuConnector
.get_public_key
= Mock()
72 self
.n2vc
= N2VCJujuConnector(
79 N2VCJujuConnector
.get_public_key
.assert_not_called()
80 self
.n2vc
.libjuju
= Mock()
83 class GetMetricssTest(N2VCJujuConnTestCase
):
85 super(GetMetricssTest
, self
).setUp()
86 self
.n2vc
.libjuju
.get_metrics
= AsyncMock()
88 def test_success(self
):
89 _
= self
.loop
.run_until_complete(self
.n2vc
.get_metrics("model", "application"))
90 self
.n2vc
.libjuju
.get_metrics
.assert_called_once()
92 def test_except(self
):
93 self
.n2vc
.libjuju
.get_metrics
.side_effect
= Exception()
94 with self
.assertRaises(Exception):
95 _
= self
.loop
.run_until_complete(
96 self
.n2vc
.get_metrics("model", "application")
98 self
.n2vc
.libjuju
.get_metrics
.assert_called_once()
101 class UpdateVcaStatusTest(N2VCJujuConnTestCase
):
103 super(UpdateVcaStatusTest
, self
).setUp()
104 self
.n2vc
.libjuju
.get_controller
= AsyncMock()
105 self
.n2vc
.libjuju
.get_model
= AsyncMock()
106 self
.n2vc
.libjuju
.get_executed_actions
= AsyncMock()
107 self
.n2vc
.libjuju
.get_actions
= AsyncMock()
108 self
.n2vc
.libjuju
.get_application_configs
= AsyncMock()
109 self
.n2vc
.libjuju
._get
_application
= AsyncMock()
114 self
.loop
.run_until_complete(
115 self
.n2vc
.update_vca_status(
116 {"model": {"applications": {"app": {"actions": {}}}}}
119 self
.n2vc
.libjuju
.get_executed_actions
.assert_called_once()
120 self
.n2vc
.libjuju
.get_actions
.assert_called_once()
121 self
.n2vc
.libjuju
.get_application_configs
.assert_called_once()
123 def test_exception(self
):
124 self
.n2vc
.libjuju
.get_model
.return_value
= None
125 self
.n2vc
.libjuju
.get_executed_actions
.side_effect
= Exception()
126 with self
.assertRaises(Exception):
127 self
.loop
.run_until_complete(
128 self
.n2vc
.update_vca_status(
129 {"model": {"applications": {"app": {"actions": {}}}}}
132 self
.n2vc
.libjuju
.get_executed_actions
.assert_not_called()
133 self
.n2vc
.libjuju
.get_actions
.assert_not_called_once()
134 self
.n2vc
.libjuju
.get_application_configs
.assert_not_called_once()
137 class K8sProxyCharmsTest(N2VCJujuConnTestCase
):
139 super(K8sProxyCharmsTest
, self
).setUp()
140 self
.n2vc
.libjuju
.model_exists
= AsyncMock()
141 self
.n2vc
.libjuju
.add_model
= AsyncMock()
142 self
.n2vc
.libjuju
.deploy_charm
= AsyncMock()
143 self
.n2vc
.libjuju
.model_exists
.return_value
= False
145 self
.fs
= fslocal
.FsLocal()
147 self
.n2vc
.fs
= self
.fs
148 self
.n2vc
.db
= self
.db
149 self
.db
.create_list("nsrs", yaml
.safe_load(descriptors
.db_nsrs_text
))
150 self
.db
.create_list("vnfrs", yaml
.safe_load(descriptors
.db_vnfrs_text
))
153 "n2vc.n2vc_juju_conn.generate_random_alfanum_string",
154 **{"return_value": "random"}
156 def test_success(self
, mock_generate_random_alfanum_string
):
157 self
.n2vc
.fs
.file_exists
= MagicMock(create_autospec
=True)
158 self
.n2vc
.fs
.file_exists
.return_value
= True
159 ee_id
= self
.loop
.run_until_complete(
160 self
.n2vc
.install_k8s_proxy_charm(
162 ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898.1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0",
168 self
.n2vc
.libjuju
.add_model
.assert_called_once()
169 self
.n2vc
.libjuju
.deploy_charm
.assert_called_once_with(
170 model_name
="dbfbd751-3de4-4e68-bd40-ec5ae0a53898-k8s",
171 application_name
="simple-ee-z0-vnf1-vnf",
175 progress_timeout
=None,
180 ee_id
, "dbfbd751-3de4-4e68-bd40-ec5ae0a53898-k8s.simple-ee-z0-vnf1-vnf.k8s"
183 def test_no_artifact_path(
186 with self
.assertRaises(N2VCBadArgumentsException
):
187 ee_id
= self
.loop
.run_until_complete(
188 self
.n2vc
.install_k8s_proxy_charm(
190 ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898.1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0",
195 self
.assertIsNone(ee_id
)
200 with self
.assertRaises(N2VCBadArgumentsException
):
201 ee_id
= self
.loop
.run_until_complete(
202 self
.n2vc
.install_k8s_proxy_charm(
204 ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898.1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0",
209 self
.assertIsNone(ee_id
)
211 def test_file_not_exists(
214 self
.n2vc
.fs
.file_exists
= MagicMock(create_autospec
=True)
215 self
.n2vc
.fs
.file_exists
.return_value
= False
216 with self
.assertRaises(N2VCBadArgumentsException
):
217 ee_id
= self
.loop
.run_until_complete(
218 self
.n2vc
.install_k8s_proxy_charm(
220 ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898.1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0",
225 self
.assertIsNone(ee_id
)
230 self
.n2vc
.fs
.file_exists
= MagicMock(create_autospec
=True)
231 self
.n2vc
.fs
.file_exists
.return_value
= True
232 self
.n2vc
.fs
.path
= MagicMock(create_autospec
=True)
233 self
.n2vc
.fs
.path
.return_value
= "path"
234 self
.n2vc
.libjuju
.deploy_charm
.side_effect
= Exception()
235 with self
.assertRaises(N2VCException
):
236 ee_id
= self
.loop
.run_until_complete(
237 self
.n2vc
.install_k8s_proxy_charm(
239 ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898.1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0",
244 self
.assertIsNone(ee_id
)
247 class AddRelationTest(N2VCJujuConnTestCase
):
249 super(AddRelationTest
, self
).setUp()
250 self
.n2vc
.libjuju
.add_relation
= AsyncMock()
251 self
.n2vc
.libjuju
.offer
= AsyncMock()
252 self
.n2vc
.libjuju
.get_controller
= AsyncMock()
253 self
.n2vc
.libjuju
.consume
= AsyncMock()
255 def test_standard_relation_same_model_and_controller(self
):
256 relation_endpoint_1
= RelationEndpoint("model-1.app1.0", None, "endpoint1")
257 relation_endpoint_2
= RelationEndpoint("model-1.app2.1", None, "endpoint2")
258 self
.loop
.run_until_complete(
259 self
.n2vc
.add_relation(relation_endpoint_1
, relation_endpoint_2
)
261 self
.n2vc
.libjuju
.add_relation
.assert_called_once_with(
262 model_name
="model-1",
263 endpoint_1
="app1:endpoint1",
264 endpoint_2
="app2:endpoint2",
266 self
.n2vc
.libjuju
.offer
.assert_not_called()
267 self
.n2vc
.libjuju
.consume
.assert_not_called()
269 def test_cmr_relation_same_controller(self
):
270 relation_endpoint_1
= RelationEndpoint("model-1.app1.0", None, "endpoint")
271 relation_endpoint_2
= RelationEndpoint("model-2.app2.1", None, "endpoint")
272 offer
= Offer("admin/model-1.app1")
273 self
.n2vc
.libjuju
.offer
.return_value
= offer
274 self
.n2vc
.libjuju
.consume
.return_value
= "saas"
275 self
.loop
.run_until_complete(
276 self
.n2vc
.add_relation(relation_endpoint_1
, relation_endpoint_2
)
278 self
.n2vc
.libjuju
.offer
.assert_called_once_with(relation_endpoint_1
)
279 self
.n2vc
.libjuju
.consume
.assert_called_once()
280 self
.n2vc
.libjuju
.add_relation
.assert_called_once_with(
281 "model-2", "app2:endpoint", "saas"
284 def test_cmr_relation_different_controller(self
):
285 self
.n2vc
._get
_libjuju
= AsyncMock(return_value
=self
.n2vc
.libjuju
)
286 relation_endpoint_1
= RelationEndpoint(
287 "model-1.app1.0", "vca-id-1", "endpoint1"
289 relation_endpoint_2
= RelationEndpoint(
290 "model-1.app2.1", "vca-id-2", "endpoint2"
292 offer
= Offer("admin/model-1.app1")
293 self
.n2vc
.libjuju
.offer
.return_value
= offer
294 self
.n2vc
.libjuju
.consume
.return_value
= "saas"
295 self
.loop
.run_until_complete(
296 self
.n2vc
.add_relation(relation_endpoint_1
, relation_endpoint_2
)
298 self
.n2vc
.libjuju
.offer
.assert_called_once_with(relation_endpoint_1
)
299 self
.n2vc
.libjuju
.consume
.assert_called_once()
300 self
.n2vc
.libjuju
.add_relation
.assert_called_once_with(
301 "model-1", "app2:endpoint2", "saas"
304 def test_relation_exception(self
):
305 relation_endpoint_1
= RelationEndpoint("model-1.app1.0", None, "endpoint")
306 relation_endpoint_2
= RelationEndpoint("model-2.app2.1", None, "endpoint")
307 self
.n2vc
.libjuju
.offer
.side_effect
= Exception()
308 with self
.assertRaises(N2VCException
):
309 self
.loop
.run_until_complete(
310 self
.n2vc
.add_relation(relation_endpoint_1
, relation_endpoint_2
)
314 class UpgradeCharmTest(N2VCJujuConnTestCase
):
316 super(UpgradeCharmTest
, self
).setUp()
317 self
.n2vc
._get
_libjuju
= AsyncMock(return_value
=self
.n2vc
.libjuju
)
318 N2VCJujuConnector
._get
_ee
_id
_components
= Mock()
319 self
.n2vc
.libjuju
.upgrade_charm
= AsyncMock()
321 def test_empty_ee_id(self
):
322 with self
.assertRaises(N2VCBadArgumentsException
):
323 self
.loop
.run_until_complete(
324 self
.n2vc
.upgrade_charm(
325 "", "/sample_charm_path", "sample_charm_id", "native-charm", None
328 self
.n2vc
._get
_libjuju
.assert_called()
329 self
.n2vc
._get
_ee
_id
_components
.assert_not_called()
330 self
.n2vc
.libjuju
.upgrade_charm
.assert_not_called()
332 def test_wrong_ee_id(self
):
333 N2VCJujuConnector
._get
_ee
_id
_components
.side_effect
= Exception
334 with self
.assertRaises(N2VCBadArgumentsException
):
335 self
.loop
.run_until_complete(
336 self
.n2vc
.upgrade_charm(
337 "ns-id-k8s.app-vnf-vnf-id-vdu-vdu-random.k8s",
338 "/sample_charm_path",
344 self
.n2vc
._get
_libjuju
.assert_called()
345 self
.n2vc
._get
_ee
_id
_components
.assert_called()
346 self
.n2vc
.libjuju
.upgrade_charm
.assert_not_called()
348 def test_charm_upgrade_succeded(self
):
349 N2VCJujuConnector
._get
_ee
_id
_components
.return_value
= (
354 self
.loop
.run_until_complete(
355 self
.n2vc
.upgrade_charm(
356 "ns-id-k8s.app-vnf-vnf-id-vdu-vdu-random.k8s",
357 "/sample_charm_path",
363 self
.n2vc
._get
_libjuju
.assert_called()
364 self
.n2vc
._get
_ee
_id
_components
.assert_called()
365 self
.n2vc
.libjuju
.upgrade_charm
.assert_called_with(
366 application_name
="sample_app",
367 path
="/sample_charm_path",
368 model_name
="sample_model",
372 def test_charm_upgrade_failed(self
):
373 N2VCJujuConnector
._get
_ee
_id
_components
.return_value
= (
378 self
.n2vc
.libjuju
.upgrade_charm
.side_effect
= JujuApplicationNotFound
379 with self
.assertRaises(N2VCException
):
380 self
.loop
.run_until_complete(
381 self
.n2vc
.upgrade_charm(
382 "ns-id-k8s.app-vnf-vnf-id-vdu-vdu-random.k8s",
383 "/sample_charm_path",
389 self
.n2vc
._get
_libjuju
.assert_called()
390 self
.n2vc
._get
_ee
_id
_components
.assert_called()
391 self
.n2vc
.libjuju
.upgrade_charm
.assert_called_with(
392 application_name
="sample_app",
393 path
="/sample_charm_path",
394 model_name
="sample_model",
399 class GenerateApplicationNameTest(N2VCJujuConnTestCase
):
401 vnf_id
= "dbfbd751-3de4-4e68-bd40-ec5ae0a53898"
404 super(GenerateApplicationNameTest
, self
).setUp()
405 self
.db
= MagicMock(DbMemory
)
408 "n2vc.n2vc_juju_conn.generate_random_alfanum_string",
409 **{"return_value": "random"}
411 def test_generate_backward_compatible_application_name(
412 self
, mock_generate_random_alfanum
416 expected_result
= "app-vnf-ec5ae0a53898-vdu-mgmtVM-cnt-0-random"
418 application_name
= self
.n2vc
._generate
_backward
_compatible
_application
_name
(
419 GenerateApplicationNameTest
.vnf_id
, vdu_id
, vdu_count
421 self
.assertEqual(application_name
, expected_result
)
424 "n2vc.n2vc_juju_conn.generate_random_alfanum_string",
425 **{"return_value": "random"}
427 def test_generate_backward_compatible_application_name_without_vnf_id_vdu_id(
428 self
, mock_generate_random_alfanum
433 expected_result
= "app--random"
434 application_name
= self
.n2vc
._generate
_backward
_compatible
_application
_name
(
435 vnf_id
, vdu_id
, vdu_count
438 self
.assertEqual(application_name
, expected_result
)
439 self
.assertLess(len(application_name
), 50)
441 def test_find_charm_level_with_vnf_id(self
):
443 expected_result
= "vnf-level"
444 charm_level
= self
.n2vc
._find
_charm
_level
(
445 GenerateApplicationNameTest
.vnf_id
, vdu_id
447 self
.assertEqual(charm_level
, expected_result
)
449 def test_find_charm_level_with_vdu_id(self
):
452 with self
.assertRaises(N2VCException
):
453 self
.n2vc
._find
_charm
_level
(vnf_id
, vdu_id
)
455 def test_find_charm_level_with_vnf_id_and_vdu_id(self
):
457 expected_result
= "vdu-level"
458 charm_level
= self
.n2vc
._find
_charm
_level
(
459 GenerateApplicationNameTest
.vnf_id
, vdu_id
461 self
.assertEqual(charm_level
, expected_result
)
463 def test_find_charm_level_without_vnf_id_and_vdu_id(self
):
466 expected_result
= "ns-level"
467 charm_level
= self
.n2vc
._find
_charm
_level
(vnf_id
, vdu_id
)
468 self
.assertEqual(charm_level
, expected_result
)
470 def test_generate_application_name_ns_charm(self
):
471 charm_level
= "ns-level"
475 "target_element": "ns",
476 "member-vnf-index": "",
479 "vdu_count_index": None,
482 "type": "proxy_charm",
483 "ee_descriptor_id": None,
484 "charm_name": "simple-ns-charm-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh",
487 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
493 expected_result
= "simple-ns-charm-abc-000-rrrr-nnnn-4444-h-ns"
494 application_name
= self
.n2vc
._generate
_application
_name
(
502 self
.assertEqual(application_name
, expected_result
)
503 self
.assertLess(len(application_name
), 50)
505 def test_generate_application_name_ns_charm_empty_vca_records(self
):
506 charm_level
= "ns-level"
512 with self
.assertRaises(N2VCException
):
513 self
.n2vc
._generate
_application
_name
(
522 def test_generate_application_name_vnf_charm(self
):
523 charm_level
= "vnf-level"
524 vnfrs
= {"member-vnf-index-ref": "vnf111-xxx-yyy-zzz"}
527 "target_element": "vnf/vnf1",
528 "member-vnf-index": "vnf111-xxx-yyy-zzz",
529 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
530 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
532 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
538 expected_result
= "simple-ee-ab-1-vnf111-xxx-y-vnf"
539 application_name
= self
.n2vc
._generate
_application
_name
(
547 self
.assertEqual(application_name
, expected_result
)
548 self
.assertLess(len(application_name
), 50)
550 def test_generate_application_name_vdu_charm_kdu_name_in_vca_record_is_none(self
):
551 charm_level
= "vdu-level"
553 "member-vnf-index-ref": "vnf111-xxx-yyy-zzz",
555 {"_id": "38912ff7-5bdd-4228-911f-c2bee259c44a", "vdu-id-ref": "mgmtVM"},
556 {"_id": "45512ff7-5bdd-4228-911f-c2bee259c44a", "vdu-id-ref": "dataVM"},
561 "target_element": "vnf/vnf1/mgmtvm",
562 "member-vnf-index": "vnf111-xxx-yyy-zzz",
565 "vdu_count_index": None,
566 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
567 "vdu_name": "mgmtvm",
568 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
570 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
573 "target_element": "vnf/vnf1/dataVM",
574 "member-vnf-index": "vnf111-xxx-yyy-zzz",
577 "vdu_count_index": None,
578 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
579 "vdu_name": "datavm",
580 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-8888-hhh-3333-yyyy-888-hhh-ttt-444",
582 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
588 expected_result
= "simple-ee-ab-2-vnf111-xxx-y-mgmtVM-0-vdu"
589 application_name
= self
.n2vc
._generate
_application
_name
(
597 self
.assertEqual(application_name
, expected_result
)
598 self
.assertLess(len(application_name
), 50)
600 def test_generate_application_name_vdu_charm_vdu_id_kdu_name_in_vca_record_are_both_set(
603 charm_level
= "vdu-level"
605 "member-vnf-index-ref": "vnf111-xxx-yyy-zzz",
607 {"_id": "38912ff7-5bdd-4228-911f-c2bee259c44a", "vdu-id-ref": "mgmtVM"},
608 {"_id": "45512ff7-5bdd-4228-911f-c2bee259c44a", "vdu-id-ref": "dataVM"},
613 "target_element": "vnf/vnf1/mgmtVM",
614 "member-vnf-index": "vnf111-xxx-yyy-zzz",
616 "kdu_name": "mgmtVM",
617 "vdu_count_index": None,
618 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
619 "vdu_name": "mgmtvm",
620 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
622 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
625 "target_element": "vnf/vnf1/dataVM",
626 "member-vnf-index": "vnf111-xxx-yyy-zzz",
629 "vdu_count_index": None,
630 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
631 "vdu_name": "datavm",
632 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-8888-hhh-3333-yyyy-888-hhh-ttt-444",
634 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
640 expected_result
= "simple-ee-ab-2-vnf111-xxx-y-mgmtVM-0-vdu"
641 application_name
= self
.n2vc
._generate
_application
_name
(
649 self
.assertEqual(application_name
, expected_result
)
650 self
.assertLess(len(application_name
), 50)
652 def test_generate_application_name_vdu_charm_both_vdu_id_kdu_name_in_vca_record_are_none(
655 charm_level
= "vdu-level"
656 vnfrs
= {"member-vnf-index-ref": "vnf111-xxx-yyy-zzz"}
659 "target_element": "vnf/vnf1/mgmtVM",
660 "member-vnf-index": "vnf111-xxx-yyy-zzz",
663 "vdu_count_index": None,
664 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
665 "vdu_name": "mgmtvm",
666 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
668 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
674 with self
.assertRaises(KeyError):
675 self
.n2vc
._generate
_application
_name
(
684 def test_generate_application_name_vdu_charm_given_vdu_id_is_none(self
):
685 charm_level
= "vdu-level"
686 vnfrs
= {"member-vnf-index-ref": "vnf111-xxx-yyy-zzz"}
689 "target_element": "vnf/vnf1/mgmtvVM",
690 "member-vnf-index": "vnf111-xxx-yyy-zzz",
692 "kdu_name": "mgmtVM",
693 "vdu_count_index": None,
694 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
695 "vdu_name": "mgmtvm",
696 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
698 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
704 with self
.assertRaises(N2VCException
):
705 self
.n2vc
._generate
_application
_name
(
714 def test_generate_application_name_vdu_charm_vdu_id_does_not_match_with_the_key_in_vca_record(
717 charm_level
= "vdu-level"
718 vnfrs
= {"member-vnf-index-ref": "vnf111-xxx-yyy-zzz"}
721 "target_element": "vnf/vnf1/mgmtVM",
722 "member-vnf-index": "vnf111-xxx-yyy-zzz",
724 "kdu_name": "mgmtVM",
725 "vdu_count_index": None,
726 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
727 "vdu_name": "mgmtvm",
728 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
730 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
736 with self
.assertRaises(KeyError):
737 self
.n2vc
._generate
_application
_name
(
746 def test_generate_application_name_vdu_charm_vdu_id_in_vca_record_is_none(self
):
747 charm_level
= "vdu-level"
748 vnfrs
= {"member-vnf-index-ref": "vnf111-xxx-yyy-zzz"}
751 "target_element": "vnf/vnf1/mgmtVM",
752 "member-vnf-index": "vnf111-xxx-yyy-zzz",
754 "kdu_name": "mgmtVM",
755 "vdu_count_index": None,
756 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
757 "vdu_name": "mgmtvm",
758 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
760 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
766 expected_result
= "simple-ee-ab-2-vnf111-xxx-y-mgmtVM-0-vdu"
767 application_name
= self
.n2vc
._generate
_application
_name
(
775 self
.assertEqual(application_name
, expected_result
)
776 self
.assertLess(len(application_name
), 50)
778 def test_get_vnf_count_db_vnfr_ns_charm(self
):
779 self
.db
.get_one
.return_value
= {"member-vnf-index-ref": "sample-ref"}
780 charm_level
= "ns-level"
781 vnf_id_and_count
= "m7fbd751-3de4-4e68-bd40-ec5ae0a53898-4"
782 with patch
.object(self
.n2vc
, "db", self
.db
):
783 vnf_count
, db_vnfr
= self
.n2vc
._get
_vnf
_count
_and
_record
(
784 charm_level
, vnf_id_and_count
786 self
.assertEqual(vnf_count
, "")
787 self
.assertEqual(db_vnfr
, {})
789 def test_get_vnf_count_db_vnfr_vnf_charm(self
):
790 self
.db
.get_one
.return_value
= {"member-vnf-index-ref": "sample-ref"}
791 charm_level
= "vnf-level"
792 vnf_id_and_count
= "m7fbd751-3de4-4e68-bd40-ec5ae0a53898-4"
793 with patch
.object(self
.n2vc
, "db", self
.db
):
794 vnf_count
, db_vnfr
= self
.n2vc
._get
_vnf
_count
_and
_record
(
795 charm_level
, vnf_id_and_count
797 self
.assertEqual(vnf_count
, "4")
798 self
.assertEqual(db_vnfr
, {"member-vnf-index-ref": "sample-ref"})
800 def test_get_vnf_count_db_vnfr_vdu_charm(self
):
801 self
.db
.get_one
.return_value
= {"member-vnf-index-ref": "sample-ref"}
802 charm_level
= "vdu-level"
803 vnf_id_and_count
= "m7fbd751-3de4-4e68-bd40-ec5ae0a53898-2"
804 with patch
.object(self
.n2vc
, "db", self
.db
):
805 vnf_count
, db_vnfr
= self
.n2vc
._get
_vnf
_count
_and
_record
(
806 charm_level
, vnf_id_and_count
808 self
.assertEqual(vnf_count
, "2")
809 self
.assertEqual(db_vnfr
, {"member-vnf-index-ref": "sample-ref"})
811 def test_get_vca_records_vdu_charm(self
):
812 charm_level
= "vdu-level"
814 "member-vnf-index-ref": "vnf111-xxx-yyy-zzz",
816 {"_id": "38912ff7-5bdd-4228-911f-c2bee259c44a", "vdu-id-ref": "mgmtVM"},
817 {"_id": "45512ff7-5bdd-4228-911f-c2bee259c44a", "vdu-id-ref": "dataVM"},
825 "target_element": "vnf/vnf1/mgmtvm",
826 "member-vnf-index": "vnf111-xxx-yyy-zzz",
827 "vdu_id": "38912ff7-5bdd-4228-911f-c2bee259c44a",
829 "vdu_count_index": None,
830 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
831 "vdu_name": "mgmtvm",
832 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
834 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
837 "target_element": "vnf/vnf2/datavm",
838 "member-vnf-index": "vnf222-xxx-yyy-zzz",
839 "vdu_id": "45512ff7-5bdd-4228-911f-c2bee259c44a",
841 "vdu_count_index": None,
842 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
843 "vdu_name": "datavm",
844 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-8888-hhh-3333-yyyy-888-hhh-ttt-444",
846 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
854 "target_element": "vnf/vnf1/mgmtvm",
855 "member-vnf-index": "vnf111-xxx-yyy-zzz",
856 "vdu_id": "38912ff7-5bdd-4228-911f-c2bee259c44a",
858 "vdu_count_index": None,
859 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
860 "vdu_name": "mgmtvm",
861 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
863 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
866 vca_records
= self
.n2vc
._get
_vca
_records
(charm_level
, db_nsr
, db_vnfr
)
867 self
.assertEqual(vca_records
, expected_result
)
869 def test_get_vca_records_vnf_charm_member_vnf_index_mismatch(self
):
870 charm_level
= "vnf-level"
871 db_vnfr
= {"member-vnf-index-ref": "vnf222-xxx-yyy-zzz"}
877 "target_element": "vnf/vnf1/mgmtvm",
878 "member-vnf-index": "vnf111-xxx-yyy-zzz",
879 "vdu_id": "38912ff7-5bdd-4228-911f-c2bee259c44a",
881 "vdu_count_index": None,
882 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
883 "vdu_name": "mgmtvm",
884 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
886 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
889 "target_element": "vnf/vnf1/mgmtvm",
890 "member-vnf-index": "vnf111-xxx-yyy-zzz",
891 "vdu_id": "45512ff7-5bdd-4228-911f-c2bee259c44a",
893 "vdu_count_index": None,
894 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
895 "vdu_name": "datavm",
896 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-8888-hhh-3333-yyyy-888-hhh-ttt-444",
898 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
905 vca_records
= self
.n2vc
._get
_vca
_records
(charm_level
, db_nsr
, db_vnfr
)
906 self
.assertEqual(vca_records
, expected_result
)
908 def test_get_vca_records_ns_charm(self
):
909 charm_level
= "ns-level"
910 db_vnfr
= {"member-vnf-index-ref": "vnf222-xxx-yyy-zzz"}
916 "target_element": "vnf/vnf1/mgmtvm",
917 "member-vnf-index": "vnf111-xxx-yyy-zzz",
918 "vdu_id": "38912ff7-5bdd-4228-911f-c2bee259c44a",
920 "vdu_count_index": None,
921 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
922 "vdu_name": "mgmtvm",
923 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
925 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
928 "target_element": "ns",
929 "member-vnf-index": None,
932 "vdu_count_index": None,
935 "ee_descriptor_id": "",
936 "charm_name": "simple-ns-charm-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
937 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
945 "target_element": "ns",
946 "member-vnf-index": None,
949 "vdu_count_index": None,
952 "ee_descriptor_id": "",
953 "charm_name": "simple-ns-charm-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
954 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
957 vca_records
= self
.n2vc
._get
_vca
_records
(charm_level
, db_nsr
, db_vnfr
)
958 self
.assertEqual(vca_records
, expected_result
)
960 def test_get_vca_records_ns_charm_empty_charm_name(self
):
961 charm_level
= "ns-level"
962 db_vnfr
= {"member-vnf-index-ref": "vnf222-xxx-yyy-zzz"}
968 "target_element": "vnf/vnf1/mgmtvm",
969 "member-vnf-index": "vnf111-xxx-yyy-zzz",
970 "vdu_id": "38912ff7-5bdd-4228-911f-c2bee259c44a",
972 "vdu_count_index": None,
973 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
974 "vdu_name": "mgmtvm",
975 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
977 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
980 "target_element": "ns",
981 "member-vnf-index": None,
984 "vdu_count_index": None,
987 "ee_descriptor_id": "",
989 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
997 "target_element": "ns",
998 "member-vnf-index": None,
1001 "vdu_count_index": None,
1004 "ee_descriptor_id": "",
1006 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1009 vca_records
= self
.n2vc
._get
_vca
_records
(charm_level
, db_nsr
, db_vnfr
)
1010 self
.assertEqual(vca_records
, expected_result
)
1012 def test_get_application_name_vnf_charm(self
):
1013 namespace
= ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898.1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0"
1014 self
.db
.get_one
.return_value
= {
1019 "target_element": "vnf/vnf1/mgmtvm",
1020 "member-vnf-index": "vnf111-xxx-yyy-zzz",
1021 "vdu_id": "38912ff7-5bdd-4228-911f-c2bee259c44a",
1023 "vdu_count_index": None,
1024 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
1025 "vdu_name": "mgmtvm",
1026 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
1028 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1031 "target_element": "ns",
1032 "member-vnf-index": None,
1035 "vdu_count_index": None,
1038 "ee_descriptor_id": "",
1040 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1046 mock_vnf_count_and_record
= MagicMock()
1047 db_vnfr
= {"member-vnf-index-ref": "vnf111-xxx-yyy-zzz"}
1049 mock_vnf_count_and_record
.return_value
= (vnf_count
, db_vnfr
)
1050 expected_result
= "simple-ee-ab-z0-vnf111-xxx-y-vnf"
1051 with patch
.object(self
.n2vc
, "db", self
.db
), patch
.object(
1052 self
.n2vc
, "_get_vnf_count_and_record", mock_vnf_count_and_record
1054 application_name
= self
.n2vc
._get
_application
_name
(namespace
)
1055 self
.assertEqual(application_name
, expected_result
)
1056 self
.assertLess(len(application_name
), 50)
1057 mock_vnf_count_and_record
.assert_called_once_with(
1058 "vnf-level", "1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0"
1060 self
.db
.get_one
.assert_called_once()
1063 "n2vc.n2vc_juju_conn.generate_random_alfanum_string",
1064 **{"return_value": "random"}
1066 def test_get_application_name_vnf_charm_old_naming(
1067 self
, mock_generate_random_alfanum
1069 namespace
= ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898.1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0"
1070 self
.db
.get_one
.return_value
= {
1075 "target_element": "vnf/vnf1/mgmtvm",
1076 "member-vnf-index": "vnf111-xxx-yyy-zzz",
1077 "vdu_id": "38912ff7-5bdd-4228-911f-c2bee259c44a",
1079 "vdu_count_index": None,
1080 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
1081 "vdu_name": "mgmtvm",
1082 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
1083 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1086 "target_element": "ns",
1087 "member-vnf-index": None,
1090 "vdu_count_index": None,
1093 "ee_descriptor_id": "",
1094 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1100 mock_vnf_count_and_record
= MagicMock()
1101 db_vnfr
= {"member-vnf-index-ref": "vnf111-xxx-yyy-zzz"}
1103 mock_vnf_count_and_record
.return_value
= (vnf_count
, db_vnfr
)
1104 expected_result
= "app-vnf-eb3161eec0-z0-random"
1105 with patch
.object(self
.n2vc
, "db", self
.db
), patch
.object(
1106 self
.n2vc
, "_get_vnf_count_and_record", mock_vnf_count_and_record
1108 application_name
= self
.n2vc
._get
_application
_name
(namespace
)
1109 self
.assertEqual(application_name
, expected_result
)
1110 mock_vnf_count_and_record
.assert_called_once_with(
1111 "vnf-level", "1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0"
1113 self
.db
.get_one
.assert_called_once()
1115 def test_get_application_name_vnf_charm_vnf_index_ref_mismatch(self
):
1116 namespace
= ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898.1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0"
1117 self
.db
.get_one
.return_value
= {
1122 "target_element": "vnf/vnf1/mgmtvm",
1123 "member-vnf-index": "vnf111-xxx-yyy-zzz",
1124 "vdu_id": "38912ff7-5bdd-4228-911f-c2bee259c44a",
1126 "vdu_count_index": None,
1127 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
1128 "vdu_name": "mgmtvm",
1129 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
1131 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1134 "target_element": "ns",
1135 "member-vnf-index": None,
1138 "vdu_count_index": None,
1141 "ee_descriptor_id": "",
1143 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1149 mock_vnf_count_and_record
= MagicMock()
1150 db_vnfr
= {"member-vnf-index-ref": "vnf222-xxx-yyy-zzz"}
1152 mock_vnf_count_and_record
.return_value
= (vnf_count
, db_vnfr
)
1153 with patch
.object(self
.n2vc
, "db", self
.db
), patch
.object(
1154 self
.n2vc
, "_get_vnf_count_and_record", mock_vnf_count_and_record
1156 with self
.assertRaises(N2VCException
):
1157 self
.n2vc
._get
_application
_name
(namespace
)
1158 mock_vnf_count_and_record
.assert_called_once_with(
1159 "vnf-level", "1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0"
1161 self
.db
.get_one
.assert_called_once()
1163 def test_get_application_name_vdu_charm(self
):
1164 namespace
= ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898.1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0.mgmtVM-0"
1165 self
.db
.get_one
.return_value
= {
1170 "target_element": "vnf/vnf1/mgmtvm",
1171 "member-vnf-index": "vnf111-xxx-yyy-zzz",
1174 "vdu_count_index": None,
1175 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
1176 "vdu_name": "mgmtvm",
1177 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
1179 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1182 "target_element": "ns",
1183 "member-vnf-index": None,
1186 "vdu_count_index": None,
1189 "ee_descriptor_id": "",
1191 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1197 mock_vnf_count_and_record
= MagicMock()
1199 "member-vnf-index-ref": "vnf111-xxx-yyy-zzz",
1201 {"_id": "38912ff7-5bdd-4228-911f-c2bee259c44a", "vdu-id-ref": "mgmtVM"},
1202 {"_id": "45512ff7-5bdd-4228-911f-c2bee259c44a", "vdu-id-ref": "dataVM"},
1206 mock_vnf_count_and_record
.return_value
= (vnf_count
, db_vnfr
)
1207 expected_result
= "simple-ee-ab-z0-vnf111-xxx-y-mgmtvm-z0-vdu"
1208 with patch
.object(self
.n2vc
, "db", self
.db
), patch
.object(
1209 self
.n2vc
, "_get_vnf_count_and_record", mock_vnf_count_and_record
1211 application_name
= self
.n2vc
._get
_application
_name
(namespace
)
1212 self
.assertEqual(application_name
, expected_result
)
1213 self
.assertLess(len(application_name
), 50)
1214 mock_vnf_count_and_record
.assert_called_once_with(
1215 "vdu-level", "1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0"
1217 self
.db
.get_one
.assert_called_once()
1219 def test_get_application_name_kdu_charm(self
):
1220 namespace
= ".82b11965-e580-47c0-9ee0-329f318a305b.1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0.ldap"
1221 self
.db
.get_one
.return_value
= {
1226 "target_element": "vnf/openldap/kdu/ldap",
1227 "member-vnf-index": "openldap",
1230 "vdu_count_index": 0,
1231 "operational-status": "init",
1232 "detailed-status": "",
1233 "step": "initial-deploy",
1234 "vnfd_id": "openldap_knf",
1236 "type": "lxc_proxy_charm",
1237 "ee_descriptor_id": "openldap-ee",
1240 "application": "openldap-ee-z0-openldap-vdu",
1241 "model": "82b11965-e580-47c0-9ee0-329f318a305b",
1242 "config_sw_installed": True,
1248 mock_vnf_count_and_record
= MagicMock()
1249 db_vnfr
= {"member-vnf-index-ref": "openldap", "vdur": {}}
1251 mock_vnf_count_and_record
.return_value
= (vnf_count
, db_vnfr
)
1252 expected_result
= "openldap-ee-z0-openldap-ldap-vdu"
1253 with patch
.object(self
.n2vc
, "db", self
.db
), patch
.object(
1254 self
.n2vc
, "_get_vnf_count_and_record", mock_vnf_count_and_record
1256 application_name
= self
.n2vc
._get
_application
_name
(namespace
)
1257 self
.assertEqual(application_name
, expected_result
)
1258 self
.assertLess(len(application_name
), 50)
1259 mock_vnf_count_and_record
.assert_called_once_with(
1260 "vdu-level", "1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0"
1262 self
.db
.get_one
.assert_called_once()
1265 "n2vc.n2vc_juju_conn.generate_random_alfanum_string",
1266 **{"return_value": "random"}
1268 def test_get_application_name_vdu_charm_old_naming(
1269 self
, mock_generate_random_alfanum
1271 namespace
= ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898.1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0.mgmtVM-0"
1272 self
.db
.get_one
.return_value
= {
1277 "target_element": "vnf/vnf1/mgmtVM",
1278 "member-vnf-index": "vnf111-xxx-yyy-zzz",
1281 "vdu_count_index": None,
1282 "vnfd_id": "r7fbd751-3de4-4e68-bd40-ec5ae0a53898",
1283 "vdu_name": "mgmtvm",
1284 "ee_descriptor_id": "simple-ee-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
1285 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1288 "target_element": "ns",
1289 "member-vnf-index": None,
1292 "vdu_count_index": None,
1295 "ee_descriptor_id": "",
1296 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1302 mock_vnf_count_and_record
= MagicMock()
1304 "member-vnf-index-ref": "vnf111-xxx-yyy-zzz",
1306 {"_id": "38912ff7-5bdd-4228-911f-c2bee259c44a", "vdu-id-ref": "mgmtVM"},
1307 {"_id": "45512ff7-5bdd-4228-911f-c2bee259c44a", "vdu-id-ref": "dataVM"},
1311 mock_vnf_count_and_record
.return_value
= (vnf_count
, db_vnfr
)
1312 expected_result
= "app-vnf-eb3161eec0-z0-vdu-mgmtvm-cnt-z0-random"
1314 with patch
.object(self
.n2vc
, "db", self
.db
), patch
.object(
1315 self
.n2vc
, "_get_vnf_count_and_record", mock_vnf_count_and_record
1317 application_name
= self
.n2vc
._get
_application
_name
(namespace
)
1318 self
.assertEqual(application_name
, expected_result
)
1319 self
.assertLess(len(application_name
), 50)
1320 mock_vnf_count_and_record
.assert_called_once_with(
1321 "vdu-level", "1b6a4eb3-4fbf-415e-985c-4aeb3161eec0-0"
1323 self
.db
.get_one
.assert_called_once()
1325 def test_get_application_name_ns_charm(self
):
1326 namespace
= ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898"
1327 self
.db
.get_one
.return_value
= {
1332 "target_element": "ns",
1333 "member-vnf-index": None,
1336 "vdu_count_index": None,
1339 "ee_descriptor_id": "",
1340 "charm_name": "simple-ns-charm-abc-000-rrrr-nnnn-4444-hhh-3333-yyyy-333-hhh-ttt-444",
1341 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1347 mock_vnf_count_and_record
= MagicMock()
1350 mock_vnf_count_and_record
.return_value
= (vnf_count
, db_vnfr
)
1351 expected_result
= "simple-ns-charm-abc-z000-rrrr-nnnn-z4444-h-ns"
1352 with patch
.object(self
.n2vc
, "db", self
.db
), patch
.object(
1353 self
.n2vc
, "_get_vnf_count_and_record", mock_vnf_count_and_record
1355 application_name
= self
.n2vc
._get
_application
_name
(namespace
)
1356 self
.assertEqual(application_name
, expected_result
)
1357 self
.assertLess(len(application_name
), 50)
1358 mock_vnf_count_and_record
.assert_called_once_with("ns-level", None)
1359 self
.db
.get_one
.assert_called_once()
1361 def test_get_application_name_ns_charm_empty_charm_name(self
):
1362 namespace
= ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898"
1363 self
.db
.get_one
.return_value
= {
1368 "target_element": "ns",
1369 "member-vnf-index": None,
1372 "vdu_count_index": None,
1375 "ee_descriptor_id": "",
1377 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1383 mock_vnf_count_and_record
= MagicMock()
1386 mock_vnf_count_and_record
.return_value
= (vnf_count
, db_vnfr
)
1387 with patch
.object(self
.n2vc
, "db", self
.db
), patch
.object(
1388 self
.n2vc
, "_get_vnf_count_and_record", mock_vnf_count_and_record
1390 with self
.assertRaises(N2VCException
):
1391 self
.n2vc
._get
_application
_name
(namespace
)
1392 mock_vnf_count_and_record
.assert_called_once_with("ns-level", None)
1393 self
.db
.get_one
.assert_called_once()
1396 "n2vc.n2vc_juju_conn.generate_random_alfanum_string",
1397 **{"return_value": "random"}
1399 def test_get_application_name_ns_charm_old_naming(
1400 self
, mock_generate_random_alfanum
1402 namespace
= ".dbfbd751-3de4-4e68-bd40-ec5ae0a53898"
1403 self
.db
.get_one
.return_value
= {
1408 "target_element": "ns",
1409 "member-vnf-index": None,
1412 "vdu_count_index": None,
1415 "ee_descriptor_id": "",
1416 "model": "dbfbd751-3de4-4e68-bd40-ec5ae0a53898",
1422 mock_vnf_count_and_record
= MagicMock()
1425 mock_vnf_count_and_record
.return_value
= (vnf_count
, db_vnfr
)
1426 expected_result
= "app-random"
1427 with patch
.object(self
.n2vc
, "db", self
.db
), patch
.object(
1428 self
.n2vc
, "_get_vnf_count_and_record", mock_vnf_count_and_record
1430 application_name
= self
.n2vc
._get
_application
_name
(namespace
)
1431 self
.assertEqual(application_name
, expected_result
)
1432 self
.assertLess(len(application_name
), 50)
1433 mock_vnf_count_and_record
.assert_called_once_with("ns-level", None)
1434 self
.db
.get_one
.assert_called_once()