3 * * ============LICENSE_START=======================================================
4 * * Copyright (C) 2019 Nordix Foundation.
5 * * ================================================================================
6 * * Licensed under the Apache License, Version 2.0 (the "License");
7 * * you may not use this file except in compliance with the License.
8 * * You may obtain a copy of the License at
10 * * http://www.apache.org/licenses/LICENSE-2.0
12 * * Unless required by applicable law or agreed to in writing, software
13 * * distributed under the License is distributed on an "AS IS" BASIS,
14 * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * * See the License for the specific language governing permissions and
16 * * limitations under the License.
18 * * SPDX-License-Identifier: Apache-2.0
19 * * ============LICENSE_END=========================================================
23 package org.openecomp.core.impl;
25 import org.apache.commons.collections.MapUtils;
26 import org.onap.sdc.tosca.datatypes.model.ArtifactDefinition;
27 import org.onap.sdc.tosca.datatypes.model.CapabilityAssignment;
28 import org.onap.sdc.tosca.datatypes.model.NodeFilter;
29 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
30 import org.onap.sdc.tosca.datatypes.model.ParameterDefinition;
31 import org.onap.sdc.tosca.datatypes.model.PolicyDefinition;
32 import org.onap.sdc.tosca.datatypes.model.RequirementAssignment;
33 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
34 import org.onap.sdc.tosca.datatypes.model.SubstitutionMapping;
35 import org.onap.sdc.tosca.datatypes.model.Trigger;
36 import org.openecomp.core.converter.ServiceTemplateReaderService;
37 import org.openecomp.core.converter.datatypes.Constants;
38 import org.openecomp.core.converter.errors.SubstitutionMappingsConverterErrorBuilder;
39 import org.openecomp.sdc.common.errors.CoreException;
40 import org.openecomp.sdc.tosca.services.DataModelUtil;
42 import java.util.HashMap;
43 import java.util.List;
45 import java.util.Objects;
46 import java.util.Optional;
48 import static org.openecomp.core.converter.datatypes.Constants.CAPABILITIES;
49 import static org.openecomp.core.converter.datatypes.Constants.INPUTS;
50 import static org.openecomp.core.converter.datatypes.Constants.NODE_FILTER;
51 import static org.openecomp.core.converter.datatypes.Constants.NODE_TYPE;
52 import static org.openecomp.core.converter.datatypes.Constants.OUTPUTS;
53 import static org.openecomp.core.converter.datatypes.Constants.REQUIREMENTS;
55 public class VnfTopologyTemplateConverter {
57 public void convertTopologyTemplate(ServiceTemplate serviceTemplate, ServiceTemplateReaderService readerService) {
58 convertInputs(serviceTemplate, readerService);
59 convertNodeTemplates(serviceTemplate, readerService);
60 convertOutputs(serviceTemplate, readerService);
61 convertSubstitutionMappings(serviceTemplate, readerService);
62 convertPolicies(serviceTemplate, readerService);
65 private void convertInputs(ServiceTemplate serviceTemplate, ServiceTemplateReaderService readerService) {
66 Map<String, Object> inputs = readerService.getInputs();
67 addInputsOrOutputsToServiceTemplate(serviceTemplate, inputs, Constants.INPUTS);
70 private void convertOutputs(ServiceTemplate serviceTemplate, ServiceTemplateReaderService readerService) {
71 Map<String, Object> outputs = readerService.getOutputs();
72 addInputsOrOutputsToServiceTemplate(serviceTemplate, outputs, Constants.OUTPUTS);
75 private void addInputsOrOutputsToServiceTemplate(ServiceTemplate serviceTemplate, Map<String, Object> mapToConvert,
76 String inputsOrOutputs) {
77 if (MapUtils.isEmpty(mapToConvert)) {
81 for (Map.Entry<String, Object> entry : mapToConvert.entrySet()) {
82 Optional<ParameterDefinition> parameterDefinition = ToscaConverterUtil.createObjectFromClass(entry.getKey(),
83 entry.getValue(), ParameterDefinition.class);
85 parameterDefinition.ifPresent(parameterDefinitionValue -> {
86 Optional<Object> defaultValue =
87 ToscaConverterUtil.getDefaultValue(entry.getValue(), parameterDefinition.get());
88 defaultValue.ifPresent(parameterDefinitionValue::set_default);
89 addToServiceTemplateAccordingToSection(serviceTemplate, inputsOrOutputs, entry.getKey(),
90 parameterDefinition.get());
95 private void addToServiceTemplateAccordingToSection(ServiceTemplate serviceTemplate, String inputsOrOutputs,
96 String parameterId, ParameterDefinition parameterDefinition) {
97 if (inputsOrOutputs.equals(INPUTS)) {
98 DataModelUtil.addInputParameterToTopologyTemplate(serviceTemplate, parameterId, parameterDefinition);
99 } else if (inputsOrOutputs.equals(OUTPUTS)) {
100 DataModelUtil.addOutputParameterToTopologyTemplate(serviceTemplate, parameterId, parameterDefinition);
104 private void convertNodeTemplates(ServiceTemplate serviceTemplate, ServiceTemplateReaderService readerService) {
105 Map<String, Object> nodeTemplates = readerService.getNodeTemplates();
106 if (MapUtils.isEmpty(nodeTemplates)) {
110 for (Map.Entry<String, Object> nodeTemplateEntry : nodeTemplates.entrySet()) {
111 NodeTemplate nodeTemplate = convertNodeTemplate(nodeTemplateEntry.getValue());
112 DataModelUtil.addNodeTemplate(serviceTemplate, nodeTemplateEntry.getKey(), nodeTemplate);
116 private NodeTemplate convertNodeTemplate(Object candidateNodeTemplate) {
117 NodeTemplate nodeTemplate = new NodeTemplate();
119 Map<String, Object> nodeTemplateAsMap = (Map<String, Object>) candidateNodeTemplate;
120 nodeTemplate.setArtifacts((Map<String, ArtifactDefinition>) nodeTemplateAsMap.get("artifacts"));
121 nodeTemplate.setAttributes((Map<String, Object>) nodeTemplateAsMap.get("attributes"));
122 nodeTemplate.setCopy((String) nodeTemplateAsMap.get("copy"));
123 nodeTemplate.setDescription((String) nodeTemplateAsMap.get("description"));
124 nodeTemplate.setDirectives((List<String>) nodeTemplateAsMap.get("directives"));
125 nodeTemplate.setInterfaces((Map<String, Object>) nodeTemplateAsMap.get("interfaces"));
126 nodeTemplate.setNode_filter((NodeFilter) nodeTemplateAsMap.get(NODE_FILTER));
127 nodeTemplate.setProperties((Map<String, Object>) nodeTemplateAsMap.get("properties"));
128 nodeTemplate.setRequirements((List<Map<String, RequirementAssignment>>) nodeTemplateAsMap.get("requirements"));
129 nodeTemplate.setType((String) nodeTemplateAsMap.get("type"));
130 nodeTemplate.setCapabilities(convertCapabilities((Map<String, Object>) nodeTemplateAsMap.get("capabilities")));
135 private Map<String, CapabilityAssignment> convertCapabilities(Map<String, Object> capabilities) {
136 if (MapUtils.isEmpty(capabilities)) {
140 Map<String, CapabilityAssignment> convertedCapabilities = new HashMap<>();
141 for (Map.Entry<String, Object> capabilityAssignmentEntry : capabilities.entrySet()) {
142 Optional<CapabilityAssignment> capabilityAssignment = ToscaConverterUtil.createObjectFromClass(
143 capabilityAssignmentEntry.getKey(), capabilityAssignmentEntry.getValue(),
144 CapabilityAssignment.class);
146 capabilityAssignment.ifPresent(capabilityAssignmentValue -> convertedCapabilities
147 .put(capabilityAssignmentEntry.getKey(),
148 capabilityAssignmentValue));
151 return convertedCapabilities;
154 private void convertSubstitutionMappings(ServiceTemplate serviceTemplate,
155 ServiceTemplateReaderService readerService) {
156 Map<String, Object> substitutionMappings = readerService.getSubstitutionMappings();
157 if (MapUtils.isEmpty(substitutionMappings)) {
160 SubstitutionMapping substitutionMapping = convertSubstitutionMappings(substitutionMappings);
161 DataModelUtil.addSubstitutionMapping(serviceTemplate, substitutionMapping);
164 private SubstitutionMapping convertSubstitutionMappings(Map<String, Object> substitutionMappings) {
165 SubstitutionMapping substitutionMapping = new SubstitutionMapping();
167 substitutionMapping.setNode_type((String) substitutionMappings.get(NODE_TYPE));
168 substitutionMapping.setCapabilities(
169 convertSubstitutionMappingsSections(CAPABILITIES, substitutionMappings.get(CAPABILITIES)));
170 substitutionMapping.setRequirements(
171 convertSubstitutionMappingsSections(REQUIREMENTS, substitutionMappings.get(REQUIREMENTS)));
172 substitutionMapping.setSubstitution_filter((NodeFilter) substitutionMappings.get(NODE_FILTER));
174 return substitutionMapping;
177 private Map<String, List<String>> convertSubstitutionMappingsSections(String sectionName, Object sectionToConvert) {
179 if (Objects.isNull(sectionToConvert)) {
183 if (!(sectionToConvert instanceof Map)) {
184 throw new CoreException(new SubstitutionMappingsConverterErrorBuilder(sectionName,
185 sectionToConvert.getClass().getSimpleName()).build());
188 return convertSection(sectionToConvert);
191 private Map<String, List<String>> convertSection(Object sectionToConvert) {
193 Map<String, Object> sectionAsMap = (Map<String, Object>) sectionToConvert;
194 Map<String, List<String>> convertedSection = new HashMap<>();
196 if (MapUtils.isEmpty(sectionAsMap)) {
200 for (Map.Entry<String, Object> entry : sectionAsMap.entrySet()) {
201 if (entry.getValue() instanceof List) {
202 convertedSection.put(entry.getKey(), (List<String>) entry.getValue());
206 return convertedSection;
209 private void convertPolicies(ServiceTemplate serviceTemplate, ServiceTemplateReaderService readerService) {
210 Map<String, Object> policiesAsMap = readerService.getPolicies();
211 for (Map.Entry<String, Object> policy : policiesAsMap.entrySet()) {
212 PolicyDefinition policyDefinition = convertPolicy(policy.getValue());
213 DataModelUtil.addPolicyDefinition(serviceTemplate, policy.getKey(), policyDefinition);
217 private PolicyDefinition convertPolicy(Object policyCandidate) {
218 PolicyDefinition policyDefinition = new PolicyDefinition();
219 Map<String, Object> policy = (Map<String, Object>) policyCandidate;
220 policyDefinition.setDescription((String) policy.get("description"));
221 policyDefinition.setType((String) policy.get("type"));
222 policyDefinition.setMetadata((Map<String, String>) policy.get("metadata"));
223 policyDefinition.setProperties((Map<String, Object>) policy.get("properties"));
224 policyDefinition.setTargets((List<String>) policy.get("targets"));
225 policyDefinition.setTriggers((Map<String, Trigger>) policy.get("triggers"));
227 return policyDefinition;