Heat Validation - VirtualMachineInterface

Issue-ID: SDC-994
Change-Id: I0fd23862eebf65437ab0e1a1ad1d44c9a2944990
Signed-off-by: katy.rotman <katy.rotman@amdocs.com>
diff --git a/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java
index af6166b..150783c 100644
--- a/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java
+++ b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java
@@ -124,6 +124,10 @@
       "Wrong value assigned to a ResourceGroup index_var property (functions are not allowed"
           + " but only strings), Resource ID [%s]"),
   CONTRAIL_2_IN_USE("Contrail 2.x deprecated resource is in use, Resource ID [%s]"),
+  VLAN_SUBINTERFACE_MORE_THAN_ONE_PORT("More than one parent port found, there should be only one parent port for a VLAN sub-interface ID [%s]"),
+  VLAN_SUBINTERFACE_MISSING_TAG_PROPERTY("VLAN Tag property " +
+      "virtual_machine_interface_properties_sub_interface_vlan_tag is missing in VLAN Resource ID [%s]"),
+  VLAN_SUBINTERFACE_MISSING_REFS_PROPERTY("Parent port property virtual_machine_interface_refs is missing in VLAN Resource ID [%s]"),
 
   /* warnings */
   REFERENCED_RESOURCE_NOT_FOUND("Referenced resource - %s not found"),
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-core/src/main/resources/config-validaton.json b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-core/src/main/resources/config-validaton.json
index 08c4288..3a41643 100644
--- a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-core/src/main/resources/config-validaton.json
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-core/src/main/resources/config-validaton.json
@@ -51,6 +51,10 @@
           "nestedResource": {
             "enable": true,
             "implementationClass": "org.openecomp.sdc.validation.impl.validators.heatresource.NestedResourceValidator"
+          },
+          "OS::ContrailV2::VirtualMachineInterface": {
+            "enable": true,
+            "implementationClass": "org.openecomp.sdc.validation.impl.validators.heatresource.VirtualMachineInterfaceValidator"
           }
         }
       }
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/util/HeatValidationService.java b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/util/HeatValidationService.java
index 469bfad..dbd13ed 100644
--- a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/util/HeatValidationService.java
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/util/HeatValidationService.java
@@ -26,10 +26,12 @@
 import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate;
 import org.openecomp.sdc.heat.datatypes.model.Parameter;
 import org.openecomp.sdc.heat.datatypes.model.Resource;
+import org.openecomp.sdc.heat.services.HeatStructureUtil;
 import org.openecomp.sdc.logging.api.Logger;
 import org.openecomp.sdc.logging.api.LoggerFactory;
 import org.openecomp.sdc.tosca.services.YamlUtil;
 import org.openecomp.sdc.validation.impl.validators.HeatValidator;
+import org.openecomp.sdc.validation.type.HeatResourceValidationContext;
 
 import java.io.InputStream;
 import java.util.Collection;
@@ -105,11 +107,11 @@
    * @param nestedParameters nested parameters.
    * @param nestedParametersNames nested parameter names.
    */
-  public static void checkNestedParameters(String parentFileName, String nestedFileName,
-                                           GlobalValidationContext globalContext,
-                                           Map<String, Parameter> parentParameters,
-                                           Map<String, Parameter> nestedParameters,
-                                           Set<String> nestedParametersNames) {
+  private static void checkNestedParameters(String parentFileName, String nestedFileName,
+                                            GlobalValidationContext globalContext,
+                                            Map<String, Parameter> parentParameters,
+                                            Map<String, Parameter> nestedParameters,
+                                            Set<String> nestedParametersNames) {
     HeatOrchestrationTemplate parentHeatOrchestrationTemplate;
     HeatOrchestrationTemplate nestedHeatOrchestrationTemplate;
 
@@ -276,6 +278,10 @@
     }
     return false;
   }
+
+
+
+
   private static HeatOrchestrationTemplate getNestedHeatOrchestrationTemplate( String nestedFileName,
                                           GlobalValidationContext globalContext) throws Exception {
     Optional<InputStream> fileContent = globalContext.getFileContent(nestedFileName);
@@ -319,9 +325,45 @@
     return envContent;
   }
 
