diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main')
-rw-r--r-- | openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ForwarderCapabilityHealer.java | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ForwarderCapabilityHealer.java b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ForwarderCapabilityHealer.java new file mode 100644 index 0000000000..038a0d889a --- /dev/null +++ b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ForwarderCapabilityHealer.java @@ -0,0 +1,121 @@ +package org.openecomp.sdc.healing.healers; + +import org.apache.commons.collections.MapUtils; +import org.openecomp.core.model.dao.ServiceModelDao; +import org.openecomp.core.model.dao.ServiceModelDaoFactory; +import org.openecomp.core.model.types.ServiceElement; +import org.openecomp.sdc.common.togglz.ToggleableFeature; +import org.openecomp.sdc.common.utils.SdcCommon; +import org.openecomp.sdc.healing.interfaces.Healer; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; +import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; +import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl; +import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesServiceTemplates; +import org.openecomp.sdc.versioning.dao.types.Version; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +public class ForwarderCapabilityHealer implements Healer { + + private MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); + + private final ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao = + ServiceModelDaoFactory.getInstance().createInterface(); + private static ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + private static final String FORWARDER_CAPABILITY_ID = "Forwarder"; + private static final String UNDERSCORE = "_"; + + @Override + public Object heal(Map<String, Object> healingParams) throws Exception { + String vspId = (String) healingParams.get(SdcCommon.VSP_ID); + Version version = (Version) healingParams.get(SdcCommon.VERSION); + + if(!ToggleableFeature.FORWARDER_CAPABILITY.isActive()) { + return Optional.empty(); + } + + ToscaServiceModel serviceModel = + serviceModelDao.getServiceModel(vspId, version); + + if (Objects.isNull(serviceModel) + || MapUtils.isEmpty(serviceModel.getServiceTemplates())) { + return Optional.empty(); + } + + addForwarderCapabilityToServiceModel(serviceModel); + serviceModelDao.deleteAll(vspId, version); + serviceModelDao.storeServiceModel(vspId, version, serviceModel); + + return Optional.of(serviceModel); + } + + private void addForwarderCapabilityToServiceModel(ToscaServiceModel serviceModel) { + serviceModel.getServiceTemplates().entrySet().stream().filter(serviceTemplateEntry -> Objects + .nonNull(serviceTemplateEntry.getValue())) + .forEach(serviceTemplateEntry -> handleServiceTemplate(serviceTemplateEntry.getValue(), + serviceModel)); + + handleGlobalTypes(serviceModel); + } + + private void handleGlobalTypes(ToscaServiceModel serviceModel) { + Map<String, ServiceTemplate> globalTypesServiceTemplates = + GlobalTypesServiceTemplates.getGlobalTypesServiceTemplates(); + + if (MapUtils.isEmpty(globalTypesServiceTemplates)) { + return; + } + + globalTypesServiceTemplates.entrySet() + .stream() + .filter(globalTypesServiceTemplateEntry -> Objects.nonNull + (globalTypesServiceTemplateEntry.getValue())) + .forEach(globalTypesServiceTemplateEntry -> serviceModel.addServiceTemplate + (globalTypesServiceTemplateEntry.getKey(), globalTypesServiceTemplateEntry.getValue())); + } + + private void handleServiceTemplate(ServiceTemplate serviceTemplate, + ToscaServiceModel toscaServiceModel) { + if (Objects.isNull(serviceTemplate.getTopology_template()) + || MapUtils.isEmpty(serviceTemplate.getTopology_template().getNode_templates())) { + return; + } + + Map<String, NodeTemplate> nodeTemplates = + serviceTemplate.getTopology_template().getNode_templates(); + + nodeTemplates.entrySet().stream() + .filter(nodeTemplateEntry -> + toscaAnalyzerService.isTypeOf(nodeTemplateEntry.getValue(), + ToscaNodeType.NATIVE_NETWORK_PORT, serviceTemplate, toscaServiceModel)) + .forEach(nodeTemplateEntry -> + addForwarderToSubstitutionMappings(nodeTemplateEntry.getKey(), serviceTemplate) + ); + } + + private void addForwarderToSubstitutionMappings(String portNodeTemplateId, + ServiceTemplate serviceTemplate) { + if (Objects.isNull(serviceTemplate.getTopology_template()) + || Objects.isNull(serviceTemplate.getTopology_template().getSubstitution_mappings())) { + return; + } + + List<String> substitutionMappingCapabilityList = + Arrays.asList(portNodeTemplateId, FORWARDER_CAPABILITY_ID); + + DataModelUtil.addSubstitutionMappingCapability( + serviceTemplate, + FORWARDER_CAPABILITY_ID + UNDERSCORE + portNodeTemplateId, + substitutionMappingCapabilityList); + + } +} |