[SDC-29] Amdocs OnBoard 1707 initial commit.
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / services / heattotosca / impl / resourcetranslation / ResourceConnectionUsingRequirementHelper.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation;
22
23 import org.openecomp.sdc.common.utils.CommonUtil;
24 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
25 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
26 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
27 import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition;
28 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
29 import org.openecomp.sdc.tosca.services.DataModelUtil;
30 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
31
32 import java.util.ArrayList;
33 import java.util.HashMap;
34 import java.util.List;
35 import java.util.Map;
36 import java.util.Optional;
37 import java.util.function.Predicate;
38
39 public abstract class ResourceConnectionUsingRequirementHelper
40     extends BaseResourceConnection<RequirementDefinition> {
41   public ResourceConnectionUsingRequirementHelper(ResourceTranslationBase resourceTranslationBase,
42                                                   TranslateTo translateTo, FileData nestedFileData,
43                                                   NodeTemplate substitutionNodeTemplate,
44                                                   NodeType nodeType) {
45     super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
46   }
47
48   @Override
49   String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate,
50                                            Map.Entry<String,
51                                                RequirementDefinition> connectionPointEntry) {
52
53
54     mdcDataDebugMessage.debugEntryMessage(null, null);
55
56     List<String> substitutionMapping =
57         nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getRequirements()
58             .get(connectionPointEntry.getKey());
59
60     mdcDataDebugMessage.debugExitMessage(null, null);
61     return substitutionMapping.get(0);
62   }
63
64   @Override
65   Map.Entry<String, RequirementDefinition> getMappedConnectionPointEntry(
66       ServiceTemplate nestedServiceTemplate,
67       Map.Entry<String, RequirementDefinition> connectionPointEntry) {
68
69
70     mdcDataDebugMessage.debugEntryMessage(null, null);
71
72     List<String> substitutionMapping =
73         nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getRequirements()
74             .get(connectionPointEntry.getKey());
75     String mappedNodeTranslatedId = substitutionMapping.get(0);
76     String mappedReqId = substitutionMapping.get(1);
77     NodeTemplate mappedNodeTemplate =
78         nestedServiceTemplate.getTopology_template().getNode_templates()
79             .get(mappedNodeTranslatedId);
80     NodeType substituteNodeType =
81         translateTo.getContext().getGlobalSubstitutionServiceTemplate().getNode_types()
82             .get(mappedNodeTemplate.getType());
83     Optional<RequirementDefinition> requirementDefinition =
84         DataModelUtil.getRequirementDefinition(substituteNodeType, mappedReqId);
85
86     mdcDataDebugMessage.debugExitMessage(null, null);
87     return new Map.Entry<String, RequirementDefinition>() {
88       @Override
89       public String getKey() {
90         return mappedReqId;
91       }
92
93       @Override
94       public RequirementDefinition getValue() {
95         return requirementDefinition.get();
96       }
97
98       @Override
99       public RequirementDefinition setValue(RequirementDefinition value) {
100         return null;
101       }
102     };
103   }
104
105   @Override
106   List<Map<String, RequirementDefinition>> getAllConnectionPoints() {
107
108
109     mdcDataDebugMessage.debugEntryMessage(null, null);
110
111     List<Map<String, RequirementDefinition>> exposedRequirementsList = new ArrayList<>();
112     List<Predicate<RequirementDefinition>> predicates = getPredicatesListForConnectionPoints();
113     List<Map<String, RequirementDefinition>> requirements = this.nodeType.getRequirements();
114     if (requirements == null) {
115       return exposedRequirementsList;
116     }
117     requirements.stream()
118         .map(Map::entrySet)
119         .forEach(x -> x.stream()
120             .filter(entry -> predicates
121                 .stream()
122                 .anyMatch(p -> p.test(entry.getValue())))
123             .forEach(entry -> {
124               Map<String, RequirementDefinition> exposedRequirementsMap = new HashMap<>();
125               exposedRequirementsMap.put(entry.getKey(), entry.getValue());
126               exposedRequirementsList.add(exposedRequirementsMap);
127             }));
128
129     mdcDataDebugMessage.debugExitMessage(null, null);
130     return exposedRequirementsList;
131   }
132
133   void addRequirementToConnectResource(
134       Map.Entry<String, RequirementDefinition> requirementDefinitionEntry, String paramName,
135       Object paramValue, List<String> supportedNetworkTypes) {
136
137
138     mdcDataDebugMessage.debugEntryMessage(null, null);
139
140     if (paramValue == null) {
141       logger.warn("'" + paramName + "' property is not define in nested resource '"
142           + translateTo.getResourceId() + "' for the nested heat file, therefore, '"
143           + requirementDefinitionEntry.getKey() + "' TOSCA requirement will not be connected.");
144       return;
145     }
146     Optional<String> targetTranslatedNodeId =
147         getConnectionTranslatedNodeUsingGetResourceFunc(requirementDefinitionEntry, paramName,
148             paramValue, supportedNetworkTypes);
149     if (targetTranslatedNodeId.isPresent()) {
150       createRequirementAssignment(requirementDefinitionEntry, targetTranslatedNodeId.get(),
151           substitutionNodeTemplate);
152     } else {
153       targetTranslatedNodeId =
154           getConnectionTranslatedNodeUsingGetParamFunc(requirementDefinitionEntry, paramName,
155               supportedNetworkTypes);
156       targetTranslatedNodeId
157           .ifPresent(targetTranslatedId -> createRequirementAssignment(requirementDefinitionEntry,
158               targetTranslatedId, substitutionNodeTemplate));
159     }
160
161     mdcDataDebugMessage.debugExitMessage(null, null);
162   }
163 }