Refactor Onboarding Translator code
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / services / heattotosca / impl / resourcetranslation / ResourceTranslationNovaServerImpl.java
index 09439e2..e865984 100644 (file)
 
 package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation;
 
+import static org.openecomp.sdc.heat.services.HeatConstants.SNAPSHOT_ID_PROPERTY_NAME;
+import static org.openecomp.sdc.heat.services.HeatConstants.VOL_ID_PROPERTY_NAME;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.MapUtils;
+import org.onap.sdc.tosca.datatypes.model.GroupDefinition;
+import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
+import org.onap.sdc.tosca.datatypes.model.NodeType;
+import org.onap.sdc.tosca.datatypes.model.RelationshipTemplate;
+import org.onap.sdc.tosca.datatypes.model.RequirementAssignment;
+import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
 import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate;
 import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
+import org.openecomp.sdc.heat.datatypes.model.PropertiesMapKeyTypes;
 import org.openecomp.sdc.heat.datatypes.model.Resource;
+import org.openecomp.sdc.heat.datatypes.model.ResourceReferenceFunctions;
 import org.openecomp.sdc.heat.services.HeatConstants;
 import org.openecomp.sdc.logging.api.Logger;
 import org.openecomp.sdc.logging.api.LoggerFactory;
 import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType;
 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
 import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType;
-import org.onap.sdc.tosca.datatypes.model.GroupDefinition;
-import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
-import org.onap.sdc.tosca.datatypes.model.NodeType;
-import org.onap.sdc.tosca.datatypes.model.RelationshipTemplate;
-import org.onap.sdc.tosca.datatypes.model.RequirementAssignment;
-import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
 import org.openecomp.sdc.tosca.services.DataModelUtil;
 import org.openecomp.sdc.tosca.services.ToscaConstants;
 import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId;
@@ -48,422 +62,394 @@ import org.openecomp.sdc.translator.services.heattotosca.NameExtractor;
 import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory;
 import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
+public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase {
+    private static final Logger logger = LoggerFactory.getLogger(ResourceTranslationNovaServerImpl.class);
+    private static final String BLOCK_DEVICE_MAPPING_DEVICE_NAME = "device_name";
+    private static final String VOL_ATTACH_DEVICE_PROPERTY_NAME = "device";
+
+    @Override
+    protected void translate(TranslateTo translateTo) {
+        TranslationContext context = translateTo.getContext();
+        Map<String, Object> properties = translateTo.getResource().getProperties();
+        String heatFileName = translateTo.getHeatFileName();
+        ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
+        String nodeTypeRef = createLocalNodeType(serviceTemplate, translateTo.getResource(),
+                translateTo.getResourceId(), translateTo.getTranslatedId());
+        //create compute in consolidation data
+        ConsolidationDataUtil.getComputeTemplateConsolidationData(context, serviceTemplate,
+                nodeTypeRef, translateTo.getTranslatedId());
+        NodeTemplate novaNodeTemplate = new NodeTemplate();
+        novaNodeTemplate.setType(nodeTypeRef);
+        HeatOrchestrationTemplate heatOrchestrationTemplate =
+                translateTo.getHeatOrchestrationTemplate();
+        novaNodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter
+                .getToscaPropertiesSimpleConversion(serviceTemplate, translateTo.getResourceId(),
+                        properties, novaNodeTemplate.getProperties(), heatFileName,
+                        heatOrchestrationTemplate, translateTo.getResource().getType(),
+                        novaNodeTemplate, context));
+        HeatToToscaUtil.mapBoolean(novaNodeTemplate, HeatToToscaUtil
+                .getToscaPropertyName(translateTo, HeatConstants.CONFIG_DRIVE_PROPERTY_NAME));
+        manageNovaServerNetwork(translateTo, novaNodeTemplate);
+        manageNovaServerBlockDeviceMapping(translateTo, novaNodeTemplate);
+        manageNovaServerGroupMapping(translateTo, novaNodeTemplate);
+        DataModelUtil.addNodeTemplate(serviceTemplate, translateTo.getTranslatedId(), novaNodeTemplate);
+    }
 
+    private void manageNovaServerGroupMapping(TranslateTo translateTo,
+                                              NodeTemplate novaNodeTemplate) {
+        Map<String, Object> properties = translateTo.getResource().getProperties();
+        if (isSchedulerHintsPropExist(properties)) {
+            Object schedulerHints = properties.get(ResourceReferenceFunctions.SCHEDULER_HINTS.getFunction());
+            if (schedulerHints instanceof Map) {
+                addServerGroupHintsToPoliciesGroups(translateTo,
+                        novaNodeTemplate, (Map<String, Object>) schedulerHints);
+            } else {
+                logger.warn("'scheduler_hints' property of resource '{}' is not valid. This property should be a map",
+                        translateTo.getResourceId());
+            }
+        }
+    }
 
