Merge 'origin/casablanca' into master
[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  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  * 
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  * 
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.so.adapters.requestsdb;
24
25 import java.sql.Timestamp;
26 import java.util.List;
27
28 import javax.jws.WebService;
29 import javax.transaction.Transactional;
30 import org.onap.so.adapters.requestsdb.exceptions.MsoRequestsDbException;
31 import org.onap.so.db.request.beans.InfraActiveRequests;
32 import org.onap.so.db.request.beans.OperationStatus;
33 import org.onap.so.db.request.beans.ResourceOperationStatus;
34 import org.onap.so.db.request.beans.ResourceOperationStatusId;
35 import org.onap.so.db.request.beans.SiteStatus;
36 import org.onap.so.db.request.data.repository.InfraActiveRequestsRepository;
37 import org.onap.so.db.request.data.repository.OperationStatusRepository;
38 import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository;
39 import org.onap.so.db.request.data.repository.SiteStatusRepository;
40 import org.onap.so.logger.MsoLogger;
41 import org.onap.so.requestsdb.RequestsDbConstant;
42 import org.onap.so.utils.UUIDChecker;
43 import org.springframework.beans.factory.annotation.Autowired;
44 import org.springframework.context.annotation.Primary;
45 import org.springframework.stereotype.Component;
46
47 @WebService(serviceName = "RequestsDbAdapter", endpointInterface = "org.onap.so.adapters.requestsdb.MsoRequestsDbAdapter", targetNamespace = "http://org.onap.so/requestsdb")
48 @Component
49 @Primary
50 public class MsoRequestsDbAdapterImpl implements MsoRequestsDbAdapter { 
51
52         private static MsoLogger logger = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA, MsoRequestsDbAdapterImpl.class);
53         
54         @Autowired
55         private InfraActiveRequestsRepository infraActive;
56
57         @Autowired
58         private SiteStatusRepository siteRepo;
59
60         @Autowired
61         private OperationStatusRepository operationStatusRepository;
62
63         @Autowired
64         private ResourceOperationStatusRepository resourceOperationStatusRepository;
65
66         @Transactional
67         @Override
68         public void updateInfraRequest(String requestId, String lastModifiedBy, String statusMessage, String responseBody,
69                         RequestStatusType requestStatus, String progress, String vnfOutputs, String serviceInstanceId,
70                         String networkId, String vnfId, String vfModuleId, String volumeGroupId, String serviceInstanceName,
71                         String configurationId, String configurationName, String vfModuleName) throws MsoRequestsDbException {
72                 try {
73                         InfraActiveRequests request = infraActive.findOneByRequestIdOrClientRequestId(requestId, requestId);
74                         if (request == null) {
75                                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
76                                 throw new MsoRequestsDbException(error);
77                         }
78                         if (statusMessage != null) {
79                                 request.setStatusMessage(statusMessage);
80                         }
81                         if (responseBody != null) {
82                                 request.setResponseBody(responseBody);
83                         }
84                         if (requestStatus != null) {
85                                 request.setRequestStatus(requestStatus.toString());
86                         }
87                         if (progress != null) {
88                                 setProgress(progress, request);
89                         }
90                         if (vnfOutputs != null) {
91                                 request.setVnfOutputs(vnfOutputs);
92                         }
93                         if (serviceInstanceId != null) {
94                                 request.setServiceInstanceId(serviceInstanceId);
95                         }
96                         if (networkId != null) {
97                                 request.setNetworkId(networkId);
98                         }
99                         if (vnfId != null) {
100                                 request.setVnfId(vnfId);
101                         }
102                         if (vfModuleId != null) {
103                                 request.setVfModuleId(vfModuleId);
104                         }
105                         if (volumeGroupId != null) {
106                                 request.setVolumeGroupId(volumeGroupId);
107                         }
108                         if (serviceInstanceName != null) {
109                                 request.setServiceInstanceName(serviceInstanceName);
110                         }
111                         if (vfModuleName != null) {
112                                 request.setVfModuleName(vfModuleName);
113                         }
114                         if (configurationId != null) {
115                                 request.setConfigurationId(configurationId);
116                         }
117                         if (configurationName != null) {
118                                 request.setConfigurationName(configurationName);
119                         }
120                         if (requestStatus == RequestStatusType.COMPLETE || requestStatus == RequestStatusType.FAILED) {
121                                 Timestamp nowTimeStamp = new Timestamp(System.currentTimeMillis());
122                                 request.setEndTime(nowTimeStamp);
123                         }
124                         request.setLastModifiedBy(lastModifiedBy);
125                         infraActive.save(request);
126                 } catch (Exception e) {
127                         String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
128                         logger.error(error, e);
129                         throw new MsoRequestsDbException(error, MsoLogger.ErrorCode.BusinessProcesssError, e);
130                 }
131         }
132
133         private void setProgress(String progress, InfraActiveRequests request) {
134                 try {
135                         request.setProgress(Long.parseLong(progress));
136                 } catch (NumberFormatException e) {
137                         logger.warnSimple("UpdateInfraRequest", "Invalid value sent for progress");
138                 }
139         }
140
141         @Override
142         @Transactional
143         public InfraActiveRequests getInfraRequest(String requestId) throws MsoRequestsDbException {            
144                 logger.debug("Call to MSO Infra RequestsDb adapter get method with request Id: " + requestId);
145                 InfraActiveRequests request = null;
146                 try {
147                         request = infraActive.findOneByRequestIdOrClientRequestId(requestId, requestId);
148                         if (request == null) {
149                                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
150                                 throw new MsoRequestsDbException(error);
151                         }
152                 } catch (Exception e) {
153                         String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
154                         logger.error(error,e);
155                         throw new MsoRequestsDbException(error,MsoLogger.ErrorCode.BusinessProcesssError , e);
156                 }
157                 return request;
158         }
159
160         /**
161          * Get SiteStatus by SiteName.
162          *
163          * @param siteName
164          *            The unique name of the site
165          * @return Status of that site
166          */
167         @Override
168         @Transactional
169         public boolean getSiteStatus(String siteName) {
170                 UUIDChecker.generateUUID(logger);
171                 SiteStatus siteStatus;
172                 logger.debug("Request database - get Site Status with Site name:" + siteName);
173                 siteStatus = siteRepo.findOneBySiteName(siteName);
174                 if (siteStatus == null) {
175                         // if not exist in DB, it means the site is not disabled, thus
176                         // return true
177                         return true;
178                 } else {                        
179                         return siteStatus.getStatus();
180                 }
181         }
182
183         /**
184          * update operation status <br>
185          * 
186          * @param serviceId
187          * @param operationId
188          * @param operationType
189          * @param userId
190          * @param result
191          * @param operationContent
192          * @param progress
193          * @param reason
194          * @throws MsoRequestsDbException
195          * @since ONAP Amsterdam Release
196          */
197         @Override
198         @Transactional
199         public void updateServiceOperationStatus(String serviceId, String operationId, String operationType, String userId,
200                         String result, String operationContent, String progress, String reason) throws MsoRequestsDbException {
201                 OperationStatus operStatus = operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
202                 if (operStatus == null) {
203                         String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId + " operationId: "
204                                         + operationId;
205                         logger.error(error);
206 //                      throw new MsoRequestsDbException(error,MsoLogger.ErrorCode.BusinessProcesssError);
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                 + serviceId + ", operationId:" + operationId);
358         
359         List<ResourceOperationStatus> lstResourceStatus = resourceOperationStatusRepository.findByServiceIdAndOperationId(serviceId, operationId);
360                 if (lstResourceStatus == null) {
361                         logger.error("Unable to retrieve resourceOperStatus Object by ServiceId: " + serviceId + " operationId: " + operationId);
362                         return;
363                 }
364                 
365                 // count the total progress
366         int resourceCount = lstResourceStatus.size();
367         int progress = 0;
368         boolean isFinished = true;
369         for (ResourceOperationStatus lstResourceStatu : lstResourceStatus) {
370             progress = progress + Integer.valueOf(lstResourceStatu.getProgress()) / resourceCount;
371             if (RequestsDbConstant.Status.PROCESSING.equals(lstResourceStatu.getStatus())) {
372                 isFinished = false;
373             }
374         }
375         
376         OperationStatus serviceOperStatus = operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
377                 if (serviceOperStatus == null) {
378                         String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId + " operationId: "
379                                         + operationId;
380                         logger.error(error);
381                         
382                         serviceOperStatus = new OperationStatus();
383                         serviceOperStatus.setOperationId(operationId);
384                         serviceOperStatus.setServiceId(serviceId);
385                 }
386         
387         progress = progress > 100 ? 100 : progress;
388         serviceOperStatus.setProgress(String.valueOf(progress));
389         serviceOperStatus.setOperationContent(operStatus.getStatusDescription());
390         // if current resource failed. service failed.
391         if(RequestsDbConstant.Status.ERROR.equals(operStatus.getStatus())) {
392             serviceOperStatus.setResult(RequestsDbConstant.Status.ERROR);
393             serviceOperStatus.setReason(operStatus.getStatusDescription());
394         } else if(isFinished) {
395             // if finished
396             serviceOperStatus.setResult(RequestsDbConstant.Status.FINISHED);
397             serviceOperStatus.setProgress(RequestsDbConstant.Progress.ONE_HUNDRED);
398         }
399
400         operationStatusRepository.save(serviceOperStatus);
401     }
402 }