+  /**
+   *
+   * @param fileName on which the validation is currently run
+   * @param globalContext gloabl validation context
+   * @param heatResourceValidationContext heat resource validation context
+   * @param propertyValue the value which is examined
+   * @return whether the vlan has single parent port
+   */
+  public static boolean hasSingleParentPort(String fileName, GlobalValidationContext globalContext,
+                                      HeatResourceValidationContext heatResourceValidationContext,
+                                      Object propertyValue) {
+    boolean hasSingleParentPort;
+    if (propertyValue instanceof List && ((List) propertyValue).size() == 1) {
+      final Object listValue = ((List) propertyValue).get(0);
 
-  public static String getResourceGroupResourceName(String resourceCallingToResourceGroup) {
-    return "OS::Heat::ResourceGroup in " + resourceCallingToResourceGroup;
+      final Set<String> getParamValues =
+          HeatStructureUtil.getReferencedValuesByFunctionName(fileName, "get_param",
+              listValue, globalContext);
+      hasSingleParentPort = getParamValues.isEmpty() || (getParamValues.size() == 1) &&
+          validateGetParamValueOfType(getParamValues, heatResourceValidationContext,
+              DefinedHeatParameterTypes.STRING.getType());
+    } else {
+      hasSingleParentPort = false;
+    }
+    return hasSingleParentPort;
+  }
+
+  private static boolean validateGetParamValueOfType(Set<String> values,
+                                        HeatResourceValidationContext
+                                            heatResourceValidationContext,String type) {
+    Optional<String> value = values.stream().findAny();
+    boolean isString = false;
+    if (value.isPresent()) {
+      isString =
+          Objects.equals(heatResourceValidationContext.getHeatOrchestrationTemplate
+              ().getParameters().get(value.get()).getType(), type);
+    }
+
+    return isString;
   }
 
 }
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/heatresource/VirtualMachineInterfaceValidator.java b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/heatresource/VirtualMachineInterfaceValidator.java
new file mode 100644
index 0000000..b5fa80e
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/heatresource/VirtualMachineInterfaceValidator.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright © 2016-2017 European Support Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openecomp.sdc.validation.impl.validators.heatresource;
+
+import org.openecomp.core.validation.ErrorMessageCode;
+import org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder;
+import org.openecomp.core.validation.types.GlobalValidationContext;
+import org.openecomp.sdc.common.togglz.ToggleableFeature;
+import org.openecomp.sdc.datatypes.error.ErrorLevel;
+import org.openecomp.sdc.heat.datatypes.DefinedHeatParameterTypes;
+import org.openecomp.sdc.heat.datatypes.model.Resource;
+import org.openecomp.sdc.heat.services.HeatConstants;
+import org.openecomp.sdc.heat.services.HeatStructureUtil;
+import org.openecomp.sdc.validation.ResourceValidator;
+import org.openecomp.sdc.validation.ValidationContext;
+import org.openecomp.sdc.validation.impl.util.HeatValidationService;
+import org.openecomp.sdc.validation.type.HeatResourceValidationContext;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+
+public class VirtualMachineInterfaceValidator implements ResourceValidator {
+  private static final ErrorMessageCode ERROR_CODE_VLAN1 = new ErrorMessageCode("VLAN1");
+  private static final ErrorMessageCode ERROR_CODE_VLAN2 = new ErrorMessageCode("VLAN2");
+
+
+  @Override
+  public void validate(String fileName, Map.Entry<String, Resource> resourceEntry,
+                       GlobalValidationContext globalContext, ValidationContext validationContext) {
+    if (ToggleableFeature.VLAN_TAGGING.isActive()) {
+      HeatResourceValidationContext heatResourceValidationContext =
+          (HeatResourceValidationContext) validationContext;
+      Optional<Object> tagPropertyValue = getVlanTagPropertyValue(resourceEntry.getValue());
+
+      tagPropertyValue
+          .ifPresent(o -> validateHasSingleParentPort(fileName, resourceEntry, globalContext,
+              heatResourceValidationContext));
+      validateHasTwoProperties(fileName, resourceEntry, globalContext);
+
+    }
+  }
+
+
+  private void validateHasSingleParentPort(String fileName,
+                                           Map.Entry<String, Resource> resourceEntry,
+                                           GlobalValidationContext globalContext,
+                                           HeatResourceValidationContext heatResourceValidationContext) {
+    Object refsPropertyValue = resourceEntry.getValue().getProperties()
+        .get(HeatConstants.VMI_REFS_PROPERTY_NAME);
+    if (Objects.isNull(refsPropertyValue)) {
+      return;
+    }
+    boolean hasSingleParentPort= HeatValidationService.hasSingleParentPort(fileName, globalContext,
+        heatResourceValidationContext,
+            refsPropertyValue);
+    if (!hasSingleParentPort) {
+      globalContext.addMessage(fileName, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
+          .getErrorWithParameters(ERROR_CODE_VLAN1,
+              Messages.VLAN_SUBINTERFACE_MORE_THAN_ONE_PORT.getErrorMessage(),
+              resourceEntry.getKey()));
+    }
+
+
+  }
+
+
+  private void validateHasTwoProperties(String fileName, Map.Entry<String, Resource> resourceEntry,
+                                        GlobalValidationContext globalContext) {
+
+    Optional<Object> refsPropertyValue = getRefsPropertyValue(resourceEntry.getValue());
+    Optional<Object> tagPropertyValue = getVlanTagPropertyValue(resourceEntry.getValue());
+
+
+    if (refsPropertyValue.isPresent() && !tagPropertyValue.isPresent()) {
+      globalContext
+          .addMessage(fileName, ErrorLevel.WARNING,
+              ErrorMessagesFormatBuilder
+                  .getErrorWithParameters(
+                      ERROR_CODE_VLAN2,
+                      Messages.VLAN_SUBINTERFACE_MISSING_TAG_PROPERTY.getErrorMessage(),
+                      resourceEntry.getKey())
+          );
+
+    } else if (!refsPropertyValue.isPresent() && tagPropertyValue.isPresent()) {
+      globalContext
+          .addMessage(fileName, ErrorLevel.WARNING,
+              ErrorMessagesFormatBuilder
+                  .getErrorWithParameters(
+                      ERROR_CODE_VLAN2,
+                      Messages.VLAN_SUBINTERFACE_MISSING_REFS_PROPERTY.getErrorMessage(),
+                      resourceEntry.getKey()));
+
+    }
+
+  }
+
+
+  private Optional<Object> getVlanTagPropertyValue(Resource resource) {
+    Object vmiProperties = resource.getProperties()
+        .get(HeatConstants.VMI_PROPERTIES_PROPERTY_NAME);
+    if (Objects.nonNull(vmiProperties) && vmiProperties instanceof Map) {
+      return Optional.ofNullable(((Map) vmiProperties)
+          .get(HeatConstants.VMI_SUB_INTERFACE_VLAN_TAG_PROPERTY_NAME));
+    }
+    return Optional.empty();
+  }
+
+  private Optional<Object> getRefsPropertyValue(Resource resource) {
+    Object refsProperty = resource.getProperties()
+        .get(HeatConstants.VMI_REFS_PROPERTY_NAME);
+    return Optional.ofNullable(refsProperty);
+
+  }
+
+
+  private enum Messages {
+    VLAN_SUBINTERFACE_MORE_THAN_ONE_PORT(
+        "More than one parent port found, there should be only one parent port for a VLAN sub-interface ID [%s]"),
+    VLAN_SUBINTERFACE_MISSING_TAG_PROPERTY("VLAN Tag property " +
+        "virtual_machine_interface_properties_sub_interface_vlan_tag is missing in VLAN Resource ID [%s]"),
+    VLAN_SUBINTERFACE_MISSING_REFS_PROPERTY("Parent port property virtual_machine_interface_refs " +
+        "is missing in VLAN Resource ID [%s]");
+
+    String getErrorMessage() {
+      return errorMessage;
+    }
+
+    private final String errorMessage;
+
+    Messages(String errorMessage) {
+      this.errorMessage = errorMessage;
+    }
+
+  }
+
+}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/java/org/openecomp/sdc/validation/impl/validators/heatresource/VirtualMachineInterfaceValidatorTest.java b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/java/org/openecomp/sdc/validation/impl/validators/heatresource/VirtualMachineInterfaceValidatorTest.java
new file mode 100644
index 0000000..c82271e
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/java/org/openecomp/sdc/validation/impl/validators/heatresource/VirtualMachineInterfaceValidatorTest.java
@@ -0,0 +1,163 @@
+package org.openecomp.sdc.validation.impl.validators.heatresource;
+
+import org.openecomp.core.validation.types.MessageContainer;
+import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
+import org.openecomp.sdc.validation.impl.validators.HeatResourceValidator;
+import org.openecomp.sdc.validation.util.ValidationTestUtil;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.Map;
+
+/**
+ * @author KATYR
+ * @since January 22, 2018
+ */
+
+public class VirtualMachineInterfaceValidatorTest {
+  private static final String PATH =
+      "/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/";
+
+
+  @Test
+  public void hasSingleParentPortNegative()  {
+    HeatResourceValidator baseValidator = new HeatResourceValidator();
+    VirtualMachineInterfaceValidator resourceValidator = new VirtualMachineInterfaceValidator();
+    Map<String, MessageContainer> messages = ValidationTestUtil.testValidator(baseValidator,
+        resourceValidator,
+        HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(),
+        PATH + "vlan_multiple_parent_ports/negative_test/input");
+
+    Assert.assertNotNull(messages);
+    Assert.assertEquals(messages.size(), 1);
+
+    Assert.assertEquals(messages.get("nested.yml").getErrorMessageList().size(), 1);
+    Assert.assertEquals(
+        messages.get("nested.yml").getErrorMessageList().get(0).getMessage(),
+        "ERROR: [VLAN1]: More than one parent port found, " +
+            "there should be only one parent port for a VLAN sub-interface ID [template_Vlan_2]");
+  }
+
+  @Test
+  public void hasSingleParentPortNegativeWithGetResource()  {
+    HeatResourceValidator baseValidator = new HeatResourceValidator();
+    VirtualMachineInterfaceValidator resourceValidator = new VirtualMachineInterfaceValidator();
+    Map<String, MessageContainer> messages = ValidationTestUtil.testValidator(baseValidator,
+        resourceValidator,
+        HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(),
+        PATH + "vlan_multiple_parent_ports/negative_get_resource/input");
+
+    Assert.assertNotNull(messages);
+    Assert.assertEquals(messages.size(), 0);
+  }
+
+
+  @Test
+  public void hasSingleParentPortPositive()  {
+    HeatResourceValidator baseValidator = new HeatResourceValidator();
+    VirtualMachineInterfaceValidator resourceValidator = new VirtualMachineInterfaceValidator();
+    Map<String, MessageContainer> messages = ValidationTestUtil.testValidator(baseValidator,
+        resourceValidator,
+        HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(),
+        PATH + "vlan_multiple_parent_ports/positive_test/input");
+
+    Assert.assertNotNull(messages);
+    Assert.assertEquals(messages.size(), 0);
+
+
+  }
+
+
+  @Test
+  public void hasBothPropertiesMissingTagNegative()  {
+    HeatResourceValidator baseValidator = new HeatResourceValidator();
+    VirtualMachineInterfaceValidator resourceValidator = new VirtualMachineInterfaceValidator();
+    Map<String, MessageContainer> messages = ValidationTestUtil.testValidator(baseValidator,
+        resourceValidator,
+        HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(),
+        PATH + "vlan_has_two_properties/negative_tag_missing/input");
+
+    Assert.assertNotNull(messages);
+    Assert.assertEquals(messages.size(), 1);
+
+    Assert.assertEquals(messages.get("nested.yml").getErrorMessageList().size(), 1);
+    Assert.assertEquals(
+        messages.get("nested.yml").getErrorMessageList().get(0).getMessage(),
+        "WARNING: [VLAN2]: VLAN Tag property " +
+            "virtual_machine_interface_properties_sub_interface_vlan_tag " +
+            "is missing in VLAN Resource ID [template_Vlan_2]");
+  }
+
+  @Test
+  public void hasBothPropertiesMissingRefsNegative()  {
+    HeatResourceValidator baseValidator = new HeatResourceValidator();
+    VirtualMachineInterfaceValidator resourceValidator = new VirtualMachineInterfaceValidator();
+    Map<String, MessageContainer> messages = ValidationTestUtil.testValidator(baseValidator,
+        resourceValidator,
+        HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(),
+        PATH + "vlan_has_two_properties/negative_refs_missing/input");
+
+    Assert.assertNotNull(messages);
+    Assert.assertEquals(messages.size(), 1);
+
+    Assert.assertEquals(messages.get("nested.yml").getErrorMessageList().size(), 1);
+    Assert.assertEquals(
+        messages.get("nested.yml").getErrorMessageList().get(0).getMessage(),
+        "WARNING: [VLAN2]: Parent port property virtual_machine_interface_refs is " +
+            "missing in VLAN Resource ID [template_Vlan_2]");
+  }
+
+  @Test
+  public void hasBothPropertiesBothMissingPositiveNotVLAN()  {
+    HeatResourceValidator baseValidator = new HeatResourceValidator();
+    VirtualMachineInterfaceValidator resourceValidator = new VirtualMachineInterfaceValidator();
+    Map<String, MessageContainer> messages = ValidationTestUtil.testValidator(baseValidator,
+        resourceValidator,
+        HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(),
+        PATH + "vlan_has_two_properties/negative_both_missing/input");
+
+    Assert.assertNotNull(messages);
+    Assert.assertEquals(messages.size(), 0);
+
+  }
+
+
+  @Test
+  public void hasBothPropertiesPositive()  {
+    HeatResourceValidator baseValidator = new HeatResourceValidator();
+    VirtualMachineInterfaceValidator resourceValidator = new VirtualMachineInterfaceValidator();
+    Map<String, MessageContainer> messages = ValidationTestUtil.testValidator(baseValidator,
+        resourceValidator,
+        HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(),
+        PATH + "vlan_has_two_properties/positive_test/input");
+
+    Assert.assertNotNull(messages);
+    Assert.assertEquals(messages.size(), 0);
+
+
+  }
+
+  @Test
+  public void hasSingleParentPortNegativeHasBothPropertiesNegative()  {
+    HeatResourceValidator baseValidator = new HeatResourceValidator();
+    VirtualMachineInterfaceValidator resourceValidator = new VirtualMachineInterfaceValidator();
+    Map<String, MessageContainer> messages = ValidationTestUtil.testValidator(baseValidator,
+        resourceValidator,
+        HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource(),
+        PATH + "vlan_mixed/negative_test/input");
+
+    Assert.assertNotNull(messages);
+    Assert.assertEquals(messages.size(), 1);
+
+
+    Assert.assertEquals(messages.get("nested.yml").getErrorMessageList().size(), 1);
+        Assert.assertEquals(
+        messages.get("nested.yml").getErrorMessageList().get(0).getMessage(),
+        "WARNING: [VLAN2]: VLAN Tag property " +
+            "virtual_machine_interface_properties_sub_interface_vlan_tag is missing in " +
+            "VLAN Resource ID [template_Vlan_2]");
+
+  }
+
+
+}
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_both_missing/input/MANIFEST.json b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_both_missing/input/MANIFEST.json
new file mode 100644
index 0000000..aca75b5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_both_missing/input/MANIFEST.json
@@ -0,0 +1,17 @@
+{
+  "name": "vMME_Small",
+  "description": "HOT template to create 2 cinder volume attachment",
+  "version": "2013-05-23",
+  "data": [
+    {
+      "file": "main.yml",
+      "type": "HEAT",
+      "isBase": "true"
+    },
+    {
+      "file": "nested.yml",
+      "type": "HEAT",
+      "isBase": "false"
+    }
+  ]
+}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_both_missing/input/main.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_both_missing/input/main.yml
new file mode 100644
index 0000000..a2d5166
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_both_missing/input/main.yml
@@ -0,0 +1,102 @@
+heat_template_version: 2013-05-23
+
+description: >
+  Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+
+parameters:
+  jsa_net_name:
+    type: string
+    description: network name of jsa log network
+  security_group_name:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_names:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_image:
+    type: string
+    description: Image for CMAUI server
+  availability_zone_0:
+    type: string
+    label: availabilityzone name
+    description: availabilityzone name
+  cmaui_flavor:
+    type: string
+    description: Flavor for CMAUI server
+  cmaui_oam_ips:
+    type: string
+  oam_sec_group_name:
+    type: string
+  lb_st_interface_type_oam:
+    type: string
+  template_PortTuple_LB1:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+resources:
+  test_net1:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+  test_net2:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+
+  server_cmaui_nova:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [cmaui_names, 0]}
+      image: { get_param: cmaui_image }
+      availability_zone: { get_param: availability_zone_0 }
+      flavor: { get_param: cmaui_flavor }
+      networks:
+      - port: { get_resource: template_VMInt_OAM_lb_1 }
+      - port: { get_resource: cmaui_port_2 }
+
+  
+
+  cmaui_port_2:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_resource: test_net1 }
+      fixed_ips: [{"ip_address": {get_param: [cmaui_oam_ips, 0]}}]
+      security_groups: [{get_param: security_group_name}]
+      replacement_policy: AUTO
+
+  test_nested:
+    type: nested.yml
+    properties:
+      p1: { get_resource: template_VMInt_OAM_lb_1}
+      p2: { get_resource: cmaui_port_2}
+      net1: { get_resource: test_net1}
+      net2: { get_resource: test_net2}
+
+  test_resourceGroup:
+    type: OS::Heat::ResourceGroup
+    properties:
+      count: 9
+      resource_def:
+        type: nested.yml
+        properties:
+          p1: { get_resource: template_VMInt_OAM_lb_1}
+          p2: { get_resource: cmaui_port_2}
+          net1: { get_resource: test_net1}
+          net2: { get_resource: test_net2}
+
+  test_nested_invalidConnection:
+    type: nested.yml
+    properties:
+      p1: { get_resource: test_Vlan1}
+      p2: { get_resource: server_cmaui_nova}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_both_missing/input/nested.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_both_missing/input/nested.yml
new file mode 100644
index 0000000..a426cf9
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_both_missing/input/nested.yml
@@ -0,0 +1,72 @@
+heat_template_version: 2013-05-23
+
+description: cmaui server template for vMMSC
+
+parameters:
+  p1:
+    type: string
+  p2:
+    type: string
+  net1:
+    type: string
+  net2:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+  subinterface_name_prefix:
+    type: string
+  subinterface_instance_index:
+    type: number
+resources:
+
+  
+  template_Vlan_3_arrayParameter:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name:
+        str_replace:
+          template: $NAME$VLAN
+          params:
+            $NAME: { get_param: subinterface_name_prefix }
+            $VLAN: { get_param: [ vlan_ids, { get_param: subinterface_instance_index } ] }
+      virtual_machine_interface_properties:
+        {
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_param: [net2,1] }]
+
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_refs_missing/input/MANIFEST.json b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_refs_missing/input/MANIFEST.json
new file mode 100644
index 0000000..aca75b5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_refs_missing/input/MANIFEST.json
@@ -0,0 +1,17 @@
+{
+  "name": "vMME_Small",
+  "description": "HOT template to create 2 cinder volume attachment",
+  "version": "2013-05-23",
+  "data": [
+    {
+      "file": "main.yml",
+      "type": "HEAT",
+      "isBase": "true"
+    },
+    {
+      "file": "nested.yml",
+      "type": "HEAT",
+      "isBase": "false"
+    }
+  ]
+}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_refs_missing/input/main.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_refs_missing/input/main.yml
new file mode 100644
index 0000000..a2d5166
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_refs_missing/input/main.yml
@@ -0,0 +1,102 @@
+heat_template_version: 2013-05-23
+
+description: >
+  Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+
+parameters:
+  jsa_net_name:
+    type: string
+    description: network name of jsa log network
+  security_group_name:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_names:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_image:
+    type: string
+    description: Image for CMAUI server
+  availability_zone_0:
+    type: string
+    label: availabilityzone name
+    description: availabilityzone name
+  cmaui_flavor:
+    type: string
+    description: Flavor for CMAUI server
+  cmaui_oam_ips:
+    type: string
+  oam_sec_group_name:
+    type: string
+  lb_st_interface_type_oam:
+    type: string
+  template_PortTuple_LB1:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+resources:
+  test_net1:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+  test_net2:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+
+  server_cmaui_nova:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [cmaui_names, 0]}
+      image: { get_param: cmaui_image }
+      availability_zone: { get_param: availability_zone_0 }
+      flavor: { get_param: cmaui_flavor }
+      networks:
+      - port: { get_resource: template_VMInt_OAM_lb_1 }
+      - port: { get_resource: cmaui_port_2 }
+
+  
+
+  cmaui_port_2:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_resource: test_net1 }
+      fixed_ips: [{"ip_address": {get_param: [cmaui_oam_ips, 0]}}]
+      security_groups: [{get_param: security_group_name}]
+      replacement_policy: AUTO
+
+  test_nested:
+    type: nested.yml
+    properties:
+      p1: { get_resource: template_VMInt_OAM_lb_1}
+      p2: { get_resource: cmaui_port_2}
+      net1: { get_resource: test_net1}
+      net2: { get_resource: test_net2}
+
+  test_resourceGroup:
+    type: OS::Heat::ResourceGroup
+    properties:
+      count: 9
+      resource_def:
+        type: nested.yml
+        properties:
+          p1: { get_resource: template_VMInt_OAM_lb_1}
+          p2: { get_resource: cmaui_port_2}
+          net1: { get_resource: test_net1}
+          net2: { get_resource: test_net2}
+
+  test_nested_invalidConnection:
+    type: nested.yml
+    properties:
+      p1: { get_resource: test_Vlan1}
+      p2: { get_resource: server_cmaui_nova}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_refs_missing/input/nested.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_refs_missing/input/nested.yml
new file mode 100644
index 0000000..5e838ec
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_refs_missing/input/nested.yml
@@ -0,0 +1,73 @@
+heat_template_version: 2013-05-23
+
+description: cmaui server template for vMMSC
+
+parameters:
+  p1:
+    type: string
+  p2:
+    type: string
+  net1:
+    type: string
+  net2:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+  subinterface_name_prefix:
+    type: string
+  subinterface_instance_index:
+    type: number
+resources:
+
+  
+  template_Vlan_2:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name:
+        str_replace:
+          template: $NAME$VLAN
+          params:
+            $NAME: { get_param: subinterface_name_prefix }
+            $VLAN: { get_param: [ vlan_ids, { get_param: subinterface_instance_index } ] }
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_sub_interface_vlan_tag: { get_param: lb_st_vlan_type_oam }
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_param: net2 }]
+
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_tag_missing/input/MANIFEST.json b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_tag_missing/input/MANIFEST.json
new file mode 100644
index 0000000..aca75b5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_tag_missing/input/MANIFEST.json
@@ -0,0 +1,17 @@
+{
+  "name": "vMME_Small",
+  "description": "HOT template to create 2 cinder volume attachment",
+  "version": "2013-05-23",
+  "data": [
+    {
+      "file": "main.yml",
+      "type": "HEAT",
+      "isBase": "true"
+    },
+    {
+      "file": "nested.yml",
+      "type": "HEAT",
+      "isBase": "false"
+    }
+  ]
+}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_tag_missing/input/main.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_tag_missing/input/main.yml
new file mode 100644
index 0000000..a2d5166
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_tag_missing/input/main.yml
@@ -0,0 +1,102 @@
+heat_template_version: 2013-05-23
+
+description: >
+  Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+
+parameters:
+  jsa_net_name:
+    type: string
+    description: network name of jsa log network
+  security_group_name:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_names:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_image:
+    type: string
+    description: Image for CMAUI server
+  availability_zone_0:
+    type: string
+    label: availabilityzone name
+    description: availabilityzone name
+  cmaui_flavor:
+    type: string
+    description: Flavor for CMAUI server
+  cmaui_oam_ips:
+    type: string
+  oam_sec_group_name:
+    type: string
+  lb_st_interface_type_oam:
+    type: string
+  template_PortTuple_LB1:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+resources:
+  test_net1:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+  test_net2:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+
+  server_cmaui_nova:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [cmaui_names, 0]}
+      image: { get_param: cmaui_image }
+      availability_zone: { get_param: availability_zone_0 }
+      flavor: { get_param: cmaui_flavor }
+      networks:
+      - port: { get_resource: template_VMInt_OAM_lb_1 }
+      - port: { get_resource: cmaui_port_2 }
+
+  
+
+  cmaui_port_2:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_resource: test_net1 }
+      fixed_ips: [{"ip_address": {get_param: [cmaui_oam_ips, 0]}}]
+      security_groups: [{get_param: security_group_name}]
+      replacement_policy: AUTO
+
+  test_nested:
+    type: nested.yml
+    properties:
+      p1: { get_resource: template_VMInt_OAM_lb_1}
+      p2: { get_resource: cmaui_port_2}
+      net1: { get_resource: test_net1}
+      net2: { get_resource: test_net2}
+
+  test_resourceGroup:
+    type: OS::Heat::ResourceGroup
+    properties:
+      count: 9
+      resource_def:
+        type: nested.yml
+        properties:
+          p1: { get_resource: template_VMInt_OAM_lb_1}
+          p2: { get_resource: cmaui_port_2}
+          net1: { get_resource: test_net1}
+          net2: { get_resource: test_net2}
+
+  test_nested_invalidConnection:
+    type: nested.yml
+    properties:
+      p1: { get_resource: test_Vlan1}
+      p2: { get_resource: server_cmaui_nova}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_tag_missing/input/nested.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_tag_missing/input/nested.yml
new file mode 100644
index 0000000..342624e
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/negative_tag_missing/input/nested.yml
@@ -0,0 +1,75 @@
+heat_template_version: 2013-05-23
+
+description: cmaui server template for vMMSC
+
+parameters:
+  p1:
+    type: string
+  p2:
+    type: string
+  net1:
+    type: string
+  net2:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+  subinterface_name_prefix:
+    type: string
+  subinterface_instance_index:
+    type: number
+resources:
+
+  
+  template_Vlan_2:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name:
+        str_replace:
+          template: $NAME$VLAN
+          params:
+            $NAME: { get_param: subinterface_name_prefix }
+            $VLAN: { get_param: [ vlan_ids, { get_param: subinterface_instance_index } ] }
+      virtual_machine_interface_properties:
+        {
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_param: net2 }]
+      virtual_machine_interface_refs: [{ get_param: p2 }]
+
+  
+
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/positive_test/input/MANIFEST.json b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/positive_test/input/MANIFEST.json
new file mode 100644
index 0000000..aca75b5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/positive_test/input/MANIFEST.json
@@ -0,0 +1,17 @@
+{
+  "name": "vMME_Small",
+  "description": "HOT template to create 2 cinder volume attachment",
+  "version": "2013-05-23",
+  "data": [
+    {
+      "file": "main.yml",
+      "type": "HEAT",
+      "isBase": "true"
+    },
+    {
+      "file": "nested.yml",
+      "type": "HEAT",
+      "isBase": "false"
+    }
+  ]
+}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/positive_test/input/main.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/positive_test/input/main.yml
new file mode 100644
index 0000000..a2d5166
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/positive_test/input/main.yml
@@ -0,0 +1,102 @@
+heat_template_version: 2013-05-23
+
+description: >
+  Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+
+parameters:
+  jsa_net_name:
+    type: string
+    description: network name of jsa log network
+  security_group_name:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_names:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_image:
+    type: string
+    description: Image for CMAUI server
+  availability_zone_0:
+    type: string
+    label: availabilityzone name
+    description: availabilityzone name
+  cmaui_flavor:
+    type: string
+    description: Flavor for CMAUI server
+  cmaui_oam_ips:
+    type: string
+  oam_sec_group_name:
+    type: string
+  lb_st_interface_type_oam:
+    type: string
+  template_PortTuple_LB1:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+resources:
+  test_net1:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+  test_net2:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+
+  server_cmaui_nova:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [cmaui_names, 0]}
+      image: { get_param: cmaui_image }
+      availability_zone: { get_param: availability_zone_0 }
+      flavor: { get_param: cmaui_flavor }
+      networks:
+      - port: { get_resource: template_VMInt_OAM_lb_1 }
+      - port: { get_resource: cmaui_port_2 }
+
+  
+
+  cmaui_port_2:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_resource: test_net1 }
+      fixed_ips: [{"ip_address": {get_param: [cmaui_oam_ips, 0]}}]
+      security_groups: [{get_param: security_group_name}]
+      replacement_policy: AUTO
+
+  test_nested:
+    type: nested.yml
+    properties:
+      p1: { get_resource: template_VMInt_OAM_lb_1}
+      p2: { get_resource: cmaui_port_2}
+      net1: { get_resource: test_net1}
+      net2: { get_resource: test_net2}
+
+  test_resourceGroup:
+    type: OS::Heat::ResourceGroup
+    properties:
+      count: 9
+      resource_def:
+        type: nested.yml
+        properties:
+          p1: { get_resource: template_VMInt_OAM_lb_1}
+          p2: { get_resource: cmaui_port_2}
+          net1: { get_resource: test_net1}
+          net2: { get_resource: test_net2}
+
+  test_nested_invalidConnection:
+    type: nested.yml
+    properties:
+      p1: { get_resource: test_Vlan1}
+      p2: { get_resource: server_cmaui_nova}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/positive_test/input/nested.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/positive_test/input/nested.yml
new file mode 100644
index 0000000..b1a96d0
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_has_two_properties/positive_test/input/nested.yml
@@ -0,0 +1,75 @@
+heat_template_version: 2013-05-23
+
+description: cmaui server template for vMMSC
+
+parameters:
+  p1:
+    type: string
+  p2:
+    type: string
+  net1:
+    type: string
+  net2:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+  subinterface_name_prefix:
+    type: string
+  subinterface_instance_index:
+    type: number
+resources:
+
+  template_Vlan_1:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name:
+        str_replace:
+          template: $NAME$VLAN
+          params:
+            $NAME: { get_param: subinterface_name_prefix }
+            $VLAN: { get_param: [ vlan_ids, { get_param: subinterface_instance_index } ] }
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_sub_interface_vlan_tag: { get_param: lb_st_vlan_type_oam }
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_param: net1 }]
+      virtual_machine_interface_refs: [{ get_param: p1 }]
+
+
+    
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_mixed/negative_test/input/MANIFEST.json b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_mixed/negative_test/input/MANIFEST.json
new file mode 100644
index 0000000..aca75b5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_mixed/negative_test/input/MANIFEST.json
@@ -0,0 +1,17 @@
+{
+  "name": "vMME_Small",
+  "description": "HOT template to create 2 cinder volume attachment",
+  "version": "2013-05-23",
+  "data": [
+    {
+      "file": "main.yml",
+      "type": "HEAT",
+      "isBase": "true"
+    },
+    {
+      "file": "nested.yml",
+      "type": "HEAT",
+      "isBase": "false"
+    }
+  ]
+}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_mixed/negative_test/input/main.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_mixed/negative_test/input/main.yml
new file mode 100644
index 0000000..8bdc627
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_mixed/negative_test/input/main.yml
@@ -0,0 +1,187 @@
+heat_template_version: 2013-05-23
+
+description: >
+  Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+
+parameters:
+  jsa_net_name:
+    type: string
+    description: network name of jsa log network
+  security_group_name:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_names:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_image:
+    type: string
+    description: Image for CMAUI server
+  availability_zone_0:
+    type: string
+    label: availabilityzone name
+    description: availabilityzone name
+  cmaui_flavor:
+    type: string
+    description: Flavor for CMAUI server
+  cmaui_oam_ips:
+    type: string
+  oam_sec_group_name:
+    type: string
+  lb_st_interface_type_oam:
+    type: string
+  template_PortTuple_LB1:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+resources:
+  test_net1:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+  test_net2:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+
+  server_cmaui_nova:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [cmaui_names, 0]}
+      image: { get_param: cmaui_image }
+      availability_zone: { get_param: availability_zone_0 }
+      flavor: { get_param: cmaui_flavor }
+      networks:
+      - port: { get_resource: template_VMInt_OAM_lb_1 }
+      - port: { get_resource: cmaui_port_2 }
+
+  template_VMInt_OAM_lb_1:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_service_interface_type: { get_param: lb_st_interface_type_oam },
+        }
+      virtual_network_refs: [{ get_resource: test_net1 }]
+      port_tuple_refs: [{ get_param: template_PortTuple_LB1 }]
+      security_group_refs: [{ get_param: oam_sec_group_name}]
+
+  cmaui_port_2:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_resource: test_net1 }
+      fixed_ips: [{"ip_address": {get_param: [cmaui_oam_ips, 0]}}]
+      security_groups: [{get_param: security_group_name}]
+      replacement_policy: AUTO
+
+  test_Vlan1:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name: vlan
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_sub_interface_vlan_tag: { get_param: lb_st_vlan_type_oam }
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_resource: test_net1 }]
+      virtual_machine_interface_refs: [{ get_resource: test_Vlan2 }]
+
+  test_Vlan2:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name: vlan
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_sub_interface_vlan_tag: { get_param: lb_st_vlan_type_oam }
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_resource: test_net1 }]
+      virtual_machine_interface_refs: [{ get_resource: template_VMInt_OAM_lb_1 }]
+
+  test_nested:
+    type: nested.yml
+    properties:
+      p1: { get_resource: template_VMInt_OAM_lb_1}
+      p2: { get_resource: cmaui_port_2}
+      net1: { get_resource: test_net1}
+      net2: { get_resource: test_net2}
+
+  test_resourceGroup:
+    type: OS::Heat::ResourceGroup
+    properties:
+      count: 9
+      resource_def:
+        type: nested.yml
+        properties:
+          p1: { get_resource: template_VMInt_OAM_lb_1}
+          p2: { get_resource: cmaui_port_2}
+          net1: { get_resource: test_net1}
+          net2: { get_resource: test_net2}
+
+  test_nested_invalidConnection:
+    type: nested.yml
+    properties:
+      p1: { get_resource: test_Vlan1}
+      p2: { get_resource: server_cmaui_nova}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_mixed/negative_test/input/nested.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_mixed/negative_test/input/nested.yml
new file mode 100644
index 0000000..29f8c20
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_mixed/negative_test/input/nested.yml
@@ -0,0 +1,74 @@
+heat_template_version: 2013-05-23
+
+description: cmaui server template for vMMSC
+
+parameters:
+  p1:
+    type: string
+  p2:
+    type: string
+  net1:
+    type: string
+  net2:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+  subinterface_name_prefix:
+    type: string
+  subinterface_instance_index:
+    type: number
+resources:
+
+  
+  template_Vlan_2:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name:
+        str_replace:
+          template: $NAME$VLAN
+          params:
+            $NAME: { get_param: subinterface_name_prefix }
+            $VLAN: { get_param: [ vlan_ids, { get_param: subinterface_instance_index } ] }
+      virtual_machine_interface_properties:
+        {
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_param: net2 },{ get_param: net1 }]
+      virtual_machine_interface_refs: [{ get_param: p2 }, { get_param: p1 }]
+
+ 
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_get_resource/input/MANIFEST.json b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_get_resource/input/MANIFEST.json
new file mode 100644
index 0000000..aca75b5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_get_resource/input/MANIFEST.json
@@ -0,0 +1,17 @@
+{
+  "name": "vMME_Small",
+  "description": "HOT template to create 2 cinder volume attachment",
+  "version": "2013-05-23",
+  "data": [
+    {
+      "file": "main.yml",
+      "type": "HEAT",
+      "isBase": "true"
+    },
+    {
+      "file": "nested.yml",
+      "type": "HEAT",
+      "isBase": "false"
+    }
+  ]
+}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_get_resource/input/main.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_get_resource/input/main.yml
new file mode 100644
index 0000000..a2d5166
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_get_resource/input/main.yml
@@ -0,0 +1,102 @@
+heat_template_version: 2013-05-23
+
+description: >
+  Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+
+parameters:
+  jsa_net_name:
+    type: string
+    description: network name of jsa log network
+  security_group_name:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_names:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_image:
+    type: string
+    description: Image for CMAUI server
+  availability_zone_0:
+    type: string
+    label: availabilityzone name
+    description: availabilityzone name
+  cmaui_flavor:
+    type: string
+    description: Flavor for CMAUI server
+  cmaui_oam_ips:
+    type: string
+  oam_sec_group_name:
+    type: string
+  lb_st_interface_type_oam:
+    type: string
+  template_PortTuple_LB1:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+resources:
+  test_net1:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+  test_net2:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+
+  server_cmaui_nova:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [cmaui_names, 0]}
+      image: { get_param: cmaui_image }
+      availability_zone: { get_param: availability_zone_0 }
+      flavor: { get_param: cmaui_flavor }
+      networks:
+      - port: { get_resource: template_VMInt_OAM_lb_1 }
+      - port: { get_resource: cmaui_port_2 }
+
+  
+
+  cmaui_port_2:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_resource: test_net1 }
+      fixed_ips: [{"ip_address": {get_param: [cmaui_oam_ips, 0]}}]
+      security_groups: [{get_param: security_group_name}]
+      replacement_policy: AUTO
+
+  test_nested:
+    type: nested.yml
+    properties:
+      p1: { get_resource: template_VMInt_OAM_lb_1}
+      p2: { get_resource: cmaui_port_2}
+      net1: { get_resource: test_net1}
+      net2: { get_resource: test_net2}
+
+  test_resourceGroup:
+    type: OS::Heat::ResourceGroup
+    properties:
+      count: 9
+      resource_def:
+        type: nested.yml
+        properties:
+          p1: { get_resource: template_VMInt_OAM_lb_1}
+          p2: { get_resource: cmaui_port_2}
+          net1: { get_resource: test_net1}
+          net2: { get_resource: test_net2}
+
+  test_nested_invalidConnection:
+    type: nested.yml
+    properties:
+      p1: { get_resource: test_Vlan1}
+      p2: { get_resource: server_cmaui_nova}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_get_resource/input/nested.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_get_resource/input/nested.yml
new file mode 100644
index 0000000..97b0aec
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_get_resource/input/nested.yml
@@ -0,0 +1,75 @@
+heat_template_version: 2013-05-23
+
+description: cmaui server template for vMMSC
+
+parameters:
+  p1:
+    type: string
+  p2:
+    type: string
+  net1:
+    type: string
+  net2:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+  subinterface_name_prefix:
+    type: string
+  subinterface_instance_index:
+    type: number
+resources:
+
+  
+  template_Vlan_2:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name:
+        str_replace:
+          template: $NAME$VLAN
+          params:
+            $NAME: { get_param: subinterface_name_prefix }
+            $VLAN: { get_param: [ vlan_ids, { get_param: subinterface_instance_index } ] }
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_sub_interface_vlan_tag: { get_param: lb_st_vlan_type_oam }
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_resource: template_VMInt_OAM_lb_1 }]
+      virtual_machine_interface_refs: [{ get_resource: template_VMInt_OAM_lb_1 }]
+
+
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_test/input/MANIFEST.json b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_test/input/MANIFEST.json
new file mode 100644
index 0000000..aca75b5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_test/input/MANIFEST.json
@@ -0,0 +1,17 @@
+{
+  "name": "vMME_Small",
+  "description": "HOT template to create 2 cinder volume attachment",
+  "version": "2013-05-23",
+  "data": [
+    {
+      "file": "main.yml",
+      "type": "HEAT",
+      "isBase": "true"
+    },
+    {
+      "file": "nested.yml",
+      "type": "HEAT",
+      "isBase": "false"
+    }
+  ]
+}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_test/input/main.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_test/input/main.yml
new file mode 100644
index 0000000..8bdc627
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_test/input/main.yml
@@ -0,0 +1,187 @@
+heat_template_version: 2013-05-23
+
+description: >
+  Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+
+parameters:
+  jsa_net_name:
+    type: string
+    description: network name of jsa log network
+  security_group_name:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_names:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_image:
+    type: string
+    description: Image for CMAUI server
+  availability_zone_0:
+    type: string
+    label: availabilityzone name
+    description: availabilityzone name
+  cmaui_flavor:
+    type: string
+    description: Flavor for CMAUI server
+  cmaui_oam_ips:
+    type: string
+  oam_sec_group_name:
+    type: string
+  lb_st_interface_type_oam:
+    type: string
+  template_PortTuple_LB1:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+resources:
+  test_net1:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+  test_net2:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+
+  server_cmaui_nova:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [cmaui_names, 0]}
+      image: { get_param: cmaui_image }
+      availability_zone: { get_param: availability_zone_0 }
+      flavor: { get_param: cmaui_flavor }
+      networks:
+      - port: { get_resource: template_VMInt_OAM_lb_1 }
+      - port: { get_resource: cmaui_port_2 }
+
+  template_VMInt_OAM_lb_1:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_service_interface_type: { get_param: lb_st_interface_type_oam },
+        }
+      virtual_network_refs: [{ get_resource: test_net1 }]
+      port_tuple_refs: [{ get_param: template_PortTuple_LB1 }]
+      security_group_refs: [{ get_param: oam_sec_group_name}]
+
+  cmaui_port_2:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_resource: test_net1 }
+      fixed_ips: [{"ip_address": {get_param: [cmaui_oam_ips, 0]}}]
+      security_groups: [{get_param: security_group_name}]
+      replacement_policy: AUTO
+
+  test_Vlan1:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name: vlan
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_sub_interface_vlan_tag: { get_param: lb_st_vlan_type_oam }
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_resource: test_net1 }]
+      virtual_machine_interface_refs: [{ get_resource: test_Vlan2 }]
+
+  test_Vlan2:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name: vlan
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_sub_interface_vlan_tag: { get_param: lb_st_vlan_type_oam }
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_resource: test_net1 }]
+      virtual_machine_interface_refs: [{ get_resource: template_VMInt_OAM_lb_1 }]
+
+  test_nested:
+    type: nested.yml
+    properties:
+      p1: { get_resource: template_VMInt_OAM_lb_1}
+      p2: { get_resource: cmaui_port_2}
+      net1: { get_resource: test_net1}
+      net2: { get_resource: test_net2}
+
+  test_resourceGroup:
+    type: OS::Heat::ResourceGroup
+    properties:
+      count: 9
+      resource_def:
+        type: nested.yml
+        properties:
+          p1: { get_resource: template_VMInt_OAM_lb_1}
+          p2: { get_resource: cmaui_port_2}
+          net1: { get_resource: test_net1}
+          net2: { get_resource: test_net2}
+
+  test_nested_invalidConnection:
+    type: nested.yml
+    properties:
+      p1: { get_resource: test_Vlan1}
+      p2: { get_resource: server_cmaui_nova}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_test/input/nested.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_test/input/nested.yml
new file mode 100644
index 0000000..7a73014
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/negative_test/input/nested.yml
@@ -0,0 +1,76 @@
+heat_template_version: 2013-05-23
+
+description: cmaui server template for vMMSC
+
+parameters:
+  p1:
+    type: string
+  p2:
+    type: string
+  net1:
+    type: string
+  net2:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+  subinterface_name_prefix:
+    type: string
+  subinterface_instance_index:
+    type: number
+resources:
+
+  
+  template_Vlan_2:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name:
+        str_replace:
+          template: $NAME$VLAN
+          params:
+            $NAME: { get_param: subinterface_name_prefix }
+            $VLAN: { get_param: [ vlan_ids, { get_param: subinterface_instance_index } ] }
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_sub_interface_vlan_tag: { get_param: lb_st_vlan_type_oam }
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_param: net2 },{ get_param: net1 }]
+      virtual_machine_interface_refs: [{ get_param: p2 }, { get_param: p1 }]
+
+
+
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/positive_test/input/MANIFEST.json b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/positive_test/input/MANIFEST.json
new file mode 100644
index 0000000..aca75b5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/positive_test/input/MANIFEST.json
@@ -0,0 +1,17 @@
+{
+  "name": "vMME_Small",
+  "description": "HOT template to create 2 cinder volume attachment",
+  "version": "2013-05-23",
+  "data": [
+    {
+      "file": "main.yml",
+      "type": "HEAT",
+      "isBase": "true"
+    },
+    {
+      "file": "nested.yml",
+      "type": "HEAT",
+      "isBase": "false"
+    }
+  ]
+}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/positive_test/input/main.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/positive_test/input/main.yml
new file mode 100644
index 0000000..9b0c3ec
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/positive_test/input/main.yml
@@ -0,0 +1,111 @@
+heat_template_version: 2013-05-23
+
+description: >
+  Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+
+parameters:
+  jsa_net_name:
+    type: string
+    description: network name of jsa log network
+  security_group_name:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_names:
+    type: comma_delimited_list
+    description: CMAUI1, CMAUI2 server names
+  cmaui_image:
+    type: string
+    description: Image for CMAUI server
+  availability_zone_0:
+    type: string
+    label: availabilityzone name
+    description: availabilityzone name
+  cmaui_flavor:
+    type: string
+    description: Flavor for CMAUI server
+  cmaui_oam_ips:
+    type: string
+  oam_sec_group_name:
+    type: string
+  lb_st_interface_type_oam:
+    type: string
+  template_PortTuple_LB1:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+resources:
+  test_net1:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+  test_net2:
+    type: OS::Neutron::Net
+    properties:
+      name: {get_param: jsa_net_name}
+      shared: True
+
+  server_cmaui_nova:
+    type: OS::Nova::Server
+    properties:
+      name: { get_param: [cmaui_names, 0]}
+      image: { get_param: cmaui_image }
+      availability_zone: { get_param: availability_zone_0 }
+      flavor: { get_param: cmaui_flavor }
+      networks:
+      - port: { get_resource: template_VMInt_OAM_lb_1 }
+      - port: { get_resource: cmaui_port_2 }
+
+  
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_service_interface_type: { get_param: lb_st_interface_type_oam },
+        }
+      virtual_network_refs: [{ get_resource: test_net1 }]
+      port_tuple_refs: [{ get_param: template_PortTuple_LB1 }]
+      security_group_refs: [{ get_param: oam_sec_group_name}]
+
+  cmaui_port_2:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_resource: test_net1 }
+      fixed_ips: [{"ip_address": {get_param: [cmaui_oam_ips, 0]}}]
+      security_groups: [{get_param: security_group_name}]
+      replacement_policy: AUTO
+
+  test_nested:
+    type: nested.yml
+    properties:
+      p1: { get_resource: template_VMInt_OAM_lb_1}
+      p2: { get_resource: cmaui_port_2}
+      net1: { get_resource: test_net1}
+      net2: { get_resource: test_net2}
+
+  test_resourceGroup:
+    type: OS::Heat::ResourceGroup
+    properties:
+      count: 9
+      resource_def:
+        type: nested.yml
+        properties:
+          p1: { get_resource: template_VMInt_OAM_lb_1}
+          p2: { get_resource: cmaui_port_2}
+          net1: { get_resource: test_net1}
+          net2: { get_resource: test_net2}
+
+  test_nested_invalidConnection:
+    type: nested.yml
+    properties:
+      p1: { get_resource: test_Vlan1}
+      p2: { get_resource: server_cmaui_nova}
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/positive_test/input/nested.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/positive_test/input/nested.yml
new file mode 100644
index 0000000..b1a96d0
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/vlan_resource_validation/vlan_multiple_parent_ports/positive_test/input/nested.yml
@@ -0,0 +1,75 @@
+heat_template_version: 2013-05-23
+
+description: cmaui server template for vMMSC
+
+parameters:
+  p1:
+    type: string
+  p2:
+    type: string
+  net1:
+    type: string
+  net2:
+    type: string
+  lb_st_vlan_type_oam:
+    description: dummy
+    type: string
+  mac_address:
+    type: string
+  virtual_ip_address:
+    type: string
+  virtual_ipv6_address:
+    type: string
+  vlan_ids:
+    type: string
+  subinterface_name_prefix:
+    type: string
+  subinterface_instance_index:
+    type: number
+resources:
+
+  template_Vlan_1:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name:
+        str_replace:
+          template: $NAME$VLAN
+          params:
+            $NAME: { get_param: subinterface_name_prefix }
+            $VLAN: { get_param: [ vlan_ids, { get_param: subinterface_instance_index } ] }
+      virtual_machine_interface_properties:
+        {
+          virtual_machine_interface_properties_sub_interface_vlan_tag: { get_param: lb_st_vlan_type_oam }
+        }
+      virtual_machine_interface_mac_addresses:
+        {
+        virtual_machine_interface_mac_addresses_mac_address: [{ get_param: mac_address }],
+        }
+      virtual_machine_interface_allowed_address_pairs:
+        {
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair: [
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ip_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 32
+              }
+            },
+            {
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode: active-standby,
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac: { get_param: mac_address },
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              {
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix: { get_param: virtual_ipv6_address },
+                virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len: 128
+              }
+            }
+          ]
+        }
+      virtual_network_refs: [{ get_param: net1 }]
+      virtual_machine_interface_refs: [{ get_param: p1 }]
+
+
+    
\ No newline at end of file