fda44618405cfc4db8e68505ff3125b8b85d255d
[so.git] / mso-api-handlers / mso-requests-db / src / main / java / org / openecomp / mso / requestsdb / RequestsDatabase.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - MSO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.mso.requestsdb;
22
23 import java.sql.Timestamp;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.LinkedList;
27 import java.util.List;
28 import java.util.Map;
29
30 import org.apache.http.HttpStatus;
31 import org.hibernate.Criteria;
32 import org.hibernate.Query;
33 import org.hibernate.Session;
34 import org.hibernate.criterion.Criterion;
35 import org.hibernate.criterion.Order;
36 import org.hibernate.criterion.Restrictions;
37 import org.hibernate.persister.entity.AbstractEntityPersister;
38
39 import org.openecomp.mso.logger.MsoLogger;
40
41 public class RequestsDatabase {
42
43     protected static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.GENERAL);
44
45     protected static final String         SOURCE                     = "source";
46     protected static final String         START_TIME                 = "startTime";
47     protected static final String         REQUEST_TYPE               = "requestType";
48     protected static final String         SERVICE_INSTANCE_ID        = "serviceInstanceId";
49     protected static final String         SERVICE_INSTANCE_NAME      = "serviceInstanceName";
50     protected static final String         VNF_INSTANCE_NAME          = "vnfName";
51     protected static final String         VNF_INSTANCE_ID            = "vnfId";
52     protected static final String         VOLUME_GROUP_INSTANCE_NAME = "volumeGroupName";
53     protected static final String         VOLUME_GROUP_INSTANCE_ID   = "volumeGroupId";
54     protected static final String         VFMODULE_INSTANCE_NAME     = "vfModuleName";
55     protected static final String         VFMODULE_INSTANCE_ID       = "vfModuleId";
56     protected static final String         NETWORK_INSTANCE_NAME      = "networkName";
57     protected static final String         NETWORK_INSTANCE_ID        = "networkId";
58     protected static final String         GLOBAL_SUBSCRIBER_ID       = "globalSubscriberId";
59     protected static final String         SERVICE_NAME_VERSION_ID    = "serviceNameVersionId";
60     protected static final String         SERVICE_ID                 = "serviceId";
61     protected static final String         SERVICE_VERSION            = "serviceVersion";
62
63     protected static final String         REQUEST_ID                 = "requestId";
64     protected static MockRequestsDatabase mockDB                     = null;
65
66     /**
67      * Avoids creating an instance of this utility class.
68      */
69     protected RequestsDatabase () {
70     }
71
72     public static boolean healthCheck () {
73         Session session = HibernateUtil.getSessionFactory ().openSession ();
74         try {
75             Query query = session.createSQLQuery (" show tables ");
76
77             List<?> list = query.list();
78
79         } finally {
80             if (session != null && session.isOpen ()) {
81                 session.close ();
82             }
83         }
84         return true;
85     }
86
87
88     public static int updateInfraStatus (String requestId, String requestStatus, String lastModifiedBy) {
89         long startTime = System.currentTimeMillis ();
90         msoLogger.debug ("Update infra request record " + requestId + " with status " + requestStatus);
91         Session session = HibernateUtil.getSessionFactory ().openSession ();
92
93         int result = 0;
94         try {
95             session.beginTransaction ();
96             Query query = session.createQuery ("update InfraActiveRequests set requestStatus = :requestStatus, modifyTime = :modifyTime, lastModifiedBy = :lastModifiedBy where requestId = :requestId ");
97             query.setParameter ("requestStatus", requestStatus);
98             query.setParameter (REQUEST_ID, requestId);
99             query.setParameter ("lastModifiedBy", lastModifiedBy);
100             Timestamp modifyTimeStamp = new Timestamp (System.currentTimeMillis());
101             query.setParameter ("modifyTime", modifyTimeStamp);
102             result = query.executeUpdate ();
103             session.getTransaction ().commit ();
104         } finally {
105             if (session != null && session.isOpen ()) {
106                 session.close ();
107             }
108             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateInfraStatus", null);
109         }
110         return result;
111     }
112
113     public static int updateInfraStatus (String requestId, String requestStatus, long progress, String lastModifiedBy) {
114         long startTime = System.currentTimeMillis ();
115         msoLogger.debug ("Update infra request record " + requestId + " with status " + requestStatus);
116         Session session = HibernateUtil.getSessionFactory ().openSession ();
117
118         int result = 0;
119         try {
120             session.beginTransaction ();
121             Query query = session.createQuery ("update InfraActiveRequests set requestStatus = :requestStatus, modifyTime = :modifyTime, progress = :progress, lastModifiedBy = :lastModifiedBy where requestId = :requestId ");
122             query.setParameter ("requestStatus", requestStatus);
123             query.setParameter (REQUEST_ID, requestId);
124             query.setParameter ("progress", progress);
125             query.setParameter ("lastModifiedBy", lastModifiedBy);
126             Timestamp modifyTimeStamp = new Timestamp (System.currentTimeMillis());
127             query.setParameter ("modifyTime", modifyTimeStamp);
128             result = query.executeUpdate ();
129             session.getTransaction ().commit ();
130         } finally {
131             if (session != null && session.isOpen ()) {
132                 session.close ();
133             }
134             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateInfraStatus", null);
135         }
136         return result;
137     }
138
139     public static int updateInfraFinalStatus (String requestId, String requestStatus, String statusMessage, long progress, String responseBody, String lastModifiedBy) {
140         long startTime = System.currentTimeMillis ();
141         msoLogger.debug ("Update infra request record " + requestId + " with status " + requestStatus);
142         Session session = HibernateUtil.getSessionFactory ().openSession ();
143
144         int result = 0;
145         try {
146             session.beginTransaction ();
147             Query query = session.createQuery ("update InfraActiveRequests set requestStatus = :requestStatus, statusMessage = :statusMessage, progress = :progress, endTime = :endTime, responseBody = :responseBody, lastModifiedBy = :lastModifiedBy where id.requestId = :requestId ");
148             query.setParameter ("requestStatus", requestStatus);
149             query.setParameter ("requestId", requestId);
150             Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
151             query.setParameter ("endTime", endTimeStamp);
152             query.setParameter ("statusMessage", statusMessage);
153             query.setParameter ("progress", progress);
154             query.setParameter ("responseBody", responseBody);
155             query.setParameter ("lastModifiedBy", lastModifiedBy);
156             result = query.executeUpdate ();
157             session.getTransaction ().commit ();
158         } finally {
159             if (session != null && session.isOpen ()) {
160                 session.close ();
161             }
162             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateInfraFinalStatus", null);
163         }
164         return result;
165     }
166
167     
168     private static List<InfraActiveRequests> executeInfraQuery (List <Criterion> criteria, Order order) {
169
170         long startTime = System.currentTimeMillis ();
171         msoLogger.debug ("Execute query on infra active request table");
172         
173         List <InfraActiveRequests> results = new ArrayList<InfraActiveRequests>();
174
175         Session session = HibernateUtil.getSessionFactory ().openSession ();
176         try {
177             session.beginTransaction ();
178             Criteria crit = session.createCriteria (InfraActiveRequests.class);
179             for (Criterion criterion : criteria) {
180                 crit.add (criterion);
181             }
182             crit.addOrder (order);
183
184            // @SuppressWarnings("unchecked")
185             results = crit.list ();
186
187         } finally {
188             if (session != null && session.isOpen ()) {
189                 session.close ();
190             }
191             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "getInfraActiveRequest", null);
192         }
193         return results;
194     }
195     
196     public static InfraActiveRequests getRequestFromInfraActive (String requestId) {
197         long startTime = System.currentTimeMillis ();
198         msoLogger.debug ("Get request " + requestId + " from InfraActiveRequests DB");
199
200         Session session = HibernateUtil.getSessionFactory ().openSession ();
201         InfraActiveRequests ar = null;
202         try {
203             session.beginTransaction ();
204             Query query = session.createQuery ("from InfraActiveRequests where requestId = :requestId OR clientRequestId = :requestId");
205             query.setParameter (REQUEST_ID, requestId);
206             ar = (InfraActiveRequests) query.uniqueResult ();
207         } finally {
208             if (session != null && session.isOpen ()) {
209                 session.close ();
210             }
211             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "InfraRequestDB", "getRequestFromInfraActive", null);
212         }
213         return ar;
214     }
215     
216     public static InfraActiveRequests checkInstanceNameDuplicate (HashMap<String,String> instanceIdMap, String instanceName, String requestScope) {
217
218         List <Criterion> criteria = new LinkedList <> ();
219        
220         if(instanceName != null && !instanceName.equals("")) {
221                 
222                 if(requestScope.equals("service")){
223                         criteria.add (Restrictions.eq (SERVICE_INSTANCE_NAME, instanceName));
224                 } else if(requestScope.equals("vnf")){
225                         criteria.add (Restrictions.eq (VNF_INSTANCE_NAME, instanceName));
226                 } else if(requestScope.equals("volumeGroup")){
227                         criteria.add (Restrictions.eq (VOLUME_GROUP_INSTANCE_NAME, instanceName));
228                 } else if(requestScope.equals("vfModule")){
229                         criteria.add (Restrictions.eq (VFMODULE_INSTANCE_NAME, instanceName));
230                 } else if(requestScope.equals("network")){
231                         criteria.add (Restrictions.eq (NETWORK_INSTANCE_NAME, instanceName));
232                 }
233         
234         } else {
235             if(instanceIdMap != null){
236                 if(requestScope.equals("service") && instanceIdMap.get("serviceInstanceId") != null){
237                         criteria.add (Restrictions.eq (SERVICE_INSTANCE_ID, instanceIdMap.get("serviceInstanceId")));
238                 }
239             
240                 if(requestScope.equals("vnf") && instanceIdMap.get("vnfInstanceId") != null){
241                         criteria.add (Restrictions.eq (VNF_INSTANCE_ID, instanceIdMap.get("vnfInstanceId")));
242                 }
243             
244                 if(requestScope.equals("vfModule") && instanceIdMap.get("vfModuleInstanceId") != null){
245                         criteria.add (Restrictions.eq (VFMODULE_INSTANCE_ID, instanceIdMap.get("vfModuleInstanceId")));
246                 }
247             
248                 if(requestScope.equals("volumeGroup") && instanceIdMap.get("volumeGroupInstanceId") != null){
249                         criteria.add (Restrictions.eq (VOLUME_GROUP_INSTANCE_ID, instanceIdMap.get("volumeGroupInstanceId")));
250                 }
251             
252                 if(requestScope.equals("network") && instanceIdMap.get("networkInstanceId") != null){
253                         criteria.add (Restrictions.eq (NETWORK_INSTANCE_ID, instanceIdMap.get("networkInstanceId")));
254                 }
255             }
256         }
257         
258         criteria.add (Restrictions.in ("requestStatus", new String[] { "PENDING", "IN_PROGRESS", "TIMEOUT" }));
259         
260         Order order = Order.desc (START_TIME);
261         
262         List<InfraActiveRequests> dupList = executeInfraQuery(criteria, order);
263         
264         InfraActiveRequests infraActiveRequests = null;
265         
266         if(dupList != null && dupList.size() > 0){
267                 infraActiveRequests = dupList.get(0);
268         }
269                 
270         return infraActiveRequests; 
271     }
272       
273     public static List<InfraActiveRequests> getOrchestrationFiltersFromInfraActive (Map<String, List<String>> orchestrationMap) {
274         
275         
276         List <Criterion> criteria = new LinkedList <> ();
277         for (Map.Entry<String, List<String>> entry : orchestrationMap.entrySet())
278         {
279                 String mapKey = entry.getKey();
280
281             if(mapKey.equalsIgnoreCase("vnfInstanceId")){
282                 mapKey = "vnfId";
283             } else if(mapKey.equalsIgnoreCase("vnfInstanceName")) {
284                 mapKey = "vnfName";
285             } else if(mapKey.equalsIgnoreCase("vfModuleInstanceId")) {
286                 mapKey = "vfModuleId";
287             } else if(mapKey.equalsIgnoreCase("vfModuleInstanceName")) {
288                 mapKey = "vfModuleName";
289             } else if(mapKey.equalsIgnoreCase("volumeGroupInstanceId")) {
290                 mapKey = "volumeGroupId";
291             } else if(mapKey.equalsIgnoreCase("volumeGroupInstanceName")) {
292                 mapKey = "volumeGroupName";
293             } else if(mapKey.equalsIgnoreCase("networkInstanceId")) {
294                 mapKey = "networkId";
295             } else if(mapKey.equalsIgnoreCase("networkInstanceName")) {
296                 mapKey = "networkName";
297             } else if(mapKey.equalsIgnoreCase("lcpCloudRegionId")) {
298                 mapKey = "aicCloudRegion";
299             } 
300             
301             criteria.add(Restrictions.eq(mapKey, entry.getValue().get(1)));         
302             
303         }
304         
305          Order order = Order.asc (START_TIME);
306
307         return executeInfraQuery (criteria, order);
308     }
309
310
311     public static List <InfraActiveRequests> getRequestListFromInfraActive (String queryAttributeName,
312                                                                             String queryValue,
313                                                                             String requestType) {
314         long startTime = System.currentTimeMillis ();
315         msoLogger.debug ("Get list of infra requests from DB with " + queryAttributeName + " = " + queryValue);
316
317         Session session = HibernateUtil.getSessionFactory ().openSession ();
318         try {
319             session.beginTransaction ();
320             Criteria crit = session.createCriteria (InfraActiveRequests.class)
321                     .add (Restrictions.eq (queryAttributeName, queryValue));
322             crit.add (Restrictions.eqOrIsNull (REQUEST_TYPE, requestType));
323             crit.addOrder (Order.desc (START_TIME));
324             crit.addOrder (Order.asc (SOURCE));
325
326             @SuppressWarnings("unchecked")
327             List <InfraActiveRequests> arList = crit.list ();
328             if (arList != null && !arList.isEmpty ()) {
329                 return arList;
330             }
331         } finally {
332             if (session != null && session.isOpen ()) {
333                 session.close ();
334             }
335            // msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "getRequestListFromInfraActive", null);
336         }
337         return null;
338     }
339
340
341     public static InfraActiveRequests getRequestFromInfraActive (String requestId, String requestType) {
342         long startTime = System.currentTimeMillis ();
343         msoLogger.debug ("Get infra request from DB with id " + requestId);
344
345         Session session = HibernateUtil.getSessionFactory ().openSession ();
346         InfraActiveRequests ar = null;
347         try {
348             session.beginTransaction ();
349             Query query = session.createQuery ("from InfraActiveRequests where (requestId = :requestId OR clientRequestId = :requestId) and requestType = :requestType");
350             query.setParameter (REQUEST_ID, requestId);
351             query.setParameter (REQUEST_TYPE, requestType);
352             ar = (InfraActiveRequests) query.uniqueResult ();
353         } finally {
354             if (session != null && session.isOpen ()) {
355                 session.close ();
356             }
357             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "getRequestFromInfraActive", null);
358         }
359         return ar;
360     }
361
362
363     public static InfraActiveRequests checkDuplicateByVnfName (String vnfName, String action, String requestType) {
364
365         long startTime = System.currentTimeMillis ();
366         msoLogger.debug ("Get infra request from DB for VNF " + vnfName + " and action " + action + " and requestType " + requestType);
367
368         InfraActiveRequests ar = null;
369         Session session = HibernateUtil.getSessionFactory ().openSession ();
370
371         try {
372             session.beginTransaction ();
373             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");
374             query.setParameter ("vnfName", vnfName);
375             query.setParameter ("action", action);
376             query.setParameter (REQUEST_TYPE, requestType);
377             @SuppressWarnings("unchecked")
378             List <InfraActiveRequests> results = query.list ();
379             if (!results.isEmpty ()) {
380                 ar = results.get (0);
381             }
382         } finally {
383             if (session != null && session.isOpen ()) {
384                 session.close ();
385             }
386             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "checkDuplicateByVnfName", null);
387         }
388
389         return ar;
390     }
391
392     public static InfraActiveRequests checkDuplicateByVnfId (String vnfId, String action, String requestType) {
393
394         long startTime = System.currentTimeMillis ();
395         msoLogger.debug ("Get list of infra requests from DB for VNF " + vnfId + " and action " + action);
396
397         InfraActiveRequests ar = null;
398         Session session = HibernateUtil.getSessionFactory ().openSession ();
399
400         try {
401             session.beginTransaction ();
402             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");
403             query.setParameter ("vnfId", vnfId);
404             query.setParameter ("action", action);
405             query.setParameter (REQUEST_TYPE, requestType);
406             @SuppressWarnings("unchecked")
407             List <InfraActiveRequests> results = query.list ();
408             if (!results.isEmpty ()) {
409                 ar = results.get (0);
410             }
411         } finally {
412             if (session != null && session.isOpen ()) {
413                 session.close ();
414             }
415             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "checkDuplicateByVnfId", null);
416         }
417
418         return ar;
419     }
420
421     public static void setMockDB(MockRequestsDatabase mockDB) {
422         RequestsDatabase.mockDB = mockDB;
423     }
424
425     /**
426      * Fetch a specific SiteStatus by SiteName.
427      *
428      * @param siteName The unique name of the site
429      * @return SiteStatus object or null if none found
430      */
431     public static SiteStatus getSiteStatus (String siteName) {
432         Session session = HibernateUtil.getSessionFactory ().openSession ();
433
434         long startTime = System.currentTimeMillis ();
435         SiteStatus siteStatus = null;
436         msoLogger.debug ("Request database - get Site Status with Site name:" + siteName);
437         try {
438             String hql = "FROM SiteStatus WHERE siteName = :site_name";
439             Query query = session.createQuery (hql);
440             query.setParameter ("site_name", siteName);
441
442             siteStatus = (SiteStatus) query.uniqueResult ();
443         } finally {
444             if (session != null && session.isOpen ()) {
445                 session.close ();
446             }
447             msoLogger.debug ("getSiteStatus - Successfully: " + siteStatus);
448         }
449         return siteStatus;
450     }
451
452     /**
453      * Fetch a specific SiteStatus by SiteName.
454      *
455      * @param siteName The unique name of the site
456      * @param status The updated status of the Site
457      */
458     public static void updateSiteStatus (String siteName, boolean status) {
459         Session session = HibernateUtil.getSessionFactory ().openSession ();
460         session.beginTransaction ();
461
462         long startTime = System.currentTimeMillis ();
463         msoLogger.debug ("Request database - save Site Status with Site name:" + siteName);
464         try {
465             String hql = "FROM SiteStatus WHERE siteName = :site_name";
466             Query query = session.createQuery (hql);
467             query.setParameter ("site_name", siteName);
468
469             SiteStatus siteStatus = (SiteStatus) query.uniqueResult ();
470             if (siteStatus == null) {
471                 siteStatus = new SiteStatus ();
472                 siteStatus.setSiteName (siteName);
473                 siteStatus.setStatus (status);
474                 //siteStatus.setCreated(new Timestamp(new Date().getTime()));
475                 session.save (siteStatus);
476             } else {
477                 siteStatus.setStatus(status);
478                 //siteStatus.setCreated(new Timestamp(new Date().getTime()));
479                 session.merge (siteStatus);
480             }
481             session.getTransaction ().commit ();
482         } finally {
483             if (session != null && session.isOpen ()) {
484                 session.close ();
485             }
486             msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateSiteStatus", null);
487         }
488     }
489
490 }