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