1 package org.openecomp.sdc.vendorsoftwareproduct.services;
3 import org.apache.commons.collections4.CollectionUtils;
4 import org.apache.commons.lang.StringUtils;
5 import org.openecomp.core.utilities.json.JsonUtil;
6 import org.openecomp.sdc.datatypes.error.ErrorLevel;
7 import org.openecomp.sdc.generator.datatypes.tosca.ComputeFlavor;
8 import org.openecomp.sdc.generator.datatypes.tosca.DeploymentFlavorModel;
9 import org.openecomp.sdc.generator.datatypes.tosca.LicenseFlavor;
10 import org.openecomp.sdc.generator.datatypes.tosca.MultiFlavorVfcImage;
11 import org.openecomp.sdc.generator.datatypes.tosca.VendorInfo;
12 import org.openecomp.sdc.logging.api.Logger;
13 import org.openecomp.sdc.logging.api.LoggerFactory;
14 import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage;
15 import org.openecomp.sdc.logging.types.LoggerConstants;
16 import org.openecomp.sdc.logging.types.LoggerErrorCode;
17 import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
18 import org.openecomp.sdc.vendorlicense.dao.types.FeatureGroupEntity;
19 import org.openecomp.sdc.vendorlicense.dao.types.FeatureGroupModel;
20 import org.openecomp.sdc.vendorlicense.facade.VendorLicenseFacade;
21 import org.openecomp.sdc.vendorlicense.facade.VendorLicenseFacadeFactory;
22 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
23 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDaoFactory;
24 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
25 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDaoFactory;
26 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDao;
27 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDaoFactory;
28 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDao;
29 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDaoFactory;
30 import org.openecomp.sdc.vendorsoftwareproduct.dao.NicDao;
31 import org.openecomp.sdc.vendorsoftwareproduct.dao.NicDaoFactory;
32 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
33 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDaoFactory;
34 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
35 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
36 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.DeploymentFlavorEntity;
37 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ImageEntity;
38 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.NicEntity;
39 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
40 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentComputeAssociation;
41 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentData;
42 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.DeploymentFlavor;
43 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Image;
44 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Nic;
45 import org.openecomp.sdc.vendorsoftwareproduct.types.questionnaire.component.compute.Compute;
46 import org.openecomp.sdc.vendorsoftwareproduct.types.questionnaire.component.image.ImageDetails;
47 import org.openecomp.sdc.versioning.dao.types.Version;
49 import java.util.ArrayList;
50 import java.util.Collection;
51 import java.util.HashMap;
52 import java.util.List;
54 import java.util.Objects;
55 import java.util.Optional;
58 public class ManualVspDataCollectionService {
60 private static final VendorSoftwareProductInfoDao vendorSoftwareProductInfoDao =
61 VendorSoftwareProductInfoDaoFactory.getInstance().createInterface();
62 private static final DeploymentFlavorDao deploymentFlavorDao =
63 DeploymentFlavorDaoFactory.getInstance().createInterface();
64 private static final ComputeDao computeDao =
65 ComputeDaoFactory.getInstance().createInterface();
66 private static final ImageDao imageDao =
67 ImageDaoFactory.getInstance().createInterface();
68 private static final ComponentDao componentDao =
69 ComponentDaoFactory.getInstance().createInterface();
71 private static final NicDao nicDao =
72 NicDaoFactory.getInstance().createInterface();
73 private static final VendorLicenseFacade vendorLicenseFacade =
74 VendorLicenseFacadeFactory.getInstance().createInterface();
76 private final Logger log = (Logger) LoggerFactory.getLogger(this.getClass().getName());
79 * Gets vendor name for the vsp.
81 * @param vspId the vsp id
82 * @param version the version
83 * @return the release vendor name
85 public Optional<String> getReleaseVendor(String vspId, Version version) {
86 String vendorName = null;
87 VspDetails vspDetails = vendorSoftwareProductInfoDao.get(new VspDetails(vspId, version));
88 if (Objects.nonNull(vspDetails)) {
89 vendorName = vspDetails.getVendorName();
91 return Optional.ofNullable(vendorName);
95 * Gets the deployment flavor data for manually onboarded VSPs.
97 * @param vspId the vsp id
98 * @param version the version
99 * @return the allowed flavors
101 public Map<String, DeploymentFlavorModel> getAllowedFlavors(String vspId, Version version) {
102 Map<String, DeploymentFlavorModel> allowedFlavors = new HashMap<>();
103 Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
104 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
105 if (CollectionUtils.isNotEmpty(deploymentFlavorEntities)) {
106 for (DeploymentFlavorEntity deploymentFlavorEntity : deploymentFlavorEntities) {
107 DeploymentFlavor deploymentFlavorCompositionData =
108 deploymentFlavorEntity.getDeploymentFlavorCompositionData();
110 VspDetails vspDetails = vendorSoftwareProductInfoDao.get(new VspDetails(vspId, version));
113 if (Objects.nonNull(vspDetails)) {
114 vspVlmId = vspDetails.getVendorId();
115 vlmVersion = vspDetails.getVlmVersion();
116 if (StringUtils.isNotEmpty(vspVlmId)) {
117 DeploymentFlavorModel deploymentFlavorModel = new DeploymentFlavorModel();
118 String featureGroupId = deploymentFlavorCompositionData.getFeatureGroupId();
119 if (Objects.isNull(featureGroupId)) {
120 //No feature group associated with deployment flavor. So excluding this deployment
121 // flavor for Tosca model
124 //Gather and set License flavor info
125 LicenseFlavor licenseFlavor = getLicenseFlavor(featureGroupId);
126 deploymentFlavorModel.setLicense_flavor(licenseFlavor);
128 Optional<String> partNumber = getPartNumber(vspVlmId, vlmVersion, featureGroupId);
129 partNumber.ifPresent(deploymentFlavorModel::setSp_part_number);
130 //Gather and set Vendor Info
131 String vendorModel = deploymentFlavorCompositionData.getModel();
132 Optional<VendorInfo> vendorInfo = getVendorInfo(vspVlmId, vendorModel, vlmVersion,
134 vendorInfo.ifPresent(deploymentFlavorModel::setVendor_info);
135 //Gather and set Compute info
136 List<ComponentComputeAssociation> componentComputeAssociations =
137 deploymentFlavorCompositionData.getComponentComputeAssociations();
138 if (CollectionUtils.isNotEmpty(componentComputeAssociations)) {
139 for (ComponentComputeAssociation componentComputeAssociation :
140 componentComputeAssociations) {
141 String componentId = componentComputeAssociation.getComponentId();
142 String computeFlavorId = componentComputeAssociation.getComputeFlavorId();
143 Optional<ComputeFlavor> computeFlavor =
144 getComputeFlavor(vspId, version, componentId, computeFlavorId);
145 computeFlavor.ifPresent(deploymentFlavorModel::setCompute_flavor);
148 partNumber.ifPresent(spPartNumber -> allowedFlavors.put(spPartNumber,
149 deploymentFlavorModel));
154 return allowedFlavors;
158 * Gets the component image data for manually onboarded VSPs.
160 * @param vspId the vsp id
161 * @param version the version
162 * @return the vsp component images
164 public Map<String, List<MultiFlavorVfcImage>> getVspComponentImages(String vspId,
166 Map<String, List<MultiFlavorVfcImage>> vspComponentImages = new HashMap<>();
167 Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
168 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
169 for (DeploymentFlavorEntity deploymentFlavorEntity : deploymentFlavorEntities) {
170 DeploymentFlavor deploymentFlavorCompositionData =
171 deploymentFlavorEntity.getDeploymentFlavorCompositionData();
173 List<ComponentComputeAssociation> componentComputeAssociations =
174 deploymentFlavorCompositionData.getComponentComputeAssociations();
175 if (CollectionUtils.isNotEmpty(componentComputeAssociations)) {
176 for (ComponentComputeAssociation componentComputeAssociation :
177 componentComputeAssociations) {
178 String componentId = componentComputeAssociation.getComponentId();
179 List<MultiFlavorVfcImage> componentImages =
180 getComponentImages(vspId, version, componentId);
181 if (CollectionUtils.isNotEmpty(componentImages)) {
182 vspComponentImages.put(componentId, componentImages);
187 return vspComponentImages;
191 * Gets the component data for manually onboarded VSPs.
193 * @param vspId the vsp id
194 * @param version the version
195 * @return the vsp components
197 public Map<String, String> getVspComponents(String vspId, Version version) {
198 Map<String, String> componentIdNameMap = new HashMap<>();
199 Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
200 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
201 for (DeploymentFlavorEntity deploymentFlavorEntity : deploymentFlavorEntities) {
202 DeploymentFlavor deploymentFlavorCompositionData =
203 deploymentFlavorEntity.getDeploymentFlavorCompositionData();
205 List<ComponentComputeAssociation> componentComputeAssociations =
206 deploymentFlavorCompositionData.getComponentComputeAssociations();
207 if (CollectionUtils.isNotEmpty(componentComputeAssociations)) {
208 for (ComponentComputeAssociation componentComputeAssociation :
209 componentComputeAssociations) {
210 String componentId = componentComputeAssociation.getComponentId();
211 Optional<String> componentName = getComponentName(vspId, version, componentId);
212 componentName.ifPresent(name -> componentIdNameMap.put(componentId, name));
216 return componentIdNameMap;
220 * Gets the NIC data for manually onboarded VSPs.
222 * @param vspId the vsp id
223 * @param version the version
224 * @return the vsp component nics
226 public Map<String, List<Nic>> getVspComponentNics(String vspId, Version version) {
227 Map<String, List<Nic>> vspComponentNics = new HashMap<>();
228 Collection<DeploymentFlavorEntity> deploymentFlavorEntities =
229 deploymentFlavorDao.list(new DeploymentFlavorEntity(vspId, version, null));
230 if (CollectionUtils.isNotEmpty(deploymentFlavorEntities)) {
231 for (DeploymentFlavorEntity deploymentFlavorEntity : deploymentFlavorEntities) {
232 DeploymentFlavor deploymentFlavorCompositionData =
233 deploymentFlavorEntity.getDeploymentFlavorCompositionData();
234 if (Objects.nonNull(deploymentFlavorCompositionData)) {
235 List<ComponentComputeAssociation> componentComputeAssociations =
236 deploymentFlavorCompositionData.getComponentComputeAssociations();
237 if (CollectionUtils.isNotEmpty(componentComputeAssociations)) {
238 for (ComponentComputeAssociation componentComputeAssociation :
239 componentComputeAssociations) {
240 String componentId = componentComputeAssociation.getComponentId();
241 List<Nic> componentNics = getComponentNics(vspId, version, componentId);
242 if (CollectionUtils.isNotEmpty(componentNics)) {
243 vspComponentNics.put(componentId, componentNics);
250 return vspComponentNics;
253 private List<Nic> getComponentNics(String vspId, Version version, String componentId) {
254 List<Nic> componentNics = new ArrayList<>();
255 Collection<NicEntity> nics = nicDao.list(new NicEntity(vspId, version, componentId, null));
256 if (Objects.nonNull(nics)) {
257 for (NicEntity nic : nics) {
258 String nicId = nic.getId();
259 NicEntity nicEntity = nicDao.get(new NicEntity(vspId, version, componentId, nicId));
260 if (Objects.nonNull(nicEntity)
261 && Objects.nonNull(nicEntity.getCompositionData())) {
262 componentNics.add(nicEntity.getNicCompositionData());
266 return componentNics;
269 private LicenseFlavor getLicenseFlavor(String featureGroupId) {
270 LicenseFlavor licenseFlavor = new LicenseFlavor();
271 licenseFlavor.setFeature_group_uuid(featureGroupId);
272 return licenseFlavor;
275 private Optional<String> getPartNumber(String vlmId, Version version,
276 String featureGroupId) {
277 FeatureGroupModel featureGroup = getFeatureGroup(vlmId, version, featureGroupId);
278 if (Objects.nonNull(featureGroup)) {
279 return Optional.ofNullable(featureGroup.getFeatureGroup().getPartNumber());
281 return Optional.empty();
284 private Optional<VendorInfo> getVendorInfo(String vlmId, String vendorModel, Version version,
285 String featureGroupId) {
286 VendorInfo vendorInfo = null;
287 FeatureGroupModel featureGroup = getFeatureGroup(vlmId, version, featureGroupId);
288 if (Objects.nonNull(featureGroup)) {
289 //Process Feature group to get Manufacturer ref no.
290 String manufacturerReferenceNumber = featureGroup.getEntityManufacturerReferenceNumber();
291 vendorInfo = new VendorInfo();
292 vendorInfo.setVendor_model(vendorModel);
293 if (Objects.nonNull(manufacturerReferenceNumber)) {
294 vendorInfo.setManufacturer_reference_number(manufacturerReferenceNumber);
297 return Optional.ofNullable(vendorInfo);
300 private Optional<ComputeFlavor> getComputeFlavor(String vspId, Version version,
301 String componentId, String computeFlavorId) {
302 ComputeFlavor computeFlavor = null;
303 ComputeEntity computeQuestionnaire = null;
305 computeQuestionnaire = computeDao.getQuestionnaireData(vspId, version, componentId,
307 } catch (Exception ex) {
309 computeQuestionnaire = null;
310 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_API,
311 LoggerTragetServiceName.COLLECT_MANUAL_VSP_TOSCA_DATA, ErrorLevel.INFO.name(),
312 LoggerErrorCode.DATA_ERROR.getErrorCode(), "Failed to get compute questionnaire : "
315 if (Objects.nonNull(computeQuestionnaire)) {
316 String computeQuestionnaireData = computeQuestionnaire.getQuestionnaireData();
317 if (Objects.nonNull(computeQuestionnaireData)) {
320 compute = JsonUtil.json2Object(computeQuestionnaireData, Compute.class);
321 } catch (Exception ex) {
324 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_API,
325 LoggerTragetServiceName.COLLECT_MANUAL_VSP_TOSCA_DATA, ErrorLevel.INFO.name(),
326 LoggerErrorCode.DATA_ERROR.getErrorCode(), "Unable to parse compute questionnaire : "
329 if (compute != null && Objects.nonNull(compute.getVmSizing())) {
330 computeFlavor = new ComputeFlavor();
331 if (Objects.nonNull(compute.getVmSizing().getNumOfCPUs())) {
332 computeFlavor.setNum_cpus(compute.getVmSizing().getNumOfCPUs());
334 if (Objects.nonNull(compute.getVmSizing().getFileSystemSizeGB())) {
335 computeFlavor.setDisk_size(compute.getVmSizing().getFileSystemSizeGB() + " GB");
337 if (Objects.nonNull(compute.getVmSizing().getMemoryRAM())) {
338 computeFlavor.setMem_size(compute.getVmSizing().getMemoryRAM());
343 return Optional.ofNullable(computeFlavor);
346 private FeatureGroupModel getFeatureGroup(String vlmId, Version version, String featureGroupId) {
347 FeatureGroupEntity fgInput = new FeatureGroupEntity();
348 fgInput.setVendorLicenseModelId(vlmId);
349 fgInput.setVersion(version);
350 fgInput.setId(featureGroupId);
351 return vendorLicenseFacade.getFeatureGroupModel(fgInput);
354 private Optional<String> getComponentName(String vspId, Version version, String componentId) {
356 ComponentEntity componentEntity =
357 componentDao.get(new ComponentEntity(vspId, version, componentId));
358 if (Objects.nonNull(componentEntity)
359 && Objects.nonNull(componentEntity.getComponentCompositionData())) {
360 ComponentData componentCompositionData = componentEntity.getComponentCompositionData();
361 return Optional.ofNullable(componentCompositionData.getDisplayName());
363 return Optional.empty();
366 private List<MultiFlavorVfcImage> getComponentImages(String vspId, Version version,
367 String componentId) {
368 List<MultiFlavorVfcImage> multiFlavorVfcImages = new ArrayList<>();
369 MultiFlavorVfcImage multiFlavorVfcImage;
370 Collection<ImageEntity> componentImages =
371 imageDao.list(new ImageEntity(vspId, version, componentId, null));
372 if (Objects.nonNull(componentImages)) {
373 for (ImageEntity componentImage : componentImages) {
374 ImageEntity imageEntity = imageDao.get(componentImage);
375 ImageEntity imageQuestionnaireDataEntity = imageDao.getQuestionnaireData(vspId, version,
376 componentId, componentImage.getId());
377 Image imageCompositionData = imageEntity.getImageCompositionData();
378 if (Objects.nonNull(imageEntity)
379 && Objects.nonNull(imageQuestionnaireDataEntity)
380 && Objects.nonNull(imageCompositionData)) {
381 ImageDetails imageDetails;
383 imageDetails = JsonUtil.json2Object(imageQuestionnaireDataEntity
384 .getQuestionnaireData(), ImageDetails.class);
385 } catch (Exception ex) {
388 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_API,
389 LoggerTragetServiceName.COLLECT_MANUAL_VSP_TOSCA_DATA, ErrorLevel.INFO.name(),
390 LoggerErrorCode.DATA_ERROR.getErrorCode(), "Unable to parse image questionnaire : "
393 if (Objects.nonNull(imageDetails)
394 && Objects.nonNull(imageDetails.getVersion())) {
395 //Image version is used as a key for the image block
396 //So excluding the population if questionnaire data is absent or invalid
397 multiFlavorVfcImage = new MultiFlavorVfcImage();
398 multiFlavorVfcImage.setSoftware_version(imageDetails.getVersion());
399 if (Objects.nonNull(imageCompositionData.getFileName())) {
400 multiFlavorVfcImage.setFile_name(imageCompositionData.getFileName());
402 if (Objects.nonNull(imageDetails.getMd5())) {
403 multiFlavorVfcImage.setFile_hash(imageDetails.getMd5());
405 multiFlavorVfcImage.setFile_hash_type("md5");
406 multiFlavorVfcImages.add(multiFlavorVfcImage);
411 return multiFlavorVfcImages;