2 * Copyright © 2016-2017 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.openecomp.sdc.vendorsoftwareproduct.impl;
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.Iterator;
22 import java.util.List;
25 import org.apache.commons.collections4.CollectionUtils;
26 import org.apache.commons.lang.StringUtils;
27 import org.openecomp.sdc.common.errors.CoreException;
28 import org.openecomp.sdc.common.errors.ErrorCode;
29 import org.openecomp.sdc.vendorsoftwareproduct.CompositionEntityDataManager;
30 import org.openecomp.sdc.vendorsoftwareproduct.DeploymentFlavorManager;
31 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
32 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
33 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDao;
34 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
35 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
36 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
37 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.DeploymentFlavorEntity;
38 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
39 import org.openecomp.sdc.vendorsoftwareproduct.errors.DeploymentFlavorErrorBuilder;
40 import org.openecomp.sdc.vendorsoftwareproduct.errors.NotSupportedHeatOnboardMethodErrorBuilder;
41 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
42 import org.openecomp.sdc.vendorsoftwareproduct.types.CompositionEntityResponse;
43 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentComputeAssociation;
44 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
45 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
46 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.DeploymentFlavor;
47 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.DeploymentFlavorCompositionSchemaInput;
48 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
49 import org.openecomp.sdc.versioning.VersioningUtil;
50 import org.openecomp.sdc.versioning.dao.types.Version;
54 public class DeploymentFlavorManagerImpl implements DeploymentFlavorManager {
55 private final VendorSoftwareProductInfoDao vspInfoDao;
56 private final DeploymentFlavorDao deploymentFlavorDao;
57 private final CompositionEntityDataManager compositionEntityDataManager;
58 private final ComputeDao computeDao;
59 private final ComponentDao componentDao;
61 public DeploymentFlavorManagerImpl(VendorSoftwareProductInfoDao vspInfoDao,
62 DeploymentFlavorDao deploymentFlavorDao,
63 CompositionEntityDataManager compositionEntityDataManager,
64 ComputeDao computeDao, ComponentDao componentDao) {
65 this.vspInfoDao = vspInfoDao;
66 this.deploymentFlavorDao = deploymentFlavorDao;
67 this.compositionEntityDataManager = compositionEntityDataManager;
68 this.computeDao = computeDao;
69 this.componentDao = componentDao;
74 public Collection<DeploymentFlavorEntity> listDeploymentFlavors(String vspId, Version version) {
75 return deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
79 public DeploymentFlavorEntity createDeploymentFlavor(
80 DeploymentFlavorEntity deploymentFlavorEntity) {
81 DeploymentFlavorEntity createDeploymentFlavor;
82 if (!vspInfoDao.isManual(deploymentFlavorEntity.getVspId(), deploymentFlavorEntity.getVersion())) {
83 ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder
84 .getAddDeploymentNotSupportedHeatOnboardErrorBuilder();
85 throw new CoreException(deploymentFlavorErrorBuilder);
87 validateDeploymentFlavor(deploymentFlavorEntity, deploymentFlavorEntity.getVersion());
88 createDeploymentFlavor =
89 compositionEntityDataManager.createDeploymentFlavor(deploymentFlavorEntity);
91 return createDeploymentFlavor;
94 private void validateDeploymentFlavor(DeploymentFlavorEntity deploymentFlavorEntity,
96 //Validation for unique model.
97 Collection<DeploymentFlavorEntity> listDeploymentFlavors =
98 listDeploymentFlavors(deploymentFlavorEntity.getVspId(),
100 isDeploymentFlavorModelDuplicate(deploymentFlavorEntity, listDeploymentFlavors);
102 List<String> featureGroups =
103 getFeatureGroupListForVsp(deploymentFlavorEntity.getVspId(), version);
104 String featureGroup = deploymentFlavorEntity.getDeploymentFlavorCompositionData()
105 .getFeatureGroupId();
106 if (featureGroup != null && featureGroup.trim().length() > 0
107 && (isEmpty(featureGroups) || (!(validFeatureGroup(featureGroups, featureGroup))))) {
108 ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder
109 .getFeatureGroupNotexistErrorBuilder();
110 throw new CoreException(deploymentFlavorErrorBuilder);
112 validateComponentComputeAssociation(deploymentFlavorEntity, version);
115 private void isDeploymentFlavorModelDuplicate(DeploymentFlavorEntity deploymentFlavorEntity,
116 Collection<DeploymentFlavorEntity> listDeploymentFlavors) {
117 listDeploymentFlavors.forEach(deploymentFlavor -> {
118 if (deploymentFlavorEntity.getDeploymentFlavorCompositionData().getModel().equalsIgnoreCase(
119 deploymentFlavor.getDeploymentFlavorCompositionData().getModel())) {
120 ErrorCode deploymentFlavorModelErrorBuilder = DeploymentFlavorErrorBuilder
121 .getDuplicateDeploymentFlavorModelErrorBuilder(
122 deploymentFlavorEntity.getDeploymentFlavorCompositionData().getModel(),
123 deploymentFlavorEntity.getVspId());
124 throw new CoreException(deploymentFlavorModelErrorBuilder);
129 private List<String> getFeatureGroupListForVsp(String vspId, Version version) {
130 final VspDetails vspDetails = vspInfoDao.get(new VspDetails(vspId, version));
131 return vspDetails.getFeatureGroups();
134 private boolean isEmpty(Collection coll) {
135 return coll == null || coll.isEmpty();
138 private boolean validFeatureGroup(List<String> featureGroups, String featureGroupId) {
139 Iterator<String> iterator = featureGroups.iterator();
140 boolean valid = false;
141 while (iterator.hasNext()) {
142 String fgId = iterator.next().trim();
143 if (fgId.equals(featureGroupId)) {
153 private void validateComponentComputeAssociation(DeploymentFlavorEntity deploymentFlavorEntity,
155 List<ComponentComputeAssociation> componentComputeAssociationList =
156 deploymentFlavorEntity.getDeploymentFlavorCompositionData().getComponentComputeAssociations();
157 List<String> vfcList = new ArrayList<>();
158 if (!isEmpty(componentComputeAssociationList)) {
159 componentComputeAssociationList.forEach(
160 componentComputeAssociation -> validateComponentComputeAssocoationList(deploymentFlavorEntity,
162 vfcList, componentComputeAssociation));
163 Map<String, Integer> frequencyMapping = CollectionUtils.getCardinalityMap(vfcList);
165 for (Integer vfcCount : frequencyMapping.values()) {
167 ErrorCode duplicateVfcAssociationErrorBuilder =
168 DeploymentFlavorErrorBuilder.getDuplicateVfcAssociationErrorBuilder();
169 throw new CoreException(duplicateVfcAssociationErrorBuilder);
175 private void validateComponentComputeAssocoationList(
176 DeploymentFlavorEntity deploymentFlavorEntity,
178 List<String> vfcList,
179 ComponentComputeAssociation componentComputeAssociation) {
180 if ((componentComputeAssociation.getComponentId() == null || componentComputeAssociation
181 .getComponentId().trim().length() == 0)
182 && (componentComputeAssociation
183 .getComputeFlavorId() != null && componentComputeAssociation
184 .getComputeFlavorId().trim().length() > 0)) {
185 ErrorCode invalidAssociationErrorBuilder = DeploymentFlavorErrorBuilder
186 .getInvalidAssociationErrorBuilder();
187 throw new CoreException(invalidAssociationErrorBuilder);
188 } else if (componentComputeAssociation.getComponentId() != null
189 && componentComputeAssociation.getComponentId().trim().length() > 0) {
190 validateComponentAssociation(deploymentFlavorEntity,
191 version, componentComputeAssociation);
193 validateComponentComputeAssociationFlavour(deploymentFlavorEntity,
194 version, componentComputeAssociation);
195 vfcList.add(componentComputeAssociation.getComponentId());
199 private void validateComponentAssociation(DeploymentFlavorEntity deploymentFlavorEntity, Version version,
200 ComponentComputeAssociation componentComputeAssociation) {
202 if (StringUtils.isNotBlank(componentComputeAssociation.getComponentId())) {
203 ComponentEntity componentEntity =
204 componentDao.get(new ComponentEntity(deploymentFlavorEntity.getVspId(), version,
205 componentComputeAssociation.getComponentId()));
206 if (componentEntity == null) {
207 ErrorCode invalidComputeIdErrorBuilder =
208 DeploymentFlavorErrorBuilder.getInvalidComponentIdErrorBuilder();
209 throw new CoreException(invalidComputeIdErrorBuilder);
214 private void validateComponentComputeAssociationFlavour(
215 DeploymentFlavorEntity deploymentFlavorEntity,
217 ComponentComputeAssociation componentComputeAssociation) {
218 if (componentComputeAssociation
219 .getComputeFlavorId() != null && componentComputeAssociation
220 .getComputeFlavorId().trim().length() > 0) {
221 ComputeEntity computeFlavor = computeDao.get(new ComputeEntity(deploymentFlavorEntity
222 .getVspId(), version, componentComputeAssociation.getComponentId(),
223 componentComputeAssociation.getComputeFlavorId()));
224 if (computeFlavor == null) {
225 ErrorCode invalidComputeIdErrorBuilder = DeploymentFlavorErrorBuilder
226 .getInvalidComputeIdErrorBuilder();
227 throw new CoreException(invalidComputeIdErrorBuilder);
233 public CompositionEntityResponse<DeploymentFlavor> getDeploymentFlavor(String vspId,
235 String deploymentFlavorId) {
236 DeploymentFlavorEntity deploymentFlavorEntity =
237 getValidatedDeploymentFlavor(vspId, version, deploymentFlavorId);
238 DeploymentFlavor deploymentFlavor = deploymentFlavorEntity.getDeploymentFlavorCompositionData();
239 DeploymentFlavorCompositionSchemaInput schemaInput = new
240 DeploymentFlavorCompositionSchemaInput();
241 schemaInput.setManual(vspInfoDao.isManual(vspId, version));
242 schemaInput.setDeploymentFlavor(deploymentFlavor);
243 List<String> featureGroups =
244 getFeatureGroupListForVsp(vspId, version);
245 schemaInput.setFeatureGroupIds(featureGroups);
246 CompositionEntityResponse<DeploymentFlavor> response = new CompositionEntityResponse<>();
247 response.setId(deploymentFlavorId);
248 response.setSchema(SchemaGenerator
249 .generate(SchemaTemplateContext.composition, CompositionEntityType.deployment,
251 response.setData(deploymentFlavor);
255 private DeploymentFlavorEntity getValidatedDeploymentFlavor(String vspId, Version version, String
256 deploymentFlavorId) {
257 DeploymentFlavorEntity retrieved = deploymentFlavorDao.get(new DeploymentFlavorEntity(vspId,
258 version, deploymentFlavorId));
260 .validateEntityExistence(retrieved, new DeploymentFlavorEntity(vspId, version,
261 deploymentFlavorId), VspDetails.ENTITY_TYPE);
266 public CompositionEntityResponse<DeploymentFlavor> getDeploymentFlavorSchema(String vspId,
268 DeploymentFlavorCompositionSchemaInput schemaInput =
269 new DeploymentFlavorCompositionSchemaInput();
270 schemaInput.setManual(vspInfoDao.isManual(vspId, version));
271 List<String> featureGroups =
272 getFeatureGroupListForVsp(vspId, version);
273 schemaInput.setFeatureGroupIds(featureGroups);
274 CompositionEntityResponse<DeploymentFlavor> response = new CompositionEntityResponse<>();
275 response.setSchema(SchemaGenerator
276 .generate(SchemaTemplateContext.composition, CompositionEntityType.deployment,
282 public void deleteDeploymentFlavor(String vspId, Version version, String deploymentFlavorId) {
283 DeploymentFlavorEntity deploymentFlavorEntity =
284 getValidatedDeploymentFlavor(vspId, version, deploymentFlavorId);
285 if (!vspInfoDao.isManual(vspId, version)) {
286 final ErrorCode deleteDeploymentFlavorErrorBuilder =
287 NotSupportedHeatOnboardMethodErrorBuilder
288 .getDelDeploymentFlavorNotSupportedHeatOnboardMethodErrorBuilder();
289 throw new CoreException(deleteDeploymentFlavorErrorBuilder);
291 if (deploymentFlavorEntity != null) {
292 deploymentFlavorDao.delete(new DeploymentFlavorEntity(vspId, version, deploymentFlavorId));
298 public CompositionEntityValidationData updateDeploymentFlavor(
299 DeploymentFlavorEntity deploymentFlavorEntity) {
300 if (!vspInfoDao.isManual(deploymentFlavorEntity.getVspId(),
301 deploymentFlavorEntity.getVersion())) {
302 final ErrorCode updateDeploymentFlavorErrorBuilder =
303 NotSupportedHeatOnboardMethodErrorBuilder
304 .getUpdateDfNotSupportedHeatOnboardMethodErrorBuilder();
305 throw new CoreException(updateDeploymentFlavorErrorBuilder);
307 DeploymentFlavorEntity retrieved =
308 getValidatedDeploymentFlavor(deploymentFlavorEntity.getVspId(),
309 deploymentFlavorEntity.getVersion(),
310 deploymentFlavorEntity.getId());
313 Collection<DeploymentFlavorEntity> listDeploymentFlavors = listDeploymentFlavors(
314 deploymentFlavorEntity.getVspId(), deploymentFlavorEntity.getVersion());
315 listDeploymentFlavors.remove(retrieved);
316 isDeploymentFlavorModelDuplicate(deploymentFlavorEntity, listDeploymentFlavors);
318 validateComponentComputeAssociation(deploymentFlavorEntity,
319 deploymentFlavorEntity.getVersion());
321 DeploymentFlavorCompositionSchemaInput schemaInput = new
322 DeploymentFlavorCompositionSchemaInput();
323 schemaInput.setManual(vspInfoDao.isManual(deploymentFlavorEntity.getVspId(),
324 deploymentFlavorEntity.getVersion()));
325 schemaInput.setDeploymentFlavor(retrieved.getDeploymentFlavorCompositionData());
327 List<String> featureGroups =
328 getFeatureGroupListForVsp(deploymentFlavorEntity.getVspId(),
329 deploymentFlavorEntity.getVersion());
330 schemaInput.setFeatureGroupIds(featureGroups);
332 CompositionEntityValidationData validationData = compositionEntityDataManager
333 .validateEntity(deploymentFlavorEntity, SchemaTemplateContext.composition, schemaInput);
334 if (CollectionUtils.isEmpty(validationData.getErrors())) {
335 deploymentFlavorDao.update(deploymentFlavorEntity);
337 return validationData;