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