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