re base code
[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 fj.data.Either;
24 import org.apache.commons.collections.MapUtils;
25 import org.apache.commons.lang3.tuple.ImmutablePair;
26 import org.openecomp.sdc.be.dao.api.ActionStatus;
27 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
28 import org.openecomp.sdc.be.distribution.servlet.DistributionCatalogServlet;
29 import org.openecomp.sdc.be.externalapi.servlet.representation.*;
30 import org.openecomp.sdc.be.impl.ComponentsUtils;
31 import org.openecomp.sdc.be.model.*;
32 import org.openecomp.sdc.be.model.category.CategoryDefinition;
33 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
34 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
35 import org.openecomp.sdc.common.log.wrappers.Logger;
36 import org.openecomp.sdc.exception.ResponseFormat;
37 import org.springframework.beans.factory.annotation.Autowired;
38
39 import java.util.*;
40
41 @org.springframework.stereotype.Component("asset-metadata-utils")
42 public class AssetMetadataConverter {
43     private static final Logger log = Logger.getLogger(DistributionCatalogServlet.class);
44
45     @Autowired
46     private ComponentsUtils componentsUtils;
47
48     @Autowired
49     protected ToscaOperationFacade toscaOperationFacade;
50
51     /*
52      * 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()
53      */
54     public Either<List<? extends AssetMetadata>, ResponseFormat> convertToAssetMetadata(List<? extends Component> componentList, String serverBaseURL, boolean detailed) {
55         if (componentList == null || componentList.isEmpty()) {
56             return Either.left(new LinkedList<>());
57         }
58         List<AssetMetadata> retResList = new LinkedList<>();
59
60         for (Component curr : componentList) {
61             Either<? extends AssetMetadata, ResponseFormat> resMetaData = convertToSingleAssetMetadata(curr, serverBaseURL, detailed);
62             if (resMetaData.isRight()) {
63                 return Either.right(resMetaData.right().value());
64             }
65             retResList.add(resMetaData.left().value());
66         }
67
68         return Either.left(retResList);
69
70     }
71
72     public <T extends Component> Either<? extends AssetMetadata, ResponseFormat> convertToSingleAssetMetadata(T component, String serverBaseURL, boolean detailed) {
73         ComponentTypeEnum componentType = component.getComponentType();
74         Either<? extends AssetMetadata, ResponseFormat> resMetaData = convertToMetadata(componentType, serverBaseURL, detailed, component);
75
76         if (resMetaData.isRight()) {
77             return Either.right(resMetaData.right().value());
78         }
79         else{
80             return Either.left(resMetaData.left().value());
81         }
82
83     }
84
85     private Either<? extends AssetMetadata, ResponseFormat> convertToMetadata(ComponentTypeEnum componentType, String serverBaseURL, boolean detailed, Component curr) {
86
87         switch (componentType) {
88
89         case RESOURCE:
90
91             return generateResourceMeatdata(serverBaseURL, detailed, curr);
92
93         case SERVICE:
94
95             return generateServiceMetadata(serverBaseURL, detailed, curr);
96
97         default:
98
99             ResponseFormat responseFormat = componentsUtils.getResponseFormatAdditionalProperty(ActionStatus.COMPONENT_INVALID_CATEGORY);
100             return Either.right(responseFormat);
101         }
102     }
103
104     private Either<? extends AssetMetadata, ResponseFormat> generateResourceMeatdata(String serverBaseURL, boolean detailed, Component curr) {
105         AssetMetadata metaData;
106         metaData = createMetadaObject(detailed, curr.getComponentType());
107         metaData = convertToResourceMetadata((ResourceAssetMetadata) metaData, (Resource) curr, serverBaseURL, detailed);
108
109         if (detailed) {
110             Either<ResourceAssetDetailedMetadata, StorageOperationStatus> converted = convertToResourceDetailedMetadata((ResourceAssetDetailedMetadata) metaData, (Resource) curr, serverBaseURL);
111             if (converted.isRight()) {
112                 ActionStatus storageResponse = componentsUtils.convertFromStorageResponse(converted.right().value(), ComponentTypeEnum.RESOURCE);
113                 ResponseFormat responseFormat = componentsUtils.getResponseFormat(storageResponse);
114                 return Either.right(responseFormat);
115             }
116         }
117
118         return Either.left(metaData);
119     }
120
121     private AssetMetadata createMetadaObject(boolean detailed, ComponentTypeEnum type) {
122         AssetMetadata metaData = null;
123         switch (type) {
124         case SERVICE:
125             if (!detailed) {
126                 metaData = new ServiceAssetMetadata();
127             } else {
128                 metaData = new ServiceAssetDetailedMetadata();
129             }
130             break;
131         case RESOURCE:
132             if (!detailed) {
133                 metaData = new ResourceAssetMetadata();
134             } else {
135                 metaData = new ResourceAssetDetailedMetadata();
136             }
137             break;
138         default:
139             break;
140         }
141         return metaData;
142     }
143
144     private Either<? extends AssetMetadata, ResponseFormat> generateServiceMetadata(String serverBaseURL, boolean detailed, Component curr) {
145         AssetMetadata metaData = createMetadaObject(detailed, curr.getComponentType());
146
147         metaData = convertToServiceAssetMetadata((ServiceAssetMetadata) metaData, (Service) curr, serverBaseURL, detailed);
148
149         if (detailed) {
150             Either<ServiceAssetDetailedMetadata, StorageOperationStatus> converted = convertToServiceDetailedMetadata((ServiceAssetDetailedMetadata) metaData, (Service) curr);
151             if (converted.isRight()) {
152                 ActionStatus storageResponse = componentsUtils.convertFromStorageResponse(converted.right().value(), ComponentTypeEnum.RESOURCE);
153                 ResponseFormat responseFormat = componentsUtils.getResponseFormat(storageResponse);
154                 return Either.right(responseFormat);
155             }
156         }
157
158         return Either.left(metaData);
159     }
160
161     private <U extends AssetMetadata, T extends Component> U convertToAsset(U asset, T component, String serverBaseURL, boolean detailed) {
162         asset.setUuid(component.getUUID());
163         asset.setInvariantUUID(component.getInvariantUUID());
164         asset.setName(component.getName());
165         asset.setVersion(component.getVersion());
166         if (!detailed) {
167             asset.setToscaModelURL(serverBaseURL + "/" + component.getUUID() + "/toscaModel");
168         } else {
169             String toscaModelUrl = (new String(serverBaseURL)).replace("metadata", "toscaModel");
170             asset.setToscaModelURL(toscaModelUrl);
171         }
172
173         return asset;
174     }
175
176     private <T extends ResourceAssetMetadata> T convertToResourceMetadata(T assetToPopulate, Resource resource, String serverBaseURL, boolean detailed) {
177         assetToPopulate = convertToAsset(assetToPopulate, resource, serverBaseURL, detailed);
178         if(resource.getCategories() != null && !resource.getCategories().isEmpty()){
179             CategoryDefinition categoryDefinition = resource.getCategories().get(0);
180             assetToPopulate.setCategory(categoryDefinition.getName());
181             assetToPopulate.setSubCategory(categoryDefinition.getSubcategories().get(0).getName());
182         }
183         assetToPopulate.setResourceType(resource.getResourceType().name());
184         assetToPopulate.setLifecycleState(resource.getLifecycleState().name());
185         assetToPopulate.setLastUpdaterUserId(resource.getLastUpdaterUserId());
186
187         return (T) assetToPopulate;
188     }
189
190     private <T extends ServiceAssetMetadata> T convertToServiceAssetMetadata(T assetToPopulate, Service service, String serverBaseURL, boolean detailed) {
191         assetToPopulate = convertToAsset(assetToPopulate, service, serverBaseURL, detailed);
192
193         if(service.getCategories() != null && !service.getCategories().isEmpty()){
194             CategoryDefinition categoryDefinition = service.getCategories().get(0);
195             assetToPopulate.setCategory(categoryDefinition.getName());
196         }
197
198         assetToPopulate.setLifecycleState(service.getLifecycleState().name());
199         assetToPopulate.setLastUpdaterUserId(service.getLastUpdaterUserId());
200         assetToPopulate.setDistributionStatus(service.getDistributionStatus().name());
201
202         return (T) assetToPopulate;
203     }
204
205     private <T extends ResourceAssetDetailedMetadata> Either<T, StorageOperationStatus> convertToResourceDetailedMetadata(T assetToPopulate, Resource resource, String serverBaseURL) {
206
207         List<ComponentInstance> componentInstances = resource.getComponentInstances();
208
209         if (componentInstances != null) {
210             Either<List<ResourceInstanceMetadata>, StorageOperationStatus> resourceInstanceMetadata = convertToResourceInstanceMetadata(componentInstances, ComponentTypeEnum.RESOURCE_PARAM_NAME, resource.getUUID());
211             if (resourceInstanceMetadata.isRight()) {
212                 return Either.right(resourceInstanceMetadata.right().value());
213             }
214
215             assetToPopulate.setResources(resourceInstanceMetadata.left().value());
216         }
217
218         Map<String, ArtifactDefinition> deploymentArtifacts = resource.getDeploymentArtifacts();
219         assetToPopulate = populateResourceWithArtifacts(assetToPopulate, resource, deploymentArtifacts);
220
221         assetToPopulate.setLastUpdaterFullName(resource.getLastUpdaterFullName());
222         assetToPopulate.setToscaResourceName(resource.getToscaResourceName());
223         assetToPopulate.setDescription(resource.getDescription());
224         return Either.left(assetToPopulate);
225     }
226
227     private <T extends ServiceAssetDetailedMetadata> Either<T, StorageOperationStatus> convertToServiceDetailedMetadata(T assetToPopulate, Service service) {
228
229         List<ComponentInstance> componentInstances = service.getComponentInstances();
230
231         if (componentInstances != null) {
232             Either<List<ResourceInstanceMetadata>, StorageOperationStatus> resourceInstanceMetadata = convertToResourceInstanceMetadata(componentInstances, ComponentTypeEnum.SERVICE_PARAM_NAME, service.getUUID());
233             if (resourceInstanceMetadata.isRight()) {
234                 return Either.right(resourceInstanceMetadata.right().value());
235             }
236
237             assetToPopulate.setResources(resourceInstanceMetadata.left().value());
238         }
239
240         Map<String, ArtifactDefinition> deploymentArtifacts = service.getDeploymentArtifacts();
241         assetToPopulate = populateServiceWithArtifacts(assetToPopulate, service, deploymentArtifacts);
242
243         assetToPopulate.setLastUpdaterFullName(service.getLastUpdaterFullName());
244
245         return Either.left(assetToPopulate);
246     }
247
248     private <T extends ResourceAssetDetailedMetadata> T populateResourceWithArtifacts(T asset, Resource resource, Map<String, ArtifactDefinition> artifacts) {
249
250         List<ArtifactMetadata> artifactMetaList = populateAssetWithArtifacts(resource, artifacts);
251
252         asset.setArtifacts(artifactMetaList);
253
254         return asset;
255     }
256
257     private <T extends ServiceAssetDetailedMetadata> T populateServiceWithArtifacts(T asset, Service service, Map<String, ArtifactDefinition> artifacts) {
258
259         List<ArtifactMetadata> artifactMetaList = populateAssetWithArtifacts(service, artifacts);
260
261         asset.setArtifacts(artifactMetaList);
262
263         return asset;
264     }
265
266     private List<ArtifactMetadata> populateAssetWithArtifacts(Component component, Map<String, ArtifactDefinition> artifacts) {
267         List<ArtifactMetadata> artifactMetaList =  new LinkedList<>();
268         if (artifacts != null) {
269             Collection<ArtifactDefinition> artefactDefList = artifacts.values();
270
271             for (ArtifactDefinition artifactDefinition : artefactDefList) {
272                 if (artifactDefinition.getEsId() != null && !artifactDefinition.getEsId().isEmpty()) {
273                     ArtifactMetadata convertedArtifactMetadata = convertToArtifactMetadata(artifactDefinition, ComponentTypeEnum.findParamByType(component.getComponentType()), component.getUUID(), null);
274                     artifactMetaList.add(convertedArtifactMetadata);
275                 }
276             }
277         }
278         return artifactMetaList.isEmpty() ? null : artifactMetaList;
279     }
280
281     private ArtifactMetadata convertToArtifactMetadata(ArtifactDefinition artifact, String componentType, String componentUUID, String resourceInstanceName) {
282         final String COMPONENT_ARTIFACT_URL = "/sdc/v1/catalog/%s/%s/artifacts/%s";
283
284         final String RESOURCE_INSTANCE_ARTIFACT_URL = "/sdc/v1/catalog/%s/%s/resourceInstances/%s/artifacts/%s";
285
286         ArtifactMetadata metadata = new ArtifactMetadata();
287
288         metadata.setArtifactName(artifact.getArtifactName());
289         metadata.setArtifactType(artifact.getArtifactType());
290
291         if (resourceInstanceName == null || resourceInstanceName.isEmpty()) {
292             metadata.setArtifactURL(String.format(COMPONENT_ARTIFACT_URL, componentType, componentUUID, artifact.getArtifactUUID()));
293         } else {
294             metadata.setArtifactURL(String.format(RESOURCE_INSTANCE_ARTIFACT_URL, componentType, componentUUID, resourceInstanceName, artifact.getArtifactUUID()));
295         }
296
297         metadata.setArtifactDescription(artifact.getDescription());
298         metadata.setArtifactTimeout(artifact.getTimeout() != null && artifact.getTimeout() > 0 ? artifact.getTimeout() : null);
299         metadata.setArtifactChecksum(artifact.getArtifactChecksum());
300         metadata.setArtifactUUID(artifact.getArtifactUUID());
301         metadata.setArtifactVersion(artifact.getArtifactVersion());
302         metadata.setGeneratedFromUUID(artifact.getGeneratedFromId());
303         metadata.setArtifactLabel(artifact.getArtifactLabel());
304         metadata.setArtifactGroupType(artifact.getArtifactGroupType().getType());
305         return metadata;
306     }
307
308     private Either<List<ResourceInstanceMetadata>, StorageOperationStatus> convertToResourceInstanceMetadata(List<ComponentInstance> componentInstances, String componentType, String componentUUID) {
309         List<ResourceInstanceMetadata> retList = new LinkedList<>();
310         Map<String, ImmutablePair<String, String>> uuidDuplicatesMap = new HashMap<>();
311
312         for (ComponentInstance componentInstance : componentInstances) {
313             ResourceInstanceMetadata metadata = new ResourceInstanceMetadata();
314             String componentUid = componentInstance.getComponentUid();
315             String invariantUUID, resourceUUID;
316
317             if (!uuidDuplicatesMap.containsKey(componentUid)) {
318                 Either<Resource, StorageOperationStatus> eitherResource = toscaOperationFacade.getToscaElement(componentInstance.getComponentUid());
319                 if (eitherResource.isRight()) {
320                     log.debug("convertToResourceInstanceMetadata: Failed getting resource with Uid: {}", componentInstance.getComponentUid());
321                     return Either.right(eitherResource.right().value());
322                 } else {
323                     final Resource resource = eitherResource.left().value();
324                     invariantUUID = resource.getInvariantUUID();
325                     resourceUUID = resource.getUUID();
326                     ImmutablePair<String, String> uuidInvariantUUIDPair = new ImmutablePair<>(resourceUUID, invariantUUID);
327                     uuidDuplicatesMap.put(componentUid, uuidInvariantUUIDPair);
328                 }
329             } else {
330                 invariantUUID = uuidDuplicatesMap.get(componentUid).getRight();
331                 resourceUUID =  uuidDuplicatesMap.get(componentUid).getLeft();
332             }
333
334             metadata.setResourceInvariantUUID(invariantUUID);
335             metadata.setResourceUUID(resourceUUID);
336             metadata.setResourceInstanceName(componentInstance.getName());
337             metadata.setResourceName(componentInstance.getComponentName());
338             metadata.setResourceVersion(componentInstance.getComponentVersion());
339             metadata.setResoucreType(componentInstance.getOriginType().getValue());
340
341             if(MapUtils.isNotEmpty(componentInstance.getDeploymentArtifacts())){
342                 LinkedList<ArtifactMetadata> artifactMetaList = new LinkedList<>();
343                 Collection<ArtifactDefinition> values = componentInstance.getDeploymentArtifacts().values();
344                 for (ArtifactDefinition artifactDefinition : values) {
345                     ArtifactMetadata converted = convertToArtifactMetadata(artifactDefinition, componentType, componentUUID, componentInstance.getNormalizedName());
346                     artifactMetaList.add(converted);
347                 }
348                 metadata.setArtifacts(artifactMetaList);
349             }
350             retList.add(metadata);
351         }
352         return Either.left(retList);
353     }
354
355 }