92592180490a2a79f791d72c1f2be8d7e35791f6
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / services / heattotosca / impl / resourcetranslation / ResourceTranslationNovaServerGroupsImpl.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 org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation;
22
23 import org.apache.commons.collections4.CollectionUtils;
24 import org.openecomp.sdc.heat.datatypes.model.Resource;
25 import org.openecomp.sdc.tosca.datatypes.ToscaGroupType;
26 import org.openecomp.sdc.tosca.datatypes.ToscaPolicyType;
27 import org.openecomp.sdc.tosca.datatypes.ToscaTopologyTemplateElements;
28 import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition;
29 import org.openecomp.sdc.tosca.datatypes.model.PolicyDefinition;
30 import org.openecomp.sdc.tosca.services.DataModelUtil;
31 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
32 import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter;
33
34 import java.util.ArrayList;
35 import java.util.Arrays;
36 import java.util.List;
37 import java.util.Map;
38 import java.util.Objects;
39 import java.util.Optional;
40
41
42 public class ResourceTranslationNovaServerGroupsImpl extends ResourceTranslationBase {
43   private static final String AFFINITY = "affinity";
44   private static final String ANTI_AFFINITY = "anti-affinity";
45   private static List<String> supportedPolicies = Arrays.asList(AFFINITY, ANTI_AFFINITY);
46
47   @Override
48   protected String generateTranslatedId(TranslateTo translateTo) {
49     return isEssentialRequirementsValid(translateTo) ? getTranslatedGroupId(
50         translateTo.getResourceId()) : null;
51   }
52
53   @Override
54   protected boolean isEssentialRequirementsValid(TranslateTo translateTo) {
55     return validatePolicyType(translateTo);
56   }
57
58   @Override
59   protected Optional<ToscaTopologyTemplateElements> getTranslatedToscaTopologyElement(
60       TranslateTo translateTo) {
61     if (isEssentialRequirementsValid(translateTo)) {
62       return Optional.of(ToscaTopologyTemplateElements.GROUP);
63     } else {
64       return Optional.empty();
65     }
66   }
67
68   private boolean validatePolicyType(TranslateTo translateTo) {
69     Map<String, Object> properties = translateTo.getResource().getProperties();
70     if (Objects.isNull(properties) || Objects.isNull(properties.get("policies"))) {
71       return true;
72     }
73
74     Object policies = properties.get("policies");
75     if (!(policies instanceof List)) {
76       return false;
77     }
78
79     for (Object policy : (List) policies) {
80       if (!isValidPolicyType(policy, translateTo.getResourceId(), translateTo.getResource())) {
81         return false;
82       }
83     }
84     return true;
85   }
86
87   private boolean isValidPolicyType(Object policy, String resourceId, Resource resource) {
88     if (!(policy instanceof String)) {
89       return false;
90     }
91
92     if ((policy instanceof String) && !supportedPolicies.contains(policy)) {
93       logger.warn("Resource '" + resourceId + "'(" + resource.getType()
94           + ")  contains unsupported policy '" + policy.toString()
95           + "'. This resource is been ignored during the translation");
96       return false;
97     }
98
99     return true;
100   }
101
102   @Override
103   protected void translate(TranslateTo translateTo) {
104     String resourceId = translateTo.getResourceId();
105     List<String> toscaPolicyTypes = getToscaPolicies(translateTo.getResource(), resourceId);
106     if (!CollectionUtils.isEmpty(toscaPolicyTypes)) {
107       String translatedGroupId = addGroupToTopology(translateTo, resourceId);
108       addPoliciesToTopology(translateTo, translatedGroupId, toscaPolicyTypes);
109     }
110   }
111
112   private void addPoliciesToTopology(TranslateTo translateTo, String policyTargetEntityId,
113                                      List<String> toscaPolicyTypes) {
114     logger.info("******** Start creating policies for resource '%s' ********",
115         translateTo.getResourceId());
116     for (int i = 0; i < toscaPolicyTypes.size(); i++) {
117       String policy = toscaPolicyTypes.get(i);
118       logger.info("******** Creating policy '%s' ********", policy);
119       PolicyDefinition policyDefinition = new PolicyDefinition();
120       policyDefinition.setType(policy);
121       policyDefinition.setTargets(Arrays.asList(policyTargetEntityId));
122       policyDefinition.setProperties(TranslatorHeatToToscaPropertyConverter
123           .getToscaPropertiesSimpleConversion(translateTo.getServiceTemplate(),
124               translateTo.getResourceId(),translateTo.getResource().getProperties(),
125               policyDefinition.getProperties(), translateTo.getHeatFileName(),
126               translateTo.getHeatOrchestrationTemplate(), translateTo.getResource().getType(),
127               policyDefinition, translateTo.getContext()));
128       policyDefinition.getProperties().put(
129           policy.equals(ToscaPolicyType.PLACEMENT_ANTILOCATE) ? "container_type"
130               : AFFINITY, "host");
131       String policyId = getTranslatedPolicyId(translateTo, toscaPolicyTypes, i);
132       DataModelUtil
133           .addPolicyDefinition(translateTo.getServiceTemplate(), policyId, policyDefinition);
134       logger.info("******** Policy '%s' created ********", policy);
135     }
136
137     logger
138         .info("******** All policies for resource '%s' created successfully ********",
139             translateTo.getResourceId());
140   }
141
142   private String getTranslatedPolicyId(TranslateTo translateTo, List<String> toscaPolicyTypes,
143                                        int policyIndex) {
144     return translateTo.getResourceId() + (toscaPolicyTypes.size() > 1 ? policyIndex : "")
145         + "_policy";
146   }
147
148   private String addGroupToTopology(TranslateTo translateTo, String resourceId) {
149     logger.info("******** Start creating group for resource '%s' ********", resourceId);
150     GroupDefinition group = new GroupDefinition();
151     group.setMembers(new ArrayList<>());
152     group.setType(ToscaGroupType.NATIVE_ROOT);
153     String translatedGroupId = getTranslatedGroupId(resourceId);
154     DataModelUtil
155         .addGroupDefinitionToTopologyTemplate(translateTo.getServiceTemplate(),
156             translatedGroupId, group);
157     logger.info("******** Creating group '%s' for resource '%s' ********", resourceId, resourceId);
158     return translatedGroupId;
159   }
160
161   private String getTranslatedGroupId(String resourceId) {
162     return resourceId + "_group";
163   }
164
165   private List<String> getToscaPolicies(Resource resource, String resourceId) {
166     Map<String, Object> properties = resource.getProperties();
167     if (Objects.isNull(properties) || Objects.isNull(properties.get("policies"))) {
168       return Arrays.asList(ToscaPolicyType.PLACEMENT_ANTILOCATE);
169     }
170
171     List<Object> policies = (List) properties.get("policies");
172     List<String> retList = new ArrayList<>();
173     policies.forEach(policy -> {
174       if (isValidPolicyType(policy, resourceId, resource)) {
175         retList.add(getToscaPolicyByHotPolicy(policy));
176       }
177     });
178     return retList;
179   }
180
181   private String getToscaPolicyByHotPolicy(Object policy) {
182     if (Objects.equals(policy, AFFINITY)) {
183       return ToscaPolicyType.PLACEMENT_COLOCATE;
184     } else {
185       return ToscaPolicyType.PLACEMENT_ANTILOCATE;
186     }
187   }
188
189 }