Update lcm extsys query vnfm by id
[vfc/nfvo/lcm.git] / lcm / ns / tests / vnfs / tests.py
1 # Copyright 2016-2017 ZTE Corporation.
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 implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 import json
15 import uuid
16
17 import mock
18 from django.test import TestCase, Client
19 from rest_framework import status
20
21 from lcm.ns.vnfs import create_vnfs
22 from lcm.ns.vnfs.const import VNF_STATUS
23 from lcm.ns.vnfs.create_vnfs import CreateVnfs
24 from lcm.pub.database.models import NfInstModel, JobModel, NfPackageModel, NSInstModel
25 from lcm.pub.utils import restcall
26 from lcm.pub.utils.jobutil import JOB_MODEL_STATUS
27 from lcm.pub.utils.timeutil import now_time
28 from lcm.pub.utils.values import ignore_case_get
29 from lcm.ns.vnfs.terminate_nfs import TerminateVnfs
30 from lcm.ns.vnfs.scale_vnfs import NFManualScaleService
31 from lcm.ns.vnfs.heal_vnfs import NFHealService
32 from lcm.pub.utils.jobutil import JobUtil, JOB_TYPE
33 from lcm.pub.exceptions import NSLCMException
34
35 vnfm_info = {"vnfm-id": "example-vnfm-id-val-97336",
36              "vim-id": "example-vim-id-val-35532",
37              "certificate-url": "example-certificate-url-val-18046",
38              "resource-version": "example-resource-version-val-42094",
39              "esr-system-info-list": {
40                  "esr-system-info": [
41                      {
42                          "esr-system-info-id": "example-esr-system-info-id-val-7713",
43                          "system-name": "example-system-name-val-19801",
44                          "type": "example-type-val-24477",
45                          "vendor": "example-vendor-val-50079",
46                          "version": "example-version-val-93146",
47                          "service-url": "example-service-url-val-68090",
48                          "user-name": "example-user-name-val-14470",
49                          "password": "example-password-val-84190",
50                          "system-type": "example-system-type-val-42773",
51                          "protocal": "example-protocal-val-85736",
52                          "ssl-cacert": "example-ssl-cacert-val-33989",
53                          "ssl-insecure": True,
54                          "ip-address": "example-ip-address-val-99038",
55                          "port": "example-port-val-27323",
56                          "cloud-domain": "example-cloud-domain-val-55163",
57                          "default-tenant": "example-default-tenant-val-99383",
58                          "resource-version": "example-resource-version-val-15424"
59                      }
60                  ]
61              }
62              }
63
64 class TestGetVnfViews(TestCase):
65     def setUp(self):
66         self.client = Client()
67         self.nf_inst_id = str(uuid.uuid4())
68         NfInstModel(nfinstid=self.nf_inst_id, nf_name='vnf1', vnfm_inst_id='1', vnf_id='vnf_id1',
69                     status=VNF_STATUS.ACTIVE, create_time=now_time(), lastuptime=now_time()).save()
70
71     def tearDown(self):
72         NfInstModel.objects.all().delete()
73
74     def test_get_vnf(self):
75         response = self.client.get("/api/nslcm/v1/ns/vnfs/%s" % self.nf_inst_id)
76         self.failUnlessEqual(status.HTTP_200_OK, response.status_code)
77         context = json.loads(response.content)
78         self.failUnlessEqual(self.nf_inst_id, context['vnfInstId'])
79
80
81 class TestCreateVnfViews(TestCase):
82     def setUp(self):
83         self.ns_inst_id = str(uuid.uuid4())
84         self.job_id = str(uuid.uuid4())
85         self.data = {
86             'nsInstanceId': self.ns_inst_id,
87             'additionalParamForNs': {"inputs": json.dumps({})},
88             'additionalParamForVnf': [{
89                 'vnfprofileid': 'VBras',
90                 'additionalparam': {
91                     'inputs': json.dumps({'vnf_param1': '11', 'vnf_param2': '22'}),
92                     'vnfminstanceid': "1"}}],
93             'vnfIndex': '1'}
94         self.client = Client()
95         NfPackageModel(uuid=str(uuid.uuid4()), nfpackageid='package_id1', vnfdid='zte_vbras', vendor='zte',
96                        vnfdversion='1.0.0', vnfversion='1.0.0', vnfdmodel=json.dumps(vnfd_model_dict)).save()
97         NSInstModel(id=self.ns_inst_id, name='ns', nspackage_id='1', nsd_id='nsd_id', description='description',
98                     status='instantiating', nsd_model=json.dumps(nsd_model_dict), create_time=now_time(),
99                     lastuptime=now_time()).save()
100
101     def tearDown(self):
102         NfInstModel.objects.all().delete()
103         JobModel.objects.all().delete()
104
105     @mock.patch.object(CreateVnfs, 'run')
106     def test_create_vnf(self, mock_run):
107         response = self.client.post("/api/nslcm/v1/ns/vnfs", data=self.data)
108         self.failUnlessEqual(status.HTTP_202_ACCEPTED, response.status_code)
109         context = json.loads(response.content)
110         self.assertTrue(NfInstModel.objects.filter(nfinstid=context['vnfInstId']).exists())
111
112     @mock.patch.object(restcall, 'call_req')
113     def test_create_vnf_thread(self, mock_call_req):
114         mock_vals = {
115             "/api/ztevmanagerdriver/v1/1/vnfs":
116                 [0, json.JSONEncoder().encode({"jobId": self.job_id, "vnfInstanceId": 3}), '200'],
117             "/external-system/esr-vnfm-list/esr-vnfm/1":
118                 [0, json.JSONEncoder().encode(vnfm_info), '200'],
119             "/api/resmgr/v1/vnf":
120                 [0, json.JSONEncoder().encode({}), '200'],
121             "/api/resmgr/v1/vnfinfo":
122                 [0, json.JSONEncoder().encode({}), '200'],
123             "/api/ztevmanagerdriver/v1/jobs/" + self.job_id + "&responseId=0":
124                 [0, json.JSONEncoder().encode({"jobid": self.job_id,
125                                                "responsedescriptor": {"progress": "100",
126                                                                       "status": JOB_MODEL_STATUS.FINISHED,
127                                                                       "responseid": "3",
128                                                                       "statusdescription": "creating",
129                                                                       "errorcode": "0",
130                                                                       "responsehistorylist": [
131                                                                           {"progress": "0",
132                                                                            "status": JOB_MODEL_STATUS.PROCESSING,
133                                                                            "responseid": "2",
134                                                                            "statusdescription": "creating",
135                                                                            "errorcode": "0"}]}}), '200']}
136
137         def side_effect(*args):
138             return mock_vals[args[4]]
139         mock_call_req.side_effect = side_effect
140         data = {'ns_instance_id': ignore_case_get(self.data, 'nsInstanceId'),
141                 'additional_param_for_ns': ignore_case_get(self.data, 'additionalParamForNs'),
142                 'additional_param_for_vnf': ignore_case_get(self.data, 'additionalParamForVnf'),
143                 'vnf_index': ignore_case_get(self.data, 'vnfIndex')}
144         nf_inst_id, job_id = create_vnfs.prepare_create_params()
145         CreateVnfs(data, nf_inst_id, job_id).run()
146         self.assertTrue(NfInstModel.objects.get(nfinstid=nf_inst_id).status, VNF_STATUS.ACTIVE)
147
148
149 class TestTerminateVnfViews(TestCase):
150     def setUp(self):
151         self.client = Client()
152         self.ns_inst_id = str(uuid.uuid4())
153         self.nf_inst_id = '1'
154         self.vnffg_id = str(uuid.uuid4())
155         self.vim_id = str(uuid.uuid4())
156         self.job_id = str(uuid.uuid4())
157         self.nf_uuid = '111'
158         self.tenant = "tenantname"
159         NSInstModel.objects.all().delete()
160         NfInstModel.objects.all().delete()
161         NSInstModel(id=self.ns_inst_id, name="ns_name").save()
162         NfInstModel.objects.create(nfinstid=self.nf_inst_id, nf_name='name_1', vnf_id='1',
163                                    vnfm_inst_id='1', ns_inst_id='111,2-2-2',
164                                    max_cpu='14', max_ram='12296', max_hd='101', max_shd="20", max_net=10,
165                                    status='active', mnfinstid=self.nf_uuid, package_id='pkg1',
166                                    vnfd_model='{"metadata": {"vnfdId": "1","vnfdName": "PGW001",'
167                                               '"vnfProvider": "zte","vnfdVersion": "V00001","vnfVersion": "V5.10.20",'
168                                               '"productType": "CN","vnfType": "PGW",'
169                                               '"description": "PGW VNFD description",'
170                                               '"isShared":true,"vnfExtendType":"driver"}}')
171
172     def tearDown(self):
173         NSInstModel.objects.all().delete()
174         NfInstModel.objects.all().delete()
175
176     @mock.patch.object(TerminateVnfs, 'run')
177     def test_terminate_vnf_url(self, mock_run):
178         req_data = {
179             "terminationType": "forceful",
180             "gracefulTerminationTimeout": "600"}
181
182         response = self.client.post("/api/nslcm/v1/ns/vnfs/%s" % self.nf_inst_id, data=req_data)
183         self.failUnlessEqual(status.HTTP_201_CREATED, response.status_code)
184
185     # @mock.patch.object(restcall, "call_req")
186     # def test_terminate_vnf(self, mock_call_req):
187     #     job_id = JobUtil.create_job("VNF", JOB_TYPE.TERMINATE_VNF, self.nf_inst_id)
188     #
189     #     nfinst = NfInstModel.objects.filter(nfinstid=self.nf_inst_id)
190     #     if nfinst:
191     #         self.failUnlessEqual(1, 1)
192     #     else:
193     #         self.failUnlessEqual(1, 0)
194     #
195     #     mock_vals = {
196     #         "/api/ztevmanagerdriver/v1/1/vnfs/111/terminate":
197     #             [0, json.JSONEncoder().encode({"jobId": job_id}), '200'],
198     #         "/external-system/esr-vnfm-list/esr-vnfm/1":
199     #             [0, json.JSONEncoder().encode(vnfm_info), '200'],
200     #         "/api/resmgr/v1/vnf/1":
201     #             [0, json.JSONEncoder().encode({"jobId": job_id}), '200'],
202     #         "/api/ztevmanagerdriver/v1/1/jobs/" + job_id + "?responseId=0":
203     #             [0, json.JSONEncoder().encode({"jobId": job_id,
204     #                                            "responsedescriptor": {"progress": "100",
205     #                                                                   "status": JOB_MODEL_STATUS.FINISHED,
206     #                                                                   "responseid": "3",
207     #                                                                   "statusdescription": "creating",
208     #                                                                   "errorcode": "0",
209     #                                                                   "responsehistorylist": [
210     #                                                                       {"progress": "0",
211     #                                                                        "status": JOB_MODEL_STATUS.PROCESSING,
212     #                                                                        "responseid": "2",
213     #                                                                        "statusdescription": "creating",
214     #                                                                        "errorcode": "0"}]}}), '200']}
215     #
216     #     req_data = {
217     #         "terminationType": "forceful",
218     #         "gracefulTerminationTimeout": "600"}
219     #
220     #     def side_effect(*args):
221     #         return mock_vals[args[4]]
222     #     mock_call_req.side_effect = side_effect
223     #
224     #     TerminateVnfs(req_data, self.nf_inst_id, job_id).run()
225     #     nfinst = NfInstModel.objects.filter(nfinstid=self.nf_inst_id)
226     #     if nfinst:
227     #         self.failUnlessEqual(1, 0)
228     #     else:
229     #         self.failUnlessEqual(1, 1)
230
231 class TestScaleVnfViews(TestCase):
232     def setUp(self):
233         self.client = Client()
234         self.ns_inst_id = str(uuid.uuid4())
235         self.nf_inst_id = str(uuid.uuid4())
236         self.vnffg_id = str(uuid.uuid4())
237         self.vim_id = str(uuid.uuid4())
238         self.job_id = str(uuid.uuid4())
239         self.nf_uuid = '111'
240         self.tenant = "tenantname"
241         NSInstModel(id=self.ns_inst_id, name="ns_name").save()
242         NfInstModel.objects.create(nfinstid=self.nf_inst_id, nf_name='name_1', vnf_id='1',
243                                    vnfm_inst_id='1', ns_inst_id='111,2-2-2',
244                                    max_cpu='14', max_ram='12296', max_hd='101', max_shd="20", max_net=10,
245                                    status='active', mnfinstid=self.nf_uuid, package_id='pkg1',
246                                    vnfd_model='{"metadata": {"vnfdId": "1","vnfdName": "PGW001",'
247                                               '"vnfProvider": "zte","vnfdVersion": "V00001","vnfVersion": "V5.10.20",'
248                                               '"productType": "CN","vnfType": "PGW",'
249                                               '"description": "PGW VNFD description",'
250                                               '"isShared":true,"vnfExtendType":"driver"}}')
251
252     def tearDown(self):
253         NSInstModel.objects.all().delete()
254         NfInstModel.objects.all().delete()
255
256     @mock.patch.object(restcall, "call_req")
257     def test_scale_vnf(self, mock_call_req):
258         job_id = JobUtil.create_job("VNF", JOB_TYPE.TERMINATE_VNF, self.nf_inst_id)
259
260         vnfd_info = {
261             "vnf_flavours":[
262                 {
263                     "flavour_id":"flavour1",
264                     "description":"",
265                     "vdu_profiles":[
266                         {
267                             "vdu_id":"vdu1Id",
268                             "instances_minimum_number": 1,
269                             "instances_maximum_number": 4,
270                             "local_affinity_antiaffinity_rule":[
271                                 {
272                                     "affinity_antiaffinity":"affinity",
273                                     "scope":"node",
274                                 }
275                             ]
276                         }
277                     ],
278                     "scaling_aspects":[
279                         {
280                             "id": "demo_aspect",
281                             "name": "demo_aspect",
282                             "description": "demo_aspect",
283                             "associated_group": "elementGroup1",
284                             "max_scale_level": 5
285                         }
286                     ]
287                 }
288             ],
289             "element_groups": [
290                   {
291                       "group_id": "elementGroup1",
292                       "description": "",
293                       "properties":{
294                           "name": "elementGroup1",
295                       },
296                       "members": ["gsu_vm","pfu_vm"],
297                   }
298             ]
299         }
300
301         req_data = {
302             "scaleVnfData": [
303                 {
304                     "type":"SCALE_OUT",
305                     "aspectId":"demo_aspect1",
306                     "numberOfSteps":1,
307                     "additionalParam":vnfd_info
308                 },
309                 {
310                     "type":"SCALE_OUT",
311                     "aspectId":"demo_aspect2",
312                     "numberOfSteps":1,
313                     "additionalParam":vnfd_info
314                 }
315             ]
316         }
317
318
319         mock_vals = {
320             "/api/ztevmanagerdriver/v1/1/vnfs/111/terminate":
321                 [0, json.JSONEncoder().encode({"jobId": job_id}), '200'],
322             "/api/ztevmanagerdriver/v1/1/vnfs/111/terminate":
323                 [0, json.JSONEncoder().encode({"jobId": job_id}), '200']
324         }
325         def side_effect(*args):
326             return mock_vals[args[4]]
327         mock_call_req.side_effect = side_effect
328
329         NFManualScaleService(self.nf_inst_id, req_data).run()
330         nsIns = NfInstModel.objects.filter(nfinstid=self.nf_inst_id)
331         if nsIns:
332             self.failUnlessEqual(1, 1)
333         else:
334             self.failUnlessEqual(1, 0)
335
336
337 class TestHealVnfViews(TestCase):
338     def setUp(self):
339         self.client = Client()
340         self.ns_inst_id = str(uuid.uuid4())
341         self.nf_inst_id = str(uuid.uuid4())
342         self.nf_uuid = '111'
343
344         self.job_id = JobUtil.create_job("VNF", JOB_TYPE.HEAL_VNF, self.nf_inst_id)
345
346         NSInstModel(id=self.ns_inst_id, name="ns_name").save()
347         NfInstModel.objects.create(nfinstid=self.nf_inst_id, nf_name='name_1', vnf_id='1',
348                                    vnfm_inst_id='1', ns_inst_id='111,2-2-2',
349                                    max_cpu='14', max_ram='12296', max_hd='101', max_shd="20", max_net=10,
350                                    status='active', mnfinstid=self.nf_uuid, package_id='pkg1',
351                                    vnfd_model='{"metadata": {"vnfdId": "1","vnfdName": "PGW001",'
352                                               '"vnfProvider": "zte","vnfdVersion": "V00001","vnfVersion": "V5.10.20",'
353                                               '"productType": "CN","vnfType": "PGW",'
354                                               '"description": "PGW VNFD description",'
355                                               '"isShared":true,"vnfExtendType":"driver"}}')
356
357     def tearDown(self):
358         NSInstModel.objects.all().delete()
359         NfInstModel.objects.all().delete()
360
361     @mock.patch.object(restcall, "call_req")
362     def test_heal_vnf(self, mock_call_req):
363
364
365         mock_vals = {
366             "/api/ztevmanagerdriver/v1/1/vnfs/111/heal":
367                 [0, json.JSONEncoder().encode({"jobId": self.job_id}), '200'],
368             "/external-system/esr-vnfm-list/esr-vnfm/1":
369                 [0, json.JSONEncoder().encode(vnfm_info), '200'],
370             "/api/resmgr/v1/vnf/1":
371                 [0, json.JSONEncoder().encode({"jobId": self.job_id}), '200'],
372             "/api/ztevmanagerdriver/v1/1/jobs/" + self.job_id + "?responseId=0":
373                 [0, json.JSONEncoder().encode({"jobId": self.job_id,
374                                                "responsedescriptor": {"progress": "100",
375                                                                       "status": JOB_MODEL_STATUS.FINISHED,
376                                                                       "responseid": "3",
377                                                                       "statusdescription": "creating",
378                                                                       "errorcode": "0",
379                                                                       "responsehistorylist": [
380                                                                           {"progress": "0",
381                                                                            "status": JOB_MODEL_STATUS.PROCESSING,
382                                                                            "responseid": "2",
383                                                                            "statusdescription": "creating",
384                                                                            "errorcode": "0"}]}}), '200']}
385
386         def side_effect(*args):
387             return mock_vals[args[4]]
388
389         mock_call_req.side_effect = side_effect
390
391         req_data = {
392             "action": "vmReset",
393             "affectedvm": {
394                 "vmid": "1",
395                 "vduid": "1",
396                 "vmname": "name",
397             }
398         }
399
400         NFHealService(self.nf_inst_id, req_data).run()
401
402         self.assertEqual(NfInstModel.objects.get(nfinstid=self.nf_inst_id).status, VNF_STATUS.ACTIVE)
403
404     @mock.patch.object(NFHealService, "run")
405     def test_heal_vnf_non_existing_vnf(self, mock_biz):
406         mock_biz.side_effect = NSLCMException("VNF Not Found")
407
408         nf_inst_id = "1"
409
410         req_data = {
411             "action": "vmReset",
412             "affectedvm": {
413                 "vmid": "1",
414                 "vduid": "1",
415                 "vmname": "name",
416             }
417         }
418
419         self.assertRaises(NSLCMException, NFHealService(nf_inst_id, req_data).run)
420         self.assertEqual(len(NfInstModel.objects.filter(nfinstid=nf_inst_id)), 0)
421
422 vnfd_model_dict = {
423     'local_storages': [],
424     'vdus': [
425         {
426             'volumn_storages': [],
427             'nfv_compute': {
428                 'mem_size': '',
429                 'num_cpus': u'2'},
430             'local_storages': [],
431             'vdu_id': u'vdu_omm.001',
432             'image_file': u'opencos_sss_omm_img_release_20150723-1-disk1',
433             'dependencies': [],
434             'vls': [],
435             'cps': [],
436             'properties': {
437                 'key_vdu': '',
438                 'support_scaling': False,
439                 'vdu_type': '',
440                 'name': '',
441                 'storage_policy': '',
442                 'location_info': {
443                     'vimId': '',
444                     'availability_zone': '',
445                     'region': '',
446                     'dc': '',
447                     'host': '',
448                     'tenant': ''},
449                 'inject_data_list': [],
450                 'watchdog': {
451                     'action': '',
452                     'enabledelay': ''},
453                 'local_affinity_antiaffinity_rule': {},
454                 'template_id': u'omm.001',
455                 'manual_scale_select_vim': False},
456             'description': u'singleommvm'},
457         {
458             'volumn_storages': [],
459             'nfv_compute': {
460                 'mem_size': '',
461                 'num_cpus': u'4'},
462             'local_storages': [],
463             'vdu_id': u'vdu_1',
464             'image_file': u'sss',
465             'dependencies': [],
466             'vls': [],
467             'cps': [],
468             'properties': {
469                 'key_vdu': '',
470                 'support_scaling': False,
471                 'vdu_type': '',
472                 'name': '',
473                 'storage_policy': '',
474                 'location_info': {
475                     'vimId': '',
476                     'availability_zone': '',
477                     'region': '',
478                     'dc': '',
479                     'host': '',
480                     'tenant': ''},
481                 'inject_data_list': [],
482                 'watchdog': {
483                     'action': '',
484                     'enabledelay': ''},
485                 'local_affinity_antiaffinity_rule': {},
486                 'template_id': u'1',
487                 'manual_scale_select_vim': False},
488             'description': u'ompvm'},
489         {
490             'volumn_storages': [],
491             'nfv_compute': {
492                 'mem_size': '',
493                 'num_cpus': u'14'},
494             'local_storages': [],
495             'vdu_id': u'vdu_2',
496             'image_file': u'sss',
497             'dependencies': [],
498             'vls': [],
499             'cps': [],
500             'properties': {
501                 'key_vdu': '',
502                 'support_scaling': False,
503                 'vdu_type': '',
504                 'name': '',
505                 'storage_policy': '',
506                 'location_info': {
507                     'vimId': '',
508                     'availability_zone': '',
509                     'region': '',
510                     'dc': '',
511                     'host': '',
512                     'tenant': ''},
513                 'inject_data_list': [],
514                 'watchdog': {
515                     'action': '',
516                     'enabledelay': ''},
517                 'local_affinity_antiaffinity_rule': {},
518                 'template_id': u'2',
519                 'manual_scale_select_vim': False},
520             'description': u'ompvm'},
521         {
522             'volumn_storages': [],
523             'nfv_compute': {
524                 'mem_size': '',
525                 'num_cpus': u'14'},
526             'local_storages': [],
527             'vdu_id': u'vdu_3',
528             'image_file': u'sss',
529             'dependencies': [],
530             'vls': [],
531             'cps': [],
532             'properties': {
533                 'key_vdu': '',
534                 'support_scaling': False,
535                 'vdu_type': '',
536                 'name': '',
537                 'storage_policy': '',
538                 'location_info': {
539                     'vimId': '',
540                     'availability_zone': '',
541                     'region': '',
542                     'dc': '',
543                     'host': '',
544                     'tenant': ''},
545                 'inject_data_list': [],
546                 'watchdog': {
547                     'action': '',
548                     'enabledelay': ''},
549                 'local_affinity_antiaffinity_rule': {},
550                 'template_id': u'3',
551                 'manual_scale_select_vim': False},
552             'description': u'ompvm'},
553         {
554             'volumn_storages': [],
555             'nfv_compute': {
556                 'mem_size': '',
557                 'num_cpus': u'4'},
558             'local_storages': [],
559             'vdu_id': u'vdu_10',
560             'image_file': u'sss',
561             'dependencies': [],
562             'vls': [],
563             'cps': [],
564             'properties': {
565                 'key_vdu': '',
566                 'support_scaling': False,
567                 'vdu_type': '',
568                 'name': '',
569                 'storage_policy': '',
570                 'location_info': {
571                     'vimId': '',
572                     'availability_zone': '',
573                     'region': '',
574                     'dc': '',
575                     'host': '',
576                     'tenant': ''},
577                 'inject_data_list': [],
578                 'watchdog': {
579                     'action': '',
580                     'enabledelay': ''},
581                 'local_affinity_antiaffinity_rule': {},
582                 'template_id': u'10',
583                 'manual_scale_select_vim': False},
584             'description': u'ppvm'},
585         {
586             'volumn_storages': [],
587             'nfv_compute': {
588                 'mem_size': '',
589                 'num_cpus': u'14'},
590             'local_storages': [],
591             'vdu_id': u'vdu_11',
592             'image_file': u'sss',
593             'dependencies': [],
594             'vls': [],
595             'cps': [],
596             'properties': {
597                 'key_vdu': '',
598                 'support_scaling': False,
599                 'vdu_type': '',
600                 'name': '',
601                 'storage_policy': '',
602                 'location_info': {
603                     'vimId': '',
604                     'availability_zone': '',
605                     'region': '',
606                     'dc': '',
607                     'host': '',
608                     'tenant': ''},
609                 'inject_data_list': [],
610                 'watchdog': {
611                     'action': '',
612                     'enabledelay': ''},
613                 'local_affinity_antiaffinity_rule': {},
614                 'template_id': u'11',
615                 'manual_scale_select_vim': False},
616             'description': u'ppvm'},
617         {
618             'volumn_storages': [],
619             'nfv_compute': {
620                 'mem_size': '',
621                 'num_cpus': u'14'},
622             'local_storages': [],
623             'vdu_id': u'vdu_12',
624             'image_file': u'sss',
625             'dependencies': [],
626             'vls': [],
627             'cps': [],
628             'properties': {
629                 'key_vdu': '',
630                 'support_scaling': False,
631                 'vdu_type': '',
632                 'name': '',
633                 'storage_policy': '',
634                 'location_info': {
635                     'vimId': '',
636                     'availability_zone': '',
637                     'region': '',
638                     'dc': '',
639                     'host': '',
640                     'tenant': ''},
641                 'inject_data_list': [],
642                 'watchdog': {
643                     'action': '',
644                     'enabledelay': ''},
645                 'local_affinity_antiaffinity_rule': {},
646                 'template_id': u'12',
647                 'manual_scale_select_vim': False},
648             'description': u'ppvm'}],
649     'volumn_storages': [],
650     'policies': {
651         'scaling': {
652             'targets': {},
653             'policy_id': u'policy_scale_sss-vnf-template',
654             'properties': {
655                 'policy_file': '*-vnfd.zip/*-vnf-policy.xml'},
656             'description': ''}},
657     'image_files': [
658         {
659             'description': '',
660             'properties': {
661                 'name': u'opencos_sss_omm_img_release_20150723-1-disk1.vmdk',
662                 'checksum': '',
663                 'disk_format': u'VMDK',
664                 'file_url': u'./zte-cn-sss-main-image/OMM/opencos_sss_omm_img_release_20150723-1-disk1.vmdk',
665                 'container_type': 'vm',
666                 'version': '',
667                 'hypervisor_type': 'kvm'},
668             'image_file_id': u'opencos_sss_omm_img_release_20150723-1-disk1'},
669         {
670             'description': '',
671             'properties': {
672                 'name': u'sss.vmdk',
673                 'checksum': '',
674                 'disk_format': u'VMDK',
675                 'file_url': u'./zte-cn-sss-main-image/NE/sss.vmdk',
676                 'container_type': 'vm',
677                 'version': '',
678                 'hypervisor_type': 'kvm'},
679             'image_file_id': u'sss'}],
680     'vls': [],
681     'cps': [],
682     'metadata': {
683         'vendor': u'zte',
684         'is_shared': False,
685         'description': '',
686         'domain_type': u'CN',
687         'version': u'v4.14.10',
688         'vmnumber_overquota_alarm': False,
689         'cross_dc': False,
690         'vnf_type': u'SSS',
691         'vnfd_version': u'V00000001',
692         'id': u'sss-vnf-template',
693         'name': u'sss-vnf-template'}}
694
695 nsd_model_dict = {
696     "vnffgs": [],
697     "inputs": {
698         "externalDataNetworkName": {
699             "default": "",
700             "type": "string",
701             "description": ""}},
702     "pnfs": [],
703     "fps": [],
704     "server_groups": [],
705     "ns_flavours": [],
706     "vnfs": [
707         {
708             "dependency": [],
709             "properties": {
710                 "plugin_info": "vbrasplugin_1.0",
711                 "vendor": "zte",
712                 "is_shared": "False",
713                 "request_reclassification": "False",
714                 "vnfd_version": "1.0.0",
715                 "version": "1.0",
716                 "nsh_aware": "True",
717                 "cross_dc": "False",
718                 "externalDataNetworkName": {
719                     "get_input": "externalDataNetworkName"},
720                 "id": "zte_vbras",
721                 "name": "vbras"},
722             "vnf_id": "VBras",
723             "networks": [],
724             "description": ""}],
725     "ns_exposed": {
726         "external_cps": [],
727         "forward_cps": []},
728     "vls": [
729         {
730             "vl_id": "ext_mnet_network",
731             "description": "",
732             "properties": {
733                 "network_type": "vlan",
734                 "name": "externalMNetworkName",
735                 "dhcp_enabled": False,
736                 "location_info": {
737                     "host": True,
738                     "vimid": 2,
739                     "region": True,
740                     "tenant": "admin",
741                     "dc": ""},
742                 "end_ip": "190.168.100.100",
743                 "gateway_ip": "190.168.100.1",
744                 "start_ip": "190.168.100.2",
745                 "cidr": "190.168.100.0/24",
746                 "mtu": 1500,
747                 "network_name": "sub_mnet",
748                 "ip_version": 4}}],
749     "cps": [],
750     "policies": [],
751     "metadata": {
752         "invariant_id": "vbras_ns",
753         "description": "vbras_ns",
754         "version": 1,
755         "vendor": "zte",
756         "id": "vbras_ns",
757         "name": "vbras_ns"}}