From 073d731620daa5dd08e41fcabfe7f5a463485e22 Mon Sep 17 00:00:00 2001 From: sarada prasad sahoo Date: Tue, 3 Sep 2019 15:27:13 +0530 Subject: [PATCH] fix public NS distribution issue Fix Multiple VFModule under single service distribution Issue-ID: SO-2275 Change-Id: I7a4a7dbb68d23c0e44f9985b3fdc89816dbfd232 Signed-off-by: sarada prasad sahoo --- .../installer/heat/ToscaResourceInstaller.java | 14 +- .../client/test/rest/ASDCRestInterfaceTest.java | 24 + .../public-ns/demo-public-ns-notification.json | 173 +++ .../public-ns/service-Publicns-csar.csar | Bin 0 -> 96398 bytes .../public-ns/service-Publicns-template.yml | 1186 ++++++++++++++++++++ .../resource-examples/public-ns/vcpe0/ar1000v.env | 10 + .../resource-examples/public-ns/vcpe0/ar1000v.yaml | 103 ++ .../public-ns/vcpe0/vcpe0_modules.json | 25 + .../public-ns/vcpe0/vendor-license-model.xml | 1 + .../public-ns/vcpe0/vf-license-model.xml | 1 + .../resource-examples/public-ns/vgw0/gateway.env | 9 + .../resource-examples/public-ns/vgw0/gateway.yaml | 109 ++ .../public-ns/vgw0/vendor-license-model.xml | 1 + .../public-ns/vgw0/vf-license-model.xml | 1 + .../public-ns/vgw0/vgw0_modules.json | 25 + 15 files changed, 1679 insertions(+), 3 deletions(-) create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/demo-public-ns-notification.json create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/service-Publicns-csar.csar create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/service-Publicns-template.yml create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/ar1000v.env create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/ar1000v.yaml create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vcpe0_modules.json create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vendor-license-model.xml create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vf-license-model.xml create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/gateway.env create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/gateway.yaml create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vendor-license-model.xml create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vf-license-model.xml create mode 100644 asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vgw0_modules.json diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java index da989b0155..c3ee081c69 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java @@ -656,7 +656,10 @@ public class ToscaResourceInstaller { NetworkResourceCustomization networkCustomization = createNetwork(vlEntity, toscaResourceStruct, heatTemplate, tempNetworkLookUp.getAicVersionMax(), tempNetworkLookUp.getAicVersionMin(), service); - service.getNetworkCustomizations().add(networkCustomization); + // only insert unique entries + if (!service.getNetworkCustomizations().contains(networkCustomization)) { + service.getNetworkCustomizations().add(networkCustomization); + } } else { throw new ArtifactInstallerException("No HeatTemplate found for artifactUUID: " + tempNetworkLookUp.getHeatTemplateArtifactUuid()); @@ -2499,7 +2502,6 @@ public class ToscaResourceInstaller { // setting resource input for vnf customization vnfResourceCustomization.setResourceInput( getResourceInput(toscaResourceStructure, vnfResourceCustomization.getModelCustomizationUUID())); - service.getVnfCustomizations().add(vnfResourceCustomization); } return vnfResourceCustomization; @@ -2815,10 +2817,16 @@ public class ToscaResourceInstaller { Service existingService = services.get(0); List existingVnfCustomizations = existingService.getVnfCustomizations(); if (existingService != null) { - service.getVnfCustomizations().addAll(existingVnfCustomizations); + // it is duplicating entries, so added a check + for (VnfResourceCustomization existingVnfResourceCustomization : existingVnfCustomizations) { + if (!service.getVnfCustomizations().contains(existingVnfResourceCustomization)) { + service.getVnfCustomizations().add(existingVnfResourceCustomization); + } + } } } service.getVnfCustomizations().add(vnfResourceCustomization); + } diff --git a/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java b/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java index 2a4b3aa6fb..fc72f9bc6e 100644 --- a/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java +++ b/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java @@ -319,6 +319,30 @@ public class ASDCRestInterfaceTest extends BaseTest { assertEquals("CCVPNService", service.get().getModelName()); } + @Test + public void test_PublicNS_Distribution() throws Exception { + wireMockServer.stubFor(post(urlPathMatching("/aai/.*")) + .willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json"))); + + wireMockServer.stubFor(post(urlPathMatching("/v1.0/activity-spec")) + .willReturn(aResponse().withHeader("Content-Type", "application/json") + .withStatus(org.springframework.http.HttpStatus.ACCEPTED.value()))); + + String resourceLocation = "src/test/resources/resource-examples/public-ns/"; + ObjectMapper mapper = new ObjectMapper(); + NotificationDataImpl request = mapper.readValue(new File(resourceLocation + "demo-public-ns-notification.json"), + NotificationDataImpl.class); + headers.add("resource-location", resourceLocation); + HttpEntity entity = new HttpEntity(request, headers); + ResponseEntity response = restTemplate.exchange(createURLWithPort("test/treatNotification/v1"), + HttpMethod.POST, entity, String.class); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value()); + + Optional service = serviceRepo.findById("da28696e-d4c9-4df4-9f91-465c6c09a81e"); + assertTrue(service.isPresent()); + assertEquals("PublicNS", service.get().getModelName()); + } + protected String createURLWithPort(String uri) { return "http://localhost:" + port + uri; } diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/demo-public-ns-notification.json b/asdc-controller/src/test/resources/resource-examples/public-ns/demo-public-ns-notification.json new file mode 100644 index 0000000000..f829bf0246 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/demo-public-ns-notification.json @@ -0,0 +1,173 @@ +{ + "distributionID": "2d6c5aa8-b644-4f30-a632-5577801ef954", + "serviceName": "PublicNS", + "serviceVersion": "1.0", + "serviceUUID": "da28696e-d4c9-4df4-9f91-465c6c09a81e", + "serviceDescription": "PUblic NS", + "serviceInvariantUUID": "e907ce73-7e4d-4bf8-b94a-21bd1a7c7592", + "resources": [ + { + "resourceInstanceName": "vCPE 0", + "resourceName": "vCPE", + "resourceVersion": "1.0", + "resoucreType": "VF", + "resourceUUID": "a67562cf-1bf3-4450-8b69-3bb1cff43089", + "resourceInvariantUUID": "e0b3088d-9ca8-482a-aa5a-a1e6906b2d22", + "resourceCustomizationUUID": "ae70c293-8db3-40cd-8cd0-30cde194bea5", + "category": "Generic", + "subcategory": "Infrastructure", + "artifacts": [ + { + "artifactName": "vf-license-model.xml", + "artifactType": "VF_LICENSE", + "artifactURL": "/vcpe0/vf-license-model.xml", + "artifactChecksum": "YjYyYWNiMzUxM2YzMWYxYWVhN2Y5MTM3N2E5YzNhNmU\u003d", + "artifactDescription": "VF license file", + "artifactTimeout": 120, + "artifactUUID": "5c29e823-7114-4988-824f-f670ba9d7b21", + "artifactVersion": "1" + }, + { + "artifactName": "vcpe0_modules.json", + "artifactType": "VF_MODULES_METADATA", + "artifactURL": "/vcpe0/vcpe0_modules.json", + "artifactChecksum": "MDJkYjNmNjEzM2Y1ZDgzNzZiZWUxMjZkMzA3YzkwZDI\u003d", + "artifactDescription": "Auto-generated VF Modules information artifact", + "artifactTimeout": 120, + "artifactUUID": "128e4e77-21a4-49c3-ac7a-7ca3b187bddc", + "artifactVersion": "1" + }, + { + "artifactName": "ar1000v.yaml", + "artifactType": "HEAT", + "artifactURL": "/vcpe0/ar1000v.yaml", + "artifactChecksum": "NWU2NGUwNmNkMGEzYjAxMTAyODkzNTc5YzFmZDBmMzM\u003d", + "artifactDescription": "created from csar", + "artifactTimeout": 120, + "artifactUUID": "12dcc618-20f2-4f15-ab00-c549b96b3910", + "artifactVersion": "2" + }, + { + "artifactName": "vendor-license-model.xml", + "artifactType": "VENDOR_LICENSE", + "artifactURL": "/vcpe0/vendor-license-model.xml", + "artifactChecksum": "OTRkOTY3YjdjM2ZlNDM3NjNlZjBjODU4YTJmNGZhNGE\u003d", + "artifactDescription": " Vendor license file", + "artifactTimeout": 120, + "artifactUUID": "74c4d1bd-1779-421f-8c9d-774ac4567031", + "artifactVersion": "1" + }, + { + "artifactName": "ar1000v.env", + "artifactType": "HEAT_ENV", + "artifactURL": "/vcpe0/ar1000v.env", + "artifactChecksum": "YzI4MjlkODk4YzcyOTgzZTg2YjAyM2ZiNWU1N2FmMjI\u003d", + "artifactDescription": "Auto-generated HEAT Environment deployment artifact", + "artifactTimeout": 120, + "artifactUUID": "5821b043-ba50-49ef-b739-61b0896050f2", + "artifactVersion": "2", + "generatedFromUUID": "12dcc618-20f2-4f15-ab00-c549b96b3910" + } + ] + }, + { + "resourceInstanceName": "vGW 0", + "resourceName": "vGW", + "resourceVersion": "1.0", + "resoucreType": "VF", + "resourceUUID": "cd82e255-56cf-4644-858e-36cfc45ef754", + "resourceInvariantUUID": "52905e03-0632-43f9-93f2-2ab7d959f633", + "resourceCustomizationUUID": "fd8595de-1081-4e39-a401-24ffebaa9ed8", + "category": "Generic", + "subcategory": "Infrastructure", + "artifacts": [ + { + "artifactName": "vf-license-model.xml", + "artifactType": "VF_LICENSE", + "artifactURL": "/vgw0/vf-license-model.xml", + "artifactChecksum": "YTdlMDhmYjMzODg5NmI3ODgwNjA0MmUyOWU2N2I2MGM\u003d", + "artifactDescription": "VF license file", + "artifactTimeout": 120, + "artifactUUID": "f2db3ba5-190f-4214-90fd-93407caf10c1", + "artifactVersion": "1" + }, + { + "artifactName": "vgw0_modules.json", + "artifactType": "VF_MODULES_METADATA", + "artifactURL": "/vgw0/vgw0_modules.json", + "artifactChecksum": "OTQwY2ZlZThjMjNlYjAyNzU4NDUyZDVhY2VjNTIwZTk\u003d", + "artifactDescription": "Auto-generated VF Modules information artifact", + "artifactTimeout": 120, + "artifactUUID": "8730baa0-1b8c-4ac3-bc5c-d49c5b88f111", + "artifactVersion": "1" + }, + { + "artifactName": "gateway.yaml", + "artifactType": "HEAT", + "artifactURL": "/vgw0/gateway.yaml", + "artifactChecksum": "NGNiMGRjMWViNGRkMGQzM2ZjNDNjMjQ5OGMwMjI2MjM\u003d", + "artifactDescription": "created from csar", + "artifactTimeout": 120, + "artifactUUID": "60d55796-212c-4c66-8af5-63964d636ae4", + "artifactVersion": "2" + }, + { + "artifactName": "vendor-license-model.xml", + "artifactType": "VENDOR_LICENSE", + "artifactURL": "/vgw0/vendor-license-model.xml", + "artifactChecksum": "OTRkOTY3YjdjM2ZlNDM3NjNlZjBjODU4YTJmNGZhNGE\u003d", + "artifactDescription": " Vendor license file", + "artifactTimeout": 120, + "artifactUUID": "019bdcbf-03fc-4ec2-8d39-c09f808722e9", + "artifactVersion": "1" + }, + { + "artifactName": "gateway.env", + "artifactType": "HEAT_ENV", + "artifactURL": "/vgw0/gateway.env", + "artifactChecksum": "Y2Y4ZDgzMDg3NDBiMDhkODZiMmE1MGUyYjU2ZGFlZDU\u003d", + "artifactDescription": "Auto-generated HEAT Environment deployment artifact", + "artifactTimeout": 120, + "artifactUUID": "9df0452f-826c-4287-9a2d-ca0095339866", + "artifactVersion": "2", + "generatedFromUUID": "60d55796-212c-4c66-8af5-63964d636ae4" + } + ] + }, + { + "resourceInstanceName": "Generic NeutronNet 0", + "resourceName": "Generic NeutronNet", + "resourceVersion": "1.0", + "resoucreType": "VL", + "resourceUUID": "4069be99-5d9a-427b-a427-04fe16ccbf38", + "resourceInvariantUUID": "f3ed1133-c1bb-4735-82d4-8e041265fad6", + "resourceCustomizationUUID": "c8a1a81d-d836-4f33-9d0e-91e9417f812a", + "category": "Generic", + "subcategory": "Network Elements", + "artifacts": [] + } + ], + "serviceArtifacts": [ + { + "artifactName": "service-Publicns-template.yml", + "artifactType": "TOSCA_TEMPLATE", + "artifactURL": "/service-Publicns-template.yml", + "artifactChecksum": "NTUzMDU5YzM3MTk4OGNiNjQ2OGRlMWY2YjU3MjE2YjM\u003d", + "artifactDescription": "TOSCA representation of the asset", + "artifactTimeout": 0, + "artifactUUID": "2617d0ca-54f0-4222-b659-c12e292d94dd", + "artifactVersion": "1" + }, + { + "artifactName": "service-Publicns-csar.csar", + "artifactType": "TOSCA_CSAR", + "artifactURL": "/service-Publicns-csar.csar", + "artifactChecksum": "ZTRhOGI0M2UxN2ZhYjQ0ODI5ZDZhZTExZTFkMGU3N2Y\u003d", + "artifactDescription": "TOSCA definition package of the asset", + "artifactTimeout": 0, + "artifactUUID": "26a323ff-b97b-4b86-96b1-25a80c0876e5", + "artifactVersion": "1" + } + ], + "workloadContext": "Production" +} diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/service-Publicns-csar.csar b/asdc-controller/src/test/resources/resource-examples/public-ns/service-Publicns-csar.csar new file mode 100644 index 0000000000000000000000000000000000000000..d5ea949cdc5ad6f56fa57c1542cd17e98878dc6f GIT binary patch literal 96398 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 literal 0 HcmV?d00001 diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/service-Publicns-template.yml b/asdc-controller/src/test/resources/resource-examples/public-ns/service-Publicns-template.yml new file mode 100644 index 0000000000..2e6f29360f --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/service-Publicns-template.yml @@ -0,0 +1,1186 @@ +tosca_definitions_version: tosca_simple_yaml_1_1 +metadata: + invariantUUID: e907ce73-7e4d-4bf8-b94a-21bd1a7c7592 + UUID: da28696e-d4c9-4df4-9f91-465c6c09a81e + name: PublicNS + description: PUblic NS + type: Service + category: E2E Service + serviceType: '' + serviceRole: '' + instantiationType: A-la-carte + serviceEcompNaming: true + ecompGeneratedNaming: true + namingPolicy: '' + environmentContext: General_Revenue-Bearing +imports: +- nodes: + file: nodes.yml +- datatypes: + file: data.yml +- capabilities: + file: capabilities.yml +- relationships: + file: relationships.yml +- groups: + file: groups.yml +- policies: + file: policies.yml +- annotations: + file: annotations.yml +- service-PublicNS-interface: + file: service-Publicns-template-interface.yml +- resource-vCPE: + file: resource-Vcpe-template.yml +- resource-vCPE-interface: + file: resource-Vcpe-template-interface.yml +- resource-vGW: + file: resource-Vgw-template.yml +- resource-vGW-interface: + file: resource-Vgw-template-interface.yml +- resource-Generic NeutronNet: + file: resource-GenericNeutronnet-template.yml +topology_template: + node_templates: + vCPE 0: + type: org.openecomp.resource.vf.Vcpe + metadata: + invariantUUID: e0b3088d-9ca8-482a-aa5a-a1e6906b2d22 + UUID: 32edc5e6-34f7-4d62-92f8-c38817280eb9 + customizationUUID: ae70c293-8db3-40cd-8cd0-30cde194bea5 + version: '1.0' + name: vCPE + description: vCPE + type: VF + category: Generic + subcategory: Infrastructure + resourceVendor: huawei + resourceVendorRelease: '1.0' + resourceVendorModelNumber: '' + properties: + vf_module_id: vCPEAR1000V + private_subnet_lan_id: 265e1457-8eb7-4fe8-a580-fb547656aad1 + vcpe_image_name: vCPE_images + skip_post_instantiation_configuration: true + nf_naming: + ecomp_generated_naming: true + multi_stage_design: 'false' + availability_zone_max_count: 1 + private_net_id: 1ecdeb3d-5d6d-45c4-a3d2-6cc53372fa8d + vcpe_name: ar1000v + private_subnet_wan_id: 86048e4e-861e-47c9-ae55-a5531b747e36 + vnf_id: vCPE_huaweicloud + vcpe_flavor_name: vCPE_flavor + vcpe_private_ip_lan: 192.168.10.250 + requirements: + - abstract_vcpe.link_vcpe_vcpe_private_lan_port: + capability: virtual_linkable + node: Generic NeutronNet 0 + - abstract_vcpe.link_vcpe_vcpe_private_wan_port: + capability: virtual_linkable + node: Generic NeutronNet 0 + capabilities: + abstract_vcpe.network.outgoing.bytes.rate_vcpe_vcpe_private_lan_port: + properties: + unit: B/s + description: Average rate of outgoing bytes + type: Gauge + category: network + abstract_vcpe.scalable_vcpe: + properties: + max_instances: 1 + min_instances: 1 + abstract_vcpe.network.outgoing.bytes_vcpe_vcpe_private_lan_port: + properties: + unit: B + description: Number of outgoing bytes + type: Cumulative + category: network + abstract_vcpe.disk.read.requests_vcpe: + properties: + unit: request + description: Number of read requests + type: Cumulative + category: compute + abstract_vcpe.disk.device.write.requests.rate_vcpe: + properties: + unit: request/s + description: Average rate of write requests + type: Gauge + category: disk + abstract_vcpe.disk.read.bytes.rate_vcpe: + properties: + unit: B/s + description: Average rate of reads + type: Gauge + category: compute + abstract_vcpe.network.outgoing.bytes.rate_vcpe_vcpe_private_wan_port: + properties: + unit: B/s + description: Average rate of outgoing bytes + type: Gauge + category: network + abstract_vcpe.disk.device.read.requests_vcpe: + properties: + unit: request + description: Number of read requests + type: Cumulative + category: disk + abstract_vcpe.disk.device.capacity_vcpe: + properties: + unit: B + description: The amount of disk per device that the instance can see + type: Gauge + category: disk + abstract_vcpe.cpu.delta_vcpe: + properties: + unit: ns + description: CPU time used since previous datapoint + type: Delta + category: compute + abstract_vcpe.port_mirroring_vcpe_vcpe_private_lan_port: + properties: + connection_point: + network_role: + get_input: port_vcpe_private_lan_port_network_role + nfc_naming_code: vcpe + abstract_vcpe.network.incoming.bytes.rate_vcpe_vcpe_private_lan_port: + properties: + unit: B/s + description: Average rate of incoming bytes + type: Gauge + category: network + abstract_vcpe.network.incoming.packets.rate_vcpe_vcpe_private_lan_port: + properties: + unit: packet/s + description: Average rate of incoming packets + type: Gauge + category: network + abstract_vcpe.port_mirroring_vcpe_vcpe_private_wan_port: + properties: + connection_point: + network_role: + get_input: port_vcpe_private_wan_port_network_role + nfc_naming_code: vcpe + abstract_vcpe.cpu_vcpe: + properties: + unit: ns + description: CPU time used + type: Cumulative + category: compute + abstract_vcpe.disk.latency_vcpe: + properties: + unit: ms + description: Average disk latency + type: Gauge + category: disk + abstract_vcpe.disk.device.read.bytes_vcpe: + properties: + unit: B + description: Volume of reads + type: Cumulative + category: disk + abstract_vcpe.disk.write.bytes_vcpe: + properties: + unit: B + description: Volume of writes + type: Cumulative + category: compute + abstract_vcpe.disk.device.read.requests.rate_vcpe: + properties: + unit: request/s + description: Average rate of read requests + type: Gauge + category: disk + abstract_vcpe.network.outgoing.bytes_vcpe_vcpe_private_wan_port: + properties: + unit: B + description: Number of outgoing bytes + type: Cumulative + category: network + abstract_vcpe.disk.root.size_vcpe: + properties: + unit: GB + description: Size of root disk + type: Gauge + category: compute + abstract_vcpe.network.incoming.bytes_vcpe_vcpe_private_lan_port: + properties: + unit: B + description: Number of incoming bytes + type: Cumulative + category: network + abstract_vcpe.disk.iops_vcpe: + properties: + unit: count/s + description: Average disk iops + type: Gauge + category: disk + abstract_vcpe.endpoint_vcpe: + properties: + secure: true + abstract_vcpe.network.outpoing.packets_vcpe_vcpe_private_lan_port: + properties: + unit: packet + description: Number of outgoing packets + type: Cumulative + category: network + abstract_vcpe.disk.device.write.requests_vcpe: + properties: + unit: request + description: Number of write requests + type: Cumulative + category: disk + abstract_vcpe.disk.write.bytes.rate_vcpe: + properties: + unit: B/s + description: Average rate of writes + type: Gauge + category: compute + abstract_vcpe.network.outgoing.packets.rate_vcpe_vcpe_private_wan_port: + properties: + unit: packet/s + description: Average rate of outgoing packets + type: Gauge + category: network + abstract_vcpe.disk.capacity_vcpe: + properties: + unit: B + description: The amount of disk that the instance can see + type: Gauge + category: disk + abstract_vcpe.cpu_util_vcpe: + properties: + unit: '%' + description: Average CPU utilization + type: Gauge + category: compute + abstract_vcpe.disk.write.requests_vcpe: + properties: + unit: request + description: Number of write requests + type: Cumulative + category: compute + abstract_vcpe.disk.read.bytes_vcpe: + properties: + unit: B + description: Volume of reads + type: Cumulative + category: compute + abstract_vcpe.disk.device.write.bytes_vcpe: + properties: + unit: B + description: Volume of writes + type: Cumulative + category: disk + abstract_vcpe.disk.device.write.bytes.rate_vcpe: + properties: + unit: B/s + description: Average rate of writes + type: Gauge + category: disk + abstract_vcpe.vcpus_vcpe: + properties: + unit: vcpu + description: Number of virtual CPUs allocated to the instance + type: Gauge + category: compute + abstract_vcpe.disk.allocation_vcpe: + properties: + unit: B + description: The amount of disk occupied by the instance on the host machine + type: Gauge + category: disk + abstract_vcpe.network.incoming.packets_vcpe_vcpe_private_wan_port: + properties: + unit: packet + description: Number of incoming packets + type: Cumulative + category: network + abstract_vcpe.network.incoming.bytes.rate_vcpe_vcpe_private_wan_port: + properties: + unit: B/s + description: Average rate of incoming bytes + type: Gauge + category: network + abstract_vcpe.memory_vcpe: + properties: + unit: MB + description: Volume of RAM allocated to the instance + type: Gauge + category: compute + abstract_vcpe.network.incoming.packets_vcpe_vcpe_private_lan_port: + properties: + unit: packet + description: Number of incoming packets + type: Cumulative + category: network + abstract_vcpe.network.incoming.packets.rate_vcpe_vcpe_private_wan_port: + properties: + unit: packet/s + description: Average rate of incoming packets + type: Gauge + category: network + abstract_vcpe.disk.device.read.bytes.rate_vcpe: + properties: + unit: B/s + description: Average rate of reads + type: Gauge + category: disk + abstract_vcpe.memory.usage_vcpe: + properties: + unit: MB + description: Volume of RAM used by the instance from the amount of its allocated memory + type: Gauge + category: compute + abstract_vcpe.disk.device.iops_vcpe: + properties: + unit: count/s + description: Average disk iops per device + type: Gauge + category: disk + abstract_vcpe.disk.device.allocation_vcpe: + properties: + unit: B + description: The amount of disk per device occupied by the instance on the host machine + type: Gauge + category: disk + abstract_vcpe.disk.usage_vcpe: + properties: + unit: B + description: The physical size in bytes of the image container on the host + type: Gauge + category: disk + abstract_vcpe.disk.device.latency_vcpe: + properties: + unit: ms + description: Average disk latency per device + type: Gauge + category: disk + abstract_vcpe.network.outpoing.packets_vcpe_vcpe_private_wan_port: + properties: + unit: packet + description: Number of outgoing packets + type: Cumulative + category: network + abstract_vcpe.disk.write.requests.rate_vcpe: + properties: + unit: request/s + description: Average rate of write requests + type: Gauge + category: compute + abstract_vcpe.instance_vcpe: + properties: + unit: instance + description: Existence of instance + type: Gauge + category: compute + abstract_vcpe.disk.device.usage_vcpe: + properties: + unit: B + description: The physical size in bytes of the image container on the host per device + type: Gauge + category: disk + abstract_vcpe.network.incoming.bytes_vcpe_vcpe_private_wan_port: + properties: + unit: B + description: Number of incoming bytes + type: Cumulative + category: network + abstract_vcpe.disk.ephemeral.size_vcpe: + properties: + unit: GB + description: Size of ephemeral disk + type: Gauge + category: compute + abstract_vcpe.memory.resident_vcpe: + properties: + unit: MB + description: Volume of RAM used by the instance on the physical machine + type: Gauge + category: compute + abstract_vcpe.network.outgoing.packets.rate_vcpe_vcpe_private_lan_port: + properties: + unit: packet/s + description: Average rate of outgoing packets + type: Gauge + category: network + Generic NeutronNet 0: + type: org.openecomp.resource.vl.GenericNeutronNet + metadata: + invariantUUID: f3ed1133-c1bb-4735-82d4-8e041265fad6 + UUID: 24ec2ed8-a072-4f86-9a58-3a4fe220862e + customizationUUID: c8a1a81d-d836-4f33-9d0e-91e9417f812a + version: '1.0' + name: Generic NeutronNet + description: Generic NeutronNet + type: VL + category: Generic + subcategory: Network Elements + resourceVendor: ONAP (Tosca) + resourceVendorRelease: 1.0.0.wd03 + resourceVendorModelNumber: '' + properties: + network_assignments: + is_external_network: false + is_trunked: false + ipv4_subnet_default_assignment: + min_subnets_count: 1 + ecomp_generated_network_assignment: false + ipv6_subnet_default_assignment: + min_subnets_count: 1 + exVL_naming: + ecomp_generated_naming: true + network_flows: + is_network_policy: false + is_bound_to_vpn: false + network_ecomp_naming: + ecomp_generated_naming: true + network_type: NEUTRON + network_technology: NEUTRON + network_homing: + ecomp_selected_instance_node_target: false + vGW 0: + type: org.openecomp.resource.vf.Vgw + metadata: + invariantUUID: 52905e03-0632-43f9-93f2-2ab7d959f633 + UUID: 4f442b9c-237d-4d2d-b549-ee1bdb9842b3 + customizationUUID: fd8595de-1081-4e39-a401-24ffebaa9ed8 + version: '1.0' + name: vGW + description: vGW + type: VF + category: Generic + subcategory: Infrastructure + resourceVendor: huawei + resourceVendorRelease: '1.0' + resourceVendorModelNumber: '' + properties: + vf_module_id: CCVPNvGW + gateway_image_name: gateway_image + private_subnet_lan_id: 265e1457-8eb7-4fe8-a580-fb547656aad1 + skip_post_instantiation_configuration: true + nf_naming: + ecomp_generated_naming: true + multi_stage_design: 'false' + availability_zone_max_count: 1 + vnf_id: vGW_huaweicloud + private_net_id: 1ecdeb3d-5d6d-45c4-a3d2-6cc53372fa8d + gateway_flavor_name: s3.large.4 + gateway_private_ip_lan: 192.168.10.200 + gateway_name: gateway-vm + requirements: + - abstract_gateway.link_gateway_gateway_private_lan_port: + capability: virtual_linkable + node: Generic NeutronNet 0 + capabilities: + abstract_gateway.network.incoming.bytes.rate_gateway_gateway_private_lan_port: + properties: + unit: B/s + description: Average rate of incoming bytes + type: Gauge + category: network + abstract_gateway.disk.device.read.bytes.rate_gateway: + properties: + unit: B/s + description: Average rate of reads + type: Gauge + category: disk + abstract_gateway.disk.capacity_gateway: + properties: + unit: B + description: The amount of disk that the instance can see + type: Gauge + category: disk + abstract_gateway.scalable_gateway: + properties: + max_instances: 1 + min_instances: 1 + abstract_gateway.disk.read.bytes_gateway: + properties: + unit: B + description: Volume of reads + type: Cumulative + category: compute + abstract_gateway.disk.allocation_gateway: + properties: + unit: B + description: The amount of disk occupied by the instance on the host machine + type: Gauge + category: disk + abstract_gateway.disk.device.write.requests_gateway: + properties: + unit: request + description: Number of write requests + type: Cumulative + category: disk + abstract_gateway.disk.device.read.bytes_gateway: + properties: + unit: B + description: Volume of reads + type: Cumulative + category: disk + abstract_gateway.cpu.delta_gateway: + properties: + unit: ns + description: CPU time used since previous datapoint + type: Delta + category: compute + abstract_gateway.network.outgoing.packets.rate_gateway_gateway_private_lan_port: + properties: + unit: packet/s + description: Average rate of outgoing packets + type: Gauge + category: network + abstract_gateway.cpu_gateway: + properties: + unit: ns + description: CPU time used + type: Cumulative + category: compute + abstract_gateway.disk.device.allocation_gateway: + properties: + unit: B + description: The amount of disk per device occupied by the instance on the host machine + type: Gauge + category: disk + abstract_gateway.disk.latency_gateway: + properties: + unit: ms + description: Average disk latency + type: Gauge + category: disk + abstract_gateway.disk.device.read.requests_gateway: + properties: + unit: request + description: Number of read requests + type: Cumulative + category: disk + abstract_gateway.disk.device.read.requests.rate_gateway: + properties: + unit: request/s + description: Average rate of read requests + type: Gauge + category: disk + abstract_gateway.disk.write.requests.rate_gateway: + properties: + unit: request/s + description: Average rate of write requests + type: Gauge + category: compute + abstract_gateway.disk.device.write.bytes.rate_gateway: + properties: + unit: B/s + description: Average rate of writes + type: Gauge + category: disk + abstract_gateway.cpu_util_gateway: + properties: + unit: '%' + description: Average CPU utilization + type: Gauge + category: compute + abstract_gateway.instance_gateway: + properties: + unit: instance + description: Existence of instance + type: Gauge + category: compute + abstract_gateway.network.outpoing.packets_gateway_gateway_private_lan_port: + properties: + unit: packet + description: Number of outgoing packets + type: Cumulative + category: network + abstract_gateway.disk.root.size_gateway: + properties: + unit: GB + description: Size of root disk + type: Gauge + category: compute + abstract_gateway.memory.usage_gateway: + properties: + unit: MB + description: Volume of RAM used by the instance from the amount of its allocated memory + type: Gauge + category: compute + abstract_gateway.network.outgoing.bytes_gateway_gateway_private_lan_port: + properties: + unit: B + description: Number of outgoing bytes + type: Cumulative + category: network + abstract_gateway.network.outgoing.bytes.rate_gateway_gateway_private_lan_port: + properties: + unit: B/s + description: Average rate of outgoing bytes + type: Gauge + category: network + abstract_gateway.disk.device.capacity_gateway: + properties: + unit: B + description: The amount of disk per device that the instance can see + type: Gauge + category: disk + abstract_gateway.disk.iops_gateway: + properties: + unit: count/s + description: Average disk iops + type: Gauge + category: disk + abstract_gateway.disk.write.requests_gateway: + properties: + unit: request + description: Number of write requests + type: Cumulative + category: compute + abstract_gateway.disk.device.write.bytes_gateway: + properties: + unit: B + description: Volume of writes + type: Cumulative + category: disk + abstract_gateway.disk.ephemeral.size_gateway: + properties: + unit: GB + description: Size of ephemeral disk + type: Gauge + category: compute + abstract_gateway.disk.device.write.requests.rate_gateway: + properties: + unit: request/s + description: Average rate of write requests + type: Gauge + category: disk + abstract_gateway.network.incoming.packets.rate_gateway_gateway_private_lan_port: + properties: + unit: packet/s + description: Average rate of incoming packets + type: Gauge + category: network + abstract_gateway.disk.device.iops_gateway: + properties: + unit: count/s + description: Average disk iops per device + type: Gauge + category: disk + abstract_gateway.endpoint_gateway: + properties: + secure: true + abstract_gateway.disk.device.latency_gateway: + properties: + unit: ms + description: Average disk latency per device + type: Gauge + category: disk + abstract_gateway.vcpus_gateway: + properties: + unit: vcpu + description: Number of virtual CPUs allocated to the instance + type: Gauge + category: compute + abstract_gateway.memory_gateway: + properties: + unit: MB + description: Volume of RAM allocated to the instance + type: Gauge + category: compute + abstract_gateway.network.incoming.bytes_gateway_gateway_private_lan_port: + properties: + unit: B + description: Number of incoming bytes + type: Cumulative + category: network + abstract_gateway.disk.read.bytes.rate_gateway: + properties: + unit: B/s + description: Average rate of reads + type: Gauge + category: compute + abstract_gateway.disk.read.requests_gateway: + properties: + unit: request + description: Number of read requests + type: Cumulative + category: compute + abstract_gateway.port_mirroring_gateway_gateway_private_lan_port: + properties: + connection_point: + network_role: + get_input: port_gateway_private_lan_port_network_role + nfc_naming_code: gateway + abstract_gateway.disk.device.usage_gateway: + properties: + unit: B + description: The physical size in bytes of the image container on the host per device + type: Gauge + category: disk + abstract_gateway.disk.write.bytes.rate_gateway: + properties: + unit: B/s + description: Average rate of writes + type: Gauge + category: compute + abstract_gateway.network.incoming.packets_gateway_gateway_private_lan_port: + properties: + unit: packet + description: Number of incoming packets + type: Cumulative + category: network + abstract_gateway.memory.resident_gateway: + properties: + unit: MB + description: Volume of RAM used by the instance on the physical machine + type: Gauge + category: compute + abstract_gateway.disk.usage_gateway: + properties: + unit: B + description: The physical size in bytes of the image container on the host + type: Gauge + category: disk + abstract_gateway.disk.write.bytes_gateway: + properties: + unit: B + description: Volume of writes + type: Cumulative + category: compute + groups: + vcpe0..Vcpe..ar1000v..module-0: + type: org.openecomp.groups.VfModule + metadata: + vfModuleModelName: Vcpe..ar1000v..module-0 + vfModuleModelInvariantUUID: d7719964-c045-4ed3-84d6-20a01db7612f + vfModuleModelUUID: c84ade8a-6e4b-49c7-86e8-0e4fc009f4cd + vfModuleModelVersion: '1' + vfModuleModelCustomizationUUID: 8caeefbd-ab71-40c9-9387-8729d7d9c2de + properties: + min_vf_module_instances: 1 + vf_module_label: ar1000v + max_vf_module_instances: 1 + vf_module_type: Base + isBase: true + initial_count: 1 + volume_group: false + vgw0..Vgw..gateway..module-0: + type: org.openecomp.groups.VfModule + metadata: + vfModuleModelName: Vgw..gateway..module-0 + vfModuleModelInvariantUUID: 8c8c936c-e71c-4bc4-94f7-c5680c9dbc00 + vfModuleModelUUID: ddda7e87-8113-463f-aa27-a60112a4e438 + vfModuleModelVersion: '1' + vfModuleModelCustomizationUUID: ea551d60-f9c9-48f2-9757-b01eb2d26d13 + properties: + min_vf_module_instances: 1 + vf_module_label: gateway + max_vf_module_instances: 1 + vf_module_type: Base + isBase: true + initial_count: 1 + volume_group: false + substitution_mappings: + node_type: org.openecomp.service.Publicns + capabilities: + vgw0.abstract_gateway.disk.allocation_gateway: + - vGW 0 + - abstract_gateway.disk.allocation_gateway + vgw0.abstract_gateway.memory.usage_gateway: + - vGW 0 + - abstract_gateway.memory.usage_gateway + vcpe0.abstract_vcpe.network.outgoing.bytes.rate_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.network.outgoing.bytes.rate_vcpe_vcpe_private_wan_port + vgw0.abstract_gateway.disk.device.write.bytes.rate_gateway: + - vGW 0 + - abstract_gateway.disk.device.write.bytes.rate_gateway + vgw0.abstract_gateway.disk.device.latency_gateway: + - vGW 0 + - abstract_gateway.disk.device.latency_gateway + vgw0.abstract_gateway.network.incoming.bytes.rate_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.network.incoming.bytes.rate_gateway_gateway_private_lan_port + vgw0.abstract_gateway.scalable_gateway: + - vGW 0 + - abstract_gateway.scalable_gateway + vcpe0.abstract_vcpe.host_vcpe: + - vCPE 0 + - abstract_vcpe.host_vcpe + vcpe0.abstract_vcpe.disk.latency_vcpe: + - vCPE 0 + - abstract_vcpe.disk.latency_vcpe + vcpe0.abstract_vcpe.scalable_vcpe: + - vCPE 0 + - abstract_vcpe.scalable_vcpe + vcpe0.abstract_vcpe.disk.device.write.bytes.rate_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.write.bytes.rate_vcpe + vgw0.abstract_gateway.disk.write.requests.rate_gateway: + - vGW 0 + - abstract_gateway.disk.write.requests.rate_gateway + vcpe0.abstract_vcpe.feature_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.feature_vcpe_vcpe_private_wan_port + vcpe0.abstract_vcpe.network.incoming.bytes.rate_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.network.incoming.bytes.rate_vcpe_vcpe_private_lan_port + vcpe0.abstract_vcpe.disk.iops_vcpe: + - vCPE 0 + - abstract_vcpe.disk.iops_vcpe + vcpe0.abstract_vcpe.network.outgoing.packets.rate_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.network.outgoing.packets.rate_vcpe_vcpe_private_wan_port + vcpe0.abstract_vcpe.feature_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.feature_vcpe_vcpe_private_lan_port + vgw0.abstract_gateway.host_gateway: + - vGW 0 + - abstract_gateway.host_gateway + vgw0.abstract_gateway.disk.device.write.requests.rate_gateway: + - vGW 0 + - abstract_gateway.disk.device.write.requests.rate_gateway + vcpe0.abstract_vcpe.port_mirroring_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.port_mirroring_vcpe_vcpe_private_lan_port + vcpe0.abstract_vcpe.network.incoming.bytes_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.network.incoming.bytes_vcpe_vcpe_private_lan_port + vcpe0.abstract_vcpe.disk.device.capacity_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.capacity_vcpe + vcpe0.abstract_vcpe.network.outgoing.bytes_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.network.outgoing.bytes_vcpe_vcpe_private_wan_port + vcpe0.abstract_vcpe.os_vcpe: + - vCPE 0 + - abstract_vcpe.os_vcpe + vgw0.abstract_gateway.disk.usage_gateway: + - vGW 0 + - abstract_gateway.disk.usage_gateway + vcpe0.abstract_vcpe.binding_vcpe: + - vCPE 0 + - abstract_vcpe.binding_vcpe + vgw0.abstract_gateway.network.outgoing.bytes_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.network.outgoing.bytes_gateway_gateway_private_lan_port + vcpe0.abstract_vcpe.binding_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.binding_vcpe_vcpe_private_wan_port + vcpe0.abstract_vcpe.memory.resident_vcpe: + - vCPE 0 + - abstract_vcpe.memory.resident_vcpe + vgw0.abstract_gateway.disk.write.bytes_gateway: + - vGW 0 + - abstract_gateway.disk.write.bytes_gateway + vgw0.abstract_gateway.disk.read.bytes.rate_gateway: + - vGW 0 + - abstract_gateway.disk.read.bytes.rate_gateway + vcpe0.abstract_vcpe.network.incoming.packets.rate_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.network.incoming.packets.rate_vcpe_vcpe_private_lan_port + vgw0.abstract_gateway.disk.root.size_gateway: + - vGW 0 + - abstract_gateway.disk.root.size_gateway + vcpe0.abstract_vcpe.disk.write.requests_vcpe: + - vCPE 0 + - abstract_vcpe.disk.write.requests_vcpe + vcpe0.abstract_vcpe.disk.device.write.bytes_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.write.bytes_vcpe + vcpe0.abstract_vcpe.feature_vcpe: + - vCPE 0 + - abstract_vcpe.feature_vcpe + vcpe0.abstract_vcpe.disk.device.latency_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.latency_vcpe + vgw0.abstract_gateway.cpu_util_gateway: + - vGW 0 + - abstract_gateway.cpu_util_gateway + vgw0.abstract_gateway.network.incoming.packets_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.network.incoming.packets_gateway_gateway_private_lan_port + vgw0.abstract_gateway.disk.device.read.requests.rate_gateway: + - vGW 0 + - abstract_gateway.disk.device.read.requests.rate_gateway + vgw0.abstract_gateway.network.incoming.packets.rate_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.network.incoming.packets.rate_gateway_gateway_private_lan_port + vcpe0.abstract_vcpe.port_mirroring_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.port_mirroring_vcpe_vcpe_private_wan_port + vcpe0.abstract_vcpe.disk.write.bytes_vcpe: + - vCPE 0 + - abstract_vcpe.disk.write.bytes_vcpe + vgw0.abstract_gateway.disk.capacity_gateway: + - vGW 0 + - abstract_gateway.disk.capacity_gateway + vgw0.abstract_gateway.memory_gateway: + - vGW 0 + - abstract_gateway.memory_gateway + vcpe0.abstract_vcpe.cpu_util_vcpe: + - vCPE 0 + - abstract_vcpe.cpu_util_vcpe + vgw0.abstract_gateway.disk.device.write.requests_gateway: + - vGW 0 + - abstract_gateway.disk.device.write.requests_gateway + vgw0.abstract_gateway.vcpus_gateway: + - vGW 0 + - abstract_gateway.vcpus_gateway + vcpe0.abstract_vcpe.disk.ephemeral.size_vcpe: + - vCPE 0 + - abstract_vcpe.disk.ephemeral.size_vcpe + vgw0.abstract_gateway.disk.device.read.bytes_gateway: + - vGW 0 + - abstract_gateway.disk.device.read.bytes_gateway + vgw0.abstract_gateway.disk.device.allocation_gateway: + - vGW 0 + - abstract_gateway.disk.device.allocation_gateway + vgw0.abstract_gateway.disk.device.capacity_gateway: + - vGW 0 + - abstract_gateway.disk.device.capacity_gateway + vcpe0.abstract_vcpe.disk.write.requests.rate_vcpe: + - vCPE 0 + - abstract_vcpe.disk.write.requests.rate_vcpe + vcpe0.abstract_vcpe.disk.usage_vcpe: + - vCPE 0 + - abstract_vcpe.disk.usage_vcpe + vgw0.abstract_gateway.disk.device.iops_gateway: + - vGW 0 + - abstract_gateway.disk.device.iops_gateway + vcpe0.abstract_vcpe.network.outgoing.packets.rate_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.network.outgoing.packets.rate_vcpe_vcpe_private_lan_port + vgw0.abstract_gateway.endpoint_gateway: + - vGW 0 + - abstract_gateway.endpoint_gateway + vcpe0.abstract_vcpe.disk.device.read.bytes.rate_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.read.bytes.rate_vcpe + vcpe0.abstract_vcpe.disk.read.requests_vcpe: + - vCPE 0 + - abstract_vcpe.disk.read.requests_vcpe + vcpe0.abstract_vcpe.disk.read.bytes.rate_vcpe: + - vCPE 0 + - abstract_vcpe.disk.read.bytes.rate_vcpe + vcpe0.abstract_vcpe.disk.device.read.bytes_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.read.bytes_vcpe + vgw0.abstract_gateway.binding_gateway: + - vGW 0 + - abstract_gateway.binding_gateway + vcpe0.abstract_vcpe.network.incoming.packets.rate_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.network.incoming.packets.rate_vcpe_vcpe_private_wan_port + vcpe0.abstract_vcpe.network.outgoing.bytes_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.network.outgoing.bytes_vcpe_vcpe_private_lan_port + vcpe0.abstract_vcpe.cpu.delta_vcpe: + - vCPE 0 + - abstract_vcpe.cpu.delta_vcpe + vcpe0.abstract_vcpe.disk.device.write.requests.rate_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.write.requests.rate_vcpe + vgw0.abstract_gateway.instance_gateway: + - vGW 0 + - abstract_gateway.instance_gateway + vgw0.abstract_gateway.memory.resident_gateway: + - vGW 0 + - abstract_gateway.memory.resident_gateway + vcpe0.abstract_vcpe.network.incoming.packets_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.network.incoming.packets_vcpe_vcpe_private_wan_port + vgw0.abstract_gateway.disk.read.bytes_gateway: + - vGW 0 + - abstract_gateway.disk.read.bytes_gateway + vcpe0.abstract_vcpe.disk.device.iops_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.iops_vcpe + vgw0.abstract_gateway.binding_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.binding_gateway_gateway_private_lan_port + vgw0.abstract_gateway.disk.ephemeral.size_gateway: + - vGW 0 + - abstract_gateway.disk.ephemeral.size_gateway + vgw0.abstract_gateway.feature_gateway: + - vGW 0 + - abstract_gateway.feature_gateway + vcpe0.abstract_vcpe.forwarder_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.forwarder_vcpe_vcpe_private_wan_port + vcpe0.abstract_vcpe.disk.device.allocation_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.allocation_vcpe + vgw0.abstract_gateway.disk.read.requests_gateway: + - vGW 0 + - abstract_gateway.disk.read.requests_gateway + vcpe0.abstract_vcpe.disk.device.write.requests_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.write.requests_vcpe + vgw0.abstract_gateway.disk.device.usage_gateway: + - vGW 0 + - abstract_gateway.disk.device.usage_gateway + vgw0.abstract_gateway.cpu.delta_gateway: + - vGW 0 + - abstract_gateway.cpu.delta_gateway + vgw0.abstract_gateway.network.outgoing.packets.rate_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.network.outgoing.packets.rate_gateway_gateway_private_lan_port + vgw0.abstract_gateway.port_mirroring_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.port_mirroring_gateway_gateway_private_lan_port + vcpe0.abstract_vcpe.forwarder_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.forwarder_vcpe_vcpe_private_lan_port + vcpe0.abstract_vcpe.network.outpoing.packets_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.network.outpoing.packets_vcpe_vcpe_private_lan_port + vcpe0.abstract_vcpe.network.incoming.packets_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.network.incoming.packets_vcpe_vcpe_private_lan_port + vgw0.abstract_gateway.disk.latency_gateway: + - vGW 0 + - abstract_gateway.disk.latency_gateway + vcpe0.abstract_vcpe.disk.read.bytes_vcpe: + - vCPE 0 + - abstract_vcpe.disk.read.bytes_vcpe + vcpe0.abstract_vcpe.attachment_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.attachment_vcpe_vcpe_private_wan_port + vgw0.abstract_gateway.cpu_gateway: + - vGW 0 + - abstract_gateway.cpu_gateway + vcpe0.abstract_vcpe.instance_vcpe: + - vCPE 0 + - abstract_vcpe.instance_vcpe + vcpe0.abstract_vcpe.memory_vcpe: + - vCPE 0 + - abstract_vcpe.memory_vcpe + vgw0.abstract_gateway.feature_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.feature_gateway_gateway_private_lan_port + vgw0.abstract_gateway.disk.device.write.bytes_gateway: + - vGW 0 + - abstract_gateway.disk.device.write.bytes_gateway + vcpe0.abstract_vcpe.network.outpoing.packets_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.network.outpoing.packets_vcpe_vcpe_private_wan_port + vgw0.abstract_gateway.disk.device.read.requests_gateway: + - vGW 0 + - abstract_gateway.disk.device.read.requests_gateway + vgw0.abstract_gateway.disk.write.requests_gateway: + - vGW 0 + - abstract_gateway.disk.write.requests_gateway + vgw0.abstract_gateway.os_gateway: + - vGW 0 + - abstract_gateway.os_gateway + vgw0.abstract_gateway.network.outgoing.bytes.rate_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.network.outgoing.bytes.rate_gateway_gateway_private_lan_port + vgw0.abstract_gateway.network.outpoing.packets_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.network.outpoing.packets_gateway_gateway_private_lan_port + vcpe0.abstract_vcpe.disk.write.bytes.rate_vcpe: + - vCPE 0 + - abstract_vcpe.disk.write.bytes.rate_vcpe + vgw0.abstract_gateway.disk.write.bytes.rate_gateway: + - vGW 0 + - abstract_gateway.disk.write.bytes.rate_gateway + vcpe0.abstract_vcpe.network.incoming.bytes.rate_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.network.incoming.bytes.rate_vcpe_vcpe_private_wan_port + vcpe0.abstract_vcpe.cpu_vcpe: + - vCPE 0 + - abstract_vcpe.cpu_vcpe + vcpe0.abstract_vcpe.disk.allocation_vcpe: + - vCPE 0 + - abstract_vcpe.disk.allocation_vcpe + vcpe0.abstract_vcpe.disk.device.read.requests.rate_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.read.requests.rate_vcpe + vgw0.abstract_gateway.network.incoming.bytes_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.network.incoming.bytes_gateway_gateway_private_lan_port + vcpe0.abstract_vcpe.disk.device.read.requests_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.read.requests_vcpe + vgw0.abstract_gateway.disk.device.read.bytes.rate_gateway: + - vGW 0 + - abstract_gateway.disk.device.read.bytes.rate_gateway + vcpe0.abstract_vcpe.binding_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.binding_vcpe_vcpe_private_lan_port + vgw0.abstract_gateway.forwarder_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.forwarder_gateway_gateway_private_lan_port + genericneutronnet0.virtual_linkable: + - Generic NeutronNet 0 + - virtual_linkable + vcpe0.abstract_vcpe.network.incoming.bytes_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.network.incoming.bytes_vcpe_vcpe_private_wan_port + vcpe0.abstract_vcpe.disk.device.usage_vcpe: + - vCPE 0 + - abstract_vcpe.disk.device.usage_vcpe + genericneutronnet0.feature: + - Generic NeutronNet 0 + - feature + vcpe0.abstract_vcpe.network.outgoing.bytes.rate_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.network.outgoing.bytes.rate_vcpe_vcpe_private_lan_port + vcpe0.abstract_vcpe.disk.root.size_vcpe: + - vCPE 0 + - abstract_vcpe.disk.root.size_vcpe + vcpe0.abstract_vcpe.vcpus_vcpe: + - vCPE 0 + - abstract_vcpe.vcpus_vcpe + vcpe0.abstract_vcpe.endpoint_vcpe: + - vCPE 0 + - abstract_vcpe.endpoint_vcpe + vgw0.abstract_gateway.attachment_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.attachment_gateway_gateway_private_lan_port + vcpe0.abstract_vcpe.attachment_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.attachment_vcpe_vcpe_private_lan_port + vcpe0.abstract_vcpe.memory.usage_vcpe: + - vCPE 0 + - abstract_vcpe.memory.usage_vcpe + vcpe0.abstract_vcpe.disk.capacity_vcpe: + - vCPE 0 + - abstract_vcpe.disk.capacity_vcpe + vgw0.abstract_gateway.disk.iops_gateway: + - vGW 0 + - abstract_gateway.disk.iops_gateway + requirements: + vcpe0.abstract_vcpe.dependency_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.dependency_vcpe_vcpe_private_wan_port + vcpe0.abstract_vcpe.link_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.link_vcpe_vcpe_private_lan_port + vgw0.abstract_gateway.local_storage_gateway: + - vGW 0 + - abstract_gateway.local_storage_gateway + genericneutronnet0.dependency: + - Generic NeutronNet 0 + - dependency + vcpe0.abstract_vcpe.local_storage_vcpe: + - vCPE 0 + - abstract_vcpe.local_storage_vcpe + vcpe0.abstract_vcpe.dependency_vcpe_vcpe_private_lan_port: + - vCPE 0 + - abstract_vcpe.dependency_vcpe_vcpe_private_lan_port + vgw0.abstract_gateway.dependency_gateway: + - vGW 0 + - abstract_gateway.dependency_gateway + vcpe0.abstract_vcpe.dependency_vcpe: + - vCPE 0 + - abstract_vcpe.dependency_vcpe + vgw0.abstract_gateway.dependency_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.dependency_gateway_gateway_private_lan_port + vcpe0.abstract_vcpe.link_vcpe_vcpe_private_wan_port: + - vCPE 0 + - abstract_vcpe.link_vcpe_vcpe_private_wan_port + vgw0.abstract_gateway.link_gateway_gateway_private_lan_port: + - vGW 0 + - abstract_gateway.link_gateway_gateway_private_lan_port diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/ar1000v.env b/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/ar1000v.env new file mode 100644 index 0000000000..f0cc985078 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/ar1000v.env @@ -0,0 +1,10 @@ +parameters: + private_net_id: "1ecdeb3d-5d6d-45c4-a3d2-6cc53372fa8d" + private_subnet_lan_id: "265e1457-8eb7-4fe8-a580-fb547656aad1" + private_subnet_wan_id: "86048e4e-861e-47c9-ae55-a5531b747e36" + vcpe_flavor_name: "vCPE_flavor" + vcpe_image_name: "vCPE_images" + vcpe_name: "ar1000v" + vcpe_private_ip_lan: "192.168.10.250" + vf_module_id: "vCPEAR1000V" + vnf_id: "vCPE_huaweicloud" diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/ar1000v.yaml b/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/ar1000v.yaml new file mode 100644 index 0000000000..b4d0fa7a6b --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/ar1000v.yaml @@ -0,0 +1,103 @@ +########################################################################## +# +#==================LICENSE_START========================================== +# +# +# Copyright 2017 Huawei Technologies Co., Ltd. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +#==================LICENSE_END============================================ + +heat_template_version: 2013-05-23 + +description: Heat template to deploy Huawei AR1000V vCPE + +############## +# # +# PARAMETERS # +# # +############## + +parameters: + vcpe_name: + type: string + label: name + description: name to be used for compute instance + vcpe_image_name: + type: string + label: Image name or ID + description: Image to be used for compute instance + vcpe_flavor_name: + type: string + label: Flavor + description: Type of instance (flavor) to be used + private_net_id: + type: string + label: Private oam network name or ID + description: Private network that enables remote connection to VNF + private_subnet_wan_id: + type: string + label: Private wan sub-network name or ID + description: Private wan sub-network that enables remote connection to VNF + private_subnet_lan_id: + type: string + label: Private lan sub-network name or ID + description: Private lan sub-network that enables remote connection to VNF + vcpe_private_ip_lan: + type: string + label: vCPE lan private IP address + description: Private IP address that is assigned to the vCPE lan port + vnf_id: + type: string + label: VNF ID + description: The VNF ID is provided by ECOMP + vf_module_id: + type: string + label: VF module id + description: the vf module id is provided by ECOMP +############# +# # +# RESOURCES # +# # +############# + +resources: +# For the floating IP in Public cloud , floating_network_id is not needed + vCPE_oam_floating_ip: + type: OS::Neutron::FloatingIP + properties: + floating_network_id: { get_param: private_net_id} + port_id: { get_resource: vcpe_private_wan_port} + + vcpe_private_wan_port: + type: OS::Neutron::Port + properties: + network: { get_param: private_net_id } + fixed_ips: [{"subnet": { get_param: private_subnet_wan_id }}] + + vcpe_private_lan_port: + type: OS::Neutron::Port + properties: + network: { get_param: private_net_id } + fixed_ips: [{"subnet": { get_param: private_subnet_lan_id }, "ip_address": { get_param: vcpe_private_ip_lan }}] + + ar_1000v: + type: OS::Nova::Server + properties: + image: { get_param: vcpe_image_name } + flavor: { get_param: vcpe_flavor_name } + name: { get_param: vcpe_name } + networks: + - port: { get_resource: vcpe_private_wan_port } + - port: { get_resource: vcpe_private_lan_port } + metadata: { vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }} diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vcpe0_modules.json b/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vcpe0_modules.json new file mode 100644 index 0000000000..3376b1bf40 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vcpe0_modules.json @@ -0,0 +1,25 @@ +[ + { + "vfModuleModelName": "Vcpe..ar1000v..module-0", + "vfModuleModelInvariantUUID": "d7719964-c045-4ed3-84d6-20a01db7612f", + "vfModuleModelVersion": "1", + "vfModuleModelUUID": "c84ade8a-6e4b-49c7-86e8-0e4fc009f4cd", + "vfModuleModelCustomizationUUID": "8caeefbd-ab71-40c9-9387-8729d7d9c2de", + "isBase": true, + "artifacts": [ + "12dcc618-20f2-4f15-ab00-c549b96b3910", + "5821b043-ba50-49ef-b739-61b0896050f2" + ], + "properties": { + "min_vf_module_instances": "1", + "vf_module_label": "ar1000v", + "max_vf_module_instances": "1", + "vfc_list": "", + "vf_module_description": "", + "vf_module_type": "Base", + "availability_zone_count": "", + "volume_group": "false", + "initial_count": "1" + } + } +] \ No newline at end of file diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vendor-license-model.xml b/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vendor-license-model.xml new file mode 100644 index 0000000000..a10a5b2bb1 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vendor-license-model.xml @@ -0,0 +1 @@ +huaweid948f2a8354d41ef9f8e5819adccfd0d86BA71BDC4EC44DB8099115BC7202F3A1.0test1234Absolute802019-08-23T00:00:00Z2020-01-04T23:59:59Z1.0testOne_Time1238b3c7d985b1541518fe0dfc8e40d511685FF42563DAA4111BAB854264F1D2898Percentage882019-08-23T00:00:00Z2019-09-21T23:59:59Z \ No newline at end of file diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vf-license-model.xml b/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vf-license-model.xml new file mode 100644 index 0000000000..ed1575b7f5 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/vcpe0/vf-license-model.xml @@ -0,0 +1 @@ +huaweic1aad4e55922438f956ff97b91c5446dtestd948f2a8354d41ef9f8e5819adccfd0d86BA71BDC4EC44DB8099115BC7202F3A1234Absolute801.02019-08-23T00:00:00Z2020-01-04T23:59:59ZtestOne_Time8b3c7d985b1541518fe0dfc8e40d511685FF42563DAA4111BAB854264F1D2898123Percentage881.02019-08-23T00:00:00Z2019-09-21T23:59:59Ztestgroupae361d4e44ca48e68f734abb531e19af123 \ No newline at end of file diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/gateway.env b/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/gateway.env new file mode 100644 index 0000000000..a995d16b31 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/gateway.env @@ -0,0 +1,9 @@ +parameters: + gateway_flavor_name: "s3.large.4" + gateway_image_name: "gateway_image" + gateway_name: "gateway-vm" + gateway_private_ip_lan: "192.168.10.200" + private_net_id: "1ecdeb3d-5d6d-45c4-a3d2-6cc53372fa8d" + private_subnet_lan_id: "265e1457-8eb7-4fe8-a580-fb547656aad1" + vf_module_id: "CCVPNvGW" + vnf_id: "vGW_huaweicloud" diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/gateway.yaml b/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/gateway.yaml new file mode 100644 index 0000000000..2d72a1c183 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/gateway.yaml @@ -0,0 +1,109 @@ +########################################################################## +# +#==================LICENSE_START========================================== +# +# +# Copyright 2017 Huawei Technologies Co., Ltd. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +#==================LICENSE_END============================================ + +heat_template_version: 2013-05-23 + +description: Heat template to deploy CCVPN gateway instance + +############## +# # +# PARAMETERS # +# # +############## + +parameters: + gateway_name: + type: string + label: name + description: name to be used for compute instance + gateway_image_name: + type: string + label: Image name or ID + description: Image to be used for compute instance + gateway_flavor_name: + type: string + label: Flavor + description: Type of instance (flavor) to be used + private_net_id: + type: string + label: Private oam network name or ID + description: Private network that enables remote connection to VNF +# private_subnet_wan_id: +# type: string +# label: Private wan sub-network name or ID +# description: Private wan sub-network that enables remote connection to VNF + private_subnet_lan_id: + type: string + label: Private lan sub-network name or ID + description: Private lan sub-network that enables remote connection to VNF + gateway_private_ip_lan: + type: string + label: gateway lan private IP address + description: Private IP address that is assigned to the gateway lan port + vnf_id: + type: string + label: VNF ID + description: The VNF ID is provided by ECOMP + vf_module_id: + type: string + label: VF module id + description: the vf module id is provided by ECOMP +############# +# # +# RESOURCES # +# # +############# + +resources: +# For the floating IP in Public cloud , floating_network_id is not needed + gateway_oam_floating_ip: + type: OS::Neutron::FloatingIP + properties: + floating_network_id: { get_param: private_net_id} + port_id: { get_resource: gateway_private_lan_port} + + #gateway_private_wan_port: + # type: OS::Neutron::Port + # properties: + # network: { get_param: private_net_id } + # fixed_ips: [{"subnet": { get_param: private_subnet_wan_id }}] + + gateway_private_lan_port: + type: OS::Neutron::Port + properties: + network: { get_param: private_net_id } + fixed_ips: [{"subnet": { get_param: private_subnet_lan_id }, "ip_address": { get_param: gateway_private_ip_lan }}] + + gateway_instacne: + type: OS::Nova::Server + properties: + image: { get_param: gateway_image_name } + flavor: { get_param: gateway_flavor_name } + name: { get_param: gateway_name } + networks: + #- port: { get_resource: gateway_private_wan_port } + - port: { get_resource: gateway_private_lan_port } + metadata: { vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }} + user_data: | + #!/bin/bash + docker start msb_consul + docker start msb_discovery + docker start msb_internal_apigateway + #user_data_format: HEAT_CFNTOOLS/RAW \ No newline at end of file diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vendor-license-model.xml b/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vendor-license-model.xml new file mode 100644 index 0000000000..a10a5b2bb1 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vendor-license-model.xml @@ -0,0 +1 @@ +huaweid948f2a8354d41ef9f8e5819adccfd0d86BA71BDC4EC44DB8099115BC7202F3A1.0test1234Absolute802019-08-23T00:00:00Z2020-01-04T23:59:59Z1.0testOne_Time1238b3c7d985b1541518fe0dfc8e40d511685FF42563DAA4111BAB854264F1D2898Percentage882019-08-23T00:00:00Z2019-09-21T23:59:59Z \ No newline at end of file diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vf-license-model.xml b/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vf-license-model.xml new file mode 100644 index 0000000000..a4a84cc4c0 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vf-license-model.xml @@ -0,0 +1 @@ +huawei8c1c2b40525942aca038a4528ce3bb4etestd948f2a8354d41ef9f8e5819adccfd0d86BA71BDC4EC44DB8099115BC7202F3A1234Absolute801.02019-08-23T00:00:00Z2020-01-04T23:59:59ZtestOne_Time8b3c7d985b1541518fe0dfc8e40d511685FF42563DAA4111BAB854264F1D2898123Percentage881.02019-08-23T00:00:00Z2019-09-21T23:59:59Ztestgroupae361d4e44ca48e68f734abb531e19af123 \ No newline at end of file diff --git a/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vgw0_modules.json b/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vgw0_modules.json new file mode 100644 index 0000000000..1a1badec5e --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/public-ns/vgw0/vgw0_modules.json @@ -0,0 +1,25 @@ +[ + { + "vfModuleModelName": "Vgw..gateway..module-0", + "vfModuleModelInvariantUUID": "8c8c936c-e71c-4bc4-94f7-c5680c9dbc00", + "vfModuleModelVersion": "1", + "vfModuleModelUUID": "ddda7e87-8113-463f-aa27-a60112a4e438", + "vfModuleModelCustomizationUUID": "ea551d60-f9c9-48f2-9757-b01eb2d26d13", + "isBase": true, + "artifacts": [ + "60d55796-212c-4c66-8af5-63964d636ae4", + "9df0452f-826c-4287-9a2d-ca0095339866" + ], + "properties": { + "min_vf_module_instances": "1", + "vf_module_label": "gateway", + "max_vf_module_instances": "1", + "vfc_list": "", + "vf_module_description": "", + "vf_module_type": "Base", + "availability_zone_count": "", + "volume_group": "false", + "initial_count": "1" + } + } +] \ No newline at end of file -- 2.16.6