[SDC-29] rebase continue work to align source
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / ecomp / converters / AssetMetadataConverter.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.be.ecomp.converters;
22
23 import java.util.Collection;
24 import java.util.HashMap;
25 import java.util.LinkedList;
26 import java.util.List;
27 import java.util.Map;
28
29 import org.apache.commons.collections.MapUtils;
30 import org.apache.commons.lang3.tuple.ImmutablePair;
31 import org.openecomp.sdc.be.dao.api.ActionStatus;
32 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
33 import org.openecomp.sdc.be.distribution.servlet.DistributionCatalogServlet;
34 import org.openecomp.sdc.be.externalapi.servlet.representation.ArtifactMetadata;
35 import org.openecomp.sdc.be.externalapi.servlet.representation.AssetMetadata;
36 import org.openecomp.sdc.be.externalapi.servlet.representation.ResourceAssetDetailedMetadata;
37 import org.openecomp.sdc.be.externalapi.servlet.representation.ResourceAssetMetadata;
38 import org.openecomp.sdc.be.externalapi.servlet.representation.ResourceInstanceMetadata;
39 import org.openecomp.sdc.be.externalapi.servlet.representation.ServiceAssetDetailedMetadata;
40 import org.openecomp.sdc.be.externalapi.servlet.representation.ServiceAssetMetadata;
41 import org.openecomp.sdc.be.impl.ComponentsUtils;
42 import org.openecomp.sdc.be.model.ArtifactDefinition;
43 import org.openecomp.sdc.be.model.Component;
44 import org.openecomp.sdc.be.model.ComponentInstance;
45 import org.openecomp.sdc.be.model.Resource;
46 import org.openecomp.sdc.be.model.Service;
47 import org.openecomp.sdc.be.model.category.CategoryDefinition;
48 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
49 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
50 import org.openecomp.sdc.exception.ResponseFormat;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53 import org.springframework.beans.factory.annotation.Autowired;
54
55 import fj.data.Either;
56
57 @org.springframework.stereotype.Component("asset-metadata-utils")
58 public class AssetMetadataConverter {
59         private static Logger log = LoggerFactory.getLogger(DistributionCatalogServlet.class.getName());
60
61         @Autowired
62         private ComponentsUtils componentsUtils;
63
64         @Autowired
65         protected ToscaOperationFacade toscaOperationFacade; 
66
67         /*
68          * Relative asset’s URL. Should be used in REST GET API to download the asset’s CSAR. https://{serverBaseURL}/{csarPath} can be obtained from (HttpServletRequest)request.getServerName()
69          */
70         public Either<List<? extends AssetMetadata>, ResponseFormat> convertToAssetMetadata(List<? extends Component> componentList, String serverBaseURL, boolean detailed) {
71                 if (componentList == null || componentList.isEmpty()) {
72                         return Either.left(new LinkedList<>());
73                 }
74                 List<AssetMetadata> retResList = new LinkedList<>();
75
76                 for (Component curr : componentList) {
77                         Either<? extends AssetMetadata, ResponseFormat> resMetaData = convertToSingleAssetMetadata(curr, serverBaseURL, detailed);
78                         if (resMetaData.isRight()) {
79                                 return Either.right(resMetaData.right().value());
80                         }
81                         retResList.add(resMetaData.left().value());
82                 }
83
84                 return Either.left(retResList);
85
86         }
87
88         public <T extends Component> Either<? extends AssetMetadata, ResponseFormat> convertToSingleAssetMetadata(T component, String serverBaseURL, boolean detailed) {
89                 ComponentTypeEnum componentType = component.getComponentType();
90                 Either<? extends AssetMetadata, ResponseFormat> resMetaData = convertToMetadata(componentType, serverBaseURL, detailed, component);
91
92                 if (resMetaData.isRight()) {
93                         return Either.right(resMetaData.right().value());
94                 }
95                 else{
96                         return Either.left(resMetaData.left().value());
97                 }
98
99         }
100
101         private Either<? extends AssetMetadata, ResponseFormat> convertToMetadata(ComponentTypeEnum componentType, String serverBaseURL, boolean detailed, Component curr) {
102
103                 switch (componentType) {
104
105                 case RESOURCE:
106
107                         return generateResourceMeatdata(serverBaseURL, detailed, curr);
108
109                 case SERVICE:
110
111                         return generateServiceMetadata(serverBaseURL, detailed, curr);
112
113                 // For future US's that include product
114                 /*
115                  * case PRODUCT: if (component instanceof Product) { List<ProductAssetMetadata> retResList = new LinkedList<>(); for (Component curr : componentList) { retResList.add(convertToProductAssetMetadata((Product) curr, serverBaseURL)); } return
116                  * Either.left(retResList);
117                  */
118                 default:
119
120                         ResponseFormat responseFormat = componentsUtils.getResponseFormatAdditionalProperty(ActionStatus.COMPONENT_INVALID_CATEGORY);
121                         return Either.right(responseFormat);
122                 }
123         }
124
125         private Either<? extends AssetMetadata, ResponseFormat> generateResourceMeatdata(String serverBaseURL, boolean detailed, Component curr) {
126                 AssetMetadata metaData;
127                 metaData = createMetadaObject(detailed, curr.getComponentType());
128                 metaData = convertToResourceMetadata((ResourceAssetMetadata) metaData, (Resource) curr, serverBaseURL, detailed);
129
130                 if (detailed) {
131                         Either<ResourceAssetDetailedMetadata, StorageOperationStatus> converted = convertToResourceDetailedMetadata((ResourceAssetDetailedMetadata) metaData, (Resource) curr, serverBaseURL);
132                         if (converted.isRight()) {
133                                 ActionStatus storageResponse = componentsUtils.convertFromStorageResponse(converted.right().value(), ComponentTypeEnum.RESOURCE);
134                                 ResponseFormat responseFormat = componentsUtils.getResponseFormat(storageResponse);
135                                 return Either.right(responseFormat);
136                         }
137                 }
138
139                 return Either.left(metaData);
140         }
141
142         private AssetMetadata createMetadaObject(boolean detailed, ComponentTypeEnum type) {
143                 AssetMetadata metaData = null;
144                 switch (type) {
145                 case SERVICE:
146                         if (!detailed) {
147                                 metaData = new ServiceAssetMetadata();
148                         } else {
149                                 metaData = new ServiceAssetDetailedMetadata();
150                         }
151                         break;
152                 case RESOURCE:
153                         if (!detailed) {
154                                 metaData = new ResourceAssetMetadata();
155                         } else {
156                                 metaData = new ResourceAssetDetailedMetadata();
157                         }
158                         break;
159                 default:
160                         break;
161                 }
162                 return metaData;
163         }
164
165         private Either<? extends AssetMetadata, ResponseFormat> generateServiceMetadata(String serverBaseURL, boolean detailed, Component curr) {
166                 AssetMetadata metaData = createMetadaObject(detailed, curr.getComponentType());
167
168                 metaData = convertToServiceAssetMetadata((ServiceAssetMetadata) metaData, (Service) curr, serverBaseURL, detailed);
169
170                 if (detailed) {
171                         Either<ServiceAssetDetailedMetadata, StorageOperationStatus> converted = convertToServiceDetailedMetadata((ServiceAssetDetailedMetadata) metaData, (Service) curr, serverBaseURL);
172                         if (converted.isRight()) {
173                                 ActionStatus storageResponse = componentsUtils.convertFromStorageResponse(converted.right().value(), ComponentTypeEnum.RESOURCE);
174                                 ResponseFormat responseFormat = componentsUtils.getResponseFormat(storageResponse);
175                                 return Either.right(responseFormat);
176                         }
177                 }
178
179                 return Either.left(metaData);
180         }
181
182         private <U extends AssetMetadata, T extends Component> U convertToAsset(U asset, T component, String serverBaseURL, boolean detailed) {
183                 asset.setUuid(component.getUUID());
184                 asset.setInvariantUUID(component.getInvariantUUID());
185                 asset.setName(component.getName());
186                 asset.setVersion(component.getVersion());
187                 if (!detailed) {
188                         asset.setToscaModelURL(serverBaseURL + "/" + component.getUUID() + "/toscaModel");
189                 } else {
190                         String toscaModelUrl = (new String(serverBaseURL)).replace("metadata", "toscaModel");
191                         asset.setToscaModelURL(toscaModelUrl);
192                 }
193
194                 return asset;
195         }
196
197         private <T extends ResourceAssetMetadata> T convertToResourceMetadata(T assetToPopulate, Resource resource, String serverBaseURL, boolean detailed) {
198                 assetToPopulate = convertToAsset(assetToPopulate, resource, serverBaseURL, detailed);
199                 CategoryDefinition categoryDefinition;
200                 if(resource.getCategories() != null && !resource.getCategories().isEmpty()){
201                         categoryDefinition = resource.getCategories().iterator().next();
202                         assetToPopulate.setCategory(categoryDefinition.getName());
203                         assetToPopulate.setSubCategory(categoryDefinition.getSubcategories().iterator().next().getName());
204                 }
205                 assetToPopulate.setResourceType(resource.getResourceType().name());
206                 assetToPopulate.setLifecycleState(resource.getLifecycleState().name());
207                 assetToPopulate.setLastUpdaterUserId(resource.getLastUpdaterUserId());
208
209                 return (T) assetToPopulate;
210         }
211
212         private <T extends ServiceAssetMetadata> T convertToServiceAssetMetadata(T assetToPopulate, Service service, String serverBaseURL, boolean detailed) {
213                 assetToPopulate = convertToAsset(assetToPopulate, service, serverBaseURL, detailed);
214
215                 CategoryDefinition categoryDefinition = service.getCategories().iterator().next();
216
217                 assetToPopulate.setCategory(categoryDefinition.getName());
218                 assetToPopulate.setLifecycleState(service.getLifecycleState().name());
219                 assetToPopulate.setLastUpdaterUserId(service.getLastUpdaterUserId());
220                 assetToPopulate.setDistributionStatus(service.getDistributionStatus().name());
221
222                 return (T) assetToPopulate;
223         }
224
225         private <T extends ResourceAssetDetailedMetadata> Either<T, StorageOperationStatus> convertToResourceDetailedMetadata(T assetToPopulate, Resource resource, String serverBaseURL) {
226
227                 List<ComponentInstance> componentInstances = resource.getComponentInstances();
228
229                 if (componentInstances != null) {
230                         Either<List<ResourceInstanceMetadata>, StorageOperationStatus> resourceInstanceMetadata = convertToResourceInstanceMetadata(componentInstances, ComponentTypeEnum.RESOURCE_PARAM_NAME, resource.getUUID());
231                         if (resourceInstanceMetadata.isRight()) {
232                                 return Either.right(resourceInstanceMetadata.right().value());
233                         }
234
235                         assetToPopulate.setResources(resourceInstanceMetadata.left().value());
236                 }
237
238                 Map<String, ArtifactDefinition> deploymentArtifacts = resource.getDeploymentArtifacts();
239                 assetToPopulate = populateResourceWithArtifacts(assetToPopulate, resource, serverBaseURL, deploymentArtifacts);
240
241                 assetToPopulate.setLastUpdaterFullName(resource.getLastUpdaterFullName());
242                 assetToPopulate.setToscaResourceName(resource.getToscaResourceName());
243                 assetToPopulate.setDescription(resource.getDescription());
244                 return Either.left(assetToPopulate);
245         }
246
247         private <T extends ServiceAssetDetailedMetadata> Either<T, StorageOperationStatus> convertToServiceDetailedMetadata(T assetToPopulate, Service service, String serverBaseURL) {
248
249                 List<ComponentInstance> componentInstances = service.getComponentInstances();
250
251                 if (componentInstances != null) {
252                         Either<List<ResourceInstanceMetadata>, StorageOperationStatus> resourceInstanceMetadata = convertToResourceInstanceMetadata(componentInstances, ComponentTypeEnum.SERVICE_PARAM_NAME, service.getUUID());
253                         if (resourceInstanceMetadata.isRight()) {
254                                 return Either.right(resourceInstanceMetadata.right().value());
255                         }
256
257                         assetToPopulate.setResources(resourceInstanceMetadata.left().value());
258                 }
259
260                 Map<String, ArtifactDefinition> deploymentArtifacts = service.getDeploymentArtifacts();
261                 assetToPopulate = populateServiceWithArtifacts(assetToPopulate, service, deploymentArtifacts);
262
263                 assetToPopulate.setLastUpdaterFullName(service.getLastUpdaterFullName());
264
265                 return Either.left(assetToPopulate);
266         }
267
268         private <T extends ResourceAssetDetailedMetadata> T populateResourceWithArtifacts(T asset, Resource resource, String serverBaseURL, Map<String, ArtifactDefinition> artifacts) {
269
270                 List<ArtifactMetadata> artifactMetaList = populateAssetWithArtifacts(resource, artifacts);
271
272                 asset.setArtifacts(artifactMetaList);
273
274                 return asset;
275         }
276
277         private <T extends ServiceAssetDetailedMetadata> T populateServiceWithArtifacts(T asset, Service service, Map<String, ArtifactDefinition> artifacts) {
278
279                 List<ArtifactMetadata> artifactMetaList = populateAssetWithArtifacts(service, artifacts);
280
281                 asset.setArtifacts(artifactMetaList);
282
283                 return asset;
284         }
285
286         private List<ArtifactMetadata> populateAssetWithArtifacts(Component component, Map<String, ArtifactDefinition> artifacts) {
287                 List<ArtifactMetadata> artifactMetaList =  new LinkedList<>();
288                 if (artifacts != null) {                        
289                         Collection<ArtifactDefinition> artefactDefList = artifacts.values();
290
291                         for (ArtifactDefinition artifactDefinition : artefactDefList) {
292                                 if (artifactDefinition.getEsId() != null && !artifactDefinition.getEsId().isEmpty()) {
293                                         ArtifactMetadata convertedArtifactMetadata = convertToArtifactMetadata(artifactDefinition, ComponentTypeEnum.findParamByType(component.getComponentType()), component.getUUID(), null);
294                                         artifactMetaList.add(convertedArtifactMetadata);
295                                 }
296                         }
297                 }
298                 return artifactMetaList.isEmpty() ? null : artifactMetaList;
299         }
300
301         private ArtifactMetadata convertToArtifactMetadata(ArtifactDefinition artifact, String componentType, String componentUUID, String resourceInstanceName) {
302                 // /sdc/v1/catalog/{services/resources}/{componentUUID}/artifacts/{artifactUUID}
303                 final String COMPONENT_ARTIFACT_URL = "/sdc/v1/catalog/%s/%s/artifacts/%s";
304
305                 // /sdc/v1/catalog/{services/resources}/{componentUUID}/resourceInstances/{resourceInstanceName}/artifacts/{artifactUUID}
306                 final String RESOURCE_INSTANCE_ARTIFACT_URL = "/sdc/v1/catalog/%s/%s/resourceInstances/%s/artifacts/%s";
307
308                 ArtifactMetadata metadata = new ArtifactMetadata();
309
310                 metadata.setArtifactName(artifact.getArtifactName());
311                 metadata.setArtifactType(artifact.getArtifactType());
312
313                 if (resourceInstanceName == null || resourceInstanceName.isEmpty()) {
314                         metadata.setArtifactURL(String.format(COMPONENT_ARTIFACT_URL, componentType, componentUUID, artifact.getArtifactUUID()));
315                 } else {
316                         metadata.setArtifactURL(String.format(RESOURCE_INSTANCE_ARTIFACT_URL, componentType, componentUUID, resourceInstanceName, artifact.getArtifactUUID()));
317                 }
318
319                 metadata.setArtifactDescription(artifact.getDescription());
320                 metadata.setArtifactTimeout(artifact.getTimeout() > 0 ? artifact.getTimeout() : null);
321                 metadata.setArtifactChecksum(artifact.getArtifactChecksum());
322                 metadata.setArtifactUUID(artifact.getArtifactUUID());
323                 metadata.setArtifactVersion(artifact.getArtifactVersion());
324                 metadata.setGeneratedFromUUID(artifact.getGeneratedFromId());
325                 metadata.setArtifactLabel(artifact.getArtifactLabel());
326                 metadata.setArtifactGroupType(artifact.getArtifactGroupType().getType());
327                 return metadata;
328         }
329
330         private Either<List<ResourceInstanceMetadata>, StorageOperationStatus> convertToResourceInstanceMetadata(List<ComponentInstance> componentInstances, String componentType, String componentUUID) {
331                 List<ResourceInstanceMetadata> retList = new LinkedList<>();
332                 Map<String, ImmutablePair<String, String>> uuidDuplicatesMap = new HashMap<>();
333
334                 for (ComponentInstance componentInstance : componentInstances) {
335                         ResourceInstanceMetadata metadata = new ResourceInstanceMetadata();
336                         String componentUid = componentInstance.getComponentUid();
337                         String invariantUUID, resourceUUID;
338
339                         if (!uuidDuplicatesMap.containsKey(componentUid)) {
340                                 Either<Resource, StorageOperationStatus> eitherResource = toscaOperationFacade.getToscaElement(componentInstance.getComponentUid());
341                                 if (eitherResource.isRight()) {
342                                         log.debug("convertToResourceInstanceMetadata: Failed getting resource with Uid: {}", componentInstance.getComponentUid());
343                                         return Either.right(eitherResource.right().value());
344                                 } else {
345                                         final Resource resource = eitherResource.left().value();
346                                         invariantUUID = resource.getInvariantUUID();
347                                         resourceUUID = resource.getUUID();
348                                         ImmutablePair<String, String> uuidInvariantUUIDPair = new ImmutablePair<>(resourceUUID, invariantUUID);
349                                         uuidDuplicatesMap.put(componentUid, uuidInvariantUUIDPair);
350                                 }
351                         } else {
352                                 invariantUUID = uuidDuplicatesMap.get(componentUid).getRight();
353                                 resourceUUID =  uuidDuplicatesMap.get(componentUid).getLeft();
354                         }
355
356                         metadata.setResourceInvariantUUID(invariantUUID);
357                         metadata.setResourceUUID(resourceUUID);
358                         metadata.setResourceInstanceName(componentInstance.getName());
359                         metadata.setResourceName(componentInstance.getComponentName());
360                         metadata.setResourceVersion(componentInstance.getComponentVersion());
361                         metadata.setResoucreType(componentInstance.getOriginType().getValue());
362                         
363                         if(MapUtils.isNotEmpty(componentInstance.getDeploymentArtifacts())){
364                                 LinkedList<ArtifactMetadata> artifactMetaList = new LinkedList<>();
365                                 Collection<ArtifactDefinition> values = componentInstance.getDeploymentArtifacts().values();
366                                 for (ArtifactDefinition artifactDefinition : values) {
367                                         ArtifactMetadata converted = convertToArtifactMetadata(artifactDefinition, componentType, componentUUID, componentInstance.getNormalizedName());
368                                         artifactMetaList.add(converted);
369                                 }
370                                 metadata.setArtifacts(artifactMetaList);
371                         }
372                         retList.add(metadata);
373                 }
374                 return Either.left(retList);
375         }
376
377         // For future US to support Product
378         /*
379          * private ProductAssetMetadata convertToProductAssetMetadata(Product product, String serverBaseURL) { ProductAssetMetadata retProdAsset = new ProductAssetMetadata();
380          * 
381          * retProdAsset = convertToAsset(retProdAsset, product, serverBaseURL); retProdAsset.setLifecycleState(product.getLifecycleState().name()); retProdAsset.setLastUpdaterUserId(product.getLastUpdaterUserId());
382          * retProdAsset.setActive(product.getIsActive()); retProdAsset.setContacts(product.getContacts());
383          * 
384          * List<CategoryDefinition> categories = product.getCategories(); List<ProductCategoryGroupMetadata> categoryMetadataList = new LinkedList<>();
385          * 
386          * if (categories == null || categories.isEmpty()) { return retProdAsset; } else { for (CategoryDefinition categoryDefinition : categories) { String categoryName = categoryDefinition.getName(); List<SubCategoryDefinition> subcategories =
387          * categoryDefinition.getSubcategories(); for (SubCategoryDefinition subCategoryDefinition : subcategories) { String subCategoryName = subCategoryDefinition.getName(); List<GroupDefinition> groups = product.getGroups(); for (GroupDefinition
388          * groupDefinition : groups) { String groupName = groupDefinition.getName(); categoryMetadataList.add(new ProductCategoryGroupMetadata(categoryName, subCategoryName, groupName)); } } } retProdAsset.setProductGroupings(categoryMetadataList);
389          * return retProdAsset; } }
390          */
391 }