Change the header to SO
[so.git] / mso-api-handlers / mso-requests-db / src / main / java / org / openecomp / mso / requestsdb / RequestsDatabase.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
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.mso.requestsdb;
22
23 import java.util.Date;
24 import java.sql.Timestamp;
25 import java.text.SimpleDateFormat;
26 import java.util.ArrayList;
27 import java.util.HashMap;
28 import java.util.LinkedList;
29 import java.util.List;
30 import java.util.Map;
31 import java.util.concurrent.TimeUnit;
32
33 import org.hibernate.Criteria;
34 import org.hibernate.Query;
35 import org.hibernate.Session;
36 import org.hibernate.criterion.Criterion;
37 import org.hibernate.criterion.Order;
38 import org.hibernate.criterion.Restrictions;
39 import org.openecomp.mso.db.AbstractSessionFactoryManager;
40 import org.openecomp.mso.requestsdb.RequestsDbSessionFactoryManager;
41 import org.openecomp.mso.logger.MsoLogger;
42
43 public class RequestsDatabase {
44
45     protected final AbstractSessionFactoryManager sessionFactoryRequestDB;
46     
47     protected static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.GENERAL);
48     
49     protected static final String         SOURCE                     = "source";
50     protected static final String         START_TIME                 = "startTime";
51     protected static final String         REQUEST_TYPE               = "requestType";
52     protected static final String         SERVICE_INSTANCE_ID        = "serviceInstanceId";
53     protected static final String         SERVICE_INSTANCE_NAME      = "serviceInstanceName";
54     protected static final String         VNF_INSTANCE_NAME          = "vnfName";
55     protected static final String         VNF_INSTANCE_ID            = "vnfId";
56     protected static final String         VOLUME_GROUP_INSTANCE_NAME = "volumeGroupName";
57     protected static final String         VOLUME_GROUP_INSTANCE_ID   = "volumeGroupId";
58     protected static final String         VFMODULE_INSTANCE_NAME     = "vfModuleName";
59     protected static final String         VFMODULE_INSTANCE_ID       = "vfModuleId";
60     protected static final String         NETWORK_INSTANCE_NAME      = "networkName";
61     protected static final String         NETWORK_INSTANCE_ID        = "networkId";
62     protected static final String         GLOBAL_SUBSCRIBER_ID       = "globalSubscriberId";
63     protected static final String         SERVICE_NAME_VERSION_ID    = "serviceNameVersionId";
64     protected static final String         SERVICE_ID                 = "serviceId";
65     protected static final String         SERVICE_VERSION            = "serviceVersion";
66
67     protected static final String         REQUEST_ID                 = "requestId";
68     protected static MockRequestsDatabase mockDB                     = null;
69
70     public static RequestsDatabase getInstance() {
71         return new RequestsDatabase(new RequestsDbSessionFactoryManager ());
72     }
73
74     protected RequestsDatabase (AbstractSessionFactoryManager sessionFactoryRequest) {
75         sessionFactoryRequestDB = sessionFactoryRequest;
76     }
77
78     public boolean healthCheck () {
79         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
80         try {
81             Query query = session.createSQLQuery (" show tables ");
82
83             List<?> list = query.list();
84
85         } finally {
86             if (session != null && session.isOpen ()) {
87                 session.close ();
88             }
89         }
90         return true;
91     }
92
93
94     public int updateInfraStatus (String requestId, String requestStatus, String lastModifiedBy) {
95         long startTime = System.currentTimeMillis ();
96         msoLogger.debug ("Update infra request record " + requestId + " with status " + requestStatus);
97         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
98
99         int result = 0;
100         try {
101             session.beginTransaction ();
102             Query query = session.createQuery ("update InfraActiveRequests set requestStatus = :requestStatus, modifyTime = :modifyTime, lastModifiedBy = :lastModifiedBy where requestId = :requestId ");
103             query.setParameter ("requestStatus", requestStatus);
104             query.setParameter (REQUEST_ID, requestId);
105             query.setParameter ("lastModifiedBy", lastModifiedBy);
106             Timestamp modifyTimeStamp = new Timestamp (System.currentTimeMillis());
107             query.setParameter ("modifyTime", modifyTimeStamp);
108             result = query.executeUpdate ();
109             session.getTransaction ().commit ();
110         } finally {
111             if (session != null && session.isOpen ()) {
112                 session.close ();
113             }
114             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateInfraStatus", null);
115         }
116         return result;
117     }
118
119     public int updateInfraStatus (String requestId, String requestStatus, long progress, String lastModifiedBy) {
120         long startTime = System.currentTimeMillis ();
121         msoLogger.debug ("Update infra request record " + requestId + " with status " + requestStatus);
122         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
123
124         int result = 0;
125         try {
126             session.beginTransaction ();
127             Query query = session.createQuery ("update InfraActiveRequests set requestStatus = :requestStatus, modifyTime = :modifyTime, progress = :progress, lastModifiedBy = :lastModifiedBy where requestId = :requestId ");
128             query.setParameter ("requestStatus", requestStatus);
129             query.setParameter (REQUEST_ID, requestId);
130             query.setParameter ("progress", progress);
131             query.setParameter ("lastModifiedBy", lastModifiedBy);
132             Timestamp modifyTimeStamp = new Timestamp (System.currentTimeMillis());
133             query.setParameter ("modifyTime", modifyTimeStamp);
134             result = query.executeUpdate ();
135             session.getTransaction ().commit ();
136         } finally {
137             if (session != null && session.isOpen ()) {
138                 session.close ();
139             }
140             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateInfraStatus", null);
141         }
142         return result;
143     }
144
145     public int updateInfraFinalStatus (String requestId, String requestStatus, String statusMessage, long progress, String responseBody, String lastModifiedBy) {
146         long startTime = System.currentTimeMillis ();
147         msoLogger.debug ("Update infra request record " + requestId + " with status " + requestStatus);
148         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
149
150         int result = 0;
151         try {
152             session.beginTransaction ();
153             Query query = session.createQuery ("update InfraActiveRequests set requestStatus = :requestStatus, statusMessage = :statusMessage, progress = :progress, endTime = :endTime, responseBody = :responseBody, lastModifiedBy = :lastModifiedBy where id.requestId = :requestId ");
154             query.setParameter ("requestStatus", requestStatus);
155             query.setParameter ("requestId", requestId);
156             Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
157             query.setParameter ("endTime", endTimeStamp);
158             query.setParameter ("statusMessage", statusMessage);
159             query.setParameter ("progress", progress);
160             query.setParameter ("responseBody", responseBody);
161             query.setParameter ("lastModifiedBy", lastModifiedBy);
162             result = query.executeUpdate ();
163             session.getTransaction ().commit ();
164         } finally {
165             if (session != null && session.isOpen ()) {
166                 session.close ();
167             }
168             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateInfraFinalStatus", null);
169         }
170         return result;
171     }
172
173     
174     private List<InfraActiveRequests> executeInfraQuery (List <Criterion> criteria, Order order) {
175
176         long startTime = System.currentTimeMillis ();
177         msoLogger.debug ("Execute query on infra active request table");
178         
179         List <InfraActiveRequests> results = new ArrayList<InfraActiveRequests>();
180
181         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
182         try {
183             session.beginTransaction ();
184             Criteria crit = session.createCriteria (InfraActiveRequests.class);
185             for (Criterion criterion : criteria) {
186                 crit.add (criterion);
187             }
188             crit.addOrder (order);
189
190            // @SuppressWarnings("unchecked")
191             results = crit.list ();
192
193         } finally {
194             if (session != null && session.isOpen ()) {
195                 session.close ();
196             }
197             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "getInfraActiveRequest", null);
198         }
199         return results;
200     }
201     
202     public InfraActiveRequests getRequestFromInfraActive (String requestId) {
203         long startTime = System.currentTimeMillis ();
204         msoLogger.debug ("Get request " + requestId + " from InfraActiveRequests DB");
205
206         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
207         InfraActiveRequests ar = null;
208         try {
209             session.beginTransaction ();
210             Query query = session.createQuery ("from InfraActiveRequests where requestId = :requestId OR clientRequestId = :requestId");
211             query.setParameter (REQUEST_ID, requestId);
212             ar = (InfraActiveRequests) query.uniqueResult ();
213         } finally {
214             if (session != null && session.isOpen ()) {
215                 session.close ();
216             }
217             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "InfraRequestDB", "getRequestFromInfraActive", null);
218         }
219         return ar;
220     }
221     
222     public InfraActiveRequests checkInstanceNameDuplicate (HashMap<String,String> instanceIdMap, String instanceName, String requestScope) {
223
224         List <Criterion> criteria = new LinkedList <> ();
225        
226         if(instanceName != null && !instanceName.equals("")) {
227                 
228                 if(requestScope.equals("service")){
229                         criteria.add (Restrictions.eq (SERVICE_INSTANCE_NAME, instanceName));
230                 } else if(requestScope.equals("vnf")){
231                         criteria.add (Restrictions.eq (VNF_INSTANCE_NAME, instanceName));
232                 } else if(requestScope.equals("volumeGroup")){
233                         criteria.add (Restrictions.eq (VOLUME_GROUP_INSTANCE_NAME, instanceName));
234                 } else if(requestScope.equals("vfModule")){
235                         criteria.add (Restrictions.eq (VFMODULE_INSTANCE_NAME, instanceName));
236                 } else if(requestScope.equals("network")){
237                         criteria.add (Restrictions.eq (NETWORK_INSTANCE_NAME, instanceName));
238                 }
239         
240         } else {
241             if(instanceIdMap != null){
242                 if(requestScope.equals("service") && instanceIdMap.get("serviceInstanceId") != null){
243                         criteria.add (Restrictions.eq (SERVICE_INSTANCE_ID, instanceIdMap.get("serviceInstanceId")));
244                 }
245             
246                 if(requestScope.equals("vnf") && instanceIdMap.get("vnfInstanceId") != null){
247                         criteria.add (Restrictions.eq (VNF_INSTANCE_ID, instanceIdMap.get("vnfInstanceId")));
248                 }
249             
250                 if(requestScope.equals("vfModule") && instanceIdMap.get("vfModuleInstanceId") != null){
251                         criteria.add (Restrictions.eq (VFMODULE_INSTANCE_ID, instanceIdMap.get("vfModuleInstanceId")));
252                 }
253             
254                 if(requestScope.equals("volumeGroup") && instanceIdMap.get("volumeGroupInstanceId") != null){
255                         criteria.add (Restrictions.eq (VOLUME_GROUP_INSTANCE_ID, instanceIdMap.get("volumeGroupInstanceId")));
256                 }
257             
258                 if(requestScope.equals("network") && instanceIdMap.get("networkInstanceId") != null){
259                         criteria.add (Restrictions.eq (NETWORK_INSTANCE_ID, instanceIdMap.get("networkInstanceId")));
260                 }
261             }
262         }
263         
264         criteria.add (Restrictions.in ("requestStatus", new String[] { "PENDING", "IN_PROGRESS", "TIMEOUT" }));
265         
266         Order order = Order.desc (START_TIME);
267         
268         List<InfraActiveRequests> dupList = executeInfraQuery(criteria, order);
269         
270         InfraActiveRequests infraActiveRequests = null;
271         
272         if(dupList != null && dupList.size() > 0){
273                 infraActiveRequests = dupList.get(0);
274         }
275                 
276         return infraActiveRequests; 
277     }
278       
279     public List<InfraActiveRequests> getOrchestrationFiltersFromInfraActive (Map<String, List<String>> orchestrationMap) {
280         
281         
282         List <Criterion> criteria = new LinkedList <> ();
283         for (Map.Entry<String, List<String>> entry : orchestrationMap.entrySet())
284         {
285                 String mapKey = entry.getKey();
286                 if(mapKey.equalsIgnoreCase("serviceInstanceId")) {
287                         mapKey = "serviceInstanceId";
288                 } else if(mapKey.equalsIgnoreCase("serviceInstanceName")) {
289                         mapKey = "serviceInstanceName";
290                 } else if(mapKey.equalsIgnoreCase("vnfInstanceId")){
291                 mapKey = "vnfId";
292             } else if(mapKey.equalsIgnoreCase("vnfInstanceName")) {
293                 mapKey = "vnfName";
294             } else if(mapKey.equalsIgnoreCase("vfModuleInstanceId")) {
295                 mapKey = "vfModuleId";
296             } else if(mapKey.equalsIgnoreCase("vfModuleInstanceName")) {
297                 mapKey = "vfModuleName";
298             } else if(mapKey.equalsIgnoreCase("volumeGroupInstanceId")) {
299                 mapKey = "volumeGroupId";
300             } else if(mapKey.equalsIgnoreCase("volumeGroupInstanceName")) {
301                 mapKey = "volumeGroupName";
302             } else if(mapKey.equalsIgnoreCase("networkInstanceId")) {
303                 mapKey = "networkId";
304             } else if(mapKey.equalsIgnoreCase("networkInstanceName")) {
305                 mapKey = "networkName";
306             } else if(mapKey.equalsIgnoreCase("lcpCloudRegionId")) {
307                 mapKey = "aicCloudRegion";
308             } else if(mapKey.equalsIgnoreCase("tenantId")) {
309                 mapKey = "tenantId";
310             } else if(mapKey.equalsIgnoreCase("modelType")) {
311                 mapKey = "requestScope";
312             } else if(mapKey.equalsIgnoreCase("requestorId")) {
313                 mapKey = "requestorId";
314             } else if(mapKey.equalsIgnoreCase("requestExecutionDate")) {                
315                 mapKey = "startTime";
316             }
317             
318                 String propertyValue = entry.getValue().get(1);
319                 if (mapKey.equals("startTime")) {                       
320                         SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy");                   
321                         try {
322                         Date thisDate = format.parse(propertyValue);
323                         Timestamp minTime = new Timestamp(thisDate.getTime());                  
324                         Timestamp maxTime = new Timestamp(thisDate.getTime() + TimeUnit.DAYS.toMillis(1));
325                         
326                         if("DOES_NOT_EQUAL".equalsIgnoreCase(entry.getValue().get(0))) {
327                                 criteria.add(Restrictions.or(Restrictions.lt(mapKey, minTime),
328                                                 Restrictions.ge(mapKey, maxTime)));                                     
329                                 } else {                                        
330                                         criteria.add(Restrictions.between(mapKey, minTime, maxTime));                                           
331                                 }    
332                         }
333                         catch (Exception e){
334                                 msoLogger.debug("Exception in getOrchestrationFiltersFromInfraActive(): + " + e.getMessage());
335                                 return null;
336                         }
337                 }
338                 else if("DOES_NOT_EQUAL".equalsIgnoreCase(entry.getValue().get(0))) {
339                         criteria.add(Restrictions.ne(mapKey, propertyValue));
340                 } else {
341                         criteria.add(Restrictions.eq(mapKey, propertyValue));
342                 }
343             
344         }
345         
346          Order order = Order.asc (START_TIME);
347
348         return executeInfraQuery (criteria, order);
349     }
350
351
352     public List <InfraActiveRequests> getRequestListFromInfraActive (String queryAttributeName,
353                                                                             String queryValue,
354                                                                             String requestType) {
355         msoLogger.debug ("Get list of infra requests from DB with " + queryAttributeName + " = " + queryValue);
356
357         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
358         try {
359             session.beginTransaction ();
360             Criteria crit = session.createCriteria (InfraActiveRequests.class)
361                     .add (Restrictions.eq (queryAttributeName, queryValue));
362             crit.add (Restrictions.eqOrIsNull (REQUEST_TYPE, requestType));
363             crit.addOrder (Order.desc (START_TIME));
364             crit.addOrder (Order.asc (SOURCE));
365
366             @SuppressWarnings("unchecked")
367             List <InfraActiveRequests> arList = crit.list ();
368             if (arList != null && !arList.isEmpty ()) {
369                 return arList;
370             }
371         } finally {
372             if (session != null && session.isOpen ()) {
373                 session.close ();
374             }
375            // msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "getRequestListFromInfraActive", null);
376         }
377         return null;
378     }
379
380
381     public InfraActiveRequests getRequestFromInfraActive (String requestId, String requestType) {
382         long startTime = System.currentTimeMillis ();
383         msoLogger.debug ("Get infra request from DB with id " + requestId);
384
385         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
386         InfraActiveRequests ar = null;
387         try {
388             session.beginTransaction ();
389             Query query = session.createQuery ("from InfraActiveRequests where (requestId = :requestId OR clientRequestId = :requestId) and requestType = :requestType");
390             query.setParameter (REQUEST_ID, requestId);
391             query.setParameter (REQUEST_TYPE, requestType);
392             ar = (InfraActiveRequests) query.uniqueResult ();
393         } finally {
394             if (session != null && session.isOpen ()) {
395                 session.close ();
396             }
397             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "getRequestFromInfraActive", null);
398         }
399         return ar;
400     }
401
402
403     public InfraActiveRequests checkDuplicateByVnfName (String vnfName, String action, String requestType) {
404
405         long startTime = System.currentTimeMillis ();
406         msoLogger.debug ("Get infra request from DB for VNF " + vnfName + " and action " + action + " and requestType " + requestType);
407
408         InfraActiveRequests ar = null;
409         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
410
411         try {
412             session.beginTransaction ();
413             Query query = session.createQuery ("from InfraActiveRequests where vnfName = :vnfName and action = :action and (requestStatus = 'PENDING' or requestStatus = 'IN_PROGRESS' or requestStatus = 'TIMEOUT') and requestType = :requestType ORDER BY startTime DESC");
414             query.setParameter ("vnfName", vnfName);
415             query.setParameter ("action", action);
416             query.setParameter (REQUEST_TYPE, requestType);
417             @SuppressWarnings("unchecked")
418             List <InfraActiveRequests> results = query.list ();
419             if (!results.isEmpty ()) {
420                 ar = results.get (0);
421             }
422         } finally {
423             if (session != null && session.isOpen ()) {
424                 session.close ();
425             }
426             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "checkDuplicateByVnfName", null);
427         }
428
429         return ar;
430     }
431
432     public InfraActiveRequests checkDuplicateByVnfId (String vnfId, String action, String requestType) {
433
434         long startTime = System.currentTimeMillis ();
435         msoLogger.debug ("Get list of infra requests from DB for VNF " + vnfId + " and action " + action);
436
437         InfraActiveRequests ar = null;
438         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
439
440         try {
441             session.beginTransaction ();
442             Query query = session.createQuery ("from InfraActiveRequests where vnfId = :vnfId and action = :action and (requestStatus = 'PENDING' or requestStatus = 'IN_PROGRESS' or requestStatus = 'TIMEOUT') and requestType = :requestType ORDER BY startTime DESC");
443             query.setParameter ("vnfId", vnfId);
444             query.setParameter ("action", action);
445             query.setParameter (REQUEST_TYPE, requestType);
446             @SuppressWarnings("unchecked")
447             List <InfraActiveRequests> results = query.list ();
448             if (!results.isEmpty ()) {
449                 ar = results.get (0);
450             }
451         } finally {
452             if (session != null && session.isOpen ()) {
453                 session.close ();
454             }
455             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "checkDuplicateByVnfId", null);
456         }
457
458         return ar;
459     }
460
461     public void setMockDB(MockRequestsDatabase mockDB) {
462         RequestsDatabase.mockDB = mockDB;
463     }
464
465     /**
466      * Fetch a specific SiteStatus by SiteName.
467      *
468      * @param siteName The unique name of the site
469      * @return SiteStatus object or null if none found
470      */
471     public SiteStatus getSiteStatus (String siteName) {
472         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
473
474         SiteStatus siteStatus = null;
475         msoLogger.debug ("Request database - get Site Status with Site name:" + siteName);
476         try {
477             String hql = "FROM SiteStatus WHERE siteName = :site_name";
478             Query query = session.createQuery (hql);
479             query.setParameter ("site_name", siteName);
480
481             siteStatus = (SiteStatus) query.uniqueResult ();
482         } finally {
483             if (session != null && session.isOpen ()) {
484                 session.close ();
485             }
486             msoLogger.debug ("getSiteStatus - Successfully: " + siteStatus);
487         }
488         return siteStatus;
489     }
490
491     /**
492      * Fetch a specific SiteStatus by SiteName.
493      *
494      * @param siteName The unique name of the site
495      * @param status The updated status of the Site
496      */
497     public void updateSiteStatus (String siteName, boolean status) {
498         Session session = sessionFactoryRequestDB.getSessionFactory ().openSession ();
499         session.beginTransaction ();
500
501         long startTime = System.currentTimeMillis ();
502         msoLogger.debug ("Request database - save Site Status with Site name:" + siteName);
503         try {
504             String hql = "FROM SiteStatus WHERE siteName = :site_name";
505             Query query = session.createQuery (hql);
506             query.setParameter ("site_name", siteName);
507
508             SiteStatus siteStatus = (SiteStatus) query.uniqueResult ();
509             if (siteStatus == null) {
510                 siteStatus = new SiteStatus ();
511                 siteStatus.setSiteName (siteName);
512                 siteStatus.setStatus (status);
513                 //siteStatus.setCreated(new Timestamp(new Date().getTime()));
514                 session.save (siteStatus);
515             } else {
516                 siteStatus.setStatus(status);
517                 //siteStatus.setCreated(new Timestamp(new Date().getTime()));
518                 session.merge (siteStatus);
519             }
520             session.getTransaction ().commit ();
521         } finally {
522             if (session != null && session.isOpen ()) {
523                 session.close ();
524             }
525             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateSiteStatus", null);
526         }
527     }
528
529     /**
530      * get the operation progress
531      * <br>
532      * 
533      * @param serviceId the serviceId
534      * @param operationId the operation id 
535      * @return current progress of the operation
536      * @since ONAP Amsterdam Release
537      */
538     public OperationStatus getOperationStatus(String serviceId, String operationId) {
539
540         long startTime = System.currentTimeMillis();
541         msoLogger.debug("Execute query on infra active request table");
542
543         OperationStatus operStatus = null;
544         Session session = sessionFactoryRequestDB.getSessionFactory().openSession();
545         try {
546             session.beginTransaction();
547             String hql = "FROM OperationStatus WHERE SERVICE_ID = :service_id and OPERATION_ID = :operation_id";
548             Query query = session.createQuery(hql);
549             query.setParameter("service_id", serviceId);
550             query.setParameter("operation_id", operationId);
551             operStatus = (OperationStatus)query.uniqueResult();
552
553         } finally {
554             if(session != null && session.isOpen()) {
555                 session.close();
556             }
557             msoLogger.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
558                     "Successfully", "RequestDB", "getOperationStatus", null);
559         }
560         return operStatus;
561     }
562     
563     /**
564      * update the operation status
565      * <br>
566      * 
567      * @param operstatus the operation object
568      * @since ONAP Amsterdam Release
569      */
570     public void updateOperationStatus(OperationStatus operstatus) {
571         Session session = sessionFactoryRequestDB.getSessionFactory().openSession();
572         session.beginTransaction();
573
574         long startTime = System.currentTimeMillis();
575         msoLogger.debug("Request database - save Operation Status with service Id:" + operstatus.getServiceId()
576                 + ", operationId:" + operstatus.getOperationId());
577         try {
578             String hql =
579                     "FROM OperationStatus WHERE SERVICE_ID = :service_id and OPERATION_ID = :operation_id";
580             Query query = session.createQuery(hql);
581             query.setParameter("service_id", operstatus.getServiceId());
582             query.setParameter("operation_id", operstatus.getOperationId());
583             OperationStatus exsitingStatus = (OperationStatus)query.uniqueResult();
584             if(exsitingStatus == null) {
585                 session.save(operstatus);
586             } else {
587                 session.merge(operstatus);
588             }
589             session.getTransaction().commit();
590         } finally {
591             if(session != null && session.isOpen()) {
592                 session.close();
593             }
594             msoLogger.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
595                     "Successfully", "RequestDB", "updateOperationStatus", null);
596         }
597     }
598
599     /**
600      * get a operation status of a resource
601      * <br>
602      * 
603      * @param serviceId the service Id
604      * @param operationId the operation id
605      * @param resourceTemplateUUID the resource template uuid
606      * @return the progress status of a resource
607      * @since ONAP Amsterdam Release
608      */
609     public ResourceOperationStatus getResourceOperationStatus(String serviceId, String operationId,
610             String resourceTemplateUUID) {
611         long startTime = System.currentTimeMillis();
612         msoLogger.debug("Execute query on infra active request table");
613
614         ResourceOperationStatus operStatus = null;
615         Session session = sessionFactoryRequestDB.getSessionFactory().openSession();
616         try {
617             session.beginTransaction();
618             String hql =
619                     "FROM ResourceOperationStatus WHERE serviceId = :service_id and operationId = :operation_id and resourceTemplateUUID= :uuid";
620             Query query = session.createQuery(hql);
621             query.setParameter("service_id", serviceId);
622             query.setParameter("operation_id", operationId);
623             query.setParameter("uuid", resourceTemplateUUID);
624             operStatus = (ResourceOperationStatus)query.uniqueResult();
625
626         } finally {
627             if(session != null && session.isOpen()) {
628                 session.close();
629             }
630             msoLogger.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
631                     "Successfully", "RequestDB", "getOperationStatus", null);
632         }
633         return operStatus;
634     }
635
636     /**
637      * update the resource operation
638      * <br>
639      * 
640      * @param operstatus the resource operation object
641      * @since ONAP Amsterdam Release
642      */
643     public void updateResOperStatus(ResourceOperationStatus operStatus) {
644         Session session = sessionFactoryRequestDB.getSessionFactory().openSession();
645         session.beginTransaction();
646
647         long startTime = System.currentTimeMillis();
648         msoLogger.debug("Request database - save Resource Operation Status with service Id:" + operStatus.getServiceId()
649                 + ", operationId:" + operStatus.getOperationId() + ", resourceUUId:"
650                 + operStatus.getResourceTemplateUUID());
651         try {
652             String hql =
653                     "FROM ResourceOperationStatus WHERE SERVICE_ID = :service_id and OPERATION_ID = :operation_id and RESOURCE_TEMPLATE_UUID = : res_uuid";
654             Query query = session.createQuery(hql);
655             query.setParameter("service_id", operStatus.getServiceId());
656             query.setParameter("operation_id", operStatus.getOperationId());
657             query.setParameter("res_uuid", operStatus.getResourceTemplateUUID());
658             ResourceOperationStatus exsitingStatus = (ResourceOperationStatus)query.uniqueResult();
659             if(exsitingStatus == null) {
660                 session.save(operStatus);
661             } else {
662                 session.merge(operStatus);
663             }
664             session.getTransaction().commit();
665         } finally {
666             if(session != null && session.isOpen()) {
667                 session.close();
668             }
669             msoLogger.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
670                     "Successfully", "RequestDB", "updateResOperStatus", null);
671         }
672         updateOperationStatusBasedOnResourceStatus(operStatus);
673     }
674
675     /**
676      * update service operation status when a operation resource status updated
677      * <br>
678      * 
679      * @param operStatus the resource operation status
680      * @since ONAP Amsterdam Release
681      */
682     private void updateOperationStatusBasedOnResourceStatus(ResourceOperationStatus operStatus) {
683         Session session = sessionFactoryRequestDB.getSessionFactory().openSession();
684         session.beginTransaction();
685
686         long startTime = System.currentTimeMillis();
687         msoLogger.debug("Request database - query Resource Operation Status with service Id:"
688                 + operStatus.getServiceId() + ", operationId:" + operStatus.getOperationId());
689         try {
690             // query all resources of the service
691             String hql = "FROM ResourceOperationStatus WHERE SERVICE_ID = :service_id and OPERATION_ID = :operation_id";
692             Query query = session.createQuery(hql);
693             query.setParameter("service_id", operStatus.getServiceId());
694             query.setParameter("operation_id", operStatus.getOperationId());
695             @SuppressWarnings("unchecked")
696             List<ResourceOperationStatus> lstResourceStatus = (List<ResourceOperationStatus>)query.list();
697             // count the total progress
698             int resourceCount = lstResourceStatus.size();
699             int progress = 0;
700             boolean isFinished = true;
701             for(int i = 0; i < resourceCount; i++) {
702                 progress = progress + Integer.valueOf(lstResourceStatus.get(i).getProgress()) / resourceCount;
703                 if(RequestsDbConstant.Status.PROCESSING.equals(lstResourceStatus.get(i).getStatus())) {
704                     isFinished = false;
705                 }
706             }
707             OperationStatus serviceOperStatus =
708                     getOperationStatus(operStatus.getServiceId(), operStatus.getOperationId());
709             progress = progress > 100 ? 100 : progress;
710             serviceOperStatus.setProgress(String.valueOf(progress));
711             serviceOperStatus.setOperationContent(operStatus.getStatusDescription());
712             // if current resource failed. service failed.
713             if(RequestsDbConstant.Status.ERROR.equals(operStatus.getStatus())) {
714                 serviceOperStatus.setResult(RequestsDbConstant.Status.ERROR);
715                 serviceOperStatus.setReason(operStatus.getStatusDescription());
716             } else if(isFinished) {
717                 // if finished
718                 serviceOperStatus.setResult(RequestsDbConstant.Status.FINISHED);
719                 serviceOperStatus.setProgress(RequestsDbConstant.Progress.ONE_HUNDRED);
720             }
721             updateOperationStatus(serviceOperStatus);
722         } finally {
723             if(session != null && session.isOpen()) {
724                 session.close();
725             }
726             msoLogger.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
727                     "Successfully", "RequestDB", "updateResOperStatus", null);
728         }
729     }
730 }