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