Catalog alignment
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / distribution / engine / ServiceDistributionArtifactsBuilder.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.components.distribution.engine;
22
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;
41
42 import java.util.ArrayList;
43 import java.util.List;
44 import java.util.Map;
45 import java.util.Optional;
46 import java.util.stream.Collectors;
47
48 @Component("serviceDistributionArtifactsBuilder")
49 public class ServiceDistributionArtifactsBuilder {
50
51     private static final Logger logger = Logger.getLogger(ServiceDistributionArtifactsBuilder.class.getName());
52
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";
56
57     @javax.annotation.Resource
58     InterfaceLifecycleOperation interfaceLifecycleOperation;
59
60     @javax.annotation.Resource
61     ArtifactOperation artifactOperation;
62
63     private final ToscaOperationFacade toscaOperationFacade;
64
65     @Autowired
66     public ServiceDistributionArtifactsBuilder(ToscaOperationFacade toscaOperationFacade) {
67         this.toscaOperationFacade = toscaOperationFacade;
68     }
69
70     public InterfaceLifecycleOperation getInterfaceLifecycleOperation() {
71         return interfaceLifecycleOperation;
72     }
73
74     public void setInterfaceLifecycleOperation(InterfaceLifecycleOperation interfaceLifecycleOperation) {
75         this.interfaceLifecycleOperation = interfaceLifecycleOperation;
76     }
77
78     private String resolveWorkloadContext(String workloadContext) {
79         return workloadContext != null ? workloadContext :
80                 ConfigurationManager.getConfigurationManager().getConfiguration().getWorkloadContext();
81     }
82
83     public INotificationData buildResourceInstanceForDistribution(Service service, String distributionId, String workloadContext) {
84         INotificationData notificationData = new NotificationDataImpl();
85
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);
96         }
97         logger.debug("Before returning notification data object {}", notificationData);
98
99         return notificationData;
100     }
101
102     public INotificationData buildServiceForDistribution(INotificationData notificationData, Service service) {
103
104         notificationData.setServiceArtifacts(convertServiceArtifactsToArtifactInfo(service));
105
106         logger.debug("Before returning notification data object {}", notificationData);
107
108         return notificationData;
109     }
110
111     private List<ArtifactInfoImpl> convertServiceArtifactsToArtifactInfo(Service service) {
112
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());
119
120         Optional<ArtifactDefinition> toscaTemplateArtifactOptl = exrtactToscaTemplateArtifact(service);
121         if(toscaTemplateArtifactOptl.isPresent()){
122             extractedServiceArtifacts.add(toscaTemplateArtifactOptl.get());
123         }
124
125         Optional<ArtifactDefinition> toscaCsarArtifactOptl = exrtactToscaCsarArtifact(service);
126         if(toscaCsarArtifactOptl.isPresent()){
127             extractedServiceArtifacts.add(toscaCsarArtifactOptl.get());
128         }
129
130         return ArtifactInfoImpl.convertServiceArtifactToArtifactInfoImpl(service, extractedServiceArtifacts);
131     }
132
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();
137     }
138
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();
143     }
144
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();
151                 filter.disableAll();
152                 filter.setIgnoreCategories(false);
153                 toscaOperationFacade.getToscaElement(instance.getComponentUid(), filter)
154                     .left()
155                     .bind(r->{fillJsonContainer(jsonContainer, (Resource) r); return Either.left(r);})
156                     .right()
157                     .forEach(r->logger.debug("Resource {} Invariant UUID & Categories retrieving failed", instance.getComponentUid()));
158                 ret.add(jsonContainer);
159             }
160         }
161         return ret;
162     }
163
164     private void fillJsonContainer(JsonContainerResourceInstance jsonContainer, Resource resource) {
165         jsonContainer.setResourceInvariantUUID(resource.getInvariantUUID());
166         setCategories(jsonContainer, resource.getCategories());
167     }
168
169     private List<ArtifactInfoImpl> convertToArtifactsInfoImpl(Service service, ComponentInstance resourceInstance) {
170         List<ArtifactInfoImpl> artifacts = ArtifactInfoImpl.convertToArtifactInfoImpl(service, resourceInstance, getArtifactsWithPayload(resourceInstance));
171         return artifacts;
172     }
173
174     private void setCategories(JsonContainerResourceInstance jsonContainer, List<CategoryDefinition> categories) {
175         if (categories != null) {
176             CategoryDefinition categoryDefinition = categories.get(0);
177
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);
183
184                     if (subCategoryDefinition != null) {
185                         jsonContainer.setSubcategory(subCategoryDefinition.getName());
186                     }
187                 }
188             }
189         }
190     }
191
192     private List<ArtifactDefinition> getArtifactsWithPayload(ComponentInstance resourceInstance) {
193         List<ArtifactDefinition> ret = new ArrayList<>();
194
195         List<ArtifactDefinition> deployableArtifacts = new ArrayList<>();
196         if (resourceInstance.getDeploymentArtifacts() != null) {
197             deployableArtifacts.addAll(resourceInstance.getDeploymentArtifacts().values());
198         }
199
200         for (ArtifactDefinition artifactDef : deployableArtifacts) {
201             if (artifactDef.checkEsIdExist()) {
202                 ret.add(artifactDef);
203             }
204         }
205
206         return ret;
207     }
208
209     /**
210      * build the URL for resource instance artifact
211      *
212      * @param    service
213      * @param    resourceInstance
214      * @param    artifactName
215      * @return    URL string
216      */
217     public static String buildResourceInstanceArtifactUrl(Service service, ComponentInstance resourceInstance,
218             String artifactName) {
219
220         String url = String.format(RESOURCE_INSTANCE_ARTIFACT_URL, service.getSystemName(), service.getVersion(),
221                 resourceInstance.getNormalizedName(), artifactName);
222
223         logger.debug("After building artifact url {}", url);
224
225         return url;
226     }
227
228     /**
229      * build the URL for resource instance artifact
230      *
231      * @param    service
232      * @param    artifactName
233      * @return    URL string
234      */
235     public static String buildServiceArtifactUrl(Service service, String artifactName) {
236
237         String url = String.format(SERVICE_ARTIFACT_URL, service.getSystemName(), service.getVersion(), artifactName);
238
239         logger.debug("After building artifact url {}", url);
240
241         return url;
242
243     }
244
245     /**
246      * Verifies that the service or at least one of its instance contains deployment artifacts
247      *
248      * @param    the service
249      * @return    boolean
250      */
251     public boolean verifyServiceContainsDeploymentArtifacts(Service service) {
252         if (MapUtils.isNotEmpty(service.getDeploymentArtifacts())) {
253             return true;
254         }
255         boolean contains = false;
256         List<ComponentInstance> resourceInstances = service.getComponentInstances();
257         if (CollectionUtils.isNotEmpty(resourceInstances)) {
258             contains = resourceInstances.stream().anyMatch(i -> isContainsPayload(i.getDeploymentArtifacts()));
259         }
260         return contains;
261     }
262
263     private boolean isContainsPayload(Map<String, ArtifactDefinition> deploymentArtifacts) {
264        return deploymentArtifacts != null && deploymentArtifacts.values().stream().anyMatch(ArtifactDefinition::checkEsIdExist);
265     }
266
267 }