[sdc] update code of sdc
[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                 if(resource.getCategories() != null && !resource.getCategories().isEmpty()){
200                         CategoryDefinition categoryDefinition = resource.getCategories().get(0);
201                         assetToPopulate.setCategory(categoryDefinition.getName());
202                         assetToPopulate.setSubCategory(categoryDefinition.getSubcategories().get(0).getName());
203                 }
204                 assetToPopulate.setResourceType(resource.getResourceType().name());
205                 assetToPopulate.setLifecycleState(resource.getLifecycleState().name());
206                 assetToPopulate.setLastUpdaterUserId(resource.getLastUpdaterUserId());
207
208                 return (T) assetToPopulate;
209         }
210
211         private <T extends ServiceAssetMetadata> T convertToServiceAssetMetadata(T assetToPopulate, Service service, String serverBaseURL, boolean detailed) {
212                 assetToPopulate = convertToAsset(assetToPopulate, service, serverBaseURL, detailed);
213
214                 if(service.getCategories() != null && !service.getCategories().isEmpty()){
215                         CategoryDefinition categoryDefinition = service.getCategories().get(0);
216                         assetToPopulate.setCategory(categoryDefinition.getName());
217                 }
218                 
219                 assetToPopulate.setLifecycleState(service.getLifecycleState().name());
220                 assetToPopulate.setLastUpdaterUserId(service.getLastUpdaterUserId());
221                 assetToPopulate.setDistributionStatus(service.getDistributionStatus().name());
222
223                 return (T) assetToPopulate;
224         }
225
226         private <T extends ResourceAssetDetailedMetadata> Either<T, StorageOperationStatus> convertToResourceDetailedMetadata(T assetToPopulate, Resource resource, String serverBaseURL) {
227
228                 List<ComponentInstance> componentInstances = resource.getComponentInstances();
229
230                 if (componentInstances != null) {
231                         Either<List<ResourceInstanceMetadata>, StorageOperationStatus> resourceInstanceMetadata = convertToResourceInstanceMetadata(componentInstances, ComponentTypeEnum.RESOURCE_PARAM_NAME, resource.getUUID());
232                         if (resourceInstanceMetadata.isRight()) {
233                                 return Either.right(resourceInstanceMetadata.right().value());
234                         }
235
236                         assetToPopulate.setResources(resourceInstanceMetadata.left().value());
237                 }
238
239                 Map<String, ArtifactDefinition> deploymentArtifacts = resource.getDeploymentArtifacts();
240                 assetToPopulate = populateResourceWithArtifacts(assetToPopulate, resource, serverBaseURL, deploymentArtifacts);
241
242                 assetToPopulate.setLastUpdaterFullName(resource.getLastUpdaterFullName());
243                 assetToPopulate.setToscaResourceName(resource.getToscaResourceName());
244                 assetToPopulate.setDescription(resource.getDescription());
245                 return Either.left(assetToPopulate);
246         }
247
248         private <T extends ServiceAssetDetailedMetadata> Either<T, StorageOperationStatus> convertToServiceDetailedMetadata(T assetToPopulate, Service service, String serverBaseURL) {
249
250                 List<ComponentInstance> componentInstances = service.getComponentInstances();
251
252                 if (componentInstances != null) {
253                         Either<List<ResourceInstanceMetadata>, StorageOperationStatus> resourceInstanceMetadata = convertToResourceInstanceMetadata(componentInstances, ComponentTypeEnum.SERVICE_PARAM_NAME, service.getUUID());
254                         if (resourceInstanceMetadata.isRight()) {
255                                 return Either.right(resourceInstanceMetadata.right().value());
256                         }
257
258                         assetToPopulate.setResources(resourceInstanceMetadata.left().value());
259                 }
260
261                 Map<String, ArtifactDefinition> deploymentArtifacts = service.getDeploymentArtifacts();
262                 assetToPopulate = populateServiceWithArtifacts(assetToPopulate, service, deploymentArtifacts);
263
264                 assetToPopulate.setLastUpdaterFullName(service.getLastUpdaterFullName());
265
266                 return Either.left(assetToPopulate);
267         }
268
269         private <T extends ResourceAssetDetailedMetadata> T populateResourceWithArtifacts(T asset, Resource resource, String serverBaseURL, Map<String, ArtifactDefinition> artifacts) {
270
271                 List<ArtifactMetadata> artifactMetaList = populateAssetWithArtifacts(resource, artifacts);
272
273                 asset.setArtifacts(artifactMetaList);
274
275                 return asset;
276         }
277
278         private <T extends ServiceAssetDetailedMetadata> T populateServiceWithArtifacts(T asset, Service service, Map<String, ArtifactDefinition> artifacts) {
279
280                 List<ArtifactMetadata> artifactMetaList = populateAssetWithArtifacts(service, artifacts);
281
282                 asset.setArtifacts(artifactMetaList);
283
284                 return asset;
285         }
286
287         private List<ArtifactMetadata> populateAssetWithArtifacts(Component component, Map<String, ArtifactDefinition> artifacts) {
288                 List<ArtifactMetadata> artifactMetaList =  new LinkedList<>();
289                 if (artifacts != null) {                        
290                         Collection<ArtifactDefinition> artefactDefList = artifacts.values();
291
292                         for (ArtifactDefinition artifactDefinition : artefactDefList) {
293                                 if (artifactDefinition.getEsId() != null && !artifactDefinition.getEsId().isEmpty()) {
294                                         ArtifactMetadata convertedArtifactMetadata = convertToArtifactMetadata(artifactDefinition, ComponentTypeEnum.findParamByType(component.getComponentType()), component.getUUID(), null);
295                                         artifactMetaList.add(convertedArtifactMetadata);
296                                 }
297                         }
298                 }
299                 return artifactMetaList.isEmpty() ? null : artifactMetaList;
300         }
301
302         private ArtifactMetadata convertToArtifactMetadata(ArtifactDefinition artifact, String componentType, String componentUUID, String resourceInstanceName) {
303                 // /sdc/v1/catalog/{services/resources}/{componentUUID}/artifacts/{artifactUUID}
304                 final String COMPONENT_ARTIFACT_URL = "/sdc/v1/catalog/%s/%s/artifacts/%s";
305
306                 // /sdc/v1/catalog/{services/resources}/{componentUUID}/resourceInstances/{resourceInstanceName}/artifacts/{artifactUUID}
307                 final String RESOURCE_INSTANCE_ARTIFACT_URL = "/sdc/v1/catalog/%s/%s/resourceInstances/%s/artifacts/%s";
308
309                 ArtifactMetadata metadata = new ArtifactMetadata();
310
311                 metadata.setArtifactName(artifact.getArtifactName());
312                 metadata.setArtifactType(artifact.getArtifactType());
313
314                 if (resourceInstanceName == null || resourceInstanceName.isEmpty()) {
315                         metadata.setArtifactURL(String.format(COMPONENT_ARTIFACT_URL, componentType, componentUUID, artifact.getArtifactUUID()));
316                 } else {
317                         metadata.setArtifactURL(String.format(RESOURCE_INSTANCE_ARTIFACT_URL, componentType, componentUUID, resourceInstanceName, artifact.getArtifactUUID()));
318                 }
319
320                 metadata.setArtifactDescription(artifact.getDescription());
321                 metadata.setArtifactTimeout(artifact.getTimeout() > 0 ? artifact.getTimeout() : null);
322                 metadata.setArtifactChecksum(artifact.getArtifactChecksum());
323                 metadata.setArtifactUUID(artifact.getArtifactUUID());
324                 metadata.setArtifactVersion(artifact.getArtifactVersion());
325                 metadata.setGeneratedFromUUID(artifact.getGeneratedFromId());
326                 metadata.setArtifactLabel(artifact.getArtifactLabel());
327                 metadata.setArtifactGroupType(artifact.getArtifactGroupType().getType());
328                 return metadata;
329         }
330
331         private Either<List<ResourceInstanceMetadata>, StorageOperationStatus> convertToResourceInstanceMetadata(List<ComponentInstance> componentInstances, String componentType, String componentUUID) {
332                 List<ResourceInstanceMetadata> retList = new LinkedList<>();
333                 Map<String, ImmutablePair<String, String>> uuidDuplicatesMap = new HashMap<>();
334
335                 for (ComponentInstance componentInstance : componentInstances) {
336                         ResourceInstanceMetadata metadata = new ResourceInstanceMetadata();
337                         String componentUid = componentInstance.getComponentUid();
338                         String invariantUUID, resourceUUID;
339
340                         if (!uuidDuplicatesMap.containsKey(componentUid)) {
341                                 Either<Resource, StorageOperationStatus> eitherResource = toscaOperationFacade.getToscaElement(componentInstance.getComponentUid());
342                                 if (eitherResource.isRight()) {
343                                         log.debug("convertToResourceInstanceMetadata: Failed getting resource with Uid: {}", componentInstance.getComponentUid());
344                                         return Either.right(eitherResource.right().value());
345                                 } else {
346                                         final Resource resource = eitherResource.left().value();
347                                         invariantUUID = resource.getInvariantUUID();
348                                         resourceUUID = resource.getUUID();
349                                         ImmutablePair<String, String> uuidInvariantUUIDPair = new ImmutablePair<>(resourceUUID, invariantUUID);
350                                         uuidDuplicatesMap.put(componentUid, uuidInvariantUUIDPair);
351                                 }
352                         } else {
353                                 invariantUUID = uuidDuplicatesMap.get(componentUid).getRight();
354                                 resourceUUID =  uuidDuplicatesMap.get(componentUid).getLeft();
355                         }
356
357                         metadata.setResourceInvariantUUID(invariantUUID);
358                         metadata.setResourceUUID(resourceUUID);
359                         metadata.setResourceInstanceName(componentInstance.getName());
360                         metadata.setResourceName(componentInstance.getComponentName());
361                         metadata.setResourceVersion(componentInstance.getComponentVersion());
362                         metadata.setResoucreType(componentInstance.getOriginType().getValue());
363                         
364                         if(MapUtils.isNotEmpty(componentInstance.getDeploymentArtifacts())){
365                                 LinkedList<ArtifactMetadata> artifactMetaList = new LinkedList<>();
366                                 Collection<ArtifactDefinition> values = componentInstance.getDeploymentArtifacts().values();
367                                 for (ArtifactDefinition artifactDefinition : values) {
368                                         ArtifactMetadata converted = convertToArtifactMetadata(artifactDefinition, componentType, componentUUID, componentInstance.getNormalizedName());
369                                         artifactMetaList.add(converted);
370                                 }
371                                 metadata.setArtifacts(artifactMetaList);
372                         }
373                         retList.add(metadata);
374                 }
375                 return Either.left(retList);
376         }
377
378         // For future US to support Product
379         /*
380          * private ProductAssetMetadata convertToProductAssetMetadata(Product product, String serverBaseURL) { ProductAssetMetadata retProdAsset = new ProductAssetMetadata();
381          * 
382          * retProdAsset = convertToAsset(retProdAsset, product, serverBaseURL); retProdAsset.setLifecycleState(product.getLifecycleState().name()); retProdAsset.setLastUpdaterUserId(product.getLastUpdaterUserId());
383          * retProdAsset.setActive(product.getIsActive()); retProdAsset.setContacts(product.getContacts());
384          * 
385          * List<CategoryDefinition> categories = product.getCategories(); List<ProductCategoryGroupMetadata> categoryMetadataList = new LinkedList<>();
386          * 
387          * if (categories == null || categories.isEmpty()) { return retProdAsset; } else { for (CategoryDefinition categoryDefinition : categories) { String categoryName = categoryDefinition.getName(); List<SubCategoryDefinition> subcategories =
388          * categoryDefinition.getSubcategories(); for (SubCategoryDefinition subCategoryDefinition : subcategories) { String subCategoryName = subCategoryDefinition.getName(); List<GroupDefinition> groups = product.getGroups(); for (GroupDefinition
389          * groupDefinition : groups) { String groupName = groupDefinition.getName(); categoryMetadataList.add(new ProductCategoryGroupMetadata(categoryName, subCategoryName, groupName)); } } } retProdAsset.setProductGroupings(categoryMetadataList);
390          * return retProdAsset; } }
391          */
392 }