35cc598a0925de0b4936258a28470d5a28e7c130
[vfc/nfvo/lcm.git] / lcm / packages / tests / test_nf.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
15 import json
16
17 import mock
18 import random
19 from django.test import Client
20 from django.test import TestCase
21 from rest_framework import status
22
23 from lcm.packages.nf_package import NfOnBoardingThread, NfPkgDeletePendingThread
24 from lcm.packages.nf_package import NfPkgDeleteThread
25 from lcm.pub.database.models import JobStatusModel, JobModel
26 from lcm.pub.database.models import NfPackageModel, VnfPackageFileModel, NfInstModel
27 from lcm.pub.nfvi.vim.vimadaptor import VimAdaptor
28 from lcm.pub.utils import fileutil
29 from lcm.pub.utils import restcall
30 from lcm.pub.utils import idutil
31
32
33 class TestNfPackage(TestCase):
34     def setUp(self):
35         self.client = Client()
36         NfPackageModel.objects.filter().delete()
37         VnfPackageFileModel.objects.filter().delete()
38         NfInstModel.objects.filter().delete()
39         JobModel.objects.filter().delete()
40         JobStatusModel.objects.filter().delete()
41         idutil.get_auto_id = mock.Mock()
42         idutil.get_auto_id.return_value = random.random()
43         self.vnfd_raw_data = {
44             "rawData": {
45                 "instance": {
46                     "metadata": {
47                         "is_shared": False,
48                         "plugin_info": "vbrasplugin_1.0",
49                         "vendor": "zte",
50                         "request_reclassification": False,
51                         "name": "vbras",
52                         "version": 1,
53                         "vnf_type": "vbras",
54                         "cross_dc": False,
55                         "vnfd_version": "1.0.0",
56                         "id": "zte_vbras_1.0",
57                         "nsh_aware": True
58                     },
59                     "nodes": [
60                         {
61                             "id": "aaa_dnet_cp_0xu2j5sbigxc8h1ega3if0ld1",
62                             "type_name": "tosca.nodes.nfv.ext.zte.CP",
63                             "template_name": "aaa_dnet_cp",
64                             "properties": {
65                                 "bandwidth": {
66                                     "type_name": "integer",
67                                     "value": 0
68                                 },
69                                 "direction": {
70                                     "type_name": "string",
71                                     "value": "bidirectional"
72                                 },
73                                 "vnic_type": {
74                                     "type_name": "string",
75                                     "value": "normal"
76                                 },
77                                 "sfc_encapsulation": {
78                                     "type_name": "string",
79                                     "value": "mac"
80                                 },
81                                 "order": {
82                                     "type_name": "integer",
83                                     "value": 2
84                                 }
85                             },
86                             "relationships": [
87                                 {
88                                     "name": "guest_os",
89                                     "source_requirement_index": 0,
90                                     "target_node_id": "AAA_image_d8aseebr120nbm7bo1ohkj194",
91                                     "target_capability_name": "feature"
92                                 }
93                             ]
94                         },
95                         {
96                             "id": "LB_Image_oj5l2ay8l2g6vcq6fsswzduha",
97                             "type_name": "tosca.nodes.nfv.ext.ImageFile",
98                             "template_name": "LB_Image",
99                             "properties": {
100                                 "disk_format": {
101                                     "type_name": "string",
102                                     "value": "qcow2"
103                                 },
104                                 "file_url": {
105                                     "type_name": "string",
106                                     "value": "/SoftwareImages/image-lb"
107                                 },
108                                 "name": {
109                                     "type_name": "string",
110                                     "value": "image-lb"
111                                 }
112                             }
113                         }
114                     ]
115                 },
116                 "model": {
117                     "metadata": {
118                         "is_shared": False,
119                         "plugin_info": "vbrasplugin_1.0",
120                         "vendor": "zte",
121                         "request_reclassification": False,
122                         "name": "vbras",
123                         "version": 1,
124                         "vnf_type": "vbras",
125                         "cross_dc": False,
126                         "vnfd_version": "1.0.0",
127                         "id": "zte_vbras_1.0",
128                         "nsh_aware": True
129                     },
130                     "node_templates": [
131                         {
132                             "name": "aaa_dnet_cp",
133                             "type_name": "tosca.nodes.nfv.ext.zte.CP",
134                             "default_instances": 1,
135                             "min_instances": 0,
136                             "properties": {
137                                 "bandwidth": {
138                                     "type_name": "integer",
139                                     "value": 0
140                                 }
141                             },
142                             "requirement_templates": [
143                                 {
144                                     "name": "virtualbinding",
145                                     "target_node_template_name": "AAA",
146                                     "target_capability_name": "virtualbinding"
147                                 }
148                             ]
149                         }
150                     ]
151                 }
152             }
153         }
154
155     def tearDown(self):
156         pass
157
158     def assert_job_result(self, job_id, job_progress, job_detail):
159         jobs = JobStatusModel.objects.filter(
160             jobid=job_id,
161             progress=job_progress,
162             descp=job_detail)
163         self.assertEqual(1, len(jobs))
164
165     @mock.patch.object(NfOnBoardingThread, 'run')
166     def test_nf_pkg_on_boarding_normal(self, mock_run):
167         resp = self.client.post("/api/nslcm/v0/vnfpackage", {
168             "csarId": "1",
169             "vimIds": ["1"]
170         }, format='json')
171         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
172
173     @mock.patch.object(restcall, 'call_req')
174     def test_nf_pkg_on_boarding_when_on_boarded(self, mock_call_req):
175         mock_call_req.return_value = [0, json.JSONEncoder().encode({"onBoardState": "onBoarded"}), '200']
176         NfOnBoardingThread(csar_id="1",
177                            vim_ids=["1"],
178                            lab_vim_id="",
179                            job_id="2").run()
180         self.assert_job_result("2", 255, "CSAR(1) already onBoarded.")
181
182     @mock.patch.object(restcall, 'call_req')
183     def test_nf_pkg_on_boarding_when_on_boarding(self, mock_call_req):
184         mock_call_req.return_value = [0, json.JSONEncoder().encode({
185             "onBoardState": "non-onBoarded",
186             "processState": "onBoarding"
187         }), '200']
188         NfOnBoardingThread(csar_id="2",
189                            vim_ids=["1"],
190                            lab_vim_id="",
191                            job_id="3").run()
192         self.assert_job_result("3", 255, "CSAR(2) is onBoarding now.")
193
194     @mock.patch.object(restcall, 'call_req')
195     def test_nf_on_boarding_when_nfd_already_exists(self, mock_call_req):
196         mock_vals = {
197             "/api/catalog/v1/csars/2":
198                 [0, json.JSONEncoder().encode({
199                     "onBoardState": "onBoardFailed", "processState": "deleteFailed"}), '200'],
200             "/api/catalog/v1/servicetemplates/queryingrawdata":
201                 [0, json.JSONEncoder().encode(self.vnfd_raw_data), '200']}
202
203         def side_effect(*args):
204             return mock_vals[args[4]]
205
206         mock_call_req.side_effect = side_effect
207         NfPackageModel(uuid="1", nfpackageid="2", vnfdid="zte_vbras_1.0").save()
208         NfOnBoardingThread(csar_id="2", vim_ids=["1"], lab_vim_id="", job_id="4").run()
209         self.assert_job_result("4", 255, "NFD(zte_vbras_1.0) already exists.")
210
211     @mock.patch.object(restcall, 'call_req')
212     @mock.patch.object(fileutil, 'download_file_from_http')
213     @mock.patch.object(VimAdaptor, '__init__')
214     @mock.patch.object(VimAdaptor, 'create_image')
215     @mock.patch.object(VimAdaptor, 'get_image')
216     def test_nf_on_boarding_when_successfully(self, mock_get_image, mock_create_image,
217                                               mock__init__, mock_download_file_from_http, mock_call_req):
218         mock_download_file_from_http.return_value = True, "/root/package"
219         mock_vals = {
220             "/api/catalog/v1/csars/2":
221                 [0, json.JSONEncoder().encode({
222                     "onBoardState": "onBoardFailed", "processState": "deleteFailed"}), '200'],
223             "/api/catalog/v1/servicetemplates/queryingrawdata":
224                 [0, json.JSONEncoder().encode(self.vnfd_raw_data), '200'],
225             "/api/catalog/v1/csars/2/files?relativePath=/SoftwareImages/image-lb":
226                 [0, json.JSONEncoder().encode({
227                     "csar_file_info": [{"downloadUri": "8"}, {"localPath": "9"}]}), '200'],
228             "/cloud-infrastructure/cloud-regions?depth=all":
229                 [0, json.JSONEncoder().encode(vims_info), '200'],
230             "/api/catalog/v1/csars/2?onBoardState=onBoarded": [0, '{}', 200],
231             "/api/catalog/v1/csars/2?operationalState=Enabled": [0, '{}', 200],
232             "/api/catalog/v1/csars/2?processState=normal": [0, '{}', 200]}
233         mock_create_image.return_value = [0, {"id": "30", "name": "jerry", "res_type": 0}]
234         mock__init__.return_value = None
235         mock_get_image.return_value = [0, {"id": "30", "name": "jerry", "size": "60", "status": "active"}]
236
237         def side_effect(*args):
238             return mock_vals[args[4]]
239         mock_call_req.side_effect = side_effect
240
241         NfOnBoardingThread(csar_id="2", vim_ids=["1"], lab_vim_id="", job_id="4").run()
242         self.assert_job_result("4", 100, "CSAR(2) onBoarding successfully.")
243
244     # @mock.patch.object(restcall, 'call_req')
245     # @mock.patch.object(fileutil, 'download_file_from_http')
246     # @mock.patch.object(VimAdaptor, '__init__')
247     # @mock.patch.object(VimAdaptor, 'create_image')
248     # @mock.patch.object(VimAdaptor, 'get_image')
249     # def test_nf_on_boarding_when_timeout(self, mock_get_image, mock_create_image,
250     #                                      mock__init__, mock_download_file_from_http, mock_call_req):
251     #     nf_package.MAX_RETRY_TIMES = 2
252     #     nf_package.SLEEP_INTERVAL_SECONDS = 1
253     #     mock_download_file_from_http.return_value = True, "/root/package"
254     #     mock_vals = {
255     #         "/api/catalog/v1/csars/3":
256     #         [0, json.JSONEncoder().encode({"onBoardState": "onBoardFailed",
257     #                                        "processState": "deleteFailed"}), '200'],
258     #         "/api/catalog/v1/servicetemplates/queryingrawdata":
259     #             [0, json.JSONEncoder().encode(self.vnfd_raw_data), '200'],
260     #         "/api/catalog/v1/csars/3/files?relativePath=/SoftwareImages/image-lb":
261     #             [0, json.JSONEncoder().encode({
262     #                 "csar_file_info": [{"downloadUri": "8"}, {"localPath": "9"}]}), '200'],
263     #         "/api/catalog/v1/csars/3?processState=onBoardFailed": [0, '{}', 200],
264     #         "/cloud-infrastructure/cloud-regions?depth=all":
265     #             [0, json.JSONEncoder().encode(vims_info), 200]}
266     #     mock_create_image.return_value = [0, {"id": "30", "name": "jerry", "res_type": 0}]
267     #     mock__init__.return_value = None
268     #     mock_get_image.return_value = [0, {"id": "30", "name": "jerry", "size": "60", "status": "0"}]
269     #
270     #     def side_effect(*args):
271     #         return mock_vals[args[4]]
272     #
273     #     mock_call_req.side_effect = side_effect
274     #     NfOnBoardingThread(csar_id="3", vim_ids=["1"], lab_vim_id="", job_id="6").run()
275     #     self.assert_job_result("6", 255, "Failed to create image:timeout(2 seconds.)")
276
277     # @mock.patch.object(restcall, 'call_req')
278     # @mock.patch.object(fileutil, 'download_file_from_http')
279     # @mock.patch.object(VimAdaptor, '__init__')
280     # @mock.patch.object(VimAdaptor, 'create_image')
281     # def test_nf_on_boarding_when_failed_to_create_image(self, mock_create_image,
282     #                                                     mock__init__, mock_download_file_from_http, mock_call_req):
283     #     mock_download_file_from_http.return_value = True, "/root/package"
284     #     mock_vals = {
285     #         "/api/catalog/v1/csars/5":
286     #             [0, json.JSONEncoder().encode({
287     #                 "onBoardState": "onBoardFailed", "processState": "deleteFailed"}), '200'],
288     #         "/api/catalog/v1/servicetemplates/queryingrawdata":
289     #             [0, json.JSONEncoder().encode(self.vnfd_raw_data), '200'],
290     #         "/api/catalog/v1/csars/5/files?relativePath=/SoftwareImages/image-lb":
291     #             [0, json.JSONEncoder().encode({
292     #                 "csar_file_info": [{"downloadUri": "8"}, {"localPath": "9"}]}), '200'],
293     #         "/api/catalog/v1/csars/5?processState=onBoardFailed": [0, '{}', 200],
294     #         "/cloud-infrastructure/cloud-regions?depth=all":
295     #             [0, json.JSONEncoder().encode(vims_info), '200']}
296     #     mock_create_image.return_value = [1, 'Unsupported image format.']
297     #     mock__init__.return_value = None
298     #
299     #     def side_effect(*args):
300     #         return mock_vals[args[4]]
301     #     mock_call_req.side_effect = side_effect
302     #     NfOnBoardingThread(csar_id="5", vim_ids=["1"], lab_vim_id="", job_id="8").run()
303     #     self.assert_job_result("8", 255, "Failed to create image:Unsupported image format.")
304
305     #########################################################################
306     @mock.patch.object(restcall, 'call_req')
307     def test_get_csar_successfully(self, mock_call_req):
308         mock_call_req.return_value = [0, json.JSONEncoder().encode({
309             "name": "1", "provider": "2", "version": "3", "operationalState": "4",
310             "usageState": "5", "onBoardState": "6", "processState": "7",
311             "deletionPending": "8", "downloadUri": "9", "createTime": "10",
312             "modifyTime": "11", "format": "12", "size": "13"
313         }), '200']
314         NfPackageModel(uuid="1", vnfdid="001", vendor="vendor",
315                        vnfdversion="1.2.0", vnfversion="1.1.0", nfpackageid="13").save()
316         VnfPackageFileModel(id="1", filename="filename", imageid="00001",
317                             vimid="1", vimuser="001", tenant="12", status="1", vnfpid="13").save()
318         NfInstModel(nfinstid="1", mnfinstid="001", nf_name="name", package_id="13").save()
319         resp = self.client.get("/api/nslcm/v0/vnfpackage/13")
320         self.assertEqual(resp.status_code, status.HTTP_200_OK)
321         expect_data = {
322             "csarId": '13',
323             "packageInfo": {
324                 "vnfdId": "001",
325                 "vnfdProvider": "vendor",
326                 "vnfdVersion": "1.2.0",
327                 "vnfVersion": "1.1.0",
328                 "name": "1",
329                 "provider": "2",
330                 "version": "3",
331                 "operationalState": "4",
332                 "usageState": "5",
333                 "onBoardState": "6",
334                 "processState": "7",
335                 "deletionPending": "8",
336                 "downloadUri": "9",
337                 "createTime": "10",
338                 "modifyTime": "11",
339                 "format": "12",
340                 "size": "13"},
341             "imageInfo": [{
342                 "index": "0",
343                 "fileName": "filename",
344                 "imageId": "00001",
345                 "vimId": "1",
346                 "vimUser": "001",
347                 "tenant": "12",
348                 "status": "1"}],
349             "vnfInstanceInfo": [{
350                 "vnfInstanceId": "1",
351                 "vnfInstanceName": "name"}]}
352         self.assertEqual(expect_data, resp.data)
353
354     #########################################################################
355     @mock.patch.object(restcall, 'call_req')
356     def test_delete_pending_csar_when_successfully(self, mock_call_req):
357         mock_call_req.return_value = [0, json.JSONEncoder().encode({
358             "processState": "deleting"}), "200"]
359         NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
360         self.assert_job_result("2", 100, "Delete pending CSAR(1) successfully.")
361
362     @mock.patch.object(restcall, 'call_req')
363     def test_delete_pending_csar_when_deleting(self, mock_call_req):
364         NfPackageModel(uuid="01", nfpackageid="1").save()
365         mock_call_req.return_value = [0, json.JSONEncoder().encode({
366             "processState": "deleting"}), "200"]
367         NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
368         self.assert_job_result("2", 100, "CSAR(1) is deleting now.")
369
370     @mock.patch.object(restcall, 'call_req')
371     def test_delete_pending_csar_when_not_deletion_pending(self, mock_call_req):
372         NfPackageModel(uuid="01", nfpackageid="1").save()
373         mock_call_req.return_value = [0, json.JSONEncoder().encode({
374             "deletionPending": "false"}), "200"]
375         NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
376         self.assert_job_result("2", 100, "CSAR(1) need not to be deleted.")
377
378     @mock.patch.object(restcall, 'call_req')
379     def test_delete_pending_csar_when_in_using(self, mock_call_req):
380         mock_call_req.return_value = [0, json.JSONEncoder().encode({
381             "processState": "normal"}), "200"]
382         NfPackageModel(uuid="01", nfpackageid="1").save()
383         NfInstModel(nfinstid="01", package_id="1").save()
384         NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
385         self.assert_job_result("2", 100, "CSAR(1) is in using, cannot be deleted.")
386
387     @mock.patch.object(VimAdaptor, '__init__')
388     @mock.patch.object(VimAdaptor, 'delete_image')
389     @mock.patch.object(restcall, 'call_req')
390     def test_delete_csarr_when_exception(self, mock_call_req, mock_delete_image, mock_init_):
391         mock_vals = {
392             ("/api/catalog/v1/csars/1", "DELETE"):
393                 [1, "{}", "400"],
394             ("/api/catalog/v1/csars/1?processState=deleting", "PUT"):
395                 [0, "{}", "200"],
396             ("/api/catalog/v1/csars/1?processState=deleteFailed", "PUT"):
397                 [0, "{}", "200"],
398             ("/api/catalog/v1/csars/1", "GET"):
399                 [0, json.JSONEncoder().encode({"processState": "normal"}), "200"],
400             ("/cloud-infrastructure/cloud-regions?depth=all", "GET"):
401                 [0, json.JSONEncoder().encode(vims_info), "200"]}
402         mock_delete_image.return_value = [0, "", '200']
403
404         def side_effect(*args):
405             return mock_vals[(args[4], args[5])]
406
407         mock_call_req.side_effect = side_effect
408         mock_init_.return_value = None
409         VnfPackageFileModel(vnfpid="1", imageid="001", vimid="002").save()
410         NfPackageModel(uuid="01", nfpackageid="1").save()
411         NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
412         self.assert_job_result("2", 255, "Failed to delete CSAR(1) from catalog.")
413
414     @mock.patch.object(VimAdaptor, '__init__')
415     @mock.patch.object(VimAdaptor, 'delete_image')
416     @mock.patch.object(restcall, 'call_req')
417     def test_delete_csar_when_successfully(self, mock_call_req, mock_delete_image, mock_init_):
418         mock_vals = {
419             ("/api/catalog/v1/csars/1", "DELETE"):
420                 [0, json.JSONEncoder().encode({"successfully": "successfully"}), "200"],
421             ("/api/catalog/v1/csars/1?processState=deleting", "PUT"):
422                 [0, json.JSONEncoder().encode({"successfully": "successfully"}), "200"],
423             ("/api/catalog/v1/csars/1?processState=deleteFailed", "PUT"):
424                 [0, json.JSONEncoder().encode({"successfully": "successfully"}), "200"],
425             ("/api/catalog/v1/csars/1", "GET"):
426                 [0, json.JSONEncoder().encode({"notProcessState": "notProcessState"}), "200"],
427             ("/cloud-infrastructure/cloud-regions?depth=all", "GET"):
428                 [0, json.JSONEncoder().encode(vims_info), "200"]}
429         mock_delete_image.return_value = [0, json.JSONEncoder().encode({"test": "test"}), '200']
430
431         def side_effect(*args):
432             return mock_vals[(args[4], args[5])]
433
434         mock_call_req.side_effect = side_effect
435         mock_init_.return_value = None
436         VnfPackageFileModel(vnfpid="1", imageid="001", vimid="002").save()
437         NfPackageModel(uuid="01", nfpackageid="1").save()
438         NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
439         self.assert_job_result("2", 100, "Delete CSAR(1) successfully.")
440
441     #########################################################################
442     @mock.patch.object(restcall, 'call_req')
443     def test_delete_nf_pkg_when_deleting(self, mock_call_req):
444         mock_call_req.return_value = [0, json.JSONEncoder().encode({"processState": "deleting"}), '200']
445         NfPkgDeleteThread(csar_id="1", job_id="2").run()
446         self.assert_job_result("2", 100, "CSAR(1) is deleting now.")
447
448     def test_get_nf_csars_normal(self):
449         NfPackageModel(uuid="01", nfpackageid="1", vnfdid="2").save()
450         resp = self.client.get("/api/nslcm/v0/vnfpackage")
451         self.assertEqual(resp.status_code, status.HTTP_200_OK)
452         self.assertEqual(1, len(resp.data["csars"]))
453         self.assertEqual("1", resp.data["csars"][0]["csarId"])
454         self.assertEqual("2", resp.data["csars"][0]["vnfdId"])
455
456
457 vims_info = {
458     "cloud-region": [
459         {
460             "cloud-owner": "example-cloud-owner-val-60268",
461             "cloud-region-id": "example-cloud-region-id-val-77704",
462             "cloud-type": "example-cloud-type-val-20689",
463             "owner-defined-type": "example-owner-defined-type-val-24237",
464             "cloud-region-version": "example-cloud-region-version-val-95948",
465             "identity-url": "example-identity-url-val-98336",
466             "cloud-zone": "example-cloud-zone-val-67202",
467             "complex-name": "example-complex-name-val-86264",
468             "sriov-automation": True,
469             "cloud-extra-info": "example-cloud-extra-info-val-44735",
470             "cloud-epa-caps": "example-cloud-epa-caps-val-67134",
471             "resource-version": "example-resource-version-val-47608",
472             "volume-groups": {
473                 "volume-group": [
474                     {
475                         "volume-group-id": "example-volume-group-id-val-79555",
476                         "volume-group-name": "example-volume-group-name-val-21888",
477                         "heat-stack-id": "example-heat-stack-id-val-56926",
478                         "vnf-type": "example-vnf-type-val-47890",
479                         "orchestration-status": "example-orchestration-status-val-34971",
480                         "model-customization-id": "example-model-customization-id-val-7851",
481                         "vf-module-model-customization-id": "example-vf-module-model-customization-id-val-35365",
482                         "resource-version": "example-resource-version-val-66022"
483                     }
484                 ]
485             },
486             "tenants": {
487                 "tenant": [
488                     {
489                         "tenant-id": "example-tenant-id-val-30151",
490                         "tenant-name": "example-tenant-name-val-12231",
491                         "tenant-context": "example-tenant-context-val-80991",
492                         "resource-version": "example-resource-version-val-5033",
493                         "vservers": {
494                             "vserver": [
495                                 {
496                                     "vserver-id": "example-vserver-id-val-70581",
497                                     "vserver-name": "example-vserver-name-val-63390",
498                                     "vserver-name2": "example-vserver-name2-val-70924",
499                                     "prov-status": "example-prov-status-val-24088",
500                                     "vserver-selflink": "example-vserver-selflink-val-17737",
501                                     "in-maint": True,
502                                     "is-closed-loop-disabled": True,
503                                     "resource-version": "example-resource-version-val-46166",
504                                     "volumes": {
505                                         "volume": [
506                                             {
507                                                 "volume-id": "example-volume-id-val-9740",
508                                                 "volume-selflink": "example-volume-selflink-val-8411",
509                                                 "resource-version": "example-resource-version-val-41965"
510                                             }
511                                         ]
512                                     },
513                                     "l-interfaces": {
514                                         "l-interface": [
515                                             {
516                                                 "interface-name": "example-interface-name-val-67663",
517                                                 "interface-role": "example-interface-role-val-27132",
518                                                 "v6-wan-link-ip": "example-v6-wan-link-ip-val-85445",
519                                                 "selflink": "example-selflink-val-83317",
520                                                 "interface-id": "example-interface-id-val-98716",
521                                                 "macaddr": "example-macaddr-val-18235",
522                                                 "network-name": "example-network-name-val-45040",
523                                                 "management-option": "example-management-option-val-65761",
524                                                 "interface-description": "example-interface-description-val-32615",
525                                                 "is-port-mirrored": True,
526                                                 "resource-version": "example-resource-version-val-10801",
527                                                 "in-maint": True,
528                                                 "prov-status": "example-prov-status-val-5726",
529                                                 "is-ip-unnumbered": True,
530                                                 "allowed-address-pairs": "example-allowed-address-pairs-val-52679",
531                                                 "vlans": {
532                                                     "vlan": [
533                                                         {
534                                                             "vlan-interface": "example-vlan-interface-val-61591",
535                                                             "vlan-id-inner": 53472228,
536                                                             "vlan-id-outer": 93087267,
537                                                             "resource-version": "example-resource-version-val-52900",
538                                                             "speed-value": "example-speed-value-val-69335",
539                                                             "speed-units": "example-speed-units-val-72089",
540                                                             "vlan-description": "example-vlan-description-val-96604",
541                                                             "backdoor-connection": "example-backdoor-connection-val-42299",
542                                                             "vpn-key": "example-vpn-key-val-50517",
543                                                             "orchestration-status": "example-orchestration-status-val-66570",
544                                                             "in-maint": True,
545                                                             "prov-status": "example-prov-status-val-46495",
546                                                             "is-ip-unnumbered": True,
547                                                             "l3-interface-ipv4-address-list": [
548                                                                 {
549                                                                     "l3-interface-ipv4-address": "example-l3-interface-ipv4-address-val-32173",
550                                                                     "l3-interface-ipv4-prefix-length": 29740951,
551                                                                     "vlan-id-inner": 93873764,
552                                                                     "vlan-id-outer": 82615508,
553                                                                     "is-floating": True,
554                                                                     "resource-version": "example-resource-version-val-75216",
555                                                                     "neutron-network-id": "example-neutron-network-id-val-77878",
556                                                                     "neutron-subnet-id": "example-neutron-subnet-id-val-79062"
557                                                                 }
558                                                             ],
559                                                             "l3-interface-ipv6-address-list": [
560                                                                 {
561                                                                     "l3-interface-ipv6-address": "example-l3-interface-ipv6-address-val-88548",
562                                                                     "l3-interface-ipv6-prefix-length": 89047373,
563                                                                     "vlan-id-inner": 95671681,
564                                                                     "vlan-id-outer": 88533796,
565                                                                     "is-floating": True,
566                                                                     "resource-version": "example-resource-version-val-40990",
567                                                                     "neutron-network-id": "example-neutron-network-id-val-81951",
568                                                                     "neutron-subnet-id": "example-neutron-subnet-id-val-4218"
569                                                                 }
570                                                             ]
571                                                         }
572                                                     ]
573                                                 },
574                                                 "sriov-vfs": {
575                                                     "sriov-vf": [
576                                                         {
577                                                             "pci-id": "example-pci-id-val-12933",
578                                                             "vf-vlan-filter": "example-vf-vlan-filter-val-90275",
579                                                             "vf-mac-filter": "example-vf-mac-filter-val-13509",
580                                                             "vf-vlan-strip": True,
581                                                             "vf-vlan-anti-spoof-check": True,
582                                                             "vf-mac-anti-spoof-check": True,
583                                                             "vf-mirrors": "example-vf-mirrors-val-59746",
584                                                             "vf-broadcast-allow": True,
585                                                             "vf-unknown-multicast-allow": True,
586                                                             "vf-unknown-unicast-allow": True,
587                                                             "vf-insert-stag": True,
588                                                             "vf-link-status": "example-vf-link-status-val-37662",
589                                                             "resource-version": "example-resource-version-val-86970",
590                                                             "neutron-network-id": "example-neutron-network-id-val-71727"
591                                                         }
592                                                     ]
593                                                 },
594                                                 "l-interfaces": {
595                                                     "l-interface": [
596                                                         {
597                                                             "interface-name": "example-interface-name-val-91632",
598                                                             "interface-role": "example-interface-role-val-59119",
599                                                             "v6-wan-link-ip": "example-v6-wan-link-ip-val-21039",
600                                                             "selflink": "example-selflink-val-16277",
601                                                             "interface-id": "example-interface-id-val-77457",
602                                                             "macaddr": "example-macaddr-val-49026",
603                                                             "network-name": "example-network-name-val-3483",
604                                                             "management-option": "example-management-option-val-16429",
605                                                             "interface-description": "example-interface-description-val-50889",
606                                                             "is-port-mirrored": True,
607                                                             "resource-version": "example-resource-version-val-30308",
608                                                             "in-maint": True,
609                                                             "prov-status": "example-prov-status-val-69406",
610                                                             "is-ip-unnumbered": True,
611                                                             "allowed-address-pairs": "example-allowed-address-pairs-val-49123"
612                                                         }
613                                                     ]
614                                                 },
615                                                 "l3-interface-ipv4-address-list": [
616                                                     {
617                                                         "l3-interface-ipv4-address": "example-l3-interface-ipv4-address-val-63922",
618                                                         "l3-interface-ipv4-prefix-length": 13823411,
619                                                         "vlan-id-inner": 14316230,
620                                                         "vlan-id-outer": 66559625,
621                                                         "is-floating": True,
622                                                         "resource-version": "example-resource-version-val-30766",
623                                                         "neutron-network-id": "example-neutron-network-id-val-46636",
624                                                         "neutron-subnet-id": "example-neutron-subnet-id-val-96658"
625                                                     }
626                                                 ],
627                                                 "l3-interface-ipv6-address-list": [
628                                                     {
629                                                         "l3-interface-ipv6-address": "example-l3-interface-ipv6-address-val-21246",
630                                                         "l3-interface-ipv6-prefix-length": 20226253,
631                                                         "vlan-id-inner": 68200128,
632                                                         "vlan-id-outer": 18442586,
633                                                         "is-floating": True,
634                                                         "resource-version": "example-resource-version-val-24602",
635                                                         "neutron-network-id": "example-neutron-network-id-val-49811",
636                                                         "neutron-subnet-id": "example-neutron-subnet-id-val-67505"
637                                                     }
638                                                 ]
639                                             }
640                                         ]
641                                     }
642                                 }
643                             ]
644                         }
645                     }
646                 ]
647             },
648             "flavors": {
649                 "flavor": [
650                     {
651                         "flavor-id": "example-flavor-id-val-15058",
652                         "flavor-name": "example-flavor-name-val-69485",
653                         "flavor-vcpus": 92601,
654                         "flavor-ram": 31468,
655                         "flavor-disk": 58744,
656                         "flavor-ephemeral": 84771,
657                         "flavor-swap": "example-flavor-swap-val-66481",
658                         "flavor-is-public": True,
659                         "flavor-selflink": "example-flavor-selflink-val-48912",
660                         "flavor-disabled": True,
661                         "resource-version": "example-resource-version-val-55131"
662                     }
663                 ]
664             },
665             "group-assignments": {
666                 "group-assignment": [
667                     {
668                         "group-id": "example-group-id-val-79234",
669                         "group-type": "example-group-type-val-29164",
670                         "group-name": "example-group-name-val-57605",
671                         "group-description": "example-group-description-val-52975",
672                         "resource-version": "example-resource-version-val-10280"
673                     }
674                 ]
675             },
676             "snapshots": {
677                 "snapshot": [
678                     {
679                         "snapshot-id": "example-snapshot-id-val-60630",
680                         "snapshot-name": "example-snapshot-name-val-90351",
681                         "snapshot-architecture": "example-snapshot-architecture-val-3225",
682                         "snapshot-os-distro": "example-snapshot-os-distro-val-31399",
683                         "snapshot-os-version": "example-snapshot-os-version-val-16981",
684                         "application": "example-application-val-34584",
685                         "application-vendor": "example-application-vendor-val-97854",
686                         "application-version": "example-application-version-val-20705",
687                         "snapshot-selflink": "example-snapshot-selflink-val-84731",
688                         "prev-snapshot-id": "example-prev-snapshot-id-val-77339",
689                         "resource-version": "example-resource-version-val-19220"
690                     }
691                 ]
692             },
693             "images": {
694                 "image": [
695                     {
696                         "image-id": "example-image-id-val-34721",
697                         "image-name": "example-image-name-val-64106",
698                         "image-architecture": "example-image-architecture-val-8247",
699                         "image-os-distro": "example-image-os-distro-val-98534",
700                         "image-os-version": "example-image-os-version-val-87444",
701                         "application": "example-application-val-30758",
702                         "application-vendor": "example-application-vendor-val-7048",
703                         "application-version": "example-application-version-val-79678",
704                         "image-selflink": "example-image-selflink-val-72836",
705                         "resource-version": "example-resource-version-val-79432",
706                         "metadata": {
707                             "metadatum": [
708                                 {
709                                     "metaname": "example-metaname-val-75188",
710                                     "metaval": "example-metaval-val-64947",
711                                     "resource-version": "example-resource-version-val-59427"
712                                 }
713                             ]
714                         }
715                     }
716                 ]
717             },
718             "dvs-switches": {
719                 "dvs-switch": [
720                     {
721                         "switch-name": "example-switch-name-val-21335",
722                         "vcenter-url": "example-vcenter-url-val-74348",
723                         "resource-version": "example-resource-version-val-51253"
724                     }
725                 ]
726             },
727             "oam-networks": {
728                 "oam-network": [
729                     {
730                         "network-uuid": "example-network-uuid-val-65686",
731                         "network-name": "example-network-name-val-94383",
732                         "cvlan-tag": 31041170,
733                         "ipv4-oam-gateway-address": "example-ipv4-oam-gateway-address-val-15815",
734                         "ipv4-oam-gateway-address-prefix-length": 65477,
735                         "resource-version": "example-resource-version-val-21712"
736                     }
737                 ]
738             },
739             "availability-zones": {
740                 "availability-zone": [
741                     {
742                         "availability-zone-name": "example-availability-zone-name-val-14569",
743                         "hypervisor-type": "example-hypervisor-type-val-70481",
744                         "operational-status": "example-operational-status-val-13589",
745                         "resource-version": "example-resource-version-val-78031"
746                     }
747                 ]
748             },
749             "esr-system-info-list": {
750                 "esr-system-info": [
751                     {
752                         "esr-system-info-id": "example-esr-system-info-id-val-58799",
753                         "system-name": "example-system-name-val-78629",
754                         "type": "example-type-val-4146",
755                         "vendor": "example-vendor-val-11916",
756                         "version": "example-version-val-60284",
757                         "service-url": "example-service-url-val-85858",
758                         "user-name": "example-user-name-val-23297",
759                         "password": "example-password-val-33729",
760                         "system-type": "example-system-type-val-54309",
761                         "protocal": "example-protocal-val-86585",
762                         "ssl-cacert": "example-ssl-cacert-val-95811",
763                         "ssl-insecure": True,
764                         "ip-address": "example-ip-address-val-62987",
765                         "port": "example-port-val-83650",
766                         "cloud-domain": "example-cloud-domain-val-9841",
767                         "default-tenant": "example-default-tenant-val-52776",
768                         "resource-version": "example-resource-version-val-61961"
769                     }
770                 ]
771             }
772         }
773     ]
774 }