efc50908cf133909284fa997f16f010acead9327
[sdc.git] /
1 /*
2  * Copyright © 2016-2017 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.openecomp.sdc.vendorsoftwareproduct.impl;
18
19
20 import org.apache.commons.collections4.CollectionUtils;
21 import org.openecomp.core.utilities.json.JsonUtil;
22 import org.openecomp.sdc.common.errors.CoreException;
23 import org.openecomp.sdc.common.errors.ErrorCode;
24 import org.openecomp.sdc.datatypes.error.ErrorLevel;
25 import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage;
26 import org.openecomp.sdc.logging.types.LoggerConstants;
27 import org.openecomp.sdc.logging.types.LoggerErrorCode;
28 import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
29 import org.openecomp.sdc.vendorsoftwareproduct.ImageManager;
30 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDao;
31 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
32 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
33 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ImageEntity;
34 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
35 import org.openecomp.sdc.vendorsoftwareproduct.errors.ImageErrorBuilder;
36 import org.openecomp.sdc.vendorsoftwareproduct.errors.NotSupportedHeatOnboardMethodErrorBuilder;
37 import org.openecomp.sdc.vendorsoftwareproduct.CompositionEntityDataManager;
38 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
39 import org.openecomp.sdc.vendorsoftwareproduct.types.CompositionEntityResponse;
40 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
41 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
42 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
43 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Image;
44 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ImageFormat;
45 import org.openecomp.sdc.vendorsoftwareproduct.types.questionnaire.component.image.ImageDetails;
46 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.ImageCompositionSchemaInput;
47 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
48 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateInput;
49 import org.openecomp.sdc.versioning.VersioningUtil;
50 import org.openecomp.sdc.versioning.dao.types.Version;
51
52 import java.util.Collection;
53 import java.util.stream.Collectors;
54
55 public class ImageManagerImpl implements ImageManager {
56   private final VendorSoftwareProductInfoDao vspInfoDao;
57   private final ImageDao imageDao;
58   private final CompositionEntityDataManager compositionEntityDataManager;
59
60   public ImageManagerImpl(VendorSoftwareProductInfoDao vspInfoDao,
61                           ImageDao imageDao,
62                           CompositionEntityDataManager compositionEntityDataManager) {
63     this.vspInfoDao = vspInfoDao;
64     this.imageDao = imageDao;
65     this.compositionEntityDataManager = compositionEntityDataManager;
66   }
67
68   @Override
69   public ImageEntity createImage(ImageEntity imageEntity) {
70     boolean isManual = vspInfoDao.isManual(imageEntity.getVspId(), imageEntity.getVersion());
71     if (!isManual) {
72       ErrorCode errorCode = NotSupportedHeatOnboardMethodErrorBuilder
73           .getAddImageNotSupportedHeatOnboardMethodErrorBuilder();
74
75       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
76           LoggerTragetServiceName.CREATE_IMAGE, ErrorLevel.ERROR.name(),
77           errorCode.id(), errorCode.message());
78
79       throw new CoreException(errorCode);
80     }
81     compositionEntityDataManager.createImage(imageEntity);
82     return imageEntity;
83   }
84
85   @Override
86   public Collection<ImageEntity> listImages(String vspId, Version version, String componentId) {
87     Collection<ImageEntity> imageEntities =
88         imageDao.list(new ImageEntity(vspId, version, componentId, null));
89     return imageEntities;
90   }
91
92   @Override
93   public CompositionEntityResponse<Image> getImageSchema(String vspId) {
94     CompositionEntityResponse<Image> response = new CompositionEntityResponse<>();
95     ImageCompositionSchemaInput inputSchema = new ImageCompositionSchemaInput();
96     Image image = new Image();
97     inputSchema.setImage(image);
98     response.setSchema(getImageCompositionSchema(inputSchema));
99     return response;
100   }
101
102   @Override
103   public CompositionEntityResponse<Image> getImage(String vspId, Version version, String
104       componentId, String imageId) {
105     ImageEntity imageEntity = getImageEntity(vspId, version, componentId, imageId);
106
107     Image image = imageEntity.getImageCompositionData();
108
109     ImageCompositionSchemaInput schemaInput = new ImageCompositionSchemaInput();
110     schemaInput.setImage(image);
111
112     CompositionEntityResponse<Image> response = new CompositionEntityResponse<>();
113     response.setId(imageId);
114     response.setData(image);
115     response.setSchema(getImageCompositionSchema(schemaInput));
116     return response;
117   }
118
119   @Override
120   public QuestionnaireResponse getImageQuestionnaire(String vspId, Version version, String
121       componentId, String imageId) {
122     QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
123
124     ImageEntity retrieved = imageDao.getQuestionnaireData(vspId, version, componentId, imageId);
125     VersioningUtil.validateEntityExistence(retrieved, new ImageEntity(vspId, version, componentId,
126         imageId), ComponentEntity.ENTITY_TYPE);
127     questionnaireResponse.setData(retrieved.getQuestionnaireData());
128     questionnaireResponse.setSchema(getImageQuestionnaireSchema(null));
129     return questionnaireResponse;
130   }
131
132   @Override
133   public void deleteImage(String vspId, Version version, String componentId, String imageId) {
134     ImageEntity imageEntity = getImageEntity(vspId, version, componentId, imageId);
135     if (!vspInfoDao.isManual(vspId, version)) {
136       final ErrorCode deleteImageErrorBuilder =
137           NotSupportedHeatOnboardMethodErrorBuilder
138               .getDelImageNotSupportedHeatOnboardMethodErrorBuilder();
139       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
140           LoggerTragetServiceName.DELETE_IMAGE, ErrorLevel.ERROR.name(),
141           LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
142           deleteImageErrorBuilder.message());
143       throw new CoreException(deleteImageErrorBuilder);
144     }
145     if (imageEntity != null) {
146       imageDao.delete(new ImageEntity(vspId, version, componentId, imageId));
147     }
148   }
149
150   private void validateHeatVspImageUpdate(String name, String value, String retrivedValue) {
151     if (value != null && !value.equals(retrivedValue)) {
152       final ErrorCode updateHeatImageErrorBuilder =
153           ImageErrorBuilder.getImageHeatReadOnlyErrorBuilder(name);
154
155       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
156           LoggerTragetServiceName.UPDATE_IMAGE, ErrorLevel.ERROR.name(),
157           LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
158           updateHeatImageErrorBuilder.message());
159       throw new CoreException(updateHeatImageErrorBuilder);
160     }
161   }
162
163   @Override
164   public CompositionEntityValidationData updateImage(ImageEntity image) {
165     boolean isManual = vspInfoDao.isManual(image.getVspId(), image.getVersion());
166     ImageEntity retrieved =
167         getImageEntity(image.getVspId(), image.getVersion(), image.getComponentId(),
168             image.getId());
169
170     if (!isManual) {
171       final Image imageCompositionData = image.getImageCompositionData();
172       final String fileName = imageCompositionData.getFileName();
173       validateHeatVspImageUpdate("fileName", fileName, retrieved.getImageCompositionData()
174           .getFileName());
175     }
176
177     Collection<ImageEntity> vfcImageList = listImages(image.getVspId(),
178         image.getVersion(), image.getComponentId());
179
180     //Set to null so that retrieved object is equal to one in list and gets removed.
181     retrieved.setQuestionnaireData(null);
182     vfcImageList.remove(retrieved);
183
184
185     ImageCompositionSchemaInput schemaInput = new ImageCompositionSchemaInput();
186     schemaInput.setImage(image.getImageCompositionData());
187
188     CompositionEntityValidationData validationData = compositionEntityDataManager
189         .validateEntity(image, SchemaTemplateContext.composition, schemaInput);
190     if (CollectionUtils.isEmpty(validationData.getErrors())) {
191       imageDao.update(image);
192     }
193     return validationData;
194   }
195
196   @Override
197   public void updateImageQuestionnaire(String vspId, Version version, String componentId, String
198       imageId, String questionnaireData) {
199     getImageEntity(vspId, version, componentId, imageId);
200
201
202     final ImageDetails image = JsonUtil.json2Object(questionnaireData, ImageDetails.class);
203     final String format = image.getFormat();
204     try {
205       if (format != null) {
206         ImageFormat.valueOf(format);
207       }
208     } catch (IllegalArgumentException exception) {
209       ErrorCode errorCode = ImageErrorBuilder.getInvalidImageFormatErrorBuilder();
210       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
211           LoggerTragetServiceName.UPDATE_IMAGE, ErrorLevel.ERROR.name(),
212           errorCode.id(), errorCode.message() + exception);
213       throw new CoreException(errorCode, exception);
214     }
215
216     //Validate Format is read only for HEAT Onboarding
217     if (!vspInfoDao.isManual(vspId, version)) {
218       final QuestionnaireResponse imageQuestionnaire = getImageQuestionnaire(vspId, version,
219           componentId, imageId);
220       final String data = imageQuestionnaire.getData();
221       if (data != null) {
222         String retrivedFormat = JsonUtil.json2Object(data, ImageDetails.class).getFormat();
223         validateHeatVspImageUpdate("format", format, retrivedFormat);
224       }
225     }
226
227     if (!isImageVersionUnique(vspId, version, componentId, imageId, image)) {
228       ErrorCode errorCode = ImageErrorBuilder.getDuplicateImageVersionErrorBuilder(image
229           .getVersion(), componentId);
230
231       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
232           LoggerTragetServiceName.UPDATE_IMAGE, ErrorLevel.ERROR.name(),
233           errorCode.id(), errorCode.message());
234
235       throw new CoreException(errorCode);
236     }
237
238     imageDao.updateQuestionnaireData(vspId, version, componentId, imageId, questionnaireData);
239   }
240
241   private boolean isImageVersionUnique(String vspId, Version version, String componentId,
242                                        String imageId,
243                                        ImageDetails image) {
244     boolean isPresent = true;
245     if (image != null && image.getVersion() != null) {
246       Collection<ImageEntity> imageEntities =
247           imageDao.list(new ImageEntity(vspId, version, componentId, null));
248       if (CollectionUtils.isNotEmpty(imageEntities)) {
249         imageEntities =
250             imageEntities.stream().filter(imageEntity -> image.getVersion().trim().equalsIgnoreCase(
251                 getImageVersion(vspId, version, componentId, imageEntity))
252                 && !imageEntity.getId().equals(imageId)).collect(Collectors.toList());
253
254         isPresent = CollectionUtils.isEmpty(imageEntities);
255       }
256     }
257
258     return isPresent;
259   }
260
261   private String getImageVersion(String vspId, Version version, String componentId,
262                                  ImageEntity imageEntity) {
263     QuestionnaireResponse imageQuestionnaire = getImageQuestionnaire(vspId, version,
264         componentId, imageEntity.getId());
265     ImageDetails imageDetails =
266         JsonUtil.json2Object(imageQuestionnaire.getData(), ImageDetails.class);
267
268     return imageDetails == null ? null
269         : imageDetails.getVersion() != null ? imageDetails.getVersion().trim() : null;
270   }
271
272   private ImageEntity getImageEntity(String vspId, Version version, String componentId,
273                                      String imageId) {
274
275     ImageEntity imageEntity = imageDao.get(new ImageEntity(vspId, version, componentId, imageId));
276
277     VersioningUtil.validateEntityExistence(imageEntity, new ImageEntity(vspId, version, componentId,
278         imageId), VspDetails.ENTITY_TYPE);
279     return imageEntity;
280   }
281
282   protected String getImageCompositionSchema(SchemaTemplateInput schemaInput) {
283     return SchemaGenerator
284         .generate(SchemaTemplateContext.composition, CompositionEntityType.image,
285             schemaInput);
286   }
287
288   protected String getImageQuestionnaireSchema(SchemaTemplateInput schemaInput) {
289     return SchemaGenerator
290         .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.image,
291             schemaInput);
292   }
293 }