2 * Copyright © 2016-2017 European Support Limited
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org.openecomp.sdc.vendorsoftwareproduct.impl;
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.vendorsoftwareproduct.CompositionEntityDataManager;
25 import org.openecomp.sdc.vendorsoftwareproduct.ImageManager;
26 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDao;
27 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
28 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
29 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ImageEntity;
30 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
31 import org.openecomp.sdc.vendorsoftwareproduct.errors.ImageErrorBuilder;
32 import org.openecomp.sdc.vendorsoftwareproduct.errors.NotSupportedHeatOnboardMethodErrorBuilder;
33 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
34 import org.openecomp.sdc.vendorsoftwareproduct.types.CompositionEntityResponse;
35 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
36 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
37 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
38 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Image;
39 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ImageFormat;
40 import org.openecomp.sdc.vendorsoftwareproduct.types.questionnaire.component.image.ImageDetails;
41 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.ImageCompositionSchemaInput;
42 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
43 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateInput;
44 import org.openecomp.sdc.versioning.VersioningUtil;
45 import org.openecomp.sdc.versioning.dao.types.Version;
47 import java.util.Collection;
48 import java.util.stream.Collectors;
50 public class ImageManagerImpl implements ImageManager {
51 private final VendorSoftwareProductInfoDao vspInfoDao;
52 private final ImageDao imageDao;
53 private final CompositionEntityDataManager compositionEntityDataManager;
55 public ImageManagerImpl(VendorSoftwareProductInfoDao vspInfoDao,
57 CompositionEntityDataManager compositionEntityDataManager) {
58 this.vspInfoDao = vspInfoDao;
59 this.imageDao = imageDao;
60 this.compositionEntityDataManager = compositionEntityDataManager;
64 public ImageEntity createImage(ImageEntity imageEntity) {
65 boolean isManual = vspInfoDao.isManual(imageEntity.getVspId(), imageEntity.getVersion());
67 ErrorCode errorCode = NotSupportedHeatOnboardMethodErrorBuilder
68 .getAddImageNotSupportedHeatOnboardMethodErrorBuilder();
69 throw new CoreException(errorCode);
71 compositionEntityDataManager.createImage(imageEntity);
76 public Collection<ImageEntity> listImages(String vspId, Version version, String componentId) {
77 return imageDao.list(new ImageEntity(vspId, version, componentId, null));
81 public CompositionEntityResponse<Image> getImageSchema(String vspId) {
82 CompositionEntityResponse<Image> response = new CompositionEntityResponse<>();
83 ImageCompositionSchemaInput inputSchema = new ImageCompositionSchemaInput();
84 Image image = new Image();
85 inputSchema.setImage(image);
86 response.setSchema(getImageCompositionSchema(inputSchema));
91 public CompositionEntityResponse<Image> getImage(String vspId, Version version, String
92 componentId, String imageId) {
93 ImageEntity imageEntity = getImageEntity(vspId, version, componentId, imageId);
95 Image image = imageEntity.getImageCompositionData();
97 ImageCompositionSchemaInput schemaInput = new ImageCompositionSchemaInput();
98 schemaInput.setImage(image);
100 CompositionEntityResponse<Image> response = new CompositionEntityResponse<>();
101 response.setId(imageId);
102 response.setData(image);
103 response.setSchema(getImageCompositionSchema(schemaInput));
108 public QuestionnaireResponse getImageQuestionnaire(String vspId, Version version, String
109 componentId, String imageId) {
110 QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
112 ImageEntity retrieved = imageDao.getQuestionnaireData(vspId, version, componentId, imageId);
113 VersioningUtil.validateEntityExistence(retrieved, new ImageEntity(vspId, version, componentId,
114 imageId), ComponentEntity.ENTITY_TYPE);
115 questionnaireResponse.setData(retrieved.getQuestionnaireData());
116 questionnaireResponse.setSchema(getImageQuestionnaireSchema(null));
117 return questionnaireResponse;
121 public void deleteImage(String vspId, Version version, String componentId, String imageId) {
122 ImageEntity imageEntity = getImageEntity(vspId, version, componentId, imageId);
123 if (!vspInfoDao.isManual(vspId, version)) {
124 final ErrorCode deleteImageErrorBuilder =
125 NotSupportedHeatOnboardMethodErrorBuilder
126 .getDelImageNotSupportedHeatOnboardMethodErrorBuilder();
127 throw new CoreException(deleteImageErrorBuilder);
129 if (imageEntity != null) {
130 imageDao.delete(new ImageEntity(vspId, version, componentId, imageId));
134 private void validateHeatVspImageUpdate(String name, String value, String retrivedValue) {
135 if (value != null && !value.equals(retrivedValue)) {
136 final ErrorCode updateHeatImageErrorBuilder =
137 ImageErrorBuilder.getImageHeatReadOnlyErrorBuilder(name);
138 throw new CoreException(updateHeatImageErrorBuilder);
143 public CompositionEntityValidationData updateImage(ImageEntity image) {
144 boolean isManual = vspInfoDao.isManual(image.getVspId(), image.getVersion());
145 ImageEntity retrieved =
146 getImageEntity(image.getVspId(), image.getVersion(), image.getComponentId(),
149 Collection<ImageEntity> vfcImageList = listImages(image.getVspId(),
150 image.getVersion(), image.getComponentId());
152 //Set to null so that retrieved object is equal to one in list and gets removed.
153 retrieved.setQuestionnaireData(null);
154 vfcImageList.remove(retrieved);
157 ImageCompositionSchemaInput schemaInput = new ImageCompositionSchemaInput();
158 schemaInput.setManual(isManual);
159 schemaInput.setImage(retrieved.getImageCompositionData());
161 CompositionEntityValidationData validationData = compositionEntityDataManager
162 .validateEntity(image, SchemaTemplateContext.composition, schemaInput);
163 if (CollectionUtils.isEmpty(validationData.getErrors())) {
164 imageDao.update(image);
166 return validationData;
170 public void updateImageQuestionnaire(String vspId, Version version, String componentId, String
171 imageId, String questionnaireData) {
172 getImageEntity(vspId, version, componentId, imageId);
175 final ImageDetails image = JsonUtil.json2Object(questionnaireData, ImageDetails.class);
176 final String format = image.getFormat();
178 if (format != null) {
179 ImageFormat.valueOf(format);
181 } catch (IllegalArgumentException exception) {
182 ErrorCode errorCode = ImageErrorBuilder.getInvalidImageFormatErrorBuilder();
183 throw new CoreException(errorCode, exception);
186 //Validate Format is read only for HEAT Onboarding
187 if (!vspInfoDao.isManual(vspId, version)) {
188 final QuestionnaireResponse imageQuestionnaire = getImageQuestionnaire(vspId, version,
189 componentId, imageId);
190 final String data = imageQuestionnaire.getData();
192 String retrivedFormat = JsonUtil.json2Object(data, ImageDetails.class).getFormat();
193 validateHeatVspImageUpdate("format", format, retrivedFormat);
197 if (!isImageVersionUnique(vspId, version, componentId, imageId, image)) {
198 ErrorCode errorCode = ImageErrorBuilder.getDuplicateImageVersionErrorBuilder(image
199 .getVersion(), componentId);
200 throw new CoreException(errorCode);
203 imageDao.updateQuestionnaireData(vspId, version, componentId, imageId, questionnaireData);
206 private boolean isImageVersionUnique(String vspId, Version version, String componentId,
208 ImageDetails image) {
209 boolean isPresent = true;
210 if (image != null && image.getVersion() != null) {
211 Collection<ImageEntity> imageEntities =
212 imageDao.list(new ImageEntity(vspId, version, componentId, null));
213 if (CollectionUtils.isNotEmpty(imageEntities)) {
215 imageEntities.stream().filter(imageEntity -> image.getVersion().trim().equalsIgnoreCase(
216 getImageVersion(vspId, version, componentId, imageEntity))
217 && !imageEntity.getId().equals(imageId)).collect(Collectors.toList());
219 isPresent = CollectionUtils.isEmpty(imageEntities);
226 private String getImageVersion(String vspId, Version version, String componentId,
227 ImageEntity imageEntity) {
228 QuestionnaireResponse imageQuestionnaire = getImageQuestionnaire(vspId, version,
229 componentId, imageEntity.getId());
230 ImageDetails imageDetails =
231 JsonUtil.json2Object(imageQuestionnaire.getData(), ImageDetails.class);
233 return imageDetails == null ? null
234 : imageDetails.getVersion() != null ? imageDetails.getVersion().trim() : null;
237 private ImageEntity getImageEntity(String vspId, Version version, String componentId,
240 ImageEntity imageEntity = imageDao.get(new ImageEntity(vspId, version, componentId, imageId));
242 VersioningUtil.validateEntityExistence(imageEntity, new ImageEntity(vspId, version, componentId,
243 imageId), VspDetails.ENTITY_TYPE);
247 protected String getImageCompositionSchema(SchemaTemplateInput schemaInput) {
248 return SchemaGenerator
249 .generate(SchemaTemplateContext.composition, CompositionEntityType.image,
253 protected String getImageQuestionnaireSchema(SchemaTemplateInput schemaInput) {
254 return SchemaGenerator
255 .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.image,