2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.be.ecomp.converters;
23 import java.util.Collection;
24 import java.util.HashMap;
25 import java.util.LinkedList;
26 import java.util.List;
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;
55 import fj.data.Either;
57 @org.springframework.stereotype.Component("asset-metadata-utils")
58 public class AssetMetadataConverter {
59 private static Logger log = LoggerFactory.getLogger(DistributionCatalogServlet.class.getName());
62 private ComponentsUtils componentsUtils;
65 protected ToscaOperationFacade toscaOperationFacade;
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()
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<>());
74 List<AssetMetadata> retResList = new LinkedList<>();
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());
81 retResList.add(resMetaData.left().value());
84 return Either.left(retResList);
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);
92 if (resMetaData.isRight()) {
93 return Either.right(resMetaData.right().value());
96 return Either.left(resMetaData.left().value());
101 private Either<? extends AssetMetadata, ResponseFormat> convertToMetadata(ComponentTypeEnum componentType, String serverBaseURL, boolean detailed, Component curr) {
103 switch (componentType) {
107 return generateResourceMeatdata(serverBaseURL, detailed, curr);
111 return generateServiceMetadata(serverBaseURL, detailed, curr);
113 // For future US's that include product
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);
120 ResponseFormat responseFormat = componentsUtils.getResponseFormatAdditionalProperty(ActionStatus.COMPONENT_INVALID_CATEGORY);
121 return Either.right(responseFormat);
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);
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);
139 return Either.left(metaData);
142 private AssetMetadata createMetadaObject(boolean detailed, ComponentTypeEnum type) {
143 AssetMetadata metaData = null;
147 metaData = new ServiceAssetMetadata();
149 metaData = new ServiceAssetDetailedMetadata();
154 metaData = new ResourceAssetMetadata();
156 metaData = new ResourceAssetDetailedMetadata();
165 private Either<? extends AssetMetadata, ResponseFormat> generateServiceMetadata(String serverBaseURL, boolean detailed, Component curr) {
166 AssetMetadata metaData = createMetadaObject(detailed, curr.getComponentType());
168 metaData = convertToServiceAssetMetadata((ServiceAssetMetadata) metaData, (Service) curr, serverBaseURL, 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);
179 return Either.left(metaData);
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());
188 asset.setToscaModelURL(serverBaseURL + "/" + component.getUUID() + "/toscaModel");
190 String toscaModelUrl = (new String(serverBaseURL)).replace("metadata", "toscaModel");
191 asset.setToscaModelURL(toscaModelUrl);
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());
205 assetToPopulate.setResourceType(resource.getResourceType().name());
206 assetToPopulate.setLifecycleState(resource.getLifecycleState().name());
207 assetToPopulate.setLastUpdaterUserId(resource.getLastUpdaterUserId());
209 return (T) assetToPopulate;
212 private <T extends ServiceAssetMetadata> T convertToServiceAssetMetadata(T assetToPopulate, Service service, String serverBaseURL, boolean detailed) {
213 assetToPopulate = convertToAsset(assetToPopulate, service, serverBaseURL, detailed);
215 CategoryDefinition categoryDefinition = service.getCategories().iterator().next();
217 assetToPopulate.setCategory(categoryDefinition.getName());
218 assetToPopulate.setLifecycleState(service.getLifecycleState().name());
219 assetToPopulate.setLastUpdaterUserId(service.getLastUpdaterUserId());
220 assetToPopulate.setDistributionStatus(service.getDistributionStatus().name());
222 return (T) assetToPopulate;
225 private <T extends ResourceAssetDetailedMetadata> Either<T, StorageOperationStatus> convertToResourceDetailedMetadata(T assetToPopulate, Resource resource, String serverBaseURL) {
227 List<ComponentInstance> componentInstances = resource.getComponentInstances();
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());
235 assetToPopulate.setResources(resourceInstanceMetadata.left().value());
238 Map<String, ArtifactDefinition> deploymentArtifacts = resource.getDeploymentArtifacts();
239 assetToPopulate = populateResourceWithArtifacts(assetToPopulate, resource, serverBaseURL, deploymentArtifacts);
241 assetToPopulate.setLastUpdaterFullName(resource.getLastUpdaterFullName());
242 assetToPopulate.setToscaResourceName(resource.getToscaResourceName());
243 assetToPopulate.setDescription(resource.getDescription());
244 return Either.left(assetToPopulate);
247 private <T extends ServiceAssetDetailedMetadata> Either<T, StorageOperationStatus> convertToServiceDetailedMetadata(T assetToPopulate, Service service, String serverBaseURL) {
249 List<ComponentInstance> componentInstances = service.getComponentInstances();
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());
257 assetToPopulate.setResources(resourceInstanceMetadata.left().value());
260 Map<String, ArtifactDefinition> deploymentArtifacts = service.getDeploymentArtifacts();
261 assetToPopulate = populateServiceWithArtifacts(assetToPopulate, service, deploymentArtifacts);
263 assetToPopulate.setLastUpdaterFullName(service.getLastUpdaterFullName());
265 return Either.left(assetToPopulate);
268 private <T extends ResourceAssetDetailedMetadata> T populateResourceWithArtifacts(T asset, Resource resource, String serverBaseURL, Map<String, ArtifactDefinition> artifacts) {
270 List<ArtifactMetadata> artifactMetaList = populateAssetWithArtifacts(resource, artifacts);
272 asset.setArtifacts(artifactMetaList);
277 private <T extends ServiceAssetDetailedMetadata> T populateServiceWithArtifacts(T asset, Service service, Map<String, ArtifactDefinition> artifacts) {
279 List<ArtifactMetadata> artifactMetaList = populateAssetWithArtifacts(service, artifacts);
281 asset.setArtifacts(artifactMetaList);
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();
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);
298 return artifactMetaList.isEmpty() ? null : artifactMetaList;
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";
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";
308 ArtifactMetadata metadata = new ArtifactMetadata();
310 metadata.setArtifactName(artifact.getArtifactName());
311 metadata.setArtifactType(artifact.getArtifactType());
313 if (resourceInstanceName == null || resourceInstanceName.isEmpty()) {
314 metadata.setArtifactURL(String.format(COMPONENT_ARTIFACT_URL, componentType, componentUUID, artifact.getArtifactUUID()));
316 metadata.setArtifactURL(String.format(RESOURCE_INSTANCE_ARTIFACT_URL, componentType, componentUUID, resourceInstanceName, artifact.getArtifactUUID()));
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());
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<>();
334 for (ComponentInstance componentInstance : componentInstances) {
335 ResourceInstanceMetadata metadata = new ResourceInstanceMetadata();
336 String componentUid = componentInstance.getComponentUid();
337 String invariantUUID, resourceUUID;
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());
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);
352 invariantUUID = uuidDuplicatesMap.get(componentUid).getRight();
353 resourceUUID = uuidDuplicatesMap.get(componentUid).getLeft();
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());
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);
370 metadata.setArtifacts(artifactMetaList);
372 retList.add(metadata);
374 return Either.left(retList);
377 // For future US to support Product
379 * private ProductAssetMetadata convertToProductAssetMetadata(Product product, String serverBaseURL) { ProductAssetMetadata retProdAsset = new ProductAssetMetadata();
381 * retProdAsset = convertToAsset(retProdAsset, product, serverBaseURL); retProdAsset.setLifecycleState(product.getLifecycleState().name()); retProdAsset.setLastUpdaterUserId(product.getLastUpdaterUserId());
382 * retProdAsset.setActive(product.getIsActive()); retProdAsset.setContacts(product.getContacts());
384 * List<CategoryDefinition> categories = product.getCategories(); List<ProductCategoryGroupMetadata> categoryMetadataList = new LinkedList<>();
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; } }