1 # Copyright 2016-2017 ZTE Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
16 from rest_framework import status
17 from django.test import TestCase
18 from django.test import Client
20 from lcm.pub.utils import restcall
21 from lcm.pub.utils import fileutil
22 from lcm.pub.nfvi.vim.vimadaptor import VimAdaptor
23 from lcm.pub.database.models import NfPackageModel, VnfPackageFileModel, NfInstModel
24 from lcm.pub.database.models import JobStatusModel, JobModel
25 from lcm.packages.nf_package import NfOnBoardingThread, NfPkgDeletePendingThread
26 from lcm.packages.nf_package import NfPkgDeleteThread
27 from lcm.packages import nf_package
28 from lcm.pub.nfvi.vim.const import VIM_OPENSTACK
31 class TestNfPackage(TestCase):
33 self.client = Client()
34 NfPackageModel.objects.filter().delete()
35 VnfPackageFileModel.objects.filter().delete()
36 NfInstModel.objects.filter().delete()
37 JobModel.objects.filter().delete()
38 JobStatusModel.objects.filter().delete()
39 self.vnfd_raw_data = {
44 "plugin_info": "vbrasplugin_1.0",
46 "request_reclassification": False,
51 "vnfd_version": "1.0.0",
52 "id": "zte_vbras_1.0",
57 "id": "aaa_dnet_cp_0xu2j5sbigxc8h1ega3if0ld1",
58 "type_name": "tosca.nodes.nfv.ext.zte.CP",
59 "template_name": "aaa_dnet_cp",
62 "type_name": "integer",
66 "type_name": "string",
67 "value": "bidirectional"
70 "type_name": "string",
73 "sfc_encapsulation": {
74 "type_name": "string",
78 "type_name": "integer",
85 "source_requirement_index": 0,
86 "target_node_id": "AAA_image_d8aseebr120nbm7bo1ohkj194",
87 "target_capability_name": "feature"
92 "id": "LB_Image_oj5l2ay8l2g6vcq6fsswzduha",
93 "type_name": "tosca.nodes.nfv.ext.ImageFile",
94 "template_name": "LB_Image",
97 "type_name": "string",
101 "type_name": "string",
102 "value": "/SoftwareImages/image-lb"
105 "type_name": "string",
115 "plugin_info": "vbrasplugin_1.0",
117 "request_reclassification": False,
122 "vnfd_version": "1.0.0",
123 "id": "zte_vbras_1.0",
128 "name": "aaa_dnet_cp",
129 "type_name": "tosca.nodes.nfv.ext.zte.CP",
130 "default_instances": 1,
134 "type_name": "integer",
138 "requirement_templates": [
140 "name": "virtualbinding",
141 "target_node_template_name": "AAA",
142 "target_capability_name": "virtualbinding"
154 def assert_job_result(self, job_id, job_progress, job_detail):
155 jobs = JobStatusModel.objects.filter(
157 progress=job_progress,
159 self.assertEqual(1, len(jobs))
161 @mock.patch.object(NfOnBoardingThread, 'run')
162 def test_nf_pkg_on_boarding_normal(self, mock_run):
163 resp = self.client.post("/api/nslcm/v0/vnfpackage", {
167 self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
169 @mock.patch.object(restcall, 'call_req')
170 def test_nf_pkg_on_boarding_when_on_boarded(self, mock_call_req):
171 mock_call_req.return_value = [0, json.JSONEncoder().encode({"onBoardState": "onBoarded"}), '200']
172 NfOnBoardingThread(csar_id="1",
176 self.assert_job_result("2", 255, "CSAR(1) already onBoarded.")
178 @mock.patch.object(restcall, 'call_req')
179 def test_nf_pkg_on_boarding_when_on_boarding(self, mock_call_req):
180 mock_call_req.return_value = [0, json.JSONEncoder().encode({
181 "onBoardState": "non-onBoarded",
182 "processState": "onBoarding"
184 NfOnBoardingThread(csar_id="2",
188 self.assert_job_result("3", 255, "CSAR(2) is onBoarding now.")
190 @mock.patch.object(restcall, 'call_req')
191 def test_nf_on_boarding_when_nfd_already_exists(self, mock_call_req):
193 "/api/catalog/v1/csars/2":
194 [0, json.JSONEncoder().encode({
195 "onBoardState": "onBoardFailed", "processState": "deleteFailed"}), '200'],
196 "/api/catalog/v1/servicetemplates/queryingrawdata":
197 [0, json.JSONEncoder().encode(self.vnfd_raw_data), '200']}
199 def side_effect(*args):
200 return mock_vals[args[4]]
202 mock_call_req.side_effect = side_effect
203 NfPackageModel(uuid="1", nfpackageid="2", vnfdid="zte_vbras_1.0").save()
204 NfOnBoardingThread(csar_id="2", vim_ids=["1"], lab_vim_id="", job_id="4").run()
205 self.assert_job_result("4", 255, "NFD(zte_vbras_1.0) already exists.")
207 @mock.patch.object(restcall, 'call_req')
208 @mock.patch.object(fileutil, 'download_file_from_http')
209 @mock.patch.object(VimAdaptor, '__init__')
210 @mock.patch.object(VimAdaptor, 'create_image')
211 @mock.patch.object(VimAdaptor, 'get_image')
212 def test_nf_on_boarding_when_successfully(self, mock_get_image, mock_create_image,
213 mock__init__, mock_download_file_from_http, mock_call_req):
214 mock_download_file_from_http.return_value = True, "/root/package"
216 "/api/catalog/v1/csars/2":
217 [0, json.JSONEncoder().encode({
218 "onBoardState": "onBoardFailed", "processState": "deleteFailed"}), '200'],
219 "/api/catalog/v1/servicetemplates/queryingrawdata":
220 [0, json.JSONEncoder().encode(self.vnfd_raw_data), '200'],
221 "/api/catalog/v1/csars/2/files?relativePath=/SoftwareImages/image-lb":
222 [0, json.JSONEncoder().encode({
223 "csar_file_info": [{"downloadUri": "8"}, {"localPath": "9"}]}), '200'],
224 "/cloud-infrastructure/cloud-regions?depth=all":
225 [0, json.JSONEncoder().encode(vims_info), '200'],
226 "/api/catalog/v1/csars/2?onBoardState=onBoarded": [0, '{}', 200],
227 "/api/catalog/v1/csars/2?operationalState=Enabled": [0, '{}', 200],
228 "/api/catalog/v1/csars/2?processState=normal": [0, '{}', 200]}
229 mock_create_image.return_value = [0, {"id": "30", "name": "jerry", "res_type": 0}]
230 mock__init__.return_value = None
231 mock_get_image.return_value = [0, {"id": "30", "name": "jerry", "size": "60", "status": "active"}]
233 def side_effect(*args):
234 return mock_vals[args[4]]
235 mock_call_req.side_effect = side_effect
237 NfOnBoardingThread(csar_id="2", vim_ids=["1"], lab_vim_id="", job_id="4").run()
238 self.assert_job_result("4", 100, "CSAR(2) onBoarding successfully.")
240 # @mock.patch.object(restcall, 'call_req')
241 # @mock.patch.object(fileutil, 'download_file_from_http')
242 # @mock.patch.object(VimAdaptor, '__init__')
243 # @mock.patch.object(VimAdaptor, 'create_image')
244 # @mock.patch.object(VimAdaptor, 'get_image')
245 # def test_nf_on_boarding_when_timeout(self, mock_get_image, mock_create_image,
246 # mock__init__, mock_download_file_from_http, mock_call_req):
247 # nf_package.MAX_RETRY_TIMES = 2
248 # nf_package.SLEEP_INTERVAL_SECONDS = 1
249 # mock_download_file_from_http.return_value = True, "/root/package"
251 # "/api/catalog/v1/csars/3":
252 # [0, json.JSONEncoder().encode({"onBoardState": "onBoardFailed",
253 # "processState": "deleteFailed"}), '200'],
254 # "/api/catalog/v1/servicetemplates/queryingrawdata":
255 # [0, json.JSONEncoder().encode(self.vnfd_raw_data), '200'],
256 # "/api/catalog/v1/csars/3/files?relativePath=/SoftwareImages/image-lb":
257 # [0, json.JSONEncoder().encode({
258 # "csar_file_info": [{"downloadUri": "8"}, {"localPath": "9"}]}), '200'],
259 # "/api/catalog/v1/csars/3?processState=onBoardFailed": [0, '{}', 200],
260 # "/cloud-infrastructure/cloud-regions?depth=all":
261 # [0, json.JSONEncoder().encode(vims_info), 200]}
262 # mock_create_image.return_value = [0, {"id": "30", "name": "jerry", "res_type": 0}]
263 # mock__init__.return_value = None
264 # mock_get_image.return_value = [0, {"id": "30", "name": "jerry", "size": "60", "status": "0"}]
266 # def side_effect(*args):
267 # return mock_vals[args[4]]
269 # mock_call_req.side_effect = side_effect
270 # NfOnBoardingThread(csar_id="3", vim_ids=["1"], lab_vim_id="", job_id="6").run()
271 # self.assert_job_result("6", 255, "Failed to create image:timeout(2 seconds.)")
273 # @mock.patch.object(restcall, 'call_req')
274 # @mock.patch.object(fileutil, 'download_file_from_http')
275 # @mock.patch.object(VimAdaptor, '__init__')
276 # @mock.patch.object(VimAdaptor, 'create_image')
277 # def test_nf_on_boarding_when_failed_to_create_image(self, mock_create_image,
278 # mock__init__, mock_download_file_from_http, mock_call_req):
279 # mock_download_file_from_http.return_value = True, "/root/package"
281 # "/api/catalog/v1/csars/5":
282 # [0, json.JSONEncoder().encode({
283 # "onBoardState": "onBoardFailed", "processState": "deleteFailed"}), '200'],
284 # "/api/catalog/v1/servicetemplates/queryingrawdata":
285 # [0, json.JSONEncoder().encode(self.vnfd_raw_data), '200'],
286 # "/api/catalog/v1/csars/5/files?relativePath=/SoftwareImages/image-lb":
287 # [0, json.JSONEncoder().encode({
288 # "csar_file_info": [{"downloadUri": "8"}, {"localPath": "9"}]}), '200'],
289 # "/api/catalog/v1/csars/5?processState=onBoardFailed": [0, '{}', 200],
290 # "/cloud-infrastructure/cloud-regions?depth=all":
291 # [0, json.JSONEncoder().encode(vims_info), '200']}
292 # mock_create_image.return_value = [1, 'Unsupported image format.']
293 # mock__init__.return_value = None
295 # def side_effect(*args):
296 # return mock_vals[args[4]]
297 # mock_call_req.side_effect = side_effect
298 # NfOnBoardingThread(csar_id="5", vim_ids=["1"], lab_vim_id="", job_id="8").run()
299 # self.assert_job_result("8", 255, "Failed to create image:Unsupported image format.")
301 #########################################################################
302 @mock.patch.object(restcall, 'call_req')
303 def test_get_csar_successfully(self, mock_call_req):
304 mock_call_req.return_value = [0, json.JSONEncoder().encode({
305 "name": "1", "provider": "2", "version": "3", "operationalState": "4",
306 "usageState": "5", "onBoardState": "6", "processState": "7",
307 "deletionPending": "8", "downloadUri": "9", "createTime": "10",
308 "modifyTime": "11", "format": "12", "size": "13"
310 NfPackageModel(uuid="1", vnfdid="001", vendor="vendor",
311 vnfdversion="1.2.0", vnfversion="1.1.0", nfpackageid="13").save()
312 VnfPackageFileModel(id="1", filename="filename", imageid="00001",
313 vimid="1", vimuser="001", tenant="12", status="1", vnfpid="13").save()
314 NfInstModel(nfinstid="1", mnfinstid="001", nf_name="name", package_id="13").save()
315 resp = self.client.get("/api/nslcm/v0/vnfpackage/13")
316 self.assertEqual(resp.status_code, status.HTTP_200_OK)
321 "vnfdProvider": "vendor",
322 "vnfdVersion": "1.2.0",
323 "vnfVersion": "1.1.0",
327 "operationalState": "4",
331 "deletionPending": "8",
339 "fileName": "filename",
345 "vnfInstanceInfo": [{
346 "vnfInstanceId": "1",
347 "vnfInstanceName": "name"}]}
348 self.assertEqual(expect_data, resp.data)
350 #########################################################################
351 @mock.patch.object(restcall, 'call_req')
352 def test_delete_pending_csar_when_successfully(self, mock_call_req):
353 mock_call_req.return_value = [0, json.JSONEncoder().encode({
354 "processState": "deleting"}), "200"]
355 NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
356 self.assert_job_result("2", 100, "Delete pending CSAR(1) successfully.")
358 @mock.patch.object(restcall, 'call_req')
359 def test_delete_pending_csar_when_deleting(self, mock_call_req):
360 NfPackageModel(uuid="01", nfpackageid="1").save()
361 mock_call_req.return_value = [0, json.JSONEncoder().encode({
362 "processState": "deleting"}), "200"]
363 NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
364 self.assert_job_result("2", 100, "CSAR(1) is deleting now.")
366 @mock.patch.object(restcall, 'call_req')
367 def test_delete_pending_csar_when_not_deletion_pending(self, mock_call_req):
368 NfPackageModel(uuid="01", nfpackageid="1").save()
369 mock_call_req.return_value = [0, json.JSONEncoder().encode({
370 "deletionPending": "false"}), "200"]
371 NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
372 self.assert_job_result("2", 100, "CSAR(1) need not to be deleted.")
374 @mock.patch.object(restcall, 'call_req')
375 def test_delete_pending_csar_when_in_using(self, mock_call_req):
376 mock_call_req.return_value = [0, json.JSONEncoder().encode({
377 "processState": "normal"}), "200"]
378 NfPackageModel(uuid="01", nfpackageid="1").save()
379 NfInstModel(nfinstid="01", package_id="1").save()
380 NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
381 self.assert_job_result("2", 100, "CSAR(1) is in using, cannot be deleted.")
383 @mock.patch.object(VimAdaptor, '__init__')
384 @mock.patch.object(VimAdaptor, 'delete_image')
385 @mock.patch.object(restcall, 'call_req')
386 def test_delete_csarr_when_exception(self, mock_call_req, mock_delete_image, mock_init_):
388 ("/api/catalog/v1/csars/1", "DELETE"):
390 ("/api/catalog/v1/csars/1?processState=deleting", "PUT"):
392 ("/api/catalog/v1/csars/1?processState=deleteFailed", "PUT"):
394 ("/api/catalog/v1/csars/1", "GET"):
395 [0, json.JSONEncoder().encode({"processState": "normal"}), "200"],
396 ("/cloud-infrastructure/cloud-regions?depth=all", "GET"):
397 [0, json.JSONEncoder().encode(vims_info), "200"]}
398 mock_delete_image.return_value = [0, "", '200']
400 def side_effect(*args):
401 return mock_vals[(args[4], args[5])]
403 mock_call_req.side_effect = side_effect
404 mock_init_.return_value = None
405 VnfPackageFileModel(vnfpid="1", imageid="001", vimid="002").save()
406 NfPackageModel(uuid="01", nfpackageid="1").save()
407 NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
408 self.assert_job_result("2", 255, "Failed to delete CSAR(1) from catalog.")
410 @mock.patch.object(VimAdaptor, '__init__')
411 @mock.patch.object(VimAdaptor, 'delete_image')
412 @mock.patch.object(restcall, 'call_req')
413 def test_delete_csar_when_successfully(self, mock_call_req, mock_delete_image, mock_init_):
415 ("/api/catalog/v1/csars/1", "DELETE"):
416 [0, json.JSONEncoder().encode({"successfully": "successfully"}), "200"],
417 ("/api/catalog/v1/csars/1?processState=deleting", "PUT"):
418 [0, json.JSONEncoder().encode({"successfully": "successfully"}), "200"],
419 ("/api/catalog/v1/csars/1?processState=deleteFailed", "PUT"):
420 [0, json.JSONEncoder().encode({"successfully": "successfully"}), "200"],
421 ("/api/catalog/v1/csars/1", "GET"):
422 [0, json.JSONEncoder().encode({"notProcessState": "notProcessState"}), "200"],
423 ("/cloud-infrastructure/cloud-regions?depth=all", "GET"):
424 [0, json.JSONEncoder().encode(vims_info), "200"]}
425 mock_delete_image.return_value = [0, json.JSONEncoder().encode({"test": "test"}), '200']
427 def side_effect(*args):
428 return mock_vals[(args[4], args[5])]
430 mock_call_req.side_effect = side_effect
431 mock_init_.return_value = None
432 VnfPackageFileModel(vnfpid="1", imageid="001", vimid="002").save()
433 NfPackageModel(uuid="01", nfpackageid="1").save()
434 NfPkgDeletePendingThread(csar_id="1", job_id='2').run()
435 self.assert_job_result("2", 100, "Delete CSAR(1) successfully.")
437 #########################################################################
438 @mock.patch.object(restcall, 'call_req')
439 def test_delete_nf_pkg_when_deleting(self, mock_call_req):
440 mock_call_req.return_value = [0, json.JSONEncoder().encode({"processState": "deleting"}), '200']
441 NfPkgDeleteThread(csar_id="1", job_id="2").run()
442 self.assert_job_result("2", 100, "CSAR(1) is deleting now.")
445 def test_get_nf_csars_normal(self):
446 NfPackageModel(uuid="01", nfpackageid="1", vnfdid="2").save()
447 resp = self.client.get("/api/nslcm/v0/vnfpackage")
448 self.assertEqual(resp.status_code, status.HTTP_200_OK)
449 self.assertEqual(1, len(resp.data["csars"]))
450 self.assertEqual("1", resp.data["csars"][0]["csarId"])
451 self.assertEqual("2", resp.data["csars"][0]["vnfdId"])
457 "cloud-owner": "example-cloud-owner-val-60268",
458 "cloud-region-id": "example-cloud-region-id-val-77704",
459 "cloud-type": "example-cloud-type-val-20689",
460 "owner-defined-type": "example-owner-defined-type-val-24237",
461 "cloud-region-version": "example-cloud-region-version-val-95948",
462 "identity-url": "example-identity-url-val-98336",
463 "cloud-zone": "example-cloud-zone-val-67202",
464 "complex-name": "example-complex-name-val-86264",
465 "sriov-automation": True,
466 "cloud-extra-info": "example-cloud-extra-info-val-44735",
467 "cloud-epa-caps": "example-cloud-epa-caps-val-67134",
468 "resource-version": "example-resource-version-val-47608",
472 "volume-group-id": "example-volume-group-id-val-79555",
473 "volume-group-name": "example-volume-group-name-val-21888",
474 "heat-stack-id": "example-heat-stack-id-val-56926",
475 "vnf-type": "example-vnf-type-val-47890",
476 "orchestration-status": "example-orchestration-status-val-34971",
477 "model-customization-id": "example-model-customization-id-val-7851",
478 "vf-module-model-customization-id": "example-vf-module-model-customization-id-val-35365",
479 "resource-version": "example-resource-version-val-66022"
486 "tenant-id": "example-tenant-id-val-30151",
487 "tenant-name": "example-tenant-name-val-12231",
488 "tenant-context": "example-tenant-context-val-80991",
489 "resource-version": "example-resource-version-val-5033",
493 "vserver-id": "example-vserver-id-val-70581",
494 "vserver-name": "example-vserver-name-val-63390",
495 "vserver-name2": "example-vserver-name2-val-70924",
496 "prov-status": "example-prov-status-val-24088",
497 "vserver-selflink": "example-vserver-selflink-val-17737",
499 "is-closed-loop-disabled": True,
500 "resource-version": "example-resource-version-val-46166",
504 "volume-id": "example-volume-id-val-9740",
505 "volume-selflink": "example-volume-selflink-val-8411",
506 "resource-version": "example-resource-version-val-41965"
513 "interface-name": "example-interface-name-val-67663",
514 "interface-role": "example-interface-role-val-27132",
515 "v6-wan-link-ip": "example-v6-wan-link-ip-val-85445",
516 "selflink": "example-selflink-val-83317",
517 "interface-id": "example-interface-id-val-98716",
518 "macaddr": "example-macaddr-val-18235",
519 "network-name": "example-network-name-val-45040",
520 "management-option": "example-management-option-val-65761",
521 "interface-description": "example-interface-description-val-32615",
522 "is-port-mirrored": True,
523 "resource-version": "example-resource-version-val-10801",
525 "prov-status": "example-prov-status-val-5726",
526 "is-ip-unnumbered": True,
527 "allowed-address-pairs": "example-allowed-address-pairs-val-52679",
531 "vlan-interface": "example-vlan-interface-val-61591",
532 "vlan-id-inner": 53472228,
533 "vlan-id-outer": 93087267,
534 "resource-version": "example-resource-version-val-52900",
535 "speed-value": "example-speed-value-val-69335",
536 "speed-units": "example-speed-units-val-72089",
537 "vlan-description": "example-vlan-description-val-96604",
538 "backdoor-connection": "example-backdoor-connection-val-42299",
539 "vpn-key": "example-vpn-key-val-50517",
540 "orchestration-status": "example-orchestration-status-val-66570",
542 "prov-status": "example-prov-status-val-46495",
543 "is-ip-unnumbered": True,
544 "l3-interface-ipv4-address-list": [
546 "l3-interface-ipv4-address": "example-l3-interface-ipv4-address-val-32173",
547 "l3-interface-ipv4-prefix-length": 29740951,
548 "vlan-id-inner": 93873764,
549 "vlan-id-outer": 82615508,
551 "resource-version": "example-resource-version-val-75216",
552 "neutron-network-id": "example-neutron-network-id-val-77878",
553 "neutron-subnet-id": "example-neutron-subnet-id-val-79062"
556 "l3-interface-ipv6-address-list": [
558 "l3-interface-ipv6-address": "example-l3-interface-ipv6-address-val-88548",
559 "l3-interface-ipv6-prefix-length": 89047373,
560 "vlan-id-inner": 95671681,
561 "vlan-id-outer": 88533796,
563 "resource-version": "example-resource-version-val-40990",
564 "neutron-network-id": "example-neutron-network-id-val-81951",
565 "neutron-subnet-id": "example-neutron-subnet-id-val-4218"
574 "pci-id": "example-pci-id-val-12933",
575 "vf-vlan-filter": "example-vf-vlan-filter-val-90275",
576 "vf-mac-filter": "example-vf-mac-filter-val-13509",
577 "vf-vlan-strip": True,
578 "vf-vlan-anti-spoof-check": True,
579 "vf-mac-anti-spoof-check": True,
580 "vf-mirrors": "example-vf-mirrors-val-59746",
581 "vf-broadcast-allow": True,
582 "vf-unknown-multicast-allow": True,
583 "vf-unknown-unicast-allow": True,
584 "vf-insert-stag": True,
585 "vf-link-status": "example-vf-link-status-val-37662",
586 "resource-version": "example-resource-version-val-86970",
587 "neutron-network-id": "example-neutron-network-id-val-71727"
594 "interface-name": "example-interface-name-val-91632",
595 "interface-role": "example-interface-role-val-59119",
596 "v6-wan-link-ip": "example-v6-wan-link-ip-val-21039",
597 "selflink": "example-selflink-val-16277",
598 "interface-id": "example-interface-id-val-77457",
599 "macaddr": "example-macaddr-val-49026",
600 "network-name": "example-network-name-val-3483",
601 "management-option": "example-management-option-val-16429",
602 "interface-description": "example-interface-description-val-50889",
603 "is-port-mirrored": True,
604 "resource-version": "example-resource-version-val-30308",
606 "prov-status": "example-prov-status-val-69406",
607 "is-ip-unnumbered": True,
608 "allowed-address-pairs": "example-allowed-address-pairs-val-49123"
612 "l3-interface-ipv4-address-list": [
614 "l3-interface-ipv4-address": "example-l3-interface-ipv4-address-val-63922",
615 "l3-interface-ipv4-prefix-length": 13823411,
616 "vlan-id-inner": 14316230,
617 "vlan-id-outer": 66559625,
619 "resource-version": "example-resource-version-val-30766",
620 "neutron-network-id": "example-neutron-network-id-val-46636",
621 "neutron-subnet-id": "example-neutron-subnet-id-val-96658"
624 "l3-interface-ipv6-address-list": [
626 "l3-interface-ipv6-address": "example-l3-interface-ipv6-address-val-21246",
627 "l3-interface-ipv6-prefix-length": 20226253,
628 "vlan-id-inner": 68200128,
629 "vlan-id-outer": 18442586,
631 "resource-version": "example-resource-version-val-24602",
632 "neutron-network-id": "example-neutron-network-id-val-49811",
633 "neutron-subnet-id": "example-neutron-subnet-id-val-67505"
648 "flavor-id": "example-flavor-id-val-15058",
649 "flavor-name": "example-flavor-name-val-69485",
650 "flavor-vcpus": 92601,
652 "flavor-disk": 58744,
653 "flavor-ephemeral": 84771,
654 "flavor-swap": "example-flavor-swap-val-66481",
655 "flavor-is-public": True,
656 "flavor-selflink": "example-flavor-selflink-val-48912",
657 "flavor-disabled": True,
658 "resource-version": "example-resource-version-val-55131"
662 "group-assignments": {
663 "group-assignment": [
665 "group-id": "example-group-id-val-79234",
666 "group-type": "example-group-type-val-29164",
667 "group-name": "example-group-name-val-57605",
668 "group-description": "example-group-description-val-52975",
669 "resource-version": "example-resource-version-val-10280"
676 "snapshot-id": "example-snapshot-id-val-60630",
677 "snapshot-name": "example-snapshot-name-val-90351",
678 "snapshot-architecture": "example-snapshot-architecture-val-3225",
679 "snapshot-os-distro": "example-snapshot-os-distro-val-31399",
680 "snapshot-os-version": "example-snapshot-os-version-val-16981",
681 "application": "example-application-val-34584",
682 "application-vendor": "example-application-vendor-val-97854",
683 "application-version": "example-application-version-val-20705",
684 "snapshot-selflink": "example-snapshot-selflink-val-84731",
685 "prev-snapshot-id": "example-prev-snapshot-id-val-77339",
686 "resource-version": "example-resource-version-val-19220"
693 "image-id": "example-image-id-val-34721",
694 "image-name": "example-image-name-val-64106",
695 "image-architecture": "example-image-architecture-val-8247",
696 "image-os-distro": "example-image-os-distro-val-98534",
697 "image-os-version": "example-image-os-version-val-87444",
698 "application": "example-application-val-30758",
699 "application-vendor": "example-application-vendor-val-7048",
700 "application-version": "example-application-version-val-79678",
701 "image-selflink": "example-image-selflink-val-72836",
702 "resource-version": "example-resource-version-val-79432",
706 "metaname": "example-metaname-val-75188",
707 "metaval": "example-metaval-val-64947",
708 "resource-version": "example-resource-version-val-59427"
718 "switch-name": "example-switch-name-val-21335",
719 "vcenter-url": "example-vcenter-url-val-74348",
720 "resource-version": "example-resource-version-val-51253"
727 "network-uuid": "example-network-uuid-val-65686",
728 "network-name": "example-network-name-val-94383",
729 "cvlan-tag": 31041170,
730 "ipv4-oam-gateway-address": "example-ipv4-oam-gateway-address-val-15815",
731 "ipv4-oam-gateway-address-prefix-length": 65477,
732 "resource-version": "example-resource-version-val-21712"
736 "availability-zones": {
737 "availability-zone": [
739 "availability-zone-name": "example-availability-zone-name-val-14569",
740 "hypervisor-type": "example-hypervisor-type-val-70481",
741 "operational-status": "example-operational-status-val-13589",
742 "resource-version": "example-resource-version-val-78031"
746 "esr-system-info-list": {
749 "esr-system-info-id": "example-esr-system-info-id-val-58799",
750 "system-name": "example-system-name-val-78629",
751 "type": "example-type-val-4146",
752 "vendor": "example-vendor-val-11916",
753 "version": "example-version-val-60284",
754 "service-url": "example-service-url-val-85858",
755 "user-name": "example-user-name-val-23297",
756 "password": "example-password-val-33729",
757 "system-type": "example-system-type-val-54309",
758 "protocal": "example-protocal-val-86585",
759 "ssl-cacert": "example-ssl-cacert-val-95811",
760 "ssl-insecure": True,
761 "ip-address": "example-ip-address-val-62987",
762 "port": "example-port-val-83650",
763 "cloud-domain": "example-cloud-domain-val-9841",
764 "default-tenant": "example-default-tenant-val-52776",
765 "resource-version": "example-resource-version-val-61961"