2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation;
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;
47 import java.util.HashMap;
49 import java.util.Optional;
51 public class ResourceTranslationNeutronSubnetImpl extends ResourceTranslationBase {
52 protected static Logger logger =
53 (Logger) LoggerFactory.getLogger(ResourceTranslationNeutronSubnetImpl.class);
56 public void translate(TranslateTo translateTo) {
57 mdcDataDebugMessage.debugEntryMessage(null, null);
59 Optional<AttachedResourceId> subnetNetwork = getAttachedNetworkResource(translateTo);
61 if (!subnetNetwork.isPresent() || !subnetNetwork.get().isGetResource()) {
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());
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);
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());
104 subNetMap.put(translateTo.getResourceId(), properties);
107 mdcDataDebugMessage.debugExitMessage(null, null);
111 protected String generateTranslatedId(TranslateTo translateTo) {
114 mdcDataDebugMessage.debugEntryMessage(null, null);
116 Optional<AttachedResourceId> subnetNetwork = getAttachedNetworkResource(translateTo);
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.");
124 mdcDataDebugMessage.debugExitMessage(null, null);
128 mdcDataDebugMessage.debugExitMessage(null, null);
129 return (String) subnetNetwork.get().getTranslatedId();
132 private void handleDhcpProperty(TranslateTo translateTo, NodeTemplate networkNodeTemplate) {
133 mdcDataDebugMessage.debugEntryMessage(null, null);
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);
147 if (dhcpParameterDefinition == null) {
148 logger.warn("Missing input parameter " + dhcpEnabledParameterName);
150 Object defaultVal = dhcpParameterDefinition.get_default();
151 if (defaultVal != null) {
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'.");
164 dhcpParameterDefinition.setType(PropertyType.BOOLEAN.getDisplayName());
170 mdcDataDebugMessage.debugExitMessage(null, null);
173 private Optional<AttachedResourceId> getAttachedNetworkResource(TranslateTo translateTo) {
176 mdcDataDebugMessage.debugEntryMessage(null, null);
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());
192 subnetNetwork = attachedNetwork;
195 subnetNetwork = attachedNetworkId;
198 mdcDataDebugMessage.debugExitMessage(null, null);
199 return subnetNetwork;