2 * Copyright © 2016-2017 European Support Limited
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org.openecomp.sdc.healing.healers;
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;
37 import java.util.Arrays;
38 import java.util.List;
40 import java.util.Objects;
41 import java.util.Optional;
43 public class ForwarderCapabilityHealer implements Healer {
45 private MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
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 = "_";
52 public ForwarderCapabilityHealer() {
53 this.serviceModelDao =
54 ServiceModelDaoFactory.getInstance().createInterface();
57 public ForwarderCapabilityHealer(ServiceModelDao<ToscaServiceModel, ServiceElement>
59 ToscaAnalyzerService toscaAnalyzerService){
60 this.serviceModelDao = serviceModelDao;
61 this.toscaAnalyzerService = toscaAnalyzerService;
65 public Object heal(String vspId, Version version) throws Exception {
66 if(!ToggleableFeature.FORWARDER_CAPABILITY.isActive()) {
67 return Optional.empty();
70 ToscaServiceModel serviceModel =
71 serviceModelDao.getServiceModel(vspId, version);
73 if (Objects.isNull(serviceModel)
74 || MapUtils.isEmpty(serviceModel.getServiceTemplates())) {
75 return Optional.empty();
78 addForwarderCapabilityToServiceModel(serviceModel);
79 serviceModelDao.deleteAll(vspId, version);
80 serviceModelDao.storeServiceModel(vspId, version, serviceModel);
82 return Optional.of(serviceModel);
85 private void addForwarderCapabilityToServiceModel(ToscaServiceModel serviceModel) {
86 serviceModel.getServiceTemplates().entrySet().stream().filter(serviceTemplateEntry -> Objects
87 .nonNull(serviceTemplateEntry.getValue()))
88 .forEach(serviceTemplateEntry -> handleServiceTemplate(serviceTemplateEntry.getValue(),
91 handleGlobalTypes(serviceModel);
94 private void handleGlobalTypes(ToscaServiceModel serviceModel) {
95 Map<String, ServiceTemplate> globalTypesServiceTemplates =
96 GlobalTypesServiceTemplates.getGlobalTypesServiceTemplates(OnboardingTypesEnum.ZIP);
98 if (MapUtils.isEmpty(globalTypesServiceTemplates)) {
102 globalTypesServiceTemplates.entrySet()
104 .filter(globalTypesServiceTemplateEntry -> Objects.nonNull
105 (globalTypesServiceTemplateEntry.getValue()))
106 .forEach(globalTypesServiceTemplateEntry -> serviceModel.addServiceTemplate
107 (globalTypesServiceTemplateEntry.getKey(), globalTypesServiceTemplateEntry.getValue()));
110 private void handleServiceTemplate(ServiceTemplate serviceTemplate,
111 ToscaServiceModel toscaServiceModel) {
112 if (Objects.isNull(serviceTemplate.getTopology_template())
113 || MapUtils.isEmpty(serviceTemplate.getTopology_template().getNode_templates())) {
117 Map<String, NodeTemplate> nodeTemplates =
118 serviceTemplate.getTopology_template().getNode_templates();
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)
129 private void addForwarderToSubstitutionMappings(String portNodeTemplateId,
130 ServiceTemplate serviceTemplate) {
131 if (Objects.isNull(serviceTemplate.getTopology_template())
132 || Objects.isNull(serviceTemplate.getTopology_template().getSubstitution_mappings())) {
136 List<String> substitutionMappingCapabilityList =
137 Arrays.asList(portNodeTemplateId, FORWARDER_CAPABILITY_ID);
139 DataModelUtil.addSubstitutionMappingCapability(
141 FORWARDER_CAPABILITY_ID + UNDERSCORE + portNodeTemplateId,
142 substitutionMappingCapabilityList);