Implement vnf-topology-operation RPC 73/111573/3
authorDan Timoney <dtimoney@att.com>
Fri, 21 Aug 2020 19:51:25 +0000 (15:51 -0400)
committerDan Timoney <dtimoney@att.com>
Mon, 12 Oct 2020 18:09:14 +0000 (14:09 -0400)
Implement vnf-topology-operation RPC

Change-Id: Ief6520cc7dcba1dc4b536af3ed962d2998317978
Issue-ID: SDNC-1212
Signed-off-by: Dan Timoney <dtimoney@att.com>
ms/generic-resource-api/src/main/java/org/onap/sdnc/apps/ms/gra/controllers/OperationsApiController.java
ms/generic-resource-api/src/test/java/org/onap/sdnc/apps/ms/gra/controllers/OperationsApiControllerTest.java
ms/generic-resource-api/src/test/resources/netmodel.sql [new file with mode: 0644]
ms/generic-resource-api/src/test/resources/network-assign-rpc.json
ms/generic-resource-api/src/test/resources/service1-service.json [new file with mode: 0644]
ms/generic-resource-api/src/test/resources/vnf-assign-rpc.json [new file with mode: 0644]

index 8f97dec..ac9a8b1 100644 (file)
@@ -65,6 +65,13 @@ public class OperationsApiController implements OperationsApi {
 
     private static final String CALLED_STR = "{} called.";
     private static final String MODULE_NAME = "GENERIC-RESOURCE-API";
+    private static final String SERVICE_OBJECT_PATH_PARAM = "service-object-path";
+    private static final String NETWORK_OBJECT_PATH_PARAM = "network-object-path";
+    private static final String VNF_OBJECT_PATH_PARAM = "vnf-object-path";
+    private static final String PNF_OBJECT_PATH_PARAM = "pnf-object-path";
+    private static final String VF_MODULE_OBJECT_PATH_PARAM = "vf-module-object-path";
+    private static final String VF_MODULE_ID_PARAM = "vf-module-id";
+
 
     private final ObjectMapper objectMapper;
 
@@ -371,6 +378,13 @@ public class OperationsApiController implements OperationsApi {
                 || input.getServiceInformation().getServiceInstanceId().length() == 0;
     }
 
+    private boolean hasInvalidServiceId(GenericResourceApiVnfOperationInformation input) {
+
+        return input == null || input.getServiceInformation() == null
+                || input.getServiceInformation().getServiceInstanceId() == null
+                || input.getServiceInformation().getServiceInstanceId().length() == 0;
+    }
+
     private GenericResourceApiPreloaddataPreloadData getConfigPreloadData(String preloadId, String preloadType)
             throws JsonProcessingException {
 
@@ -417,7 +431,8 @@ public class OperationsApiController implements OperationsApi {
 
     }
 
-    private GenericResourceApiServicedataServiceData getConfigServiceData(String svcInstanceId) throws JsonProcessingException {
+    private GenericResourceApiServicedataServiceData getConfigServiceData(String svcInstanceId)
+            throws JsonProcessingException {
 
         List<ConfigServices> configServices = configServicesRepository.findBySvcInstanceId(svcInstanceId);
 
@@ -429,11 +444,9 @@ public class OperationsApiController implements OperationsApi {
         }
     }
 
-
     @Override
     public ResponseEntity<GenericResourceApiNetworkTopologyOperation> operationsGENERICRESOURCEAPInetworkTopologyOperationPost(
-            @Valid GenericResourceApiNetworkOperationInformationBodyparam input)
-            throws RestException {
+            @Valid GenericResourceApiNetworkOperationInformationBodyparam input) throws RestException {
         final String svcOperation = "network-topology-operation";
         GenericResourceApiNetworkTopologyOperation retval = new GenericResourceApiNetworkTopologyOperation();
         GenericResourceApiNetworktopologyoperationOutput resp = new GenericResourceApiNetworktopologyoperationOutput();
@@ -513,9 +526,24 @@ public class OperationsApiController implements OperationsApi {
             resp.setAckFinalIndicator(respProps.getProperty("ack-final-indicator", "Y"));
             resp.setResponseCode(respProps.getProperty("error-code", "200"));
             resp.setResponseMessage(respProps.getProperty("error-message", "SUCCESS"));
-            configService.setServiceStatusRequestStatus(GenericResourceApiRequestStatusEnumeration.SYNCCOMPLETE.toString());
+
+
+
+            configService
+                    .setServiceStatusRequestStatus(GenericResourceApiRequestStatusEnumeration.SYNCCOMPLETE.toString());
 
             if ("200".equals(resp.getResponseCode())) {
+
+                GenericResourceApiInstanceReference serviceReference = new GenericResourceApiInstanceReference();
+                serviceReference.setInstanceId(svcInstanceId);
+                serviceReference.setObjectPath(respProps.getProperty(SERVICE_OBJECT_PATH_PARAM));
+                resp.setServiceResponseInformation(serviceReference);
+    
+                GenericResourceApiInstanceReference networkReference = new GenericResourceApiInstanceReference();
+                networkReference.setInstanceId(respProps.getProperty("networkId"));
+                networkReference.setObjectPath(respProps.getProperty(NETWORK_OBJECT_PATH_PARAM));
+                resp.setNetworkResponseInformation(networkReference);
+
                 // If DG returns success, update svcData in config and operational trees
                 // and remember to save operational data.
                 String ctxJson = ctxOut.toJsonString("service-data");
@@ -535,7 +563,7 @@ public class OperationsApiController implements OperationsApi {
         }
 
         // Update status in config services entry
-        
+
         configService.setServiceStatusFinalIndicator(resp.getAckFinalIndicator());
         configService.setServiceStatusResponseCode(resp.getResponseCode());
         configService.setServiceStatusResponseMessage(resp.getResponseMessage());
@@ -550,6 +578,7 @@ public class OperationsApiController implements OperationsApi {
             operationalServicesRepository.save(operService);
         }
         retval.setOutput(resp);
+        
         return (new ResponseEntity<>(retval, HttpStatus.OK));
     }
 
@@ -620,7 +649,6 @@ public class OperationsApiController implements OperationsApi {
         configService.setServiceStatusRpcAction(input.getInput().getSdncRequestHeader().getSvcAction().toString());
         configService.setServiceStatusRpcName(svcOperation);
 
-
         // Call DG
         try {
             // Any of these can throw a nullpointer exception
@@ -631,9 +659,16 @@ public class OperationsApiController implements OperationsApi {
             resp.setAckFinalIndicator(respProps.getProperty("ack-final-indicator", "Y"));
             resp.setResponseCode(respProps.getProperty("error-code", "200"));
             resp.setResponseMessage(respProps.getProperty("error-message", "SUCCESS"));
-            configService.setServiceStatusRequestStatus(GenericResourceApiRequestStatusEnumeration.SYNCCOMPLETE.toString());
 
-            if ("200".equals(resp.getResponseCode())) {
+            configService
+                    .setServiceStatusRequestStatus(GenericResourceApiRequestStatusEnumeration.SYNCCOMPLETE.toString());
+
+            if ("200".equals(resp.getResponseCode())) {                 
+                GenericResourceApiInstanceReference serviceReference = new GenericResourceApiInstanceReference();
+                serviceReference.setInstanceId(svcInstanceId);
+                serviceReference.setObjectPath(respProps.getProperty(SERVICE_OBJECT_PATH_PARAM));
+                resp.setServiceResponseInformation(serviceReference);
+
                 // If DG returns success, update svcData in config and operational trees
                 // and remember to save operational data.
                 String ctxJson = ctxOut.toJsonString("service-data");
@@ -653,7 +688,7 @@ public class OperationsApiController implements OperationsApi {
         }
 
         // Update status in config services entry
-        
+
         configService.setServiceStatusFinalIndicator(resp.getAckFinalIndicator());
         configService.setServiceStatusResponseCode(resp.getResponseCode());
         configService.setServiceStatusResponseMessage(resp.getResponseMessage());
@@ -672,4 +707,151 @@ public class OperationsApiController implements OperationsApi {
 
     }
 
+    @Override
+    public ResponseEntity<GenericResourceApiVnfTopologyOperation> operationsGENERICRESOURCEAPIvnfTopologyOperationPost(
+            @Valid GenericResourceApiVnfOperationInformationBodyparam input)
+            throws RestException {
+                final String svcOperation = "vnf-topology-operation";
+                GenericResourceApiVnfTopologyOperation retval = new GenericResourceApiVnfTopologyOperation();
+                GenericResourceApiVnftopologyoperationOutput resp = new GenericResourceApiVnftopologyoperationOutput();
+        
+                log.info(CALLED_STR, svcOperation);
+                // Verify input contains service instance id
+                if (hasInvalidServiceId(input.getInput())) {
+                    log.debug("exiting {} because of null or empty service-instance-id", svcOperation);
+        
+                    resp.setResponseCode("404");
+                    resp.setResponseMessage("null or empty service-instance-id");
+                    resp.setAckFinalIndicator("Y");
+        
+                    retval.setOutput(resp);
+        
+                    return new ResponseEntity<>(retval, HttpStatus.OK);
+                }
+        
+                String svcInstanceId = input.getInput().getServiceInformation().getServiceInstanceId();
+                String vnfId = null;
+                
+                if ((input.getInput() != null) && (input.getInput().getVnfInformation() != null)) {
+                    vnfId = input.getInput().getVnfInformation().getVnfId();
+                }
+        
+                SvcLogicContext ctxIn = new SvcLogicContext();
+        
+                // Add input to SvcLogicContext
+                try {
+                    ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(input.getInput()));
+                } catch (JsonProcessingException e) {
+                    log.error("exiting {} due to parse error on input data", svcOperation);
+                    resp.setResponseCode("500");
+                    resp.setResponseMessage("internal error");
+                    resp.setAckFinalIndicator("Y");
+                    retval.setOutput(resp);
+                    return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR);
+                }
+        
+                // Add config tree data to SvcLogicContext
+                List<ConfigServices> configServices = configServicesRepository.findBySvcInstanceId(svcInstanceId);
+                ConfigServices configService = null;
+                if (configServices != null && !configServices.isEmpty()) {
+                    configService = configServices.get(0);
+                    ctxIn.mergeJson("service-data", configService.getSvcData());
+                } else {
+                    log.debug("exiting {} because the service-instance does not have any service data in SDN", svcOperation);
+        
+                    resp.setResponseCode("404");
+                    resp.setResponseMessage("invalid input: the service-instance does not have any service data in SDNC");
+                    resp.setAckFinalIndicator("Y");
+        
+                    retval.setOutput(resp);
+        
+                    return new ResponseEntity<>(retval, HttpStatus.OK);
+                }
+        
+                // Add operational tree data to SvcLogicContext
+                List<OperationalServices> operServices = operationalServicesRepository.findBySvcInstanceId(svcInstanceId);
+                OperationalServices operService = null;
+                boolean saveOperationalData = false;
+        
+                if (operServices != null && !operServices.isEmpty()) {
+                    operService = operServices.get(0);
+                    ctxIn.mergeJson("operational-data", operService.getSvcData());
+                } else {
+                    operService = new OperationalServices(svcInstanceId, null, null);
+                }
+        
+                // Update service status info in config entry from input
+                configService.setServiceStatusAction(input.getInput().getRequestInformation().getRequestAction().toString());
+                configService.setServiceStatusRpcAction(input.getInput().getSdncRequestHeader().getSvcAction().toString());
+                configService.setServiceStatusRpcName(svcOperation);
+
+
+        
+                // Call DG
+                try {
+                    // Any of these can throw a nullpointer exception
+                    // execute should only throw a SvcLogicException
+                    SvcLogicContext ctxOut = svc.execute(MODULE_NAME, svcOperation, null, "sync", ctxIn);
+                    Properties respProps = ctxOut.toProperties();
+        
+                    resp.setAckFinalIndicator(respProps.getProperty("ack-final-indicator", "Y"));
+                    resp.setResponseCode(respProps.getProperty("error-code", "200"));
+                    resp.setResponseMessage(respProps.getProperty("error-message", "SUCCESS"));
+
+                    configService
+                            .setServiceStatusRequestStatus(GenericResourceApiRequestStatusEnumeration.SYNCCOMPLETE.toString());
+        
+                    if ("200".equals(resp.getResponseCode())) {
+
+                        GenericResourceApiInstanceReference serviceReference = new GenericResourceApiInstanceReference();
+                        serviceReference.setInstanceId(svcInstanceId);
+                        serviceReference.setObjectPath(respProps.getProperty(SERVICE_OBJECT_PATH_PARAM));
+                        resp.setServiceResponseInformation(serviceReference);
+                        
+                        if (vnfId == null) {
+                            vnfId = respProps.getProperty("vnfId");
+                        }
+                        GenericResourceApiInstanceReference vnfReference = new GenericResourceApiInstanceReference();
+                        vnfReference.setInstanceId(vnfId);
+                        vnfReference.setObjectPath(respProps.getProperty(VNF_OBJECT_PATH_PARAM));
+                        resp.setVnfResponseInformation(vnfReference);
+                        
+                        // If DG returns success, update svcData in config and operational trees
+                        // and remember to save operational data.
+                        String ctxJson = ctxOut.toJsonString("service-data");
+                        configService.setSvcData(ctxJson);
+                        operService.setSvcData(ctxJson);
+                        saveOperationalData = true;
+                    }
+        
+                } catch (NullPointerException npe) {
+                    resp.setAckFinalIndicator("true");
+                    resp.setResponseCode("500");
+                    resp.setResponseMessage("Check that you populated module, rpc and or mode correctly.");
+                } catch (SvcLogicException e) {
+                    resp.setAckFinalIndicator("true");
+                    resp.setResponseCode("500");
+                    resp.setResponseMessage(e.getMessage());
+                }
+        
+                // Update status in config services entry
+        
+                configService.setServiceStatusFinalIndicator(resp.getAckFinalIndicator());
+                configService.setServiceStatusResponseCode(resp.getResponseCode());
+                configService.setServiceStatusResponseMessage(resp.getResponseMessage());
+                configService.setServiceStatusResponseTimestamp(Iso8601Util.now());
+        
+                // Update config tree
+                configServicesRepository.save(configService);
+        
+                // If necessary, sync status to operation service entry and save
+                if (saveOperationalData) {
+                    operService.setServiceStatus(configService.getServiceStatus());
+                    operationalServicesRepository.save(operService);
+                }
+                retval.setOutput(resp);
+                return (new ResponseEntity<>(retval, HttpStatus.OK));
+    }
+
+    
 }
index 775be1b..f0f29d3 100644 (file)
@@ -38,6 +38,7 @@ public class OperationsApiControllerTest {
     private final static String PRELOAD_VFMODULE_URL = "/operations/GENERIC-RESOURCE-API:preload-vf-module-topology-operation/";
     private final static String SERVICE_TOPOLOGY_URL = "/operations/GENERIC-RESOURCE-API:service-topology-operation/";
     private final static String NETWORK_TOPOLOGY_URL = "/operations/GENERIC-RESOURCE-API:network-topology-operation/";
+    private final static String VNF_TOPOLOGY_URL = "/operations/GENERIC-RESOURCE-API:vnf-topology-operation/";
 
 
     @Autowired
@@ -153,6 +154,30 @@ public class OperationsApiControllerTest {
 
     }
 
+    @Test
+    public void operationsGENERICRESOURCEAPIvnfTopologyOperationAssignPost() throws Exception {
+
+        // Remove any existing service data
+        configServicesRepository.deleteAll();
+        operationalServicesRepository.deleteAll();
+
+        // Load services data
+        loadServicesData("src/test/resources/service1.json");
+
+        // Add invalid content
+        String content = readFileContent("src/test/resources/preload1-rpc-vfmodule.json");
+        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(VNF_TOPOLOGY_URL).contentType(MediaType.APPLICATION_JSON).content(content))
+                .andReturn();
+        assertEquals(200, mvcResult.getResponse().getStatus());
+
+        // Add valid content
+        content = readFileContent("src/test/resources/vnf-assign-rpc.json");
+        mvcResult = mvc.perform(MockMvcRequestBuilders.post(VNF_TOPOLOGY_URL).contentType(MediaType.APPLICATION_JSON).content(content))
+                .andReturn();
+        assertEquals(200, mvcResult.getResponse().getStatus());
+
+    }
+
 
     private void loadServicesData(String path) throws IOException {
         ObjectMapper objectMapper = new ObjectMapper();
diff --git a/ms/generic-resource-api/src/test/resources/netmodel.sql b/ms/generic-resource-api/src/test/resources/netmodel.sql
new file mode 100644 (file)
index 0000000..85fa3eb
--- /dev/null
@@ -0,0 +1,79 @@
+-- MariaDB dump 10.17  Distrib 10.4.13-MariaDB, for osx10.15 (x86_64)
+--
+-- Host: localhost    Database: sdnctl
+-- ------------------------------------------------------
+-- Server version      10.5.5-MariaDB-1:10.5.5+maria~focal
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `NETWORK_MODEL`
+--
+
+DROP TABLE IF EXISTS `NETWORK_MODEL`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `NETWORK_MODEL` (
+  `customization_uuid` varchar(255) NOT NULL,
+  `service_uuid` varchar(255) NOT NULL,
+  `model_yaml` longblob DEFAULT NULL,
+  `invariant_uuid` varchar(255) DEFAULT NULL,
+  `uuid` varchar(255) DEFAULT NULL,
+  `network_type` varchar(255) DEFAULT NULL,
+  `network_role` varchar(255) DEFAULT NULL,
+  `network_technology` varchar(255) DEFAULT NULL,
+  `trunk_network_indicator` char(1) DEFAULT NULL,
+  `network_scope` varchar(255) DEFAULT NULL,
+  `naming_policy` varchar(255) DEFAULT NULL,
+  `ecomp_generated_naming` char(1) DEFAULT NULL,
+  `is_shared_network` char(1) DEFAULT NULL,
+  `is_external_network` char(1) DEFAULT NULL,
+  `is_provider_network` char(1) DEFAULT NULL,
+  `physical_network_name` varchar(255) DEFAULT NULL,
+  `is_bound_to_vpn` char(1) DEFAULT NULL,
+  `vpn_binding` varchar(255) DEFAULT NULL,
+  `use_ipv4` char(1) DEFAULT NULL,
+  `ipv4_dhcp_enabled` char(1) DEFAULT NULL,
+  `ipv4_ip_version` char(1) DEFAULT NULL,
+  `ipv4_cidr_mask` varchar(255) DEFAULT NULL,
+  `eipam_v4_address_plan` varchar(255) DEFAULT NULL,
+  `use_ipv6` char(1) DEFAULT NULL,
+  `ipv6_dhcp_enabled` char(1) DEFAULT NULL,
+  `ipv6_ip_version` char(1) DEFAULT NULL,
+  `ipv6_cidr_mask` varchar(255) DEFAULT NULL,
+  `eipam_v6_address_plan` varchar(255) DEFAULT NULL,
+  `version` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`customization_uuid`),
+  KEY `FK_NETWORK_MODEL` (`service_uuid`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `NETWORK_MODEL`
+--
+
+LOCK TABLES `NETWORK_MODEL` WRITE;
+/*!40000 ALTER TABLE `NETWORK_MODEL` DISABLE KEYS */;
+INSERT INTO `NETWORK_MODEL` VALUES ('367a8ba9-057a-4506-b106-fbae818597c6','6794ec22-95ff-4b00-8846-b1148e90df54','!!com.att.sdnctl.uebclient.SdncNetworkServiceModel\ndescription: null\nimports:\n- Service_Admin: {file: resource-ServiceAdmin-template.yml}\n- IP_MUX_Demux: {file: resource-IpMuxDemux-template.yml}\n- Tunnel_Xconn: {file: resource-TunnelXconn-template.yml}\n- vHNF for DHV Test: {file: resource-VhnfForDhvTest-template.yml}\nmetadata: {invariantUUID: 7b0fafc1-83df-4590-9460-b5a8d9f9f277, UUID: 6794ec22-95ff-4b00-8846-b1148e90df54,\n  name: SD-WAN, description: \'Standard Wan connector, redoing this for sdnc again\n    as they got already deployed.\', type: Service, category: Network L1-3, serviceEcompNaming: false,\n  serviceHoming: false}\ntopology_template:\n  node_templates:\n    Pri_IP_MUX_Demux 1:\n      type: com.att.d2.resource.vf.IpMuxDemux\n      metadata: {invariantUUID: f110ef53-a0a6-4d72-ab91-fd88a835e8c4, UUID: 79b0a3cc-c5f9-4831-aa72-b2884ed0bd55,\n        customizationUUID: 211bcbd5-de25-41bb-a758-edd32220461d, version: \'1.0\', name: IP_MUX_Demux,\n        description: 1/17, type: VF, category: Allotted Resource, subcategory: Allotted Resource}\n    Pri_Service_Admin 5:\n      type: com.att.d2.resource.vf.ServiceAdmin\n      metadata: {invariantUUID: 462edf71-1a3c-487b-bf55-497460ab7de3, UUID: b51acc89-1c55-4586-b82b-6480b16339e9,\n        customizationUUID: 22b1ed87-2ca5-42f5-9e2e-20ad5bfb097e, version: \'1.0\', name: Service_Admin,\n        description: Service Version, type: VF, category: Allotted Resource, subcategory: Allotted Resource}\n    Sec_IP_MUX_Demux 3:\n      type: com.att.d2.resource.vf.IpMuxDemux\n      metadata: {invariantUUID: f110ef53-a0a6-4d72-ab91-fd88a835e8c4, UUID: 79b0a3cc-c5f9-4831-aa72-b2884ed0bd55,\n        customizationUUID: 96e090a4-93dd-43a2-9d87-a746ee7e53cd, version: \'1.0\', name: IP_MUX_Demux,\n        description: 1/17, type: VF, category: Allotted Resource, subcategory: Allotted Resource}\n    Pri_Tunnel_Xconn 9:\n      type: com.att.d2.resource.vf.TunnelXconn\n      metadata: {invariantUUID: b7a1b78e-6b6b-4b36-9698-8c9530da14af, UUID: a2a57fb1-213d-45a4-acd8-6a0f7b4e54b1,\n        customizationUUID: 5b9bee43-f537-4fb3-9e8b-4de9f714d28a, version: \'1.0\', name: Tunnel_Xconn,\n        description: Tunnel, type: VF, category: Allotted Resource, subcategory: Allotted Resource}\n    Sec_Service_Admin 7:\n      type: com.att.d2.resource.vf.ServiceAdmin\n      metadata: {invariantUUID: 462edf71-1a3c-487b-bf55-497460ab7de3, UUID: b51acc89-1c55-4586-b82b-6480b16339e9,\n        customizationUUID: 5431e571-3df5-423a-99bc-0b020ecac97b, version: \'1.0\', name: Service_Admin,\n        description: Service Version, type: VF, category: Allotted Resource, subcategory: Allotted Resource}\n    Sec_Tunnel_Xconn 11:\n      type: com.att.d2.resource.vf.TunnelXconn\n      metadata: {invariantUUID: b7a1b78e-6b6b-4b36-9698-8c9530da14af, UUID: a2a57fb1-213d-45a4-acd8-6a0f7b4e54b1,\n        customizationUUID: 367a8ba9-057a-4506-b106-fbae818597c6, version: \'1.0\', name: Tunnel_Xconn,\n        description: Tunnel, type: VF, category: Allotted Resource, subcategory: Allotted Resource}\n    vHNF for DHV Test 17:\n      type: com.att.d2.resource.vf.VhnfForDhvTest\n      metadata: {invariantUUID: 6ea0b528-e303-4686-aa77-aa2fcbdccb96, UUID: 619c7cd3-76a9-46a8-b01b-c1f236b14d68,\n        customizationUUID: 2eb202d1-b36b-4c63-821f-4a163abaed42, version: \'1.0\', name: vHNF for DHV Test,\n        description: \'vHNF for DHV testing 1_19_17. \', type: VF, category: Network L2-3,\n        subcategory: Infrastructure}\n  groups:\n    vhnffordhvtest17..VhnfForDhvTest..base_TEST..module-0:\n      type: com.att.d2.groups.VfModule\n      metadata: {vfModuleModelName: VhnfForDhvTest..base_TEST..module-0, vfModuleModelInvariantUUID: f5696ec0-ec71-4916-bf3b-93a654efcba4,\n        vfModuleModelUUID: ebc3d18c-3e62-4c24-bcd6-961e98701a0a, vfModuleModelVersion: \'1\',\n        vfModuleModelCustomizationUUID: 63f9560a-4603-4e3b-8fb7-55f8ea06ee21}\n      properties: {min_vf_module_instances: 1, vf_module_label: base_TEST, max_vf_module_instances: 1,\n        vf_module_type: Base, vf_module_description: null, initial_count: 1, volume_group: false}\n  substitution_mappings:\n    node_type: com.att.d2.service.SdWan\n    capabilities:\n      vHNF for DHV Test 17.disk.write.bytes:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Volume of writes, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.write.bytes, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.device.write.bytes.rate:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average rate of writes, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.write.bytes.rate, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      Sec_IP_MUX_Demux 3.feature:\n        type: tosca.capabilities.Node\n        occurrences: [1, UNBOUNDED]\n      vHNF for DHV Test 17.disk.usage:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: The physical size in bytes of the image container on the host,\n            description: Description of the metric, required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.usage, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.device.latency:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average disk latency per device, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: ms, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.latency, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.memory.resident:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Volume of RAM used by the instance on the physical machine,\n            description: Description of the metric, required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: MB, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: memory.resident, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.network.outgoing.packets.rate:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average rate of outgoing packets, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: packet/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: network.outgoing.packets.rate, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: network, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.device.write.bytes:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Volume of writes, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.write.bytes, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.device.allocation:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: The amount of disk per device occupied by the instance on the host machine,\n            description: Description of the metric, required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.allocation, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      Pri_Service_Admin 5.feature:\n        type: tosca.capabilities.Node\n        occurrences: [1, UNBOUNDED]\n      vHNF for DHV Test 17.disk.allocation:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: The amount of disk occupied by the instance on the host machine,\n            description: Description of the metric, required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.allocation, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.device.write.requests:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Number of write requests, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: request, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.write.requests, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.attachment:\n        type: tosca.capabilities.Attachment\n        occurrences: [1, UNBOUNDED]\n      vHNF for DHV Test 17.disk.capacity:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: The amount of disk that the instance can see,\n            description: Description of the metric, required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.capacity, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.network.incoming.packets.rate:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average rate of incoming packets, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: packet/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: network.incoming.packets.rate, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: network, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.latency:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average disk latency, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: ms, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.latency, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.host:\n        type: tosca.capabilities.Container\n        occurrences: [1, UNBOUNDED]\n        valid_source_types: [tosca.nodes.SoftwareComponent]\n        properties:\n          num_cpus: {type: integer, required: false}\n          disk_size: {type: scalar-unit.size, required: false}\n          cpu_frequency: {type: scalar-unit.frequency, required: false}\n          mem_size: {type: scalar-unit.size, required: false}\n      vHNF for DHV Test 17.disk.device.read.bytes.rate:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average rate of reads, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.read.bytes.rate, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.ephemeral.size:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Size of ephemeral disk, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: GB, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.ephemeral.size, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.cpu_util:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average CPU utilization, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: \'%\', description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: cpu_util, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.write.requests:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Number of write requests, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: request, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.write.requests, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.read.requests:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Number of read requests, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: request, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.read.requests, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.cpu:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: CPU time used, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: ns, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: cpu, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.write.bytes.rate:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average rate of writes, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.write.bytes.rate, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.network.incoming.bytes:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Number of incoming bytes, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: network.incoming.bytes, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: network, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.scalable:\n        type: tosca.capabilities.Scalable\n        occurrences: [1, UNBOUNDED]\n        properties:\n          max_instances: {type: integer, default: 1, required: false}\n          min_instances: {type: integer, default: 1, required: false}\n          default_instances: {type: integer, required: false}\n      vHNF for DHV Test 17.cpu.delta:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: CPU time used since previous datapoint,\n            description: Description of the metric, required: false}\n          type: {type: string, default: Delta, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: ns, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: cpu.delta, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.instance:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Existence of instance, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: instance, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: instance, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.memory:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Volume of RAM allocated to the instance,\n            description: Description of the metric, required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: MB, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: memory, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.read.bytes:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Volume of reads, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.read.bytes, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.iops:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average disk iops, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: count/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.iops, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.device.usage:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: The physical size in bytes of the image container on the host per device,\n            description: Description of the metric, required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.usage, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.device.read.requests:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Number of read requests, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: request, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.read.requests, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      Sec_Service_Admin 7.feature:\n        type: tosca.capabilities.Node\n        occurrences: [1, UNBOUNDED]\n      vHNF for DHV Test 17.disk.device.capacity:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: The amount of disk per device that the instance can see,\n            description: Description of the metric, required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.capacity, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.os:\n        type: tosca.capabilities.OperatingSystem\n        occurrences: [1, UNBOUNDED]\n        properties:\n          type: {type: string, required: false}\n          distribution: {type: string, required: false}\n          version: {type: version, required: false}\n          architecture: {type: string, required: false}\n      Sec_Tunnel_Xconn 11.feature:\n        type: tosca.capabilities.Node\n        occurrences: [1, UNBOUNDED]\n      vHNF for DHV Test 17.binding:\n        type: tosca.capabilities.network.Bindable\n        occurrences: [0, UNBOUNDED]\n        valid_source_types: [com.att.d2.resource.cp.nodes.heat.network.contrailV2.VLANSubInterface]\n      vHNF for DHV Test 17.disk.read.bytes.rate:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average rate of reads, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.read.bytes.rate, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.device.read.bytes:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Volume of reads, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.read.bytes, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.feature:\n        type: tosca.capabilities.Node\n        occurrences: [1, UNBOUNDED]\n      Pri_Tunnel_Xconn 9.feature:\n        type: tosca.capabilities.Node\n        occurrences: [1, UNBOUNDED]\n      vHNF for DHV Test 17.vcpus:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Number of virtual CPUs allocated to the instance,\n            description: Description of the metric, required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: vcpu, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: vcpus, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.device.iops:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average disk iops per device, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: count/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.iops, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.network.incoming.packets:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Number of incoming packets, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: packet, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: network.incoming.packets, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: network, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.write.requests.rate:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average rate of write requests, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: request/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.write.requests.rate, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.network.incoming.bytes.rate:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average rate of incoming bytes, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: network.incoming.bytes.rate, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: network, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.network.outpoing.packets:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Number of outgoing packets, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: packet, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: network.outpoing.packets, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: network, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.memory.usage:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Volume of RAM used by the instance from the amount of its allocated memory,\n            description: Description of the metric, required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: MB, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: memory.usage, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.network.outgoing.bytes:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Number of outgoing bytes, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Cumulative, description: \'Type of the metric\n              value, for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: network.outgoing.bytes, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: network, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.endpoint:\n        type: tosca.capabilities.Endpoint.Admin\n        occurrences: [1, UNBOUNDED]\n        properties:\n          port_name: {type: string, required: false}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          secure: {type: boolean, default: true, required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.network.outgoing.bytes.rate:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average rate of outgoing bytes, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: B/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: network.outgoing.bytes.rate, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: network, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      Pri_IP_MUX_Demux 1.feature:\n        type: tosca.capabilities.Node\n        occurrences: [1, UNBOUNDED]\n      vHNF for DHV Test 17.disk.root.size:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Size of root disk, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: GB, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.root.size, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: compute, description: \'Category of the\n              metric, for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.device.write.requests.rate:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average rate of write requests, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: request/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.write.requests.rate, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n      vHNF for DHV Test 17.disk.device.read.requests.rate:\n        type: com.att.d2.capabilities.metric.Ceilometer\n        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.\n        occurrences: [1, UNBOUNDED]\n        properties:\n          initiator: {type: string, default: source, required: false}\n          network_name: {type: string, default: PRIVATE, required: false}\n          description: {type: string, default: Average rate of read requests, description: Description of the metric,\n            required: false}\n          type: {type: string, default: Gauge, description: \'Type of the metric value,\n              for an example, Cumulative, Delta, Gauge and etc.\', required: true}\n          secure: {type: boolean, default: false, required: false}\n          ports:\n            type: map\n            required: false\n            entry_schema: {type: PortSpec}\n          port_name: {type: string, required: false}\n          unit: {type: string, default: request/s, description: Unit of the metric value,\n            required: true}\n          protocol: {type: string, default: tcp, required: false}\n          port: {type: PortDef, required: false}\n          name: {type: string, default: disk.device.read.requests.rate, description: Ceilometer metric type name to monitor. (The name ceilometer is using),\n            required: true}\n          category: {type: string, default: disk, description: \'Category of the metric,\n              for an example, compute, disk, network, storage and etc.\', required: false}\n          url_path: {type: string, required: false}\n    requirements:\n      Sec_IP_MUX_Demux 3.dependency:\n        occurrences: [0, UNBOUNDED]\n        capability: tosca.capabilities.Node\n        node: tosca.nodes.Root\n        relationship: tosca.relationships.DependsOn\n      Pri_Tunnel_Xconn 9.service_dependency:\n        occurrences: [1, 1]\n        capability: com.att.d2.capabilities.AllottedResource\n        node: tosca.services.Root\n        relationship: tosca.relationships.DependsOn\n      Pri_IP_MUX_Demux 1.dependency:\n        occurrences: [0, UNBOUNDED]\n        capability: tosca.capabilities.Node\n        node: tosca.nodes.Root\n        relationship: tosca.relationships.DependsOn\n      Pri_Service_Admin 5.dependency:\n        occurrences: [0, UNBOUNDED]\n        capability: tosca.capabilities.Node\n        node: tosca.nodes.Root\n        relationship: tosca.relationships.DependsOn\n      Pri_IP_MUX_Demux 1.service_dependency:\n        occurrences: [1, 1]\n        capability: com.att.d2.capabilities.AllottedResource\n        node: tosca.services.Root\n        relationship: tosca.relationships.DependsOn\n      Pri_Service_Admin 5.service_dependency:\n        occurrences: [1, 1]\n        capability: com.att.d2.capabilities.AllottedResource\n        node: tosca.services.Root\n        relationship: tosca.relationships.DependsOn\n      Sec_IP_MUX_Demux 3.service_dependency:\n        occurrences: [1, 1]\n        capability: com.att.d2.capabilities.AllottedResource\n        node: tosca.services.Root\n        relationship: tosca.relationships.DependsOn\n      vHNF for DHV Test 17.dependency:\n        occurrences: [0, UNBOUNDED]\n        capability: tosca.capabilities.Node\n        node: tosca.nodes.Root\n        relationship: tosca.relationships.DependsOn\n      vHNF for DHV Test 17.local_storage:\n        occurrences: [0, UNBOUNDED]\n        capability: tosca.capabilities.Attachment\n        node: tosca.nodes.BlockStorage\n        relationship: tosca.relationships.AttachesTo\n      vHNF for DHV Test 17.link:\n        occurrences: [1, 1]\n        capability: tosca.capabilities.network.Linkable\n        relationship: tosca.relationships.network.LinksTo\n      Pri_Tunnel_Xconn 9.dependency:\n        occurrences: [0, UNBOUNDED]\n        capability: tosca.capabilities.Node\n        node: tosca.nodes.Root\n        relationship: tosca.relationships.DependsOn\n      Sec_Tunnel_Xconn 11.service_dependency:\n        occurrences: [1, 1]\n        capability: com.att.d2.capabilities.AllottedResource\n        node: tosca.services.Root\n        relationship: tosca.relationships.DependsOn\n      Sec_Service_Admin 7.dependency:\n        occurrences: [0, UNBOUNDED]\n        capability: tosca.capabilities.Node\n        node: tosca.nodes.Root\n        relationship: tosca.relationships.DependsOn\n      Sec_Tunnel_Xconn 11.dependency:\n        occurrences: [0, UNBOUNDED]\n        capability: tosca.capabilities.Node\n        node: tosca.nodes.Root\n        relationship: tosca.relationships.DependsOn\n      Sec_Service_Admin 7.service_dependency:\n        occurrences: [1, 1]\n        capability: com.att.d2.capabilities.AllottedResource\n        node: tosca.services.Root\n        relationship: tosca.relationships.DependsOn\ntosca_definitions_version: tosca_simple_yaml_1_0\n','b7a1b78e-6b6b-4b36-9698-8c9530da14af','a2a57fb1-213d-45a4-acd8-6a0f7b4e54b1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+/*!40000 ALTER TABLE `NETWORK_MODEL` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2020-08-17  9:58:13
index d6b9782..f822180 100644 (file)
@@ -51,7 +51,6 @@
           ]
         },
         "network-instance-group-id": "netgrp123",
-        "network-name": "myNetwork",
         "tenant": "k8s_tenant_1"
       },
         "network-information": {
diff --git a/ms/generic-resource-api/src/test/resources/service1-service.json b/ms/generic-resource-api/src/test/resources/service1-service.json
new file mode 100644 (file)
index 0000000..661b315
--- /dev/null
@@ -0,0 +1,69 @@
+{
+    "service": [
+        {
+            "service-instance-id": "service1",
+            "service-data": {
+                "request-information": {
+                    "notification-url": "http://dev.null",
+                    "request-id": "req123",
+                    "order-number": "123",
+                    "request-action": "CreateServiceInstance",
+                    "order-version": "version1",
+                    "source": "curl"
+                },
+                "service-request-input": {
+                    "service-instance-name": "service-instance-1"
+                },
+                "service-information": {
+                    "service-id": "service1",
+                    "onap-model-information": {
+                        "model-invariant-uuid": "12341234",
+                        "model-name": "vBNG_0202",
+                        "model-version": "1920",
+                        "model-customization-uuid": "12341234",
+                        "model-uuid": "00e50cbd-ef0f-4b28-821e-f2b583752dd3"
+                    },
+                    "global-customer-id": "cust123",
+                    "subscription-service-type": "test",
+                    "service-instance-id": "service1",
+                    "subscriber-name": "test"
+                },
+                "service-topology": {
+                    "service-topology-identifier": {
+                        "service-instance-id": "service1",
+                        "service-instance-name": "service-instance-1",
+                        "service-type": "test",
+                        "global-customer-id": "cust123"
+                    },
+                    "onap-model-information": {
+                        "model-invariant-uuid": "12341234",
+                        "model-name": "vBNG_0202",
+                        "model-version": "1920",
+                        "model-customization-uuid": "12341234",
+                        "model-uuid": "00e50cbd-ef0f-4b28-821e-f2b583752dd3"
+                    }
+                },
+                "service-level-oper-status": {
+                    "order-status": "Created",
+                    "last-rpc-action": "assign",
+                    "last-action": "CreateServiceInstance"
+                },
+                "sdnc-request-header": {
+                    "svc-action": "assign",
+                    "svc-notification-url": "http://dev.null",
+                    "svc-request-id": "svcreq123"
+                }
+            },
+            "service-status": {
+                "final-indicator": "Y",
+                "rpc-action": "assign",
+                "rpc-name": "service-topology-operation",
+                "response-code": "200",
+                "response-timestamp": "2020-08-17T12:29:24.031Z",
+                "response-message": "",
+                "action": "CreateServiceInstance",
+                "request-status": "synccomplete"
+            }
+        }
+    ]
+}
diff --git a/ms/generic-resource-api/src/test/resources/vnf-assign-rpc.json b/ms/generic-resource-api/src/test/resources/vnf-assign-rpc.json
new file mode 100644 (file)
index 0000000..36bffe2
--- /dev/null
@@ -0,0 +1,87 @@
+{
+    "input": {
+      "request-information": {
+        "notification-url": "http://dev.null",
+        "order-number": "123",
+        "order-version": "version1",
+        "request-action": "CreateNetworkInstance",
+        "request-id": "req123",
+        "source": "curl"
+      },
+      "sdnc-request-header": {
+        "svc-action": "assign",
+        "svc-notification-url": "http://dev.null",
+        "svc-request-id": "svcreq123"
+      },
+      "service-information": {
+        "global-customer-id": "cust123",
+        "onap-model-information": {
+          "model-customization-uuid": "367a8ba9-057a-4506-b106-fbae818597c6",
+          "model-invariant-uuid": "367a8ba9-057a-4506-b106-fbae818597c6",
+          "model-name": "vBNG_0202",
+          "model-uuid": "00e50cbd-ef0f-4b28-821e-f2b583752dd3",
+          "model-version": "1920"
+        },
+        "service-id": "service1",
+        "service-instance-id": "service1",
+        "subscriber-name": "test",
+        "subscription-service-type": "test"
+      },
+      "vnf-information" : {
+        "onap-model-information": {
+          "model-customization-uuid": "367a8ba9-057a-4506-b106-fbae818597c6",
+          "model-invariant-uuid": "367a8ba9-057a-4506-b106-fbae818597c6",
+          "model-name": "vBNG_0202",
+          "model-uuid": "00e50cbd-ef0f-4b28-821e-f2b583752dd3",
+          "model-version": "1920"
+        },
+        "vnf-id" : "vnf123",
+        "vnf-name" : "myVnf",
+        "vnf-type" : "router"
+      },
+      "vnf-request-input" : {
+        "aic-clli": "complexMC",
+        "aic-cloud-region": "k8s_region_1",
+        "cloud-owner": "k8sCloudOwner",
+        "tenant" : "k8s_tenant_1",
+        "vnf-input-parameters": {
+          "param": [
+            {
+              "name": "test-param",
+              "resource-resolution-data": {
+                "capability-name": "myCapability",
+                "payload": "myPayload",
+                "resource-key": [
+                  {
+                    "name": "resource1",
+                    "value": "hello_world"
+                  }
+                ],
+                "status": "Pending"
+              },
+              "value": "HiThere"
+            }
+          ]
+        },
+        "vnf-name" : "myVnf",
+        "vnf-network-instance-group-ids": [
+          {
+            "vnf-network-instance-group-id" : "netgrp123"
+          }
+        ],
+        "vnf-networks" : {
+          "vnf-network" : [
+          {
+            "contrail-network-fqdn" : "contrail.onap",
+            "is-trunked" : "true",
+            "network-id" : "net123",
+            "network-name" : "myNetwork",
+            "network-role" : "lan",
+            "neutron-id" : "neutron1234",
+            "segmentation-id" : "seg123"
+          }
+          ]
+      }
+    }
+  }
+}