01f9de27bbdb26a94f7a4216252d89f2dae23cbc
[sdc.git] /
1 /*
2  * Copyright © 2018 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15 */
16
17 package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation;
18
19 import org.openecomp.sdc.common.errors.CoreException;
20 import org.openecomp.sdc.heat.datatypes.HeatBoolean;
21 import org.openecomp.sdc.heat.datatypes.model.Resource;
22 import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
23 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
24 import org.onap.sdc.tosca.datatypes.model.ParameterDefinition;
25 import org.onap.sdc.tosca.datatypes.model.PropertyType;
26 import org.openecomp.sdc.tosca.services.DataModelUtil;
27 import org.openecomp.sdc.tosca.services.ToscaConstants;
28 import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId;
29 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
30 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
31 import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory;
32 import org.openecomp.sdc.translator.services.heattotosca.errors.MissingMandatoryPropertyErrorBuilder;
33 import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter;
34
35 import java.util.HashMap;
36 import java.util.Map;
37 import java.util.Optional;
38
39 public class ResourceTranslationNeutronSubnetImpl extends ResourceTranslationBase {
40
41   @Override
42   public void translate(TranslateTo translateTo) {
43     Optional<AttachedResourceId> subnetNetwork = getAttachedNetworkResource(translateTo);
44
45     if (!subnetNetwork.isPresent() || !subnetNetwork.get().isGetResource()) {
46       return;
47     }
48
49     Resource networkResource = HeatToToscaUtil
50         .getResource(translateTo.getHeatOrchestrationTemplate(),
51             (String) subnetNetwork.get().getEntityId(), translateTo.getHeatFileName());
52     Optional<String> translatedNetworkId = ResourceTranslationFactory.getInstance(networkResource)
53         .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(),
54             translateTo.getHeatOrchestrationTemplate(), networkResource,
55             (String) subnetNetwork.get().getEntityId(), translateTo.getContext());
56     if (translatedNetworkId.isPresent()) {
57       NodeTemplate networkNodeTemplate = DataModelUtil
58           .getNodeTemplate(translateTo.getServiceTemplate(), translatedNetworkId.get());
59
60       Map<String, Map<String, Object>> subNetMap =
61           (Map<String, Map<String, Object>>) networkNodeTemplate.getProperties().get("subnets");
62       if (subNetMap == null) {
63         subNetMap = new HashMap<>();
64         networkNodeTemplate.getProperties().put("subnets", subNetMap);
65         TranslatorHeatToToscaPropertyConverter
66             .setSimpleProperty(translateTo.getServiceTemplate(),translateTo.getTranslatedId(),
67                 translateTo.getResource().getProperties(),
68                 translateTo.getHeatFileName(), translateTo.getResource().getType(),
69                 translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(),
70                 networkNodeTemplate.getProperties(), "enable_dhcp",
71                 ToscaConstants.DHCP_ENABLED_PROPERTY_NAME, networkNodeTemplate); //dhcp_enabled
72         TranslatorHeatToToscaPropertyConverter
73             .setSimpleProperty(translateTo.getServiceTemplate(),translateTo.getTranslatedId(),
74                 translateTo.getResource().getProperties(),
75                 translateTo.getHeatFileName(), translateTo.getResource().getType(),
76                 translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(),
77                 networkNodeTemplate.getProperties(), "ip_version", null, networkNodeTemplate);
78         handleDhcpProperty(translateTo, networkNodeTemplate);
79       }
80
81       Map<String, Object> properties;
82       properties = TranslatorHeatToToscaPropertyConverter
83           .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),translateTo.
84                   getResourceId(),translateTo.getResource().getProperties(), null,
85               translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(),
86               translateTo.getResource().getType(), networkNodeTemplate, translateTo.getContext());
87
88       subNetMap.put(translateTo.getResourceId(), properties);
89     }
90   }
91
92   @Override
93   protected String generateTranslatedId(TranslateTo translateTo) {
94     Optional<AttachedResourceId> subnetNetwork = getAttachedNetworkResource(translateTo);
95
96     if (!subnetNetwork.isPresent() || !subnetNetwork.get().isGetResource()) {
97       logger.warn("Heat resource: '" + translateTo.getResourceId() + "' with type: '"
98           + translateTo.getResource().getType()
99           + "' include 'network_id/'network'' property without 'get_resource' function, therefore"
100           + " this resource will be ignored in TOSCA translation.");
101       return null;
102     }
103     return (String) subnetNetwork.get().getTranslatedId();
104   }
105
106   private void handleDhcpProperty(TranslateTo translateTo, NodeTemplate networkNodeTemplate) {
107     Object dhcpEnabled =
108         networkNodeTemplate.getProperties().get(ToscaConstants.DHCP_ENABLED_PROPERTY_NAME);
109     if (dhcpEnabled instanceof Map) {
110       Object dhcpEnabledParameterName =
111           ((Map) dhcpEnabled).get(ToscaFunctions.GET_INPUT.getDisplayName());
112       if (dhcpEnabledParameterName != null) {
113         ParameterDefinition dhcpParameterDefinition = null;
114         if (translateTo.getServiceTemplate().getTopology_template().getInputs() != null) {
115           dhcpParameterDefinition =
116               translateTo.getServiceTemplate().getTopology_template().getInputs()
117                   .get(dhcpEnabledParameterName);
118         }
119         if (dhcpParameterDefinition == null) {
120           logger.warn("Missing input parameter " + dhcpEnabledParameterName);
121         } else {
122           Object defaultVal = dhcpParameterDefinition.get_default();
123           if (defaultVal != null) {
124             try {
125               Boolean booleanValue = HeatBoolean.eval(defaultVal);
126               dhcpParameterDefinition.set_default(booleanValue);
127             } catch (CoreException coreException) {
128               dhcpParameterDefinition.set_default(true);
129               logger.warn("Parameter '" + dhcpEnabledParameterName + "' used for "
130                   + ToscaConstants.DHCP_ENABLED_PROPERTY_NAME
131                   + " boolean property, but it's value is not a valid boolean value, therefore "
132                   + ToscaConstants.DHCP_ENABLED_PROPERTY_NAME
133                   + " property will be set with default value of 'true'.", coreException);
134             }
135             dhcpParameterDefinition.setType(PropertyType.BOOLEAN.getDisplayName());
136           }
137         }
138       }
139     }
140   }
141
142   private Optional<AttachedResourceId> getAttachedNetworkResource(TranslateTo translateTo) {
143     Optional<AttachedResourceId> subnetNetwork;
144     Optional<AttachedResourceId> attachedNetworkId =
145         HeatToToscaUtil.extractAttachedResourceId(translateTo, "network_id");
146     if (!attachedNetworkId.isPresent()) {
147       Optional<AttachedResourceId> attachedNetwork =
148           HeatToToscaUtil.extractAttachedResourceId(translateTo, "network");
149       if (!attachedNetwork.isPresent()) {
150         throw new CoreException(
151             new MissingMandatoryPropertyErrorBuilder("network_id/'network'").build());
152       } else {
153         subnetNetwork = attachedNetwork;
154       }
155     } else {
156       subnetNetwork = attachedNetworkId;
157     }
158     return subnetNetwork;
159   }
160 }
161
162