fix csar creation 08/69808/1
authorMichael Lando <michael.lando@intl.att.com>
Thu, 4 Oct 2018 10:02:56 +0000 (13:02 +0300)
committerMichael Lando <michael.lando@intl.att.com>
Thu, 4 Oct 2018 10:26:23 +0000 (13:26 +0300)
fix required not populated based on DB
fix bad packaging of the normative types in csar
fix import logic to correctly read boolean fields

Change-Id: Idca39ddb070f5f816916a90f124c5c40dae415af
Issue-ID: SDC-1447
Signed-off-by: Michael Lando <michael.lando@intl.att.com>
asdctool/sdc-cassandra-init/chef-repo/cookbooks/cassandra-actions/recipes/04-importComformance.rb
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/PropertyConvertor.java
catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ImportUtilsTest.java
catalog-be/src/test/resources/normativeTypes/importToscaInputs.yml [new file with mode: 0644]

index 6841175..188aa1d 100644 (file)
@@ -15,6 +15,6 @@ bash "import-Comformance" do
     cd /tmp/sdctool/scripts
     /bin/chmod +x sdcSchemaFileImport.sh
     echo "execute /tmp/sdctool/scripts/sdcSchemaFileImport.sh ${tosca_dir} #{cl_release} ${cl_version} ${conf_dir} onap"
-    ./sdcSchemaFileImport.sh ${tosca_dir} #{cl_release} ${cl_version} ${conf_dir}
+    ./sdcSchemaFileImport.sh ${tosca_dir} #{cl_release} ${cl_version} ${conf_dir} onap
   EOH
 end
