1 package org.openecomp.sdc.vendorsoftwareproduct.impl;
4 import org.apache.commons.collections4.CollectionUtils;
5 import org.openecomp.core.utilities.json.JsonUtil;
6 import org.openecomp.sdc.common.errors.CoreException;
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.ImageManager;
15 import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductConstants;
16 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDao;
17 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
18 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
19 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ImageEntity;
20 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
21 import org.openecomp.sdc.vendorsoftwareproduct.errors.ImageErrorBuilder;
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.QuestionnaireResponse;
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.Image;
30 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ImageFormat;
31 import org.openecomp.sdc.vendorsoftwareproduct.types.questionnaire.component.image.ImageDetails;
32 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.ImageCompositionSchemaInput;
33 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
34 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateInput;
35 import org.openecomp.sdc.versioning.VersioningUtil;
36 import org.openecomp.sdc.versioning.dao.types.Version;
38 import java.util.Collection;
39 import java.util.stream.Collectors;
41 public class ImageManagerImpl implements ImageManager {
42 private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
43 private VendorSoftwareProductInfoDao vspInfoDao;
44 private ImageDao imageDao;
45 private CompositionEntityDataManager compositionEntityDataManager;
47 public ImageManagerImpl(
48 VendorSoftwareProductInfoDao vspInfoDao,
50 CompositionEntityDataManager compositionEntityDataManager
54 this.vspInfoDao = vspInfoDao;
55 this.imageDao = imageDao;
56 this.compositionEntityDataManager = compositionEntityDataManager;
61 public ImageEntity createImage(ImageEntity imageEntity, String user) {
62 /*Version activeVersion = getVersionInfo(imageEntity.getVspId(),
63 VersionableEntityAction.Write, user).getActiveVersion();
65 imageEntity.setVersion(activeVersion);*/
66 boolean isManual = vspInfoDao.isManual(imageEntity.getVspId(), imageEntity.getVersion());
69 ErrorCode errorCode = NotSupportedHeatOnboardMethodErrorBuilder
70 .getAddImageNotSupportedHeatOnboardMethodErrorBuilder();
72 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
73 LoggerTragetServiceName.CREATE_IMAGE, ErrorLevel.ERROR.name(),
74 errorCode.id(), errorCode.message());
76 throw new CoreException(errorCode);
79 Collection<ImageEntity> vfcImageList = listImages(imageEntity.getVspId() ,
80 imageEntity.getVersion(), imageEntity.getComponentId());
81 validateVfcImage(isManual, imageEntity, vfcImageList, LoggerTragetServiceName.CREATE_IMAGE);
82 compositionEntityDataManager.createImage(imageEntity);
87 public Collection<ImageEntity> listImages(String vspId, Version version, String componentId,
89 mdcDataDebugMessage.debugEntryMessage("VSP id", vspId);
90 Collection<ImageEntity> imageEntities = listImages(vspId, version, componentId);
92 mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
97 private Collection<ImageEntity> listImages(String vspId, Version version, String componentId) {
98 return imageDao.list(new ImageEntity(vspId, version, componentId, null));
102 public CompositionEntityResponse getImageSchema(String vspId, String user) {
103 mdcDataDebugMessage.debugEntryMessage("VSP id, image id", vspId);
105 CompositionEntityResponse<Image> response = new CompositionEntityResponse<>();
106 ImageCompositionSchemaInput inputSchema = new ImageCompositionSchemaInput();
107 Image image = new Image();
108 //image.setFormat(ImageFormat.qcow2.name());
109 inputSchema.setImage(image);
110 response.setSchema(getImageCompositionSchema(inputSchema));
112 mdcDataDebugMessage.debugExitMessage("VSP id, image id", vspId);
117 public CompositionEntityResponse<Image> getImage(String vspId, Version version, String
118 componentId, String imageId, String user) {
120 mdcDataDebugMessage.debugEntryMessage("VSP id, componentId, image id", vspId, componentId,
123 /*version = VersioningUtil
124 .resolveVersion(version, getVersionInfo(vspId, VersionableEntityAction.Read, user));*/
126 ImageEntity imageEntity = getImageEntity(vspId, version, componentId, imageId);
128 Image image = imageEntity.getImageCompositionData();
129 //Set format to default value in order to handle FTL validation when image format is null
130 /*if(image.getFormat() == null)
131 image.setFormat(ImageFormat.qcow2.name());*/
133 ImageCompositionSchemaInput schemaInput = new ImageCompositionSchemaInput();
134 schemaInput.setImage(image);
136 CompositionEntityResponse<Image> response = new CompositionEntityResponse<>();
137 response.setId(imageId);
138 response.setData(image);
139 response.setSchema(getImageCompositionSchema(schemaInput));
141 mdcDataDebugMessage.debugExitMessage("VSP id, componentId, image id", vspId, componentId,
148 public QuestionnaireResponse getImageQuestionnaire(String vspId, Version version, String
149 componentId, String imageId, String user) {
150 mdcDataDebugMessage.debugEntryMessage("VSP id", vspId);
152 /*version = VersioningUtil
153 .resolveVersion(version, getVersionInfo(vspId, VersionableEntityAction.Read, user));
154 validateComponentId(vspId,version,componentId);*/
155 QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
156 //validateComponentId(vspId,version,componentId);
158 ImageEntity retrieved = imageDao.getQuestionnaireData(vspId, version, componentId, imageId);
159 VersioningUtil.validateEntityExistence(retrieved, new ImageEntity(vspId, version, componentId,
160 imageId), ComponentEntity.ENTITY_TYPE);
161 questionnaireResponse.setData(retrieved.getQuestionnaireData());
162 questionnaireResponse.setSchema(getImageQuestionnaireSchema(null));
164 mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
166 return questionnaireResponse;
170 public void deleteImage(String vspId, Version version, String componentId, String imageId, String
173 .debugEntryMessage("VSP id, component id", vspId, componentId, imageId);
175 /*Version activeVersion =
176 getVersionInfo(vspId, VersionableEntityAction.Write, user).getActiveVersion();
177 ComponentEntity component = getComponent(vspId, activeVersion, componentId);*/
178 ImageEntity imageEntity = getImageEntity(vspId, version, componentId, imageId);
179 if (!vspInfoDao.isManual(vspId, version)) {
180 final ErrorCode deleteImageErrorBuilder =
181 NotSupportedHeatOnboardMethodErrorBuilder
182 .getDelImageNotSupportedHeatOnboardMethodErrorBuilder();
183 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
184 LoggerTragetServiceName.DELETE_IMAGE, ErrorLevel.ERROR.name(),
185 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
186 deleteImageErrorBuilder.message());
187 throw new CoreException(deleteImageErrorBuilder);
189 if (imageEntity != null) {
190 imageDao.delete(new ImageEntity(vspId, version, componentId, imageId));
193 .debugExitMessage("VSP id, component id", vspId, componentId, imageId);
196 private void validateHeatVspImageUpdate(String name, String value, String retrivedValue) {
198 if(value != null && !value.equals(retrivedValue)) {
200 final ErrorCode updateHeatImageErrorBuilder =
201 ImageErrorBuilder.getImageHeatReadOnlyErrorBuilder(name);
203 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
204 LoggerTragetServiceName.UPDATE_IMAGE, ErrorLevel.ERROR.name(),
205 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
206 updateHeatImageErrorBuilder.message());
207 throw new CoreException(updateHeatImageErrorBuilder);
212 public CompositionEntityValidationData updateImage(ImageEntity image, String user) {
214 .debugEntryMessage("VSP id, component id", image.getVspId(), image.getComponentId(),
217 /*Version activeVersion =
218 getVersionInfo(image.getVspId(), VersionableEntityAction.Write, user).getActiveVersion();
219 image.setVersion(activeVersion);*/
220 boolean isManual = vspInfoDao.isManual(image.getVspId(), image.getVersion());
221 ImageEntity retrieved = getImageEntity(image.getVspId(), image.getVersion(), image.getComponentId(),
225 final Image imageCompositionData = image.getImageCompositionData();
226 final String fileName = imageCompositionData.getFileName();
227 //final String format = imageCompositionData.getFormat();
228 validateHeatVspImageUpdate("fileName", fileName, retrieved.getImageCompositionData()
230 /*validateHeatVspImageUpdate("format", format, retrieved.getImageCompositionData()
234 Collection<ImageEntity> vfcImageList = listImages(image.getVspId() ,
235 image.getVersion(), image.getComponentId());
237 //Set to null so that retrieved object is equal to one in list and gets removed.
238 retrieved.setQuestionnaireData(null);
239 vfcImageList.remove(retrieved);
240 validateVfcImage(isManual, image, vfcImageList, LoggerTragetServiceName.UPDATE_IMAGE);
242 //Set format to default value in order to handle FTL validation when image format is null
243 /*if(image.getImageCompositionData().getFormat() == null)
244 image.getImageCompositionData().setFormat(ImageFormat.qcow2.name());*/
246 ImageCompositionSchemaInput schemaInput = new ImageCompositionSchemaInput();
247 schemaInput.setImage(image.getImageCompositionData());
249 CompositionEntityValidationData validationData = compositionEntityDataManager
250 .validateEntity(image, SchemaTemplateContext.composition, schemaInput);
251 if (CollectionUtils.isEmpty(validationData.getErrors())) {
252 imageDao.update(image);
256 .debugExitMessage("VSP id, component id", image.getVspId(), image.getComponentId(),
259 return validationData;
263 public void updateImageQuestionnaire(String vspId, Version version, String componentId, String
264 imageId, String questionnaireData, String user) {
265 mdcDataDebugMessage.debugEntryMessage("VSP id, component id, imageId", vspId, componentId,
268 getImageEntity(vspId, version, componentId, imageId);
270 /*Version activeVersion =
271 getVersionInfo(vspId, VersionableEntityAction.Write, user).getActiveVersion();
273 getComponent(vspId, activeVersion, componentId);*/
275 final ImageDetails image = JsonUtil.json2Object(questionnaireData, ImageDetails.class);
276 final String format = image.getFormat();
278 if (format != null) {
279 final ImageFormat imageFormat = ImageFormat.valueOf(format);
281 } catch (IllegalArgumentException exception) {
282 ErrorCode errorCode = ImageErrorBuilder.getInvalidImageFormatErrorBuilder();
283 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
284 LoggerTragetServiceName.UPDATE_IMAGE, ErrorLevel.ERROR.name(),
285 errorCode.id(), errorCode.message() );
286 throw new CoreException(errorCode);
289 //Validate Format is read only for HEAT Onboarding
290 if (!vspInfoDao.isManual(vspId, version)) {
291 final QuestionnaireResponse imageQuestionnaire = getImageQuestionnaire(vspId, version,
292 componentId, imageId, user);
293 final String data = imageQuestionnaire.getData();
295 String retrivedFormat = JsonUtil.json2Object(data, ImageDetails.class).getFormat();
296 validateHeatVspImageUpdate("format", format, retrivedFormat);
300 if(!isImageVersionUnique(vspId, version, componentId, imageId, image, user))
302 ErrorCode errorCode = ImageErrorBuilder.getDuplicateImageVersionErrorBuilder(image
303 .getVersion(), componentId);
305 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
306 LoggerTragetServiceName.UPDATE_IMAGE, ErrorLevel.ERROR.name(),
307 errorCode.id(),errorCode.message());
309 throw new CoreException(errorCode);
312 imageDao.updateQuestionnaireData(vspId, version, componentId, imageId, questionnaireData);
313 mdcDataDebugMessage.debugExitMessage("VSP id, component id, imageId", vspId, componentId,
317 private boolean isImageVersionUnique(String vspId, Version version, String componentId, String imageId,
318 ImageDetails image, String user)
320 boolean isPresent = true;
321 if(image!=null && image.getVersion()!=null)
323 Collection<ImageEntity> imageEntities = imageDao.list(new ImageEntity(vspId, version, componentId, null));
324 if(CollectionUtils.isNotEmpty(imageEntities))
326 imageEntities = imageEntities.stream().filter(imageEntity -> image.getVersion().trim().equalsIgnoreCase(
327 getImageVersion(vspId, version, componentId, imageEntity, user))
328 && !imageEntity.getId().equals(imageId)).collect(Collectors.toList());
330 isPresent = CollectionUtils.isEmpty(imageEntities);
337 private String getImageVersion(String vspId, Version version, String componentId, ImageEntity imageEntity, String user)
339 QuestionnaireResponse imageQuestionnaire = getImageQuestionnaire(vspId, version,
340 componentId, imageEntity.getId(), user);
341 ImageDetails imageDetails = JsonUtil.json2Object(imageQuestionnaire.getData(), ImageDetails.class);
343 return imageDetails==null?null:imageDetails.getVersion()!=null?imageDetails.getVersion().trim():null;
345 private ImageEntity getImageEntity(String vspId, Version version, String componentId,
347 //validateComponentId(vspId,version,componentId);
349 ImageEntity imageEntity = imageDao.get(new ImageEntity(vspId, version, componentId, imageId));
351 VersioningUtil.validateEntityExistence(imageEntity, new ImageEntity(vspId, version, componentId,
352 imageId), VspDetails.ENTITY_TYPE);
357 private boolean isImageNameDuplicate(Collection<ImageEntity> images, String fileName) {
358 for (ImageEntity image : images) {
359 if (image.getImageCompositionData().getFileName().equalsIgnoreCase(fileName)) {
366 private void validateVfcImage(boolean isManual, ImageEntity image,
367 Collection<ImageEntity> vfcImageList, String event) {
368 if (isImageNameDuplicate(vfcImageList,image.getImageCompositionData().getFileName())) {
369 ErrorCode errorCode = ImageErrorBuilder.getDuplicateImageNameErrorBuilder(image
370 .getImageCompositionData().getFileName(), image.getComponentId());
372 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
373 event, ErrorLevel.ERROR.name(),
374 errorCode.id(),errorCode.message());
376 throw new CoreException(errorCode);
380 protected String getImageCompositionSchema(SchemaTemplateInput schemaInput) {
381 mdcDataDebugMessage.debugEntryMessage(null, null);
382 mdcDataDebugMessage.debugExitMessage(null, null);
383 return SchemaGenerator
384 .generate(SchemaTemplateContext.composition, CompositionEntityType.image,
388 protected String getImageQuestionnaireSchema(SchemaTemplateInput schemaInput) {
389 mdcDataDebugMessage.debugEntryMessage(null, null);
391 mdcDataDebugMessage.debugExitMessage(null, null);
392 return SchemaGenerator
393 .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.image,