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 com.att.sdc.translator.services.heattotosca.impl.resourcetranslation;
23 import com.att.sdc.tosca.datatypes.AttToscaPolicyType;
24 import com.google.common.base.Strings;
25 import org.apache.commons.collections4.MapUtils;
26 import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate;
27 import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
28 import org.openecomp.sdc.heat.datatypes.model.Resource;
29 import org.openecomp.sdc.tosca.datatypes.ToscaGroupType;
30 import org.openecomp.sdc.tosca.datatypes.ToscaTopologyTemplateElements;
31 import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition;
32 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
33 import org.openecomp.sdc.tosca.datatypes.model.PolicyDefinition;
34 import org.openecomp.sdc.tosca.services.DataModelUtil;
35 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
36 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
37 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil;
38 import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory;
39 import org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation.ResourceTranslationBase;
40 import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter;
42 import java.util.ArrayList;
43 import java.util.Arrays;
44 import java.util.Collections;
45 import java.util.List;
47 import java.util.Objects;
48 import java.util.Optional;
50 import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil.getResource;
52 public class ResourceTranslationValetGroupAssignmentImpl extends ResourceTranslationBase {
53 private static final String AFFINITY = "affinity";
54 private static final String EXCLUSIVITY = "exclusivity";
55 private static final String DIVERSITY = "diversity";
56 private static List<String> supportedPolicies = Arrays.asList(AFFINITY, EXCLUSIVITY, DIVERSITY);
58 private boolean validateGroupType(TranslateTo translateTo) {
59 Map<String, Object> properties = translateTo.getResource().getProperties();
60 if (properties == null) {
64 Object groupType = properties.get("group_type");
65 if (Objects.isNull(groupType)) {
68 return isGroupTypeValid(groupType);
72 protected void translate(TranslateTo translateTo) {
75 mdcDataDebugMessage.debugEntryMessage(null, null);
77 String resourceId = translateTo.getResourceId();
78 Optional<String> toscaPolicyType = getToscaPolicies(translateTo.getResource(), resourceId);
79 if (toscaPolicyType.isPresent()) {
80 List<String> members = getAttValetGroupAssignmentMembers(translateTo);
81 addGroupToTopology(translateTo, resourceId, members);
82 addPoliciesToTopology(translateTo, toscaPolicyType.get());
85 mdcDataDebugMessage.debugExitMessage(null, null);
89 protected String generateTranslatedId(TranslateTo translateTo) {
90 return isEssentialRequirementsValid(translateTo) ? getValetGroupAssignmentTranslatedGroupId(
95 protected Optional<ToscaTopologyTemplateElements> getTranslatedToscaTopologyElement(
96 TranslateTo translateTo) {
97 if (isEssentialRequirementsValid(translateTo)) {
98 return Optional.of(ToscaTopologyTemplateElements.GROUP);
100 return Optional.empty();
105 protected boolean isEssentialRequirementsValid(TranslateTo translateTo) {
106 return validateGroupType(translateTo);
109 private void addPoliciesToTopology(TranslateTo translateTo, String policyType) {
110 mdcDataDebugMessage.debugEntryMessage(null, null);
111 ResourceTranslationBase.logger.info("******** Creating policy '%s' ********", policyType);
112 PolicyDefinition policyDefinition = new PolicyDefinition();
113 policyDefinition.setType(policyType);
116 Collections.singletonList(getValetGroupAssignmentTranslatedGroupId(translateTo)));
117 policyDefinition.setProperties(TranslatorHeatToToscaPropertyConverter
118 .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),
119 translateTo.getResourceId(),translateTo.getResource().getProperties(),
120 policyDefinition.getProperties(), translateTo.getHeatFileName(),
121 translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(),
122 policyDefinition, translateTo.getContext()));
124 DataModelUtil.addPolicyDefinition(translateTo.getServiceTemplate(),
125 getTranslatedPolicyId(translateTo), policyDefinition);
126 ResourceTranslationBase.logger.info("******** Policy '%s' created ********", policyType);
127 mdcDataDebugMessage.debugExitMessage(null, null);
130 private String getTranslatedPolicyId(TranslateTo translateTo) {
131 return translateTo.getResourceId() + "_policy";
134 private void addGroupToTopology(TranslateTo translateTo, String resourceId,
135 List<String> members) {
136 mdcDataDebugMessage.debugEntryMessage(null, null);
137 ResourceTranslationBase.logger
138 .info("******** Start creating group for resource '%s' ********", resourceId);
139 GroupDefinition group = new GroupDefinition();
140 group.setMembers(members);
141 group.setType(ToscaGroupType.NATIVE_ROOT);
142 String groupId = getValetGroupAssignmentTranslatedGroupId(translateTo);
144 .addGroupDefinitionToTopologyTemplate(translateTo.getServiceTemplate(), groupId, group);
145 ResourceTranslationBase.logger
146 .info("******** Creating group '%s' for resource '%s' ********", groupId, resourceId);
147 mdcDataDebugMessage.debugExitMessage(null, null);
150 private List<String> getAttValetGroupAssignmentMembers(TranslateTo translateTo) {
153 mdcDataDebugMessage.debugEntryMessage(null, null);
155 Map<String, Object> properties = translateTo.getResource().getProperties();
156 List<String> members = new ArrayList<>();
157 String refResourceId;
158 Optional<String> refAttachedResourceId;
160 if (MapUtils.isNotEmpty(properties)) {
161 Object resources = properties.get("resources");
163 //if null warning no resource
164 if (resources instanceof List) {
165 for (Object member : ((List) resources)) {
166 if (member instanceof Map) {
167 refResourceId = (String) ((Map) member).get("get_resource");
169 refAttachedResourceId =
170 ResourceTranslationBase.getResourceTranslatedId(translateTo.getHeatFileName(),
171 translateTo.getHeatOrchestrationTemplate(), refResourceId,
172 translateTo.getContext());
173 if (refAttachedResourceId.isPresent() ) {
174 members.add(refAttachedResourceId.get());
175 updateComputeConsolidationDataGroup(translateTo, refResourceId);
182 mdcDataDebugMessage.debugExitMessage(null, null);
186 private void updateComputeConsolidationDataGroup(TranslateTo translateTo,
187 String refResourceId) {
188 Resource refResource =
189 getResource(translateTo.getHeatOrchestrationTemplate(), refResourceId,
190 translateTo.getHeatFileName());
191 if (isNovaServerResource(translateTo.getHeatOrchestrationTemplate(), refResourceId)) {
192 String heatFileName = translateTo.getHeatFileName();
193 Optional<String> translatedNovaServerId =
194 ResourceTranslationFactory.getInstance(refResource)
195 .translateResource(heatFileName, translateTo.getServiceTemplate(),
196 translateTo.getHeatOrchestrationTemplate(), refResource, refResourceId,
197 translateTo.getContext());
198 //Add nova server information to compute data
199 if (translatedNovaServerId.isPresent()) {
200 NodeTemplate translatedNovaServerNodeTemplate = DataModelUtil
201 .getNodeTemplate(translateTo.getServiceTemplate(),
202 translatedNovaServerId.get());
203 if (translatedNovaServerNodeTemplate != null) {
204 ComputeTemplateConsolidationData computeTemplateConsolidationData = ConsolidationDataUtil
205 .getComputeTemplateConsolidationData(translateTo.getContext(), translateTo
206 .getServiceTemplate(), translatedNovaServerNodeTemplate.getType(),
207 translatedNovaServerId.get());
208 ConsolidationDataUtil.updateGroupIdInConsolidationData(computeTemplateConsolidationData,
209 translateTo.getTranslatedId());
215 private boolean isNovaServerResource(HeatOrchestrationTemplate heatOrchestrationTemplate,
216 Object resourceToTranslate) {
217 return heatOrchestrationTemplate.getResources().get(resourceToTranslate).getType()
218 .equals(HeatResourcesTypes.NOVA_SERVER_RESOURCE_TYPE.getHeatResource());
222 private Optional<String> getToscaPolicies(Resource resource, String resourceId) {
225 mdcDataDebugMessage.debugEntryMessage(null, null);
227 Map<String, Object> properties = resource.getProperties();
228 if (Objects.isNull(properties) || Objects.isNull(properties.get("group_type"))) {
229 ResourceTranslationBase.logger
230 .warn("Resource '" + resourceId + "'(" + resource.getType() + ") missing group_type");
231 return Optional.empty();
234 Object groupType = properties.get("group_type");
235 if (!isGroupTypeValid(groupType)) {
236 ResourceTranslationBase.logger.warn("Resource '" + resourceId + "'(" + resource.getType()
237 + ") contains unsupported policy '" + groupType
238 + "'. This resource is been ignored during the translation");
240 mdcDataDebugMessage.debugExitMessage(null, null);
241 return Optional.empty();
244 mdcDataDebugMessage.debugExitMessage(null, null);
245 return getToscaPolicyByGroupType((String) groupType);
249 private boolean isGroupTypeValid(Object groupType) {
250 if (!(groupType instanceof String)) {
253 return supportedPolicies.contains(groupType);
256 private Optional<String> getToscaPolicyByGroupType(String groupType) {
257 mdcDataDebugMessage.debugEntryMessage(null, null);
259 String toscaPolicyType;
262 toscaPolicyType = AttToscaPolicyType.PLACEMENT_VALET_AFFINITY;
265 toscaPolicyType = AttToscaPolicyType.PLACEMENT_VALET_EXCLUSIVITY;
268 toscaPolicyType = AttToscaPolicyType.PLACEMENT_VALET_DIVERSITY;
271 mdcDataDebugMessage.debugExitMessage(null, null);
272 return Optional.of(toscaPolicyType);
276 private String getValetGroupAssignmentTranslatedGroupId(TranslateTo translateTo) {
277 mdcDataDebugMessage.debugEntryMessage(null, null);
279 String resourceId = super.generateTranslatedId(translateTo);
280 String groupName = null;
281 Map<String, Object> properties = translateTo.getResource().getProperties();
283 if (properties == null) {
284 return resourceId + "_group";
287 Object groupNameProperty = properties.get("group_name");
288 if (groupNameProperty instanceof String) {
289 groupName = (String) groupNameProperty;
292 if (!Strings.isNullOrEmpty(groupName)) {
293 groupName = groupName.replace(" ", "_");
294 resourceId += "_" + groupName;
298 mdcDataDebugMessage.debugExitMessage(null, null);
299 return resourceId + "_group";