\ No newline at end of file
index 8b69a45..924d441 100644 (file)
@@ -62,12 +62,10 @@ import static org.openecomp.sdc.be.datatypes.elements.Annotation.setAnnotationsN
 
 
 public final class ImportUtils {
-    private ImportUtils() {
 
-    }
 
-    private static CustomResolver customResolver = new CustomResolver();
-    private static Yaml strictYamlLoader =  new YamlLoader().getStrictYamlLoader();
+    private static final CustomResolver customResolver = new CustomResolver();
+    private static final Yaml strictYamlLoader =  new YamlLoader().getStrictYamlLoader();
 
     @Autowired
     protected static ComponentsUtils componentsUtils;
@@ -77,6 +75,10 @@ public final class ImportUtils {
 
     private static final Logger log = Logger.getLogger(ImportUtils.class);
 
+    private ImportUtils() {
+
+    }
+
     private static class CustomResolver extends Resolver {
         @Override
         protected void addImplicitResolvers() {
@@ -202,12 +204,7 @@ public final class ImportUtils {
     }
 
     private static void findAllToscaElementsInList(List<Object> list, String elementName, ToscaElementTypeEnum elementType, List<Object> returnedList) {
-        Iterator<Object> listItr = list.iterator();
-        while (listItr.hasNext()) {
-            Object elementValue = listItr.next();
-            handleElementNameNotFound(elementName, elementValue, elementType, returnedList);
-        }
-
+        list.forEach(elementValue -> handleElementNameNotFound(elementName, elementValue, elementType, returnedList));
     }
 
     public static Either<Object, ResultStatusEnum> findToscaElement(Map<String, Object> toscaJson, TypeUtils.ToscaTagNamesEnum elementName, ToscaElementTypeEnum elementType) {
@@ -235,6 +232,7 @@ public final class ImportUtils {
             skipKey = handleFoundElement(toscaJson, elementName, elementType, returnedList);
         }
 
+
         Iterator<Entry<String, Object>> keyValItr = toscaJson.entrySet().iterator();
         while (keyValItr.hasNext()) {
             Entry<String, Object> keyValEntry = keyValItr.next();
@@ -326,13 +324,13 @@ public final class ImportUtils {
 
         PropertyDefinition propertyDef = new PropertyDefinition();
         setField(propertyValue, TypeUtils.ToscaTagNamesEnum.TYPE, propertyDef::setType);
-        setPropertyFieldRequired(propertyValue, propertyDef);
+        setFieldBoolean(propertyValue, ToscaTagNamesEnum.REQUIRED, req -> propertyDef.setRequired(Boolean.parseBoolean(req)));
         setField(propertyValue, TypeUtils.ToscaTagNamesEnum.DESCRIPTION, propertyDef::setDescription);
 
         setJsonStringField(propertyValue, TypeUtils.ToscaTagNamesEnum.DEFAULT_VALUE, propertyDef.getType(), propertyDef::setDefaultValue);
         setJsonStringField(propertyValue, TypeUtils.ToscaTagNamesEnum.VALUE, propertyDef.getType(), propertyDef::setValue);
 
-        setField(propertyValue, TypeUtils.ToscaTagNamesEnum.IS_PASSWORD, pass -> propertyDef.setPassword(Boolean.parseBoolean(pass)));
+        setFieldBoolean(propertyValue, TypeUtils.ToscaTagNamesEnum.IS_PASSWORD, pass -> propertyDef.setPassword(Boolean.parseBoolean(pass)));
         setField(propertyValue, TypeUtils.ToscaTagNamesEnum.STATUS, propertyDef::setStatus);
         setScheme(propertyValue, propertyDef);
         setPropertyConstraints(propertyValue, propertyDef);
@@ -374,7 +372,7 @@ public final class ImportUtils {
                 for (Entry<String, PropertyDefinition> entry : value.entrySet()) {
                     String name = entry.getKey();
                     if (!PROPERTY_NAME_PATTERN_IGNORE_LENGTH.matcher(name).matches()) {
-                        log.debug("The property with invalid name {} occured upon import resource {}. ", name, annotation.getName());
+                        log.debug("The property with invalid name {} occurred upon import resource {}. ", name, annotation.getName());
                         result = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromResultStatusEnum(ResultStatusEnum.INVALID_PROPERTY_NAME, JsonPresentationFields.PROPERTY)));
                     }
                     PropertyDefinition propertyDefinition = entry.getValue();
@@ -397,17 +395,16 @@ public final class ImportUtils {
 
         InputDefinition inputDef = new InputDefinition();
         ImportUtils.setField(inputValue, TypeUtils.ToscaTagNamesEnum.TYPE, inputDef::setType);
-        ImportUtils.setField(inputValue, TypeUtils.ToscaTagNamesEnum.REQUIRED, req -> inputDef.setRequired(Boolean.parseBoolean(req)));
+        ImportUtils.setFieldBoolean(inputValue, ToscaTagNamesEnum.REQUIRED, req -> inputDef.setRequired(Boolean.parseBoolean(req)));
         ImportUtils.setField(inputValue, TypeUtils.ToscaTagNamesEnum.DESCRIPTION, inputDef::setDescription);
 
         setJsonStringField(inputValue, TypeUtils.ToscaTagNamesEnum.DEFAULT_VALUE, inputDef.getType(), inputDef::setDefaultValue);
 
-        ImportUtils.setField(inputValue, TypeUtils.ToscaTagNamesEnum.IS_PASSWORD, pass -> inputDef.setPassword(Boolean.parseBoolean(pass)));
+        ImportUtils.setFieldBoolean(inputValue, TypeUtils.ToscaTagNamesEnum.IS_PASSWORD, pass -> inputDef.setPassword(Boolean.parseBoolean(pass)));
         ImportUtils.setField(inputValue, TypeUtils.ToscaTagNamesEnum.STATUS, inputDef::setStatus);
         ImportUtils.setField(inputValue, TypeUtils.ToscaTagNamesEnum.LABEL, inputDef::setLabel);
-        ImportUtils.setField(inputValue, TypeUtils.ToscaTagNamesEnum.HIDDEN, hidden -> inputDef.setHidden(Boolean.parseBoolean(hidden)));
-        ImportUtils.setField(inputValue, TypeUtils.ToscaTagNamesEnum.HIDDEN, immutable -> inputDef.setImmutable(Boolean.parseBoolean(immutable)));
-        ImportUtils.setField(inputValue, TypeUtils.ToscaTagNamesEnum.LABEL, inputDef::setLabel);
+        ImportUtils.setFieldBoolean(inputValue, TypeUtils.ToscaTagNamesEnum.HIDDEN, hidden -> inputDef.setHidden(Boolean.parseBoolean(hidden)));
+        ImportUtils.setFieldBoolean(inputValue, TypeUtils.ToscaTagNamesEnum.IMMUTABLE, immutable -> inputDef.setImmutable(Boolean.parseBoolean(immutable)));
 
         ImportUtils.setScheme(inputValue, inputDef);
         ImportUtils.setPropertyConstraints(inputValue, inputDef);
@@ -487,13 +484,15 @@ public final class ImportUtils {
 
     }
 
-    private static void setPropertyFieldRequired(Map<String, Object> propertyValue, PropertyDefinition dataDefinition) {
-        Either<String, ResultStatusEnum> propertyFieldRequired = findFirstToscaBooleanElement(propertyValue, TypeUtils.ToscaTagNamesEnum.REQUIRED);
-        if (propertyFieldRequired.isLeft()) {
-            dataDefinition.setRequired(Boolean.parseBoolean(propertyFieldRequired.left().value()));
+    public static void setFieldBoolean(Map<String, Object> toscaJson, TypeUtils.ToscaTagNamesEnum tagName, Consumer<String> setter) {
+        Either<String, ResultStatusEnum> fieldStringValue = findFirstToscaBooleanElement(toscaJson, tagName);
+        if (fieldStringValue.isLeft()) {
+            setter.accept(fieldStringValue.left().value());
         }
+
     }
 
+
     public static Either<Map<String, PropertyDefinition>, ResultStatusEnum> getProperties(Map<String, Object> toscaJson) {
         Function<String, PropertyDefinition> elementGenByName = ImportUtils::createProperties;
         Function<Map<String, Object>, PropertyDefinition> func = ImportUtils::createModuleProperty;
index a3ee69d..e816900 100644 (file)
@@ -110,8 +110,8 @@ public class PropertyConvertor {
         prop.setDescription(property.getDescription());
         if (isCapabiltyProperty) {
             prop.setStatus(property.getStatus());
-            prop.setRequired(property.isRequired());
         }
+        prop.setRequired(property.isRequired());
         return prop;
     }
     
index f5357e7..b23b8ab 100644 (file)
 package org.openecomp.sdc.be.components.impl;
 
 import fj.data.Either;
+import mockit.Mock;
 import org.junit.Test;
+import org.mockito.Mockito;
 import org.openecomp.sdc.be.components.impl.ImportUtils.ResultStatusEnum;
 import org.openecomp.sdc.be.components.impl.ImportUtils.ToscaElementTypeEnum;
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
 import org.openecomp.sdc.be.model.HeatParameterDefinition;
+import org.openecomp.sdc.be.model.InputDefinition;
 import org.openecomp.sdc.be.model.PropertyDefinition;
+import org.openecomp.sdc.be.model.operations.impl.AnnotationTypeOperations;
 import org.openecomp.sdc.be.utils.TypeUtils;
 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
 import org.yaml.snakeyaml.Yaml;
@@ -48,6 +52,8 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 public class ImportUtilsTest {
+
+
     @Test
     public void testStringTypeFindToscaElements() throws IOException {
         Either<List<Object>, ResultStatusEnum> toscaElements = ImportUtils.findToscaElements((Map<String, Object>) loadJsonFromFile("normative-types-string-list-test.yml"), "stringTestTag", ToscaElementTypeEnum.STRING, new ArrayList<>());
@@ -295,6 +301,21 @@ public class ImportUtilsTest {
 
     }
 
+    @Test
+    public void testGetInputsFromYml() throws IOException {
+
+        Map<String, Object> toscaJson = (Map<String, Object>) loadJsonFromFile("importToscaInputs.yml");
+
+        AnnotationTypeOperations annotationTypeOperations= Mockito.mock(AnnotationTypeOperations.class);
+        Mockito.when(annotationTypeOperations.getLatestType(Mockito.anyString())).thenReturn(null);
+
+        Either<Map<String, InputDefinition>, ResultStatusEnum> actualInputs = ImportUtils.getInputs(toscaJson,annotationTypeOperations);
+        assertTrue(actualInputs.isLeft());
+        Map<String, Map<String, Object>> expectedProperties = getElements(toscaJson, TypeUtils.ToscaTagNamesEnum.INPUTS);
+        compareProperties(expectedProperties, actualInputs.left().value());
+
+    }
+
     private void compareAttributes(Map<String, Map<String, Object>> expected, Map<String, PropertyDefinition> actual) {
 
         Map<String, Object> singleExpectedAttribute;
@@ -322,11 +343,11 @@ public class ImportUtilsTest {
 
     }
 
-    private void compareProperties(Map<String, Map<String, Object>> expected, Map<String, PropertyDefinition> actual) {
+    private  void compareProperties(Map<String, Map<String, Object>> expected, Map<String, ? extends PropertyDefinition > actual) {
 
         Map<String, Object> singleExpectedProperty;
         PropertyDefinition actualProperty, expectedPropertyModel;
-        // attributes of resource
+
         for (Map.Entry<String, Map<String, Object>> expectedProperty : expected.entrySet()) {
 
             singleExpectedProperty = expectedProperty.getValue();
diff --git a/catalog-be/src/test/resources/normativeTypes/importToscaInputs.yml b/catalog-be/src/test/resources/normativeTypes/importToscaInputs.yml
new file mode 100644 (file)
index 0000000..9fac2fb
--- /dev/null
@@ -0,0 +1,887 @@
+tosca_definitions_version: tosca_simple_yaml_1_1
+metadata:
+  invariantUUID: 064cc5e7-303a-4eee-8a10-5e6a0310dcba
+  UUID: 8c2fb792-5092-4c1c-ab15-c507b4e4ee11
+  name: ciResVFOnboarded-base_vfw-aa8dcbff-nodes.vpgCvfc
+  description: Complex node type that is used as nested type in VF
+  type: CVFC
+  category: Generic
+  subcategory: Abstract
+  resourceVendor: ciLicensec891e89e
+  resourceVendorRelease: 1.0.0.wd03
+  resourceVendorModelNumber: '666'
+imports:
+- nodes:
+    file: nodes.yml
+- datatypes:
+    file: data.yml
+- capabilities:
+    file: capabilities.yml
+- relationships:
+    file: relationships.yml
+- groups:
+    file: groups.yml
+- policies:
+    file: policies.yml
+- annotations:
+    file: annotations.yml
+- resource-ciResVFOnboarded-base_vfw-aa8dcbff-nodes.vpgCvfc-interface:
+    file: resource-CiresvfonboardedBaseVfwAa8dcbffNodesVpgcvfc-template-interface.yml
+- resource-CiresvfonboardedBaseVfwAa8dcbff.compute.nodes.heat.vpg:
+    file: resource-Ciresvfonboardedbasevfwaa8dcbffComputeNodesHeatVpg-template.yml
+- resource-NeutronPort:
+    file: resource-Neutronport-template.yml
+- resource-extNeutronCP:
+    file: resource-Extneutroncp-template.yml
+topology_template:
+  inputs:
+    port_vpg_private_1_port_network:
+      type: list
+      required: false
+      entry_schema:
+        type: string
+    port_vpg_private_1_port_network_role:
+      type: string
+      required: false
+    port_vpg_private_1_port_exCP_naming:
+      default:
+        ecomp_generated_naming: true
+      type: org.openecomp.datatypes.Naming
+      required: false
+    port_vpg_private_1_port_vlan_requirements:
+      type: list
+      required: false
+      entry_schema:
+        type: org.openecomp.datatypes.network.VlanRequirements
+    port_vpg_private_0_port_network:
+      type: list
+      required: false
+      entry_schema:
+        type: string
+    nfc_naming:
+      default:
+        ecomp_generated_naming: true
+      type: org.openecomp.datatypes.Naming
+      description: vfc naming
+      required: false
+    port_vpg_private_1_port_ip_requirements:
+      type: list
+      required: false
+      entry_schema:
+        type: org.openecomp.datatypes.network.IpRequirements
+    vm_flavor_name:
+      type: string
+      required: false
+    port_vpg_private_0_port_exCP_naming:
+      default:
+        ecomp_generated_naming: true
+      type: org.openecomp.datatypes.Naming
+      required: false
+    port_vpg_private_0_port_subnetpoolid:
+      type: string
+      required: false
+    port_vpg_private_1_port_order:
+      type: integer
+      required: false
+    port_vpg_private_1_port_network_role_tag:
+      type: string
+      required: false
+    service_template_filter:
+      default:
+        index_value: 0
+        count: '1'
+        scaling_enabled: true
+        mandatory: true
+      type: org.openecomp.datatypes.heat.substitution.SubstitutionFiltering
+      description: Substitution Filter
+      required: true
+    vm_image_name:
+      type: string
+      required: false
+    compute_vpg_name:
+      type: list
+      required: false
+      entry_schema:
+        type: string
+    vm_type_tag:
+      type: string
+      description: vm type based on naming Convention
+      required: false
+    high_availablity:
+      type: string
+      description: high_availablity
+      required: false
+    compute_vpg_user_data_format:
+      type: list
+      required: false
+      entry_schema:
+        type: string
+    compute_vpg_key_name:
+      type: list
+      required: false
+      entry_schema:
+        type: string
+    port_vpg_private_1_port_subnetpoolid:
+      type: string
+      required: false
+    nfc_naming_code:
+      type: string
+      description: nfc code for instance naming
+      required: false
+    port_vpg_private_0_port_related_networks:
+      type: list
+      required: false
+      entry_schema:
+        type: org.openecomp.datatypes.network.RelatedNetworksAssignments
+    port_vpg_private_0_port_network_role_tag:
+      type: string
+      required: false
+    nfc_function:
+      type: string
+      required: false
+    compute_vpg_metadata:
+      type: list
+      required: false
+      entry_schema:
+        type: json
+    port_vpg_private_0_port_vlan_requirements:
+      type: list
+      required: false
+      entry_schema:
+        type: org.openecomp.datatypes.network.VlanRequirements
+    index_value:
+      default: 0
+      type: integer
+      description: Index value of this substitution service template runtime instance
+      required: false
+    max_instances:
+      type: integer
+      description: Maximum number of VFC Instances
+      required: false
+    port_vpg_private_0_port_fixed_ips:
+      type: list
+      required: false
+      entry_schema:
+        type: org.openecomp.datatypes.heat.neutron.port.FixedIps
+    port_vpg_private_0_port_network_role:
+      type: string
+      required: false
+    port_vpg_private_1_port_mac_requirements:
+      default:
+        mac_count_required:
+          is_required: false
+      type: org.openecomp.datatypes.network.MacRequirements
+      required: false
+    port_vpg_private_0_port_ip_requirements:
+      type: list
+      required: false
+      entry_schema:
+        type: org.openecomp.datatypes.network.IpRequirements
+    port_vpg_private_1_port_related_networks:
+      type: list
+      required: false
+      entry_schema:
+        type: org.openecomp.datatypes.network.RelatedNetworksAssignments
+    min_instances:
+      default: 0
+      type: integer
+      description: Minimum number of VFC Instances
+      required: false
+    port_vpg_private_1_port_fixed_ips:
+      type: list
+      required: false
+      entry_schema:
+        type: org.openecomp.datatypes.heat.neutron.port.FixedIps
+    port_vpg_private_0_port_mac_requirements:
+      default:
+        mac_count_required:
+          is_required: false
+      type: org.openecomp.datatypes.network.MacRequirements
+      required: false
+    port_vpg_private_0_port_order:
+      type: integer
+      required: false
+  node_templates:
+    vpg_vpg_private_0_port:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      metadata:
+        invariantUUID: b2b303b1-eab0-48a0-88f6-f335f5e01abf
+        UUID: 068e214e-6eb5-4663-843e-007e0bae9870
+        customizationUUID: 8b636bd0-db43-4938-a471-6fab142f9d55
+        version: '1.0'
+        name: NeutronPort
+        description: Represents a logical entity that associates between Compute and Network normative types.
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+        resourceVendor: ATT (Tosca)
+        resourceVendorRelease: 1.0.0.wd03
+        resourceVendorModelNumber: ''
+      properties:
+        subnetpoolid:
+          get_input: port_vpg_private_0_port_subnetpoolid
+        is_default: false
+        related_networks:
+          get_input: port_vpg_private_0_port_related_networks
+        network:
+          get_input:
+          - port_vpg_private_0_port_network
+          - index_value
+        replacement_policy: AUTO
+        ip_requirements:
+          get_input: port_vpg_private_0_port_ip_requirements
+        network_role:
+          get_input: port_vpg_private_0_port_network_role
+        fixed_ips:
+          get_input:
+          - port_vpg_private_0_port_fixed_ips
+          - index_value
+        subinterface_indicator: false
+        mac_requirements:
+          get_input: port_vpg_private_0_port_mac_requirements
+        admin_state_up: true
+        exCP_naming:
+          get_input: port_vpg_private_0_port_exCP_naming
+        vlan_requirements:
+          get_input: port_vpg_private_0_port_vlan_requirements
+        network_role_tag:
+          get_input: port_vpg_private_0_port_network_role_tag
+        order:
+          get_input: port_vpg_private_0_port_order
+      requirements:
+      - binding:
+          capability: binding
+          node: vpg
+      capabilities:
+        network.outgoing.bytes.rate_vpg_vpg_private_0_port:
+          properties:
+            unit: B/s
+            description: Average rate of outgoing bytes
+            type: Gauge
+            category: network
+        network.outgoing.bytes_vpg_vpg_private_0_port:
+          properties:
+            unit: B
+            description: Number of outgoing bytes
+            type: Cumulative
+            category: network
+        network.incoming.packets.rate_vpg_vpg_private_0_port:
+          properties:
+            unit: packet/s
+            description: Average rate of incoming packets
+            type: Gauge
+            category: network
+        network.incoming.bytes.rate_vpg_vpg_private_0_port:
+          properties:
+            unit: B/s
+            description: Average rate of incoming bytes
+            type: Gauge
+            category: network
+        network.outpoing.packets_vpg_vpg_private_0_port:
+          properties:
+            unit: packet
+            description: Number of outgoing packets
+            type: Cumulative
+            category: network
+        network.outgoing.packets.rate_vpg_vpg_private_0_port:
+          properties:
+            unit: packet/s
+            description: Average rate of outgoing packets
+            type: Gauge
+            category: network
+        network.incoming.bytes_vpg_vpg_private_0_port:
+          properties:
+            unit: B
+            description: Number of incoming bytes
+            type: Cumulative
+            category: network
+        network.incoming.packets_vpg_vpg_private_0_port:
+          properties:
+            unit: packet
+            description: Number of incoming packets
+            type: Cumulative
+            category: network
+    vpg_vpg_private_1_port:
+      type: org.openecomp.resource.cp.v2.extNeutronCP
+      metadata:
+        invariantUUID: eee9a985-8e7e-4304-8d6c-3064fbb8f362
+        UUID: 358c373c-6bb0-4a8c-a554-f83cc52fb317
+        customizationUUID: 04986d31-b354-4ec0-b33f-01d3faf63076
+        version: '1.0'
+        name: extNeutronCP
+        description: The AT&T Connection Point base type all other CP derive from
+        type: CP
+        category: Generic
+        subcategory: Network Elements
+        resourceVendor: ATT (Tosca)
+        resourceVendorRelease: 1.0.0.wd03
+        resourceVendorModelNumber: ''
+      properties:
+        subnetpoolid:
+          get_input: port_vpg_private_1_port_subnetpoolid
+        is_default: false
+        related_networks:
+          get_input: port_vpg_private_1_port_related_networks
+        network:
+          get_input:
+          - port_vpg_private_1_port_network
+          - index_value
+        replacement_policy: AUTO
+        ip_requirements:
+          get_input: port_vpg_private_1_port_ip_requirements
+        network_role:
+          get_input: port_vpg_private_1_port_network_role
+        fixed_ips:
+          get_input:
+          - port_vpg_private_1_port_fixed_ips
+          - index_value
+        subinterface_indicator: false
+        mac_requirements:
+          get_input: port_vpg_private_1_port_mac_requirements
+        admin_state_up: true
+        exCP_naming:
+          get_input: port_vpg_private_1_port_exCP_naming
+        vlan_requirements:
+          get_input: port_vpg_private_1_port_vlan_requirements
+        network_role_tag:
+          get_input: port_vpg_private_1_port_network_role_tag
+        order:
+          get_input: port_vpg_private_1_port_order
+      requirements:
+      - binding:
+          capability: binding
+          node: vpg
+      capabilities:
+        network.incoming.bytes.rate_vpg_vpg_private_1_port:
+          properties:
+            unit: B/s
+            description: Average rate of incoming bytes
+            type: Gauge
+            category: network
+        port_mirroring_vpg_vpg_private_1_port:
+          properties:
+            connection_point:
+              network_role:
+                get_input: port_vpg_private_1_port_network_role
+              nfc_naming_code: vpg
+        network.outgoing.bytes_vpg_vpg_private_1_port:
+          properties:
+            unit: B
+            description: Number of outgoing bytes
+            type: Cumulative
+            category: network
+        network.incoming.packets_vpg_vpg_private_1_port:
+          properties:
+            unit: packet
+            description: Number of incoming packets
+            type: Cumulative
+            category: network
+        network.outgoing.packets.rate_vpg_vpg_private_1_port:
+          properties:
+            unit: packet/s
+            description: Average rate of outgoing packets
+            type: Gauge
+            category: network
+        network.incoming.packets.rate_vpg_vpg_private_1_port:
+          properties:
+            unit: packet/s
+            description: Average rate of incoming packets
+            type: Gauge
+            category: network
+        network.outgoing.bytes.rate_vpg_vpg_private_1_port:
+          properties:
+            unit: B/s
+            description: Average rate of outgoing bytes
+            type: Gauge
+            category: network
+        network.outpoing.packets_vpg_vpg_private_1_port:
+          properties:
+            unit: packet
+            description: Number of outgoing packets
+            type: Cumulative
+            category: network
+        network.incoming.bytes_vpg_vpg_private_1_port:
+          properties:
+            unit: B
+            description: Number of incoming bytes
+            type: Cumulative
+            category: network
+    vpg:
+      type: org.openecomp.resource.vfc.CiresvfonboardedBaseVfwAa8dcbff.abstract.compute.nodes.heat.vpg
+      metadata:
+        invariantUUID: 439baeb0-bf1a-41ef-a7e7-935730b46e38
+        UUID: 522f21aa-43f0-46da-8815-add1195beea3
+        customizationUUID: 765f2ea7-a6c5-470e-a09b-7dd9481b519f
+        version: '1.0'
+        name: CiresvfonboardedBaseVfwAa8dcbff.compute.nodes.heat.vpg
+        description: Not reusable inner VFC
+        type: VFC
+        category: Generic
+        subcategory: Abstract
+        resourceVendor: ciLicensec891e89e
+        resourceVendorRelease: 1.0.0.wd03
+        resourceVendorModelNumber: ''
+      properties:
+        flavor:
+          get_input: vm_flavor_name
+        key_name:
+          get_input:
+          - compute_vpg_key_name
+          - index_value
+        image:
+          get_input: vm_image_name
+        image_update_policy: REBUILD
+        metadata:
+          get_input:
+          - compute_vpg_metadata
+          - index_value
+        software_config_transport: POLL_SERVER_CFN
+        contrail_service_instance_ind: false
+        user_data_format:
+          get_input:
+          - compute_vpg_user_data_format
+          - index_value
+        user_data_update_policy: REPLACE
+        name:
+          get_input:
+          - compute_vpg_name
+          - index_value
+        flavor_update_policy: RESIZE
+      capabilities:
+        disk.read.bytes_vpg:
+          properties:
+            unit: B
+            description: Volume of reads
+            type: Cumulative
+            category: compute
+        disk.ephemeral.size_vpg:
+          properties:
+            unit: GB
+            description: Size of ephemeral disk
+            type: Gauge
+            category: compute
+        disk.write.requests.rate_vpg:
+          properties:
+            unit: request/s
+            description: Average rate of write requests
+            type: Gauge
+            category: compute
+        disk.write.bytes.rate_vpg:
+          properties:
+            unit: B/s
+            description: Average rate of writes
+            type: Gauge
+            category: compute
+        disk.device.iops_vpg:
+          properties:
+            unit: count/s
+            description: Average disk iops per device
+            type: Gauge
+            category: disk
+        disk.allocation_vpg:
+          properties:
+            unit: B
+            description: The amount of disk occupied by the instance on the host machine
+            type: Gauge
+            category: disk
+        disk.device.capacity_vpg:
+          properties:
+            unit: B
+            description: The amount of disk per device that the instance can see
+            type: Gauge
+            category: disk
+        instance_vpg:
+          properties:
+            unit: instance
+            description: Existence of instance
+            type: Gauge
+            category: compute
+        disk.device.read.requests_vpg:
+          properties:
+            unit: request
+            description: Number of read requests
+            type: Cumulative
+            category: disk
+        endpoint_vpg:
+          properties:
+            secure: true
+        cpu_vpg:
+          properties:
+            unit: ns
+            description: CPU time used
+            type: Cumulative
+            category: compute
+        disk.device.read.bytes.rate_vpg:
+          properties:
+            unit: B/s
+            description: Average rate of reads
+            type: Gauge
+            category: disk
+        disk.device.write.bytes.rate_vpg:
+          properties:
+            unit: B/s
+            description: Average rate of writes
+            type: Gauge
+            category: disk
+        cpu_util_vpg:
+          properties:
+            unit: '%'
+            description: Average CPU utilization
+            type: Gauge
+            category: compute
+        memory.usage_vpg:
+          properties:
+            unit: MB
+            description: Volume of RAM used by the instance from the amount of its allocated memory
+            type: Gauge
+            category: compute
+        disk.iops_vpg:
+          properties:
+            unit: count/s
+            description: Average disk iops
+            type: Gauge
+            category: disk
+        disk.usage_vpg:
+          properties:
+            unit: B
+            description: The physical size in bytes of the image container on the host
+            type: Gauge
+            category: disk
+        disk.device.usage_vpg:
+          properties:
+            unit: B
+            description: The physical size in bytes of the image container on the host per device
+            type: Gauge
+            category: disk
+        disk.device.read.bytes_vpg:
+          properties:
+            unit: B
+            description: Volume of reads
+            type: Cumulative
+            category: disk
+        disk.device.read.requests.rate_vpg:
+          properties:
+            unit: request/s
+            description: Average rate of read requests
+            type: Gauge
+            category: disk
+        disk.read.requests_vpg:
+          properties:
+            unit: request
+            description: Number of read requests
+            type: Cumulative
+            category: compute
+        disk.write.requests_vpg:
+          properties:
+            unit: request
+            description: Number of write requests
+            type: Cumulative
+            category: compute
+        disk.device.write.bytes_vpg:
+          properties:
+            unit: B
+            description: Volume of writes
+            type: Cumulative
+            category: disk
+        cpu.delta_vpg:
+          properties:
+            unit: ns
+            description: CPU time used since previous datapoint
+            type: Delta
+            category: compute
+        disk.capacity_vpg:
+          properties:
+            unit: B
+            description: The amount of disk that the instance can see
+            type: Gauge
+            category: disk
+        disk.write.bytes_vpg:
+          properties:
+            unit: B
+            description: Volume of writes
+            type: Cumulative
+            category: compute
+        disk.device.write.requests.rate_vpg:
+          properties:
+            unit: request/s
+            description: Average rate of write requests
+            type: Gauge
+            category: disk
+        vcpus_vpg:
+          properties:
+            unit: vcpu
+            description: Number of virtual CPUs allocated to the instance
+            type: Gauge
+            category: compute
+        disk.device.latency_vpg:
+          properties:
+            unit: ms
+            description: Average disk latency per device
+            type: Gauge
+            category: disk
+        scalable_vpg:
+          properties:
+            max_instances: 1
+            min_instances: 1
+        disk.root.size_vpg:
+          properties:
+            unit: GB
+            description: Size of root disk
+            type: Gauge
+            category: compute
+        disk.device.write.requests_vpg:
+          properties:
+            unit: request
+            description: Number of write requests
+            type: Cumulative
+            category: disk
+        memory_vpg:
+          properties:
+            unit: MB
+            description: Volume of RAM allocated to the instance
+            type: Gauge
+            category: compute
+        memory.resident_vpg:
+          properties:
+            unit: MB
+            description: Volume of RAM used by the instance on the physical machine
+            type: Gauge
+            category: compute
+        disk.read.bytes.rate_vpg:
+          properties:
+            unit: B/s
+            description: Average rate of reads
+            type: Gauge
+            category: compute
+        disk.device.allocation_vpg:
+          properties:
+            unit: B
+            description: The amount of disk per device occupied by the instance on the host machine
+            type: Gauge
+            category: disk
+        disk.latency_vpg:
+          properties:
+            unit: ms
+            description: Average disk latency
+            type: Gauge
+            category: disk
+  substitution_mappings:
+    node_type: org.openecomp.resource.vfc.CiresvfonboardedBaseVfwAa8dcbffcvfc.abstract.nodes.vpg
+    capabilities:
+      network.incoming.bytes.rate_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - network.incoming.bytes.rate
+      disk.read.bytes_vpg:
+      - vpg
+      - disk.read.bytes
+      binding_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - binding
+      network.outgoing.bytes.rate_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - network.outgoing.bytes.rate
+      forwarder_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - forwarder
+      disk.allocation_vpg:
+      - vpg
+      - disk.allocation
+      network.incoming.bytes_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - network.incoming.bytes
+      attachment_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - attachment
+      endpoint_vpg:
+      - vpg
+      - endpoint
+      cpu_vpg:
+      - vpg
+      - cpu
+      disk.device.read.bytes.rate_vpg:
+      - vpg
+      - disk.device.read.bytes.rate
+      network.outgoing.bytes.rate_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - network.outgoing.bytes.rate
+      feature_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - feature
+      disk.device.write.bytes.rate_vpg:
+      - vpg
+      - disk.device.write.bytes.rate
+      attachment_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - attachment
+      disk.iops_vpg:
+      - vpg
+      - disk.iops
+      disk.usage_vpg:
+      - vpg
+      - disk.usage
+      disk.device.usage_vpg:
+      - vpg
+      - disk.device.usage
+      disk.device.read.bytes_vpg:
+      - vpg
+      - disk.device.read.bytes
+      disk.device.write.bytes_vpg:
+      - vpg
+      - disk.device.write.bytes
+      disk.write.requests_vpg:
+      - vpg
+      - disk.write.requests
+      feature_vpg:
+      - vpg
+      - feature
+      disk.capacity_vpg:
+      - vpg
+      - disk.capacity
+      disk.device.latency_vpg:
+      - vpg
+      - disk.device.latency
+      disk.device.write.requests.rate_vpg:
+      - vpg
+      - disk.device.write.requests.rate
+      feature_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - feature
+      forwarder_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - forwarder
+      network.outgoing.packets.rate_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - network.outgoing.packets.rate
+      network.incoming.packets.rate_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - network.incoming.packets.rate
+      binding_vpg:
+      - vpg
+      - binding
+      disk.device.allocation_vpg:
+      - vpg
+      - disk.device.allocation
+      network.incoming.bytes_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - network.incoming.bytes
+      disk.ephemeral.size_vpg:
+      - vpg
+      - disk.ephemeral.size
+      network.outgoing.bytes_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - network.outgoing.bytes
+      network.incoming.packets_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - network.incoming.packets
+      disk.write.requests.rate_vpg:
+      - vpg
+      - disk.write.requests.rate
+      disk.write.bytes.rate_vpg:
+      - vpg
+      - disk.write.bytes.rate
+      disk.device.iops_vpg:
+      - vpg
+      - disk.device.iops
+      host_vpg:
+      - vpg
+      - host
+      network.outpoing.packets_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - network.outpoing.packets
+      instance_vpg:
+      - vpg
+      - instance
+      disk.device.capacity_vpg:
+      - vpg
+      - disk.device.capacity
+      disk.device.read.requests_vpg:
+      - vpg
+      - disk.device.read.requests
+      cpu_util_vpg:
+      - vpg
+      - cpu_util
+      memory.usage_vpg:
+      - vpg
+      - memory.usage
+      disk.device.read.requests.rate_vpg:
+      - vpg
+      - disk.device.read.requests.rate
+      disk.read.requests_vpg:
+      - vpg
+      - disk.read.requests
+      cpu.delta_vpg:
+      - vpg
+      - cpu.delta
+      network.incoming.packets.rate_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - network.incoming.packets.rate
+      network.incoming.bytes.rate_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - network.incoming.bytes.rate
+      disk.write.bytes_vpg:
+      - vpg
+      - disk.write.bytes
+      network.outgoing.packets.rate_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - network.outgoing.packets.rate
+      scalable_vpg:
+      - vpg
+      - scalable
+      vcpus_vpg:
+      - vpg
+      - vcpus
+      port_mirroring_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - port_mirroring
+      disk.root.size_vpg:
+      - vpg
+      - disk.root.size
+      disk.device.write.requests_vpg:
+      - vpg
+      - disk.device.write.requests
+      network.outgoing.bytes_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - network.outgoing.bytes
+      memory_vpg:
+      - vpg
+      - memory
+      network.outpoing.packets_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - network.outpoing.packets
+      os_vpg:
+      - vpg
+      - os
+      binding_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - binding
+      disk.read.bytes.rate_vpg:
+      - vpg
+      - disk.read.bytes.rate
+      memory.resident_vpg:
+      - vpg
+      - memory.resident
+      disk.latency_vpg:
+      - vpg
+      - disk.latency
+      network.incoming.packets_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - network.incoming.packets
+    requirements:
+      link_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - link
+      dependency_vpg:
+      - vpg
+      - dependency
+      dependency_vpg_vpg_private_0_port:
+      - vpg_vpg_private_0_port
+      - dependency
+      local_storage_vpg:
+      - vpg
+      - local_storage
+      dependency_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - dependency
+      link_vpg_vpg_private_1_port:
+      - vpg_vpg_private_1_port
+      - link