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.dao.ImageDao;
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.ImageEntity;
19 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
20 import org.openecomp.sdc.vendorsoftwareproduct.errors.ImageErrorBuilder;
21 import org.openecomp.sdc.vendorsoftwareproduct.errors.NotSupportedHeatOnboardMethodErrorBuilder;
22 import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionEntityDataManager;
23 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
24 import org.openecomp.sdc.vendorsoftwareproduct.types.CompositionEntityResponse;
25 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
26 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
27 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
28 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Image;
29 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ImageFormat;
30 import org.openecomp.sdc.vendorsoftwareproduct.types.questionnaire.component.image.ImageDetails;
31 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.ImageCompositionSchemaInput;
32 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
33 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateInput;
34 import org.openecomp.sdc.versioning.VersioningUtil;
35 import org.openecomp.sdc.versioning.dao.types.Version;
37 import java.util.Collection;
38 import java.util.stream.Collectors;
40 import org.openecomp.sdc.logging.api.Logger;
41 import org.openecomp.sdc.logging.api.LoggerFactory;
43 public class ImageManagerImpl implements ImageManager {
44 private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
45 private VendorSoftwareProductInfoDao vspInfoDao;
46 private ImageDao imageDao;
47 private CompositionEntityDataManager compositionEntityDataManager;
49 private final Logger log = (Logger) LoggerFactory.getLogger(this.getClass().getName());
51 public ImageManagerImpl(
52 VendorSoftwareProductInfoDao vspInfoDao,
54 CompositionEntityDataManager compositionEntityDataManager
58 this.vspInfoDao = vspInfoDao;
59 this.imageDao = imageDao;
60 this.compositionEntityDataManager = compositionEntityDataManager;
65 public ImageEntity createImage(ImageEntity imageEntity, String user) {
66 /*Version activeVersion = getVersionInfo(imageEntity.getVspId(),
67 VersionableEntityAction.Write, user).getActiveVersion();
69 imageEntity.setVersion(activeVersion);*/
70 boolean isManual = vspInfoDao.isManual(imageEntity.getVspId(), imageEntity.getVersion());
73 ErrorCode errorCode = NotSupportedHeatOnboardMethodErrorBuilder
74 .getAddImageNotSupportedHeatOnboardMethodErrorBuilder();
76 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
77 LoggerTragetServiceName.CREATE_IMAGE, ErrorLevel.ERROR.name(),
78 errorCode.id(), errorCode.message());
80 throw new CoreException(errorCode);
83 /*Collection<ImageEntity> vfcImageList = listImages(imageEntity.getVspId() ,
84 imageEntity.getVersion(), imageEntity.getComponentId());*/
85 compositionEntityDataManager.createImage(imageEntity);
90 public Collection<ImageEntity> listImages(String vspId, Version version, String componentId,
92 mdcDataDebugMessage.debugEntryMessage("VSP id", vspId);
93 Collection<ImageEntity> imageEntities = listImages(vspId, version, componentId);
95 mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
100 private Collection<ImageEntity> listImages(String vspId, Version version, String componentId) {
101 return imageDao.list(new ImageEntity(vspId, version, componentId, null));
105 public CompositionEntityResponse getImageSchema(String vspId, String user) {
106 mdcDataDebugMessage.debugEntryMessage("VSP id, image id", vspId);
108 CompositionEntityResponse<Image> response = new CompositionEntityResponse<>();
109 ImageCompositionSchemaInput inputSchema = new ImageCompositionSchemaInput();
110 Image image = new Image();
111 //image.setFormat(ImageFormat.qcow2.name());
112 inputSchema.setImage(image);
113 response.setSchema(getImageCompositionSchema(inputSchema));
115 mdcDataDebugMessage.debugExitMessage("VSP id, image id", vspId);
120 public CompositionEntityResponse<Image> getImage(String vspId, Version version, String
121 componentId, String imageId, String user) {
123 mdcDataDebugMessage.debugEntryMessage("VSP id, componentId, image id", vspId, componentId,
126 /*version = VersioningUtil
127 .resolveVersion(version, getVersionInfo(vspId, VersionableEntityAction.Read, user));*/
129 ImageEntity imageEntity = getImageEntity(vspId, version, componentId, imageId);
131 Image image = imageEntity.getImageCompositionData();
132 //Set format to default value in order to handle FTL validation when image format is null
133 /*if(image.getFormat() == null)
134 image.setFormat(ImageFormat.qcow2.name());*/
136 ImageCompositionSchemaInput schemaInput = new ImageCompositionSchemaInput();
137 schemaInput.setImage(image);
139 CompositionEntityResponse<Image> response = new CompositionEntityResponse<>();
140 response.setId(imageId);
141 response.setData(image);
142 response.setSchema(getImageCompositionSchema(schemaInput));
144 mdcDataDebugMessage.debugExitMessage("VSP id, componentId, image id", vspId, componentId,
151 public QuestionnaireResponse getImageQuestionnaire(String vspId, Version version, String
152 componentId, String imageId, String user) {
153 mdcDataDebugMessage.debugEntryMessage("VSP id", vspId);
155 /*version = VersioningUtil
156 .resolveVersion(version, getVersionInfo(vspId, VersionableEntityAction.Read, user));
157 validateComponentId(vspId,version,componentId);*/
158 QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
159 //validateComponentId(vspId,version,componentId);
161 ImageEntity retrieved = imageDao.getQuestionnaireData(vspId, version, componentId, imageId);
162 VersioningUtil.validateEntityExistence(retrieved, new ImageEntity(vspId, version, componentId,
163 imageId), ComponentEntity.ENTITY_TYPE);
164 questionnaireResponse.setData(retrieved.getQuestionnaireData());
165 questionnaireResponse.setSchema(getImageQuestionnaireSchema(null));
167 mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
169 return questionnaireResponse;
173 public void deleteImage(String vspId, Version version, String componentId, String imageId, String
176 .debugEntryMessage("VSP id, component id", vspId, componentId, imageId);
178 /*Version activeVersion =
179 getVersionInfo(vspId, VersionableEntityAction.Write, user).getActiveVersion();
180 ComponentEntity component = getComponent(vspId, activeVersion, componentId);*/
181 ImageEntity imageEntity = getImageEntity(vspId, version, componentId, imageId);
182 if (!vspInfoDao.isManual(vspId, version)) {
183 final ErrorCode deleteImageErrorBuilder =
184 NotSupportedHeatOnboardMethodErrorBuilder
185 .getDelImageNotSupportedHeatOnboardMethodErrorBuilder();
186 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
187 LoggerTragetServiceName.DELETE_IMAGE, ErrorLevel.ERROR.name(),
188 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
189 deleteImageErrorBuilder.message());
190 throw new CoreException(deleteImageErrorBuilder);
192 if (imageEntity != null) {
193 imageDao.delete(new ImageEntity(vspId, version, componentId, imageId));
196 .debugExitMessage("VSP id, component id", vspId, componentId, imageId);
199 private void validateHeatVspImageUpdate(String name, String value, String retrivedValue) {
201 if(value != null && !value.equals(retrivedValue)) {
203 final ErrorCode updateHeatImageErrorBuilder =
204 ImageErrorBuilder.getImageHeatReadOnlyErrorBuilder(name);
206 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
207 LoggerTragetServiceName.UPDATE_IMAGE, ErrorLevel.ERROR.name(),
208 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
209 updateHeatImageErrorBuilder.message());
210 throw new CoreException(updateHeatImageErrorBuilder);
215 public CompositionEntityValidationData updateImage(ImageEntity image, String user) {
217 .debugEntryMessage("VSP id, component id", image.getVspId(), image.getComponentId(),
220 /*Version activeVersion =
221 getVersionInfo(image.getVspId(), VersionableEntityAction.Write, user).getActiveVersion();
222 image.setVersion(activeVersion);*/
223 boolean isManual = vspInfoDao.isManual(image.getVspId(), image.getVersion());
224 ImageEntity retrieved = getImageEntity(image.getVspId(), image.getVersion(), image.getComponentId(),
228 final Image imageCompositionData = image.getImageCompositionData();
229 final String fileName = imageCompositionData.getFileName();
230 //final String format = imageCompositionData.getFormat();
231 validateHeatVspImageUpdate("fileName", fileName, retrieved.getImageCompositionData()
233 /*validateHeatVspImageUpdate("format", format, retrieved.getImageCompositionData()
237 Collection<ImageEntity> vfcImageList = listImages(image.getVspId() ,
238 image.getVersion(), image.getComponentId());
240 //Set to null so that retrieved object is equal to one in list and gets removed.
241 retrieved.setQuestionnaireData(null);
242 vfcImageList.remove(retrieved);
244 //Set format to default value in order to handle FTL validation when image format is null
245 /*if(image.getImageCompositionData().getFormat() == null)
246 image.getImageCompositionData().setFormat(ImageFormat.qcow2.name());*/
248 ImageCompositionSchemaInput schemaInput = new ImageCompositionSchemaInput();
249 schemaInput.setImage(image.getImageCompositionData());
251 CompositionEntityValidationData validationData = compositionEntityDataManager
252 .validateEntity(image, SchemaTemplateContext.composition, schemaInput);
253 if (CollectionUtils.isEmpty(validationData.getErrors())) {
254 imageDao.update(image);
258 .debugExitMessage("VSP id, component id", image.getVspId(), image.getComponentId(),
261 return validationData;
265 public void updateImageQuestionnaire(String vspId, Version version, String componentId, String
266 imageId, String questionnaireData, String user) {
267 mdcDataDebugMessage.debugEntryMessage("VSP id, component id, imageId", vspId, componentId,
270 getImageEntity(vspId, version, componentId, imageId);
272 /*Version activeVersion =
273 getVersionInfo(vspId, VersionableEntityAction.Write, user).getActiveVersion();
275 getComponent(vspId, activeVersion, componentId);*/
277 final ImageDetails image = JsonUtil.json2Object(questionnaireData, ImageDetails.class);
278 final String format = image.getFormat();
280 if (format != null) {
281 final ImageFormat imageFormat = ImageFormat.valueOf(format);
283 } catch (IllegalArgumentException exception) {
284 log.debug("", exception);
285 ErrorCode errorCode = ImageErrorBuilder.getInvalidImageFormatErrorBuilder();
286 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
287 LoggerTragetServiceName.UPDATE_IMAGE, ErrorLevel.ERROR.name(),
288 errorCode.id(), errorCode.message() );
289 throw new CoreException(errorCode);
292 //Validate Format is read only for HEAT Onboarding
293 if (!vspInfoDao.isManual(vspId, version)) {
294 final QuestionnaireResponse imageQuestionnaire = getImageQuestionnaire(vspId, version,
295 componentId, imageId, user);
296 final String data = imageQuestionnaire.getData();
298 String retrivedFormat = JsonUtil.json2Object(data, ImageDetails.class).getFormat();
299 validateHeatVspImageUpdate("format", format, retrivedFormat);
303 if(!isImageVersionUnique(vspId, version, componentId, imageId, image, user))
305 ErrorCode errorCode = ImageErrorBuilder.getDuplicateImageVersionErrorBuilder(image
306 .getVersion(), componentId);
308 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
309 LoggerTragetServiceName.UPDATE_IMAGE, ErrorLevel.ERROR.name(),
310 errorCode.id(),errorCode.message());
312 throw new CoreException(errorCode);
315 imageDao.updateQuestionnaireData(vspId, version, componentId, imageId, questionnaireData);
316 mdcDataDebugMessage.debugExitMessage("VSP id, component id, imageId", vspId, componentId,
320 private boolean isImageVersionUnique(String vspId, Version version, String componentId, String imageId,
321 ImageDetails image, String user)
323 boolean isPresent = true;
324 if(image!=null && image.getVersion()!=null)
326 Collection<ImageEntity> imageEntities = imageDao.list(new ImageEntity(vspId, version, componentId, null));
327 if(CollectionUtils.isNotEmpty(imageEntities))
329 imageEntities = imageEntities.stream().filter(imageEntity -> image.getVersion().trim().equalsIgnoreCase(
330 getImageVersion(vspId, version, componentId, imageEntity, user))
331 && !imageEntity.getId().equals(imageId)).collect(Collectors.toList());
333 isPresent = CollectionUtils.isEmpty(imageEntities);
340 private String getImageVersion(String vspId, Version version, String componentId, ImageEntity imageEntity, String user)
342 QuestionnaireResponse imageQuestionnaire = getImageQuestionnaire(vspId, version,
343 componentId, imageEntity.getId(), user);
344 ImageDetails imageDetails = JsonUtil.json2Object(imageQuestionnaire.getData(), ImageDetails.class);
346 return imageDetails==null?null:imageDetails.getVersion()!=null?imageDetails.getVersion().trim():null;
348 private ImageEntity getImageEntity(String vspId, Version version, String componentId,
350 //validateComponentId(vspId,version,componentId);
352 ImageEntity imageEntity = imageDao.get(new ImageEntity(vspId, version, componentId, imageId));
354 VersioningUtil.validateEntityExistence(imageEntity, new ImageEntity(vspId, version, componentId,
355 imageId), VspDetails.ENTITY_TYPE);
360 private boolean isImageNameDuplicate(Collection<ImageEntity> images, String fileName) {
361 for (ImageEntity image : images) {
362 if (image.getImageCompositionData().getFileName().equalsIgnoreCase(fileName)) {
369 protected String getImageCompositionSchema(SchemaTemplateInput schemaInput) {
370 mdcDataDebugMessage.debugEntryMessage(null, null);
371 mdcDataDebugMessage.debugExitMessage(null, null);
372 return SchemaGenerator
373 .generate(SchemaTemplateContext.composition, CompositionEntityType.image,
377 protected String getImageQuestionnaireSchema(SchemaTemplateInput schemaInput) {
378 mdcDataDebugMessage.debugEntryMessage(null, null);
380 mdcDataDebugMessage.debugExitMessage(null, null);
381 return SchemaGenerator
382 .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.image,