Rename packages from openecomp to onap.
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / services / heattotosca / impl / resourcetranslation / ResourceTranslationNeutronSubnetImpl.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.errors.CoreException;
24 import org.openecomp.sdc.heat.datatypes.HeatBoolean;
25 import org.openecomp.sdc.heat.datatypes.model.Resource;
26 import org.openecomp.sdc.logging.api.Logger;
27 import org.openecomp.sdc.logging.api.LoggerFactory;
28 import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
29 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
30 import org.onap.sdc.tosca.datatypes.model.ParameterDefinition;
31 import org.onap.sdc.tosca.datatypes.model.PropertyType;
32 import org.openecomp.sdc.tosca.services.DataModelUtil;
33 import org.openecomp.sdc.tosca.services.ToscaConstants;
34 import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId;
35 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
36 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
37 import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory;
38 import org.openecomp.sdc.translator.services.heattotosca.errors.MissingMandatoryPropertyErrorBuilder;
39 import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter;
40
41 import java.util.HashMap;
42 import java.util.Map;
43 import java.util.Optional;
44
45 public class ResourceTranslationNeutronSubnetImpl extends ResourceTranslationBase {
46
47   protected static Logger logger = LoggerFactory.getLogger(ResourceTranslationNeutronSubnetImpl.class);
48
49   @Override
50   public void translate(TranslateTo translateTo) {
51     Optional<AttachedResourceId> subnetNetwork = getAttachedNetworkResource(translateTo);
52
53     if (!subnetNetwork.isPresent() || !subnetNetwork.get().isGetResource()) {
54       return;
55     }
56
57     Resource networkResource = HeatToToscaUtil
58         .getResource(translateTo.getHeatOrchestrationTemplate(),
59             (String) subnetNetwork.get().getEntityId(), translateTo.getHeatFileName());
60     Optional<String> translatedNetworkId = ResourceTranslationFactory.getInstance(networkResource)
61         .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(),
62             translateTo.getHeatOrchestrationTemplate(), networkResource,
63             (String) subnetNetwork.get().getEntityId(), translateTo.getContext());
64     if (translatedNetworkId.isPresent()) {
65       NodeTemplate networkNodeTemplate = DataModelUtil
66           .getNodeTemplate(translateTo.getServiceTemplate(), translatedNetworkId.get());
67
68       Map<String, Map<String, Object>> subNetMap =
69           (Map<String, Map<String, Object>>) networkNodeTemplate.getProperties().get("subnets");
70       if (subNetMap == null) {
71         subNetMap = new HashMap<>();
72         networkNodeTemplate.getProperties().put("subnets", subNetMap);
73         TranslatorHeatToToscaPropertyConverter
74             .setSimpleProperty(translateTo.getServiceTemplate(),translateTo.getTranslatedId(),
75                 translateTo.getResource().getProperties(),
76                 translateTo.getHeatFileName(), translateTo.getResource().getType(),
77                 translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(),
78                 networkNodeTemplate.getProperties(), "enable_dhcp",
79                 ToscaConstants.DHCP_ENABLED_PROPERTY_NAME, networkNodeTemplate); //dhcp_enabled
80         TranslatorHeatToToscaPropertyConverter
81             .setSimpleProperty(translateTo.getServiceTemplate(),translateTo.getTranslatedId(),
82                 translateTo.getResource().getProperties(),
83                 translateTo.getHeatFileName(), translateTo.getResource().getType(),
84                 translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(),
85                 networkNodeTemplate.getProperties(), "ip_version", null, networkNodeTemplate);
86         handleDhcpProperty(translateTo, networkNodeTemplate);
87       }
88
89       Map<String, Object> properties;
90       properties = TranslatorHeatToToscaPropertyConverter
91           .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo.
92                   getResourceId(),translateTo.getResource().getProperties(), null,
93               translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(),
94               translateTo.getResource().getType(), networkNodeTemplate, translateTo.getContext());
95
96       subNetMap.put(translateTo.getResourceId(), properties);
97     }
98   }
99
100   @Override
101   protected String generateTranslatedId(TranslateTo translateTo) {
102     Optional<AttachedResourceId> subnetNetwork = getAttachedNetworkResource(translateTo);
103
104     if (!subnetNetwork.isPresent() || !subnetNetwork.get().isGetResource()) {
105       logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '"
106           + translateTo.getResource().getType()
107           + "' include 'network_id/'network'' property without 'get_resource' function, therefore"
108           + " this resource will be ignored in TOSCA translation.");
109       return null;
110     }
111     return (String) subnetNetwork.get().getTranslatedId();
112   }
113
114   private void handleDhcpProperty(TranslateTo translateTo, NodeTemplate networkNodeTemplate) {
115     Object dhcpEnabled =
116         networkNodeTemplate.getProperties().get(ToscaConstants.DHCP_ENABLED_PROPERTY_NAME);
117     if (dhcpEnabled instanceof Map) {
118       Object dhcpEnabledParameterName =
119           ((Map) dhcpEnabled).get(ToscaFunctions.GET_INPUT.getDisplayName());
120       if (dhcpEnabledParameterName != null) {
121         ParameterDefinition dhcpParameterDefinition = null;
122         if (translateTo.getServiceTemplate().getTopology_template().getInputs() != null) {
123           dhcpParameterDefinition =
124               translateTo.getServiceTemplate().getTopology_template().getInputs()
125                   .get(dhcpEnabledParameterName);
126         }
127         if (dhcpParameterDefinition == null) {
128           logger.warn("Missing input parameter " + dhcpEnabledParameterName);
129         } else {
130           Object defaultVal = dhcpParameterDefinition.get_default();
131           if (defaultVal != null) {
132             try {
133               Boolean booleanValue = HeatBoolean.eval(defaultVal);
134               dhcpParameterDefinition.set_default(booleanValue);
135             } catch (CoreException coreException) {
136               logger.debug("",coreException);
137               //if value is not valid value for boolean set with dhcp_enabled default value = true
138               dhcpParameterDefinition.set_default(true);
139               logger.warn("Parameter '" + dhcpEnabledParameterName + "' used for "
140                   + ToscaConstants.DHCP_ENABLED_PROPERTY_NAME
141                   + " boolean property, but it's value is not a valid boolean value, therefore "
142                   + ToscaConstants.DHCP_ENABLED_PROPERTY_NAME
143                   + " property will be set with default value of 'true'.");
144             }
145             dhcpParameterDefinition.setType(PropertyType.BOOLEAN.getDisplayName());
146           }
147         }
148       }
149     }
150   }
151
152   private Optional<AttachedResourceId> getAttachedNetworkResource(TranslateTo translateTo) {
153     Optional<AttachedResourceId> subnetNetwork;
154     Optional<AttachedResourceId> attachedNetworkId =
155         HeatToToscaUtil.extractAttachedResourceId(translateTo, "network_id");
156     if (!attachedNetworkId.isPresent()) {
157       Optional<AttachedResourceId> attachedNetwork =
158           HeatToToscaUtil.extractAttachedResourceId(translateTo, "network");
159       if (!attachedNetwork.isPresent()) {
160         throw new CoreException(
161             new MissingMandatoryPropertyErrorBuilder("network_id/'network'").build());
162       } else {
163         subnetNetwork = attachedNetwork;
164       }
165     } else {
166       subnetNetwork = attachedNetworkId;
167     }
168     return subnetNetwork;
169   }
170 }
171
172