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.VendorSoftwareProductConstants;
16 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
17 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
18 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDao;
19 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
20 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
21 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.DeploymentFlavorEntity;
22 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
23 import org.openecomp.sdc.vendorsoftwareproduct.errors.ComputeErrorBuilder;
24 import org.openecomp.sdc.vendorsoftwareproduct.errors.DuplicateComputeInComponentErrorBuilder;
25 import org.openecomp.sdc.vendorsoftwareproduct.errors.NotSupportedHeatOnboardMethodErrorBuilder;
26 import org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductErrorCodes;
27 import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionEntityDataManager;
28 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
29 import org.openecomp.sdc.vendorsoftwareproduct.types.CompositionEntityResponse;
30 import org.openecomp.sdc.vendorsoftwareproduct.types.ListComputeResponse;
31 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
32 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentComputeAssociation;
33 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
34 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
35 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComputeData;
36 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.DeploymentFlavor;
37 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.ComputeCompositionSchemaInput;
38 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
39 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateInput;
40 import org.openecomp.sdc.versioning.VersioningUtil;
41 import org.openecomp.sdc.versioning.dao.types.Version;
43 import java.util.ArrayList;
44 import java.util.Collection;
45 import java.util.HashSet;
46 import java.util.List;
49 public class ComputeManagerImpl implements ComputeManager {
51 private static final MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
52 private ComputeDao computeDao;
53 private CompositionEntityDataManager compositionEntityDataManager;
54 private VendorSoftwareProductInfoDao vspInfoDao;
55 private DeploymentFlavorDao deploymentFlavorDao;
56 private ComponentDao componentDao;
57 private static final String MANUAL = "Manual";
59 public ComputeManagerImpl(
60 VendorSoftwareProductInfoDao vspInfoDao,
61 ComputeDao computeDao,
62 CompositionEntityDataManager compositionEntityDataManager,
63 DeploymentFlavorDao deploymentFlavorDao,
64 ComponentDao componentDao
66 this.computeDao = computeDao;
67 this.compositionEntityDataManager = compositionEntityDataManager;
68 this.vspInfoDao = vspInfoDao;
69 this.deploymentFlavorDao = deploymentFlavorDao;
70 this.componentDao = componentDao;
74 public ComputeEntity createCompute(ComputeEntity compute, String user) {
75 ComputeEntity createdCompute = null;
76 mdcDataDebugMessage.debugEntryMessage("VSP id, component id", compute.getVspId(),
77 compute.getComponentId());
79 /*Version activeVersion =
80 getVersionInfo(compute.getVspId(), VersionableEntityAction.Write, user).getActiveVersion();
81 compute.setVersion(activeVersion);*/
82 //if (!isManual(compute.getVspId(), activeVersion)) {
83 if (!vspInfoDao.isManual(compute.getVspId(), compute.getVersion())) {
84 ErrorCode onboardingMethodUpdateErrorCode = NotSupportedHeatOnboardMethodErrorBuilder
85 .getAddComputeNotSupportedHeatOnboardMethodErrorBuilder();
86 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
87 LoggerTragetServiceName.CREATE_COMPUTE, ErrorLevel.ERROR.name(),
88 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
89 onboardingMethodUpdateErrorCode.message());
90 throw new CoreException(onboardingMethodUpdateErrorCode);
93 //validateComponentId(compute.getVspId(),compute.getVersion(),compute.getComponentId());
94 Collection<ComputeEntity> vfcComputeList = listCompute(compute.getVspId(),compute.getVersion
95 (),compute.getComponentId());
97 validateVfcCompute(compute, vfcComputeList, LoggerTragetServiceName.CREATE_COMPUTE);
98 createdCompute = createCompute(compute);
102 .debugExitMessage("VSP id, component id", compute.getVspId(), compute.getComponentId());
104 return createdCompute;
107 private ComputeEntity createCompute(ComputeEntity compute) {
109 return compositionEntityDataManager.createCompute(compute);
112 /*private void validateCompute(ComputeEntity compute) {
113 Collection<ComputeEntity> vfcComputeList = listCompute(compute.getVspId(),compute.getVersion
114 (),compute.getComponentId());
116 if (!isComputeNameUnique(vfcComputeList,compute.getComputeCompositionData().getName())) {
117 final ErrorCode duplicateComputeInComponentErrorBuilder =
118 new DuplicateComputeInComponentErrorBuilder(compute.getComputeCompositionData().getName(),
119 compute.getComponentId()).build();
120 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
121 LoggerTragetServiceName.CREATE_COMPUTE, ErrorLevel.ERROR.name(),
122 LoggerErrorCode.DATA_ERROR.getErrorCode(),
123 duplicateComputeInComponentErrorBuilder.message());
124 throw new CoreException(duplicateComputeInComponentErrorBuilder);
129 private void validateComputeUpdate(ComputeEntity compute) {
130 Collection<ComputeEntity> vfcComputeList = listCompute(compute.getVspId(),compute.getVersion
131 (),compute.getComponentId());
133 for (ComputeEntity ce : vfcComputeList) {
134 if (ce.getId().equals(compute.getId())) {
135 vfcComputeList.remove(ce);
140 if (!isComputeNameUnique(vfcComputeList,compute.getComputeCompositionData().getName())) {
141 final ErrorCode duplicateComputeInComponentErrorBuilder =
142 new DuplicateComputeInComponentErrorBuilder(compute.getComputeCompositionData().getName(),
143 compute.getComponentId()).build();
144 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
145 LoggerTragetServiceName.UPDATE_COMPUTE, ErrorLevel.ERROR.name(),
146 LoggerErrorCode.DATA_ERROR.getErrorCode(),
147 duplicateComputeInComponentErrorBuilder.message());
148 throw new CoreException(duplicateComputeInComponentErrorBuilder);
154 public Collection<ListComputeResponse> listCompute(String vspId, Version version,
155 String componentId, String user) {
157 mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
158 //validateComponentId(vspId, version, componentId);
159 ComputeEntity entity = new ComputeEntity(vspId, version, componentId, null);
160 Collection<ComputeEntity> computes = computeDao.list(entity);
162 Collection<ListComputeResponse> computeResponse =
163 getListComputeResponse(vspId, version, user, computes);
164 mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
166 return computeResponse;
169 private Collection<ListComputeResponse> getListComputeResponse(String vspId, Version version,
171 Collection<ComputeEntity> computes) {
172 Set<String> vspComputes = getComputeAssociatedWithDepFlavors(vspId, version, user);
173 Collection<ListComputeResponse> computeResponse = new ArrayList<ListComputeResponse>();
174 for(ComputeEntity computeEntity : computes) {
175 ListComputeResponse response = new ListComputeResponse();
176 response.setComputeEntity(computeEntity);
177 if(vspComputes.contains(computeEntity.getId())) {
178 response.setAssociatedWithDeploymentFlavor(true);
180 response.setAssociatedWithDeploymentFlavor(false);
182 computeResponse.add(response);
184 return computeResponse;
187 private Set<String> getComputeAssociatedWithDepFlavors(String vspId, Version version,
189 final Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
190 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
191 Set<String> vspComputes = new HashSet<String>();
192 for(DeploymentFlavorEntity entity : deploymentFlavorEntities) {
193 final List<ComponentComputeAssociation> componentComputeAssociations =
194 entity.getDeploymentFlavorCompositionData().getComponentComputeAssociations();
195 if(componentComputeAssociations != null && !componentComputeAssociations.isEmpty()) {
196 for(ComponentComputeAssociation association : componentComputeAssociations) {
197 vspComputes.add(association.getComputeFlavorId());
204 private boolean isComputeNameUnique(Collection<ComputeEntity> vfcComputeList, String name) {
205 for (ComputeEntity compute : vfcComputeList) {
206 if (compute.getComputeCompositionData().getName().equalsIgnoreCase(name)) {
213 private Collection<ComputeEntity> listCompute(String vspId, Version version,String componentId) {
214 Collection<ComputeEntity> computeEntities =
215 computeDao.list(new ComputeEntity(vspId, version, componentId, null));
217 return computeEntities;
221 public CompositionEntityResponse<ComputeData> getCompute(String vspId, Version version,
223 String computeFlavorId, String user) {
224 mdcDataDebugMessage.debugEntryMessage("VSP id, component id, compute id", vspId,
225 componentId, computeFlavorId);
227 /*version = VersioningUtil
228 .resolveVersion(version, getVersionInfo(vspId, VersionableEntityAction.Read, user));*/
229 ComputeEntity computeEntity = getCompute(vspId, version, componentId, computeFlavorId);
230 ComputeData compute = computeEntity.getComputeCompositionData();
232 ComputeCompositionSchemaInput schemaInput = new ComputeCompositionSchemaInput();
233 schemaInput.setManual(vspInfoDao.isManual(vspId, version));
234 schemaInput.setCompute(compute);
236 CompositionEntityResponse<ComputeData> response = new CompositionEntityResponse<>();
237 response.setId(computeFlavorId);
238 response.setData(compute);
239 response.setSchema(getComputeCompositionSchema(schemaInput));
241 mdcDataDebugMessage.debugExitMessage("VSP id, component id, compute id", vspId,
242 componentId, computeFlavorId);
247 private ComputeEntity getCompute(String vspId, Version version, String componentId, String
249 //validateComponentId(vspId,version,componentId);
250 ComputeEntity retrieved = computeDao.get(new ComputeEntity(vspId, version, componentId,
253 .validateEntityExistence(retrieved, new ComputeEntity(vspId, version, componentId,
254 computeFlavorId), VspDetails.ENTITY_TYPE);
258 /*private void validateComponentId(String vspId, Version version, String componentId) {
259 ComponentEntity retrivedComponent = componentDao.get(new ComponentEntity(vspId, version,
262 .validateEntityExistence(retrivedComponent, new ComponentEntity(vspId, version,
263 componentId),VspDetails.ENTITY_TYPE);
267 public QuestionnaireResponse getComputeQuestionnaire(String vspId, Version version, String
268 componentId, String computeId, String user) {
269 mdcDataDebugMessage.debugEntryMessage("VSP id, componentId", vspId, componentId, computeId);
271 /*version = VersioningUtil
272 .resolveVersion(version, getVersionInfo(vspId, VersionableEntityAction.Read, user));*/
273 //validateComponentId(vspId,version,componentId);
274 QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
275 //validateComponentId(vspId,version,componentId);
276 ComputeEntity computeQuestionnaire = computeDao.getQuestionnaireData(vspId, version, componentId, computeId);
278 .validateEntityExistence(computeQuestionnaire, new ComputeEntity(vspId, version, componentId,
279 computeId), VspDetails.ENTITY_TYPE);
280 questionnaireResponse.setData(computeQuestionnaire.getQuestionnaireData());
281 questionnaireResponse.setSchema(getComputeQuestionnaireSchema(null));
283 mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId,
284 componentId, computeId);
286 return questionnaireResponse;
290 protected String getComputeQuestionnaireSchema(SchemaTemplateInput schemaInput) {
291 mdcDataDebugMessage.debugEntryMessage(null, null);
293 mdcDataDebugMessage.debugExitMessage(null, null);
294 return SchemaGenerator
295 .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.compute,
301 public void updateComputeQuestionnaire(String vspId, Version version, String componentId, String
303 String questionnaireData, String user) {
304 mdcDataDebugMessage.debugEntryMessage("VSP id, component id, compute id", vspId,
305 componentId, computeId);
307 /*Version activeVersion =
308 getVersionInfo(vspId, VersionableEntityAction.Write, user).getActiveVersion();
309 getComponent(vspId, activeVersion, componentId);*/
310 ComputeEntity retrieved = computeDao.get(new ComputeEntity(vspId,version,componentId,
312 VersioningUtil.validateEntityExistence(retrieved, new ComputeEntity(vspId, version,
313 componentId, computeId), VspDetails.ENTITY_TYPE);
315 computeDao.updateQuestionnaireData(vspId, version, componentId, computeId, questionnaireData);
317 mdcDataDebugMessage.debugExitMessage("VSP id, component id, compute id", vspId,
318 componentId, computeId);
322 public CompositionEntityValidationData updateCompute(ComputeEntity compute, String user) {
324 .debugEntryMessage("VSP id, component id", compute.getVspId(), compute.getComponentId(),
327 /*Version activeVersion =
328 getVersionInfo(image.getVspId(), VersionableEntityAction.Write, user).getActiveVersion();
329 image.setVersion(activeVersion);*/
331 ComputeEntity retrieved = getComputeEntity(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
334 if(!vspInfoDao.isManual(compute.getVspId(), compute.getVersion())) {
335 final ComputeData computeCompositionData = compute.getComputeCompositionData();
336 final String name = computeCompositionData.getName();
337 //final String format = computeCompositionData.getFormat();
338 validateHeatVspComputeUpdate("Name", name, retrieved.getComputeCompositionData()
340 /*validateHeatVspComputeUpdate("format", format, retrieved.getComputeCompositionData()
344 Collection<ComputeEntity> vfcComputeList = listComputes(compute.getVspId() ,
345 compute.getVersion(), compute.getComponentId());
347 //Set to null so that retrieved object is equal to one in list and gets removed.
348 retrieved.setQuestionnaireData(null);
349 vfcComputeList.remove(retrieved);
350 if(vspInfoDao.isManual(compute.getVspId(), compute.getVersion()))
351 validateVfcCompute(compute, vfcComputeList, LoggerTragetServiceName.UPDATE_COMPUTE);
353 //Set format to default value in order to handle FTL validation when compute format is null
354 /*if(compute.getComputeCompositionData().getFormat() == null)
355 compute.getComputeCompositionData().setFormat(ComputeFormat.qcow2.name());*/
357 ComputeCompositionSchemaInput schemaInput = new ComputeCompositionSchemaInput();
358 schemaInput.setCompute(compute.getComputeCompositionData());
360 CompositionEntityValidationData validationData = compositionEntityDataManager
361 .validateEntity(compute, SchemaTemplateContext.composition, schemaInput);
362 if (CollectionUtils.isEmpty(validationData.getErrors())) {
363 computeDao.update(compute);
367 .debugExitMessage("VSP id, component id", compute.getVspId(), compute.getComponentId(),
370 return validationData;
373 private void validateHeatVspComputeUpdate(String name, String value, String retrivedValue) {
375 if(value != null && !value.equals(retrivedValue)) {
377 final ErrorCode updateHeatComputeErrorBuilder =
378 DuplicateComputeInComponentErrorBuilder.getComputeHeatReadOnlyErrorBuilder(name);
380 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
381 LoggerTragetServiceName.UPDATE_COMPUTE, ErrorLevel.ERROR.name(),
382 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
383 updateHeatComputeErrorBuilder.message());
384 throw new CoreException(updateHeatComputeErrorBuilder);
388 private void validateVfcCompute(ComputeEntity compute, Collection<ComputeEntity> vfcComputeList, String event) {
389 if(!compute.getComputeCompositionData().getName().matches(VendorSoftwareProductConstants.NAME_PATTERN))
391 ErrorCode errorCode = ComputeErrorBuilder.getComputeNameFormatErrorBuilder(
392 VendorSoftwareProductConstants.NAME_PATTERN);
393 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
394 event, ErrorLevel.ERROR.name(),
395 errorCode.id(),errorCode.message());
396 throw new CoreException(errorCode);
399 if (isComputeNameDuplicate(vfcComputeList,compute.getComputeCompositionData().getName(), compute.getId())) {
400 ErrorCode errorCode = DuplicateComputeInComponentErrorBuilder.getDuplicateComputeNameErrorBuilder(compute
401 .getComputeCompositionData().getName(), compute.getComponentId());
403 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
404 event, ErrorLevel.ERROR.name(),
405 errorCode.id(),errorCode.message());
407 throw new CoreException(errorCode);
411 private boolean isComputeNameDuplicate(Collection<ComputeEntity> computes, String name, String computeId) {
412 for (ComputeEntity compute : computes) {
413 if (compute.getComputeCompositionData().getName().equalsIgnoreCase(name) && !compute.getId().equals(computeId)) {
421 private ComputeEntity getComputeEntity(String vspId, Version version, String componentId,
423 //validateComponentId(vspId,version,componentId);
424 ComputeEntity computeEntity = computeDao.get(new ComputeEntity(vspId, version, componentId, computeId));
425 VersioningUtil.validateEntityExistence(computeEntity, new ComputeEntity(vspId, version, componentId,
426 computeId), VspDetails.ENTITY_TYPE);
427 return computeEntity;
430 private Collection<ComputeEntity> listComputes(String vspId, Version version, String componentId) {
431 return computeDao.list(new ComputeEntity(vspId, version, componentId, null));
435 public void deleteCompute(String vspId, Version version, String componentId, String
436 computeFlavorId, String user) {
437 final String VSP_COMPOSITION_EDIT_NOT_ALLOWED_MSG =
438 "Composition entities may not be created / deleted for Vendor Software Product "
439 + "whose entities were uploaded";
440 mdcDataDebugMessage.debugEntryMessage("VSP id, component id, compute id", vspId,
441 componentId, computeFlavorId);
443 /*Version activeVersion =
444 getVersionInfo(vspId, VersionableEntityAction.Write, user).getActiveVersion();*/
445 if (!vspInfoDao.isManual(vspId, version)) {
446 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
447 LoggerTragetServiceName.DELETE_COMPUTE, ErrorLevel.ERROR.name(),
448 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), "Can't delete compute");
449 throw new CoreException(
450 new ErrorCode.ErrorCodeBuilder().withCategory(ErrorCategory.APPLICATION)
451 .withId(VendorSoftwareProductErrorCodes.VSP_COMPOSITION_EDIT_NOT_ALLOWED)
452 .withMessage(VSP_COMPOSITION_EDIT_NOT_ALLOWED_MSG).build());
454 ComputeEntity retrived = getCompute(vspId,version,componentId,computeFlavorId);
455 if (retrived != null){
456 deleteComputeFromDeploymentFlavors(vspId,version,computeFlavorId);
457 computeDao.delete(new ComputeEntity(vspId, version, componentId, computeFlavorId));
460 mdcDataDebugMessage.debugExitMessage("VSP id, component id, compute id", vspId,
461 componentId, computeFlavorId);
464 private void deleteComputeFromDeploymentFlavors(String vspId, Version activeVersion,
465 String computeFlavorId) {
466 //Collection<DeploymentFlavorEntity> listDF = listDeploymentFlavors(vspId, activeVersion);
467 Collection<DeploymentFlavorEntity> listDF = deploymentFlavorDao.list(new DeploymentFlavorEntity
468 (vspId, activeVersion, null));
469 for(DeploymentFlavorEntity df : listDF) {
470 DeploymentFlavorEntity deploymentFlavorEntity=removeComputeFromDF(df, computeFlavorId);
471 if(deploymentFlavorEntity!=null)
472 deploymentFlavorDao.update(deploymentFlavorEntity);
476 private DeploymentFlavorEntity removeComputeFromDF(DeploymentFlavorEntity df, String
478 DeploymentFlavor flavor = df.getDeploymentFlavorCompositionData();
479 List<ComponentComputeAssociation> associations = flavor.getComponentComputeAssociations();
480 if (associations != null) {
481 List<ComponentComputeAssociation> updatedAssociations = new ArrayList<>();
482 for (ComponentComputeAssociation ca : associations) {
483 if (ca.getComputeFlavorId() != null && ca.getComputeFlavorId().equals(computeFlavorId)) {
484 ComponentComputeAssociation updateCaremoveCompute = new ComponentComputeAssociation();
485 updateCaremoveCompute.setComponentId(ca.getComponentId());
486 updatedAssociations.add(updateCaremoveCompute);
488 updatedAssociations.add(ca);
491 flavor.setComponentComputeAssociations(updatedAssociations);
492 df.setDeploymentFlavorCompositionData(flavor);
498 protected String getComputeCompositionSchema(SchemaTemplateInput schemaInput){
499 mdcDataDebugMessage.debugEntryMessage(null, null);
500 mdcDataDebugMessage.debugExitMessage(null, null);
501 return SchemaGenerator.generate(SchemaTemplateContext.composition, CompositionEntityType.compute, schemaInput);
504 /*boolean isManual(String vspId, Version version) {
506 VspDetails vsp = vspInfoDao.get(new VspDetails(vspId, version));
507 String onboardingMethod = vsp.getOnboardingMethod();
508 if (MANUAL.equals(onboardingMethod)) {