1 package org.openecomp.sdc.vendorsoftwareproduct.impl;
4 import org.apache.commons.collections4.CollectionUtils;
5 import org.openecomp.sdc.common.errors.CoreException;
6 import org.openecomp.sdc.common.errors.ErrorCategory;
7 import org.openecomp.sdc.common.errors.ErrorCode;
8 import org.openecomp.sdc.datatypes.error.ErrorLevel;
9 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
10 import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage;
11 import org.openecomp.sdc.logging.types.LoggerConstants;
12 import org.openecomp.sdc.logging.types.LoggerErrorCode;
13 import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
14 import org.openecomp.sdc.vendorsoftwareproduct.ComputeManager;
15 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
16 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
17 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDao;
18 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
19 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
20 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.DeploymentFlavorEntity;
21 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
22 import org.openecomp.sdc.vendorsoftwareproduct.errors.DuplicateComputeInComponentErrorBuilder;
23 import org.openecomp.sdc.vendorsoftwareproduct.errors.NotSupportedHeatOnboardMethodErrorBuilder;
24 import org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductErrorCodes;
25 import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionEntityDataManager;
26 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
27 import org.openecomp.sdc.vendorsoftwareproduct.types.CompositionEntityResponse;
28 import org.openecomp.sdc.vendorsoftwareproduct.types.ListComputeResponse;
29 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
30 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentComputeAssociation;
31 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
32 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
33 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComputeData;
34 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.DeploymentFlavor;
35 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.ComputeCompositionSchemaInput;
36 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
37 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateInput;
38 import org.openecomp.sdc.versioning.VersioningUtil;
39 import org.openecomp.sdc.versioning.dao.types.Version;
41 import java.util.ArrayList;
42 import java.util.Collection;
43 import java.util.HashSet;
44 import java.util.List;
47 public class ComputeManagerImpl implements ComputeManager {
49 private static final MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
50 private ComputeDao computeDao;
51 private CompositionEntityDataManager compositionEntityDataManager;
52 private VendorSoftwareProductInfoDao vspInfoDao;
53 private DeploymentFlavorDao deploymentFlavorDao;
54 private ComponentDao componentDao;
55 private static final String MANUAL = "Manual";
57 public ComputeManagerImpl(
58 VendorSoftwareProductInfoDao vspInfoDao,
59 ComputeDao computeDao,
60 CompositionEntityDataManager compositionEntityDataManager,
61 DeploymentFlavorDao deploymentFlavorDao,
62 ComponentDao componentDao
64 this.computeDao = computeDao;
65 this.compositionEntityDataManager = compositionEntityDataManager;
66 this.vspInfoDao = vspInfoDao;
67 this.deploymentFlavorDao = deploymentFlavorDao;
68 this.componentDao = componentDao;
72 public ComputeEntity createCompute(ComputeEntity compute, String user) {
73 ComputeEntity createdCompute = null;
74 mdcDataDebugMessage.debugEntryMessage("VSP id, component id", compute.getVspId(),
75 compute.getComponentId());
77 /*Version activeVersion =
78 getVersionInfo(compute.getVspId(), VersionableEntityAction.Write, user).getActiveVersion();
79 compute.setVersion(activeVersion);*/
80 //if (!isManual(compute.getVspId(), activeVersion)) {
81 if (!vspInfoDao.isManual(compute.getVspId(), compute.getVersion())) {
82 ErrorCode onboardingMethodUpdateErrorCode = NotSupportedHeatOnboardMethodErrorBuilder
83 .getAddComputeNotSupportedHeatOnboardMethodErrorBuilder();
84 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
85 LoggerTragetServiceName.CREATE_COMPUTE, ErrorLevel.ERROR.name(),
86 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
87 onboardingMethodUpdateErrorCode.message());
88 throw new CoreException(onboardingMethodUpdateErrorCode);
91 //validateComponentId(compute.getVspId(),compute.getVersion(),compute.getComponentId());
92 Collection<ComputeEntity> vfcComputeList = listCompute(compute.getVspId(),compute.getVersion
93 (),compute.getComponentId());
95 validateVfcCompute(compute, vfcComputeList, LoggerTragetServiceName.CREATE_COMPUTE);
96 createdCompute = createCompute(compute);
100 .debugExitMessage("VSP id, component id", compute.getVspId(), compute.getComponentId());
102 return createdCompute;
105 private ComputeEntity createCompute(ComputeEntity compute) {
107 return compositionEntityDataManager.createCompute(compute);
110 /*private void validateCompute(ComputeEntity compute) {
111 Collection<ComputeEntity> vfcComputeList = listCompute(compute.getVspId(),compute.getVersion
112 (),compute.getComponentId());
114 if (!isComputeNameUnique(vfcComputeList,compute.getComputeCompositionData().getName())) {
115 final ErrorCode duplicateComputeInComponentErrorBuilder =
116 new DuplicateComputeInComponentErrorBuilder(compute.getComputeCompositionData().getName(),
117 compute.getComponentId()).build();
118 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
119 LoggerTragetServiceName.CREATE_COMPUTE, ErrorLevel.ERROR.name(),
120 LoggerErrorCode.DATA_ERROR.getErrorCode(),
121 duplicateComputeInComponentErrorBuilder.message());
122 throw new CoreException(duplicateComputeInComponentErrorBuilder);
127 private void validateComputeUpdate(ComputeEntity compute) {
128 Collection<ComputeEntity> vfcComputeList = listCompute(compute.getVspId(),compute.getVersion
129 (),compute.getComponentId());
131 for (ComputeEntity ce : vfcComputeList) {
132 if (ce.getId().equals(compute.getId())) {
133 vfcComputeList.remove(ce);
138 if (!isComputeNameUnique(vfcComputeList,compute.getComputeCompositionData().getName())) {
139 final ErrorCode duplicateComputeInComponentErrorBuilder =
140 new DuplicateComputeInComponentErrorBuilder(compute.getComputeCompositionData().getName(),
141 compute.getComponentId()).build();
142 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
143 LoggerTragetServiceName.UPDATE_COMPUTE, ErrorLevel.ERROR.name(),
144 LoggerErrorCode.DATA_ERROR.getErrorCode(),
145 duplicateComputeInComponentErrorBuilder.message());
146 throw new CoreException(duplicateComputeInComponentErrorBuilder);
152 public Collection<ListComputeResponse> listCompute(String vspId, Version version,
153 String componentId, String user) {
155 mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
156 //validateComponentId(vspId, version, componentId);
157 ComputeEntity entity = new ComputeEntity(vspId, version, componentId, null);
158 Collection<ComputeEntity> computes = computeDao.list(entity);
160 Collection<ListComputeResponse> computeResponse =
161 getListComputeResponse(vspId, version, user, computes);
162 mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
164 return computeResponse;
167 private Collection<ListComputeResponse> getListComputeResponse(String vspId, Version version,
169 Collection<ComputeEntity> computes) {
170 Set<String> vspComputes = getComputeAssociatedWithDepFlavors(vspId, version, user);
171 Collection<ListComputeResponse> computeResponse = new ArrayList<ListComputeResponse>();
172 for(ComputeEntity computeEntity : computes) {
173 ListComputeResponse response = new ListComputeResponse();
174 response.setComputeEntity(computeEntity);
175 if(vspComputes.contains(computeEntity.getId())) {
176 response.setAssociatedWithDeploymentFlavor(true);
178 response.setAssociatedWithDeploymentFlavor(false);
180 computeResponse.add(response);
182 return computeResponse;
185 private Set<String> getComputeAssociatedWithDepFlavors(String vspId, Version version,
187 final Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
188 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
189 Set<String> vspComputes = new HashSet<String>();
190 for(DeploymentFlavorEntity entity : deploymentFlavorEntities) {
191 final List<ComponentComputeAssociation> componentComputeAssociations =
192 entity.getDeploymentFlavorCompositionData().getComponentComputeAssociations();
193 if(componentComputeAssociations != null && !componentComputeAssociations.isEmpty()) {
194 for(ComponentComputeAssociation association : componentComputeAssociations) {
195 vspComputes.add(association.getComputeFlavorId());
202 private boolean isComputeNameUnique(Collection<ComputeEntity> vfcComputeList, String name) {
203 for (ComputeEntity compute : vfcComputeList) {
204 if (compute.getComputeCompositionData().getName().equalsIgnoreCase(name)) {
211 private Collection<ComputeEntity> listCompute(String vspId, Version version,String componentId) {
212 Collection<ComputeEntity> computeEntities =
213 computeDao.list(new ComputeEntity(vspId, version, componentId, null));
215 return computeEntities;
219 public CompositionEntityResponse<ComputeData> getCompute(String vspId, Version version,
221 String computeFlavorId, String user) {
222 mdcDataDebugMessage.debugEntryMessage("VSP id, component id, compute id", vspId,
223 componentId, computeFlavorId);
225 /*version = VersioningUtil
226 .resolveVersion(version, getVersionInfo(vspId, VersionableEntityAction.Read, user));*/
227 ComputeEntity computeEntity = getCompute(vspId, version, componentId, computeFlavorId);
228 ComputeData compute = computeEntity.getComputeCompositionData();
230 ComputeCompositionSchemaInput schemaInput = new ComputeCompositionSchemaInput();
231 schemaInput.setManual(vspInfoDao.isManual(vspId, version));
232 schemaInput.setCompute(compute);
234 CompositionEntityResponse<ComputeData> response = new CompositionEntityResponse<>();
235 response.setId(computeFlavorId);
236 response.setData(compute);
237 response.setSchema(getComputeCompositionSchema(schemaInput));
239 mdcDataDebugMessage.debugExitMessage("VSP id, component id, compute id", vspId,
240 componentId, computeFlavorId);
245 private ComputeEntity getCompute(String vspId, Version version, String componentId, String
247 //validateComponentId(vspId,version,componentId);
248 ComputeEntity retrieved = computeDao.get(new ComputeEntity(vspId, version, componentId,
251 .validateEntityExistence(retrieved, new ComputeEntity(vspId, version, componentId,
252 computeFlavorId), VspDetails.ENTITY_TYPE);
256 /*private void validateComponentId(String vspId, Version version, String componentId) {
257 ComponentEntity retrivedComponent = componentDao.get(new ComponentEntity(vspId, version,
260 .validateEntityExistence(retrivedComponent, new ComponentEntity(vspId, version,
261 componentId),VspDetails.ENTITY_TYPE);
265 public QuestionnaireResponse getComputeQuestionnaire(String vspId, Version version, String
266 componentId, String computeId, String user) {
267 mdcDataDebugMessage.debugEntryMessage("VSP id, componentId", vspId, componentId, computeId);
269 /*version = VersioningUtil
270 .resolveVersion(version, getVersionInfo(vspId, VersionableEntityAction.Read, user));*/
271 //validateComponentId(vspId,version,componentId);
272 QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
273 //validateComponentId(vspId,version,componentId);
274 ComputeEntity computeQuestionnaire = computeDao.getQuestionnaireData(vspId, version, componentId, computeId);
276 .validateEntityExistence(computeQuestionnaire, new ComputeEntity(vspId, version, componentId,
277 computeId), VspDetails.ENTITY_TYPE);
278 questionnaireResponse.setData(computeQuestionnaire.getQuestionnaireData());
279 questionnaireResponse.setSchema(getComputeQuestionnaireSchema(null));
281 mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId,
282 componentId, computeId);
284 return questionnaireResponse;
288 protected String getComputeQuestionnaireSchema(SchemaTemplateInput schemaInput) {
289 mdcDataDebugMessage.debugEntryMessage(null, null);
291 mdcDataDebugMessage.debugExitMessage(null, null);
292 return SchemaGenerator
293 .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.compute,
299 public void updateComputeQuestionnaire(String vspId, Version version, String componentId, String
301 String questionnaireData, String user) {
302 mdcDataDebugMessage.debugEntryMessage("VSP id, component id, compute id", vspId,
303 componentId, computeId);
305 /*Version activeVersion =
306 getVersionInfo(vspId, VersionableEntityAction.Write, user).getActiveVersion();
307 getComponent(vspId, activeVersion, componentId);*/
308 ComputeEntity retrieved = computeDao.get(new ComputeEntity(vspId,version,componentId,
310 VersioningUtil.validateEntityExistence(retrieved, new ComputeEntity(vspId, version,
311 componentId, computeId), VspDetails.ENTITY_TYPE);
313 computeDao.updateQuestionnaireData(vspId, version, componentId, computeId, questionnaireData);
315 mdcDataDebugMessage.debugExitMessage("VSP id, component id, compute id", vspId,
316 componentId, computeId);
320 public CompositionEntityValidationData updateCompute(ComputeEntity compute, String user) {
322 .debugEntryMessage("VSP id, component id", compute.getVspId(), compute.getComponentId(),
325 /*Version activeVersion =
326 getVersionInfo(image.getVspId(), VersionableEntityAction.Write, user).getActiveVersion();
327 image.setVersion(activeVersion);*/
329 ComputeEntity retrieved = getComputeEntity(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
332 if(!vspInfoDao.isManual(compute.getVspId(), compute.getVersion())) {
333 final ComputeData computeCompositionData = compute.getComputeCompositionData();
334 final String name = computeCompositionData.getName();
335 //final String format = computeCompositionData.getFormat();
336 validateHeatVspComputeUpdate("Name", name, retrieved.getComputeCompositionData()
338 /*validateHeatVspComputeUpdate("format", format, retrieved.getComputeCompositionData()
342 Collection<ComputeEntity> vfcComputeList = listComputes(compute.getVspId() ,
343 compute.getVersion(), compute.getComponentId());
345 //Set to null so that retrieved object is equal to one in list and gets removed.
346 retrieved.setQuestionnaireData(null);
347 vfcComputeList.remove(retrieved);
348 if(vspInfoDao.isManual(compute.getVspId(), compute.getVersion()))
349 validateVfcCompute(compute, vfcComputeList, LoggerTragetServiceName.UPDATE_COMPUTE);
351 //Set format to default value in order to handle FTL validation when compute format is null
352 /*if(compute.getComputeCompositionData().getFormat() == null)
353 compute.getComputeCompositionData().setFormat(ComputeFormat.qcow2.name());*/
355 ComputeCompositionSchemaInput schemaInput = new ComputeCompositionSchemaInput();
356 schemaInput.setCompute(compute.getComputeCompositionData());
358 CompositionEntityValidationData validationData = compositionEntityDataManager
359 .validateEntity(compute, SchemaTemplateContext.composition, schemaInput);
360 if (CollectionUtils.isEmpty(validationData.getErrors())) {
361 computeDao.update(compute);
365 .debugExitMessage("VSP id, component id", compute.getVspId(), compute.getComponentId(),
368 return validationData;
371 private void validateHeatVspComputeUpdate(String name, String value, String retrivedValue) {
373 if(value != null && !value.equals(retrivedValue)) {
375 final ErrorCode updateHeatComputeErrorBuilder =
376 DuplicateComputeInComponentErrorBuilder.getComputeHeatReadOnlyErrorBuilder(name);
378 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
379 LoggerTragetServiceName.UPDATE_COMPUTE, ErrorLevel.ERROR.name(),
380 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
381 updateHeatComputeErrorBuilder.message());
382 throw new CoreException(updateHeatComputeErrorBuilder);
386 private void validateVfcCompute(ComputeEntity compute, Collection<ComputeEntity> vfcComputeList,
388 if (isComputeNameDuplicate(vfcComputeList,compute.getComputeCompositionData().getName(),
390 ErrorCode errorCode = DuplicateComputeInComponentErrorBuilder
391 .getDuplicateComputeNameErrorBuilder(compute.getComputeCompositionData().getName(),
392 compute.getComponentId());
394 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
395 event, ErrorLevel.ERROR.name(),
396 errorCode.id(),errorCode.message());
398 throw new CoreException(errorCode);
402 private boolean isComputeNameDuplicate(Collection<ComputeEntity> computes, String name, String computeId) {
403 for (ComputeEntity compute : computes) {
404 if (compute.getComputeCompositionData().getName().equalsIgnoreCase(name) && !compute.getId().equals(computeId)) {
412 private ComputeEntity getComputeEntity(String vspId, Version version, String componentId,
414 //validateComponentId(vspId,version,componentId);
415 ComputeEntity computeEntity = computeDao.get(new ComputeEntity(vspId, version, componentId, computeId));
416 VersioningUtil.validateEntityExistence(computeEntity, new ComputeEntity(vspId, version, componentId,
417 computeId), VspDetails.ENTITY_TYPE);
418 return computeEntity;
421 private Collection<ComputeEntity> listComputes(String vspId, Version version, String componentId) {
422 return computeDao.list(new ComputeEntity(vspId, version, componentId, null));
426 public void deleteCompute(String vspId, Version version, String componentId, String
427 computeFlavorId, String user) {
428 final String VSP_COMPOSITION_EDIT_NOT_ALLOWED_MSG =
429 "Composition entities may not be created / deleted for Vendor Software Product "
430 + "whose entities were uploaded";
431 mdcDataDebugMessage.debugEntryMessage("VSP id, component id, compute id", vspId,
432 componentId, computeFlavorId);
434 /*Version activeVersion =
435 getVersionInfo(vspId, VersionableEntityAction.Write, user).getActiveVersion();*/
436 if (!vspInfoDao.isManual(vspId, version)) {
437 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
438 LoggerTragetServiceName.DELETE_COMPUTE, ErrorLevel.ERROR.name(),
439 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), "Can't delete compute");
440 throw new CoreException(
441 new ErrorCode.ErrorCodeBuilder().withCategory(ErrorCategory.APPLICATION)
442 .withId(VendorSoftwareProductErrorCodes.VSP_COMPOSITION_EDIT_NOT_ALLOWED)
443 .withMessage(VSP_COMPOSITION_EDIT_NOT_ALLOWED_MSG).build());
445 ComputeEntity retrived = getCompute(vspId,version,componentId,computeFlavorId);
446 if (retrived != null){
447 deleteComputeFromDeploymentFlavors(vspId,version,computeFlavorId);
448 computeDao.delete(new ComputeEntity(vspId, version, componentId, computeFlavorId));
451 mdcDataDebugMessage.debugExitMessage("VSP id, component id, compute id", vspId,
452 componentId, computeFlavorId);
455 private void deleteComputeFromDeploymentFlavors(String vspId, Version activeVersion,
456 String computeFlavorId) {
457 //Collection<DeploymentFlavorEntity> listDF = listDeploymentFlavors(vspId, activeVersion);
458 Collection<DeploymentFlavorEntity> listDF = deploymentFlavorDao.list(new DeploymentFlavorEntity
459 (vspId, activeVersion, null));
460 for(DeploymentFlavorEntity df : listDF) {
461 DeploymentFlavorEntity deploymentFlavorEntity=removeComputeFromDF(df, computeFlavorId);
462 if(deploymentFlavorEntity!=null)
463 deploymentFlavorDao.update(deploymentFlavorEntity);
467 private DeploymentFlavorEntity removeComputeFromDF(DeploymentFlavorEntity df, String
469 DeploymentFlavor flavor = df.getDeploymentFlavorCompositionData();
470 List<ComponentComputeAssociation> associations = flavor.getComponentComputeAssociations();
471 if (associations != null) {
472 List<ComponentComputeAssociation> updatedAssociations = new ArrayList<>();
473 for (ComponentComputeAssociation ca : associations) {
474 if (ca.getComputeFlavorId() != null && ca.getComputeFlavorId().equals(computeFlavorId)) {
475 ComponentComputeAssociation updateCaremoveCompute = new ComponentComputeAssociation();
476 updateCaremoveCompute.setComponentId(ca.getComponentId());
477 updatedAssociations.add(updateCaremoveCompute);
479 updatedAssociations.add(ca);
482 flavor.setComponentComputeAssociations(updatedAssociations);
483 df.setDeploymentFlavorCompositionData(flavor);
489 protected String getComputeCompositionSchema(SchemaTemplateInput schemaInput){
490 mdcDataDebugMessage.debugEntryMessage(null, null);
491 mdcDataDebugMessage.debugExitMessage(null, null);
492 return SchemaGenerator.generate(SchemaTemplateContext.composition, CompositionEntityType.compute, schemaInput);
495 /*boolean isManual(String vspId, Version version) {
497 VspDetails vsp = vspInfoDao.get(new VspDetails(vspId, version));
498 String onboardingMethod = vsp.getOnboardingMethod();
499 if (MANUAL.equals(onboardingMethod)) {