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