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 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.jsonjanusgraph.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;
41 @org.springframework.stereotype.Component("asset-metadata-utils")
42 public class AssetMetadataConverter {
43 private static final Logger log = Logger.getLogger(DistributionCatalogServlet.class);
46 private ComponentsUtils componentsUtils;
49 protected ToscaOperationFacade toscaOperationFacade;
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()
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<>());
58 List<AssetMetadata> retResList = new LinkedList<>();
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());
65 retResList.add(resMetaData.left().value());
68 return Either.left(retResList);
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);
76 if (resMetaData.isRight()) {
77 return Either.right(resMetaData.right().value());
80 return Either.left(resMetaData.left().value());
85 private Either<? extends AssetMetadata, ResponseFormat> convertToMetadata(ComponentTypeEnum componentType, String serverBaseURL, boolean detailed, Component curr) {
87 switch (componentType) {
91 return generateResourceMeatdata(serverBaseURL, detailed, curr);
95 return generateServiceMetadata(serverBaseURL, detailed, curr);
99 ResponseFormat responseFormat = componentsUtils.getResponseFormatAdditionalProperty(ActionStatus.COMPONENT_INVALID_CATEGORY);
100 return Either.right(responseFormat);
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);
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);
118 return Either.left(metaData);
121 private AssetMetadata createMetadaObject(boolean detailed, ComponentTypeEnum type) {
122 AssetMetadata metaData = null;
126 metaData = new ServiceAssetMetadata();
128 metaData = new ServiceAssetDetailedMetadata();
133 metaData = new ResourceAssetMetadata();
135 metaData = new ResourceAssetDetailedMetadata();
144 private Either<? extends AssetMetadata, ResponseFormat> generateServiceMetadata(String serverBaseURL, boolean detailed, Component curr) {
145 AssetMetadata metaData = createMetadaObject(detailed, curr.getComponentType());
147 metaData = convertToServiceAssetMetadata((ServiceAssetMetadata) metaData, (Service) curr, serverBaseURL, 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);
158 return Either.left(metaData);
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());
167 asset.setToscaModelURL(serverBaseURL + "/" + component.getUUID() + "/toscaModel");
169 String toscaModelUrl = (new String(serverBaseURL)).replace("metadata", "toscaModel");
170 asset.setToscaModelURL(toscaModelUrl);
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());
183 assetToPopulate.setResourceType(resource.getResourceType().name());
184 assetToPopulate.setLifecycleState(resource.getLifecycleState().name());
185 assetToPopulate.setLastUpdaterUserId(resource.getLastUpdaterUserId());
187 return (T) assetToPopulate;
190 private <T extends ServiceAssetMetadata> T convertToServiceAssetMetadata(T assetToPopulate, Service service, String serverBaseURL, boolean detailed) {
191 assetToPopulate = convertToAsset(assetToPopulate, service, serverBaseURL, detailed);
193 if(service.getCategories() != null && !service.getCategories().isEmpty()){
194 CategoryDefinition categoryDefinition = service.getCategories().get(0);
195 assetToPopulate.setCategory(categoryDefinition.getName());
198 assetToPopulate.setLifecycleState(service.getLifecycleState().name());
199 assetToPopulate.setLastUpdaterUserId(service.getLastUpdaterUserId());
200 assetToPopulate.setDistributionStatus(service.getDistributionStatus().name());
202 return (T) assetToPopulate;
205 private <T extends ResourceAssetDetailedMetadata> Either<T, StorageOperationStatus> convertToResourceDetailedMetadata(T assetToPopulate, Resource resource, String serverBaseURL) {
207 List<ComponentInstance> componentInstances = resource.getComponentInstances();
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());
215 assetToPopulate.setResources(resourceInstanceMetadata.left().value());
218 Map<String, ArtifactDefinition> deploymentArtifacts = resource.getDeploymentArtifacts();
219 assetToPopulate = populateResourceWithArtifacts(assetToPopulate, resource, deploymentArtifacts);
221 assetToPopulate.setLastUpdaterFullName(resource.getLastUpdaterFullName());
222 assetToPopulate.setToscaResourceName(resource.getToscaResourceName());
223 assetToPopulate.setDescription(resource.getDescription());
224 return Either.left(assetToPopulate);
227 private <T extends ServiceAssetDetailedMetadata> Either<T, StorageOperationStatus> convertToServiceDetailedMetadata(T assetToPopulate, Service service) {
229 List<ComponentInstance> componentInstances = service.getComponentInstances();
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());
237 assetToPopulate.setResources(resourceInstanceMetadata.left().value());
240 Map<String, ArtifactDefinition> deploymentArtifacts = service.getDeploymentArtifacts();
241 assetToPopulate = populateServiceWithArtifacts(assetToPopulate, service, deploymentArtifacts);
243 assetToPopulate.setLastUpdaterFullName(service.getLastUpdaterFullName());
245 return Either.left(assetToPopulate);
248 private <T extends ResourceAssetDetailedMetadata> T populateResourceWithArtifacts(T asset, Resource resource, Map<String, ArtifactDefinition> artifacts) {
250 List<ArtifactMetadata> artifactMetaList = populateAssetWithArtifacts(resource, artifacts);
252 asset.setArtifacts(artifactMetaList);
257 private <T extends ServiceAssetDetailedMetadata> T populateServiceWithArtifacts(T asset, Service service, Map<String, ArtifactDefinition> artifacts) {
259 List<ArtifactMetadata> artifactMetaList = populateAssetWithArtifacts(service, artifacts);
261 asset.setArtifacts(artifactMetaList);
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();
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);
278 return artifactMetaList.isEmpty() ? null : artifactMetaList;
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";
284 final String RESOURCE_INSTANCE_ARTIFACT_URL = "/sdc/v1/catalog/%s/%s/resourceInstances/%s/artifacts/%s";
286 ArtifactMetadata metadata = new ArtifactMetadata();
288 metadata.setArtifactName(artifact.getArtifactName());
289 metadata.setArtifactType(artifact.getArtifactType());
291 if (resourceInstanceName == null || resourceInstanceName.isEmpty()) {
292 metadata.setArtifactURL(String.format(COMPONENT_ARTIFACT_URL, componentType, componentUUID, artifact.getArtifactUUID()));
294 metadata.setArtifactURL(String.format(RESOURCE_INSTANCE_ARTIFACT_URL, componentType, componentUUID, resourceInstanceName, artifact.getArtifactUUID()));
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());
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<>();
312 for (ComponentInstance componentInstance : componentInstances) {
313 ResourceInstanceMetadata metadata = new ResourceInstanceMetadata();
314 String componentUid = componentInstance.getComponentUid();
315 String invariantUUID, resourceUUID;
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());
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);
330 invariantUUID = uuidDuplicatesMap.get(componentUid).getRight();
331 resourceUUID = uuidDuplicatesMap.get(componentUid).getLeft();
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());
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);
348 metadata.setArtifacts(artifactMetaList);
350 retList.add(metadata);
352 return Either.left(retList);