diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerImpl.java')
1 files changed, 375 insertions, 389 deletions
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerImpl.java b/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 09439e2ea1..e865984468 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerImpl.java @@ -16,23 +16,37 @@ 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; - } } |