1027c8a18bdc4c4bce73b3c1a0efd56da5040931
[so.git] / adapters / mso-requests-db-adapter / src / main / java / org / onap / so / adapters / requestsdb / MsoRequestsDbAdapterImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (C) 2018 IBM.
8  * Modifications Copyright (c) 2019 Samsung
9  * ================================================================================
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  * 
14  *      http://www.apache.org/licenses/LICENSE-2.0
15  * 
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  * ============LICENSE_END=========================================================
22  */
23
24 package org.onap.so.adapters.requestsdb;
25
26 import java.sql.Timestamp;
27 import java.util.List;
28
29 import javax.jws.WebService;
30 import javax.transaction.Transactional;
31 import org.onap.so.adapters.requestsdb.exceptions.MsoRequestsDbException;
32 import org.onap.so.db.request.beans.InfraActiveRequests;
33 import org.onap.so.db.request.beans.OperationStatus;
34 import org.onap.so.db.request.beans.ResourceOperationStatus;
35 import org.onap.so.db.request.beans.ResourceOperationStatusId;
36 import org.onap.so.db.request.beans.SiteStatus;
37 import org.onap.so.db.request.data.repository.InfraActiveRequestsRepository;
38 import org.onap.so.db.request.data.repository.OperationStatusRepository;
39 import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository;
40 import org.onap.so.db.request.data.repository.SiteStatusRepository;
41 import org.onap.so.logger.MsoLogger;
42 import org.onap.so.requestsdb.RequestsDbConstant;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45 import org.springframework.beans.factory.annotation.Autowired;
46 import org.springframework.context.annotation.Primary;
47 import org.springframework.stereotype.Component;
48
49 @WebService(serviceName = "RequestsDbAdapter", endpointInterface = "org.onap.so.adapters.requestsdb.MsoRequestsDbAdapter", targetNamespace = "http://org.onap.so/requestsdb")
50 @Component
51 @Primary
52 public class MsoRequestsDbAdapterImpl implements MsoRequestsDbAdapter { 
53
54         private static Logger logger = LoggerFactory.getLogger(MsoRequestsDbAdapterImpl.class);
55         
56         @Autowired
57         private InfraActiveRequestsRepository infraActive;
58
59         @Autowired
60         private SiteStatusRepository siteRepo;
61
62         @Autowired
63         private OperationStatusRepository operationStatusRepository;
64
65         @Autowired
66         private ResourceOperationStatusRepository resourceOperationStatusRepository;
67
68         @Transactional
69         @Override
70         public void updateInfraRequest(String requestId, String lastModifiedBy, String statusMessage, String responseBody,
71                         RequestStatusType requestStatus, String progress, String vnfOutputs, String serviceInstanceId,
72                         String networkId, String vnfId, String vfModuleId, String volumeGroupId, String serviceInstanceName,
73                         String configurationId, String configurationName, String vfModuleName) throws MsoRequestsDbException {
74                 try {
75                         InfraActiveRequests request = infraActive.findOneByRequestIdOrClientRequestId(requestId, requestId);
76                         if (request == null) {
77                                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
78                                 throw new MsoRequestsDbException(error);
79                         }
80                         if (statusMessage != null) {
81                                 request.setStatusMessage(statusMessage);
82                         }
83                         if (responseBody != null) {
84                                 request.setResponseBody(responseBody);
85                         }
86                         if (requestStatus != null) {
87                                 request.setRequestStatus(requestStatus.toString());
88                         }
89                         if (progress != null) {
90                                 setProgress(progress, request);
91                         }
92                         if (vnfOutputs != null) {
93                                 request.setVnfOutputs(vnfOutputs);
94                         }
95                         if (serviceInstanceId != null) {
96                                 request.setServiceInstanceId(serviceInstanceId);
97                         }
98                         if (networkId != null) {
99                                 request.setNetworkId(networkId);
100                         }
101                         if (vnfId != null) {
102                                 request.setVnfId(vnfId);
103                         }
104                         if (vfModuleId != null) {
105                                 request.setVfModuleId(vfModuleId);
106                         }
107                         if (volumeGroupId != null) {
108                                 request.setVolumeGroupId(volumeGroupId);
109                         }
110                         if (serviceInstanceName != null) {
111                                 request.setServiceInstanceName(serviceInstanceName);
112                         }
113                         if (vfModuleName != null) {
114                                 request.setVfModuleName(vfModuleName);
115                         }
116                         if (configurationId != null) {
117                                 request.setConfigurationId(configurationId);
118                         }
119                         if (configurationName != null) {
120                                 request.setConfigurationName(configurationName);
121                         }
122                         if (requestStatus == RequestStatusType.COMPLETE || requestStatus == RequestStatusType.FAILED) {
123                                 Timestamp nowTimeStamp = new Timestamp(System.currentTimeMillis());
124                                 request.setEndTime(nowTimeStamp);
125                         }
126                         request.setLastModifiedBy(lastModifiedBy);
127                         infraActive.save(request);
128                 } catch (Exception e) {
129                         String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
130                         logger.error(error, e);
131                         throw new MsoRequestsDbException(error, MsoLogger.ErrorCode.BusinessProcesssError, e);
132                 }
133         }
134
135         private void setProgress(String progress, InfraActiveRequests request) {
136                 try {
137                         request.setProgress(Long.parseLong(progress));
138                 } catch (NumberFormatException e) {
139                         logger.warn("UpdateInfraRequest", "Invalid value sent for progress");
140                 }
141         }
142
143         @Override
144         @Transactional
145         public InfraActiveRequests getInfraRequest(String requestId) throws MsoRequestsDbException {            
146                 logger.debug("Call to MSO Infra RequestsDb adapter get method with request Id: {}", requestId);
147                 InfraActiveRequests request = null;
148                 try {
149                         request = infraActive.findOneByRequestIdOrClientRequestId(requestId, requestId);
150                         if (request == null) {
151                                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
152                                 throw new MsoRequestsDbException(error);
153                         }
154                 } catch (Exception e) {
155                         String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
156                         logger.error(error,e);
157                         throw new MsoRequestsDbException(error,MsoLogger.ErrorCode.BusinessProcesssError , e);
158                 }
159                 return request;
160         }
161
162         /**
163          * Get SiteStatus by SiteName.
164          *
165          * @param siteName
166          *            The unique name of the site
167          * @return Status of that site
168          */
169         @Override
170         @Transactional
171         public boolean getSiteStatus(String siteName) {
172                 SiteStatus siteStatus;
173                 logger.debug("Request database - get Site Status with Site name: {}", siteName);
174                 siteStatus = siteRepo.findOneBySiteName(siteName);
175                 if (siteStatus == null) {
176                         // if not exist in DB, it means the site is not disabled, thus
177                         // return true
178                         return true;
179                 } else {                        
180                         return siteStatus.getStatus();
181                 }
182         }
183
184         /**
185          * update operation status <br>
186          * 
187          * @param serviceId
188          * @param operationId
189          * @param operationType
190          * @param userId
191          * @param result
192          * @param operationContent
193          * @param progress
194          * @param reason
195          * @throws MsoRequestsDbException
196          * @since ONAP Amsterdam Release
197          */
198         @Override
199         @Transactional
200         public void updateServiceOperationStatus(String serviceId, String operationId, String operationType, String userId,
201                         String result, String operationContent, String progress, String reason) throws MsoRequestsDbException {
202                 OperationStatus operStatus = operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
203                 if (operStatus == null) {
204                         String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId + " operationId: "
205                                         + operationId;
206                         logger.error(error);
207                         operStatus = new OperationStatus();
208                         operStatus.setOperationId(operationId);
209                         operStatus.setServiceId(serviceId);
210                 }
211
212                 operStatus.setUserId(userId);
213                 operStatus.setOperation(operationType);
214                 operStatus.setReason(reason);
215                 operStatus.setProgress(progress);
216                 operStatus.setResult(result);
217                 operStatus.setOperationContent(operationContent);
218                 operStatus.setResult(result);
219                 operationStatusRepository.save(operStatus);
220         }
221
222         /**
223          * Init operation status <br>
224          *
225          * @param serviceId
226          * @param operationId
227          * @param operationType
228          * @param userId
229          * @param result
230          * @param operationContent
231          * @param progress
232          * @param reason
233          * @throws MsoRequestsDbException
234          * @since ONAP Casablanca Release
235          */
236         @Override
237         @Transactional
238         public void initServiceOperationStatus(String serviceId, String operationId, String operationType, String userId,
239                                                                                          String result, String operationContent, String progress, String reason) throws MsoRequestsDbException {
240                 OperationStatus operStatus = new OperationStatus();
241
242                 operStatus.setOperationId(operationId);
243                 operStatus.setServiceId(serviceId);
244                 operStatus.setUserId(userId);
245                 operStatus.setOperation(operationType);
246                 operStatus.setReason(reason);
247                 operStatus.setProgress(progress);
248                 operStatus.setResult(result);
249                 operStatus.setOperationContent(operationContent);
250                 operStatus.setResult(result);
251                 operationStatusRepository.save(operStatus);
252         }
253
254         /**
255          * init the operation status of all the resources <br>
256          * 
257          * @param serviceId
258          *            the service Id
259          * @param operationId
260          *            the operation Id
261          * @param operationType
262          *            the operationType
263          * @param resourceTemplateUUIDs
264          *            the resources, the UUID is split by ":"
265          * @throws MsoRequestsDbException
266          * @since ONAP Amsterdam Release
267          */
268         @Override
269         @Transactional
270         public void initResourceOperationStatus(String serviceId, String operationId, String operationType,
271                         String resourceTemplateUUIDs) throws MsoRequestsDbException {
272                 String[] resourceLst = resourceTemplateUUIDs.split(":");
273                 for (String resource : resourceLst) {
274                         if ("".equals(resource)) {
275                                 continue;
276                         }
277                         ResourceOperationStatus resourceStatus = new ResourceOperationStatus();
278                         resourceStatus.setOperationId(operationId);
279                         resourceStatus.setServiceId(serviceId);
280                         resourceStatus.setResourceTemplateUUID(resource);
281                         resourceStatus.setOperType(operationType);
282                         resourceStatus.setStatus(RequestsDbConstant.Status.PROCESSING);
283                         resourceStatus.setStatusDescription("Waiting for start");
284                         resourceOperationStatusRepository.save(resourceStatus);
285
286                 }
287         }
288
289         /**
290          * get resource operation status <br>
291          * 
292          * @param serviceId
293          * @param operationId
294          * @param resourceTemplateUUID
295          * @return
296          * @throws MsoRequestsDbException
297          * @since ONAP Amsterdam Release
298          */
299         @Override
300         public ResourceOperationStatus getResourceOperationStatus(String serviceId, String operationId,
301                         String resourceTemplateUUID) throws MsoRequestsDbException {
302
303                 return resourceOperationStatusRepository
304                                 .findById(new ResourceOperationStatusId(serviceId, operationId, resourceTemplateUUID)).
305                                 orElseThrow( () -> new MsoRequestsDbException("Operation not found:" + operationId));
306                                 
307         }
308
309         /**
310          * update resource operation status <br>
311          * 
312          * @param serviceId
313          * @param operationId
314          * @param resourceTemplateUUID
315          * @param operationType
316          * @param resourceInstanceID
317          * @param jobId
318          * @param status
319          * @param progress
320          * @param errorCode
321          * @param statusDescription
322          * @throws MsoRequestsDbException
323          * @since ONAP Amsterdam Release
324          */
325         @Override
326         public void updateResourceOperationStatus(String serviceId, String operationId, String resourceTemplateUUID,
327                         String operationType, String resourceInstanceID, String jobId, String status, String progress,
328                         String errorCode, String statusDescription) throws MsoRequestsDbException {
329                 ResourceOperationStatus resStatus = new ResourceOperationStatus();
330                 resStatus.setServiceId(serviceId);
331                 resStatus.setOperationId(operationId);
332                 resStatus.setResourceTemplateUUID(resourceTemplateUUID);
333                 resStatus.setOperType(operationType);
334                 resStatus.setResourceInstanceID(resourceInstanceID);
335                 resStatus.setJobId(jobId);
336                 resStatus.setStatus(status);
337                 resStatus.setProgress(progress);
338                 resStatus.setErrorCode(errorCode);
339                 resStatus.setStatusDescription(statusDescription);
340                 resourceOperationStatusRepository.save(resStatus);
341                 
342                 updateOperationStatusBasedOnResourceStatus(resStatus);
343         }
344         
345     /**
346      * update service operation status when a operation resource status updated
347      * <br>
348      * 
349      * @param operStatus the resource operation status
350      * @since ONAP Amsterdam Release
351      */
352     private void updateOperationStatusBasedOnResourceStatus(ResourceOperationStatus operStatus) {
353         String serviceId = operStatus.getServiceId();
354         String operationId = operStatus.getOperationId();
355
356         logger.debug("Request database - update Operation Status Based On Resource Operation Status with service Id: "
357                                         + "{}, operationId: {}", serviceId, operationId);
358         
359         List<ResourceOperationStatus> lstResourceStatus = resourceOperationStatusRepository.findByServiceIdAndOperationId(serviceId, operationId);
360                 if (lstResourceStatus == null) {
361                         logger.error("Unable to retrieve resourceOperStatus Object by ServiceId: {} operationId: {}", serviceId,
362                                 operationId);
363                         return;
364                 }
365                 
366                 // count the total progress
367         int resourceCount = lstResourceStatus.size();
368         int progress = 0;
369         boolean isFinished = true;
370         for (ResourceOperationStatus lstResourceStatu : lstResourceStatus) {
371             progress = progress + Integer.valueOf(lstResourceStatu.getProgress()) / resourceCount;
372             if (RequestsDbConstant.Status.PROCESSING.equals(lstResourceStatu.getStatus())) {
373                 isFinished = false;
374             }
375         }
376         
377         OperationStatus serviceOperStatus = operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
378                 if (serviceOperStatus == null) {
379                         String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId + " operationId: "
380                                         + operationId;
381                         logger.error(error);
382                         
383                         serviceOperStatus = new OperationStatus();
384                         serviceOperStatus.setOperationId(operationId);
385                         serviceOperStatus.setServiceId(serviceId);
386                 }
387         
388         progress = progress > 100 ? 100 : progress;
389         serviceOperStatus.setProgress(String.valueOf(progress));
390         serviceOperStatus.setOperationContent(operStatus.getStatusDescription());
391         // if current resource failed. service failed.
392         if(RequestsDbConstant.Status.ERROR.equals(operStatus.getStatus())) {
393             serviceOperStatus.setResult(RequestsDbConstant.Status.ERROR);
394             serviceOperStatus.setReason(operStatus.getStatusDescription());
395         } else if(isFinished) {
396             // if finished
397             serviceOperStatus.setResult(RequestsDbConstant.Status.FINISHED);
398             serviceOperStatus.setProgress(RequestsDbConstant.Progress.ONE_HUNDRED);
399         }
400
401         operationStatusRepository.save(serviceOperStatus);
402     }
403 }