667276db2c0041a3e18075a48f0ce24bb7697671
[sdc.git] /
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 java.util.concurrent.ExecutorService;
24 import java.util.concurrent.RejectedExecutionException;
25
26 import javax.annotation.PreDestroy;
27
28 import org.openecomp.sdc.be.config.ConfigurationManager;
29 import org.openecomp.sdc.be.config.DistributionEngineConfiguration;
30 import org.openecomp.sdc.be.config.DistributionEngineConfiguration.DistributionNotificationTopicConfig;
31 import org.openecomp.sdc.be.impl.ComponentsUtils;
32 import org.openecomp.sdc.be.model.Service;
33 import org.openecomp.sdc.be.model.operations.api.IServiceOperation;
34 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
35 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
36 import org.openecomp.sdc.be.model.operations.impl.ResourceOperation;
37 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
38 import org.openecomp.sdc.common.util.ThreadLocalsHolder;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41 import org.springframework.stereotype.Component;
42
43 @Component("distributionNotificationSender")
44 public class DistributionNotificationSender {
45
46         protected static final String DISTRIBUTION_NOTIFICATION_SENDING = "distributionNotificationSending";
47
48         private static Logger logger = LoggerFactory.getLogger(DistributionNotificationSender.class.getName());
49
50         // final String BASE_ARTIFACT_URL = "/asdc/v1/catalog/services/%s/%s/";
51         // final String RESOURCE_ARTIFACT_URL = BASE_ARTIFACT_URL
52         // + "resources/%s/%s/artifacts/%s";
53         // final String SERVICE_ARTIFACT_URL = BASE_ARTIFACT_URL + "artifacts/%s";
54
55         @javax.annotation.Resource
56         InterfaceLifecycleOperation interfaceLifecycleOperation;
57
58         @javax.annotation.Resource
59         protected IServiceOperation serviceOperation;
60
61         @javax.annotation.Resource
62         protected ResourceOperation resourceOperation;
63
64         @javax.annotation.Resource
65         protected ComponentsUtils componentUtils;
66
67         ExecutorService executorService = null;
68
69         CambriaHandler cambriaHandler = new CambriaHandler();
70
71         NotificationExecutorService notificationExecutorService = new NotificationExecutorService();
72
73         public DistributionNotificationSender() {
74                 super();
75
76                 DistributionNotificationTopicConfig distributionNotificationTopic = ConfigurationManager.getConfigurationManager().getDistributionEngineConfiguration().getDistributionNotificationTopic();
77
78                 executorService = notificationExecutorService.createExcecutorService(distributionNotificationTopic);
79         }
80
81         @PreDestroy
82         public void shutdown() {
83                 logger.debug("Going to close notificationExecutorService");
84                 if (executorService != null) {
85
86                         long maxWaitingTime = ConfigurationManager.getConfigurationManager().getDistributionEngineConfiguration().getDistributionNotificationTopic().getMaxWaitingAfterSendingSeconds();
87
88                         notificationExecutorService.shutdownAndAwaitTermination(executorService, maxWaitingTime + 1);
89                 }
90         }
91
92         public StorageOperationStatus sendNotification(String topicName, String distributionId, DistributionEngineConfiguration deConfiguration, String envName, INotificationData notificationData, Service service, String userId, String modifierName) {
93
94                 Runnable task = new PublishNotificationRunnable(envName, distributionId, service, notificationData, deConfiguration, topicName, userId, modifierName, cambriaHandler, componentUtils, ThreadLocalsHolder.getUuid());
95                 try {
96                         executorService.submit(task);
97                 } catch (RejectedExecutionException e) {
98                         logger.warn("Failed to submit task. Number of threads exceeeds", e);
99                         return StorageOperationStatus.OVERLOAD;
100                 }
101
102                 return StorageOperationStatus.OK;
103         }
104
105         /**
106          * Audit the publishing notification in case of internal server error.
107          * 
108          * @param topicName
109          * @param status
110          * @param distributionId
111          * @param envName
112          */
113         private void auditDistributionNotificationInternalServerError(String topicName, StorageOperationStatus status, String distributionId, String envName) {
114
115                 if (this.componentUtils != null) {
116                         this.componentUtils.auditDistributionNotification(AuditingActionEnum.DISTRIBUTION_NOTIFY, "", " ", "Service", " ", " ", " ", envName, " ", topicName, distributionId, "Error: Internal Server Error. " + status, " ");
117                 }
118         }
119
120         protected CambriaErrorResponse publishNotification(INotificationData data, DistributionEngineConfiguration deConfiguration, String topicName) {
121
122                 CambriaErrorResponse status = cambriaHandler.sendNotification(topicName, deConfiguration.getUebPublicKey(), deConfiguration.getUebSecretKey(), deConfiguration.getUebServers(), data);
123
124                 return status;
125         }
126
127 }