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.dao.UniqueValueDaoFactory;
22 import org.openecomp.core.util.UniqueValueUtil;
23 import org.openecomp.core.utilities.json.JsonSchemaDataGenerator;
24 import org.openecomp.sdc.common.errors.CoreException;
25 import org.openecomp.sdc.common.errors.ErrorCode;
26 import org.openecomp.sdc.vendorsoftwareproduct.CompositionEntityDataManager;
27 import org.openecomp.sdc.vendorsoftwareproduct.ComputeManager;
28 import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductConstants;
29 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
30 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDao;
31 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
32 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
33 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.DeploymentFlavorEntity;
34 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
35 import org.openecomp.sdc.vendorsoftwareproduct.errors.DuplicateComputeInComponentErrorBuilder;
36 import org.openecomp.sdc.vendorsoftwareproduct.errors.NotSupportedHeatOnboardMethodErrorBuilder;
37 import org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductErrorCodes;
38 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
39 import org.openecomp.sdc.vendorsoftwareproduct.types.CompositionEntityResponse;
40 import org.openecomp.sdc.vendorsoftwareproduct.types.ListComputeResponse;
41 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
42 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentComputeAssociation;
43 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
44 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
45 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComputeData;
46 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.DeploymentFlavor;
47 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.ComputeCompositionSchemaInput;
48 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
49 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateInput;
50 import org.openecomp.sdc.versioning.VersioningUtil;
51 import org.openecomp.sdc.versioning.dao.types.Version;
53 import java.util.ArrayList;
54 import java.util.Collection;
55 import java.util.HashSet;
56 import java.util.List;
59 public class ComputeManagerImpl implements ComputeManager {
60 private final ComputeDao computeDao;
61 private final CompositionEntityDataManager compositionEntityDataManager;
62 private final VendorSoftwareProductInfoDao vspInfoDao;
63 private final DeploymentFlavorDao deploymentFlavorDao;
65 public ComputeManagerImpl(VendorSoftwareProductInfoDao vspInfoDao,
66 ComputeDao computeDao,
67 CompositionEntityDataManager compositionEntityDataManager,
68 DeploymentFlavorDao deploymentFlavorDao) {
69 this.computeDao = computeDao;
70 this.compositionEntityDataManager = compositionEntityDataManager;
71 this.vspInfoDao = vspInfoDao;
72 this.deploymentFlavorDao = deploymentFlavorDao;
76 public ComputeEntity createCompute(ComputeEntity compute) {
77 if (!vspInfoDao.isManual(compute.getVspId(), compute.getVersion())) {
78 ErrorCode onboardingMethodUpdateErrorCode = NotSupportedHeatOnboardMethodErrorBuilder
79 .getAddComputeNotSupportedHeatOnboardMethodErrorBuilder();
80 throw new CoreException(onboardingMethodUpdateErrorCode);
82 validateUniqueName(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
83 compute.getComputeCompositionData().getName());
85 compute.setQuestionnaireData(
86 new JsonSchemaDataGenerator(getComputeQuestionnaireSchema(null)).generateData());
87 computeDao.create(compute);
88 createUniqueName(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
89 compute.getComputeCompositionData().getName());
96 public Collection<ListComputeResponse> listComputes(String vspId, Version version,
98 Collection<ComputeEntity> computes =
99 computeDao.list(new ComputeEntity(vspId, version, componentId, null));
100 return getListComputeResponse(vspId, version, computes);
103 private Collection<ListComputeResponse> getListComputeResponse(String vspId, Version version,
104 Collection<ComputeEntity> computes) {
105 Set<String> vspComputes = getComputeAssociatedWithDepFlavors(vspId, version);
106 Collection<ListComputeResponse> computeResponse = new ArrayList<>();
107 for (ComputeEntity computeEntity : computes) {
108 ListComputeResponse response = new ListComputeResponse();
109 response.setComputeEntity(computeEntity);
110 if (vspComputes.contains(computeEntity.getId())) {
111 response.setAssociatedWithDeploymentFlavor(true);
113 response.setAssociatedWithDeploymentFlavor(false);
115 computeResponse.add(response);
117 return computeResponse;
120 private Set<String> getComputeAssociatedWithDepFlavors(String vspId, Version version) {
121 final Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
122 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
123 Set<String> vspComputes = new HashSet<>();
124 for (DeploymentFlavorEntity entity : deploymentFlavorEntities) {
125 final List<ComponentComputeAssociation> componentComputeAssociations =
126 entity.getDeploymentFlavorCompositionData().getComponentComputeAssociations();
127 if (componentComputeAssociations != null && !componentComputeAssociations.isEmpty()) {
128 for (ComponentComputeAssociation association : componentComputeAssociations) {
129 vspComputes.add(association.getComputeFlavorId());
137 public CompositionEntityResponse<ComputeData> getCompute(String vspId, Version version,
139 String computeFlavorId) {
140 ComputeEntity computeEntity = getValidatedCompute(vspId, version, componentId, computeFlavorId);
141 ComputeData compute = computeEntity.getComputeCompositionData();
143 ComputeCompositionSchemaInput schemaInput = new ComputeCompositionSchemaInput();
144 schemaInput.setManual(vspInfoDao.isManual(vspId, version));
145 schemaInput.setCompute(compute);
147 CompositionEntityResponse<ComputeData> response = new CompositionEntityResponse<>();
148 response.setId(computeFlavorId);
149 response.setData(compute);
150 response.setSchema(getComputeCompositionSchema(schemaInput));
154 private ComputeEntity getValidatedCompute(String vspId, Version version, String componentId,
155 String computeFlavorId) {
156 ComputeEntity retrieved = computeDao.get(new ComputeEntity(vspId, version, componentId,
159 .validateEntityExistence(retrieved, new ComputeEntity(vspId, version, componentId,
160 computeFlavorId), VspDetails.ENTITY_TYPE);
165 public QuestionnaireResponse getComputeQuestionnaire(String vspId, Version version, String
166 componentId, String computeId) {
167 QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
168 ComputeEntity computeQuestionnaire =
169 computeDao.getQuestionnaireData(vspId, version, componentId, computeId);
171 .validateEntityExistence(computeQuestionnaire,
172 new ComputeEntity(vspId, version, componentId, computeId), VspDetails.ENTITY_TYPE);
173 questionnaireResponse.setData(computeQuestionnaire.getQuestionnaireData());
174 questionnaireResponse.setSchema(getComputeQuestionnaireSchema(null));
175 return questionnaireResponse;
180 public void updateComputeQuestionnaire(String vspId, Version version, String componentId,
181 String computeId, String questionnaireData) {
182 ComputeEntity retrieved = computeDao.get(new ComputeEntity(vspId, version, componentId,
184 VersioningUtil.validateEntityExistence(retrieved, new ComputeEntity(vspId, version,
185 componentId, computeId), VspDetails.ENTITY_TYPE);
187 computeDao.updateQuestionnaireData(vspId, version, componentId, computeId, questionnaireData);
191 public CompositionEntityValidationData updateCompute(ComputeEntity compute) {
192 ComputeEntity retrieved =
193 getComputeEntity(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
196 boolean manual = vspInfoDao.isManual(compute.getVspId(), compute.getVersion());
198 validateHeatVspComputeUpdate("Name",
199 compute.getComputeCompositionData().getName(),
200 retrieved.getComputeCompositionData().getName());
203 ComputeCompositionSchemaInput schemaInput = new ComputeCompositionSchemaInput();
204 schemaInput.setCompute(compute.getComputeCompositionData());
206 CompositionEntityValidationData validationData = compositionEntityDataManager
207 .validateEntity(compute, SchemaTemplateContext.composition, schemaInput);
208 if (CollectionUtils.isEmpty(validationData.getErrors())) {
209 updateUniqueName(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
210 retrieved.getComputeCompositionData().getName(),
211 compute.getComputeCompositionData().getName());
212 computeDao.update(compute);
214 return validationData;
217 private void validateHeatVspComputeUpdate(String name, String value, String retrivedValue) {
219 if (value != null && !value.equals(retrivedValue)) {
221 final ErrorCode updateHeatComputeErrorBuilder =
222 DuplicateComputeInComponentErrorBuilder.getComputeHeatReadOnlyErrorBuilder(name);
223 throw new CoreException(updateHeatComputeErrorBuilder);
227 private ComputeEntity getComputeEntity(String vspId, Version version, String componentId,
229 ComputeEntity computeEntity =
230 computeDao.get(new ComputeEntity(vspId, version, componentId, computeId));
232 .validateEntityExistence(computeEntity, new ComputeEntity(vspId, version, componentId,
233 computeId), VspDetails.ENTITY_TYPE);
234 return computeEntity;
238 public void deleteCompute(String vspId, Version version, String componentId,
239 String computeFlavorId) {
240 final String vspCompositionEditNotAllowedMsg =
241 "Composition entities may not be created / deleted for Vendor Software Product "
242 + "whose entities were uploaded";
243 if (!vspInfoDao.isManual(vspId, version)) {
244 throw new CoreException(
245 new ErrorCode.ErrorCodeBuilder()
246 .withId(VendorSoftwareProductErrorCodes.VSP_COMPOSITION_EDIT_NOT_ALLOWED)
247 .withMessage(vspCompositionEditNotAllowedMsg).build());
249 ComputeEntity retrieved = getValidatedCompute(vspId, version, componentId, computeFlavorId);
250 if (retrieved != null) {
251 deleteComputeFromDeploymentFlavors(vspId, version, computeFlavorId);
252 computeDao.delete(new ComputeEntity(vspId, version, componentId, computeFlavorId));
253 deleteUniqueValue(retrieved.getVspId(), retrieved.getVersion(), retrieved.getComponentId(),
254 retrieved.getComputeCompositionData().getName());
258 private void deleteComputeFromDeploymentFlavors(String vspId, Version version,
259 String computeFlavorId) {
260 Collection<DeploymentFlavorEntity> listDF =
261 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
262 for (DeploymentFlavorEntity df : listDF) {
263 DeploymentFlavorEntity deploymentFlavorEntity = removeComputeFromDF(df, computeFlavorId);
264 if (deploymentFlavorEntity != null) {
265 deploymentFlavorDao.update(deploymentFlavorEntity);
270 private DeploymentFlavorEntity removeComputeFromDF(DeploymentFlavorEntity df,
271 String computeFlavorId) {
272 DeploymentFlavor flavor = df.getDeploymentFlavorCompositionData();
273 List<ComponentComputeAssociation> associations = flavor.getComponentComputeAssociations();
274 if (associations != null) {
275 List<ComponentComputeAssociation> updatedAssociations = new ArrayList<>();
276 for (ComponentComputeAssociation ca : associations) {
277 if (ca.getComputeFlavorId() != null && ca.getComputeFlavorId().equals(computeFlavorId)) {
278 ComponentComputeAssociation updateCaremoveCompute = new ComponentComputeAssociation();
279 updateCaremoveCompute.setComponentId(ca.getComponentId());
280 updatedAssociations.add(updateCaremoveCompute);
282 updatedAssociations.add(ca);
285 flavor.setComponentComputeAssociations(updatedAssociations);
286 df.setDeploymentFlavorCompositionData(flavor);
292 protected String getComputeCompositionSchema(SchemaTemplateInput schemaInput) {
293 return SchemaGenerator
294 .generate(SchemaTemplateContext.composition, CompositionEntityType.compute, schemaInput);
297 protected String getComputeQuestionnaireSchema(SchemaTemplateInput schemaInput) {
298 return SchemaGenerator
299 .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.compute, schemaInput);
302 protected void validateUniqueName(String vspId, Version version, String componentId,
304 UniqueValueUtil uniqueValueUtil =
305 new UniqueValueUtil(UniqueValueDaoFactory.getInstance().createInterface());
306 uniqueValueUtil.validateUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME,
307 vspId, version.getId(), componentId, name);
310 protected void createUniqueName(String vspId, Version version, String componentId, String name) {
311 UniqueValueUtil uniqueValueUtil =
312 new UniqueValueUtil(UniqueValueDaoFactory.getInstance().createInterface());
314 .createUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, vspId,
315 version.getId(), componentId, name);
318 protected void updateUniqueName(String vspId, Version version, String componentId,
319 String oldName, String newName) {
320 UniqueValueUtil uniqueValueUtil =
321 new UniqueValueUtil(UniqueValueDaoFactory.getInstance().createInterface());
323 .updateUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, oldName,
324 newName, vspId, version.getId(), componentId);
327 protected void deleteUniqueValue(String vspId, Version version, String componentId, String name) {
328 UniqueValueUtil uniqueValueUtil =
329 new UniqueValueUtil(UniqueValueDaoFactory.getInstance().createInterface());
330 if (componentId == null) {
332 .deleteUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, vspId,
333 version.getId(), name);
336 .deleteUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, vspId,
337 version.getId(), componentId, name);