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.apache.commons.collections4.CollectionUtils;
24 import org.apache.commons.collections4.MapUtils;
25 import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate;
26 import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
27 import org.openecomp.sdc.heat.datatypes.model.Resource;
28 import org.openecomp.sdc.heat.services.HeatConstants;
29 import org.openecomp.sdc.logging.api.Logger;
30 import org.openecomp.sdc.logging.api.LoggerFactory;
31 import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType;
32 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
33 import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType;
34 import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition;
35 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
36 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
37 import org.openecomp.sdc.tosca.datatypes.model.RelationshipTemplate;
38 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
39 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
40 import org.openecomp.sdc.tosca.services.DataModelUtil;
41 import org.openecomp.sdc.tosca.services.ToscaConstants;
42 import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId;
43 import org.openecomp.sdc.translator.datatypes.heattotosca.PropertyRegexMatcher;
44 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
45 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
46 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource;
47 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
48 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil;
49 import org.openecomp.sdc.translator.services.heattotosca.Constants;
50 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
51 import org.openecomp.sdc.translator.services.heattotosca.NameExtractor;
52 import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory;
53 import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter;
55 import java.util.ArrayList;
56 import java.util.Arrays;
57 import java.util.Collections;
58 import java.util.HashMap;
59 import java.util.List;
61 import java.util.Objects;
62 import java.util.Optional;
65 public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase {
66 protected static Logger logger =
67 (Logger) LoggerFactory.getLogger(ResourceTranslationNovaServerImpl.class);
70 protected void translate(TranslateTo translateTo) {
73 mdcDataDebugMessage.debugEntryMessage(null, null);
75 TranslationContext context = translateTo.getContext();
76 Map<String, Object> properties = translateTo.getResource().getProperties();
77 String heatFileName = translateTo.getHeatFileName();
79 ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
80 String nodeTypeRef = createLocalNodeType(serviceTemplate, translateTo.getResource(),
81 translateTo.getResourceId(), translateTo.getTranslatedId(), context);
83 //create compute in consolidation data
84 ConsolidationDataUtil.getComputeTemplateConsolidationData(context, serviceTemplate,
85 nodeTypeRef, translateTo.getTranslatedId());
87 NodeTemplate novaNodeTemplate = new NodeTemplate();
88 novaNodeTemplate.setType(nodeTypeRef);
89 HeatOrchestrationTemplate heatOrchestrationTemplate =
90 translateTo.getHeatOrchestrationTemplate();
91 novaNodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter
92 .getToscaPropertiesSimpleConversion(serviceTemplate, translateTo.getResourceId(),
93 properties, novaNodeTemplate.getProperties(), heatFileName,
94 heatOrchestrationTemplate, translateTo.getResource().getType(),
95 novaNodeTemplate, context));
97 HeatToToscaUtil.mapBoolean(novaNodeTemplate, HeatToToscaUtil
98 .getToscaPropertyName(translateTo, HeatConstants.CONFIG_DRIVE_PROPERTY_NAME));
100 manageNovaServerNetwork(translateTo, novaNodeTemplate);
101 manageNovaServerBlockDeviceMapping(translateTo, novaNodeTemplate);
102 manageNovaServerGroupMapping(translateTo, context, properties, heatFileName, serviceTemplate,
103 novaNodeTemplate, heatOrchestrationTemplate);
104 DataModelUtil.addNodeTemplate(serviceTemplate, translateTo.getTranslatedId(), novaNodeTemplate);
106 mdcDataDebugMessage.debugExitMessage(null, null);
109 private void manageNovaServerGroupMapping(TranslateTo translateTo, TranslationContext context,
110 Map<String, Object> properties, String heatFileName,
111 ServiceTemplate serviceTemplate,
112 NodeTemplate novaNodeTemplate,
113 HeatOrchestrationTemplate heatOrchestrationTemplate) {
116 mdcDataDebugMessage.debugEntryMessage(null, null);
118 if (isSchedulerHintsPropExist(properties)) {
119 Object schedulerHints = properties.get("scheduler_hints");
120 if (schedulerHints instanceof Map) {
121 addServerGroupHintsToPoliciesGroups(translateTo, context, heatFileName, serviceTemplate,
122 novaNodeTemplate, heatOrchestrationTemplate, (Map<String, Object>) schedulerHints);
124 logger.warn("'scheduler_hints' property of resource '" + translateTo.getResourceId()
125 + "' is not valid. This property should be a map");
129 mdcDataDebugMessage.debugExitMessage(null, null);
132 private void addServerGroupHintsToPoliciesGroups(TranslateTo translateTo,
133 TranslationContext context, String heatFileName,
134 ServiceTemplate serviceTemplate,
135 NodeTemplate novaNodeTemplate,
136 HeatOrchestrationTemplate
137 heatOrchestrationTemplate,
138 Map<String, Object> schedulerHints) {
141 mdcDataDebugMessage.debugEntryMessage(null, null);
143 for (Object hint : schedulerHints.values()) {
144 Optional<AttachedResourceId> attachedResourceId = HeatToToscaUtil
145 .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context, hint);
146 if (attachedResourceId.isPresent()) {
147 AttachedResourceId serverGroupResourceId = attachedResourceId.get();
148 Object serverGroupResourceToTranslate = serverGroupResourceId.getEntityId();
149 if (serverGroupResourceId.isGetResource()) {
150 boolean isHintOfTypeNovaServerGroup =
151 isHintOfTypeNovaServerGroup(heatOrchestrationTemplate,
152 serverGroupResourceToTranslate);
153 if (isHintOfTypeNovaServerGroup) {
154 addNovaServerToPolicyGroup(translateTo, context, heatFileName, serviceTemplate,
155 heatOrchestrationTemplate, (String) serverGroupResourceToTranslate,
158 } else if (serverGroupResourceId.isGetParam()
159 && serverGroupResourceToTranslate instanceof String) {
160 TranslatedHeatResource
161 translatedServerGroupResource =
162 context.getHeatSharedResourcesByParam().get(serverGroupResourceToTranslate);
163 if (Objects.nonNull(translatedServerGroupResource)
164 && !HeatToToscaUtil.isHeatFileNested(translateTo, translateTo.getHeatFileName())
165 && isResourceTypeServerGroup(translatedServerGroupResource)) {
166 Map<String, GroupDefinition> groups =
167 serviceTemplate.getTopology_template().getGroups();
168 if(MapUtils.isNotEmpty(groups) && Objects.nonNull(groups.get(translatedServerGroupResource
169 .getTranslatedId()))) {
171 .get(translatedServerGroupResource.getTranslatedId()).getMembers()
172 .add(translateTo.getTranslatedId());
173 //Add group Id to compute consolidation data
174 updateComputeConsolidationDataGroup(translateTo, novaNodeTemplate,
175 translatedServerGroupResource.getTranslatedId());
182 mdcDataDebugMessage.debugExitMessage(null, null);
185 private boolean isResourceTypeServerGroup(TranslatedHeatResource translatedServerGroupResource) {
186 return translatedServerGroupResource.getHeatResource().getType().equals(HeatResourcesTypes.NOVA_SERVER_GROUP_RESOURCE_TYPE.getHeatResource());
189 private void updateComputeConsolidationDataGroup(TranslateTo translateTo,
190 NodeTemplate novaNodeTemplate,
192 TranslationContext translationContext = translateTo.getContext();
193 ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
194 ComputeTemplateConsolidationData computeTemplateConsolidationData = ConsolidationDataUtil
195 .getComputeTemplateConsolidationData(translationContext, serviceTemplate,
196 novaNodeTemplate.getType(),
197 translateTo.getTranslatedId());
198 ConsolidationDataUtil.updateGroupIdInConsolidationData(computeTemplateConsolidationData,
202 private boolean isHintOfTypeNovaServerGroup(HeatOrchestrationTemplate heatOrchestrationTemplate,
203 Object resourceToTranslate) {
204 return heatOrchestrationTemplate.getResources().get(resourceToTranslate).getType()
205 .equals(HeatResourcesTypes.NOVA_SERVER_GROUP_RESOURCE_TYPE.getHeatResource());
208 private void addNovaServerToPolicyGroup(TranslateTo translateTo, TranslationContext context,
209 String heatFileName, ServiceTemplate serviceTemplate,
210 HeatOrchestrationTemplate heatOrchestrationTemplate,
211 String resourceToTranslate,
212 NodeTemplate novaNodeTemplate) {
213 mdcDataDebugMessage.debugEntryMessage(null, null);
215 Resource serverGroup =
216 HeatToToscaUtil.getResource(heatOrchestrationTemplate, resourceToTranslate, heatFileName);
217 Optional<String> serverGroupTranslatedId = ResourceTranslationFactory.getInstance(serverGroup)
218 .translateResource(heatFileName, serviceTemplate, heatOrchestrationTemplate, serverGroup,
219 resourceToTranslate, context);
220 if (serverGroupTranslatedId.isPresent()) {
221 serviceTemplate.getTopology_template().getGroups().get(serverGroupTranslatedId.get())
222 .getMembers().add(translateTo.getTranslatedId());
223 updateComputeConsolidationDataGroup(translateTo, novaNodeTemplate,
224 serverGroupTranslatedId.get());
227 mdcDataDebugMessage.debugExitMessage(null, null);
230 private boolean isSchedulerHintsPropExist(Map<String, Object> properties) {
231 return !MapUtils.isEmpty(properties) && Objects.nonNull(properties.get("scheduler_hints"));
234 private void manageNovaServerBlockDeviceMapping(TranslateTo translateTo,
235 NodeTemplate novaNodeTemplate) {
236 mdcDataDebugMessage.debugEntryMessage(null, null);
237 String heatFileName = translateTo.getHeatFileName();
238 TranslationContext context = translateTo.getContext();
239 ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
240 Resource resource = translateTo.getResource();
241 String resourceId = translateTo.getResourceId();
242 String novaServerTranslatedId = translateTo.getTranslatedId();
243 HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo
244 .getHeatOrchestrationTemplate();
245 List<Map<String, Object>> blockDeviceMappingList = getBlockDeviceMappingList(resource);
246 if (CollectionUtils.isEmpty(blockDeviceMappingList)) {
250 Object volumeIdObject;
251 Object snapshotIdObject;
252 String volumeResourceId;
254 for (Map<String, Object> blockDeviceMapping : blockDeviceMappingList) {
255 volumeIdObject = blockDeviceMapping.get("volume_id");
256 snapshotIdObject = blockDeviceMapping.get("snapshot_id");
258 if (volumeIdObject == null && snapshotIdObject == null) {
259 logger.warn("Resource '" + resourceId
260 + "' has block_device_mapping property with empty/missing volume_id and snapshot_id "
261 + "properties. Entry number "
262 + (index + 1) + ", this entry will be ignored in TOSCA translation.");
266 if (volumeIdObject == null) {
267 Optional<AttachedResourceId> attachedSnapshotId = HeatToToscaUtil
268 .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context,
270 if (attachedSnapshotId.isPresent()) {
271 volumeResourceId = novaServerTranslatedId + "_" + attachedSnapshotId.get().getEntityId();
272 String deviceName = (String) blockDeviceMapping.get("device_name");
273 String relationshipId = novaServerTranslatedId + "_" + index;
275 createVolumeAttachesToRelationship(serviceTemplate, deviceName, novaServerTranslatedId,
276 volumeResourceId, relationshipId);
277 createCinderVolumeNodeTemplate(serviceTemplate, translateTo.getResourceId(),
278 volumeResourceId, heatFileName, blockDeviceMapping, heatOrchestrationTemplate,
280 connectNovaServerToVolume(novaNodeTemplate, volumeResourceId, relationshipId,
284 Optional<AttachedResourceId> attachedVolumeId = HeatToToscaUtil
285 .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context,
287 if (attachedVolumeId.isPresent() && attachedVolumeId.get().isGetResource()) {
288 connectNovaServerToVolume(novaNodeTemplate,
289 (String) attachedVolumeId.get().getTranslatedId(), null, translateTo);
295 mdcDataDebugMessage.debugExitMessage(null, null);
298 private void connectNovaServerToVolume(NodeTemplate novaNodeTemplate, String volumeResourceId,
299 String relationshipId, TranslateTo translateTo) {
302 mdcDataDebugMessage.debugEntryMessage(null, null);
304 RequirementAssignment requirementAssignment = new RequirementAssignment();
305 requirementAssignment.setCapability(ToscaCapabilityType.NATIVE_ATTACHMENT);
306 requirementAssignment.setNode(volumeResourceId);
307 if (relationshipId != null) {
308 requirementAssignment.setRelationship(relationshipId);
310 requirementAssignment
311 .setRelationship(ToscaRelationshipType.NATIVE_ATTACHES_TO);
314 .addRequirementAssignment(novaNodeTemplate, ToscaConstants.LOCAL_STORAGE_REQUIREMENT_ID,
315 requirementAssignment);
316 //Add volume consolidation data
317 ConsolidationDataUtil.updateComputeConsolidationDataVolumes(translateTo, novaNodeTemplate
318 .getType(), translateTo.getTranslatedId(), ToscaConstants.LOCAL_STORAGE_REQUIREMENT_ID,
319 requirementAssignment);
321 mdcDataDebugMessage.debugExitMessage(null, null);
324 private void createCinderVolumeNodeTemplate(ServiceTemplate serviceTemplate, String resourceId,
325 String volumeResourceId, String heatFileName,
326 Map<String, Object> blockDeviceMapping,
327 HeatOrchestrationTemplate heatOrchestrationTemplate,
328 TranslationContext context) {
331 mdcDataDebugMessage.debugEntryMessage(null, null);
333 NodeTemplate cinderVolumeNodeTemplate = new NodeTemplate();
334 cinderVolumeNodeTemplate.setType(ToscaNodeType.CINDER_VOLUME);
335 cinderVolumeNodeTemplate.setProperties(TranslatorHeatToToscaPropertyConverter
336 .getToscaPropertiesSimpleConversion(serviceTemplate, resourceId, blockDeviceMapping, null,
337 heatFileName, heatOrchestrationTemplate,
338 HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource(),
339 cinderVolumeNodeTemplate, context));
340 DataModelUtil.addNodeTemplate(serviceTemplate, volumeResourceId, cinderVolumeNodeTemplate);
342 mdcDataDebugMessage.debugExitMessage(null, null);
345 private void createVolumeAttachesToRelationship(ServiceTemplate serviceTemplate,
346 String deviceName, String novaServerTranslatedId,
347 String volumeId, String relationshipId) {
350 mdcDataDebugMessage.debugEntryMessage(null, null);
352 RelationshipTemplate relationshipTemplate = new RelationshipTemplate();
353 relationshipTemplate.setType(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO);
354 Map<String, Object> properties = new HashMap<>();
355 properties.put("instance_uuid", novaServerTranslatedId);
356 properties.put("volume_id", volumeId);
357 if (deviceName != null) {
358 properties.put("device", deviceName);
360 relationshipTemplate.setProperties(properties);
362 DataModelUtil.addRelationshipTemplate(serviceTemplate, relationshipId, relationshipTemplate);
364 mdcDataDebugMessage.debugExitMessage(null, null);
367 private List<Map<String, Object>> getBlockDeviceMappingList(Resource resource) {
370 mdcDataDebugMessage.debugEntryMessage(null, null);
372 if (Objects.isNull(resource.getProperties())) {
373 return Collections.emptyList();
375 List<Map<String, Object>> blockDeviceMappingList =
376 (List<Map<String, Object>>) resource.getProperties().get("block_device_mapping");
377 List<Map<String, Object>> blockDeviceMappingV2List =
378 (List<Map<String, Object>>) resource.getProperties().get("block_device_mapping_v2");
380 if (blockDeviceMappingList != null && blockDeviceMappingV2List != null) {
381 blockDeviceMappingList.addAll(blockDeviceMappingV2List);
382 } else if (CollectionUtils.isEmpty(blockDeviceMappingList)
383 && CollectionUtils.isEmpty(blockDeviceMappingV2List)) {
385 mdcDataDebugMessage.debugExitMessage(null, null);
389 blockDeviceMappingList =
390 blockDeviceMappingList != null ? blockDeviceMappingList : blockDeviceMappingV2List;
393 mdcDataDebugMessage.debugExitMessage(null, null);
394 return blockDeviceMappingList;
397 private void manageNovaServerNetwork(TranslateTo translateTo,
398 NodeTemplate novaNodeTemplate) {
399 mdcDataDebugMessage.debugEntryMessage(null, null);
401 Resource resource = translateTo.getResource();
402 String translatedId = translateTo.getTranslatedId();
404 if (resource.getProperties() == null) {
407 Object networks = resource.getProperties().get("networks");
408 if(Objects.isNull(networks)
409 || !(networks instanceof List)){
413 List<Map<String, Object>> heatNetworkList =
414 (List<Map<String, Object>>) networks;
416 for (Map<String, Object> heatNetwork : heatNetworkList) {
417 getOrTranslatePortTemplate(translateTo, heatNetwork.get(
418 Constants.PORT_PROPERTY_NAME), translatedId, novaNodeTemplate);
421 mdcDataDebugMessage.debugExitMessage(null, null);
425 private void getOrTranslatePortTemplate(TranslateTo translateTo,
427 String novaServerResourceId,
428 NodeTemplate novaNodeTemplate) {
431 mdcDataDebugMessage.debugEntryMessage(null, null);
433 String heatFileName = translateTo.getHeatFileName();
434 HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo
435 .getHeatOrchestrationTemplate();
436 ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
437 TranslationContext context = translateTo.getContext();
439 Optional<AttachedResourceId> attachedPortId = HeatToToscaUtil
440 .extractAttachedResourceId(heatFileName, heatOrchestrationTemplate, context, port);
442 if (!attachedPortId.isPresent()) {
446 if (attachedPortId.get().isGetResource()) {
447 String resourceId = (String) attachedPortId.get().getEntityId();
448 Resource portResource =
449 HeatToToscaUtil.getResource(heatOrchestrationTemplate, resourceId, heatFileName);
450 if (!Arrays.asList(HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource(),
451 HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource())
452 .contains(portResource.getType())) {
453 logger.warn("NovaServer connect to port resource with id : " + resourceId + " and type : "
454 + portResource.getType()
455 + ". This resource type is not supported, therefore the connection to the port is "
456 + "ignored. Supported types are: "
457 + HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource() + ", "
458 + HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE
460 mdcDataDebugMessage.debugExitMessage(null, null);
462 } else if (HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE
463 .getHeatResource().equals(portResource.getType())) {
464 Map<String, Object> properties = portResource.getProperties();
465 if (!MapUtils.isEmpty(properties) && Objects.nonNull(properties.get("port_tuple_refs"))) {
466 novaNodeTemplate.getProperties().put("contrail_service_instance_ind", true);
469 Optional<String> translatedPortId = ResourceTranslationFactory.getInstance(portResource)
470 .translateResource(heatFileName, serviceTemplate, heatOrchestrationTemplate, portResource,
471 resourceId, context);
472 if (translatedPortId.isPresent()) {
473 NodeTemplate portNodeTemplate =
474 DataModelUtil.getNodeTemplate(serviceTemplate, translatedPortId.get());
475 DataModelUtil.addBindingReqFromPortToCompute(novaServerResourceId, portNodeTemplate);
478 ConsolidationDataUtil.updatePortInConsolidationData(translateTo, novaNodeTemplate.getType(),
479 translatedPortId.get());
481 logger.warn("NovaServer connect to port resource with id : " + resourceId + " and type : "
482 + portResource.getType()
483 + ". This resource type is not supported, therefore the connection to the port is "
488 mdcDataDebugMessage.debugExitMessage(null, null);
492 private String createLocalNodeType(ServiceTemplate serviceTemplate, Resource resource, String
494 String translatedId, TranslationContext context) {
495 mdcDataDebugMessage.debugEntryMessage(null, null);
496 NameExtractor nodeTypeNameExtractor = context.getNameExtractorImpl(resource.getType());
497 String nodeTypeName =
498 nodeTypeNameExtractor.extractNodeTypeName(resource, resourceId, translatedId);
500 if (!isNodeTypeCreated(serviceTemplate, nodeTypeName)) {
501 DataModelUtil.addNodeType(serviceTemplate, nodeTypeName, createNodeType());
504 mdcDataDebugMessage.debugExitMessage(null, null);
509 * Get property Regx matcher list.
511 * @return Regex exprission per nova resource property, while nova node type name is consider when
512 * setting the name value.
514 public List<PropertyRegexMatcher> getPropertyRegexMatchersForNovaNodeType() {
515 List<PropertyRegexMatcher> propertyRegexMatchers = new ArrayList<>();
516 propertyRegexMatchers
517 .add(new PropertyRegexMatcher(Constants.NAME_PROPERTY_NAME,
518 Arrays.asList(".+_name$", ".+_names$", ".+_name_[0-9]+"), "_name"));
519 propertyRegexMatchers
520 .add(new PropertyRegexMatcher("image", Collections.singletonList(".+_image_name$"),
522 propertyRegexMatchers
523 .add(new PropertyRegexMatcher("flavor", Collections.singletonList(".+_flavor_name$"),
525 return propertyRegexMatchers;
528 private boolean isNodeTypeCreated(ServiceTemplate serviceTemplate, String nodeTypeName) {
529 return !MapUtils.isEmpty(serviceTemplate.getNode_types())
530 && Objects.nonNull(serviceTemplate.getNode_types().get(nodeTypeName));
533 private NodeType createNodeType() {
534 NodeType nodeType = new NodeType();
535 nodeType.setDerived_from(ToscaNodeType.NOVA_SERVER);