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