Simplified the return condition
[sdc.git] / openecomp-be / lib / openecomp-healing-lib / openecomp-sdc-healing-impl / src / main / java / org / openecomp / sdc / healing / healers / ForwarderCapabilityHealer.java
1 /*
2  * Copyright © 2016-2017 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.openecomp.sdc.healing.healers;
18
19 import org.apache.commons.collections.MapUtils;
20 import org.openecomp.core.model.dao.ServiceModelDao;
21 import org.openecomp.core.model.dao.ServiceModelDaoFactory;
22 import org.openecomp.core.model.types.ServiceElement;
23 import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum;
24 import org.openecomp.sdc.common.togglz.ToggleableFeature;
25 import org.openecomp.sdc.healing.interfaces.Healer;
26 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
27 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
28 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
29 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
30 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
31 import org.openecomp.sdc.tosca.services.DataModelUtil;
32 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
33 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
34 import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesServiceTemplates;
35 import org.openecomp.sdc.versioning.dao.types.Version;
36
37 import java.util.Arrays;
38 import java.util.List;
39 import java.util.Map;
40 import java.util.Objects;
41 import java.util.Optional;
42
43 public class ForwarderCapabilityHealer implements Healer {
44
45   private MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
46
47   private final ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao;
48   private static ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
49   private static final String FORWARDER_CAPABILITY_ID = "Forwarder";
50   private static final String UNDERSCORE = "_";
51
52   public ForwarderCapabilityHealer() {
53     this.serviceModelDao =
54         ServiceModelDaoFactory.getInstance().createInterface();
55   }
56
57   public ForwarderCapabilityHealer(ServiceModelDao<ToscaServiceModel, ServiceElement>
58                                        serviceModelDao,
59                                    ToscaAnalyzerService toscaAnalyzerService){
60     this.serviceModelDao = serviceModelDao;
61     this.toscaAnalyzerService = toscaAnalyzerService;
62   }
63
64   @Override
65   public Object heal(String vspId, Version version) throws Exception {
66     if(!ToggleableFeature.FORWARDER_CAPABILITY.isActive()) {
67       return Optional.empty();
68     }
69
70     ToscaServiceModel serviceModel =
71         serviceModelDao.getServiceModel(vspId, version);
72
73     if (Objects.isNull(serviceModel)
74         || MapUtils.isEmpty(serviceModel.getServiceTemplates())) {
75       return Optional.empty();
76     }
77
78     addForwarderCapabilityToServiceModel(serviceModel);
79     serviceModelDao.deleteAll(vspId, version);
80     serviceModelDao.storeServiceModel(vspId, version, serviceModel);
81
82     return Optional.of(serviceModel);
83   }
84
85   private void addForwarderCapabilityToServiceModel(ToscaServiceModel serviceModel) {
86     serviceModel.getServiceTemplates().entrySet().stream().filter(serviceTemplateEntry -> Objects
87         .nonNull(serviceTemplateEntry.getValue()))
88         .forEach(serviceTemplateEntry -> handleServiceTemplate(serviceTemplateEntry.getValue(),
89             serviceModel));
90
91     handleGlobalTypes(serviceModel);
92   }
93
94   private void handleGlobalTypes(ToscaServiceModel serviceModel) {
95     Map<String, ServiceTemplate> globalTypesServiceTemplates =
96         GlobalTypesServiceTemplates.getGlobalTypesServiceTemplates(OnboardingTypesEnum.ZIP);
97
98     if (MapUtils.isEmpty(globalTypesServiceTemplates)) {
99       return;
100     }
101
102     globalTypesServiceTemplates.entrySet()
103         .stream()
104         .filter(globalTypesServiceTemplateEntry -> Objects.nonNull
105             (globalTypesServiceTemplateEntry.getValue()))
106         .forEach(globalTypesServiceTemplateEntry -> serviceModel.addServiceTemplate
107             (globalTypesServiceTemplateEntry.getKey(), globalTypesServiceTemplateEntry.getValue()));
108   }
109
110   private void handleServiceTemplate(ServiceTemplate serviceTemplate,
111                                      ToscaServiceModel toscaServiceModel) {
112     if (Objects.isNull(serviceTemplate.getTopology_template())
113         || MapUtils.isEmpty(serviceTemplate.getTopology_template().getNode_templates())) {
114       return;
115     }
116
117     Map<String, NodeTemplate> nodeTemplates =
118         serviceTemplate.getTopology_template().getNode_templates();
119
120     nodeTemplates.entrySet().stream()
121         .filter(nodeTemplateEntry ->
122             toscaAnalyzerService.isTypeOf(nodeTemplateEntry.getValue(),
123                 ToscaNodeType.NATIVE_NETWORK_PORT, serviceTemplate, toscaServiceModel))
124         .forEach(nodeTemplateEntry ->
125             addForwarderToSubstitutionMappings(nodeTemplateEntry.getKey(), serviceTemplate)
126         );
127   }
128
129   private void addForwarderToSubstitutionMappings(String portNodeTemplateId,
130                                                   ServiceTemplate serviceTemplate) {
131     if (Objects.isNull(serviceTemplate.getTopology_template())
132         || Objects.isNull(serviceTemplate.getTopology_template().getSubstitution_mappings())) {
133       return;
134     }
135
136     List<String> substitutionMappingCapabilityList =
137         Arrays.asList(portNodeTemplateId, FORWARDER_CAPABILITY_ID);
138
139     DataModelUtil.addSubstitutionMappingCapability(
140         serviceTemplate,
141         FORWARDER_CAPABILITY_ID + UNDERSCORE + portNodeTemplateId,
142         substitutionMappingCapabilityList);
143
144   }
145 }