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.NotSupportedHeatOnboardMethodErrorBuilder;
36 import org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductErrorCodes;
37 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
38 import org.openecomp.sdc.vendorsoftwareproduct.types.CompositionEntityResponse;
39 import org.openecomp.sdc.vendorsoftwareproduct.types.ListComputeResponse;
40 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
41 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.*;
42 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.ComputeCompositionSchemaInput;
43 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
44 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateInput;
45 import org.openecomp.sdc.versioning.VersioningUtil;
46 import org.openecomp.sdc.versioning.dao.types.Version;
50 public class ComputeManagerImpl implements ComputeManager {
51 private final ComputeDao computeDao;
52 private final CompositionEntityDataManager compositionEntityDataManager;
53 private final VendorSoftwareProductInfoDao vspInfoDao;
54 private final DeploymentFlavorDao deploymentFlavorDao;
56 public ComputeManagerImpl(VendorSoftwareProductInfoDao vspInfoDao,
57 ComputeDao computeDao,
58 CompositionEntityDataManager compositionEntityDataManager,
59 DeploymentFlavorDao deploymentFlavorDao) {
60 this.computeDao = computeDao;
61 this.compositionEntityDataManager = compositionEntityDataManager;
62 this.vspInfoDao = vspInfoDao;
63 this.deploymentFlavorDao = deploymentFlavorDao;
67 public ComputeEntity createCompute(ComputeEntity compute) {
68 if (!vspInfoDao.isManual(compute.getVspId(), compute.getVersion())) {
69 ErrorCode onboardingMethodUpdateErrorCode = NotSupportedHeatOnboardMethodErrorBuilder
70 .getAddComputeNotSupportedHeatOnboardMethodErrorBuilder();
71 throw new CoreException(onboardingMethodUpdateErrorCode);
73 validateUniqueName(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
74 compute.getComputeCompositionData().getName());
76 compute.setQuestionnaireData(
77 new JsonSchemaDataGenerator(getComputeQuestionnaireSchema(null)).generateData());
78 computeDao.create(compute);
79 createUniqueName(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
80 compute.getComputeCompositionData().getName());
87 public Collection<ListComputeResponse> listComputes(String vspId, Version version,
89 Collection<ComputeEntity> computes =
90 computeDao.list(new ComputeEntity(vspId, version, componentId, null));
91 return getListComputeResponse(vspId, version, computes);
94 private Collection<ListComputeResponse> getListComputeResponse(String vspId, Version version,
95 Collection<ComputeEntity> computes) {
96 Set<String> vspComputes = getComputeAssociatedWithDepFlavors(vspId, version);
97 Collection<ListComputeResponse> computeResponse = new ArrayList<>();
98 for (ComputeEntity computeEntity : computes) {
99 ListComputeResponse response = new ListComputeResponse();
100 response.setComputeEntity(computeEntity);
101 if (vspComputes.contains(computeEntity.getId())) {
102 response.setAssociatedWithDeploymentFlavor(true);
104 response.setAssociatedWithDeploymentFlavor(false);
106 computeResponse.add(response);
108 return computeResponse;
111 private Set<String> getComputeAssociatedWithDepFlavors(String vspId, Version version) {
112 final Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
113 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
114 Set<String> vspComputes = new HashSet<>();
115 for (DeploymentFlavorEntity entity : deploymentFlavorEntities) {
116 final List<ComponentComputeAssociation> componentComputeAssociations =
117 entity.getDeploymentFlavorCompositionData().getComponentComputeAssociations();
118 if (componentComputeAssociations != null && !componentComputeAssociations.isEmpty()) {
119 for (ComponentComputeAssociation association : componentComputeAssociations) {
120 vspComputes.add(association.getComputeFlavorId());
128 public CompositionEntityResponse<ComputeData> getCompute(String vspId, Version version,
130 String computeFlavorId) {
131 ComputeEntity computeEntity = getValidatedCompute(vspId, version, componentId, computeFlavorId);
132 ComputeData compute = computeEntity.getComputeCompositionData();
134 ComputeCompositionSchemaInput schemaInput = new ComputeCompositionSchemaInput();
135 schemaInput.setManual(vspInfoDao.isManual(vspId, version));
136 schemaInput.setCompute(compute);
138 CompositionEntityResponse<ComputeData> response = new CompositionEntityResponse<>();
139 response.setId(computeFlavorId);
140 response.setData(compute);
141 response.setSchema(getComputeCompositionSchema(schemaInput));
145 private ComputeEntity getValidatedCompute(String vspId, Version version, String componentId,
146 String computeFlavorId) {
147 ComputeEntity retrieved = computeDao.get(new ComputeEntity(vspId, version, componentId,
150 .validateEntityExistence(retrieved, new ComputeEntity(vspId, version, componentId,
151 computeFlavorId), VspDetails.ENTITY_TYPE);
156 public QuestionnaireResponse getComputeQuestionnaire(String vspId, Version version, String
157 componentId, String computeId) {
158 QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
159 ComputeEntity computeQuestionnaire =
160 computeDao.getQuestionnaireData(vspId, version, componentId, computeId);
162 .validateEntityExistence(computeQuestionnaire,
163 new ComputeEntity(vspId, version, componentId, computeId), VspDetails.ENTITY_TYPE);
164 questionnaireResponse.setData(computeQuestionnaire.getQuestionnaireData());
165 questionnaireResponse.setSchema(getComputeQuestionnaireSchema(null));
166 return questionnaireResponse;
171 public void updateComputeQuestionnaire(String vspId, Version version, String componentId,
172 String computeId, String questionnaireData) {
173 ComputeEntity retrieved = computeDao.get(new ComputeEntity(vspId, version, componentId,
175 VersioningUtil.validateEntityExistence(retrieved, new ComputeEntity(vspId, version,
176 componentId, computeId), VspDetails.ENTITY_TYPE);
178 computeDao.updateQuestionnaireData(vspId, version, componentId, computeId, questionnaireData);
182 public CompositionEntityValidationData updateCompute(ComputeEntity compute) {
183 ComputeEntity retrieved =
184 getComputeEntity(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
187 boolean manual = vspInfoDao.isManual(compute.getVspId(), compute.getVersion());
189 ComputeCompositionSchemaInput schemaInput = new ComputeCompositionSchemaInput();
190 schemaInput.setManual(manual);
191 schemaInput.setCompute(retrieved.getComputeCompositionData());
193 CompositionEntityValidationData validationData = compositionEntityDataManager
194 .validateEntity(compute, SchemaTemplateContext.composition, schemaInput);
195 if (CollectionUtils.isEmpty(validationData.getErrors())) {
196 updateUniqueName(compute.getVspId(), compute.getVersion(), compute.getComponentId(),
197 retrieved.getComputeCompositionData().getName(),
198 compute.getComputeCompositionData().getName());
199 computeDao.update(compute);
201 return validationData;
204 private ComputeEntity getComputeEntity(String vspId, Version version, String componentId,
206 ComputeEntity computeEntity =
207 computeDao.get(new ComputeEntity(vspId, version, componentId, computeId));
209 .validateEntityExistence(computeEntity, new ComputeEntity(vspId, version, componentId,
210 computeId), VspDetails.ENTITY_TYPE);
211 return computeEntity;
215 public void deleteCompute(String vspId, Version version, String componentId,
216 String computeFlavorId) {
217 final String vspCompositionEditNotAllowedMsg =
218 "Composition entities may not be created / deleted for Vendor Software Product "
219 + "whose entities were uploaded";
220 if (!vspInfoDao.isManual(vspId, version)) {
221 throw new CoreException(
222 new ErrorCode.ErrorCodeBuilder()
223 .withId(VendorSoftwareProductErrorCodes.VSP_COMPOSITION_EDIT_NOT_ALLOWED)
224 .withMessage(vspCompositionEditNotAllowedMsg).build());
226 ComputeEntity retrieved = getValidatedCompute(vspId, version, componentId, computeFlavorId);
227 if (retrieved != null) {
228 deleteComputeFromDeploymentFlavors(vspId, version, computeFlavorId);
229 computeDao.delete(new ComputeEntity(vspId, version, componentId, computeFlavorId));
230 deleteUniqueValue(retrieved.getVspId(), retrieved.getVersion(), retrieved.getComponentId(),
231 retrieved.getComputeCompositionData().getName());
235 private void deleteComputeFromDeploymentFlavors(String vspId, Version version,
236 String computeFlavorId) {
237 Collection<DeploymentFlavorEntity> listDF =
238 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
239 for (DeploymentFlavorEntity df : listDF) {
240 DeploymentFlavorEntity deploymentFlavorEntity = removeComputeFromDF(df, computeFlavorId);
241 if (deploymentFlavorEntity != null) {
242 deploymentFlavorDao.update(deploymentFlavorEntity);
247 private DeploymentFlavorEntity removeComputeFromDF(DeploymentFlavorEntity df,
248 String computeFlavorId) {
249 DeploymentFlavor flavor = df.getDeploymentFlavorCompositionData();
250 List<ComponentComputeAssociation> associations = flavor.getComponentComputeAssociations();
251 if (associations != null) {
252 List<ComponentComputeAssociation> updatedAssociations = new ArrayList<>();
253 for (ComponentComputeAssociation ca : associations) {
254 if (ca.getComputeFlavorId() != null && ca.getComputeFlavorId().equals(computeFlavorId)) {
255 ComponentComputeAssociation updateCaremoveCompute = new ComponentComputeAssociation();
256 updateCaremoveCompute.setComponentId(ca.getComponentId());
257 updatedAssociations.add(updateCaremoveCompute);
259 updatedAssociations.add(ca);
262 flavor.setComponentComputeAssociations(updatedAssociations);
263 df.setDeploymentFlavorCompositionData(flavor);
269 protected String getComputeCompositionSchema(SchemaTemplateInput schemaInput) {
270 return SchemaGenerator
271 .generate(SchemaTemplateContext.composition, CompositionEntityType.compute, schemaInput);
274 protected String getComputeQuestionnaireSchema(SchemaTemplateInput schemaInput) {
275 return SchemaGenerator
276 .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.compute, schemaInput);
279 protected void validateUniqueName(String vspId, Version version, String componentId,
281 UniqueValueUtil uniqueValueUtil =
282 new UniqueValueUtil(UniqueValueDaoFactory.getInstance().createInterface());
283 uniqueValueUtil.validateUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME,
284 vspId, version.getId(), componentId, name);
287 protected void createUniqueName(String vspId, Version version, String componentId, String name) {
288 UniqueValueUtil uniqueValueUtil =
289 new UniqueValueUtil(UniqueValueDaoFactory.getInstance().createInterface());
291 .createUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, vspId,
292 version.getId(), componentId, name);
295 protected void updateUniqueName(String vspId, Version version, String componentId,
296 String oldName, String newName) {
297 UniqueValueUtil uniqueValueUtil =
298 new UniqueValueUtil(UniqueValueDaoFactory.getInstance().createInterface());
300 .updateUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, oldName,
301 newName, vspId, version.getId(), componentId);
304 protected void deleteUniqueValue(String vspId, Version version, String componentId, String name) {
305 UniqueValueUtil uniqueValueUtil =
306 new UniqueValueUtil(UniqueValueDaoFactory.getInstance().createInterface());
307 if (componentId == null) {
309 .deleteUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, vspId,
310 version.getId(), name);
313 .deleteUniqueValue(VendorSoftwareProductConstants.UniqueValues.COMPUTE_NAME, vspId,
314 version.getId(), componentId, name);