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