[SDC-29] Amdocs OnBoard 1707 initial commit.
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / att-sdc-translator-impl / src / main / java / com / att / sdc / translator / services / heattotosca / impl / resourcetranslation / ResourceTranslationValetGroupAssignmentImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package com.att.sdc.translator.services.heattotosca.impl.resourcetranslation;
22
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;
41
42 import java.util.ArrayList;
43 import java.util.Arrays;
44 import java.util.Collections;
45 import java.util.List;
46 import java.util.Map;
47 import java.util.Objects;
48 import java.util.Optional;
49
50 import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil.getResource;
51
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);
57
58   private boolean validateGroupType(TranslateTo translateTo) {
59     Map<String, Object> properties = translateTo.getResource().getProperties();
60     if (properties == null) {
61       return false;
62     }
63
64     Object groupType = properties.get("group_type");
65     if (Objects.isNull(groupType)) {
66       return false;
67     }
68     return isGroupTypeValid(groupType);
69   }
70
71   @Override
72   protected void translate(TranslateTo translateTo) {
73
74
75     mdcDataDebugMessage.debugEntryMessage(null, null);
76
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());
83     }
84
85     mdcDataDebugMessage.debugExitMessage(null, null);
86   }
87
88   @Override
89   protected String generateTranslatedId(TranslateTo translateTo) {
90     return isEssentialRequirementsValid(translateTo) ? getValetGroupAssignmentTranslatedGroupId(
91         translateTo) : null;
92   }
93
94   @Override
95   protected Optional<ToscaTopologyTemplateElements> getTranslatedToscaTopologyElement(
96       TranslateTo translateTo) {
97     if (isEssentialRequirementsValid(translateTo)) {
98       return Optional.of(ToscaTopologyTemplateElements.GROUP);
99     } else {
100       return Optional.empty();
101     }
102   }
103
104   @Override
105   protected boolean isEssentialRequirementsValid(TranslateTo translateTo) {
106     return validateGroupType(translateTo);
107   }
108
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);
114     policyDefinition
115         .setTargets(
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()));
123
124     DataModelUtil.addPolicyDefinition(translateTo.getServiceTemplate(),
125         getTranslatedPolicyId(translateTo), policyDefinition);
126     ResourceTranslationBase.logger.info("******** Policy '%s' created ********", policyType);
127     mdcDataDebugMessage.debugExitMessage(null, null);
128   }
129
130   private String getTranslatedPolicyId(TranslateTo translateTo) {
131     return translateTo.getResourceId() + "_policy";
132   }
133
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);
143     DataModelUtil
144         .addGroupDefinitionToTopologyTemplate(translateTo.getServiceTemplate(), groupId, group);
145     ResourceTranslationBase.logger
146         .info("******** Creating group '%s' for resource '%s' ********", groupId, resourceId);
147     mdcDataDebugMessage.debugExitMessage(null, null);
148   }
149
150   private List<String> getAttValetGroupAssignmentMembers(TranslateTo translateTo) {
151
152
153     mdcDataDebugMessage.debugEntryMessage(null, null);
154
155     Map<String, Object> properties = translateTo.getResource().getProperties();
156     List<String> members = new ArrayList<>();
157     String refResourceId;
158     Optional<String> refAttachedResourceId;
159
160     if (MapUtils.isNotEmpty(properties)) {
161       Object resources = properties.get("resources");
162
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");
168
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);
176             }
177           }
178         }
179       }
180     }
181
182     mdcDataDebugMessage.debugExitMessage(null, null);
183     return members;
184   }
185
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());
210         }
211       }
212     }
213   }
214
215   private boolean isNovaServerResource(HeatOrchestrationTemplate heatOrchestrationTemplate,
216                                               Object resourceToTranslate) {
217     return heatOrchestrationTemplate.getResources().get(resourceToTranslate).getType()
218         .equals(HeatResourcesTypes.NOVA_SERVER_RESOURCE_TYPE.getHeatResource());
219   }
220
221
222   private Optional<String> getToscaPolicies(Resource resource, String resourceId) {
223
224
225     mdcDataDebugMessage.debugEntryMessage(null, null);
226
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();
232     }
233
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");
239
240       mdcDataDebugMessage.debugExitMessage(null, null);
241       return Optional.empty();
242     }
243
244     mdcDataDebugMessage.debugExitMessage(null, null);
245     return getToscaPolicyByGroupType((String) groupType);
246
247   }
248
249   private boolean isGroupTypeValid(Object groupType) {
250     if (!(groupType instanceof String)) {
251       return false;
252     }
253     return supportedPolicies.contains(groupType);
254   }
255
256   private Optional<String> getToscaPolicyByGroupType(String groupType) {
257     mdcDataDebugMessage.debugEntryMessage(null, null);
258
259     String toscaPolicyType;
260     switch (groupType) {
261       case AFFINITY:
262         toscaPolicyType = AttToscaPolicyType.PLACEMENT_VALET_AFFINITY;
263         break;
264       case EXCLUSIVITY:
265         toscaPolicyType = AttToscaPolicyType.PLACEMENT_VALET_EXCLUSIVITY;
266         break;
267       default:
268         toscaPolicyType = AttToscaPolicyType.PLACEMENT_VALET_DIVERSITY;
269     }
270
271     mdcDataDebugMessage.debugExitMessage(null, null);
272     return Optional.of(toscaPolicyType);
273   }
274
275
276   private String getValetGroupAssignmentTranslatedGroupId(TranslateTo translateTo) {
277     mdcDataDebugMessage.debugEntryMessage(null, null);
278
279     String resourceId = super.generateTranslatedId(translateTo);
280     String groupName = null;
281     Map<String, Object> properties = translateTo.getResource().getProperties();
282
283     if (properties == null) {
284       return resourceId + "_group";
285     }
286
287     Object groupNameProperty = properties.get("group_name");
288     if (groupNameProperty instanceof String) {
289       groupName = (String) groupNameProperty;
290     }
291
292     if (!Strings.isNullOrEmpty(groupName)) {
293       groupName = groupName.replace(" ", "_");
294       resourceId += "_" + groupName;
295
296     }
297
298     mdcDataDebugMessage.debugExitMessage(null, null);
299     return resourceId + "_group";
300   }
301 }