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.util.UniqueValueUtil;
22 import org.openecomp.core.utilities.json.JsonSchemaDataGenerator;
23 import org.openecomp.sdc.common.errors.CoreException;
24 import org.openecomp.sdc.common.errors.ErrorCategory;
25 import org.openecomp.sdc.common.errors.ErrorCode;
26 import org.openecomp.sdc.datatypes.error.ErrorLevel;
27 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
28 import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage;
29 import org.openecomp.sdc.logging.types.LoggerConstants;
30 import org.openecomp.sdc.logging.types.LoggerErrorCode;
31 import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
32 import org.openecomp.sdc.vendorsoftwareproduct.ComputeManager;
33 import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductConstants;
34 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
35 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDao;
36 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
37 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
38 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.DeploymentFlavorEntity;
39 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
40 import org.openecomp.sdc.vendorsoftwareproduct.errors.DuplicateComputeInComponentErrorBuilder;
41 import org.openecomp.sdc.vendorsoftwareproduct.errors.NotSupportedHeatOnboardMethodErrorBuilder;
42 import org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductErrorCodes;
43 import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionEntityDataManager;
44 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
45 import org.openecomp.sdc.vendorsoftwareproduct.types.CompositionEntityResponse;
46 import org.openecomp.sdc.vendorsoftwareproduct.types.ListComputeResponse;
47 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
48 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentComputeAssociation;
49 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
50 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
51 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComputeData;
52 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.DeploymentFlavor;
53 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.ComputeCompositionSchemaInput;
54 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
55 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateInput;
56 import org.openecomp.sdc.versioning.VersioningUtil;
57 import org.openecomp.sdc.versioning.dao.types.Version;
59 import java.util.ArrayList;
60 import java.util.Collection;
61 import java.util.HashSet;
62 import java.util.List;
65 public class ComputeManagerImpl implements ComputeManager {
67 private static final MdcDataDebugMessage MDC_DATA_DEBUG_MESSAGE = new MdcDataDebugMessage();
68 private final ComputeDao computeDao;
69 private final CompositionEntityDataManager compositionEntityDataManager;
70 private final VendorSoftwareProductInfoDao vspInfoDao;
71 private final DeploymentFlavorDao deploymentFlavorDao;
72 private static final String VSP_ID_COMPONENT_ID = "VSP id, component id";
73 private static final String VSP_ID_COMPONENT_ID_COMPUTE_ID
74 = "VSP id, component id, compute id";
76 public ComputeManagerImpl(VendorSoftwareProductInfoDao vspInfoDao,
77 ComputeDao computeDao,
78 CompositionEntityDataManager compositionEntityDataManager,
79 DeploymentFlavorDao deploymentFlavorDao) {
80 this.computeDao = computeDao;
81 this.compositionEntityDataManager = compositionEntityDataManager;
82 this.vspInfoDao = vspInfoDao;
83 this.deploymentFlavorDao = deploymentFlavorDao;
87 public ComputeEntity createCompute(ComputeEntity compute) {
88 MDC_DATA_DEBUG_MESSAGE
89 .debugEntryMessage(VSP_ID_COMPONENT_ID, compute.getVspId(), compute.getComponentId());
91 if (!vspInfoDao.isManual(compute.getVspId(), compute.getVersion())) {
92 ErrorCode onboardingMethodUpdateErrorCode = NotSupportedHeatOnboardMethodErrorBuilder
93 .getAddComputeNotSupportedHeatOnboardMethodErrorBuilder();
94 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
95 LoggerTragetServiceName.CREATE_COMPUTE, ErrorLevel.ERROR.name(),
96 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
97 onboardingMethodUpdateErrorCode.message());
98 throw new CoreException(onboardingMethodUpdateErrorCode);
100 validateUniqueName(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
101 compute.getComputeCompositionData().getName());
103 compute.setQuestionnaireData(
104 new JsonSchemaDataGenerator(getComputeQuestionnaireSchema(null)).generateData());
105 computeDao.create(compute);
106 createUniqueName(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
107 compute.getComputeCompositionData().getName());
110 MDC_DATA_DEBUG_MESSAGE
111 .debugExitMessage(VSP_ID_COMPONENT_ID, compute.getVspId(), compute.getComponentId());
118 public Collection<ListComputeResponse> listComputes(String vspId, Version version,
119 String componentId) {
120 MDC_DATA_DEBUG_MESSAGE.debugEntryMessage(VSP_ID_COMPONENT_ID, vspId, componentId);
121 Collection<ComputeEntity> computes =
122 computeDao.list(new ComputeEntity(vspId, version, componentId, null));
124 Collection<ListComputeResponse> computeResponse =
125 getListComputeResponse(vspId, version, computes);
126 MDC_DATA_DEBUG_MESSAGE.debugExitMessage(VSP_ID_COMPONENT_ID, vspId, componentId);
128 return computeResponse;
131 private Collection<ListComputeResponse> getListComputeResponse(String vspId, Version version,
132 Collection<ComputeEntity> computes) {
133 Set<String> vspComputes = getComputeAssociatedWithDepFlavors(vspId, version);
134 Collection<ListComputeResponse> computeResponse = new ArrayList<>();
135 for (ComputeEntity computeEntity : computes) {
136 ListComputeResponse response = new ListComputeResponse();
137 response.setComputeEntity(computeEntity);
138 if (vspComputes.contains(computeEntity.getId())) {
139 response.setAssociatedWithDeploymentFlavor(true);
141 response.setAssociatedWithDeploymentFlavor(false);
143 computeResponse.add(response);
145 return computeResponse;
148 private Set<String> getComputeAssociatedWithDepFlavors(String vspId, Version version) {
149 final Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
150 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
151 Set<String> vspComputes = new HashSet<>();
152 for (DeploymentFlavorEntity entity : deploymentFlavorEntities) {
153 final List<ComponentComputeAssociation> componentComputeAssociations =
154 entity.getDeploymentFlavorCompositionData().getComponentComputeAssociations();
155 if (componentComputeAssociations != null && !componentComputeAssociations.isEmpty()) {
156 for (ComponentComputeAssociation association : componentComputeAssociations) {
157 vspComputes.add(association.getComputeFlavorId());
165 public CompositionEntityResponse<ComputeData> getCompute(String vspId, Version version,
167 String computeFlavorId) {
168 MDC_DATA_DEBUG_MESSAGE.debugEntryMessage(VSP_ID_COMPONENT_ID_COMPUTE_ID, vspId,
169 componentId, computeFlavorId);
171 ComputeEntity computeEntity = getValidatedCompute(vspId, version, componentId, computeFlavorId);
172 ComputeData compute = computeEntity.getComputeCompositionData();
174 ComputeCompositionSchemaInput schemaInput = new ComputeCompositionSchemaInput();
175 schemaInput.setManual(vspInfoDao.isManual(vspId, version));
176 schemaInput.setCompute(compute);
178 CompositionEntityResponse<ComputeData> response = new CompositionEntityResponse<>();
179 response.setId(computeFlavorId);
180 response.setData(compute);
181 response.setSchema(getComputeCompositionSchema(schemaInput));
183 MDC_DATA_DEBUG_MESSAGE.debugExitMessage(VSP_ID_COMPONENT_ID_COMPUTE_ID, vspId,
184 componentId, computeFlavorId);
189 private ComputeEntity getValidatedCompute(String vspId, Version version, String componentId,
190 String computeFlavorId) {
191 ComputeEntity retrieved = computeDao.get(new ComputeEntity(vspId, version, componentId,
194 .validateEntityExistence(retrieved, new ComputeEntity(vspId, version, componentId,
195 computeFlavorId), VspDetails.ENTITY_TYPE);
200 public QuestionnaireResponse getComputeQuestionnaire(String vspId, Version version, String
201 componentId, String computeId) {
202 MDC_DATA_DEBUG_MESSAGE.debugEntryMessage("VSP id, componentId", vspId, componentId, computeId);
204 QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
205 ComputeEntity computeQuestionnaire =
206 computeDao.getQuestionnaireData(vspId, version, componentId, computeId);
208 .validateEntityExistence(computeQuestionnaire,
209 new ComputeEntity(vspId, version, componentId, computeId), VspDetails.ENTITY_TYPE);
210 questionnaireResponse.setData(computeQuestionnaire.getQuestionnaireData());
211 questionnaireResponse.setSchema(getComputeQuestionnaireSchema(null));
213 MDC_DATA_DEBUG_MESSAGE.debugExitMessage(VSP_ID_COMPONENT_ID, vspId, componentId, computeId);
215 return questionnaireResponse;
220 public void updateComputeQuestionnaire(String vspId, Version version, String componentId,
221 String computeId, String questionnaireData) {
222 MDC_DATA_DEBUG_MESSAGE
223 .debugEntryMessage(VSP_ID_COMPONENT_ID_COMPUTE_ID, vspId, componentId, computeId);
225 ComputeEntity retrieved = computeDao.get(new ComputeEntity(vspId, version, componentId,
227 VersioningUtil.validateEntityExistence(retrieved, new ComputeEntity(vspId, version,
228 componentId, computeId), VspDetails.ENTITY_TYPE);
230 computeDao.updateQuestionnaireData(vspId, version, componentId, computeId, questionnaireData);
232 MDC_DATA_DEBUG_MESSAGE
233 .debugExitMessage(VSP_ID_COMPONENT_ID_COMPUTE_ID, vspId, componentId, computeId);
237 public CompositionEntityValidationData updateCompute(ComputeEntity compute) {
238 MDC_DATA_DEBUG_MESSAGE
239 .debugEntryMessage(VSP_ID_COMPONENT_ID, compute.getVspId(), compute.getComponentId(),
242 ComputeEntity retrieved =
243 getComputeEntity(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
246 boolean manual = vspInfoDao.isManual(compute.getVspId(), compute.getVersion());
248 validateHeatVspComputeUpdate("Name",
249 compute.getComputeCompositionData().getName(),
250 retrieved.getComputeCompositionData().getName());
253 ComputeCompositionSchemaInput schemaInput = new ComputeCompositionSchemaInput();
254 schemaInput.setCompute(compute.getComputeCompositionData());
256 CompositionEntityValidationData validationData = compositionEntityDataManager
257 .validateEntity(compute, SchemaTemplateContext.composition, schemaInput);
258 if (CollectionUtils.isEmpty(validationData.getErrors())) {
259 updateUniqueName(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
260 retrieved.getComputeCompositionData().getName(),
261 compute.getComputeCompositionData().getName());
262 computeDao.update(compute);
265 MDC_DATA_DEBUG_MESSAGE
266 .debugExitMessage(VSP_ID_COMPONENT_ID, compute.getVspId(), compute.getComponentId(),
269 return validationData;
272 private void validateHeatVspComputeUpdate(String name, String value, String retrivedValue) {
274 if (value != null && !value.equals(retrivedValue)) {
276 final ErrorCode updateHeatComputeErrorBuilder =
277 DuplicateComputeInComponentErrorBuilder.getComputeHeatReadOnlyErrorBuilder(name);
279 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
280 LoggerTragetServiceName.UPDATE_COMPUTE, ErrorLevel.ERROR.name(),
281 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
282 updateHeatComputeErrorBuilder.message());
283 throw new CoreException(updateHeatComputeErrorBuilder);
287 private ComputeEntity getComputeEntity(String vspId, Version version, String componentId,
289 ComputeEntity computeEntity =
290 computeDao.get(new ComputeEntity(vspId, version, componentId, computeId));
292 .validateEntityExistence(computeEntity, new ComputeEntity(vspId, version, componentId,
293 computeId), VspDetails.ENTITY_TYPE);
294 return computeEntity;
298 public void deleteCompute(String vspId, Version version, String componentId,
299 String computeFlavorId) {
300 final String vspCompositionEditNotAllowedMsg =
301 "Composition entities may not be created / deleted for Vendor Software Product "
302 + "whose entities were uploaded";
303 MDC_DATA_DEBUG_MESSAGE.debugEntryMessage(VSP_ID_COMPONENT_ID_COMPUTE_ID, vspId,
304 componentId, computeFlavorId);
306 if (!vspInfoDao.isManual(vspId, version)) {
307 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
308 LoggerTragetServiceName.DELETE_COMPUTE, ErrorLevel.ERROR.name(),
309 LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), "Can't delete compute");
310 throw new CoreException(
311 new ErrorCode.ErrorCodeBuilder().withCategory(ErrorCategory.APPLICATION)
312 .withId(VendorSoftwareProductErrorCodes.VSP_COMPOSITION_EDIT_NOT_ALLOWED)
313 .withMessage(vspCompositionEditNotAllowedMsg).build());
315 ComputeEntity retrieved = getValidatedCompute(vspId, version, componentId, computeFlavorId);
316 if (retrieved != null) {
317 deleteComputeFromDeploymentFlavors(vspId, version, computeFlavorId);
318 computeDao.delete(new ComputeEntity(vspId, version, componentId, computeFlavorId));
319 deleteUniqueValue(retrieved.getVspId(), retrieved.getVersion(), retrieved.getComponentId(),
320 retrieved.getComputeCompositionData().getName());
323 MDC_DATA_DEBUG_MESSAGE.debugExitMessage(VSP_ID_COMPONENT_ID_COMPUTE_ID, vspId,
324 componentId, computeFlavorId);
327 private void deleteComputeFromDeploymentFlavors(String vspId, Version version,
328 String computeFlavorId) {
329 Collection<DeploymentFlavorEntity> listDF =
330 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
331 for (DeploymentFlavorEntity df : listDF) {
332 DeploymentFlavorEntity deploymentFlavorEntity = removeComputeFromDF(df, computeFlavorId);
333 if (deploymentFlavorEntity != null) {
334 deploymentFlavorDao.update(deploymentFlavorEntity);
339 private DeploymentFlavorEntity removeComputeFromDF(DeploymentFlavorEntity df,
340 String computeFlavorId) {
341 DeploymentFlavor flavor = df.getDeploymentFlavorCompositionData();
342 List<ComponentComputeAssociation> associations = flavor.getComponentComputeAssociations();
343 if (associations != null) {
344 List<ComponentComputeAssociation> updatedAssociations = new ArrayList<>();
345 for (ComponentComputeAssociation ca : associations) {
346 if (ca.getComputeFlavorId() != null && ca.getComputeFlavorId().equals(computeFlavorId)) {
347 ComponentComputeAssociation updateCaremoveCompute = new ComponentComputeAssociation();
348 updateCaremoveCompute.setComponentId(ca.getComponentId());
349 updatedAssociations.add(updateCaremoveCompute);
351 updatedAssociations.add(ca);
354 flavor.setComponentComputeAssociations(updatedAssociations);
355 df.setDeploymentFlavorCompositionData(flavor);
361 protected String getComputeCompositionSchema(SchemaTemplateInput schemaInput) {
362 MDC_DATA_DEBUG_MESSAGE.debugEntryMessage(null);
363 MDC_DATA_DEBUG_MESSAGE.debugExitMessage(null);
364 return SchemaGenerator
365 .generate(SchemaTemplateContext.composition, CompositionEntityType.compute, schemaInput);
368 protected String getComputeQuestionnaireSchema(SchemaTemplateInput schemaInput) {
369 MDC_DATA_DEBUG_MESSAGE.debugEntryMessage(null);
370 MDC_DATA_DEBUG_MESSAGE.debugExitMessage(null);
371 return SchemaGenerator
372 .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.compute, schemaInput);
375 protected void validateUniqueName(String vspId, Version version, String componentId,
377 UniqueValueUtil.validateUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME,
378 vspId, version.getId(), componentId, name);
381 protected void createUniqueName(String vspId, Version version, String componentId, String name) {
383 .createUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, vspId,
384 version.getId(), componentId, name);
387 protected void updateUniqueName(String vspId, Version version, String componentId,
388 String oldName, String newName) {
390 .updateUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, oldName,
391 newName, vspId, version.getId(), componentId);
394 protected void deleteUniqueValue(String vspId, Version version, String componentId, String name) {
395 if (componentId == null) {
397 .deleteUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, vspId,
398 version.getId(), name);
401 .deleteUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, vspId,
402 version.getId(), componentId, name);