/*- * ============LICENSE_START======================================================= * SDC * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.openecomp.sdc.be.ecomp.converters; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.openecomp.sdc.be.dao.api.ActionStatus; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; import org.openecomp.sdc.be.distribution.servlet.DistributionCatalogServlet; import org.openecomp.sdc.be.externalapi.servlet.representation.ArtifactMetadata; import org.openecomp.sdc.be.externalapi.servlet.representation.AssetMetadata; import org.openecomp.sdc.be.externalapi.servlet.representation.ResourceAssetDetailedMetadata; import org.openecomp.sdc.be.externalapi.servlet.representation.ResourceAssetMetadata; import org.openecomp.sdc.be.externalapi.servlet.representation.ResourceInstanceMetadata; import org.openecomp.sdc.be.externalapi.servlet.representation.ServiceAssetDetailedMetadata; import org.openecomp.sdc.be.externalapi.servlet.representation.ServiceAssetMetadata; import org.openecomp.sdc.be.impl.ComponentsUtils; import org.openecomp.sdc.be.model.ArtifactDefinition; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.ComponentInstance; import org.openecomp.sdc.be.model.Resource; import org.openecomp.sdc.be.model.Service; import org.openecomp.sdc.be.model.category.CategoryDefinition; import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.exception.ResponseFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import fj.data.Either; @org.springframework.stereotype.Component("asset-metadata-utils") public class AssetMetadataConverter { private static Logger log = LoggerFactory.getLogger(DistributionCatalogServlet.class.getName()); @Autowired private ComponentsUtils componentsUtils; @Autowired protected ToscaOperationFacade toscaOperationFacade; /* * 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() */ public Either, ResponseFormat> convertToAssetMetadata(List componentList, String serverBaseURL, boolean detailed) { if (componentList == null || componentList.isEmpty()) { return Either.left(new LinkedList<>()); } List retResList = new LinkedList<>(); for (Component curr : componentList) { Either resMetaData = convertToSingleAssetMetadata(curr, serverBaseURL, detailed); if (resMetaData.isRight()) { return Either.right(resMetaData.right().value()); } retResList.add(resMetaData.left().value()); } return Either.left(retResList); } public Either convertToSingleAssetMetadata(T component, String serverBaseURL, boolean detailed) { ComponentTypeEnum componentType = component.getComponentType(); Either resMetaData = convertToMetadata(componentType, serverBaseURL, detailed, component); if (resMetaData.isRight()) { return Either.right(resMetaData.right().value()); } else{ return Either.left(resMetaData.left().value()); } } private Either convertToMetadata(ComponentTypeEnum componentType, String serverBaseURL, boolean detailed, Component curr) { switch (componentType) { case RESOURCE: return generateResourceMeatdata(serverBaseURL, detailed, curr); case SERVICE: return generateServiceMetadata(serverBaseURL, detailed, curr); // For future US's that include product /* * case PRODUCT: if (component instanceof Product) { List retResList = new LinkedList<>(); for (Component curr : componentList) { retResList.add(convertToProductAssetMetadata((Product) curr, serverBaseURL)); } return * Either.left(retResList); */ default: ResponseFormat responseFormat = componentsUtils.getResponseFormatAdditionalProperty(ActionStatus.COMPONENT_INVALID_CATEGORY); return Either.right(responseFormat); } } private Either generateResourceMeatdata(String serverBaseURL, boolean detailed, Component curr) { AssetMetadata metaData; metaData = createMetadaObject(detailed, curr.getComponentType()); metaData = convertToResourceMetadata((ResourceAssetMetadata) metaData, (Resource) curr, serverBaseURL, detailed); if (detailed) { Either converted = convertToResourceDetailedMetadata((ResourceAssetDetailedMetadata) metaData, (Resource) curr, serverBaseURL); if (converted.isRight()) { ActionStatus storageResponse = componentsUtils.convertFromStorageResponse(converted.right().value(), ComponentTypeEnum.RESOURCE); ResponseFormat responseFormat = componentsUtils.getResponseFormat(storageResponse); return Either.right(responseFormat); } } return Either.left(metaData); } private AssetMetadata createMetadaObject(boolean detailed, ComponentTypeEnum type) { AssetMetadata metaData = null; switch (type) { case SERVICE: if (!detailed) { metaData = new ServiceAssetMetadata(); } else { metaData = new ServiceAssetDetailedMetadata(); } break; case RESOURCE: if (!detailed) { metaData = new ResourceAssetMetadata(); } else { metaData = new ResourceAssetDetailedMetadata(); } break; default: break; } return metaData; } private Either generateServiceMetadata(String serverBaseURL, boolean detailed, Component curr) { AssetMetadata metaData = createMetadaObject(detailed, curr.getComponentType()); metaData = convertToServiceAssetMetadata((ServiceAssetMetadata) metaData, (Service) curr, serverBaseURL, detailed); if (detailed) { Either converted = convertToServiceDetailedMetadata((ServiceAssetDetailedMetadata) metaData, (Service) curr, serverBaseURL); if (converted.isRight()) { ActionStatus storageResponse = componentsUtils.convertFromStorageResponse(converted.right().value(), ComponentTypeEnum.RESOURCE); ResponseFormat responseFormat = componentsUtils.getResponseFormat(storageResponse); return Either.right(responseFormat); } } return Either.left(metaData); } private U convertToAsset(U asset, T component, String serverBaseURL, boolean detailed) { asset.setUuid(component.getUUID()); asset.setInvariantUUID(component.getInvariantUUID()); asset.setName(component.getName()); asset.setVersion(component.getVersion()); if (!detailed) { asset.setToscaModelURL(serverBaseURL + "/" + component.getUUID() + "/toscaModel"); } else { String toscaModelUrl = (new String(serverBaseURL)).replace("metadata", "toscaModel"); asset.setToscaModelURL(toscaModelUrl); } return asset; } private T convertToResourceMetadata(T assetToPopulate, Resource resource, String serverBaseURL, boolean detailed) { assetToPopulate = convertToAsset(assetToPopulate, resource, serverBaseURL, detailed); if(resource.getCategories() != null && !resource.getCategories().isEmpty()){ CategoryDefinition categoryDefinition = resource.getCategories().get(0); assetToPopulate.setCategory(categoryDefinition.getName()); assetToPopulate.setSubCategory(categoryDefinition.getSubcategories().get(0).getName()); } assetToPopulate.setResourceType(resource.getResourceType().name()); assetToPopulate.setLifecycleState(resource.getLifecycleState().name()); assetToPopulate.setLastUpdaterUserId(resource.getLastUpdaterUserId()); return (T) assetToPopulate; } private T convertToServiceAssetMetadata(T assetToPopulate, Service service, String serverBaseURL, boolean detailed) { assetToPopulate = convertToAsset(assetToPopulate, service, serverBaseURL, detailed); if(service.getCategories() != null && !service.getCategories().isEmpty()){ CategoryDefinition categoryDefinition = service.getCategories().get(0); assetToPopulate.setCategory(categoryDefinition.getName()); } assetToPopulate.setLifecycleState(service.getLifecycleState().name()); assetToPopulate.setLastUpdaterUserId(service.getLastUpdaterUserId()); assetToPopulate.setDistributionStatus(service.getDistributionStatus().name()); return (T) assetToPopulate; } private Either convertToResourceDetailedMetadata(T assetToPopulate, Resource resource, String serverBaseURL) { List componentInstances = resource.getComponentInstances(); if (componentInstances != null) { Either, StorageOperationStatus> resourceInstanceMetadata = convertToResourceInstanceMetadata(componentInstances, ComponentTypeEnum.RESOURCE_PARAM_NAME, resource.getUUID()); if (resourceInstanceMetadata.isRight()) { return Either.right(resourceInstanceMetadata.right().value()); } assetToPopulate.setResources(resourceInstanceMetadata.left().value()); } Map deploymentArtifacts = resource.getDeploymentArtifacts(); assetToPopulate = populateResourceWithArtifacts(assetToPopulate, resource, serverBaseURL, deploymentArtifacts); assetToPopulate.setLastUpdaterFullName(resource.getLastUpdaterFullName()); assetToPopulate.setToscaResourceName(resource.getToscaResourceName()); assetToPopulate.setDescription(resource.getDescription()); return Either.left(assetToPopulate); } private Either convertToServiceDetailedMetadata(T assetToPopulate, Service service, String serverBaseURL) { List componentInstances = service.getComponentInstances(); if (componentInstances != null) { Either, StorageOperationStatus> resourceInstanceMetadata = convertToResourceInstanceMetadata(componentInstances, ComponentTypeEnum.SERVICE_PARAM_NAME, service.getUUID()); if (resourceInstanceMetadata.isRight()) { return Either.right(resourceInstanceMetadata.right().value()); } assetToPopulate.setResources(resourceInstanceMetadata.left().value()); } Map deploymentArtifacts = service.getDeploymentArtifacts(); assetToPopulate = populateServiceWithArtifacts(assetToPopulate, service, deploymentArtifacts); assetToPopulate.setLastUpdaterFullName(service.getLastUpdaterFullName()); return Either.left(assetToPopulate); } private T populateResourceWithArtifacts(T asset, Resource resource, String serverBaseURL, Map artifacts) { List artifactMetaList = populateAssetWithArtifacts(resource, artifacts); asset.setArtifacts(artifactMetaList); return asset; } private T populateServiceWithArtifacts(T asset, Service service, Map artifacts) { List artifactMetaList = populateAssetWithArtifacts(service, artifacts); asset.setArtifacts(artifactMetaList); return asset; } private List populateAssetWithArtifacts(Component component, Map artifacts) { List artifactMetaList = new LinkedList<>(); if (artifacts != null) { Collection artefactDefList = artifacts.values(); for (ArtifactDefinition artifactDefinition : artefactDefList) { if (artifactDefinition.getEsId() != null && !artifactDefinition.getEsId().isEmpty()) { ArtifactMetadata convertedArtifactMetadata = convertToArtifactMetadata(artifactDefinition, ComponentTypeEnum.findParamByType(component.getComponentType()), component.getUUID(), null); artifactMetaList.add(convertedArtifactMetadata); } } } return artifactMetaList.isEmpty() ? null : artifactMetaList; } private ArtifactMetadata convertToArtifactMetadata(ArtifactDefinition artifact, String componentType, String componentUUID, String resourceInstanceName) { // /sdc/v1/catalog/{services/resources}/{componentUUID}/artifacts/{artifactUUID} final String COMPONENT_ARTIFACT_URL = "/sdc/v1/catalog/%s/%s/artifacts/%s"; // /sdc/v1/catalog/{services/resources}/{componentUUID}/resourceInstances/{resourceInstanceName}/artifacts/{artifactUUID} final String RESOURCE_INSTANCE_ARTIFACT_URL = "/sdc/v1/catalog/%s/%s/resourceInstances/%s/artifacts/%s"; ArtifactMetadata metadata = new ArtifactMetadata(); metadata.setArtifactName(artifact.getArtifactName()); metadata.setArtifactType(artifact.getArtifactType()); if (resourceInstanceName == null || resourceInstanceName.isEmpty()) { metadata.setArtifactURL(String.format(COMPONENT_ARTIFACT_URL, componentType, componentUUID, artifact.getArtifactUUID())); } else { metadata.setArtifactURL(String.format(RESOURCE_INSTANCE_ARTIFACT_URL, componentType, componentUUID, resourceInstanceName, artifact.getArtifactUUID())); } metadata.setArtifactDescription(artifact.getDescription()); metadata.setArtifactTimeout(artifact.getTimeout() > 0 ? artifact.getTimeout() : null); metadata.setArtifactChecksum(artifact.getArtifactChecksum()); metadata.setArtifactUUID(artifact.getArtifactUUID()); metadata.setArtifactVersion(artifact.getArtifactVersion()); metadata.setGeneratedFromUUID(artifact.getGeneratedFromId()); metadata.setArtifactLabel(artifact.getArtifactLabel()); metadata.setArtifactGroupType(artifact.getArtifactGroupType().getType()); return metadata; } private Either, StorageOperationStatus> convertToResourceInstanceMetadata(List componentInstances, String componentType, String componentUUID) { List retList = new LinkedList<>(); Map> uuidDuplicatesMap = new HashMap<>(); for (ComponentInstance componentInstance : componentInstances) { ResourceInstanceMetadata metadata = new ResourceInstanceMetadata(); String componentUid = componentInstance.getComponentUid(); String invariantUUID, resourceUUID; if (!uuidDuplicatesMap.containsKey(componentUid)) { Either eitherResource = toscaOperationFacade.getToscaElement(componentInstance.getComponentUid()); if (eitherResource.isRight()) { log.debug("convertToResourceInstanceMetadata: Failed getting resource with Uid: {}", componentInstance.getComponentUid()); return Either.right(eitherResource.right().value()); } else { final Resource resource = eitherResource.left().value(); invariantUUID = resource.getInvariantUUID(); resourceUUID = resource.getUUID(); ImmutablePair uuidInvariantUUIDPair = new ImmutablePair<>(resourceUUID, invariantUUID); uuidDuplicatesMap.put(componentUid, uuidInvariantUUIDPair); } } else { invariantUUID = uuidDuplicatesMap.get(componentUid).getRight(); resourceUUID = uuidDuplicatesMap.get(componentUid).getLeft(); } metadata.setResourceInvariantUUID(invariantUUID); metadata.setResourceUUID(resourceUUID); metadata.setResourceInstanceName(componentInstance.getName()); metadata.setResourceName(componentInstance.getComponentName()); metadata.setResourceVersion(componentInstance.getComponentVersion()); metadata.setResoucreType(componentInstance.getOriginType().getValue()); if(MapUtils.isNotEmpty(componentInstance.getDeploymentArtifacts())){ LinkedList artifactMetaList = new LinkedList<>(); Collection values = componentInstance.getDeploymentArtifacts().values(); for (ArtifactDefinition artifactDefinition : values) { ArtifactMetadata converted = convertToArtifactMetadata(artifactDefinition, componentType, componentUUID, componentInstance.getNormalizedName()); artifactMetaList.add(converted); } metadata.setArtifacts(artifactMetaList); } retList.add(metadata); } return Either.left(retList); } // For future US to support Product /* * private ProductAssetMetadata convertToProductAssetMetadata(Product product, String serverBaseURL) { ProductAssetMetadata retProdAsset = new ProductAssetMetadata(); * * retProdAsset = convertToAsset(retProdAsset, product, serverBaseURL); retProdAsset.setLifecycleState(product.getLifecycleState().name()); retProdAsset.setLastUpdaterUserId(product.getLastUpdaterUserId()); * retProdAsset.setActive(product.getIsActive()); retProdAsset.setContacts(product.getContacts()); * * List categories = product.getCategories(); List categoryMetadataList = new LinkedList<>(); * * if (categories == null || categories.isEmpty()) { return retProdAsset; } else { for (CategoryDefinition categoryDefinition : categories) { String categoryName = categoryDefinition.getName(); List subcategories = * categoryDefinition.getSubcategories(); for (SubCategoryDefinition subCategoryDefinition : subcategories) { String subCategoryName = subCategoryDefinition.getName(); List groups = product.getGroups(); for (GroupDefinition * groupDefinition : groups) { String groupName = groupDefinition.getName(); categoryMetadataList.add(new ProductCategoryGroupMetadata(categoryName, subCategoryName, groupName)); } } } retProdAsset.setProductGroupings(categoryMetadataList); * return retProdAsset; } } */ }