[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 / ResourceTranslationNeutronPortImpl.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.heat.datatypes.model.HeatResourcesTypes;
24 import org.openecomp.sdc.heat.datatypes.model.Resource;
25 import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType;
26 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
27 import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType;
28 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
29 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
30 import org.openecomp.sdc.tosca.services.DataModelUtil;
31 import org.openecomp.sdc.tosca.services.ToscaConstants;
32 import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId;
33 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
34 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource;
35 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil;
36 import org.openecomp.sdc.translator.services.heattotosca.Constants;
37 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationEntityType;
38 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
39 import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory;
40 import org.openecomp.sdc.translator.services.heattotosca.helper.ResourceTranslationNeutronPortHelper;
41 import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter;
42
43 import java.util.ArrayList;
44 import java.util.Arrays;
45 import java.util.Collections;
46 import java.util.List;
47 import java.util.Map;
48 import java.util.Objects;
49 import java.util.Optional;
50
51
52 public class ResourceTranslationNeutronPortImpl extends ResourceTranslationBase {
53
54   @Override
55   public void translate(TranslateTo translateTo) {
56
57
58     mdcDataDebugMessage.debugEntryMessage(null, null);
59
60     NodeTemplate nodeTemplate = new NodeTemplate();
61     nodeTemplate.setType(ToscaNodeType.NEUTRON_PORT);
62     nodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter
63         .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(), translateTo.
64                 getResourceId(), translateTo.getResource().getProperties(),
65             nodeTemplate.getProperties(), translateTo.getHeatFileName(),
66             translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(),
67             nodeTemplate, translateTo.getContext()));
68     new ResourceTranslationNeutronPortHelper().setAdditionalProperties(nodeTemplate
69         .getProperties());
70     handleNetworkRequirement(translateTo, nodeTemplate);
71     String resourceTranslatedId = handleSecurityRulesRequirement(translateTo);
72     DataModelUtil
73         .addNodeTemplate(translateTo.getServiceTemplate(), resourceTranslatedId, nodeTemplate);
74
75     mdcDataDebugMessage.debugExitMessage(null, null);
76   }
77
78   private String handleSecurityRulesRequirement(TranslateTo translateTo) {
79
80
81     mdcDataDebugMessage.debugEntryMessage(null, null);
82
83     String resourceTranslatedId = translateTo.getTranslatedId();
84     Map<String, Object> properties = translateTo.getResource().getProperties();
85     Optional<Object> securityGroups =
86         Optional.ofNullable(properties.get(Constants.SECURITY_GROUPS_PROPERTY_NAME));
87     if (securityGroups.isPresent() && securityGroups.get() instanceof List) {
88       List securityGroupsList = (List) securityGroups.get();
89       securityGroupsList.forEach(resourceValue -> {
90         Optional<AttachedResourceId> securityGroupResourceId = HeatToToscaUtil
91             .extractAttachedResourceId(translateTo.getHeatFileName(),
92                 translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(),
93                 resourceValue);
94         securityGroupResourceId.ifPresent(
95             attachedResourceId -> handleSecurityGroupResourceId(translateTo, resourceTranslatedId,
96                 attachedResourceId));
97       });
98     }
99
100     mdcDataDebugMessage.debugExitMessage(null, null);
101     return resourceTranslatedId;
102   }
103
104   private void handleSecurityGroupResourceId(TranslateTo translateTo, String resourceTranslatedId,
105                                              AttachedResourceId securityGroupResourceId) {
106
107
108     mdcDataDebugMessage.debugEntryMessage(null, null);
109
110     List<String> supportedSecurityGroupsTypes = Collections
111         .singletonList(HeatResourcesTypes.NEUTRON_SECURITY_GROUP_RESOURCE_TYPE.getHeatResource());
112     if (securityGroupResourceId.isGetResource()) {
113       handleGetResource(translateTo, resourceTranslatedId, securityGroupResourceId,
114           supportedSecurityGroupsTypes);
115     } else if (securityGroupResourceId.isGetParam()) {
116       handleGetParam(translateTo, resourceTranslatedId, securityGroupResourceId,
117           supportedSecurityGroupsTypes);
118     }
119
120     mdcDataDebugMessage.debugExitMessage(null, null);
121   }
122
123   private void handleGetParam(TranslateTo translateTo, String resourceTranslatedId,
124                               AttachedResourceId securityGroupResourceId,
125                               List<String> supportedSecurityGroupsTypes) {
126     mdcDataDebugMessage.debugEntryMessage(null, null);
127
128     if (!(securityGroupResourceId.getEntityId() instanceof String)) {
129       mdcDataDebugMessage.debugExitMessage(null, null);
130       return;
131     }
132     TranslatedHeatResource translatedSharedResourceId =
133         translateTo.getContext().getHeatSharedResourcesByParam()
134             .get(securityGroupResourceId.getEntityId());
135     if (Objects.nonNull(translatedSharedResourceId)
136         && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) {
137       if (validateResourceTypeSupportedForReqCreation(translateTo, supportedSecurityGroupsTypes,
138           translatedSharedResourceId.getHeatResource(), "security_groups")) {
139         mdcDataDebugMessage.debugExitMessage(null, null);
140         return;
141       }
142       final NodeTemplate securityGroupNodeTemplate = DataModelUtil
143           .getNodeTemplate(translateTo.getServiceTemplate(),
144               translatedSharedResourceId.getTranslatedId());
145       RequirementAssignment requirement = new RequirementAssignment();
146       requirement.setCapability(ToscaCapabilityType.NATIVE_ATTACHMENT);
147       requirement.setNode(resourceTranslatedId);
148       requirement.setRelationship(ToscaRelationshipType.ATTACHES_TO);
149       DataModelUtil
150           .addRequirementAssignment(securityGroupNodeTemplate, ToscaConstants.PORT_REQUIREMENT_ID,
151               requirement);
152
153       ConsolidationDataUtil
154           .updateNodesConnectedIn(translateTo, translatedSharedResourceId.getTranslatedId(),
155               ConsolidationEntityType.PORT, translateTo.getResourceId(),
156               ToscaConstants.PORT_REQUIREMENT_ID, requirement);
157     }
158
159     mdcDataDebugMessage.debugExitMessage(null, null);
160   }
161
162   private void handleGetResource(TranslateTo translateTo, String resourceTranslatedId,
163                                  AttachedResourceId securityGroupResourceId,
164                                  List<String> supportedSecurityGroupsTypes) {
165
166
167     mdcDataDebugMessage.debugEntryMessage(null, null);
168
169     String resourceId = (String) securityGroupResourceId.getEntityId();
170     Resource securityGroupResource = HeatToToscaUtil
171         .getResource(translateTo.getHeatOrchestrationTemplate(), resourceId,
172             translateTo.getHeatFileName());
173     Optional<String> securityGroupTranslatedId =
174         ResourceTranslationFactory.getInstance(securityGroupResource)
175             .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(),
176                 translateTo.getHeatOrchestrationTemplate(), securityGroupResource, resourceId,
177                 translateTo.getContext());
178     if (securityGroupTranslatedId.isPresent()) {
179       if (validateResourceTypeSupportedForReqCreation(translateTo, supportedSecurityGroupsTypes,
180           securityGroupResource, "security_groups")) {
181         mdcDataDebugMessage.debugExitMessage(null, null);
182         return;
183       }
184       final NodeTemplate securityGroupNodeTemplate = DataModelUtil
185           .getNodeTemplate(translateTo.getServiceTemplate(), securityGroupTranslatedId.get());
186       RequirementAssignment requirement = new RequirementAssignment();
187       requirement.setCapability(ToscaCapabilityType.NATIVE_ATTACHMENT);
188       requirement.setNode(resourceTranslatedId);
189       requirement.setRelationship(ToscaRelationshipType.ATTACHES_TO);
190       DataModelUtil
191           .addRequirementAssignment(securityGroupNodeTemplate, ToscaConstants.PORT_REQUIREMENT_ID,
192               requirement);
193
194       ConsolidationDataUtil.updateNodesConnectedIn(translateTo, securityGroupTranslatedId.get(),
195           ConsolidationEntityType.PORT, translateTo.getResourceId(),
196           ToscaConstants.PORT_REQUIREMENT_ID, requirement);
197     }
198
199     mdcDataDebugMessage.debugExitMessage(null, null);
200   }
201
202   private void handleNetworkRequirement(TranslateTo translateTo, NodeTemplate nodeTemplate) {
203
204
205     mdcDataDebugMessage.debugEntryMessage(null, null);
206
207     Optional<AttachedResourceId> networkResourceId =
208         HeatToToscaUtil.extractAttachedResourceId(translateTo, "network");
209     if (networkResourceId.isPresent()) {
210       AttachedResourceId attachedResourceId = networkResourceId.get();
211       addRequirementAssignmentForNetworkResource(translateTo, nodeTemplate, attachedResourceId);
212     } else {
213       networkResourceId = HeatToToscaUtil.extractAttachedResourceId(translateTo, "network_id");
214       if (networkResourceId.isPresent()) {
215         AttachedResourceId attachedResourceId = networkResourceId.get();
216         addRequirementAssignmentForNetworkResource(translateTo, nodeTemplate, attachedResourceId);
217       }
218     }
219
220     mdcDataDebugMessage.debugExitMessage(null, null);
221   }
222
223   private void addRequirementAssignmentForNetworkResource(TranslateTo translateTo,
224                                                           NodeTemplate nodeTemplate,
225                                                           AttachedResourceId attachedResourceId) {
226
227
228     mdcDataDebugMessage.debugEntryMessage(null, null);
229
230     String networkTranslatedId;
231     List<String> supportedNetworkTypes =
232         Arrays.asList(HeatResourcesTypes.NEUTRON_NET_RESOURCE_TYPE.getHeatResource(),
233             HeatResourcesTypes.CONTRAIL_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource(),
234             HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_NETWORK_RESOURCE_TYPE.getHeatResource());
235     if (attachedResourceId.isGetResource()) {
236       Resource networkHeatResource = translateTo.getHeatOrchestrationTemplate().getResources()
237           .get(attachedResourceId.getEntityId());
238       if (validateResourceTypeSupportedForReqCreation(translateTo, supportedNetworkTypes,
239           networkHeatResource, "network'\\'network_id")) {
240         return;
241       }
242       networkTranslatedId = (String) attachedResourceId.getTranslatedId();
243       RequirementAssignment requirementAssignment = HeatToToscaUtil.addLinkReqFromPortToNetwork(
244           nodeTemplate, networkTranslatedId);
245
246       ConsolidationDataUtil.updateNodesConnectedOut(translateTo, networkTranslatedId,
247           ConsolidationEntityType.PORT, ToscaConstants.LINK_REQUIREMENT_ID, requirementAssignment);
248
249     } else if (attachedResourceId.isGetParam()
250         && attachedResourceId.getEntityId() instanceof String) {
251       TranslatedHeatResource translatedSharedResourceId =
252           translateTo.getContext().getHeatSharedResourcesByParam()
253               .get(attachedResourceId.getEntityId());
254       if (Objects.nonNull(translatedSharedResourceId)
255           && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())) {
256         if (validateResourceTypeSupportedForReqCreation(translateTo, supportedNetworkTypes,
257             translatedSharedResourceId.getHeatResource(), "network'\\'network_id")) {
258           return;
259         }
260         RequirementAssignment requirementAssignment = HeatToToscaUtil.addLinkReqFromPortToNetwork(
261             nodeTemplate, translatedSharedResourceId.getTranslatedId());
262
263         ConsolidationDataUtil.updateNodesConnectedOut(translateTo,
264             translatedSharedResourceId.getTranslatedId(), ConsolidationEntityType.PORT,
265             ToscaConstants.LINK_REQUIREMENT_ID, requirementAssignment);
266       }
267     }
268
269     mdcDataDebugMessage.debugExitMessage(null, null);
270   }
271
272
273   private boolean validateResourceTypeSupportedForReqCreation(TranslateTo translateTo,
274                                                               List<String> supportedTypes,
275                                                               Resource heatResource,
276                                                               final String propertyName) {
277
278
279     mdcDataDebugMessage.debugEntryMessage(null, null);
280
281     if (!isResourceTypeSupported(heatResource, supportedTypes)) {
282       logger.warn(
283           "'" + propertyName + "' property of port resource('" + translateTo.getResourceId()
284               + "') is pointing to a resource of type '" + heatResource.getType() + "' "
285               + "which is not supported for this requirement. "
286               + "Supported types are: " + supportedTypes.toString());
287
288       mdcDataDebugMessage.debugExitMessage(null, null);
289       return true;
290     }
291     mdcDataDebugMessage.debugExitMessage(null, null);
292     return false;
293   }
294
295
296 }