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.composition.ComponentComputeAssociation;
27 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
28 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
29 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.DeploymentFlavor;
30 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.DeploymentFlavorCompositionSchemaInput;
31 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
32 import org.openecomp.sdc.versioning.VersioningUtil;
33 import org.openecomp.sdc.versioning.dao.types.Version;
35 import java.util.ArrayList;
36 import java.util.Collection;
37 import java.util.Iterator;
38 import java.util.List;
41 public class DeploymentFlavorManagerImpl implements DeploymentFlavorManager {
43 private static final MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
44 private VendorSoftwareProductInfoDao vspInfoDao;
45 private DeploymentFlavorDao deploymentFlavorDao;
46 private CompositionEntityDataManager compositionEntityDataManager;
47 private ComponentDao componentDao;
48 private ComputeDao computeDao;
50 public DeploymentFlavorManagerImpl(VendorSoftwareProductInfoDao vspInfoDao,
51 DeploymentFlavorDao deploymentFlavorDao,
52 CompositionEntityDataManager compositionEntityDataManager,
53 ComponentDao componentDao,
54 ComputeDao computeDao) {
55 this.vspInfoDao = vspInfoDao;
56 this.deploymentFlavorDao = deploymentFlavorDao;
57 this.compositionEntityDataManager = compositionEntityDataManager;
58 this.componentDao = componentDao;
59 this.computeDao = computeDao;
64 public Collection<DeploymentFlavorEntity> listDeploymentFlavors(String vspId, Version version) {
65 mdcDataDebugMessage.debugEntryMessage("VSP id", vspId);
66 mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
67 return deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
71 public DeploymentFlavorEntity createDeploymentFlavor(
72 DeploymentFlavorEntity deploymentFlavorEntity) {
73 DeploymentFlavorEntity createDeploymentFlavor;
74 mdcDataDebugMessage.debugEntryMessage("VSP id ", deploymentFlavorEntity.getVspId());
76 if (!vspInfoDao.isManual(deploymentFlavorEntity.getVspId(),
77 deploymentFlavorEntity.getVersion())) {
78 ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder
79 .getAddDeploymentNotSupportedHeatOnboardErrorBuilder();
80 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
81 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
82 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), deploymentFlavorErrorBuilder.message());
83 throw new CoreException(deploymentFlavorErrorBuilder);
85 validateDeploymentFlavor(deploymentFlavorEntity, deploymentFlavorEntity.getVersion());
86 createDeploymentFlavor =
87 compositionEntityDataManager.createDeploymentFlavor(deploymentFlavorEntity);
89 return createDeploymentFlavor;
92 private void validateDeploymentFlavor(DeploymentFlavorEntity deploymentFlavorEntity,
94 //Validation for unique model.
95 Collection<DeploymentFlavorEntity> listDeploymentFlavors =
96 listDeploymentFlavors(deploymentFlavorEntity.getVspId(),
98 isDeploymentFlavorModelDuplicate(deploymentFlavorEntity, listDeploymentFlavors);
100 List<String> featureGroups =
101 getFeatureGroupListForVsp(deploymentFlavorEntity.getVspId(), version);
102 String featureGroup = deploymentFlavorEntity.getDeploymentFlavorCompositionData()
103 .getFeatureGroupId();
104 if (featureGroup != null && featureGroup.trim().length() > 0) {
105 if (isEmpty(featureGroups) || (!(validFeatureGroup(featureGroups, featureGroup)))) {
106 ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder
107 .getFeatureGroupNotexistErrorBuilder(featureGroup, deploymentFlavorEntity.getVspId(),
109 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
110 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
111 LoggerErrorCode.DATA_ERROR.getErrorCode(), deploymentFlavorErrorBuilder.message());
112 throw new CoreException(deploymentFlavorErrorBuilder);
116 validateComponentComputeAssociation(deploymentFlavorEntity, version);
119 private void isDeploymentFlavorModelDuplicate(DeploymentFlavorEntity deploymentFlavorEntity,
120 Collection<DeploymentFlavorEntity> listDeploymentFlavors) {
121 listDeploymentFlavors.forEach(deploymentFlavor -> {
122 if (deploymentFlavorEntity.getDeploymentFlavorCompositionData().getModel().equalsIgnoreCase(
123 deploymentFlavor.getDeploymentFlavorCompositionData().getModel())) {
124 ErrorCode deploymentFlavorModelErrorBuilder = DeploymentFlavorErrorBuilder
125 .getDuplicateDeploymentFlavorModelErrorBuilder(
126 deploymentFlavorEntity.getDeploymentFlavorCompositionData().getModel(),
127 deploymentFlavorEntity.getVspId());
128 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
129 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
130 LoggerErrorCode.DATA_ERROR.getErrorCode(), deploymentFlavorModelErrorBuilder.message());
131 throw new CoreException(deploymentFlavorModelErrorBuilder);
136 private List<String> getFeatureGroupListForVsp(String vspId, Version version) {
137 final VspDetails vspDetails = vspInfoDao.get(new VspDetails(vspId, version));
138 return vspDetails.getFeatureGroups();
141 private boolean isEmpty(Collection coll) {
142 return (coll == null || coll.isEmpty());
145 private boolean validFeatureGroup(List<String> featureGroups, String featureGroupId) {
146 Iterator<String> iterator = featureGroups.iterator();
147 boolean valid = false;
148 while (iterator.hasNext()) {
149 String fgId = iterator.next().trim();
150 if (fgId.equals(featureGroupId)) {
160 private void validateComponentComputeAssociation(DeploymentFlavorEntity deploymentFlavorEntity,
162 List<ComponentComputeAssociation> componentComputeAssociationList = deploymentFlavorEntity
163 .getDeploymentFlavorCompositionData().getComponentComputeAssociations();
164 List<String> vfcList = new ArrayList<>();
165 if (!isEmpty(componentComputeAssociationList)) {
166 componentComputeAssociationList.forEach(componentComputeAssociation -> {
167 if ((componentComputeAssociation.getComponentId() == null || componentComputeAssociation
168 .getComponentId().trim().length() == 0) &&
169 (componentComputeAssociation
170 .getComputeFlavorId() != null && componentComputeAssociation
171 .getComputeFlavorId().trim().length() > 0)) {
172 ErrorCode invalidAssociationErrorBuilder = DeploymentFlavorErrorBuilder
173 .getInvalidAssociationErrorBuilder();
174 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
175 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
176 LoggerErrorCode.DATA_ERROR.getErrorCode(), invalidAssociationErrorBuilder.message());
177 throw new CoreException(invalidAssociationErrorBuilder);
178 } else if (componentComputeAssociation.getComponentId() != null &&
179 componentComputeAssociation.getComponentId().trim().length() > 0) {
180 ComponentEntity component = getComponent(deploymentFlavorEntity.getVspId(), version,
181 componentComputeAssociation.getComponentId());
182 if (componentComputeAssociation
183 .getComputeFlavorId() != null && componentComputeAssociation
184 .getComputeFlavorId().trim().length() > 0) {
185 ComputeEntity computeFlavor = computeDao.get(new ComputeEntity(deploymentFlavorEntity
186 .getVspId(), version, componentComputeAssociation.getComponentId(),
187 componentComputeAssociation.getComputeFlavorId()));
188 if (computeFlavor == null) {
189 ErrorCode invalidComputeIdErrorBuilder = DeploymentFlavorErrorBuilder
190 .getInvalidComputeIdErrorBuilder(componentComputeAssociation.getComputeFlavorId(),
191 componentComputeAssociation.getComponentId());
192 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
193 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
194 LoggerErrorCode.DATA_ERROR.getErrorCode(),
195 invalidComputeIdErrorBuilder.message());
196 throw new CoreException(invalidComputeIdErrorBuilder);
199 vfcList.add(componentComputeAssociation.getComponentId());
202 Map<String, Integer> frequencyMapping = CollectionUtils.getCardinalityMap(vfcList);
204 for (Integer vfcCount : frequencyMapping.values()) {
206 ErrorCode duplicateVfcAssociationErrorBuilder = DeploymentFlavorErrorBuilder
207 .getDuplicateVfcAssociationErrorBuilder();
208 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
209 LoggerTragetServiceName.CREATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
210 LoggerErrorCode.DATA_ERROR.getErrorCode(),
211 duplicateVfcAssociationErrorBuilder.message());
212 throw new CoreException(duplicateVfcAssociationErrorBuilder);
218 private ComponentEntity getComponent(String vspId, Version version, String componentId) {
219 ComponentEntity retrieved = componentDao.get(new ComponentEntity(vspId, version, componentId));
221 .validateEntityExistence(retrieved, new ComponentEntity(vspId, version, componentId),
222 VspDetails.ENTITY_TYPE);
227 public CompositionEntityResponse<DeploymentFlavor> getDeploymentFlavor(String vspId,
229 String deploymentFlavorId) {
231 .debugEntryMessage("VSP id, deployment flavor id", vspId, deploymentFlavorId);
233 DeploymentFlavorEntity deploymentFlavorEntity =
234 getValidatedDeploymentFlavor(vspId, version, deploymentFlavorId);
235 DeploymentFlavor deploymentFlavor = deploymentFlavorEntity.getDeploymentFlavorCompositionData();
236 DeploymentFlavorCompositionSchemaInput schemaInput = new
237 DeploymentFlavorCompositionSchemaInput();
238 schemaInput.setManual(vspInfoDao.isManual(vspId, version));
239 schemaInput.setDeploymentFlavor(deploymentFlavor);
240 List<String> featureGroups =
241 getFeatureGroupListForVsp(vspId, version);
242 schemaInput.setFeatureGroupIds(featureGroups);
243 CompositionEntityResponse<DeploymentFlavor> response = new CompositionEntityResponse<>();
244 response.setId(deploymentFlavorId);
245 response.setSchema((SchemaGenerator
246 .generate(SchemaTemplateContext.composition, CompositionEntityType.deployment,
248 response.setData(deploymentFlavor);
250 .debugExitMessage("VSP id, deployment flavor id ", vspId, deploymentFlavorId);
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) {
284 .debugEntryMessage("VSP id, deployment flavor id", vspId, deploymentFlavorId);
285 /*Version activeVersion =
286 getVersionInfo(vspId, VersionableEntityAction.Write, user).getActiveVersion();*/
287 DeploymentFlavorEntity deploymentFlavorEntity =
288 getValidatedDeploymentFlavor(vspId, version, deploymentFlavorId);
289 if (!vspInfoDao.isManual(vspId, version)) {
290 final ErrorCode deleteDeploymentFlavorErrorBuilder =
291 NotSupportedHeatOnboardMethodErrorBuilder
292 .getDelDeploymentFlavorNotSupportedHeatOnboardMethodErrorBuilder();
293 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
294 LoggerTragetServiceName.DELETE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
295 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
296 deleteDeploymentFlavorErrorBuilder.message());
297 throw new CoreException(deleteDeploymentFlavorErrorBuilder);
299 if (deploymentFlavorEntity != null) {
300 deploymentFlavorDao.delete(new DeploymentFlavorEntity(vspId, version, deploymentFlavorId));
304 .debugExitMessage("VSP id, deployment flavor id", vspId, deploymentFlavorId);
307 public CompositionEntityValidationData updateDeploymentFlavor(
308 DeploymentFlavorEntity deploymentFlavorEntity) {
309 mdcDataDebugMessage.debugEntryMessage("VSP id, deploymentFlavor id", deploymentFlavorEntity
310 .getVspId(), deploymentFlavorEntity.getId());
311 /*Version activeVersion =
312 getVersionInfo(deploymentFlavorEntity.getVspId(), VersionableEntityAction.Write, user)
313 .getActiveVersion();*/
315 if (!vspInfoDao.isManual(deploymentFlavorEntity.getVspId(),
316 deploymentFlavorEntity.getVersion())) {
317 final ErrorCode updateDeploymentFlavorErrorBuilder =
318 NotSupportedHeatOnboardMethodErrorBuilder
319 .getUpdateDfNotSupportedHeatOnboardMethodErrorBuilder();
320 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
321 LoggerTragetServiceName.UPDATE_DEPLOYMENT_FLAVOR, ErrorLevel.ERROR.name(),
322 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
323 updateDeploymentFlavorErrorBuilder.message());
324 throw new CoreException(updateDeploymentFlavorErrorBuilder);
326 DeploymentFlavorEntity retrieved =
327 getValidatedDeploymentFlavor(deploymentFlavorEntity.getVspId(),
328 deploymentFlavorEntity.getVersion(),
329 deploymentFlavorEntity.getId());
332 Collection<DeploymentFlavorEntity> listDeploymentFlavors = listDeploymentFlavors
333 (deploymentFlavorEntity.getVspId(), deploymentFlavorEntity.getVersion());
334 listDeploymentFlavors.remove(retrieved);
335 isDeploymentFlavorModelDuplicate(deploymentFlavorEntity, listDeploymentFlavors);
337 //validateComponentComputeAssociation(deploymentFlavorEntity, activeVersion);
338 validateComponentComputeAssociation(deploymentFlavorEntity,
339 deploymentFlavorEntity.getVersion());
341 DeploymentFlavorCompositionSchemaInput schemaInput = new
342 DeploymentFlavorCompositionSchemaInput();
343 schemaInput.setManual(vspInfoDao.isManual(deploymentFlavorEntity.getVspId(),
344 deploymentFlavorEntity.getVersion()));
345 schemaInput.setDeploymentFlavor(retrieved.getDeploymentFlavorCompositionData());
347 List<String> featureGroups =
348 getFeatureGroupListForVsp(deploymentFlavorEntity.getVspId(),
349 deploymentFlavorEntity.getVersion());
350 schemaInput.setFeatureGroupIds(featureGroups);
352 CompositionEntityValidationData validationData = compositionEntityDataManager
353 .validateEntity(deploymentFlavorEntity, SchemaTemplateContext.composition, schemaInput);
354 if (CollectionUtils.isEmpty(validationData.getErrors())) {
355 deploymentFlavorDao.update(deploymentFlavorEntity);
358 mdcDataDebugMessage.debugExitMessage("VSP id, deploymentFlavor id",
359 deploymentFlavorEntity.getVspId(), deploymentFlavorEntity.getId());
360 return validationData;