-public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase {
-  protected static Logger logger =
-      (Logger) LoggerFactory.getLogger(ResourceTranslationNovaServerImpl.class);
-
-  @Override
-  protected void translate(TranslateTo translateTo) {
-    TranslationContext context = translateTo.getContext();
-    Map<String, Object> properties = translateTo.getResource().getProperties();
-    String heatFileName = translateTo.getHeatFileName();
-
-    ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
-    String nodeTypeRef = createLocalNodeType(serviceTemplate, translateTo.getResource(),
-        translateTo.getResourceId(), translateTo.getTranslatedId(), context);
-
-    //create compute in consolidation data
-    ConsolidationDataUtil.getComputeTemplateConsolidationData(context, serviceTemplate,
-        nodeTypeRef, translateTo.getTranslatedId());
-
-    NodeTemplate novaNodeTemplate = new NodeTemplate();
-    novaNodeTemplate.setType(nodeTypeRef);
-    HeatOrchestrationTemplate heatOrchestrationTemplate =
-        translateTo.getHeatOrchestrationTemplate();
-    novaNodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter
-        .getToscaPropertiesSimpleConversion(serviceTemplate, translateTo.getResourceId(),
-            properties, novaNodeTemplate.getProperties(), heatFileName,
-            heatOrchestrationTemplate, translateTo.getResource().getType(),
-            novaNodeTemplate, context));
-
-    HeatToToscaUtil.mapBoolean(novaNodeTemplate, HeatToToscaUtil
-        .getToscaPropertyName(translateTo, HeatConstants.CONFIG_DRIVE_PROPERTY_NAME));
-
-    manageNovaServerNetwork(translateTo, novaNodeTemplate);
-    manageNovaServerBlockDeviceMapping(translateTo, novaNodeTemplate);
-    manageNovaServerGroupMapping(translateTo, context, properties, heatFileName, serviceTemplate,
-        novaNodeTemplate, heatOrchestrationTemplate);
-    DataModelUtil.addNodeTemplate(serviceTemplate, translateTo.getTranslatedId(), novaNodeTemplate);
-  }
-
-  private void manageNovaServerGroupMapping(TranslateTo translateTo, TranslationContext context,
-                                            Map<String, Object> properties, String heatFileName,
-                                            ServiceTemplate serviceTemplate,
-                                            NodeTemplate novaNodeTemplate,
-                                            HeatOrchestrationTemplate heatOrchestrationTemplate) {
-    if (isSchedulerHintsPropExist(properties)) {
-      Object schedulerHints = properties.get("scheduler_hints");
-      if (schedulerHints instanceof Map) {
-        addServerGroupHintsToPoliciesGroups(translateTo, context, heatFileName, serviceTemplate,
-            novaNodeTemplate, heatOrchestrationTemplate, (Map<String, Object>) schedulerHints);
-      } else {
-        logger.warn("'scheduler_hints' property of resource '" + translateTo.getResourceId()
-            + "' is not valid. This property should be a map");
-      }
+    private void addServerGroupHintsToPoliciesGroups(TranslateTo translateTo,
+                                                     NodeTemplate novaNodeTemplate,
+                                                     Map<String, Object> schedulerHints) {
+        for (Object hint : schedulerHints.values()) {
+            Optional<AttachedResourceId> attachedResourceId = HeatToToscaUtil
+                    .extractAttachedResourceId(translateTo.getHeatFileName(), translateTo
+                            .getHeatOrchestrationTemplate(), translateTo.getContext(), hint);
+            if (attachedResourceId.isPresent()) {
+                AttachedResourceId serverGroupResourceId = attachedResourceId.get();
+                Object serverGroupResourceToTranslate = serverGroupResourceId.getEntityId();
+                if (serverGroupResourceId.isGetResource()) {
+                    addServerGroupHintGetResource(translateTo, novaNodeTemplate, serverGroupResourceToTranslate);
+                } else if (serverGroupResourceId.isGetParam() && serverGroupResourceToTranslate instanceof String) {
+                    addServerGroupHintGetParam(translateTo, novaNodeTemplate, serverGroupResourceToTranslate);
+                }
+            }
+        }
     }
-  }
-
-  private void addServerGroupHintsToPoliciesGroups(TranslateTo translateTo,
-                                                   TranslationContext context, String heatFileName,
-                                                   ServiceTemplate serviceTemplate,
-                                                   NodeTemplate novaNodeTemplate,
-                                                   HeatOrchestrationTemplate
-                                                       heatOrchestrationTemplate,
-                                                   Map<String, Object> schedulerHints) {
-    for (Object hint : schedulerHints.values()) {
-      Optional<AttachedResourceId> attachedResourceId = HeatToToscaUtil
-          .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context, hint);
-      if (attachedResourceId.isPresent()) {
-        AttachedResourceId serverGroupResourceId = attachedResourceId.get();
-        Object serverGroupResourceToTranslate = serverGroupResourceId.getEntityId();
-        if (serverGroupResourceId.isGetResource()) {
-          boolean isHintOfTypeNovaServerGroup =
-              isHintOfTypeNovaServerGroup(heatOrchestrationTemplate,
-                  serverGroupResourceToTranslate);
-          if (isHintOfTypeNovaServerGroup) {
-            addNovaServerToPolicyGroup(translateTo, context, heatFileName, serviceTemplate,
-                heatOrchestrationTemplate, (String) serverGroupResourceToTranslate,
-                novaNodeTemplate);
-          }
-        } else if (serverGroupResourceId.isGetParam()
-            && serverGroupResourceToTranslate instanceof String) {
-          TranslatedHeatResource
-              translatedServerGroupResource =
-              context.getHeatSharedResourcesByParam().get(serverGroupResourceToTranslate);
-          if (Objects.nonNull(translatedServerGroupResource)
-              && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())
-              && isResourceTypeServerGroup(translatedServerGroupResource)) {
+
+    private void addServerGroupHintGetParam(TranslateTo translateTo, NodeTemplate novaNodeTemplate,
+                                            Object serverGroupResourceToTranslate) {
+        TranslatedHeatResource translatedServerGroupResource = translateTo.getContext()
+                .getHeatSharedResourcesByParam().get(serverGroupResourceToTranslate);
+        if (Objects.nonNull(translatedServerGroupResource)
+                && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())
+                && isResourceTypeServerGroup(translatedServerGroupResource)) {
             Map<String, GroupDefinition> groups =
-                serviceTemplate.getTopology_template().getGroups();
-            if(MapUtils.isNotEmpty(groups) && Objects.nonNull(groups.get(translatedServerGroupResource
-                .getTranslatedId()))) {
-              groups
-                  .get(translatedServerGroupResource.getTranslatedId()).getMembers()
-                  .add(translateTo.getTranslatedId());
-              //Add group Id to compute consolidation data
-              updateComputeConsolidationDataGroup(translateTo, novaNodeTemplate,
-                  translatedServerGroupResource.getTranslatedId());
+                    translateTo.getServiceTemplate().getTopology_template().getGroups();
+            if (MapUtils.isNotEmpty(groups) && Objects.nonNull(groups.get(translatedServerGroupResource
+                    .getTranslatedId()))) {
+                groups.get(translatedServerGroupResource.getTranslatedId()).getMembers()
+                        .add(translateTo.getTranslatedId());
+                //Add group Id to compute consolidation data
+                updateComputeConsolidationDataGroup(translateTo, novaNodeTemplate,
+                        translatedServerGroupResource.getTranslatedId());
             }
-          }
         }
-      }
     }
-  }
-
-  private boolean isResourceTypeServerGroup(TranslatedHeatResource translatedServerGroupResource) {
-    return translatedServerGroupResource.getHeatResource().getType().equals(HeatResourcesTypes.NOVA_SERVER_GROUP_RESOURCE_TYPE.getHeatResource());
-  }
-
-  private void updateComputeConsolidationDataGroup(TranslateTo translateTo,
-                                                   NodeTemplate novaNodeTemplate,
-                                                   String groupId) {
-    TranslationContext translationContext = translateTo.getContext();
-    ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
-    ComputeTemplateConsolidationData computeTemplateConsolidationData = ConsolidationDataUtil
-        .getComputeTemplateConsolidationData(translationContext, serviceTemplate,
-            novaNodeTemplate.getType(),
-            translateTo.getTranslatedId());
-    ConsolidationDataUtil.updateGroupIdInConsolidationData(computeTemplateConsolidationData,
-        groupId);
-  }
-
-  private boolean isHintOfTypeNovaServerGroup(HeatOrchestrationTemplate heatOrchestrationTemplate,
-                                              Object resourceToTranslate) {
-    return heatOrchestrationTemplate.getResources().get(resourceToTranslate).getType()
-        .equals(HeatResourcesTypes.NOVA_SERVER_GROUP_RESOURCE_TYPE.getHeatResource());
-  }
-
-  private void addNovaServerToPolicyGroup(TranslateTo translateTo, TranslationContext context,
-                                          String heatFileName, ServiceTemplate serviceTemplate,
-                                          HeatOrchestrationTemplate heatOrchestrationTemplate,
-                                          String resourceToTranslate,
-                                          NodeTemplate novaNodeTemplate) {
-    Resource serverGroup =
-        HeatToToscaUtil.getResource(heatOrchestrationTemplate, resourceToTranslate, heatFileName);
-    Optional<String> serverGroupTranslatedId = ResourceTranslationFactory.getInstance(serverGroup)
-        .translateResource(heatFileName, serviceTemplate, heatOrchestrationTemplate, serverGroup,
-            resourceToTranslate, context);
-    if (serverGroupTranslatedId.isPresent()) {
-      serviceTemplate.getTopology_template().getGroups().get(serverGroupTranslatedId.get())
-          .getMembers().add(translateTo.getTranslatedId());
-      updateComputeConsolidationDataGroup(translateTo, novaNodeTemplate,
-          serverGroupTranslatedId.get());
 
+    private void addServerGroupHintGetResource(TranslateTo translateTo, NodeTemplate novaNodeTemplate,
+                                               Object serverGroupResourceToTranslate) {
+        boolean isHintOfTypeNovaServerGroup = isHintOfTypeNovaServerGroup(translateTo
+                .getHeatOrchestrationTemplate(), serverGroupResourceToTranslate);
+        if (isHintOfTypeNovaServerGroup) {
+            addNovaServerToPolicyGroup(translateTo, (String) serverGroupResourceToTranslate, novaNodeTemplate);
+        }
     }
-  }
-
-  private boolean isSchedulerHintsPropExist(Map<String, Object> properties) {
-    return !MapUtils.isEmpty(properties) && Objects.nonNull(properties.get("scheduler_hints"));
-  }
-
-  private void manageNovaServerBlockDeviceMapping(TranslateTo translateTo,
-                                                  NodeTemplate novaNodeTemplate) {
-    String heatFileName = translateTo.getHeatFileName();
-    TranslationContext context = translateTo.getContext();
-    ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
-    Resource resource = translateTo.getResource();
-    String resourceId = translateTo.getResourceId();
-    String novaServerTranslatedId = translateTo.getTranslatedId();
-    HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo
-        .getHeatOrchestrationTemplate();
-    List<Map<String, Object>> blockDeviceMappingList = getBlockDeviceMappingList(resource);
-    if (CollectionUtils.isEmpty(blockDeviceMappingList)) {
-      return;
+
+    private boolean isResourceTypeServerGroup(TranslatedHeatResource translatedServerGroupResource) {
+        return translatedServerGroupResource.getHeatResource().getType()
+                .equals(HeatResourcesTypes.NOVA_SERVER_GROUP_RESOURCE_TYPE.getHeatResource());
     }
 
-    Object volumeIdObject;
-    Object snapshotIdObject;
-    String volumeResourceId;
-    int index = 0;
-    for (Map<String, Object> blockDeviceMapping : blockDeviceMappingList) {
-      volumeIdObject = blockDeviceMapping.get("volume_id");
-      snapshotIdObject = blockDeviceMapping.get("snapshot_id");
-
-      if (volumeIdObject == null && snapshotIdObject == null) {
-        logger.warn("Resource '" + resourceId
-            + "' has block_device_mapping property with empty/missing volume_id and snapshot_id "
-            + "properties. Entry number "
-            + (index + 1) + ", this entry will be ignored in TOSCA translation.");
-        index++;
-        continue;
-      }
-      if (volumeIdObject == null) {
-        Optional<AttachedResourceId> attachedSnapshotId = HeatToToscaUtil
-            .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context,
-                snapshotIdObject);
-        if (attachedSnapshotId.isPresent()) {
-          volumeResourceId = novaServerTranslatedId + "_" + attachedSnapshotId.get().getEntityId();
-          String deviceName = (String) blockDeviceMapping.get("device_name");
-          String relationshipId = novaServerTranslatedId + "_" + index;
-
-          createVolumeAttachesToRelationship(serviceTemplate, deviceName, novaServerTranslatedId,
-              volumeResourceId, relationshipId);
-          createCinderVolumeNodeTemplate(serviceTemplate, translateTo.getResourceId(),
-              volumeResourceId, heatFileName, blockDeviceMapping, heatOrchestrationTemplate,
-              context);
-          connectNovaServerToVolume(novaNodeTemplate, volumeResourceId, relationshipId,
-              translateTo);
+    private void updateComputeConsolidationDataGroup(TranslateTo translateTo,
+                                                     NodeTemplate novaNodeTemplate,
+                                                     String groupId) {
+        TranslationContext translationContext = translateTo.getContext();
+        ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
+        ComputeTemplateConsolidationData computeTemplateConsolidationData = ConsolidationDataUtil
+                .getComputeTemplateConsolidationData(translationContext, serviceTemplate,
+                        novaNodeTemplate.getType(), translateTo.getTranslatedId());
+        ConsolidationDataUtil.updateGroupIdInConsolidationData(computeTemplateConsolidationData, groupId);
+    }
+
+    private boolean isHintOfTypeNovaServerGroup(HeatOrchestrationTemplate heatOrchestrationTemplate,
+                                                Object resourceToTranslate) {
+        return heatOrchestrationTemplate.getResources().get(resourceToTranslate).getType()
+                .equals(HeatResourcesTypes.NOVA_SERVER_GROUP_RESOURCE_TYPE.getHeatResource());
+    }
+
+    private void addNovaServerToPolicyGroup(TranslateTo translateTo,
+                                            String resourceToTranslate,
+                                            NodeTemplate novaNodeTemplate) {
+        Resource serverGroup =
+                HeatToToscaUtil.getResource(translateTo.getHeatOrchestrationTemplate(), resourceToTranslate,
+                        translateTo.getHeatFileName());
+        Optional<String> serverGroupTranslatedId = ResourceTranslationFactory.getInstance(serverGroup)
+                .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(),
+                        translateTo.getHeatOrchestrationTemplate(), serverGroup, resourceToTranslate,
+                        translateTo.getContext());
+        if (serverGroupTranslatedId.isPresent()) {
+            translateTo.getServiceTemplate().getTopology_template().getGroups().get(serverGroupTranslatedId.get())
+                    .getMembers().add(translateTo.getTranslatedId());
+            updateComputeConsolidationDataGroup(translateTo, novaNodeTemplate, serverGroupTranslatedId.get());
+        }
+    }
+
+    private boolean isSchedulerHintsPropExist(Map<String, Object> properties) {
+        return !MapUtils.isEmpty(properties)
+                && Objects.nonNull(properties.get(ResourceReferenceFunctions.SCHEDULER_HINTS.getFunction()));
+    }
+
+    private void manageNovaServerBlockDeviceMapping(TranslateTo translateTo,
+                                                    NodeTemplate novaNodeTemplate) {
+        Resource resource = translateTo.getResource();
+        List<Map<String, Object>> blockDeviceMappingList = getBlockDeviceMappingList(resource);
+        if (CollectionUtils.isEmpty(blockDeviceMappingList)) {
+            return;
+        }
+        int index = 0;
+        for (Map<String, Object> blockDeviceMapping : blockDeviceMappingList) {
+            index = connectBlockDeviceToNovaServer(translateTo, novaNodeTemplate, index, blockDeviceMapping);
+        }
+    }
+
+    private int connectBlockDeviceToNovaServer(TranslateTo translateTo, NodeTemplate novaNodeTemplate, int index,
+                                               Map<String, Object> blockDeviceMapping) {
+        Object volumeIdObject = blockDeviceMapping.get(VOL_ID_PROPERTY_NAME);
+        Object snapshotIdObject = blockDeviceMapping.get(SNAPSHOT_ID_PROPERTY_NAME);
+
+        if (volumeIdObject == null && snapshotIdObject == null) {
+            logger.warn("Resource '{}' has block_device_mapping property with empty/missing volume_id and snapshot_id "
+                    + "properties. Entry number {}, this entry will be ignored in TOSCA translation.",
+                    translateTo.getResourceId(), (index + 1));
+            index++;
+            return index;
+        }
+        if (volumeIdObject == null) {
+            connectBlockDeviceUsingSnapshotId(translateTo, novaNodeTemplate, snapshotIdObject, index,
+                    blockDeviceMapping);
+        } else {
+            connectBlockDeviceUsingVolumeId(translateTo, novaNodeTemplate, volumeIdObject);
         }
-      } else {
+        index++;
+        return index;
+    }
+
+    private void connectBlockDeviceUsingVolumeId(TranslateTo translateTo, NodeTemplate novaNodeTemplate,
+                                                 Object volumeIdObject) {
         Optional<AttachedResourceId> attachedVolumeId = HeatToToscaUtil
-            .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context,
-                volumeIdObject);
+                .extractAttachedResourceId(translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(),
+                        translateTo.getContext(), volumeIdObject);
         if (attachedVolumeId.isPresent() && attachedVolumeId.get().isGetResource()) {
-          connectNovaServerToVolume(novaNodeTemplate,
-              (String) attachedVolumeId.get().getTranslatedId(), null, translateTo);
+            connectNovaServerToVolume(novaNodeTemplate, (String) attachedVolumeId.get().getTranslatedId(), null,
+                    translateTo);
         }
-      }
-      index++;
     }
-  }
-
-  private void connectNovaServerToVolume(NodeTemplate novaNodeTemplate, String volumeResourceId,
-                                         String relationshipId, TranslateTo translateTo) {
-    RequirementAssignment requirementAssignment = new RequirementAssignment();
-    requirementAssignment.setCapability(ToscaCapabilityType.NATIVE_ATTACHMENT);
-    requirementAssignment.setNode(volumeResourceId);
-    if (relationshipId != null) {
-      requirementAssignment.setRelationship(relationshipId);
-    } else {
-      requirementAssignment
-          .setRelationship(ToscaRelationshipType.NATIVE_ATTACHES_TO);
+
+    private void connectBlockDeviceUsingSnapshotId(TranslateTo translateTo, NodeTemplate novaNodeTemplate,
+                                                   Object snapshotIdObject, int index,
+                                                   Map<String, Object> blockDeviceMapping) {
+        String novaServerTranslatedId = translateTo.getTranslatedId();
+        String volumeResourceId;
+        Optional<AttachedResourceId> attachedSnapshotId = HeatToToscaUtil
+                .extractAttachedResourceId(translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(),
+                        translateTo.getContext(), snapshotIdObject);
+        if (attachedSnapshotId.isPresent()) {
+            volumeResourceId = novaServerTranslatedId + "_" + attachedSnapshotId.get().getEntityId();
+            String deviceName = (String) blockDeviceMapping.get(BLOCK_DEVICE_MAPPING_DEVICE_NAME);
+            String relationshipId = novaServerTranslatedId + "_" + index;
+            createVolumeAttachesToRelationship(translateTo.getServiceTemplate(), deviceName, novaServerTranslatedId,
+                    volumeResourceId, relationshipId);
+            createCinderVolumeNodeTemplate(translateTo, volumeResourceId, blockDeviceMapping);
+            connectNovaServerToVolume(novaNodeTemplate, volumeResourceId, relationshipId,
+                    translateTo);
+        }
     }
-    DataModelUtil
-        .addRequirementAssignment(novaNodeTemplate, ToscaConstants.LOCAL_STORAGE_REQUIREMENT_ID,
-            requirementAssignment);
-    //Add volume consolidation data
-    ConsolidationDataUtil.updateComputeConsolidationDataVolumes(translateTo, novaNodeTemplate
-            .getType(), translateTo.getTranslatedId(), ToscaConstants.LOCAL_STORAGE_REQUIREMENT_ID,
-        requirementAssignment);
-  }
-
-  private void createCinderVolumeNodeTemplate(ServiceTemplate serviceTemplate, String resourceId,
-                                              String volumeResourceId, String heatFileName,
-                                              Map<String, Object> blockDeviceMapping,
-                                              HeatOrchestrationTemplate heatOrchestrationTemplate,
-                                              TranslationContext context) {
-    NodeTemplate cinderVolumeNodeTemplate = new NodeTemplate();
-    cinderVolumeNodeTemplate.setType(ToscaNodeType.CINDER_VOLUME);
-    cinderVolumeNodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter
-        .getToscaPropertiesSimpleConversion(serviceTemplate, resourceId, blockDeviceMapping, null,
-            heatFileName, heatOrchestrationTemplate,
-            HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource(),
-            cinderVolumeNodeTemplate, context));
-    DataModelUtil.addNodeTemplate(serviceTemplate, volumeResourceId, cinderVolumeNodeTemplate);
-  }
-
-  private void createVolumeAttachesToRelationship(ServiceTemplate serviceTemplate,
-                                                  String deviceName, String novaServerTranslatedId,
-                                                  String volumeId, String relationshipId) {
-    RelationshipTemplate relationshipTemplate = new RelationshipTemplate();
-    relationshipTemplate.setType(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO);
-    Map<String, Object> properties = new HashMap<>();
-    properties.put("instance_uuid", novaServerTranslatedId);
-    properties.put("volume_id", volumeId);
-    if (deviceName != null) {
-      properties.put("device", deviceName);
+
+    private void connectNovaServerToVolume(NodeTemplate novaNodeTemplate, String volumeResourceId,
+                                           String relationshipId, TranslateTo translateTo) {
+        RequirementAssignment requirementAssignment = new RequirementAssignment();
+        requirementAssignment.setCapability(ToscaCapabilityType.NATIVE_ATTACHMENT);
+        requirementAssignment.setNode(volumeResourceId);
+        if (relationshipId != null) {
+            requirementAssignment.setRelationship(relationshipId);
+        } else {
+            requirementAssignment
+                    .setRelationship(ToscaRelationshipType.NATIVE_ATTACHES_TO);
+        }
+        DataModelUtil.addRequirementAssignment(novaNodeTemplate, ToscaConstants.LOCAL_STORAGE_REQUIREMENT_ID,
+                requirementAssignment);
+        //Add volume consolidation data
+        ConsolidationDataUtil.updateComputeConsolidationDataVolumes(translateTo, novaNodeTemplate.getType(),
+                translateTo.getTranslatedId(), ToscaConstants.LOCAL_STORAGE_REQUIREMENT_ID, requirementAssignment);
     }
-    relationshipTemplate.setProperties(properties);
 
-    DataModelUtil.addRelationshipTemplate(serviceTemplate, relationshipId, relationshipTemplate);
-  }
+    private void createCinderVolumeNodeTemplate(TranslateTo translateTo,
+                                                String volumeResourceId,
+                                                Map<String, Object> blockDeviceMapping) {
+        NodeTemplate cinderVolumeNodeTemplate = new NodeTemplate();
+        cinderVolumeNodeTemplate.setType(ToscaNodeType.CINDER_VOLUME);
+        cinderVolumeNodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter
+                .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(), translateTo.getResourceId(),
+                        blockDeviceMapping, null,
+                        translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(),
+                        HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource(),
+                        cinderVolumeNodeTemplate, translateTo.getContext()));
+        DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), volumeResourceId, cinderVolumeNodeTemplate);
+    }
 
