2 * Copyright © 2018 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.services;
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.HashMap;
22 import java.util.List;
24 import java.util.Objects;
25 import java.util.Optional;
27 import org.apache.commons.collections4.CollectionUtils;
28 import org.apache.commons.lang.StringUtils;
29 import org.openecomp.core.utilities.json.JsonUtil;
30 import org.openecomp.sdc.generator.datatypes.tosca.ComputeFlavor;
31 import org.openecomp.sdc.generator.datatypes.tosca.DeploymentFlavorModel;
32 import org.openecomp.sdc.generator.datatypes.tosca.LicenseFlavor;
33 import org.openecomp.sdc.generator.datatypes.tosca.MultiFlavorVfcImage;
34 import org.openecomp.sdc.generator.datatypes.tosca.VendorInfo;
35 import org.openecomp.sdc.logging.api.Logger;
36 import org.openecomp.sdc.logging.api.LoggerFactory;
37 import org.openecomp.sdc.vendorlicense.dao.types.FeatureGroupEntity;
38 import org.openecomp.sdc.vendorlicense.dao.types.FeatureGroupModel;
39 import org.openecomp.sdc.vendorlicense.facade.VendorLicenseFacade;
40 import org.openecomp.sdc.vendorlicense.facade.VendorLicenseFacadeFactory;
41 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
42 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDaoFactory;
43 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
44 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDaoFactory;
45 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDao;
46 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDaoFactory;
47 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDao;
48 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDaoFactory;
49 import org.openecomp.sdc.vendorsoftwareproduct.dao.NicDao;
50 import org.openecomp.sdc.vendorsoftwareproduct.dao.NicDaoFactory;
51 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
52 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDaoFactory;
53 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
54 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
55 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.DeploymentFlavorEntity;
56 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ImageEntity;
57 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.NicEntity;
58 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
59 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentComputeAssociation;
60 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentData;
61 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.DeploymentFlavor;
62 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Image;
63 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Nic;
64 import org.openecomp.sdc.vendorsoftwareproduct.types.questionnaire.component.compute.Compute;
65 import org.openecomp.sdc.vendorsoftwareproduct.types.questionnaire.component.image.ImageDetails;
66 import org.openecomp.sdc.versioning.dao.types.Version;
69 public class ManualVspDataCollectionService {
71 private static final VendorSoftwareProductInfoDao vendorSoftwareProductInfoDao =
72 VendorSoftwareProductInfoDaoFactory.getInstance().createInterface();
73 private static final DeploymentFlavorDao deploymentFlavorDao =
74 DeploymentFlavorDaoFactory.getInstance().createInterface();
75 private static final ComputeDao computeDao =
76 ComputeDaoFactory.getInstance().createInterface();
77 private static final ImageDao imageDao =
78 ImageDaoFactory.getInstance().createInterface();
79 private static final ComponentDao componentDao =
80 ComponentDaoFactory.getInstance().createInterface();
82 private static final NicDao nicDao =
83 NicDaoFactory.getInstance().createInterface();
84 private static final VendorLicenseFacade vendorLicenseFacade =
85 VendorLicenseFacadeFactory.getInstance().createInterface();
87 private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
90 * Gets vendor name for the vsp.
92 * @param vspId the vsp id
93 * @param version the version
94 * @return the release vendor name
96 public Optional<String> getReleaseVendor(String vspId, Version version) {
97 String vendorName = null;
98 VspDetails vspDetails = vendorSoftwareProductInfoDao.get(new VspDetails(vspId, version));
99 if (Objects.nonNull(vspDetails)) {
100 vendorName = vspDetails.getVendorName();
102 return Optional.ofNullable(vendorName);
106 * Gets the deployment flavor data for manually onboarded VSPs.
108 * @param vspId the vsp id
109 * @param version the version
110 * @return the allowed flavors
112 public Map<String, DeploymentFlavorModel> getAllowedFlavors(String vspId, Version version) {
113 Map<String, DeploymentFlavorModel> allowedFlavors = new HashMap<>();
114 Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
115 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
116 if (CollectionUtils.isNotEmpty(deploymentFlavorEntities)) {
117 for (DeploymentFlavorEntity deploymentFlavorEntity : deploymentFlavorEntities) {
118 DeploymentFlavor deploymentFlavorCompositionData =
119 deploymentFlavorEntity.getDeploymentFlavorCompositionData();
121 VspDetails vspDetails = vendorSoftwareProductInfoDao.get(new VspDetails(vspId, version));
124 if (Objects.nonNull(vspDetails)) {
125 vspVlmId = vspDetails.getVendorId();
126 vlmVersion = vspDetails.getVlmVersion();
127 if (StringUtils.isNotEmpty(vspVlmId)) {
128 DeploymentFlavorModel deploymentFlavorModel = new DeploymentFlavorModel();
129 String featureGroupId = deploymentFlavorCompositionData.getFeatureGroupId();
130 if (Objects.isNull(featureGroupId)) {
131 //No feature group associated with deployment flavor. So excluding this deployment
132 // flavor for Tosca model
135 //Gather and set License flavor info
136 LicenseFlavor licenseFlavor = getLicenseFlavor(featureGroupId);
137 deploymentFlavorModel.setLicense_flavor(licenseFlavor);
139 Optional<String> partNumber = getPartNumber(vspVlmId, vlmVersion, featureGroupId);
140 partNumber.ifPresent(deploymentFlavorModel::setSp_part_number);
141 //Gather and set Vendor Info
142 String vendorModel = deploymentFlavorCompositionData.getModel();
143 Optional<VendorInfo> vendorInfo = getVendorInfo(vspVlmId, vendorModel, vlmVersion,
145 vendorInfo.ifPresent(deploymentFlavorModel::setVendor_info);
146 //Gather and set Compute info
147 List<ComponentComputeAssociation> componentComputeAssociations =
148 deploymentFlavorCompositionData.getComponentComputeAssociations();
149 if (CollectionUtils.isNotEmpty(componentComputeAssociations)) {
150 for (ComponentComputeAssociation componentComputeAssociation :
151 componentComputeAssociations) {
152 String componentId = componentComputeAssociation.getComponentId();
153 String computeFlavorId = componentComputeAssociation.getComputeFlavorId();
154 Optional<ComputeFlavor> computeFlavor =
155 getComputeFlavor(vspId, version, componentId, computeFlavorId);
156 computeFlavor.ifPresent(deploymentFlavorModel::setCompute_flavor);
159 partNumber.ifPresent(spPartNumber -> allowedFlavors.put(spPartNumber,
160 deploymentFlavorModel));
165 return allowedFlavors;
169 * Gets the component image data for manually onboarded VSPs.
171 * @param vspId the vsp id
172 * @param version the version
173 * @return the vsp component images
175 public Map<String, List<MultiFlavorVfcImage>> getVspComponentImages(String vspId,
177 Map<String, List<MultiFlavorVfcImage>> vspComponentImages = new HashMap<>();
178 Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
179 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
180 for (DeploymentFlavorEntity deploymentFlavorEntity : deploymentFlavorEntities) {
181 DeploymentFlavor deploymentFlavorCompositionData =
182 deploymentFlavorEntity.getDeploymentFlavorCompositionData();
184 List<ComponentComputeAssociation> componentComputeAssociations =
185 deploymentFlavorCompositionData.getComponentComputeAssociations();
186 if (CollectionUtils.isNotEmpty(componentComputeAssociations)) {
187 for (ComponentComputeAssociation componentComputeAssociation :
188 componentComputeAssociations) {
189 String componentId = componentComputeAssociation.getComponentId();
190 List<MultiFlavorVfcImage> componentImages =
191 getComponentImages(vspId, version, componentId);
192 if (CollectionUtils.isNotEmpty(componentImages)) {
193 vspComponentImages.put(componentId, componentImages);
198 return vspComponentImages;
202 * Gets the component data for manually onboarded VSPs.
204 * @param vspId the vsp id
205 * @param version the version
206 * @return the vsp components
208 public Map<String, String> getVspComponents(String vspId, Version version) {
209 Map<String, String> componentIdNameMap = new HashMap<>();
210 Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
211 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
212 for (DeploymentFlavorEntity deploymentFlavorEntity : deploymentFlavorEntities) {
213 DeploymentFlavor deploymentFlavorCompositionData =
214 deploymentFlavorEntity.getDeploymentFlavorCompositionData();
216 List<ComponentComputeAssociation> componentComputeAssociations =
217 deploymentFlavorCompositionData.getComponentComputeAssociations();
218 if (CollectionUtils.isNotEmpty(componentComputeAssociations)) {
219 for (ComponentComputeAssociation componentComputeAssociation :
220 componentComputeAssociations) {
221 String componentId = componentComputeAssociation.getComponentId();
222 Optional<String> componentName = getComponentName(vspId, version, componentId);
223 componentName.ifPresent(name -> componentIdNameMap.put(componentId, name));
227 return componentIdNameMap;
231 * Gets the NIC data for manually onboarded VSPs.
233 * @param vspId the vsp id
234 * @param version the version
235 * @return the vsp component nics
237 public Map<String, List<Nic>> getVspComponentNics(String vspId, Version version) {
238 Map<String, List<Nic>> vspComponentNics = new HashMap<>();
239 Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
240 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
241 if (CollectionUtils.isNotEmpty(deploymentFlavorEntities)) {
242 for (DeploymentFlavorEntity deploymentFlavorEntity : deploymentFlavorEntities) {
243 DeploymentFlavor deploymentFlavorCompositionData =
244 deploymentFlavorEntity.getDeploymentFlavorCompositionData();
245 if (Objects.nonNull(deploymentFlavorCompositionData)) {
246 List<ComponentComputeAssociation> componentComputeAssociations =
247 deploymentFlavorCompositionData.getComponentComputeAssociations();
248 if (CollectionUtils.isNotEmpty(componentComputeAssociations)) {
249 for (ComponentComputeAssociation componentComputeAssociation :
250 componentComputeAssociations) {
251 String componentId = componentComputeAssociation.getComponentId();
252 List<Nic> componentNics = getComponentNics(vspId, version, componentId);
253 if (CollectionUtils.isNotEmpty(componentNics)) {
254 vspComponentNics.put(componentId, componentNics);
261 return vspComponentNics;
264 private List<Nic> getComponentNics(String vspId, Version version, String componentId) {
265 List<Nic> componentNics = new ArrayList<>();
266 Collection<NicEntity> nics = nicDao.list(new NicEntity(vspId, version, componentId, null));
267 if (Objects.nonNull(nics)) {
268 for (NicEntity nic : nics) {
269 String nicId = nic.getId();
270 NicEntity nicEntity = nicDao.get(new NicEntity(vspId, version, componentId, nicId));
271 if (Objects.nonNull(nicEntity)
272 && Objects.nonNull(nicEntity.getCompositionData())) {
273 componentNics.add(nicEntity.getNicCompositionData());
277 return componentNics;
280 private LicenseFlavor getLicenseFlavor(String featureGroupId) {
281 LicenseFlavor licenseFlavor = new LicenseFlavor();
282 licenseFlavor.setFeature_group_uuid(featureGroupId);
283 return licenseFlavor;
286 private Optional<String> getPartNumber(String vlmId, Version version,
287 String featureGroupId) {
288 FeatureGroupModel featureGroup = getFeatureGroup(vlmId, version, featureGroupId);
289 if (Objects.nonNull(featureGroup)) {
290 return Optional.ofNullable(featureGroup.getFeatureGroup().getPartNumber());
292 return Optional.empty();
295 private Optional<VendorInfo> getVendorInfo(String vlmId, String vendorModel, Version version,
296 String featureGroupId) {
297 VendorInfo vendorInfo = null;
298 FeatureGroupModel featureGroup = getFeatureGroup(vlmId, version, featureGroupId);
299 if (Objects.nonNull(featureGroup)) {
300 //Process Feature group to get Manufacturer ref no.
301 String manufacturerReferenceNumber = featureGroup.getEntityManufacturerReferenceNumber();
302 vendorInfo = new VendorInfo();
303 vendorInfo.setVendor_model(vendorModel);
304 if (Objects.nonNull(manufacturerReferenceNumber)) {
305 vendorInfo.setManufacturer_reference_number(manufacturerReferenceNumber);
308 return Optional.ofNullable(vendorInfo);
311 private Optional<ComputeFlavor> getComputeFlavor(String vspId, Version version,
312 String componentId, String computeFlavorId) {
313 ComputeFlavor computeFlavor = null;
314 ComputeEntity computeQuestionnaire;
316 computeQuestionnaire = computeDao.getQuestionnaireData(vspId, version, componentId,
318 } catch (Exception ex) {
319 log.warn("Failed to get QuestionnaireData from computeDao," +
320 " initializing computeQuestionnaire to null", ex);
321 computeQuestionnaire = null;
323 if (Objects.nonNull(computeQuestionnaire)) {
324 String computeQuestionnaireData = computeQuestionnaire.getQuestionnaireData();
325 if (Objects.nonNull(computeQuestionnaireData)) {
328 compute = JsonUtil.json2Object(computeQuestionnaireData, Compute.class);
329 } catch (Exception ex) {
330 log.warn("Failed to convert json value to compute object," +
331 "initializing compute to null", ex);
334 if (compute != null && Objects.nonNull(compute.getVmSizing())) {
335 computeFlavor = new ComputeFlavor();
336 if (Objects.nonNull(compute.getVmSizing().getNumOfCPUs())) {
337 computeFlavor.setNum_cpus(compute.getVmSizing().getNumOfCPUs());
339 if (Objects.nonNull(compute.getVmSizing().getFileSystemSizeGB())) {
340 computeFlavor.setDisk_size(compute.getVmSizing().getFileSystemSizeGB() + " GB");
342 if (Objects.nonNull(compute.getVmSizing().getMemoryRAM())) {
343 computeFlavor.setMem_size(compute.getVmSizing().getMemoryRAM());
348 return Optional.ofNullable(computeFlavor);
351 private FeatureGroupModel getFeatureGroup(String vlmId, Version version, String featureGroupId) {
352 FeatureGroupEntity fgInput = new FeatureGroupEntity();
353 fgInput.setVendorLicenseModelId(vlmId);
354 fgInput.setVersion(version);
355 fgInput.setId(featureGroupId);
356 return vendorLicenseFacade.getFeatureGroupModel(fgInput);
359 private Optional<String> getComponentName(String vspId, Version version, String componentId) {
361 ComponentEntity componentEntity =
362 componentDao.get(new ComponentEntity(vspId, version, componentId));
363 if (Objects.nonNull(componentEntity)
364 && Objects.nonNull(componentEntity.getComponentCompositionData())) {
365 ComponentData componentCompositionData = componentEntity.getComponentCompositionData();
366 return Optional.ofNullable(componentCompositionData.getDisplayName());
368 return Optional.empty();
371 private List<MultiFlavorVfcImage> getComponentImages(String vspId, Version version,
372 String componentId) {
373 List<MultiFlavorVfcImage> multiFlavorVfcImages = new ArrayList<>();
374 MultiFlavorVfcImage multiFlavorVfcImage;
375 Collection<ImageEntity> componentImages =
376 imageDao.list(new ImageEntity(vspId, version, componentId, null));
377 if (Objects.nonNull(componentImages)) {
378 for (ImageEntity componentImage : componentImages) {
379 ImageEntity imageEntity = imageDao.get(componentImage);
380 ImageEntity imageQuestionnaireDataEntity = imageDao.getQuestionnaireData(vspId, version,
381 componentId, componentImage.getId());
382 Image imageCompositionData = imageEntity.getImageCompositionData();
383 if (Objects.nonNull(imageEntity)
384 && Objects.nonNull(imageQuestionnaireDataEntity)
385 && Objects.nonNull(imageCompositionData)) {
386 ImageDetails imageDetails;
388 imageDetails = JsonUtil.json2Object(imageQuestionnaireDataEntity
389 .getQuestionnaireData(), ImageDetails.class);
390 } catch (Exception ex) {
391 log.warn("Failed to convert json value to ImageDetails object," +
392 "initializing imageDetails to null", ex);
395 if (Objects.nonNull(imageDetails)
396 && Objects.nonNull(imageDetails.getVersion())) {
397 //Image version is used as a key for the image block
398 //So excluding the population if questionnaire data is absent or invalid
399 multiFlavorVfcImage = new MultiFlavorVfcImage();
400 multiFlavorVfcImage.setSoftware_version(imageDetails.getVersion());
401 if (Objects.nonNull(imageCompositionData.getFileName())) {
402 multiFlavorVfcImage.setFile_name(imageCompositionData.getFileName());
404 if (Objects.nonNull(imageDetails.getMd5())) {
405 multiFlavorVfcImage.setFile_hash(imageDetails.getMd5());
407 multiFlavorVfcImage.setFile_hash_type("md5");
408 multiFlavorVfcImages.add(multiFlavorVfcImage);
413 return multiFlavorVfcImages;