Code Coverage

Cobertura Coverage Report > osm_pla.test >

test_nsPlacementDataFactory.py

Trend

File Coverage summary

NameClassesLinesConditionals
test_nsPlacementDataFactory.py
100%
1/1
99%
259/262
100%
0/0

Coverage Breakdown by Class

NameLinesConditionals
test_nsPlacementDataFactory.py
99%
259/262
N/A

Source

osm_pla/test/test_nsPlacementDataFactory.py
1 # Copyright 2020 ArctosLabs Scandinavia AB
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
12 # implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 1 import os
16 1 import unittest
17 1 from collections import Counter
18 1 from pathlib import Path
19 1 from unittest import TestCase, mock
20 1 from unittest.mock import call
21
22 1 import yaml
23
24 1 from osm_pla.placement.mznplacement import NsPlacementDataFactory
25
26
27 1 class TestNsPlacementDataFactory(TestCase):
28 1     vim_accounts = [
29         {
30             "vim_password": "FxtnynxBCnouzAT4Hkerhg==",
31             "config": {},
32             "_admin": {
33                 "modified": 1564579854.0480285,
34                 "created": 1564579854.0480285,
35                 "operationalState": "ENABLED",
36                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
37                 "deployed": {
38                     "RO-account": "6beb4e2e-b397-11e9-a7a3-02420aff0008",
39                     "RO": "6bcfc3fc-b397-11e9-a7a3-02420aff0008",
40                 },
41                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
42                 "detailed-status": "Done",
43             },
44             "name": "OpenStack1",
45             "vim_type": "openstack",
46             "_id": "92b056a7-38f5-438d-b8ee-3f93b3531f87",
47             "schema_version": "1.1",
48             "vim_user": "admin",
49             "vim_url": "http://10.234.12.47:5000/v3",
50             "vim_tenant_name": "admin",
51         },
52         {
53             "config": {},
54             "vim_tenant_name": "osm_demo",
55             "schema_version": "1.1",
56             "name": "OpenStack2",
57             "vim_password": "gK5v4Gh2Pl41o6Skwp6RCw==",
58             "vim_type": "openstack",
59             "_admin": {
60                 "modified": 1567148372.2490237,
61                 "created": 1567148372.2490237,
62                 "operationalState": "ENABLED",
63                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
64                 "deployed": {
65                     "RO-account": "b7fb0034-caf3-11e9-9388-02420aff000a",
66                     "RO": "b7f129ce-caf3-11e9-9388-02420aff000a",
67                 },
68                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
69                 "detailed-status": "Done",
70             },
71             "vim_user": "admin",
72             "vim_url": "http://10.234.12.44:5000/v3",
73             "_id": "6618d412-d7fc-4eb0-a6f8-d2c258e0e900",
74         },
75         {
76             "config": {},
77             "schema_version": "1.1",
78             "name": "OpenStack3",
79             "vim_password": "1R2FoMQnaL6rNSosoRP2hw==",
80             "vim_type": "openstack",
81             "vim_tenant_name": "osm_demo",
82             "_admin": {
83                 "modified": 1567599746.689582,
84                 "created": 1567599746.689582,
85                 "operationalState": "ENABLED",
86                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
87                 "deployed": {
88                     "RO-account": "a8161f54-cf0e-11e9-9388-02420aff000a",
89                     "RO": "a80b6280-cf0e-11e9-9388-02420aff000a",
90                 },
91                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
92                 "detailed-status": "Done",
93             },
94             "vim_user": "admin",
95             "vim_url": "http://10.234.12.46:5000/v3",
96             "_id": "331ffdec-44a8-4707-94a1-af7a292d9735",
97         },
98         {
99             "config": {},
100             "schema_version": "1.1",
101             "name": "OpenStack4",
102             "vim_password": "6LScyPeMq3QFh3GRb/xwZw==",
103             "vim_type": "openstack",
104             "vim_tenant_name": "osm_demo",
105             "_admin": {
106                 "modified": 1567599911.5108898,
107                 "created": 1567599911.5108898,
108                 "operationalState": "ENABLED",
109                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
110                 "deployed": {
111                     "RO-account": "0a651200-cf0f-11e9-9388-02420aff000a",
112                     "RO": "0a4defc6-cf0f-11e9-9388-02420aff000a",
113                 },
114                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
115                 "detailed-status": "Done",
116             },
117             "vim_user": "admin",
118             "vim_url": "http://10.234.12.43:5000/v3",
119             "_id": "eda92f47-29b9-4007-9709-c1833dbfbe31",
120         },
121     ]
122
123 1     vim_accounts_fewer_vims = [
124         {
125             "vim_password": "FxtnynxBCnouzAT4Hkerhg==",
126             "config": {},
127             "_admin": {
128                 "modified": 1564579854.0480285,
129                 "created": 1564579854.0480285,
130                 "operationalState": "ENABLED",
131                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
132                 "deployed": {
133                     "RO-account": "6beb4e2e-b397-11e9-a7a3-02420aff0008",
134                     "RO": "6bcfc3fc-b397-11e9-a7a3-02420aff0008",
135                 },
136                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
137                 "detailed-status": "Done",
138             },
139             "name": "OpenStack1",
140             "vim_type": "openstack",
141             "_id": "92b056a7-38f5-438d-b8ee-3f93b3531f87",
142             "schema_version": "1.1",
143             "vim_user": "admin",
144             "vim_url": "http://10.234.12.47:5000/v3",
145             "vim_tenant_name": "admin",
146         },
147         {
148             "config": {},
149             "vim_tenant_name": "osm_demo",
150             "schema_version": "1.1",
151             "name": "OpenStack2",
152             "vim_password": "gK5v4Gh2Pl41o6Skwp6RCw==",
153             "vim_type": "openstack",
154             "_admin": {
155                 "modified": 1567148372.2490237,
156                 "created": 1567148372.2490237,
157                 "operationalState": "ENABLED",
158                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
159                 "deployed": {
160                     "RO-account": "b7fb0034-caf3-11e9-9388-02420aff000a",
161                     "RO": "b7f129ce-caf3-11e9-9388-02420aff000a",
162                 },
163                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
164                 "detailed-status": "Done",
165             },
166             "vim_user": "admin",
167             "vim_url": "http://10.234.12.44:5000/v3",
168             "_id": "6618d412-d7fc-4eb0-a6f8-d2c258e0e900",
169         },
170         {
171             "config": {},
172             "schema_version": "1.1",
173             "name": "OpenStack4",
174             "vim_password": "6LScyPeMq3QFh3GRb/xwZw==",
175             "vim_type": "openstack",
176             "vim_tenant_name": "osm_demo",
177             "_admin": {
178                 "modified": 1567599911.5108898,
179                 "created": 1567599911.5108898,
180                 "operationalState": "ENABLED",
181                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
182                 "deployed": {
183                     "RO-account": "0a651200-cf0f-11e9-9388-02420aff000a",
184                     "RO": "0a4defc6-cf0f-11e9-9388-02420aff000a",
185                 },
186                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
187                 "detailed-status": "Done",
188             },
189             "vim_user": "admin",
190             "vim_url": "http://10.234.12.43:5000/v3",
191             "_id": "eda92f47-29b9-4007-9709-c1833dbfbe31",
192         },
193     ]
194
195 1     vim_accounts_more_vims = [
196         {
197             "vim_password": "FxtnynxBCnouzAT4Hkerhg==",
198             "config": {},
199             "_admin": {
200                 "modified": 1564579854.0480285,
201                 "created": 1564579854.0480285,
202                 "operationalState": "ENABLED",
203                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
204                 "deployed": {
205                     "RO-account": "6beb4e2e-b397-11e9-a7a3-02420aff0008",
206                     "RO": "6bcfc3fc-b397-11e9-a7a3-02420aff0008",
207                 },
208                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
209                 "detailed-status": "Done",
210             },
211             "name": "OpenStack1",
212             "vim_type": "openstack",
213             "_id": "92b056a7-38f5-438d-b8ee-3f93b3531f87",
214             "schema_version": "1.1",
215             "vim_user": "admin",
216             "vim_url": "http://10.234.12.47:5000/v3",
217             "vim_tenant_name": "admin",
218         },
219         {
220             "config": {},
221             "vim_tenant_name": "osm_demo",
222             "schema_version": "1.1",
223             "name": "OpenStack2",
224             "vim_password": "gK5v4Gh2Pl41o6Skwp6RCw==",
225             "vim_type": "openstack",
226             "_admin": {
227                 "modified": 1567148372.2490237,
228                 "created": 1567148372.2490237,
229                 "operationalState": "ENABLED",
230                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
231                 "deployed": {
232                     "RO-account": "b7fb0034-caf3-11e9-9388-02420aff000a",
233                     "RO": "b7f129ce-caf3-11e9-9388-02420aff000a",
234                 },
235                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
236                 "detailed-status": "Done",
237             },
238             "vim_user": "admin",
239             "vim_url": "http://10.234.12.44:5000/v3",
240             "_id": "6618d412-d7fc-4eb0-a6f8-d2c258e0e900",
241         },
242         {
243             "config": {},
244             "schema_version": "1.1",
245             "name": "OpenStack4",
246             "vim_password": "6LScyPeMq3QFh3GRb/xwZw==",
247             "vim_type": "openstack",
248             "vim_tenant_name": "osm_demo",
249             "_admin": {
250                 "modified": 1567599911.5108898,
251                 "created": 1567599911.5108898,
252                 "operationalState": "ENABLED",
253                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
254                 "deployed": {
255                     "RO-account": "0a651200-cf0f-11e9-9388-02420aff000a",
256                     "RO": "0a4defc6-cf0f-11e9-9388-02420aff000a",
257                 },
258                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
259                 "detailed-status": "Done",
260             },
261             "vim_user": "admin",
262             "vim_url": "http://10.234.12.43:5000/v3",
263             "_id": "eda92f47-29b9-4007-9709-c1833dbfbe31",
264         },
265         {
266             "config": {},
267             "schema_version": "1.1",
268             "name": "OpenStack3",
269             "vim_password": "6LScyPeMq3QFh3GRb/xwZw==",
270             "vim_type": "openstack",
271             "vim_tenant_name": "osm_demo",
272             "_admin": {
273                 "modified": 1567599911.5108898,
274                 "created": 1567599911.5108898,
275                 "operationalState": "ENABLED",
276                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
277                 "deployed": {
278                     "RO-account": "0a651200-cf0f-11e9-9388-02420aff000a",
279                     "RO": "0a4defc6-cf0f-11e9-9388-02420aff000a",
280                 },
281                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
282                 "detailed-status": "Done",
283             },
284             "vim_user": "admin",
285             "vim_url": "http://10.234.12.46:5000/v3",
286             "_id": "eda92f47-29b9-4007-9709-c1833dbfbe31",
287         },
288         {
289             "config": {},
290             "schema_version": "1.1",
291             "name": "OpenStack5",
292             "vim_password": "6LScyPeMq3QFh3GRb/xwZw==",
293             "vim_type": "openstack",
294             "vim_tenant_name": "osm_demo",
295             "_admin": {
296                 "modified": 1567599911.5108898,
297                 "created": 1567599911.5108898,
298                 "operationalState": "ENABLED",
299                 "projects_read": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
300                 "deployed": {
301                     "RO-account": "0a651200-cf0f-11e9-9388-02420aff000a",
302                     "RO": "0a4defc6-cf0f-11e9-9388-02420aff000a",
303                 },
304                 "projects_write": ["69915588-e5e2-46d3-96b0-a29bedef6f73"],
305                 "detailed-status": "Done",
306             },
307             "vim_user": "admin",
308             "vim_url": "http://1.1.1.1:5000/v3",
309             "_id": "ffffffff-29b9-4007-9709-c1833dbfbe31",
310         },
311     ]
312
313 1     def _produce_ut_vim_accounts_info(self, vim_accounts):
314         """
315         FIXME temporary, we will need more control over vim_urls and _id for test purpose - make a generator
316         :return: vim_url and _id as dict, i.e. extract these from vim_accounts data
317         """
318 1         return {_["name"]: _["_id"] for _ in vim_accounts}
319
320 1     def _adjust_path(self, file):
321         """In case we are not running from test directory,
322         then assume we are in top level directory (e.g. running from tox) and adjust file path accordingly
323         """
324 1         path_component = "/osm_pla/test/"
325 1         real_path = os.path.realpath(file)
326 1         if path_component not in real_path:
327 1             return (
328                 os.path.dirname(real_path)
329                 + path_component
330                 + os.path.basename(real_path)
331             )
332         else:
333 0             return real_path
334
335 1     def _populate_pil_info(self, file):
336         """
337         Note str(Path()) is a 3.5 thing
338         """
339 1         with open(str(Path(self._adjust_path(file)))) as pp_fd:
340 1             test_data = yaml.safe_load_all(pp_fd)
341 1             return next(test_data)
342
343 1     def _get_ut_nsd_from_file(self, nsd_file_name):
344         """
345         creates the structure representing the nsd.
346
347         IMPORTANT NOTE: If using .yaml files from the NS packages for the unit tests (which we do),
348         then the files must be modified with respect to the way booleans are processed at on-boarding in OSM.
349         The following construct in the NS package yaml file:
350         mgmt-network: 'false'
351         will become a boolean in the MongoDB, and therefore the yaml used in these unit test must use yaml
352         tag as follows:
353         mgmt-network: !!bool False
354         The modification also applies to 'true' => !!bool True
355         This will ensure that the object returned from this function is as expected by PLA.
356         """
357 1         with open(str(Path(self._adjust_path(nsd_file_name)))) as nsd_fd:
358 1             test_data = yaml.safe_load_all(nsd_fd)
359 1             return next(test_data)
360
361 1     def _produce_ut_vnf_price_list(self):
362 1         price_list_file = "vnf_price_list.yaml"
363 1         with open(str(Path(self._adjust_path(price_list_file)))) as pl_fd:
364 1             price_list_data = yaml.safe_load_all(pl_fd)
365 1             return {
366                 i["vnfd"]: {i1["vim_name"]: i1["price"] for i1 in i["prices"]}
367                 for i in next(price_list_data)
368             }
369
370 1     def _produce_ut_vnf_test_price_list(self, price_list):
371 1         price_list_file = price_list
372 1         with open(str(Path(self._adjust_path(price_list_file)))) as pl_fd:
373 1             price_list_data = yaml.safe_load_all(pl_fd)
374 1             return {
375                 i["vnfd"]: {i1["vim_name"]: i1["price"] for i1 in i["prices"]}
376                 for i in next(price_list_data)
377             }
378
379 1     def test__produce_trp_link_characteristics_link_latency_with_more_vims(self):
380         """
381         -test with more(other) vims compared to pil
382         """
383 1         content_expected = [
384             0,
385             0,
386             0,
387             0,
388             0,
389             120,
390             120,
391             130,
392             130,
393             140,
394             140,
395             230,
396             230,
397             240,
398             240,
399             340,
400             340,
401             32767,
402             32767,
403             32767,
404             32767,
405             32767,
406             32767,
407             32767,
408             32767,
409         ]
410 1         nspdf = NsPlacementDataFactory(
411             self._produce_ut_vim_accounts_info(
412                 TestNsPlacementDataFactory.vim_accounts_more_vims
413             ),
414             self._produce_ut_vnf_price_list(),
415             nsd=None,
416             pil_info=self._populate_pil_info("pil_unittest1_keys.yaml"),
417             pinning=None,
418         )
419 1         pil_latencies = nspdf._produce_trp_link_characteristics_data("pil_latency")
420 1         content_produced = [i for row in pil_latencies for i in row]
421 1         self.assertEqual(
422             Counter(content_expected),
423             Counter(content_produced),
424             "trp_link_latency incorrect",
425         )
426
427 1     def test__produce_trp_link_characteristics_link_latency_with_fewer_vims(self):
428         """
429         -test with fewer vims compared to pil
430         :return:
431         """
432 1         content_expected = [0, 0, 0, 120, 120, 140, 140, 240, 240]
433 1         nspdf = NsPlacementDataFactory(
434             self._produce_ut_vim_accounts_info(
435                 TestNsPlacementDataFactory.vim_accounts_fewer_vims
436             ),
437             self._produce_ut_vnf_price_list(),
438             nsd=None,
439             pil_info=self._populate_pil_info("pil_unittest1_keys.yaml"),
440             pinning=None,
441         )
442 1         pil_latencies = nspdf._produce_trp_link_characteristics_data("pil_latency")
443 1         content_produced = [i for row in pil_latencies for i in row]
444 1         self.assertEqual(
445             Counter(content_expected),
446             Counter(content_produced),
447             "trp_link_latency incorrect",
448         )
449
450 1     def test__produce_trp_link_characteristic_not_supported(self):
451         """
452         - test with non-supported characteristic
453         """
454 1         nspdf = NsPlacementDataFactory(
455             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
456             self._produce_ut_vnf_price_list(),
457             nsd=None,
458             pil_info=self._populate_pil_info("pil_unittest1.yaml"),
459             pinning=None,
460         )
461
462 1         with self.assertRaises(Exception) as e:
463 1             nspdf._produce_trp_link_characteristics_data("test_no_support")
464 1         self.assertRegex(
465             str(e.exception),
466             r"characteristic.*not supported",
467             "invalid exception content",
468         )
469
470 1     def test__produce_trp_link_characteristics_link_latency(self):
471         """
472         -test with full set of vims as in pil
473         -test with fewer vims compared to pil
474         -test with more(other) vims compared to pil
475         -test with invalid/corrupt pil configuration file (e.g. missing endpoint), empty file, not yaml conformant
476         - test with non-supported characteristic
477
478         :return:
479         """
480 1         content_expected = [
481             0,
482             0,
483             0,
484             0,
485             120,
486             120,
487             130,
488             130,
489             140,
490             140,
491             230,
492             230,
493             240,
494             240,
495             340,
496             340,
497         ]
498
499 1         nspdf = NsPlacementDataFactory(
500             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
501             self._produce_ut_vnf_price_list(),
502             nsd=None,
503             pil_info=self._populate_pil_info("pil_unittest1_keys.yaml"),
504             pinning=None,
505         )
506 1         pil_latencies = nspdf._produce_trp_link_characteristics_data("pil_latency")
507 1         content_produced = [i for row in pil_latencies for i in row]
508 1         self.assertEqual(
509             Counter(content_expected),
510             Counter(content_produced),
511             "trp_link_latency incorrect",
512         )
513
514 1     def test__produce_trp_link_characteristics_link_jitter(self):
515         """
516         -test with full set of vims as in pil
517         """
518 1         content_expected = [
519             0,
520             0,
521             0,
522             0,
523             1200,
524             1200,
525             1300,
526             1300,
527             1400,
528             1400,
529             2300,
530             2300,
531             2400,
532             2400,
533             3400,
534             3400,
535         ]
536
537 1         nspdf = NsPlacementDataFactory(
538             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
539             self._produce_ut_vnf_price_list(),
540             nsd=None,
541             pil_info=self._populate_pil_info("pil_unittest1_keys.yaml"),
542             pinning=None,
543         )
544 1         pil_jitter = nspdf._produce_trp_link_characteristics_data("pil_jitter")
545 1         content_produced = [i for row in pil_jitter for i in row]
546 1         self.assertEqual(
547             Counter(content_expected),
548             Counter(content_produced),
549             "trp_link_jitter incorrect",
550         )
551
552 1     def test__produce_trp_link_characteristics_link_jitter_with_fewer_vims(self):
553         """
554         -test with fewer vims compared to pil, link jitter
555         """
556 1         content_expected = [0, 0, 0, 1200, 1200, 1400, 1400, 2400, 2400]
557 1         nspdf = NsPlacementDataFactory(
558             self._produce_ut_vim_accounts_info(self.vim_accounts_fewer_vims),
559             self._produce_ut_vnf_price_list(),
560             nsd=None,
561             pil_info=self._populate_pil_info("pil_unittest1_keys.yaml"),
562             pinning=None,
563         )
564 1         pil_latencies = nspdf._produce_trp_link_characteristics_data("pil_jitter")
565 1         content_produced = [i for row in pil_latencies for i in row]
566 1         self.assertEqual(
567             Counter(content_expected),
568             Counter(content_produced),
569             "trp_link_jitter incorrect",
570         )
571
572 1     def test__produce_trp_link_characteristics_link_jitter_with_more_vims(self):
573         """
574         -test with more vims compared to pil, link jitter
575         """
576 1         content_expected = [
577             0,
578             0,
579             0,
580             0,
581             0,
582             1200,
583             1200,
584             1300,
585             1300,
586             1400,
587             1400,
588             2300,
589             2300,
590             2400,
591             2400,
592             3400,
593             3400,
594             32767,
595             32767,
596             32767,
597             32767,
598             32767,
599             32767,
600             32767,
601             32767,
602         ]
603 1         nspdf = NsPlacementDataFactory(
604             self._produce_ut_vim_accounts_info(self.vim_accounts_more_vims),
605             self._produce_ut_vnf_price_list(),
606             nsd=None,
607             pil_info=self._populate_pil_info("pil_unittest1_keys.yaml"),
608             pinning=None,
609         )
610 1         pil_latencies = nspdf._produce_trp_link_characteristics_data("pil_jitter")
611 1         content_produced = [i for row in pil_latencies for i in row]
612 1         self.assertEqual(
613             Counter(content_expected),
614             Counter(content_produced),
615             "trp_link_jitter incorrect",
616         )
617
618 1     def test__produce_trp_link_characteristics_link_price(self):
619         """
620         -test with full set of vims as in pil
621         """
622 1         content_expected = [0, 0, 0, 0, 12, 12, 13, 13, 14, 14, 23, 23, 24, 24, 34, 34]
623 1         nspdf = NsPlacementDataFactory(
624             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
625             self._produce_ut_vnf_price_list(),
626             nsd=None,
627             pil_info=self._populate_pil_info("pil_unittest1_keys.yaml"),
628             pinning=None,
629         )
630 1         pil_prices = nspdf._produce_trp_link_characteristics_data("pil_price")
631 1         content_produced = [i for row in pil_prices for i in row]
632 1         self.assertEqual(
633             Counter(content_expected),
634             Counter(content_produced),
635             "invalid trp link prices",
636         )
637
638 1     def test__produce_trp_link_characteristics_link_price_with_fewer_vims(self):
639         """
640         -test with fewer vims compared to pil
641         """
642 1         content_expected = [0, 0, 0, 12, 12, 14, 14, 24, 24]
643 1         nspdf = NsPlacementDataFactory(
644             self._produce_ut_vim_accounts_info(self.vim_accounts_fewer_vims),
645             self._produce_ut_vnf_price_list(),
646             nsd=None,
647             pil_info=self._populate_pil_info("pil_unittest1_keys.yaml"),
648             pinning=None,
649         )
650 1         pil_prices = nspdf._produce_trp_link_characteristics_data("pil_price")
651 1         content_produced = [i for row in pil_prices for i in row]
652 1         self.assertEqual(
653             Counter(content_expected),
654             Counter(content_produced),
655             "invalid trp link prices",
656         )
657
658 1     def test__produce_trp_link_characteristics_partly_constrained(self):
659 1         content_expected = [
660             0,
661             0,
662             0,
663             0,
664             32767,
665             32767,
666             32767,
667             32767,
668             1200,
669             1200,
670             1400,
671             1400,
672             2400,
673             2400,
674             3400,
675             3400,
676         ]
677 1         nspdf = NsPlacementDataFactory(
678             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
679             self._produce_ut_vnf_price_list(),
680             nsd=None,
681             pil_info=self._populate_pil_info("pil_unittest2_keys.yaml"),
682             pinning=None,
683         )
684 1         pil_jitter = nspdf._produce_trp_link_characteristics_data("pil_jitter")
685 1         content_produced = [i for row in pil_jitter for i in row]
686 1         self.assertEqual(
687             Counter(content_expected),
688             Counter(content_produced),
689             "invalid trp link jitter, partly constrained",
690         )
691
692 1     def test__produce_vld_desc_partly_constrained(self):
693 1         vld_desc_expected = [
694             {"cp_refs": ["one", "two"], "jitter": 30},
695             {"cp_refs": ["two", "three"], "latency": 120},
696         ]
697
698 1         nsd = self._get_ut_nsd_from_file("nsd_unittest2.yaml")
699 1         nsd = nsd["nsd"]["nsd"][0]
700 1         nspdf = NsPlacementDataFactory(
701             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
702             self._produce_ut_vnf_price_list(),
703             nsd=nsd,
704             pil_info=None,
705             pinning=None,
706         )
707 1         self.assertEqual(
708             vld_desc_expected, nspdf._produce_vld_desc(), "vld_desc incorrect"
709         )
710
711 1     def test__produce_trp_link_characteristics_link_latency_not_yaml_conformant(self):
712         """
713         -test with invalid/corrupt pil configuration file (not yaml conformant)
714         """
715 1         with self.assertRaises(Exception) as e:
716 1             _ = NsPlacementDataFactory(
717                 self._produce_ut_vim_accounts_info(
718                     TestNsPlacementDataFactory.vim_accounts
719                 ),
720                 self._produce_ut_vnf_price_list(),
721                 nsd=None,
722                 pil_info=self._populate_pil_info("not_yaml_conformant.yaml"),
723                 pinning=None,
724             )
725 1         self.assertRegex(
726             str(e.exception),
727             r"mapping values are not allowed here.*",
728             "invalid exception content",
729         )
730
731 1     def test__produce_trp_link_characteristics_with_invalid_pil_config(self):
732         """
733         -test with invalid/corrupt pil configuration file (missing endpoint)
734         """
735 1         nspdf = NsPlacementDataFactory(
736             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
737             self._produce_ut_vnf_price_list(),
738             nsd=None,
739             pil_info=self._populate_pil_info(
740                 "corrupt_pil_endpoints_config_unittest1.yaml"
741             ),
742             pinning=None,
743         )
744 1         with self.assertRaises(Exception) as e:
745 1             _ = nspdf._produce_trp_link_characteristics_data("pil_latency")
746 1         self.assertEqual(
747             "list index out of range", str(e.exception), "unexpected exception"
748         )
749
750 1     def test__produce_vld_desc_w_instantiate_override(self):
751 1         vld_desc_expected = [
752             {"cp_refs": ["one", "two"], "latency": 150, "jitter": 30},
753             {"cp_refs": ["two", "three"], "latency": 90, "jitter": 30},
754         ]
755
756 1         nsd = self._get_ut_nsd_from_file("nsd_unittest_no_vld_constraints.yaml")
757 1         nsd = nsd["nsd"]["nsd"][0]
758 1         nspdf = NsPlacementDataFactory(
759             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
760             self._produce_ut_vnf_price_list(),
761             nsd=nsd,
762             pil_info=None,
763             pinning=None,
764             order_constraints=None,
765         )
766
767 1         self.assertNotEqual(
768             nspdf._produce_vld_desc(), vld_desc_expected, "vld_desc incorrect"
769         )
770
771 1     def test__produce_vld_desc_nsd_w_instantiate_wo(self):
772         """
773         nsd w/ constraints, instantiate w/o constraints
774         :return:
775         """
776 1         vld_desc_expected = [
777             {"cp_refs": ["one", "two"], "latency": 150, "jitter": 30},
778             {"cp_refs": ["two", "three"], "latency": 90, "jitter": 30},
779         ]
780
781 1         nsd = self._get_ut_nsd_from_file("nsd_unittest3.yaml")
782 1         nsd = nsd["nsd"]["nsd"][0]
783 1         nspdf = NsPlacementDataFactory(
784             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
785             self._produce_ut_vnf_price_list(),
786             nsd=nsd,
787             pil_info=None,
788             pinning=None,
789             order_constraints=None,
790         )
791
792 1         self.assertEqual(
793             vld_desc_expected, nspdf._produce_vld_desc(), "vld_desc incorrect"
794         )
795
796 1     def test__produce_vld_desc_nsd_w_instantiate_w(self):
797         """
798         nsd w/ constraints, instantiate w/ constraints => override
799         :return:
800         """
801 1         vld_desc_expected = [
802             {"cp_refs": ["one", "two"], "latency": 120, "jitter": 21},
803             {"cp_refs": ["two", "three"], "latency": 121, "jitter": 22},
804         ]
805
806 1         nsd = self._get_ut_nsd_from_file("nsd_unittest3.yaml")
807 1         nsd = nsd["nsd"]["nsd"][0]
808 1         nspdf = NsPlacementDataFactory(
809             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
810             self._produce_ut_vnf_price_list(),
811             nsd=nsd,
812             pil_info=None,
813             pinning=None,
814             order_constraints={
815                 "vld-constraints": [
816                     {
817                         "id": "three_vnf_constrained_nsd_vld1",
818                         "link-constraints": {"latency": 120, "jitter": 21},
819                     },
820                     {
821                         "id": "three_vnf_constrained_nsd_vld2",
822                         "link-constraints": {"latency": 121, "jitter": 22},
823                     },
824                 ]
825             },
826         )
827
828 1         self.assertEqual(
829             vld_desc_expected, nspdf._produce_vld_desc(), "vld_desc incorrect"
830         )
831
832 1     def test__produce_vld_desc_nsd_wo_instantiate_wo(self):
833         """
834         nsd w/o constraints, instantiate w/o constraints = no constraints in model
835         :return:
836         """
837 1         vld_desc_expected = [{"cp_refs": ["one", "two"]}, {"cp_refs": ["two", "three"]}]
838
839 1         nsd = self._get_ut_nsd_from_file("nsd_unittest_no_vld_constraints.yaml")
840 1         nsd = nsd["nsd"]["nsd"][0]
841 1         nspdf = NsPlacementDataFactory(
842             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
843             self._produce_ut_vnf_price_list(),
844             nsd=nsd,
845             pil_info=None,
846             pinning=None,
847             order_constraints=None,
848         )
849
850 1         self.assertEqual(
851             vld_desc_expected, nspdf._produce_vld_desc(), "vld_desc incorrect"
852         )
853
854 1     def test__produce_vld_desc_nsd_wo_instantiate_w(self):
855         """
856         nsd w/o constraints, instantiate w/ constraints => add constraints
857         :return:
858         """
859 1         vld_desc_expected = [
860             {"cp_refs": ["one", "two"], "latency": 140, "jitter": 41},
861             {"cp_refs": ["two", "three"], "latency": 141, "jitter": 42},
862         ]
863
864 1         nsd = self._get_ut_nsd_from_file("nsd_unittest_no_vld_constraints.yaml")
865 1         nsd = nsd["nsd"]["nsd"][0]
866 1         nspdf = NsPlacementDataFactory(
867             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
868             self._produce_ut_vnf_price_list(),
869             nsd=nsd,
870             pil_info=None,
871             pinning=None,
872             order_constraints={
873                 "vld-constraints": [
874                     {
875                         "id": "three_vnf_constrained_nsd_vld1",
876                         "link-constraints": {"latency": 140, "jitter": 41},
877                     },
878                     {
879                         "id": "three_vnf_constrained_nsd_vld2",
880                         "link-constraints": {"latency": 141, "jitter": 42},
881                     },
882                 ]
883             },
884         )
885
886 1         self.assertEqual(
887             vld_desc_expected, nspdf._produce_vld_desc(), "vld_desc incorrect"
888         )
889
890 1     def test__produce_vld_desc_nsd_wo_instantiate_w_faulty_input(self):
891         """
892         nsd w/o constraints, instantiate w/ constraints => add constraints that can be parsed
893         :return:
894         """
895 1         vld_desc_expected = [
896             {"cp_refs": ["one", "two"]},
897             {"cp_refs": ["two", "three"], "latency": 151},
898         ]
899
900 1         nsd = self._get_ut_nsd_from_file("nsd_unittest_no_vld_constraints.yaml")
901 1         nsd = nsd["nsd"]["nsd"][0]
902 1         nspdf = NsPlacementDataFactory(
903             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
904             self._produce_ut_vnf_price_list(),
905             nsd=nsd,
906             pil_info=None,
907             pinning=None,
908             order_constraints={
909                 "vld-constraints": [
910                     {
911                         "id": "not_included_vld",
912                         "misspelled-constraints": {"latency": 120, "jitter": 20},
913                     },
914                     {
915                         "id": "three_vnf_constrained_nsd_vld2",
916                         "link-constraints": {"latency": 151},
917                     },
918                 ]
919             },
920         )
921
922 1         self.assertEqual(
923             vld_desc_expected, nspdf._produce_vld_desc(), "vld_desc incorrect"
924         )
925
926 1     def test__produce_vld_desc_nsd_wo_instantiate_w_faulty_input_again(self):
927         """
928         nsd w/o constraints, instantiate w/ faulty constraints => add constraints that can be parsed
929         :return:
930         """
931 1         vld_desc_expected = [
932             {"cp_refs": ["one", "two"], "jitter": 21},
933             {"cp_refs": ["two", "three"]},
934         ]
935
936 1         nsd = self._get_ut_nsd_from_file("nsd_unittest_no_vld_constraints.yaml")
937 1         nsd = nsd["nsd"]["nsd"][0]
938 1         nspdf = NsPlacementDataFactory(
939             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
940             self._produce_ut_vnf_price_list(),
941             nsd=nsd,
942             pil_info=None,
943             pinning=None,
944             order_constraints={
945                 "vld-constraints": [
946                     {
947                         "id": "three_vnf_constrained_nsd_vld1",
948                         "link-constraints": {"delay": 120, "jitter": 21},
949                     },
950                     {
951                         "id": "three_vnf_constrained_nsd_vld2",
952                         "misspelled-constraints": {"latency": 121, "jitter": 22},
953                     },
954                 ]
955             },
956         )
957
958 1         self.assertEqual(
959             vld_desc_expected, nspdf._produce_vld_desc(), "vld_desc incorrect"
960         )
961
962 1     def test__produce_vld_desc_mgmt_network(self):
963 1         vld_desc_expected = [
964             {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
965             {"cp_refs": ["2", "4"], "latency": 50, "jitter": 10},
966             {"cp_refs": ["2", "3"], "latency": 20, "jitter": 10},
967         ]
968
969 1         nsd = self._get_ut_nsd_from_file("test_five_nsd.yaml")
970 1         nsd = nsd["nsd"]["nsd"][0]
971 1         nspdf = NsPlacementDataFactory(
972             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
973             self._produce_ut_vnf_price_list(),
974             nsd=nsd,
975             pil_info=None,
976             pinning=None,
977             order_constraints=None,
978         )
979
980 1         self.assertEqual(
981             vld_desc_expected, nspdf._produce_vld_desc(), "vld_desc incorrect"
982         )
983
984 1     def test__produce_vld_desc_single_vnf_nsd(self):
985 1         vld_desc_expected = []
986
987 1         nsd = self._get_ut_nsd_from_file("nsd_unittest4.yaml")
988 1         nsd = nsd["nsd"]["nsd"][0]
989 1         nspdf = NsPlacementDataFactory(
990             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
991             self._produce_ut_vnf_price_list(),
992             nsd=nsd,
993             pil_info=None,
994             pinning=None,
995             order_constraints=None,
996         )
997
998 1         self.assertEqual(
999             vld_desc_expected, nspdf._produce_vld_desc(), "vld_desc_incorrect"
1000         )
1001
1002 1     def test__produce_vld_desc_slice_nsd(self):
1003 1         vld_desc_expected = []
1004 1         nsd = self._get_ut_nsd_from_file("slice_hackfest_middle_nsd.yaml")
1005 1         nsd = nsd["nsd"]["nsd"][0]
1006 1         nspdf = NsPlacementDataFactory(
1007             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
1008             self._produce_ut_vnf_price_list(),
1009             nsd=nsd,
1010             pil_info=None,
1011             pinning=None,
1012             order_constraints=None,
1013         )
1014
1015 1         self.assertEqual(
1016             vld_desc_expected, nspdf._produce_vld_desc(), "vld_desc_incorrect"
1017         )
1018
1019 1     def test__produce_vld_desc(self):
1020         """
1021
1022         :return:
1023         """
1024 1         vld_desc_expected = [
1025             {"cp_refs": ["one", "two"], "latency": 150, "jitter": 30},
1026             {"cp_refs": ["two", "three"], "latency": 90, "jitter": 30},
1027         ]
1028
1029 1         nsd = self._get_ut_nsd_from_file("nsd_unittest3.yaml")
1030 1         nsd = nsd["nsd"]["nsd"][0]
1031 1         nspdf = NsPlacementDataFactory(
1032             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
1033             self._produce_ut_vnf_price_list(),
1034             nsd=nsd,
1035             pil_info=None,
1036             pinning=None,
1037             order_constraints=None,
1038         )
1039
1040 1         self.assertEqual(
1041             vld_desc_expected, nspdf._produce_vld_desc(), "vld_desc incorrect"
1042         )
1043
1044 1     def test__produce_ns_desc(self):
1045         """
1046         ToDo
1047         - price list sheet with more vims than associated with session
1048         - price list sheet with fewer vims than associated with session
1049         - nsd with different vndfd-id-refs
1050         - fault case scenarios with non-existing vims, non-existing vnfds
1051         """
1052 1         nsd = self._get_ut_nsd_from_file("nsd_unittest3.yaml")
1053 1         nsd = nsd["nsd"]["nsd"][0]
1054 1         nspdf = NsPlacementDataFactory(
1055             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
1056             self._produce_ut_vnf_price_list(),
1057             nsd=nsd,
1058             pil_info=None,
1059             pinning=None,
1060         )
1061
1062 1         ns_desc = nspdf._produce_ns_desc()
1063         # check that all expected member-vnf-index are present
1064 1         vnfs = [e["vnf_id"] for e in ns_desc]
1065 1         self.assertEqual(
1066             Counter(["one", "two", "three"]), Counter(vnfs), "vnf_id invalid"
1067         )
1068
1069 1         expected_keys = ["vnf_id", "vnf_price_per_vim"]
1070 1         for e in ns_desc:
1071             # check that vnf_price_per_vim has proper values
1072 1             self.assertEqual(
1073                 Counter([5, 10, 30, 30]),
1074                 Counter(e["vnf_price_per_vim"]),
1075                 "vnf_price_per_vim invalid",
1076             )
1077             # check that no pinning directives included
1078 1             self.assertEqual(
1079                 Counter(expected_keys), Counter(e.keys()), "pinning directive misplaced"
1080             )
1081
1082 1     def test__produce_ns_desc_with_more_vims(self):
1083 1         nsd = self._get_ut_nsd_from_file("nsd_unittest1.yaml")
1084 1         nsd = nsd["nsd"]["nsd"][0]
1085 1         nspdf = NsPlacementDataFactory(
1086             self._produce_ut_vim_accounts_info(self.vim_accounts_more_vims),
1087             self._produce_ut_vnf_test_price_list("vnf_price_list_more_vims.yaml"),
1088             nsd=nsd,
1089             pil_info=None,
1090             pinning=None,
1091         )
1092
1093 1         ns_desc = nspdf._produce_ns_desc()
1094         # check that all expected member-vnf-index are present
1095 1         vnfs = [e["vnf_id"] for e in ns_desc]
1096 1         self.assertEqual(
1097             Counter({"1": 1, "2": 1, "3": 1}), Counter(vnfs), "vnf_id invalid"
1098         )
1099
1100 1         expected_keys = ["vnf_id", "vnf_price_per_vim"]
1101 1         for e in ns_desc:
1102             # check that vnf_price_per_vim has proper values
1103 1             self.assertEqual(
1104                 Counter([5, 10, 30, 30, 3]),
1105                 Counter(e["vnf_price_per_vim"]),
1106                 "vnf_price_per_vim invalid",
1107             )
1108             # check that no pinning directives included
1109 1             self.assertEqual(
1110                 Counter(expected_keys), Counter(e.keys()), "pinning directive misplaced"
1111             )
1112
1113 1     def test__produce_ns_desc_with_fewer_vims(self):
1114 1         nsd = self._get_ut_nsd_from_file("nsd_unittest1.yaml")
1115 1         nsd = nsd["nsd"]["nsd"][0]
1116 1         nspdf = NsPlacementDataFactory(
1117             self._produce_ut_vim_accounts_info(self.vim_accounts_fewer_vims),
1118             self._produce_ut_vnf_price_list(),
1119             nsd=nsd,
1120             pil_info=None,
1121             pinning=None,
1122         )
1123
1124 1         ns_desc = nspdf._produce_ns_desc()
1125         # check that all expected member-vnf-index are present
1126 1         vnfs = [e["vnf_id"] for e in ns_desc]
1127 1         self.assertEqual(
1128             Counter({"1": 1, "2": 1, "3": 1}), Counter(vnfs), "vnf_id invalid"
1129         )
1130
1131 1         expected_keys = ["vnf_id", "vnf_price_per_vim"]
1132 1         for e in ns_desc:
1133             # check that vnf_price_per_vim has proper values
1134 1             self.assertEqual(
1135                 Counter([5, 10, 30]),
1136                 Counter(e["vnf_price_per_vim"]),
1137                 "vnf_price_per_vim invalid",
1138             )
1139             # check that no pinning directives included
1140 1             self.assertEqual(
1141                 Counter(expected_keys), Counter(e.keys()), "pinning directive misplaced"
1142             )
1143
1144 1     def test__produce_ns_desc_w_pinning(self):
1145 1         nsd = self._get_ut_nsd_from_file("nsd_unittest3.yaml")
1146 1         nsd = nsd["nsd"]["nsd"][0]
1147 1         pinning = [
1148             {
1149                 "member-vnf-index": "two",
1150                 "vimAccountId": "331ffdec-44a8-4707-94a1-af7a292d9735",
1151             }
1152         ]
1153 1         nspdf = NsPlacementDataFactory(
1154             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
1155             self._produce_ut_vnf_price_list(),
1156             nsd=nsd,
1157             pil_info=None,
1158             pinning=pinning,
1159         )
1160 1         ns_desc = nspdf._produce_ns_desc()
1161         # check that all expected member-vnf-index are present
1162 1         vnfs = [e["vnf_id"] for e in ns_desc]
1163 1         self.assertEqual(
1164             Counter(["one", "three", "two"]), Counter(vnfs), "vnf_id invalid"
1165         )
1166
1167 1         for e in ns_desc:
1168             # check that vnf_price_per_vim has proper values
1169 1             self.assertEqual(
1170                 Counter([5, 10, 30, 30]),
1171                 Counter(e["vnf_price_per_vim"]),
1172                 "vnf_price_per_vim invalid",
1173             )
1174             # check that member-vnf-index 2 is pinned correctly
1175 1             if e["vnf_id"] == "two":
1176 1                 self.assertTrue("vim_account" in e.keys(), "missing pinning directive")
1177 1                 self.assertTrue(
1178                     pinning[0]["vimAccountId"]
1179                     == e["vim_account"][3:].replace("_", "-"),
1180                     "invalid pinning vim-account",
1181                 )
1182             else:
1183 1                 self.assertTrue(
1184                     "vim-account" not in e.keys(), "pinning directive misplaced"
1185                 )
1186
1187 1     @mock.patch.object(NsPlacementDataFactory, "_produce_trp_link_characteristics_data")
1188 1     @mock.patch.object(NsPlacementDataFactory, "_produce_vld_desc")
1189 1     @mock.patch.object(NsPlacementDataFactory, "_produce_ns_desc")
1190 1     def test_create_ns_placement_data_wo_order(
1191         self, mock_prd_ns_desc, mock_prd_vld_desc, mock_prd_trp_link_char
1192     ):
1193         """
1194         :return:
1195         """
1196 1         vim_accounts_expected = [
1197             v.replace("-", "_")
1198             for v in [
1199                 "vim92b056a7-38f5-438d-b8ee-3f93b3531f87",
1200                 "vim6618d412-d7fc-4eb0-a6f8-d2c258e0e900",
1201                 "vim331ffdec-44a8-4707-94a1-af7a292d9735",
1202                 "vimeda92f47-29b9-4007-9709-c1833dbfbe31",
1203             ]
1204         ]
1205
1206 1         nsd = self._get_ut_nsd_from_file("nsd_unittest3.yaml")
1207 1         nsd = nsd["nsd"]["nsd"][0]
1208 1         nspdf = NsPlacementDataFactory(
1209             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
1210             self._produce_ut_vnf_price_list(),
1211             nsd=nsd,
1212             pil_info=self._populate_pil_info("pil_unittest1.yaml"),
1213             pinning=None,
1214             order_constraints=None,
1215         )
1216 1         nspd = nspdf.create_ns_placement_data()
1217 1         self.assertEqual(
1218             Counter(vim_accounts_expected),
1219             Counter(nspd["vim_accounts"]),
1220             "vim_accounts incorrect",
1221         )
1222         # mock1.assert_called_once() Note for python > 3.5
1223 1         self.assertTrue(mock_prd_ns_desc.called, "_produce_ns_desc not called")
1224         # mock2.assert_called_once() Note for python > 3.5
1225 1         self.assertTrue(mock_prd_vld_desc.called, " _produce_vld_desc not called")
1226 1         mock_prd_trp_link_char.assert_has_calls(
1227             [call("pil_latency"), call("pil_jitter"), call("pil_price")]
1228         )
1229
1230 1         regexps = [
1231             r"\{.*\}",
1232             r".*'file':.*mznplacement.py",
1233             r".*'time':.*datetime.datetime\(.*\)",
1234         ]
1235 1         generator_data = str(nspd["generator_data"])
1236 1         for regex in regexps:
1237 1             self.assertRegex(generator_data, regex, "generator data invalid")
1238
1239 1     @mock.patch.object(NsPlacementDataFactory, "_produce_trp_link_characteristics_data")
1240 1     @mock.patch.object(NsPlacementDataFactory, "_produce_vld_desc")
1241 1     @mock.patch.object(NsPlacementDataFactory, "_produce_ns_desc")
1242 1     def test_create_ns_placement_data_w_order(
1243         self, mock_prd_ns_desc, mock_prd_vld_desc, mock_prd_trp_link_char
1244     ):
1245         """
1246         :return:
1247         """
1248 1         vim_accounts_expected = [
1249             v.replace("-", "_")
1250             for v in [
1251                 "vim92b056a7-38f5-438d-b8ee-3f93b3531f87",
1252                 "vim6618d412-d7fc-4eb0-a6f8-d2c258e0e900",
1253                 "vim331ffdec-44a8-4707-94a1-af7a292d9735",
1254                 "vimeda92f47-29b9-4007-9709-c1833dbfbe31",
1255             ]
1256         ]
1257
1258 1         nsd = self._get_ut_nsd_from_file("nsd_unittest3.yaml")
1259 1         nsd = nsd["nsd"]["nsd"][0]
1260 1         nspdf = NsPlacementDataFactory(
1261             self._produce_ut_vim_accounts_info(TestNsPlacementDataFactory.vim_accounts),
1262             self._produce_ut_vnf_price_list(),
1263             nsd=nsd,
1264             pil_info=self._populate_pil_info("pil_unittest1.yaml"),
1265             pinning=None,
1266             order_constraints={
1267                 "vld-constraints": [
1268                     {
1269                         "id": "three_vnf_constrained_nsd_vld1",
1270                         "link-constraints": {"latency": 120, "jitter": 21},
1271                     },
1272                     {
1273                         "id": "three_vnf_constrained_nsd_vld2",
1274                         "link-constraints": {"latency": 121, "jitter": 22},
1275                     },
1276                 ]
1277             },
1278         )
1279 1         nspd = nspdf.create_ns_placement_data()
1280 1         self.assertEqual(
1281             Counter(vim_accounts_expected),
1282             Counter(nspd["vim_accounts"]),
1283             "vim_accounts incorrect",
1284         )
1285         # mock1.assert_called_once() Note for python > 3.5
1286 1         self.assertTrue(mock_prd_ns_desc.called, "_produce_ns_desc not called")
1287         # mock2.assert_called_once() Note for python > 3.5
1288 1         self.assertTrue(mock_prd_vld_desc.called, " _produce_vld_desc not called")
1289 1         mock_prd_trp_link_char.assert_has_calls(
1290             [call("pil_latency"), call("pil_jitter"), call("pil_price")]
1291         )
1292
1293 1         regexps = [
1294             r"\{.*\}",
1295             r".*'file':.*mznplacement.py",
1296             r".*'time':.*datetime.datetime\(.*\)",
1297         ]
1298 1         generator_data = str(nspd["generator_data"])
1299 1         for regex in regexps:
1300 1             self.assertRegex(generator_data, regex, "generator data invalid")
1301
1302
1303 1 if __name__ == "__main__":
1304 0     if __name__ == "__main__":
1305 0         unittest.main()