Code Coverage

Cobertura Coverage Report > osm_pla.test >

test_mznmodels.py

Trend

File Coverage summary

NameClassesLinesConditionals
test_mznmodels.py
100%
1/1
91%
245/269
100%
0/0

Coverage Breakdown by Class

NameLinesConditionals
test_mznmodels.py
91%
245/269
N/A

Source

osm_pla/test/test_mznmodels.py
1 # Copyright 2019 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
16 # Note:
17 # This unit test file is generated -
18 # from: c:\Users\LG\Desktop\plarepo\documents\Test\pla_algo_test (pr_update_4).xlsx
19 # by code generator: mzntestcasegenerator.py
20 # at: 2019-12-04 09:26:38.412430
21 #############
22
23 1 import datetime
24 1 import logging
25 1 from unittest import TestCase
26
27 1 from osm_pla.placement.mznplacement import MznPlacementConductor, MznModelGenerator
28
29
30 1 class TestMznModels(TestCase):
31 1     def test_mznmodel_scenario1_subtestcase1(self):
32         # generate the model
33 1         ns_placement_data = {
34             "vim_accounts": [
35                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
36                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
37                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
38                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
39                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
40                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
41                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
42                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
43                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
44                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
45             ],
46             "trp_link_latency": [
47                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
48                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
49                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
50                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
51                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
52                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
53                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
54                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
55                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
56                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
57             ],
58             "trp_link_jitter": [
59                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
60                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
61                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
62                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
63                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
64                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
65                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
66                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
67                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
68                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
69             ],
70             "trp_link_price_list": [
71                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
72                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
73                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
74                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
75                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
76                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
77                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
78                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
79                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
80                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
81             ],
82             "ns_desc": [
83                 {
84                     "vnf_id": "1",
85                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
86                 },
87                 {
88                     "vnf_id": "2",
89                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
90                 },
91                 {
92                     "vnf_id": "3",
93                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
94                 },
95             ],
96             "vld_desc": [
97                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
98                 {"cp_refs": ["2", "3"], "latency": 120, "jitter": 20},
99             ],
100             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
101         }
102
103 1         mg = MznModelGenerator(logging.getLogger(__name__))
104 1         test_mzn_model = mg.create_model(ns_placement_data)
105
106         # run the model
107 1         expected_result = [
108             {
109                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
110                 "member-vnf-index": "1",
111             },
112             {
113                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
114                 "member-vnf-index": "2",
115             },
116             {
117                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
118                 "member-vnf-index": "3",
119             },
120         ]
121
122 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
123 1         placement = mpc._run_placement_model(
124             mzn_model=test_mzn_model,
125             ns_desc=[
126                 {
127                     "vnf_id": "1",
128                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
129                 },
130                 {
131                     "vnf_id": "2",
132                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
133                 },
134                 {
135                     "vnf_id": "3",
136                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
137                 },
138             ],
139         )
140         # sort the result to ease assert with expected result
141 1         if not placement[0]:
142 0             sorted_placement = placement
143         else:
144 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
145 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
146
147 1     def test_mznmodel_scenario1_subtestcase2(self):
148         # generate the model
149 1         ns_placement_data = {
150             "vim_accounts": [
151                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
152                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
153                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
154                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
155                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
156                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
157                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
158                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
159                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
160                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
161             ],
162             "trp_link_latency": [
163                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
164                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
165                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
166                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
167                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
168                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
169                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
170                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
171                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
172                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
173             ],
174             "trp_link_jitter": [
175                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
176                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
177                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
178                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
179                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
180                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
181                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
182                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
183                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
184                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
185             ],
186             "trp_link_price_list": [
187                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
188                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
189                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
190                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
191                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
192                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
193                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
194                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
195                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
196                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
197             ],
198             "ns_desc": [
199                 {
200                     "vnf_id": "1",
201                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
202                     "vim_account": "vim33333333_38f5_438d_b8ee_3f93b3531f87",
203                 },
204                 {
205                     "vnf_id": "2",
206                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
207                 },
208                 {
209                     "vnf_id": "3",
210                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
211                 },
212             ],
213             "vld_desc": [
214                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
215                 {"cp_refs": ["2", "3"], "latency": 120, "jitter": 20},
216             ],
217             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
218         }
219
220 1         mg = MznModelGenerator(logging.getLogger(__name__))
221 1         test_mzn_model = mg.create_model(ns_placement_data)
222
223         # run the model
224 1         expected_result = [
225             {
226                 "vimAccountId": "33333333-38f5-438d-b8ee-3f93b3531f87",
227                 "member-vnf-index": "1",
228             },
229             {
230                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
231                 "member-vnf-index": "2",
232             },
233             {
234                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
235                 "member-vnf-index": "3",
236             },
237         ]
238
239 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
240 1         placement = mpc._run_placement_model(
241             mzn_model=test_mzn_model,
242             ns_desc=[
243                 {
244                     "vnf_id": "1",
245                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
246                     "vim_account": "vim33333333_38f5_438d_b8ee_3f93b3531f87",
247                 },
248                 {
249                     "vnf_id": "2",
250                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
251                 },
252                 {
253                     "vnf_id": "3",
254                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
255                 },
256             ],
257         )
258         # sort the result to ease assert with expected result
259 1         if not placement[0]:
260 0             sorted_placement = placement
261         else:
262 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
263 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
264
265 1     def test_mznmodel_scenario1_subtestcase3(self):
266         # generate the model
267 1         ns_placement_data = {
268             "vim_accounts": [
269                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
270                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
271                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
272                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
273                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
274                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
275                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
276                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
277                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
278                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
279             ],
280             "trp_link_latency": [
281                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
282                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
283                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
284                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
285                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
286                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
287                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
288                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
289                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
290                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
291             ],
292             "trp_link_jitter": [
293                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
294                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
295                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
296                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
297                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
298                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
299                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
300                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
301                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
302                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
303             ],
304             "trp_link_price_list": [
305                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
306                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
307                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
308                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
309                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
310                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
311                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
312                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
313                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
314                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
315             ],
316             "ns_desc": [
317                 {
318                     "vnf_id": "1",
319                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
320                     "vim_account": "vim22222222_38f5_438d_b8ee_3f93b3531f87",
321                 },
322                 {
323                     "vnf_id": "2",
324                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
325                 },
326                 {
327                     "vnf_id": "3",
328                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
329                 },
330             ],
331             "vld_desc": [
332                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
333                 {"cp_refs": ["2", "3"], "latency": 120, "jitter": 20},
334             ],
335             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
336         }
337
338 1         mg = MznModelGenerator(logging.getLogger(__name__))
339 1         test_mzn_model = mg.create_model(ns_placement_data)
340
341         # run the model
342 1         expected_result = [
343             {
344                 "vimAccountId": "22222222-38f5-438d-b8ee-3f93b3531f87",
345                 "member-vnf-index": "1",
346             },
347             {
348                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
349                 "member-vnf-index": "2",
350             },
351             {
352                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
353                 "member-vnf-index": "3",
354             },
355         ]
356
357 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
358 1         placement = mpc._run_placement_model(
359             mzn_model=test_mzn_model,
360             ns_desc=[
361                 {
362                     "vnf_id": "1",
363                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
364                     "vim_account": "vim22222222_38f5_438d_b8ee_3f93b3531f87",
365                 },
366                 {
367                     "vnf_id": "2",
368                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
369                 },
370                 {
371                     "vnf_id": "3",
372                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
373                 },
374             ],
375         )
376         # sort the result to ease assert with expected result
377 1         if not placement[0]:
378 0             sorted_placement = placement
379         else:
380 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
381 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
382
383 1     def test_mznmodel_scenario1_subtestcase4(self):
384         # generate the model
385 1         ns_placement_data = {
386             "vim_accounts": [
387                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
388                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
389                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
390                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
391                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
392                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
393                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
394                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
395                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
396                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
397             ],
398             "trp_link_latency": [
399                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
400                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
401                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
402                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
403                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
404                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
405                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
406                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
407                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
408                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
409             ],
410             "trp_link_jitter": [
411                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
412                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
413                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
414                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
415                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
416                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
417                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
418                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
419                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
420                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
421             ],
422             "trp_link_price_list": [
423                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
424                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
425                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
426                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
427                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
428                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
429                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
430                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
431                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
432                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
433             ],
434             "ns_desc": [
435                 {
436                     "vnf_id": "1",
437                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
438                     "vim_account": "vim44444444_38f5_438d_b8ee_3f93b3531f87",
439                 },
440                 {
441                     "vnf_id": "2",
442                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
443                 },
444                 {
445                     "vnf_id": "3",
446                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
447                 },
448             ],
449             "vld_desc": [
450                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
451                 {"cp_refs": ["2", "3"], "latency": 120, "jitter": 20},
452             ],
453             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
454         }
455
456 1         mg = MznModelGenerator(logging.getLogger(__name__))
457 1         test_mzn_model = mg.create_model(ns_placement_data)
458
459         # run the model
460 1         expected_result = [
461             {
462                 "vimAccountId": "44444444-38f5-438d-b8ee-3f93b3531f87",
463                 "member-vnf-index": "1",
464             },
465             {
466                 "vimAccountId": "22222222-38f5-438d-b8ee-3f93b3531f87",
467                 "member-vnf-index": "2",
468             },
469             {
470                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
471                 "member-vnf-index": "3",
472             },
473         ]
474
475 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
476 1         placement = mpc._run_placement_model(
477             mzn_model=test_mzn_model,
478             ns_desc=[
479                 {
480                     "vnf_id": "1",
481                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
482                     "vim_account": "vim44444444_38f5_438d_b8ee_3f93b3531f87",
483                 },
484                 {
485                     "vnf_id": "2",
486                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
487                 },
488                 {
489                     "vnf_id": "3",
490                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
491                 },
492             ],
493         )
494         # sort the result to ease assert with expected result
495 1         if not placement[0]:
496 0             sorted_placement = placement
497         else:
498 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
499 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
500
501 1     def test_mznmodel_scenario1_subtestcase5(self):
502         # generate the model
503 1         ns_placement_data = {
504             "vim_accounts": [
505                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
506                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
507                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
508                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
509                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
510                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
511                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
512                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
513                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
514                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
515             ],
516             "trp_link_latency": [
517                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
518                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
519                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
520                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
521                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
522                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
523                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
524                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
525                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
526                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
527             ],
528             "trp_link_jitter": [
529                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
530                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
531                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
532                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
533                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
534                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
535                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
536                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
537                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
538                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
539             ],
540             "trp_link_price_list": [
541                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
542                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
543                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
544                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
545                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
546                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
547                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
548                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
549                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
550                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
551             ],
552             "ns_desc": [
553                 {
554                     "vnf_id": "1",
555                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
556                     "vim_account": "vim88888888_38f5_438d_b8ee_3f93b3531f87",
557                 },
558                 {
559                     "vnf_id": "2",
560                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
561                 },
562                 {
563                     "vnf_id": "3",
564                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
565                 },
566             ],
567             "vld_desc": [
568                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
569                 {"cp_refs": ["2", "3"], "latency": 120, "jitter": 20},
570             ],
571             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
572         }
573
574 1         mg = MznModelGenerator(logging.getLogger(__name__))
575 1         test_mzn_model = mg.create_model(ns_placement_data)
576
577         # run the model
578 1         expected_result = [
579             {
580                 "vimAccountId": "88888888-38f5-438d-b8ee-3f93b3531f87",
581                 "member-vnf-index": "1",
582             },
583             {
584                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
585                 "member-vnf-index": "2",
586             },
587             {
588                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
589                 "member-vnf-index": "3",
590             },
591         ]
592
593 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
594 1         placement = mpc._run_placement_model(
595             mzn_model=test_mzn_model,
596             ns_desc=[
597                 {
598                     "vnf_id": "1",
599                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
600                     "vim_account": "vim88888888_38f5_438d_b8ee_3f93b3531f87",
601                 },
602                 {
603                     "vnf_id": "2",
604                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
605                 },
606                 {
607                     "vnf_id": "3",
608                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
609                 },
610             ],
611         )
612         # sort the result to ease assert with expected result
613 1         if not placement[0]:
614 0             sorted_placement = placement
615         else:
616 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
617 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
618
619 1     def test_mznmodel_scenario1_subtestcase6(self):
620         # generate the model
621 1         ns_placement_data = {
622             "vim_accounts": [
623                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
624                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
625                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
626                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
627                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
628                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
629                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
630                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
631                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
632                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
633             ],
634             "trp_link_latency": [
635                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
636                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
637                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
638                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
639                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
640                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
641                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
642                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
643                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
644                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
645             ],
646             "trp_link_jitter": [
647                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
648                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
649                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
650                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
651                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
652                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
653                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
654                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
655                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
656                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
657             ],
658             "trp_link_price_list": [
659                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
660                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
661                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
662                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
663                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
664                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
665                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
666                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
667                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
668                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
669             ],
670             "ns_desc": [
671                 {
672                     "vnf_id": "1",
673                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
674                     "vim_account": "vim99999999_38f5_438d_b8ee_3f93b3531f87",
675                 },
676                 {
677                     "vnf_id": "2",
678                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
679                 },
680                 {
681                     "vnf_id": "3",
682                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
683                 },
684             ],
685             "vld_desc": [
686                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
687                 {"cp_refs": ["2", "3"], "latency": 120, "jitter": 20},
688             ],
689             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
690         }
691
692 1         mg = MznModelGenerator(logging.getLogger(__name__))
693 1         test_mzn_model = mg.create_model(ns_placement_data)
694
695         # run the model
696 1         expected_result = [
697             {
698                 "vimAccountId": "99999999-38f5-438d-b8ee-3f93b3531f87",
699                 "member-vnf-index": "1",
700             },
701             {
702                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
703                 "member-vnf-index": "2",
704             },
705             {
706                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
707                 "member-vnf-index": "3",
708             },
709         ]
710
711 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
712 1         placement = mpc._run_placement_model(
713             mzn_model=test_mzn_model,
714             ns_desc=[
715                 {
716                     "vnf_id": "1",
717                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
718                     "vim_account": "vim99999999_38f5_438d_b8ee_3f93b3531f87",
719                 },
720                 {
721                     "vnf_id": "2",
722                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
723                 },
724                 {
725                     "vnf_id": "3",
726                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
727                 },
728             ],
729         )
730         # sort the result to ease assert with expected result
731 1         if not placement[0]:
732 0             sorted_placement = placement
733         else:
734 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
735 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
736
737 1     def test_mznmodel_scenario1_subtestcase7(self):
738         # generate the model
739 1         ns_placement_data = {
740             "vim_accounts": [
741                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
742                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
743                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
744                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
745                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
746                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
747                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
748                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
749                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
750                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
751             ],
752             "trp_link_latency": [
753                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
754                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
755                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
756                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
757                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
758                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
759                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
760                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
761                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
762                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
763             ],
764             "trp_link_jitter": [
765                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
766                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
767                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
768                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
769                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
770                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
771                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
772                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
773                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
774                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
775             ],
776             "trp_link_price_list": [
777                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
778                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
779                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
780                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
781                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
782                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
783                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
784                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
785                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
786                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
787             ],
788             "ns_desc": [
789                 {
790                     "vnf_id": "1",
791                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
792                     "vim_account": "vim11111111_38f5_438d_b8ee_3f93b3531f87",
793                 },
794                 {
795                     "vnf_id": "2",
796                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
797                     "vim_account": "vim33333333_38f5_438d_b8ee_3f93b3531f87",
798                 },
799                 {
800                     "vnf_id": "3",
801                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
802                     "vim_account": "vim77777777_38f5_438d_b8ee_3f93b3531f87",
803                 },
804             ],
805             "vld_desc": [
806                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
807                 {"cp_refs": ["2", "3"], "latency": 120, "jitter": 20},
808             ],
809             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
810         }
811
812 1         mg = MznModelGenerator(logging.getLogger(__name__))
813 1         test_mzn_model = mg.create_model(ns_placement_data)
814
815         # run the model
816 1         expected_result = [{}]
817
818 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
819 1         placement = mpc._run_placement_model(
820             mzn_model=test_mzn_model,
821             ns_desc=[
822                 {
823                     "vnf_id": "1",
824                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
825                     "vim_account": "vim11111111_38f5_438d_b8ee_3f93b3531f87",
826                 },
827                 {
828                     "vnf_id": "2",
829                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
830                     "vim_account": "vim33333333_38f5_438d_b8ee_3f93b3531f87",
831                 },
832                 {
833                     "vnf_id": "3",
834                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
835                     "vim_account": "vim77777777_38f5_438d_b8ee_3f93b3531f87",
836                 },
837             ],
838         )
839         # sort the result to ease assert with expected result
840 1         if not placement[0]:
841 1             sorted_placement = placement
842         else:
843 0             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
844 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
845
846 1     def test_mznmodel_scenario1_subtestcase8(self):
847         # generate the model
848 1         ns_placement_data = {
849             "vim_accounts": [
850                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
851                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
852                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
853                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
854                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
855                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
856                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
857                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
858                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
859                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
860             ],
861             "trp_link_latency": [
862                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
863                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
864                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
865                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
866                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
867                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
868                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
869                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
870                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
871                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
872             ],
873             "trp_link_jitter": [
874                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
875                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
876                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
877                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
878                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
879                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
880                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
881                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
882                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
883                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
884             ],
885             "trp_link_price_list": [
886                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
887                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
888                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
889                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
890                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
891                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
892                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
893                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
894                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
895                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
896             ],
897             "ns_desc": [
898                 {
899                     "vnf_id": "1",
900                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
901                     "vim_account": "vim77777777_38f5_438d_b8ee_3f93b3531f87",
902                 },
903                 {
904                     "vnf_id": "2",
905                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
906                 },
907                 {
908                     "vnf_id": "3",
909                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
910                 },
911             ],
912             "vld_desc": [
913                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
914                 {"cp_refs": ["2", "3"], "latency": 120, "jitter": 20},
915             ],
916             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
917         }
918
919 1         mg = MznModelGenerator(logging.getLogger(__name__))
920 1         test_mzn_model = mg.create_model(ns_placement_data)
921
922         # run the model
923 1         expected_result = [
924             {
925                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
926                 "member-vnf-index": "1",
927             },
928             {
929                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
930                 "member-vnf-index": "2",
931             },
932             {
933                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
934                 "member-vnf-index": "3",
935             },
936         ]
937
938 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
939 1         placement = mpc._run_placement_model(
940             mzn_model=test_mzn_model,
941             ns_desc=[
942                 {
943                     "vnf_id": "1",
944                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
945                     "vim_account": "vim77777777_38f5_438d_b8ee_3f93b3531f87",
946                 },
947                 {
948                     "vnf_id": "2",
949                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
950                 },
951                 {
952                     "vnf_id": "3",
953                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
954                 },
955             ],
956         )
957         # sort the result to ease assert with expected result
958 1         if not placement[0]:
959 0             sorted_placement = placement
960         else:
961 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
962 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
963
964 1     def test_mznmodel_scenario2_subtestcase1(self):
965         # generate the model
966 1         ns_placement_data = {
967             "vim_accounts": [
968                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
969                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
970                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
971                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
972                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
973                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
974                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
975                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
976                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
977                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
978             ],
979             "trp_link_latency": [
980                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
981                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
982                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
983                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
984                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
985                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
986                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
987                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
988                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
989                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
990             ],
991             "trp_link_jitter": [
992                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
993                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
994                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
995                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
996                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
997                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
998                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
999                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
1000                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
1001                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
1002             ],
1003             "trp_link_price_list": [
1004                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1005                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1006                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
1007                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1008                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
1009                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
1010                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
1011                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
1012                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
1013                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
1014             ],
1015             "ns_desc": [
1016                 {
1017                     "vnf_id": "1",
1018                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1019                 },
1020                 {
1021                     "vnf_id": "2",
1022                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1023                 },
1024                 {
1025                     "vnf_id": "3",
1026                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1027                 },
1028             ],
1029             "vld_desc": [
1030                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
1031                 {"cp_refs": ["2", "3"], "latency": 20, "jitter": 6},
1032             ],
1033             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
1034         }
1035
1036 1         mg = MznModelGenerator(logging.getLogger(__name__))
1037 1         test_mzn_model = mg.create_model(ns_placement_data)
1038
1039         # run the model
1040 1         expected_result = [
1041             {
1042                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
1043                 "member-vnf-index": "1",
1044             },
1045             {
1046                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
1047                 "member-vnf-index": "2",
1048             },
1049             {
1050                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
1051                 "member-vnf-index": "3",
1052             },
1053         ]
1054
1055 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
1056 1         placement = mpc._run_placement_model(
1057             mzn_model=test_mzn_model,
1058             ns_desc=[
1059                 {
1060                     "vnf_id": "1",
1061                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1062                 },
1063                 {
1064                     "vnf_id": "2",
1065                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1066                 },
1067                 {
1068                     "vnf_id": "3",
1069                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1070                 },
1071             ],
1072         )
1073         # sort the result to ease assert with expected result
1074 1         if not placement[0]:
1075 0             sorted_placement = placement
1076         else:
1077 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
1078 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
1079
1080 1     def test_mznmodel_scenario2_subtestcase2(self):
1081         # generate the model
1082 1         ns_placement_data = {
1083             "vim_accounts": [
1084                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
1085                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
1086                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
1087                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
1088                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1089                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1090                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
1091                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
1092                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
1093                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
1094             ],
1095             "trp_link_latency": [
1096                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
1097                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
1098                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
1099                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1100                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
1101                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
1102                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
1103                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
1104                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
1105                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
1106             ],
1107             "trp_link_jitter": [
1108                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1109                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1110                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
1111                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1112                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
1113                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
1114                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
1115                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
1116                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
1117                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
1118             ],
1119             "trp_link_price_list": [
1120                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1121                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1122                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
1123                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1124                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
1125                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
1126                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
1127                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
1128                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
1129                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
1130             ],
1131             "ns_desc": [
1132                 {
1133                     "vnf_id": "1",
1134                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1135                     "vim_account": "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1136                 },
1137                 {
1138                     "vnf_id": "2",
1139                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1140                 },
1141                 {
1142                     "vnf_id": "3",
1143                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1144                 },
1145             ],
1146             "vld_desc": [
1147                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
1148                 {"cp_refs": ["2", "3"], "latency": 20, "jitter": 6},
1149             ],
1150             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
1151         }
1152
1153 1         mg = MznModelGenerator(logging.getLogger(__name__))
1154 1         test_mzn_model = mg.create_model(ns_placement_data)
1155
1156         # run the model
1157 1         expected_result = [
1158             {
1159                 "vimAccountId": "44444444-38f5-438d-b8ee-3f93b3531f87",
1160                 "member-vnf-index": "1",
1161             },
1162             {
1163                 "vimAccountId": "22222222-38f5-438d-b8ee-3f93b3531f87",
1164                 "member-vnf-index": "2",
1165             },
1166             {
1167                 "vimAccountId": "22222222-38f5-438d-b8ee-3f93b3531f87",
1168                 "member-vnf-index": "3",
1169             },
1170         ]
1171
1172 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
1173 1         placement = mpc._run_placement_model(
1174             mzn_model=test_mzn_model,
1175             ns_desc=[
1176                 {
1177                     "vnf_id": "1",
1178                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1179                     "vim_account": "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1180                 },
1181                 {
1182                     "vnf_id": "2",
1183                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1184                 },
1185                 {
1186                     "vnf_id": "3",
1187                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1188                 },
1189             ],
1190         )
1191         # sort the result to ease assert with expected result
1192 1         if not placement[0]:
1193 0             sorted_placement = placement
1194         else:
1195 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
1196 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
1197
1198 1     def test_mznmodel_scenario2_subtestcase3(self):
1199         # generate the model
1200 1         ns_placement_data = {
1201             "vim_accounts": [
1202                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
1203                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
1204                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
1205                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
1206                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1207                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1208                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
1209                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
1210                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
1211                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
1212             ],
1213             "trp_link_latency": [
1214                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
1215                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
1216                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
1217                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1218                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
1219                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
1220                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
1221                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
1222                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
1223                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
1224             ],
1225             "trp_link_jitter": [
1226                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1227                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1228                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
1229                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1230                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
1231                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
1232                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
1233                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
1234                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
1235                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
1236             ],
1237             "trp_link_price_list": [
1238                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1239                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1240                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
1241                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1242                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
1243                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
1244                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
1245                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
1246                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
1247                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
1248             ],
1249             "ns_desc": [
1250                 {
1251                     "vnf_id": "1",
1252                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1253                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1254                 },
1255                 {
1256                     "vnf_id": "2",
1257                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1258                 },
1259                 {
1260                     "vnf_id": "3",
1261                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1262                 },
1263             ],
1264             "vld_desc": [
1265                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
1266                 {"cp_refs": ["2", "3"], "latency": 20, "jitter": 6},
1267             ],
1268             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
1269         }
1270
1271 1         mg = MznModelGenerator(logging.getLogger(__name__))
1272 1         test_mzn_model = mg.create_model(ns_placement_data)
1273
1274         # run the model
1275 1         expected_result = [
1276             {
1277                 "vimAccountId": "55555555-38f5-438d-b8ee-3f93b3531f87",
1278                 "member-vnf-index": "1",
1279             },
1280             {
1281                 "vimAccountId": "66666666-38f5-438d-b8ee-3f93b3531f87",
1282                 "member-vnf-index": "2",
1283             },
1284             {
1285                 "vimAccountId": "66666666-38f5-438d-b8ee-3f93b3531f87",
1286                 "member-vnf-index": "3",
1287             },
1288         ]
1289
1290 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
1291 1         placement = mpc._run_placement_model(
1292             mzn_model=test_mzn_model,
1293             ns_desc=[
1294                 {
1295                     "vnf_id": "1",
1296                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1297                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1298                 },
1299                 {
1300                     "vnf_id": "2",
1301                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1302                 },
1303                 {
1304                     "vnf_id": "3",
1305                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1306                 },
1307             ],
1308         )
1309         # sort the result to ease assert with expected result
1310 1         if not placement[0]:
1311 0             sorted_placement = placement
1312         else:
1313 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
1314 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
1315
1316 1     def test_mznmodel_scenario2_subtestcase4(self):
1317         # generate the model
1318 1         ns_placement_data = {
1319             "vim_accounts": [
1320                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
1321                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
1322                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
1323                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
1324                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1325                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1326                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
1327                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
1328                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
1329                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
1330             ],
1331             "trp_link_latency": [
1332                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
1333                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
1334                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
1335                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1336                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
1337                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
1338                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
1339                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
1340                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
1341                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
1342             ],
1343             "trp_link_jitter": [
1344                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1345                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1346                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
1347                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1348                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
1349                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
1350                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
1351                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
1352                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
1353                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
1354             ],
1355             "trp_link_price_list": [
1356                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1357                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1358                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
1359                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1360                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
1361                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
1362                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
1363                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
1364                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
1365                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
1366             ],
1367             "ns_desc": [
1368                 {
1369                     "vnf_id": "1",
1370                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1371                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1372                 },
1373                 {
1374                     "vnf_id": "2",
1375                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1376                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1377                 },
1378                 {
1379                     "vnf_id": "3",
1380                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1381                 },
1382             ],
1383             "vld_desc": [
1384                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
1385                 {"cp_refs": ["2", "3"], "latency": 20, "jitter": 6},
1386             ],
1387             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
1388         }
1389
1390 1         mg = MznModelGenerator(logging.getLogger(__name__))
1391 1         test_mzn_model = mg.create_model(ns_placement_data)
1392
1393         # run the model
1394 1         expected_result = [
1395             {
1396                 "vimAccountId": "55555555-38f5-438d-b8ee-3f93b3531f87",
1397                 "member-vnf-index": "1",
1398             },
1399             {
1400                 "vimAccountId": "55555555-38f5-438d-b8ee-3f93b3531f87",
1401                 "member-vnf-index": "2",
1402             },
1403             {
1404                 "vimAccountId": "55555555-38f5-438d-b8ee-3f93b3531f87",
1405                 "member-vnf-index": "3",
1406             },
1407         ]
1408
1409 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
1410 1         placement = mpc._run_placement_model(
1411             mzn_model=test_mzn_model,
1412             ns_desc=[
1413                 {
1414                     "vnf_id": "1",
1415                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1416                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1417                 },
1418                 {
1419                     "vnf_id": "2",
1420                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1421                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1422                 },
1423                 {
1424                     "vnf_id": "3",
1425                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1426                 },
1427             ],
1428         )
1429         # sort the result to ease assert with expected result
1430 1         if not placement[0]:
1431 0             sorted_placement = placement
1432         else:
1433 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
1434 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
1435
1436 1     def test_mznmodel_scenario2_subtestcase5(self):
1437         # generate the model
1438 1         ns_placement_data = {
1439             "vim_accounts": [
1440                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
1441                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
1442                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
1443                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
1444                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1445                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1446                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
1447                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
1448                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
1449                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
1450             ],
1451             "trp_link_latency": [
1452                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
1453                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
1454                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
1455                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1456                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
1457                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
1458                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
1459                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
1460                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
1461                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
1462             ],
1463             "trp_link_jitter": [
1464                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1465                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1466                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
1467                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1468                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
1469                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
1470                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
1471                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
1472                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
1473                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
1474             ],
1475             "trp_link_price_list": [
1476                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1477                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1478                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
1479                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1480                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
1481                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
1482                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
1483                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
1484                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
1485                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
1486             ],
1487             "ns_desc": [
1488                 {
1489                     "vnf_id": "1",
1490                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1491                     "vim_account": "vim33333333_38f5_438d_b8ee_3f93b3531f87",
1492                 },
1493                 {
1494                     "vnf_id": "2",
1495                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1496                     "vim_account": "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1497                 },
1498                 {
1499                     "vnf_id": "3",
1500                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1501                 },
1502             ],
1503             "vld_desc": [
1504                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
1505                 {"cp_refs": ["2", "3"], "latency": 20, "jitter": 6},
1506             ],
1507             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
1508         }
1509
1510 1         mg = MznModelGenerator(logging.getLogger(__name__))
1511 1         test_mzn_model = mg.create_model(ns_placement_data)
1512
1513         # run the model
1514 1         expected_result = [{}]
1515
1516 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
1517 1         placement = mpc._run_placement_model(
1518             mzn_model=test_mzn_model,
1519             ns_desc=[
1520                 {
1521                     "vnf_id": "1",
1522                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1523                     "vim_account": "vim33333333_38f5_438d_b8ee_3f93b3531f87",
1524                 },
1525                 {
1526                     "vnf_id": "2",
1527                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1528                     "vim_account": "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1529                 },
1530                 {
1531                     "vnf_id": "3",
1532                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1533                 },
1534             ],
1535         )
1536         # sort the result to ease assert with expected result
1537 1         if not placement[0]:
1538 1             sorted_placement = placement
1539         else:
1540 0             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
1541 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
1542
1543 1     def test_mznmodel_scenario2_subtestcase6(self):
1544         # generate the model
1545 1         ns_placement_data = {
1546             "vim_accounts": [
1547                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
1548                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
1549                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
1550                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
1551                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1552                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1553                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
1554                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
1555                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
1556                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
1557             ],
1558             "trp_link_latency": [
1559                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
1560                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
1561                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
1562                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1563                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
1564                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
1565                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
1566                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
1567                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
1568                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
1569             ],
1570             "trp_link_jitter": [
1571                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1572                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1573                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
1574                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1575                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
1576                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
1577                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
1578                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
1579                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
1580                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
1581             ],
1582             "trp_link_price_list": [
1583                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1584                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1585                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
1586                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1587                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
1588                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
1589                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
1590                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
1591                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
1592                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
1593             ],
1594             "ns_desc": [
1595                 {
1596                     "vnf_id": "1",
1597                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1598                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1599                 },
1600                 {
1601                     "vnf_id": "2",
1602                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1603                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1604                 },
1605                 {
1606                     "vnf_id": "3",
1607                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1608                     "vim_account": "vim66666666_38f5_438d_b8ee_3f93b3531f87",
1609                 },
1610             ],
1611             "vld_desc": [
1612                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
1613                 {"cp_refs": ["2", "3"], "latency": 20, "jitter": 6},
1614             ],
1615             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
1616         }
1617
1618 1         mg = MznModelGenerator(logging.getLogger(__name__))
1619 1         test_mzn_model = mg.create_model(ns_placement_data)
1620
1621         # run the model
1622 1         expected_result = [{}]
1623
1624 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
1625 1         placement = mpc._run_placement_model(
1626             mzn_model=test_mzn_model,
1627             ns_desc=[
1628                 {
1629                     "vnf_id": "1",
1630                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1631                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1632                 },
1633                 {
1634                     "vnf_id": "2",
1635                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1636                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1637                 },
1638                 {
1639                     "vnf_id": "3",
1640                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1641                     "vim_account": "vim66666666_38f5_438d_b8ee_3f93b3531f87",
1642                 },
1643             ],
1644         )
1645         # sort the result to ease assert with expected result
1646 1         if not placement[0]:
1647 1             sorted_placement = placement
1648         else:
1649 0             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
1650 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
1651
1652 1     def test_mznmodel_scenario3_subtestcase1(self):
1653         # generate the model
1654 1         ns_placement_data = {
1655             "vim_accounts": [
1656                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
1657                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
1658                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
1659                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
1660                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1661                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1662                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
1663                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
1664                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
1665                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
1666             ],
1667             "trp_link_latency": [
1668                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
1669                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
1670                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
1671                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1672                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
1673                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
1674                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
1675                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
1676                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
1677                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
1678             ],
1679             "trp_link_jitter": [
1680                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1681                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1682                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
1683                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1684                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
1685                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
1686                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
1687                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
1688                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
1689                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
1690             ],
1691             "trp_link_price_list": [
1692                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1693                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1694                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
1695                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1696                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
1697                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
1698                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
1699                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
1700                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
1701                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
1702             ],
1703             "ns_desc": [
1704                 {
1705                     "vnf_id": "1",
1706                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1707                 },
1708                 {
1709                     "vnf_id": "2",
1710                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1711                 },
1712                 {
1713                     "vnf_id": "3",
1714                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1715                 },
1716             ],
1717             "vld_desc": [
1718                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 3},
1719                 {"cp_refs": ["2", "3"], "latency": 25, "jitter": 6},
1720             ],
1721             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
1722         }
1723
1724 1         mg = MznModelGenerator(logging.getLogger(__name__))
1725 1         test_mzn_model = mg.create_model(ns_placement_data)
1726
1727         # run the model
1728 1         expected_result = [
1729             {
1730                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
1731                 "member-vnf-index": "1",
1732             },
1733             {
1734                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
1735                 "member-vnf-index": "2",
1736             },
1737             {
1738                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
1739                 "member-vnf-index": "3",
1740             },
1741         ]
1742
1743 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
1744 1         placement = mpc._run_placement_model(
1745             mzn_model=test_mzn_model,
1746             ns_desc=[
1747                 {
1748                     "vnf_id": "1",
1749                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1750                 },
1751                 {
1752                     "vnf_id": "2",
1753                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1754                 },
1755                 {
1756                     "vnf_id": "3",
1757                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1758                 },
1759             ],
1760         )
1761         # sort the result to ease assert with expected result
1762 1         if not placement[0]:
1763 0             sorted_placement = placement
1764         else:
1765 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
1766 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
1767
1768 1     def test_mznmodel_scenario3_subtestcase2(self):
1769         # generate the model
1770 1         ns_placement_data = {
1771             "vim_accounts": [
1772                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
1773                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
1774                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
1775                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
1776                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1777                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1778                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
1779                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
1780                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
1781                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
1782             ],
1783             "trp_link_latency": [
1784                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
1785                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
1786                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
1787                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1788                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
1789                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
1790                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
1791                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
1792                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
1793                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
1794             ],
1795             "trp_link_jitter": [
1796                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1797                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1798                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
1799                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1800                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
1801                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
1802                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
1803                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
1804                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
1805                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
1806             ],
1807             "trp_link_price_list": [
1808                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1809                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1810                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
1811                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1812                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
1813                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
1814                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
1815                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
1816                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
1817                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
1818             ],
1819             "ns_desc": [
1820                 {
1821                     "vnf_id": "1",
1822                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1823                     "vim_account": "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1824                 },
1825                 {
1826                     "vnf_id": "2",
1827                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1828                     "vim_account": "vim22222222_38f5_438d_b8ee_3f93b3531f87",
1829                 },
1830                 {
1831                     "vnf_id": "3",
1832                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1833                 },
1834             ],
1835             "vld_desc": [
1836                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 3},
1837                 {"cp_refs": ["2", "3"], "latency": 25, "jitter": 6},
1838             ],
1839             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
1840         }
1841
1842 1         mg = MznModelGenerator(logging.getLogger(__name__))
1843 1         test_mzn_model = mg.create_model(ns_placement_data)
1844
1845         # run the model
1846 1         expected_result = [{}]
1847
1848 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
1849 1         placement = mpc._run_placement_model(
1850             mzn_model=test_mzn_model,
1851             ns_desc=[
1852                 {
1853                     "vnf_id": "1",
1854                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1855                     "vim_account": "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1856                 },
1857                 {
1858                     "vnf_id": "2",
1859                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1860                     "vim_account": "vim22222222_38f5_438d_b8ee_3f93b3531f87",
1861                 },
1862                 {
1863                     "vnf_id": "3",
1864                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1865                 },
1866             ],
1867         )
1868         # sort the result to ease assert with expected result
1869 1         if not placement[0]:
1870 1             sorted_placement = placement
1871         else:
1872 0             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
1873 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
1874
1875 1     def test_mznmodel_scenario3_subtestcase3(self):
1876         # generate the model
1877 1         ns_placement_data = {
1878             "vim_accounts": [
1879                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
1880                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
1881                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
1882                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
1883                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
1884                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
1885                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
1886                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
1887                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
1888                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
1889             ],
1890             "trp_link_latency": [
1891                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
1892                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
1893                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
1894                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1895                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
1896                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
1897                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
1898                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
1899                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
1900                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
1901             ],
1902             "trp_link_jitter": [
1903                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1904                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1905                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
1906                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1907                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
1908                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
1909                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
1910                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
1911                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
1912                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
1913             ],
1914             "trp_link_price_list": [
1915                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1916                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
1917                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
1918                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
1919                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
1920                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
1921                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
1922                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
1923                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
1924                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
1925             ],
1926             "ns_desc": [
1927                 {
1928                     "vnf_id": "1",
1929                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1930                     "vim_account": "vim77777777_38f5_438d_b8ee_3f93b3531f87",
1931                 },
1932                 {
1933                     "vnf_id": "2",
1934                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1935                 },
1936                 {
1937                     "vnf_id": "3",
1938                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1939                 },
1940             ],
1941             "vld_desc": [
1942                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 3},
1943                 {"cp_refs": ["2", "3"], "latency": 25, "jitter": 6},
1944             ],
1945             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
1946         }
1947
1948 1         mg = MznModelGenerator(logging.getLogger(__name__))
1949 1         test_mzn_model = mg.create_model(ns_placement_data)
1950
1951         # run the model
1952 1         expected_result = [
1953             {
1954                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
1955                 "member-vnf-index": "1",
1956             },
1957             {
1958                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
1959                 "member-vnf-index": "2",
1960             },
1961             {
1962                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
1963                 "member-vnf-index": "3",
1964             },
1965         ]
1966
1967 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
1968 1         placement = mpc._run_placement_model(
1969             mzn_model=test_mzn_model,
1970             ns_desc=[
1971                 {
1972                     "vnf_id": "1",
1973                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
1974                     "vim_account": "vim77777777_38f5_438d_b8ee_3f93b3531f87",
1975                 },
1976                 {
1977                     "vnf_id": "2",
1978                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
1979                 },
1980                 {
1981                     "vnf_id": "3",
1982                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
1983                 },
1984             ],
1985         )
1986         # sort the result to ease assert with expected result
1987 1         if not placement[0]:
1988 0             sorted_placement = placement
1989         else:
1990 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
1991 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
1992
1993 1     def test_mznmodel_scenario3_subtestcase4(self):
1994         # generate the model
1995 1         ns_placement_data = {
1996             "vim_accounts": [
1997                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
1998                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
1999                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
2000                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
2001                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
2002                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2003                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
2004                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
2005                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
2006                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
2007             ],
2008             "trp_link_latency": [
2009                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
2010                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
2011                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
2012                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2013                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
2014                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
2015                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
2016                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
2017                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
2018                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
2019             ],
2020             "trp_link_jitter": [
2021                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2022                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2023                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
2024                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2025                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
2026                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
2027                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
2028                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
2029                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
2030                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
2031             ],
2032             "trp_link_price_list": [
2033                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2034                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2035                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
2036                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2037                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
2038                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
2039                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
2040                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
2041                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
2042                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
2043             ],
2044             "ns_desc": [
2045                 {
2046                     "vnf_id": "1",
2047                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2048                     "vim_account": "vim88888888_38f5_438d_b8ee_3f93b3531f87",
2049                 },
2050                 {
2051                     "vnf_id": "2",
2052                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
2053                 },
2054                 {
2055                     "vnf_id": "3",
2056                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
2057                 },
2058             ],
2059             "vld_desc": [
2060                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 3},
2061                 {"cp_refs": ["2", "3"], "latency": 25, "jitter": 6},
2062             ],
2063             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
2064         }
2065
2066 1         mg = MznModelGenerator(logging.getLogger(__name__))
2067 1         test_mzn_model = mg.create_model(ns_placement_data)
2068
2069         # run the model
2070 1         expected_result = [
2071             {
2072                 "vimAccountId": "88888888-38f5-438d-b8ee-3f93b3531f87",
2073                 "member-vnf-index": "1",
2074             },
2075             {
2076                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
2077                 "member-vnf-index": "2",
2078             },
2079             {
2080                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
2081                 "member-vnf-index": "3",
2082             },
2083         ]
2084
2085 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
2086 1         placement = mpc._run_placement_model(
2087             mzn_model=test_mzn_model,
2088             ns_desc=[
2089                 {
2090                     "vnf_id": "1",
2091                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2092                     "vim_account": "vim88888888_38f5_438d_b8ee_3f93b3531f87",
2093                 },
2094                 {
2095                     "vnf_id": "2",
2096                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
2097                 },
2098                 {
2099                     "vnf_id": "3",
2100                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
2101                 },
2102             ],
2103         )
2104         # sort the result to ease assert with expected result
2105 1         if not placement[0]:
2106 0             sorted_placement = placement
2107         else:
2108 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
2109 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
2110
2111 1     def test_mznmodel_scenario3_subtestcase5(self):
2112         # generate the model
2113 1         ns_placement_data = {
2114             "vim_accounts": [
2115                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
2116                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
2117                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
2118                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
2119                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
2120                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2121                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
2122                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
2123                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
2124                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
2125             ],
2126             "trp_link_latency": [
2127                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
2128                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
2129                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
2130                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2131                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
2132                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
2133                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
2134                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
2135                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
2136                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
2137             ],
2138             "trp_link_jitter": [
2139                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2140                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2141                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
2142                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2143                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
2144                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
2145                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
2146                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
2147                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
2148                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
2149             ],
2150             "trp_link_price_list": [
2151                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2152                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2153                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
2154                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2155                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
2156                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
2157                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
2158                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
2159                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
2160                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
2161             ],
2162             "ns_desc": [
2163                 {
2164                     "vnf_id": "1",
2165                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2166                     "vim_account": "vim99999999_38f5_438d_b8ee_3f93b3531f87",
2167                 },
2168                 {
2169                     "vnf_id": "2",
2170                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
2171                     "vim_account": "vim77777777_38f5_438d_b8ee_3f93b3531f87",
2172                 },
2173                 {
2174                     "vnf_id": "3",
2175                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
2176                     "vim_account": "vim88888888_38f5_438d_b8ee_3f93b3531f87",
2177                 },
2178             ],
2179             "vld_desc": [
2180                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 3},
2181                 {"cp_refs": ["2", "3"], "latency": 25, "jitter": 6},
2182             ],
2183             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
2184         }
2185
2186 1         mg = MznModelGenerator(logging.getLogger(__name__))
2187 1         test_mzn_model = mg.create_model(ns_placement_data)
2188
2189         # run the model
2190 1         expected_result = [{}]
2191
2192 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
2193 1         placement = mpc._run_placement_model(
2194             mzn_model=test_mzn_model,
2195             ns_desc=[
2196                 {
2197                     "vnf_id": "1",
2198                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2199                     "vim_account": "vim99999999_38f5_438d_b8ee_3f93b3531f87",
2200                 },
2201                 {
2202                     "vnf_id": "2",
2203                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
2204                     "vim_account": "vim77777777_38f5_438d_b8ee_3f93b3531f87",
2205                 },
2206                 {
2207                     "vnf_id": "3",
2208                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
2209                     "vim_account": "vim88888888_38f5_438d_b8ee_3f93b3531f87",
2210                 },
2211             ],
2212         )
2213         # sort the result to ease assert with expected result
2214 1         if not placement[0]:
2215 1             sorted_placement = placement
2216         else:
2217 0             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
2218 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
2219
2220 1     def test_mznmodel_scenario3_subtestcase6(self):
2221         # generate the model
2222 1         ns_placement_data = {
2223             "vim_accounts": [
2224                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
2225                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
2226                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
2227                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
2228                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
2229                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2230                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
2231                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
2232                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
2233                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
2234             ],
2235             "trp_link_latency": [
2236                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
2237                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
2238                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
2239                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2240                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
2241                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
2242                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
2243                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
2244                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
2245                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
2246             ],
2247             "trp_link_jitter": [
2248                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2249                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2250                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
2251                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2252                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
2253                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
2254                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
2255                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
2256                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
2257                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
2258             ],
2259             "trp_link_price_list": [
2260                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2261                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2262                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
2263                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2264                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
2265                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
2266                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
2267                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
2268                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
2269                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
2270             ],
2271             "ns_desc": [
2272                 {
2273                     "vnf_id": "1",
2274                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2275                     "vim_account": "vim77777777_38f5_438d_b8ee_3f93b3531f87",
2276                 },
2277                 {
2278                     "vnf_id": "2",
2279                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
2280                     "vim_account": "vim99999999_38f5_438d_b8ee_3f93b3531f87",
2281                 },
2282                 {
2283                     "vnf_id": "3",
2284                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
2285                 },
2286             ],
2287             "vld_desc": [
2288                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 3},
2289                 {"cp_refs": ["2", "3"], "latency": 25, "jitter": 6},
2290             ],
2291             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
2292         }
2293
2294 1         mg = MznModelGenerator(logging.getLogger(__name__))
2295 1         test_mzn_model = mg.create_model(ns_placement_data)
2296
2297         # run the model
2298 1         expected_result = [
2299             {
2300                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
2301                 "member-vnf-index": "1",
2302             },
2303             {
2304                 "vimAccountId": "99999999-38f5-438d-b8ee-3f93b3531f87",
2305                 "member-vnf-index": "2",
2306             },
2307             {
2308                 "vimAccountId": "77777777-38f5-438d-b8ee-3f93b3531f87",
2309                 "member-vnf-index": "3",
2310             },
2311         ]
2312
2313 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
2314 1         placement = mpc._run_placement_model(
2315             mzn_model=test_mzn_model,
2316             ns_desc=[
2317                 {
2318                     "vnf_id": "1",
2319                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2320                     "vim_account": "vim77777777_38f5_438d_b8ee_3f93b3531f87",
2321                 },
2322                 {
2323                     "vnf_id": "2",
2324                     "vnf_price_per_vim": ["10,15,30,30,100,70,40,150,150,150"],
2325                     "vim_account": "vim99999999_38f5_438d_b8ee_3f93b3531f87",
2326                 },
2327                 {
2328                     "vnf_id": "3",
2329                     "vnf_price_per_vim": ["30,30,60,40,100,90,40,150,200,170"],
2330                 },
2331             ],
2332         )
2333         # sort the result to ease assert with expected result
2334 1         if not placement[0]:
2335 0             sorted_placement = placement
2336         else:
2337 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
2338 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
2339
2340 1     def test_mznmodel_scenario4_subtestcase1(self):
2341         # generate the model
2342 1         ns_placement_data = {
2343             "vim_accounts": [
2344                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
2345                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
2346                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
2347                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
2348                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
2349                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2350                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
2351                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
2352                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
2353                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
2354             ],
2355             "trp_link_latency": [
2356                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
2357                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
2358                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
2359                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2360                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
2361                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
2362                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
2363                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
2364                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
2365                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
2366             ],
2367             "trp_link_jitter": [
2368                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2369                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2370                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
2371                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2372                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
2373                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
2374                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
2375                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
2376                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
2377                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
2378             ],
2379             "trp_link_price_list": [
2380                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2381                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2382                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
2383                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2384                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
2385                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
2386                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
2387                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
2388                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
2389                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
2390             ],
2391             "ns_desc": [
2392                 {
2393                     "vnf_id": "1",
2394                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2395                 },
2396                 {
2397                     "vnf_id": "2",
2398                     "vnf_price_per_vim": ["15,20,40,40,110,80,50,110,160,210"],
2399                 },
2400                 {
2401                     "vnf_id": "3",
2402                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2403                 },
2404                 {
2405                     "vnf_id": "4",
2406                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2407                 },
2408             ],
2409             "vld_desc": [
2410                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
2411                 {"cp_refs": ["2", "4"], "latency": 50, "jitter": 10},
2412                 {"cp_refs": ["2", "3"], "latency": 20, "jitter": 10},
2413             ],
2414             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
2415         }
2416
2417 1         mg = MznModelGenerator(logging.getLogger(__name__))
2418 1         test_mzn_model = mg.create_model(ns_placement_data)
2419
2420         # run the model
2421 1         expected_result = [
2422             {
2423                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
2424                 "member-vnf-index": "1",
2425             },
2426             {
2427                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
2428                 "member-vnf-index": "2",
2429             },
2430             {
2431                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
2432                 "member-vnf-index": "3",
2433             },
2434             {
2435                 "vimAccountId": "00000000-38f5-438d-b8ee-3f93b3531f87",
2436                 "member-vnf-index": "4",
2437             },
2438         ]
2439
2440 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
2441 1         placement = mpc._run_placement_model(
2442             mzn_model=test_mzn_model,
2443             ns_desc=[
2444                 {
2445                     "vnf_id": "1",
2446                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2447                 },
2448                 {
2449                     "vnf_id": "2",
2450                     "vnf_price_per_vim": ["15,20,40,40,110,80,50,110,160,210"],
2451                 },
2452                 {
2453                     "vnf_id": "3",
2454                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2455                 },
2456                 {
2457                     "vnf_id": "4",
2458                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2459                 },
2460             ],
2461         )
2462         # sort the result to ease assert with expected result
2463 1         if not placement[0]:
2464 0             sorted_placement = placement
2465         else:
2466 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
2467 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
2468
2469 1     def test_mznmodel_scenario4_subtestcase2(self):
2470         # generate the model
2471 1         ns_placement_data = {
2472             "vim_accounts": [
2473                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
2474                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
2475                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
2476                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
2477                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
2478                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2479                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
2480                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
2481                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
2482                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
2483             ],
2484             "trp_link_latency": [
2485                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
2486                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
2487                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
2488                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2489                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
2490                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
2491                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
2492                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
2493                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
2494                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
2495             ],
2496             "trp_link_jitter": [
2497                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2498                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2499                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
2500                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2501                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
2502                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
2503                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
2504                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
2505                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
2506                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
2507             ],
2508             "trp_link_price_list": [
2509                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2510                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2511                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
2512                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2513                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
2514                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
2515                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
2516                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
2517                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
2518                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
2519             ],
2520             "ns_desc": [
2521                 {
2522                     "vnf_id": "1",
2523                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2524                     "vim_account": "vim22222222_38f5_438d_b8ee_3f93b3531f87",
2525                 },
2526                 {
2527                     "vnf_id": "2",
2528                     "vnf_price_per_vim": ["15,20,40,40,110,80,50,110,160,210"],
2529                 },
2530                 {
2531                     "vnf_id": "3",
2532                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2533                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2534                 },
2535                 {
2536                     "vnf_id": "4",
2537                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2538                 },
2539             ],
2540             "vld_desc": [
2541                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
2542                 {"cp_refs": ["2", "4"], "latency": 50, "jitter": 10},
2543                 {"cp_refs": ["2", "3"], "latency": 20, "jitter": 10},
2544             ],
2545             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
2546         }
2547
2548 1         mg = MznModelGenerator(logging.getLogger(__name__))
2549 1         test_mzn_model = mg.create_model(ns_placement_data)
2550
2551         # run the model
2552 1         expected_result = [
2553             {
2554                 "vimAccountId": "22222222-38f5-438d-b8ee-3f93b3531f87",
2555                 "member-vnf-index": "1",
2556             },
2557             {
2558                 "vimAccountId": "44444444-38f5-438d-b8ee-3f93b3531f87",
2559                 "member-vnf-index": "2",
2560             },
2561             {
2562                 "vimAccountId": "55555555-38f5-438d-b8ee-3f93b3531f87",
2563                 "member-vnf-index": "3",
2564             },
2565             {
2566                 "vimAccountId": "66666666-38f5-438d-b8ee-3f93b3531f87",
2567                 "member-vnf-index": "4",
2568             },
2569         ]
2570
2571 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
2572 1         placement = mpc._run_placement_model(
2573             mzn_model=test_mzn_model,
2574             ns_desc=[
2575                 {
2576                     "vnf_id": "1",
2577                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2578                     "vim_account": "vim22222222_38f5_438d_b8ee_3f93b3531f87",
2579                 },
2580                 {
2581                     "vnf_id": "2",
2582                     "vnf_price_per_vim": ["15,20,40,40,110,80,50,110,160,210"],
2583                 },
2584                 {
2585                     "vnf_id": "3",
2586                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2587                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2588                 },
2589                 {
2590                     "vnf_id": "4",
2591                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2592                 },
2593             ],
2594         )
2595         # sort the result to ease assert with expected result
2596 1         if not placement[0]:
2597 0             sorted_placement = placement
2598         else:
2599 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
2600 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
2601
2602 1     def test_mznmodel_scenario4_subtestcase3(self):
2603         # generate the model
2604 1         ns_placement_data = {
2605             "vim_accounts": [
2606                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
2607                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
2608                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
2609                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
2610                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
2611                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2612                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
2613                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
2614                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
2615                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
2616             ],
2617             "trp_link_latency": [
2618                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
2619                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
2620                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
2621                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2622                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
2623                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
2624                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
2625                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
2626                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
2627                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
2628             ],
2629             "trp_link_jitter": [
2630                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2631                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2632                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
2633                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2634                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
2635                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
2636                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
2637                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
2638                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
2639                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
2640             ],
2641             "trp_link_price_list": [
2642                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2643                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2644                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
2645                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2646                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
2647                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
2648                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
2649                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
2650                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
2651                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
2652             ],
2653             "ns_desc": [
2654                 {
2655                     "vnf_id": "1",
2656                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2657                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2658                 },
2659                 {
2660                     "vnf_id": "2",
2661                     "vnf_price_per_vim": ["15,20,40,40,110,80,50,110,160,210"],
2662                 },
2663                 {
2664                     "vnf_id": "3",
2665                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2666                 },
2667                 {
2668                     "vnf_id": "4",
2669                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2670                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2671                 },
2672             ],
2673             "vld_desc": [
2674                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
2675                 {"cp_refs": ["2", "4"], "latency": 50, "jitter": 10},
2676                 {"cp_refs": ["2", "3"], "latency": 20, "jitter": 10},
2677             ],
2678             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
2679         }
2680
2681 1         mg = MznModelGenerator(logging.getLogger(__name__))
2682 1         test_mzn_model = mg.create_model(ns_placement_data)
2683
2684         # run the model
2685 1         expected_result = [
2686             {
2687                 "vimAccountId": "55555555-38f5-438d-b8ee-3f93b3531f87",
2688                 "member-vnf-index": "1",
2689             },
2690             {
2691                 "vimAccountId": "66666666-38f5-438d-b8ee-3f93b3531f87",
2692                 "member-vnf-index": "2",
2693             },
2694             {
2695                 "vimAccountId": "66666666-38f5-438d-b8ee-3f93b3531f87",
2696                 "member-vnf-index": "3",
2697             },
2698             {
2699                 "vimAccountId": "55555555-38f5-438d-b8ee-3f93b3531f87",
2700                 "member-vnf-index": "4",
2701             },
2702         ]
2703
2704 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
2705 1         placement = mpc._run_placement_model(
2706             mzn_model=test_mzn_model,
2707             ns_desc=[
2708                 {
2709                     "vnf_id": "1",
2710                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2711                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2712                 },
2713                 {
2714                     "vnf_id": "2",
2715                     "vnf_price_per_vim": ["15,20,40,40,110,80,50,110,160,210"],
2716                 },
2717                 {
2718                     "vnf_id": "3",
2719                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2720                 },
2721                 {
2722                     "vnf_id": "4",
2723                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2724                     "vim_account": "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2725                 },
2726             ],
2727         )
2728         # sort the result to ease assert with expected result
2729 1         if not placement[0]:
2730 0             sorted_placement = placement
2731         else:
2732 1             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
2733 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")
2734
2735 1     def test_mznmodel_scenario4_subtestcase4(self):
2736         # generate the model
2737 1         ns_placement_data = {
2738             "vim_accounts": [
2739                 "vim00000000_38f5_438d_b8ee_3f93b3531f87",
2740                 "vim11111111_38f5_438d_b8ee_3f93b3531f87",
2741                 "vim22222222_38f5_438d_b8ee_3f93b3531f87",
2742                 "vim33333333_38f5_438d_b8ee_3f93b3531f87",
2743                 "vim44444444_38f5_438d_b8ee_3f93b3531f87",
2744                 "vim55555555_38f5_438d_b8ee_3f93b3531f87",
2745                 "vim66666666_38f5_438d_b8ee_3f93b3531f87",
2746                 "vim77777777_38f5_438d_b8ee_3f93b3531f87",
2747                 "vim88888888_38f5_438d_b8ee_3f93b3531f87",
2748                 "vim99999999_38f5_438d_b8ee_3f93b3531f87",
2749             ],
2750             "trp_link_latency": [
2751                 [0, 30, 70, 80, 32767, 32767, 32767, 32767, 32767, 32767],
2752                 [30, 0, 75, 60, 32767, 32767, 32767, 32767, 32767, 32767],
2753                 [70, 75, 0, 40, 100, 32767, 32767, 32767, 32767, 32767],
2754                 [80, 60, 40, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2755                 [32767, 32767, 100, 32767, 0, 5, 5, 32767, 32767, 32767],
2756                 [32767, 32767, 32767, 32767, 5, 0, 5, 32767, 32767, 32767],
2757                 [32767, 32767, 32767, 32767, 5, 5, 0, 32767, 32767, 32767],
2758                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 30, 20],
2759                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 30, 0, 20],
2760                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 20, 20, 0],
2761             ],
2762             "trp_link_jitter": [
2763                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2764                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2765                 [5, 5, 0, 10, 5, 32767, 32767, 32767, 32767, 32767],
2766                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2767                 [32767, 32767, 5, 32767, 0, 4, 4, 32767, 32767, 32767],
2768                 [32767, 32767, 32767, 32767, 4, 0, 10, 32767, 32767, 32767],
2769                 [32767, 32767, 32767, 32767, 4, 10, 0, 32767, 32767, 32767],
2770                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 1, 1],
2771                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 0, 1],
2772                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 1, 1, 0],
2773             ],
2774             "trp_link_price_list": [
2775                 [0, 5, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2776                 [5, 0, 5, 10, 32767, 32767, 32767, 32767, 32767, 32767],
2777                 [5, 5, 0, 10, 10, 32767, 32767, 32767, 32767, 32767],
2778                 [10, 10, 10, 0, 32767, 32767, 32767, 32767, 32767, 32767],
2779                 [32767, 32767, 10, 32767, 0, 20, 20, 32767, 32767, 32767],
2780                 [32767, 32767, 32767, 32767, 20, 0, 20, 32767, 32767, 32767],
2781                 [32767, 32767, 32767, 32767, 20, 20, 0, 32767, 32767, 32767],
2782                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 15, 15],
2783                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 0, 15],
2784                 [32767, 32767, 32767, 32767, 32767, 32767, 32767, 15, 15, 0],
2785             ],
2786             "ns_desc": [
2787                 {
2788                     "vnf_id": "1",
2789                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2790                     "vim_account": "vim00000000_38f5_438d_b8ee_3f93b3531f87",
2791                 },
2792                 {
2793                     "vnf_id": "2",
2794                     "vnf_price_per_vim": ["15,20,40,40,110,80,50,110,160,210"],
2795                 },
2796                 {
2797                     "vnf_id": "3",
2798                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2799                     "vim_account": "vim44444444_38f5_438d_b8ee_3f93b3531f87",
2800                 },
2801                 {
2802                     "vnf_id": "4",
2803                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2804                 },
2805             ],
2806             "vld_desc": [
2807                 {"cp_refs": ["1", "2"], "latency": 120, "jitter": 20},
2808                 {"cp_refs": ["2", "4"], "latency": 50, "jitter": 10},
2809                 {"cp_refs": ["2", "3"], "latency": 20, "jitter": 10},
2810             ],
2811             "generator_data": {"file": __file__, "time": datetime.datetime.now()},
2812         }
2813
2814 1         mg = MznModelGenerator(logging.getLogger(__name__))
2815 1         test_mzn_model = mg.create_model(ns_placement_data)
2816
2817         # run the model
2818 1         expected_result = [{}]
2819
2820 1         mpc = MznPlacementConductor(logging.getLogger(__name__))
2821 1         placement = mpc._run_placement_model(
2822             mzn_model=test_mzn_model,
2823             ns_desc=[
2824                 {
2825                     "vnf_id": "1",
2826                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2827                     "vim_account": "vim00000000_38f5_438d_b8ee_3f93b3531f87",
2828                 },
2829                 {
2830                     "vnf_id": "2",
2831                     "vnf_price_per_vim": ["15,20,40,40,110,80,50,110,160,210"],
2832                 },
2833                 {
2834                     "vnf_id": "3",
2835                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2836                     "vim_account": "vim44444444_38f5_438d_b8ee_3f93b3531f87",
2837                 },
2838                 {
2839                     "vnf_id": "4",
2840                     "vnf_price_per_vim": ["5,10,30,30,100,70,40,100,150,200"],
2841                 },
2842             ],
2843         )
2844         # sort the result to ease assert with expected result
2845 1         if not placement[0]:
2846 1             sorted_placement = placement
2847         else:
2848 0             sorted_placement = sorted(placement, key=lambda k: k["member-vnf-index"])
2849 1         self.assertEqual(expected_result, sorted_placement, "Faulty syntax or content")