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.
19 from django.test import Client
20 from django.test import TestCase
21 from rest_framework import status
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
33 class TestNfPackage(TestCase):
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 = {
48 "plugin_info": "vbrasplugin_1.0",
50 "request_reclassification": False,
55 "vnfd_version": "1.0.0",
56 "id": "zte_vbras_1.0",
61 "id": "aaa_dnet_cp_0xu2j5sbigxc8h1ega3if0ld1",
62 "type_name": "tosca.nodes.nfv.ext.zte.CP",
63 "template_name": "aaa_dnet_cp",
66 "type_name": "integer",
70 "type_name": "string",
71 "value": "bidirectional"
74 "type_name": "string",
77 "sfc_encapsulation": {
78 "type_name": "string",
82 "type_name": "integer",
89 "source_requirement_index": 0,
90 "target_node_id": "AAA_image_d8aseebr120nbm7bo1ohkj194",
91 "target_capability_name": "feature"
96 "id": "LB_Image_oj5l2ay8l2g6vcq6fsswzduha",
97 "type_name": "tosca.nodes.nfv.ext.ImageFile",
98 "template_name": "LB_Image",
101 "type_name": "string",
105 "type_name": "string",
106 "value": "/SoftwareImages/image-lb"
109 "type_name": "string",
119 "plugin_info": "vbrasplugin_1.0",
121 "request_reclassification": False,
126 "vnfd_version": "1.0.0",
127 "id": "zte_vbras_1.0",
132 "name": "aaa_dnet_cp",
133 "type_name": "tosca.nodes.nfv.ext.zte.CP",
134 "default_instances": 1,
138 "type_name": "integer",
142 "requirement_templates": [
144 "name": "virtualbinding",
145 "target_node_template_name": "AAA",
146 "target_capability_name": "virtualbinding"
158 def assert_job_result(self, job_id, job_progress, job_detail):
159 jobs = JobStatusModel.objects.filter(
161 progress=job_progress,
163 self.assertEqual(1, len(jobs))
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", {
171 self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
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",
180 self.assert_job_result("2", 255, "CSAR(1) already onBoarded.")
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"
188 NfOnBoardingThread(csar_id="2",
192 self.assert_job_result("3", 255, "CSAR(2) is onBoarding now.")
194 @mock.patch.object(restcall, 'call_req')
195 def test_nf_on_boarding_when_nfd_already_exists(self, mock_call_req):
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']}
203 def side_effect(*args):
204 return mock_vals[args[4]]
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.")
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"
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"}]
237 def side_effect(*args):
238 return mock_vals[args[4]]
239 mock_call_req.side_effect = side_effect
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.")
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"
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"}]
270 # def side_effect(*args):
271 # return mock_vals[args[4]]
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.)")
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"
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
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.")
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"
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)
325 "vnfdProvider": "vendor",
326 "vnfdVersion": "1.2.0",
327 "vnfVersion": "1.1.0",
331 "operationalState": "4",
335 "deletionPending": "8",
343 "fileName": "filename",
349 "vnfInstanceInfo": [{
350 "vnfInstanceId": "1",
351 "vnfInstanceName": "name"}]}
352 self.assertEqual(expect_data, resp.data)
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.")
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.")
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.")
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.")
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_):
392 ("/api/catalog/v1/csars/1", "DELETE"):
394 ("/api/catalog/v1/csars/1?processState=deleting", "PUT"):
396 ("/api/catalog/v1/csars/1?processState=deleteFailed", "PUT"):
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']
404 def side_effect(*args):
405 return mock_vals[(args[4], args[5])]
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.")
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_):
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']
431 def side_effect(*args):
432 return mock_vals[(args[4], args[5])]
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.")
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.")
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"])
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",
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"
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",
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",
502 "is-closed-loop-disabled": True,
503 "resource-version": "example-resource-version-val-46166",
507 "volume-id": "example-volume-id-val-9740",
508 "volume-selflink": "example-volume-selflink-val-8411",
509 "resource-version": "example-resource-version-val-41965"
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",
528 "prov-status": "example-prov-status-val-5726",
529 "is-ip-unnumbered": True,
530 "allowed-address-pairs": "example-allowed-address-pairs-val-52679",
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",
545 "prov-status": "example-prov-status-val-46495",
546 "is-ip-unnumbered": True,
547 "l3-interface-ipv4-address-list": [
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,
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"
559 "l3-interface-ipv6-address-list": [
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,
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"
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"
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",
609 "prov-status": "example-prov-status-val-69406",
610 "is-ip-unnumbered": True,
611 "allowed-address-pairs": "example-allowed-address-pairs-val-49123"
615 "l3-interface-ipv4-address-list": [
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,
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"
627 "l3-interface-ipv6-address-list": [
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,
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"
651 "flavor-id": "example-flavor-id-val-15058",
652 "flavor-name": "example-flavor-name-val-69485",
653 "flavor-vcpus": 92601,
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"
665 "group-assignments": {
666 "group-assignment": [
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"
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"
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",
709 "metaname": "example-metaname-val-75188",
710 "metaval": "example-metaval-val-64947",
711 "resource-version": "example-resource-version-val-59427"
721 "switch-name": "example-switch-name-val-21335",
722 "vcenter-url": "example-vcenter-url-val-74348",
723 "resource-version": "example-resource-version-val-51253"
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"
739 "availability-zones": {
740 "availability-zone": [
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"
749 "esr-system-info-list": {
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"