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.components.distribution.engine;
23 import fj.data.Either;
24 import org.apache.commons.collections.CollectionUtils;
25 import org.apache.commons.collections.MapUtils;
26 import org.openecomp.sdc.be.config.ConfigurationManager;
27 import org.openecomp.sdc.be.model.ArtifactDefinition;
28 import org.openecomp.sdc.be.model.ComponentInstance;
29 import org.openecomp.sdc.be.model.ComponentParametersView;
30 import org.openecomp.sdc.be.model.Resource;
31 import org.openecomp.sdc.be.model.Service;
32 import org.openecomp.sdc.be.model.category.CategoryDefinition;
33 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
34 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
35 import org.openecomp.sdc.be.model.operations.impl.ArtifactOperation;
36 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
37 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
38 import org.openecomp.sdc.common.log.wrappers.Logger;
39 import org.springframework.beans.factory.annotation.Autowired;
40 import org.springframework.stereotype.Component;
42 import java.util.ArrayList;
43 import java.util.List;
45 import java.util.Optional;
46 import java.util.stream.Collectors;
48 @Component("serviceDistributionArtifactsBuilder")
49 public class ServiceDistributionArtifactsBuilder {
51 private static final Logger logger = Logger.getLogger(ServiceDistributionArtifactsBuilder.class.getName());
53 private static final String BASE_ARTIFACT_URL = "/sdc/v1/catalog/services/%s/%s/";
54 private static final String SERVICE_ARTIFACT_URL = BASE_ARTIFACT_URL + "artifacts/%s";
55 private static final String RESOURCE_INSTANCE_ARTIFACT_URL = BASE_ARTIFACT_URL + "resourceInstances/%s/artifacts/%s";
57 @javax.annotation.Resource
58 InterfaceLifecycleOperation interfaceLifecycleOperation;
60 @javax.annotation.Resource
61 ArtifactOperation artifactOperation;
63 private final ToscaOperationFacade toscaOperationFacade;
66 public ServiceDistributionArtifactsBuilder(ToscaOperationFacade toscaOperationFacade) {
67 this.toscaOperationFacade = toscaOperationFacade;
70 public InterfaceLifecycleOperation getInterfaceLifecycleOperation() {
71 return interfaceLifecycleOperation;
74 public void setInterfaceLifecycleOperation(InterfaceLifecycleOperation interfaceLifecycleOperation) {
75 this.interfaceLifecycleOperation = interfaceLifecycleOperation;
78 private String resolveWorkloadContext(String workloadContext) {
79 return workloadContext != null ? workloadContext :
80 ConfigurationManager.getConfigurationManager().getConfiguration().getWorkloadContext();
83 public INotificationData buildResourceInstanceForDistribution(Service service, String distributionId, String workloadContext) {
84 INotificationData notificationData = new NotificationDataImpl();
86 notificationData.setResources(convertRIsToJsonContanier(service));
87 notificationData.setServiceName(service.getName());
88 notificationData.setServiceVersion(service.getVersion());
89 notificationData.setDistributionID(distributionId);
90 notificationData.setServiceUUID(service.getUUID());
91 notificationData.setServiceDescription(service.getDescription());
92 notificationData.setServiceInvariantUUID(service.getInvariantUUID());
93 workloadContext = resolveWorkloadContext(workloadContext);
94 if (workloadContext!=null){
95 notificationData.setWorkloadContext(workloadContext);
97 logger.debug("Before returning notification data object {}", notificationData);
99 return notificationData;
102 public INotificationData buildServiceForDistribution(INotificationData notificationData, Service service) {
104 notificationData.setServiceArtifacts(convertServiceArtifactsToArtifactInfo(service));
106 logger.debug("Before returning notification data object {}", notificationData);
108 return notificationData;
111 private List<ArtifactInfoImpl> convertServiceArtifactsToArtifactInfo(Service service) {
113 Map<String, ArtifactDefinition> serviceArtifactsMap = service.getDeploymentArtifacts();
114 List<ArtifactDefinition> extractedServiceArtifacts = serviceArtifactsMap.values().stream()
115 //filters all artifacts with existing EsId
116 .filter(ArtifactDefinition::checkEsIdExist)
117 //collects all filtered artifacts with existing EsId to List
118 .collect(Collectors.toList());
120 Optional<ArtifactDefinition> toscaTemplateArtifactOptl = exrtactToscaTemplateArtifact(service);
121 if(toscaTemplateArtifactOptl.isPresent()){
122 extractedServiceArtifacts.add(toscaTemplateArtifactOptl.get());
125 Optional<ArtifactDefinition> toscaCsarArtifactOptl = exrtactToscaCsarArtifact(service);
126 if(toscaCsarArtifactOptl.isPresent()){
127 extractedServiceArtifacts.add(toscaCsarArtifactOptl.get());
130 return ArtifactInfoImpl.convertServiceArtifactToArtifactInfoImpl(service, extractedServiceArtifacts);
133 private Optional<ArtifactDefinition> exrtactToscaTemplateArtifact(Service service) {
134 return service.getToscaArtifacts().values().stream()
135 //filters TOSCA_TEMPLATE artifact
136 .filter(e -> e.getArtifactType().equals(ArtifactTypeEnum.TOSCA_TEMPLATE.getType())).findAny();
139 private Optional<ArtifactDefinition> exrtactToscaCsarArtifact(Service service) {
140 return service.getToscaArtifacts().values().stream()
141 //filters TOSCA_CSAR artifact
142 .filter(e -> e.getArtifactType().equals(ArtifactTypeEnum.TOSCA_CSAR.getType())).findAny();
145 private List<JsonContainerResourceInstance> convertRIsToJsonContanier(Service service) {
146 List<JsonContainerResourceInstance> ret = new ArrayList<>();
147 if (service.getComponentInstances() != null) {
148 for (ComponentInstance instance : service.getComponentInstances()) {
149 JsonContainerResourceInstance jsonContainer = new JsonContainerResourceInstance(instance, convertToArtifactsInfoImpl(service, instance));
150 ComponentParametersView filter = new ComponentParametersView();
152 filter.setIgnoreCategories(false);
153 toscaOperationFacade.getToscaElement(instance.getComponentUid(), filter)
155 .bind(r->{fillJsonContainer(jsonContainer, (Resource) r); return Either.left(r);})
157 .forEach(r->logger.debug("Resource {} Invariant UUID & Categories retrieving failed", instance.getComponentUid()));
158 ret.add(jsonContainer);
164 private void fillJsonContainer(JsonContainerResourceInstance jsonContainer, Resource resource) {
165 jsonContainer.setResourceInvariantUUID(resource.getInvariantUUID());
166 setCategories(jsonContainer, resource.getCategories());
169 private List<ArtifactInfoImpl> convertToArtifactsInfoImpl(Service service, ComponentInstance resourceInstance) {
170 List<ArtifactInfoImpl> artifacts = ArtifactInfoImpl.convertToArtifactInfoImpl(service, resourceInstance, getArtifactsWithPayload(resourceInstance));
174 private void setCategories(JsonContainerResourceInstance jsonContainer, List<CategoryDefinition> categories) {
175 if (categories != null) {
176 CategoryDefinition categoryDefinition = categories.get(0);
178 if (categoryDefinition != null) {
179 jsonContainer.setCategory(categoryDefinition.getName());
180 List<SubCategoryDefinition> subcategories = categoryDefinition.getSubcategories();
181 if (null != subcategories) {
182 SubCategoryDefinition subCategoryDefinition = subcategories.get(0);
184 if (subCategoryDefinition != null) {
185 jsonContainer.setSubcategory(subCategoryDefinition.getName());
192 private List<ArtifactDefinition> getArtifactsWithPayload(ComponentInstance resourceInstance) {
193 List<ArtifactDefinition> ret = new ArrayList<>();
195 List<ArtifactDefinition> deployableArtifacts = new ArrayList<>();
196 if (resourceInstance.getDeploymentArtifacts() != null) {
197 deployableArtifacts.addAll(resourceInstance.getDeploymentArtifacts().values());
200 for (ArtifactDefinition artifactDef : deployableArtifacts) {
201 if (artifactDef.checkEsIdExist()) {
202 ret.add(artifactDef);
210 * build the URL for resource instance artifact
213 * @param resourceInstance
214 * @param artifactName
217 public static String buildResourceInstanceArtifactUrl(Service service, ComponentInstance resourceInstance,
218 String artifactName) {
220 String url = String.format(RESOURCE_INSTANCE_ARTIFACT_URL, service.getSystemName(), service.getVersion(),
221 resourceInstance.getNormalizedName(), artifactName);
223 logger.debug("After building artifact url {}", url);
229 * build the URL for resource instance artifact
232 * @param artifactName
235 public static String buildServiceArtifactUrl(Service service, String artifactName) {
237 String url = String.format(SERVICE_ARTIFACT_URL, service.getSystemName(), service.getVersion(), artifactName);
239 logger.debug("After building artifact url {}", url);
246 * Verifies that the service or at least one of its instance contains deployment artifacts
251 public boolean verifyServiceContainsDeploymentArtifacts(Service service) {
252 if (MapUtils.isNotEmpty(service.getDeploymentArtifacts())) {
255 boolean contains = false;
256 List<ComponentInstance> resourceInstances = service.getComponentInstances();
257 if (CollectionUtils.isNotEmpty(resourceInstances)) {
258 contains = resourceInstances.stream().anyMatch(i -> isContainsPayload(i.getDeploymentArtifacts()));
263 private boolean isContainsPayload(Map<String, ArtifactDefinition> deploymentArtifacts) {
264 return deploymentArtifacts != null && deploymentArtifacts.values().stream().anyMatch(ArtifactDefinition::checkEsIdExist);