-  private List<Map<String, Object>> getBlockDeviceMappingList(Resource resource) {
-    if (Objects.isNull(resource.getProperties())) {
-      return Collections.emptyList();
+    private void createVolumeAttachesToRelationship(ServiceTemplate serviceTemplate,
+                                                    String deviceName, String novaServerTranslatedId,
+                                                    String volumeId, String relationshipId) {
+        RelationshipTemplate relationshipTemplate = new RelationshipTemplate();
+        relationshipTemplate.setType(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO);
+        Map<String, Object> properties = new HashMap<>();
+        properties.put(ToscaConstants.INSTANCE_UUID_PROPERTY_NAME, novaServerTranslatedId);
+        properties.put(ToscaConstants.VOL_ID_PROPERTY_NAME, volumeId);
+        if (deviceName != null) {
+            properties.put(VOL_ATTACH_DEVICE_PROPERTY_NAME, deviceName);
+        }
+        relationshipTemplate.setProperties(properties);
+        DataModelUtil.addRelationshipTemplate(serviceTemplate, relationshipId, relationshipTemplate);
     }
-    List<Map<String, Object>> blockDeviceMappingList =
-        (List<Map<String, Object>>) resource.getProperties().get("block_device_mapping");
-    List<Map<String, Object>> blockDeviceMappingV2List =
-        (List<Map<String, Object>>) resource.getProperties().get("block_device_mapping_v2");
-
-    if (blockDeviceMappingList != null && blockDeviceMappingV2List != null) {
-      blockDeviceMappingList.addAll(blockDeviceMappingV2List);
-    } else if (CollectionUtils.isEmpty(blockDeviceMappingList)
-        && CollectionUtils.isEmpty(blockDeviceMappingV2List)) {
-      return null;
-
-    } else {
-      blockDeviceMappingList =
-          blockDeviceMappingList != null ? blockDeviceMappingList : blockDeviceMappingV2List;
+
+    private List<Map<String, Object>> getBlockDeviceMappingList(Resource resource) {
+        if (Objects.isNull(resource.getProperties())) {
+            return Collections.emptyList();
+        }
+        List<Map<String, Object>> blockDeviceMappingList =
+                (List<Map<String, Object>>) resource.getProperties().get(HeatConstants.BLOCK_DEVICE_MAPPING);
+        List<Map<String, Object>> blockDeviceMappingV2List =
+                (List<Map<String, Object>>) resource.getProperties().get(HeatConstants.BLOCK_DEVICE_MAPPING_V2);
+
+        if (blockDeviceMappingList != null && blockDeviceMappingV2List != null) {
+            blockDeviceMappingList.addAll(blockDeviceMappingV2List);
+        } else if (CollectionUtils.isEmpty(blockDeviceMappingList)
+                && CollectionUtils.isEmpty(blockDeviceMappingV2List)) {
+            return Collections.emptyList();
+
+        } else {
+            blockDeviceMappingList =
+                    blockDeviceMappingList != null ? blockDeviceMappingList : blockDeviceMappingV2List;
+        }
+        return blockDeviceMappingList;
     }
-    return blockDeviceMappingList;
-  }
 
-  private void manageNovaServerNetwork(TranslateTo translateTo,
-                                       NodeTemplate novaNodeTemplate) {
-    Resource resource = translateTo.getResource();
-    String translatedId = translateTo.getTranslatedId();
+    private void manageNovaServerNetwork(TranslateTo translateTo,
+                                         NodeTemplate novaNodeTemplate) {
+        Resource resource = translateTo.getResource();
+        String translatedId = translateTo.getTranslatedId();
 
-    if (resource.getProperties() == null) {
-      return;
-    }
-    Object networks = resource.getProperties().get("networks");
-    if(Objects.isNull(networks)
-        || !(networks instanceof List)){
-      return;
-    }
+        if (resource.getProperties() == null) {
+            return;
+        }
+        Object networks = resource.getProperties().get(PropertiesMapKeyTypes.NETWORKS.getKeyMap());
+        if (Objects.isNull(networks) || !(networks instanceof List)) {
+            return;
+        }
+
+        List<Map<String, Object>> heatNetworkList = (List<Map<String, Object>>) networks;
 
-    List<Map<String, Object>> heatNetworkList =
-        (List<Map<String, Object>>) networks;
+        for (Map<String, Object> heatNetwork : heatNetworkList) {
+            getOrTranslatePortTemplate(translateTo, heatNetwork.get(
+                    Constants.PORT_PROPERTY_NAME), translatedId, novaNodeTemplate);
+        }
+    }
 
-    for (Map<String, Object> heatNetwork : heatNetworkList) {
-      getOrTranslatePortTemplate(translateTo, heatNetwork.get(
-          Constants.PORT_PROPERTY_NAME), translatedId, novaNodeTemplate);
+    private void getOrTranslatePortTemplate(TranslateTo translateTo,
+                                            Object port,
+                                            String novaServerResourceId,
+                                            NodeTemplate novaNodeTemplate) {
+        String heatFileName = translateTo.getHeatFileName();
+        HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo.getHeatOrchestrationTemplate();
+        TranslationContext context = translateTo.getContext();
+        Optional<AttachedResourceId> attachedPortId = HeatToToscaUtil
+                .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context, port);
+        if (!attachedPortId.isPresent() || !attachedPortId.get().isGetResource()) {
+            return;
+        }
+        String resourceId = (String) attachedPortId.get().getEntityId();
+        Resource portResource = HeatToToscaUtil.getResource(heatOrchestrationTemplate, resourceId, heatFileName);
+        if (!isSupportedPortResource(portResource)) {
+            logger.warn("NovaServer connect to port resource with id : {} and type : {}. This resource type is not "
+                           + "supported, therefore the connection to the port is ignored. Supported types are: {}, {}",
+                    resourceId, portResource.getType(), HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(),
+                    HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource());
+            return;
+        } else if (HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE
+                .getHeatResource().equals(portResource.getType())) {
+            Map<String, Object> properties = portResource.getProperties();
+            if (!MapUtils.isEmpty(properties) && Objects.nonNull(properties.get(HeatConstants.PORT_TUPLE_REFS))) {
+                novaNodeTemplate.getProperties().put(ToscaConstants.CONTRAIL_SERVICE_INSTANCE_IND, true);
+            }
+        }
+        ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
+        Optional<String> translatedPortId = ResourceTranslationFactory.getInstance(portResource)
+                .translateResource(heatFileName, serviceTemplate, heatOrchestrationTemplate, portResource,
+                        resourceId, context);
+        if (translatedPortId.isPresent()) {
+            NodeTemplate portNodeTemplate =
+                    DataModelUtil.getNodeTemplate(serviceTemplate, translatedPortId.get());
+            DataModelUtil.addBindingReqFromPortToCompute(novaServerResourceId, portNodeTemplate);
+            // Add ports
+            ConsolidationDataUtil.updatePortInConsolidationData(translateTo, novaNodeTemplate.getType(), resourceId,
+                    portResource.getType(), translatedPortId.get());
+        } else {
+            logger.warn("NovaServer connect to port resource with id : {} and type : {}. This resource type is not "
+                    + "supported, therefore the connection to the port is ignored.", resourceId, portResource
+                    .getType());
+        }
     }
-  }
-
-  private void getOrTranslatePortTemplate(TranslateTo translateTo,
-                                          Object port,
-                                          String novaServerResourceId,
-                                          NodeTemplate novaNodeTemplate) {
-    String heatFileName = translateTo.getHeatFileName();
-    HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo
-        .getHeatOrchestrationTemplate();
-    ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
-    TranslationContext context = translateTo.getContext();
-
-    Optional<AttachedResourceId> attachedPortId = HeatToToscaUtil
-        .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context, port);
-
-    if (!attachedPortId.isPresent()) {
-      return;
+
+    private boolean isSupportedPortResource(Resource portResource) {
+        return Arrays.asList(HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(),
+                HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource())
+                .contains(portResource.getType());
     }
 
-    if (attachedPortId.get().isGetResource()) {
-      String resourceId = (String) attachedPortId.get().getEntityId();
-      Resource portResource =
-          HeatToToscaUtil.getResource(heatOrchestrationTemplate, resourceId, heatFileName);
-      if (!Arrays.asList(HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(),
-          HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource())
-          .contains(portResource.getType())) {
-        logger.warn("NovaServer connect to port resource with id : " + resourceId + " and type : "
-            + portResource.getType()
-            + ". This resource type is not supported, therefore the connection to the port is "
-            + "ignored. Supported types are: "
-            + HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource() + ", "
-            + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE
-            .getHeatResource());
-        return;
-      } else if (HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE
-          .getHeatResource().equals(portResource.getType())) {
-        Map<String, Object> properties = portResource.getProperties();
-        if (!MapUtils.isEmpty(properties) && Objects.nonNull(properties.get("port_tuple_refs"))) {
-          novaNodeTemplate.getProperties().put("contrail_service_instance_ind", true);
+
+    private String createLocalNodeType(ServiceTemplate serviceTemplate, Resource resource,
+                                       String resourceId, String translatedId) {
+        NameExtractor nodeTypeNameExtractor = TranslationContext.getNameExtractorImpl(resource.getType());
+        String nodeTypeName =
+                nodeTypeNameExtractor.extractNodeTypeName(resource, resourceId, translatedId);
+
+        if (!isNodeTypeCreated(serviceTemplate, nodeTypeName)) {
+            DataModelUtil.addNodeType(serviceTemplate, nodeTypeName, createNodeType());
         }
-      }
-      Optional<String> translatedPortId = ResourceTranslationFactory.getInstance(portResource)
-          .translateResource(heatFileName, serviceTemplate, heatOrchestrationTemplate, portResource,
-              resourceId, context);
-      if (translatedPortId.isPresent()) {
-        NodeTemplate portNodeTemplate =
-            DataModelUtil.getNodeTemplate(serviceTemplate, translatedPortId.get());
-        DataModelUtil.addBindingReqFromPortToCompute(novaServerResourceId, portNodeTemplate);
-
-        // Add ports
-        ConsolidationDataUtil.updatePortInConsolidationData(translateTo, novaNodeTemplate.getType(), resourceId,
-            portResource.getType(), translatedPortId.get());
-      } else {
-        logger.warn("NovaServer connect to port resource with id : " + resourceId + " and type : "
-            + portResource.getType()
-            + ". This resource type is not supported, therefore the connection to the port is "
-            + "ignored.");
-      }
+        return nodeTypeName;
     }
-  }
 
+    /**
+     * Get property Regex matcher list.
+     *
+     * @return Regex expression per nova resource property, while nova node type name is consider when
+     *      setting the name value.
+     */
+    public List<PropertyRegexMatcher> getPropertyRegexMatchersForNovaNodeType() {
+        List<PropertyRegexMatcher> propertyRegexMatchers = new ArrayList<>(3);
+        propertyRegexMatchers
+                .add(new PropertyRegexMatcher(Constants.NAME_PROPERTY_NAME,
+                        Arrays.asList(".+_name$", ".+_names$", ".+_name_[0-9]+"), "_name"));
+        propertyRegexMatchers
+                .add(new PropertyRegexMatcher("image", Collections.singletonList(".+_image_name$"),
+                        "_image_name"));
+        propertyRegexMatchers
+                .add(new PropertyRegexMatcher("flavor", Collections.singletonList(".+_flavor_name$"),
+                        "_flavor_name"));
+        return propertyRegexMatchers;
+    }
 
-  private String createLocalNodeType(ServiceTemplate serviceTemplate, Resource resource, String
-      resourceId,
-                                     String translatedId, TranslationContext context) {
-    NameExtractor nodeTypeNameExtractor = context.getNameExtractorImpl(resource.getType());
-    String nodeTypeName =
-        nodeTypeNameExtractor.extractNodeTypeName(resource, resourceId, translatedId);
+    private boolean isNodeTypeCreated(ServiceTemplate serviceTemplate, String nodeTypeName) {
+        return !MapUtils.isEmpty(serviceTemplate.getNode_types())
+                && Objects.nonNull(serviceTemplate.getNode_types().get(nodeTypeName));
+    }
 
-    if (!isNodeTypeCreated(serviceTemplate, nodeTypeName)) {
-      DataModelUtil.addNodeType(serviceTemplate, nodeTypeName, createNodeType());
+    private NodeType createNodeType() {
+        NodeType nodeType = new NodeType();
+        nodeType.setDerived_from(ToscaNodeType.NOVA_SERVER);
+        return nodeType;
     }
-    return nodeTypeName;
-  }
-
-  /**
-   * Get property Regx matcher list.
-   *
-   * @return Regex exprission per nova resource property, while nova node type name is consider when
-   * setting the name value.
-   */
-  public List<PropertyRegexMatcher> getPropertyRegexMatchersForNovaNodeType() {
-    List<PropertyRegexMatcher> propertyRegexMatchers = new ArrayList<>();
-    propertyRegexMatchers
-        .add(new PropertyRegexMatcher(Constants.NAME_PROPERTY_NAME,
-            Arrays.asList(".+_name$", ".+_names$", ".+_name_[0-9]+"), "_name"));
-    propertyRegexMatchers
-        .add(new PropertyRegexMatcher("image", Collections.singletonList(".+_image_name$"),
-            "_image_name"));
-    propertyRegexMatchers
-        .add(new PropertyRegexMatcher("flavor", Collections.singletonList(".+_flavor_name$"),
-            "_flavor_name"));
-    return propertyRegexMatchers;
-  }
-
-  private boolean isNodeTypeCreated(ServiceTemplate serviceTemplate, String nodeTypeName) {
-    return !MapUtils.isEmpty(serviceTemplate.getNode_types())
-        && Objects.nonNull(serviceTemplate.getNode_types().get(nodeTypeName));
-  }
-
-  private NodeType createNodeType() {
-    NodeType nodeType = new NodeType();
-    nodeType.setDerived_from(ToscaNodeType.NOVA_SERVER);
-    return nodeType;
-  }
 }