1 package org.openecomp.sdc.vendorsoftwareproduct.impl;
3 import org.apache.commons.collections4.CollectionUtils;
4 import org.openecomp.sdc.common.errors.CoreException;
5 import org.openecomp.sdc.common.errors.ErrorCode;
6 import org.openecomp.sdc.datatypes.error.ErrorLevel;
7 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
8 import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage;
9 import org.openecomp.sdc.logging.types.LoggerConstants;
10 import org.openecomp.sdc.logging.types.LoggerErrorCode;
11 import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
12 import org.openecomp.sdc.vendorsoftwareproduct.DeploymentFlavorManager;
13 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
14 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
15 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDao;
16 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
17 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
18 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
19 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.DeploymentFlavorEntity;
20 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
21 import org.openecomp.sdc.vendorsoftwareproduct.errors.DeploymentFlavorErrorBuilder;
22 import org.openecomp.sdc.vendorsoftwareproduct.errors.NotSupportedHeatOnboardMethodErrorBuilder;
23 import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionEntityDataManager;
24 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
25 import org.openecomp.sdc.vendorsoftwareproduct.types.CompositionEntityResponse;
26 import org.openecomp.sdc.vendorsoftwareproduct.types.VersionedVendorSoftwareProductInfo;
27 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentComputeAssociation;
28 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
29 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
30 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.DeploymentFlavor;
31 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.DeploymentFlavorCompositionSchemaInput;
32 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
33 import org.openecomp.sdc.vendorsoftwareproduct.utils.VendorSoftwareProductUtils;
34 import org.openecomp.sdc.versioning.VersioningUtil;
35 import org.openecomp.sdc.versioning.dao.types.Version;
36 import org.openecomp.sdc.versioning.types.VersionableEntityAction;
38 import java.util.ArrayList;
39 import java.util.Collection;
40 import java.util.Iterator;
41 import java.util.List;
44 public class DeploymentFlavorManagerImpl implements DeploymentFlavorManager {
46 private static final MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
47 private VendorSoftwareProductInfoDao vspInfoDao;
48 private DeploymentFlavorDao deploymentFlavorDao;
49 private CompositionEntityDataManager compositionEntityDataManager;
50 private ComponentDao componentDao;
51 private ComputeDao computeDao;
53 public DeploymentFlavorManagerImpl(
54 VendorSoftwareProductInfoDao vspInfoDao,
55 DeploymentFlavorDao deploymentFlavorDao,
56 CompositionEntityDataManager compositionEntityDataManager,
57 ComponentDao componentDao,
62 this.vspInfoDao = vspInfoDao;
63 this.deploymentFlavorDao = deploymentFlavorDao;
64 this.compositionEntityDataManager = compositionEntityDataManager;
65 this.componentDao = componentDao;
66 this.computeDao = computeDao;
71 public Collection<DeploymentFlavorEntity> listDeploymentFlavors(String vspId, Version version,
73 mdcDataDebugMessage.debugEntryMessage("VSP id", vspId);
74 /*version = VersioningUtil
75 .resolveVersion(version, getVersionInfo(vspId, VersionableEntityAction.Read, user));*/
77 mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
78 return listDeploymentFlavors(vspId, version);
81 private Collection<DeploymentFlavorEntity> listDeploymentFlavors(String vspId, Version version) {
82 Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
83 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
84 return deploymentFlavorEntities;
88 public DeploymentFlavorEntity createDeploymentFlavor(
89 DeploymentFlavorEntity deploymentFlavorEntity, String user) {
90 DeploymentFlavorEntity createDeploymentFlavor = null;
91 mdcDataDebugMessage.debugEntryMessage("VSP id ", deploymentFlavorEntity.getVspId());
92 /*Version activeVersion =
93 getVersionInfo(deploymentFlavorEntity.getVspId(), VersionableEntityAction.Write, user)
95 deploymentFlavorEntity.setVersion(activeVersion);*/
97 if (!vspInfoDao.isManual(deploymentFlavorEntity.getVspId(),
98 deploymentFlavorEntity.getVersion())) {
99 ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder
100 .getAddDeploymentNotSupportedHeatOnboardErrorBuilder();
101 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
102 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
103 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), deploymentFlavorErrorBuilder.message());
104 throw new CoreException(deploymentFlavorErrorBuilder);
106 validateDeploymentFlavor(deploymentFlavorEntity, user, deploymentFlavorEntity.getVersion());
107 createDeploymentFlavor =
108 compositionEntityDataManager.createDeploymentFlavor(deploymentFlavorEntity);
110 return createDeploymentFlavor;
113 private void validateDeploymentFlavor(DeploymentFlavorEntity deploymentFlavorEntity, String
114 user, Version activeVersion) {
115 //Validation for unique model.
116 Collection<DeploymentFlavorEntity> listDeploymentFlavors =
117 listDeploymentFlavors(deploymentFlavorEntity.getVspId(),
119 isDeploymentFlavorModelDuplicate(deploymentFlavorEntity, listDeploymentFlavors);
121 List<String> featureGroups =
122 getFeatureGroupListForVsp(deploymentFlavorEntity.getVspId(), user, activeVersion);
123 String featureGroup = deploymentFlavorEntity.getDeploymentFlavorCompositionData()
124 .getFeatureGroupId();
125 if (featureGroup != null && featureGroup.trim().length()>0) {
126 if (isEmpty(featureGroups) || (!(validFeatureGroup(featureGroups, featureGroup)))) {
127 ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder
128 .getFeatureGroupNotexistErrorBuilder(featureGroup, deploymentFlavorEntity.getVspId(),
130 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
131 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
132 LoggerErrorCode.DATA_ERROR.getErrorCode(), deploymentFlavorErrorBuilder.message());
133 throw new CoreException(deploymentFlavorErrorBuilder);
137 validateComponentComputeAssociation(deploymentFlavorEntity, activeVersion);
140 private void isDeploymentFlavorModelDuplicate(DeploymentFlavorEntity deploymentFlavorEntity,
141 Collection<DeploymentFlavorEntity> listDeploymentFlavors) {
142 listDeploymentFlavors.forEach(deploymentFlavor -> {
143 if (deploymentFlavorEntity.getDeploymentFlavorCompositionData().getModel().equalsIgnoreCase(
144 deploymentFlavor.getDeploymentFlavorCompositionData().getModel())) {
145 ErrorCode deploymentFlavorModelErrorBuilder = DeploymentFlavorErrorBuilder
146 .getDuplicateDeploymentFlavorModelErrorBuilder(
147 deploymentFlavorEntity.getDeploymentFlavorCompositionData().getModel(),
148 deploymentFlavorEntity.getVspId());
149 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
150 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
151 LoggerErrorCode.DATA_ERROR.getErrorCode(), deploymentFlavorModelErrorBuilder.message());
152 throw new CoreException(deploymentFlavorModelErrorBuilder);
157 private List<String> getFeatureGroupListForVsp(String vspId,
158 String user, Version activeVersion) {
159 /*VersionedVendorSoftwareProductInfo versionedVendorSoftwareProductInfo = getVspDetails(
160 vspId,activeVersion, user);
161 return versionedVendorSoftwareProductInfo.getVspDetails()
162 .getFeatureGroups();*/
164 final VspDetails vspDetails = vspInfoDao.get(new VspDetails(vspId, activeVersion));
165 return vspDetails.getFeatureGroups();
168 private boolean isEmpty(Collection coll) {
169 return (coll == null || coll.isEmpty());
172 private boolean validFeatureGroup(List<String> featureGroups, String featureGroupId) {
173 Iterator<String> iterator = featureGroups.iterator();
174 boolean valid = false;
175 while (iterator.hasNext()) {
176 String fgId = iterator.next().trim();
177 if (fgId.equals(featureGroupId)) {
187 private void validateComponentComputeAssociation(DeploymentFlavorEntity deploymentFlavorEntity,
188 Version activeVersion) {
189 List<ComponentComputeAssociation> componentComputeAssociationList = deploymentFlavorEntity
190 .getDeploymentFlavorCompositionData().getComponentComputeAssociations();
191 List<String> vfcList = new ArrayList<>();
192 if (!isEmpty(componentComputeAssociationList)) {
193 componentComputeAssociationList.forEach(componentComputeAssociation -> {
194 if ((componentComputeAssociation.getComponentId() == null || componentComputeAssociation
195 .getComponentId().trim().length() == 0) &&
196 (componentComputeAssociation
197 .getComputeFlavorId() != null && componentComputeAssociation
198 .getComputeFlavorId().trim().length() > 0)) {
199 ErrorCode invalidAssociationErrorBuilder = DeploymentFlavorErrorBuilder
200 .getInvalidAssociationErrorBuilder();
201 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
202 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
203 LoggerErrorCode.DATA_ERROR.getErrorCode(), invalidAssociationErrorBuilder.message());
204 throw new CoreException(invalidAssociationErrorBuilder);
205 } else if (componentComputeAssociation.getComponentId() != null &&
206 componentComputeAssociation.getComponentId().trim().length() > 0 ) {
207 ComponentEntity component = getComponent(deploymentFlavorEntity.getVspId(), activeVersion,
208 componentComputeAssociation.getComponentId());
209 if (componentComputeAssociation
210 .getComputeFlavorId() != null && componentComputeAssociation
211 .getComputeFlavorId().trim().length() > 0 ) {
212 ComputeEntity computeFlavor = computeDao.get(new ComputeEntity(deploymentFlavorEntity
213 .getVspId(), activeVersion, componentComputeAssociation.getComponentId(),
214 componentComputeAssociation.getComputeFlavorId()));
215 if (computeFlavor == null) {
216 ErrorCode invalidComputeIdErrorBuilder = DeploymentFlavorErrorBuilder
217 .getInvalidComputeIdErrorBuilder(componentComputeAssociation.getComputeFlavorId(),
218 componentComputeAssociation.getComponentId());
219 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
220 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
221 LoggerErrorCode.DATA_ERROR.getErrorCode(),
222 invalidComputeIdErrorBuilder.message());
223 throw new CoreException(invalidComputeIdErrorBuilder);
226 vfcList.add(componentComputeAssociation.getComponentId());
229 Map<String, Integer> frequencyMapping = CollectionUtils.getCardinalityMap(vfcList);
231 for (Integer vfcCount : frequencyMapping.values()) {
233 ErrorCode duplicateVfcAssociationErrorBuilder = DeploymentFlavorErrorBuilder
234 .getDuplicateVfcAssociationErrorBuilder();
235 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
236 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
237 LoggerErrorCode.DATA_ERROR.getErrorCode(),
238 duplicateVfcAssociationErrorBuilder.message());
239 throw new CoreException(duplicateVfcAssociationErrorBuilder);
245 private ComponentEntity getComponent(String vspId, Version version, String componentId) {
246 ComponentEntity retrieved = componentDao.get(new ComponentEntity(vspId, version, componentId));
248 .validateEntityExistence(retrieved, new ComponentEntity(vspId, version, componentId),
249 VspDetails.ENTITY_TYPE);
254 public CompositionEntityResponse<DeploymentFlavor> getDeploymentFlavor(String vspId,
256 String deploymentFlavorId,
259 .debugEntryMessage("VSP id, deployment flavor id", vspId, deploymentFlavorId);
261 /*version = VersioningUtil
262 .resolveVersion(version, getVersionInfo(vspId, VersionableEntityAction.Read, user));*/
263 DeploymentFlavorEntity deploymentFlavorEntity = getDeploymentFlavor(vspId,version,
265 DeploymentFlavor deploymentFlavor = deploymentFlavorEntity.getDeploymentFlavorCompositionData();
266 DeploymentFlavorCompositionSchemaInput schemaInput = new
267 DeploymentFlavorCompositionSchemaInput();
268 schemaInput.setManual(vspInfoDao.isManual(vspId, version));
269 schemaInput.setDeploymentFlavor(deploymentFlavor);
270 List<String> featureGroups =
271 getFeatureGroupListForVsp(vspId, user, version);
272 schemaInput.setFeatureGroupIds(featureGroups);
273 CompositionEntityResponse<DeploymentFlavor> response = new CompositionEntityResponse<>();
274 response.setId(deploymentFlavorId);
275 response.setSchema((SchemaGenerator
276 .generate(SchemaTemplateContext.composition, CompositionEntityType.deployment,
278 response.setData(deploymentFlavor);
280 .debugExitMessage("VSP id, deployment flavor id ", vspId, deploymentFlavorId);
285 private DeploymentFlavorEntity getDeploymentFlavor(String vspId, Version version, String
286 deploymentFlavorId) {
287 DeploymentFlavorEntity retrieved = deploymentFlavorDao.get(new DeploymentFlavorEntity(vspId,
288 version, deploymentFlavorId));
290 .validateEntityExistence(retrieved, new DeploymentFlavorEntity(vspId, version,
291 deploymentFlavorId ), VspDetails.ENTITY_TYPE);
296 public CompositionEntityResponse<DeploymentFlavor> getDeploymentFlavorSchema(String vspId,
299 /*version = VersioningUtil
300 .resolveVersion(version, getVersionInfo(vspId, VersionableEntityAction.Read, user));*/
301 DeploymentFlavorCompositionSchemaInput schemaInput= new
302 DeploymentFlavorCompositionSchemaInput();
303 schemaInput.setManual(vspInfoDao.isManual(vspId, version));
304 List<String> featureGroups =
305 getFeatureGroupListForVsp(vspId, user, version);
306 schemaInput.setFeatureGroupIds(featureGroups);
307 CompositionEntityResponse<DeploymentFlavor> response = new CompositionEntityResponse<>();
308 response.setSchema((SchemaGenerator
309 .generate(SchemaTemplateContext.composition, CompositionEntityType.deployment,
315 public void deleteDeploymentFlavor(String vspId, Version version, String deploymentFlavorId,
318 .debugEntryMessage("VSP id, deployment flavor id", vspId, deploymentFlavorId);
319 /*Version activeVersion =
320 getVersionInfo(vspId, VersionableEntityAction.Write, user).getActiveVersion();*/
321 DeploymentFlavorEntity deploymentFlavorEntity = getDeploymentFlavor(vspId,version,
323 if (!vspInfoDao.isManual(vspId, version)) {
324 final ErrorCode deleteDeploymentFlavorErrorBuilder =
325 NotSupportedHeatOnboardMethodErrorBuilder
326 .getDelDeploymentFlavorNotSupportedHeatOnboardMethodErrorBuilder();
327 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
328 LoggerTragetServiceName.DELETE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
329 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
330 deleteDeploymentFlavorErrorBuilder.message());
331 throw new CoreException(deleteDeploymentFlavorErrorBuilder);
333 if(deploymentFlavorEntity != null) {
334 deploymentFlavorDao.delete(new DeploymentFlavorEntity(vspId, version, deploymentFlavorId));
338 .debugExitMessage("VSP id, deployment flavor id", vspId, deploymentFlavorId);
341 public CompositionEntityValidationData updateDeploymentFlavor(DeploymentFlavorEntity
342 deploymentFlavorEntity, String user) {
343 mdcDataDebugMessage.debugEntryMessage("VSP id, deploymentFlavor id", deploymentFlavorEntity
344 .getVspId(), deploymentFlavorEntity.getId());
345 /*Version activeVersion =
346 getVersionInfo(deploymentFlavorEntity.getVspId(), VersionableEntityAction.Write, user)
347 .getActiveVersion();*/
349 if (!vspInfoDao.isManual(deploymentFlavorEntity.getVspId(),
350 deploymentFlavorEntity.getVersion())) {
351 final ErrorCode updateDeploymentFlavorErrorBuilder =
352 NotSupportedHeatOnboardMethodErrorBuilder
353 .getUpdateDfNotSupportedHeatOnboardMethodErrorBuilder();
354 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
355 LoggerTragetServiceName.UPDATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
356 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
357 updateDeploymentFlavorErrorBuilder.message());
358 throw new CoreException(updateDeploymentFlavorErrorBuilder);
360 //deploymentFlavorEntity.setVersion(activeVersion);
361 DeploymentFlavorEntity retrieved =
362 getDeploymentFlavor(deploymentFlavorEntity.getVspId(), deploymentFlavorEntity.getVersion(),
363 deploymentFlavorEntity.getId());
366 Collection<DeploymentFlavorEntity> listDeploymentFlavors = listDeploymentFlavors
367 (deploymentFlavorEntity.getVspId(), deploymentFlavorEntity.getVersion());
368 listDeploymentFlavors.remove(retrieved);
369 isDeploymentFlavorModelDuplicate(deploymentFlavorEntity, listDeploymentFlavors);
371 //validateComponentComputeAssociation(deploymentFlavorEntity, activeVersion);
372 validateComponentComputeAssociation(deploymentFlavorEntity, deploymentFlavorEntity.getVersion());
374 DeploymentFlavorCompositionSchemaInput schemaInput = new
375 DeploymentFlavorCompositionSchemaInput();
376 schemaInput.setManual(vspInfoDao.isManual(deploymentFlavorEntity.getVspId(),
377 deploymentFlavorEntity.getVersion()));
378 schemaInput.setDeploymentFlavor(retrieved.getDeploymentFlavorCompositionData());
380 List<String> featureGroups =
381 getFeatureGroupListForVsp(deploymentFlavorEntity.getVspId(), user,
382 deploymentFlavorEntity.getVersion());
383 schemaInput.setFeatureGroupIds(featureGroups);
385 CompositionEntityValidationData validationData = compositionEntityDataManager
386 .validateEntity(deploymentFlavorEntity, SchemaTemplateContext.composition, schemaInput);
387 if (CollectionUtils.isEmpty(validationData.getErrors())) {
388 deploymentFlavorDao.update(deploymentFlavorEntity);
391 mdcDataDebugMessage.debugExitMessage("VSP id, deploymentFlavor id",
392 deploymentFlavorEntity.getVspId(), deploymentFlavorEntity.getId());
393 return validationData;