summaryrefslogtreecommitdiffstats
path: root/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ForwarderCapabilityHealer.java
blob: 038a0d889afb02127083e7b140a6a6b3ceb9613e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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);

  }
}