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