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