Add collaboration feature
[sdc.git] / openecomp-be / lib / openecomp-healing-lib / openecomp-sdc-healing-impl / src / main / java / org / openecomp / sdc / healing / healers / ForwarderCapabilityHealer.java
1 package org.openecomp.sdc.healing.healers;
2
3 import org.apache.commons.collections.MapUtils;
4 import org.openecomp.core.model.dao.ServiceModelDao;
5 import org.openecomp.core.model.dao.ServiceModelDaoFactory;
6 import org.openecomp.core.model.types.ServiceElement;
7 import org.openecomp.sdc.common.togglz.ToggleableFeature;
8 import org.openecomp.sdc.healing.interfaces.Healer;
9 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
10 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
11 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
12 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
13 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
14 import org.openecomp.sdc.tosca.services.DataModelUtil;
15 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
16 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
17 import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesServiceTemplates;
18 import org.openecomp.sdc.versioning.dao.types.Version;
19
20 import java.util.Arrays;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.Objects;
24 import java.util.Optional;
25
26 public class ForwarderCapabilityHealer implements Healer {
27
28   private MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
29
30   private final ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao;
31   private static ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
32   private static final String FORWARDER_CAPABILITY_ID = "Forwarder";
33   private static final String UNDERSCORE = "_";
34
35   public ForwarderCapabilityHealer() {
36     this.serviceModelDao =
37         ServiceModelDaoFactory.getInstance().createInterface();
38   }
39
40   public ForwarderCapabilityHealer(ServiceModelDao<ToscaServiceModel, ServiceElement>
41                                        serviceModelDao,
42                                    ToscaAnalyzerService toscaAnalyzerService){
43     this.serviceModelDao = serviceModelDao;
44     this.toscaAnalyzerService = toscaAnalyzerService;
45   }
46
47   @Override
48   public Object heal(String vspId, Version version) throws Exception {
49     if(!ToggleableFeature.FORWARDER_CAPABILITY.isActive()) {
50       return Optional.empty();
51     }
52
53     ToscaServiceModel serviceModel =
54         serviceModelDao.getServiceModel(vspId, version);
55
56     if (Objects.isNull(serviceModel)
57         || MapUtils.isEmpty(serviceModel.getServiceTemplates())) {
58       return Optional.empty();
59     }
60
61     addForwarderCapabilityToServiceModel(serviceModel);
62     serviceModelDao.deleteAll(vspId, version);
63     serviceModelDao.storeServiceModel(vspId, version, serviceModel);
64
65     return Optional.of(serviceModel);
66   }
67
68   private void addForwarderCapabilityToServiceModel(ToscaServiceModel serviceModel) {
69     serviceModel.getServiceTemplates().entrySet().stream().filter(serviceTemplateEntry -> Objects
70         .nonNull(serviceTemplateEntry.getValue()))
71         .forEach(serviceTemplateEntry -> handleServiceTemplate(serviceTemplateEntry.getValue(),
72             serviceModel));
73
74     handleGlobalTypes(serviceModel);
75   }
76
77   private void handleGlobalTypes(ToscaServiceModel serviceModel) {
78     Map<String, ServiceTemplate> globalTypesServiceTemplates =
79         GlobalTypesServiceTemplates.getGlobalTypesServiceTemplates();
80
81     if (MapUtils.isEmpty(globalTypesServiceTemplates)) {
82       return;
83     }
84
85     globalTypesServiceTemplates.entrySet()
86         .stream()
87         .filter(globalTypesServiceTemplateEntry -> Objects.nonNull
88             (globalTypesServiceTemplateEntry.getValue()))
89         .forEach(globalTypesServiceTemplateEntry -> serviceModel.addServiceTemplate
90             (globalTypesServiceTemplateEntry.getKey(), globalTypesServiceTemplateEntry.getValue()));
91   }
92
93   private void handleServiceTemplate(ServiceTemplate serviceTemplate,
94                                      ToscaServiceModel toscaServiceModel) {
95     if (Objects.isNull(serviceTemplate.getTopology_template())
96         || MapUtils.isEmpty(serviceTemplate.getTopology_template().getNode_templates())) {
97       return;
98     }
99
100     Map<String, NodeTemplate> nodeTemplates =
101         serviceTemplate.getTopology_template().getNode_templates();
102
103     nodeTemplates.entrySet().stream()
104         .filter(nodeTemplateEntry ->
105             toscaAnalyzerService.isTypeOf(nodeTemplateEntry.getValue(),
106                 ToscaNodeType.NATIVE_NETWORK_PORT, serviceTemplate, toscaServiceModel))
107         .forEach(nodeTemplateEntry ->
108             addForwarderToSubstitutionMappings(nodeTemplateEntry.getKey(), serviceTemplate)
109         );
110   }
111
112   private void addForwarderToSubstitutionMappings(String portNodeTemplateId,
113                                                   ServiceTemplate serviceTemplate) {
114     if (Objects.isNull(serviceTemplate.getTopology_template())
115         || Objects.isNull(serviceTemplate.getTopology_template().getSubstitution_mappings())) {
116       return;
117     }
118
119     List<String> substitutionMappingCapabilityList =
120         Arrays.asList(portNodeTemplateId, FORWARDER_CAPABILITY_ID);
121
122     DataModelUtil.addSubstitutionMappingCapability(
123         serviceTemplate,
124         FORWARDER_CAPABILITY_ID + UNDERSCORE + portNodeTemplateId,
125         substitutionMappingCapabilityList);
126
127   }
128 }