6aa5f9127066753d7bd1e32ef07243958c744c1a
[clamp.git] / src / main / java / org / onap / clamp / clds / dao / CldsDao.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP CLAMP
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
6  *                             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  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  */
23
24 package org.onap.clamp.clds.dao;
25
26 import com.att.eelf.configuration.EELFLogger;
27 import com.att.eelf.configuration.EELFManager;
28
29 import java.io.IOException;
30 import java.io.InputStream;
31 import java.io.ObjectInputStream;
32 import java.sql.Blob;
33 import java.sql.ResultSet;
34 import java.sql.SQLException;
35 import java.util.ArrayList;
36 import java.util.HashMap;
37 import java.util.List;
38 import java.util.Map;
39
40 import javax.sql.DataSource;
41
42 import org.onap.clamp.clds.model.CldsDBServiceCache;
43 import org.onap.clamp.clds.model.CldsEvent;
44 import org.onap.clamp.clds.model.CldsModel;
45 import org.onap.clamp.clds.model.CldsModelInstance;
46 import org.onap.clamp.clds.model.CldsServiceData;
47 import org.onap.clamp.clds.model.CldsTemplate;
48 import org.onap.clamp.clds.model.ValueItem;
49 import org.springframework.dao.EmptyResultDataAccessException;
50 import org.springframework.jdbc.core.JdbcTemplate;
51 import org.springframework.jdbc.core.RowMapper;
52 import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
53 import org.springframework.jdbc.core.namedparam.SqlParameterSource;
54 import org.springframework.jdbc.core.simple.SimpleJdbcCall;
55 import org.springframework.stereotype.Repository;
56
57 /**
58  * Data Access for CLDS Model tables.
59  */
60 @Repository("cldsDao")
61 public class CldsDao {
62
63     protected static final EELFLogger logger        = EELFManager.getInstance().getLogger(CldsDao.class);
64     protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
65
66     private JdbcTemplate              jdbcTemplateObject;
67     private SimpleJdbcCall            procGetModel;
68     private SimpleJdbcCall            procGetModelTemplate;
69     private SimpleJdbcCall            procSetModel;
70     private SimpleJdbcCall            procInsEvent;
71     private SimpleJdbcCall            procUpdEvent;
72     private SimpleJdbcCall            procSetTemplate;
73     private SimpleJdbcCall            procGetTemplate;
74     private SimpleJdbcCall            procDelAllModelInstances;
75     private SimpleJdbcCall            procInsModelInstance;
76     private SimpleJdbcCall            procDelModelInstance;
77
78     private static final String       HEALTHCHECK   = "Select 1";
79
80     /**
81      * Log message when instantiating
82      */
83     public CldsDao() {
84         logger.info("CldsDao instantiating...");
85     }
86
87     /**
88      * When dataSource is provided, instantiate spring jdbc objects.
89      *
90      * @param dataSource
91      */
92     public void setDataSource(DataSource dataSource) {
93         this.jdbcTemplateObject = new JdbcTemplate(dataSource);
94         this.procGetModel = new SimpleJdbcCall(dataSource).withProcedureName("get_model");
95         this.procGetModelTemplate = new SimpleJdbcCall(dataSource).withProcedureName("get_model_template");
96         this.procSetModel = new SimpleJdbcCall(dataSource).withProcedureName("set_model");
97         this.procInsEvent = new SimpleJdbcCall(dataSource).withProcedureName("ins_event");
98         this.procUpdEvent = new SimpleJdbcCall(dataSource).withProcedureName("upd_event");
99         this.procGetTemplate = new SimpleJdbcCall(dataSource).withProcedureName("get_template");
100         this.procSetTemplate = new SimpleJdbcCall(dataSource).withProcedureName("set_template");
101         this.procInsModelInstance = new SimpleJdbcCall(dataSource).withProcedureName("ins_model_instance");
102         this.procDelModelInstance = new SimpleJdbcCall(dataSource).withProcedureName("del_model_instance");
103         this.procDelAllModelInstances = new SimpleJdbcCall(dataSource).withProcedureName("del_all_model_instances");
104     }
105
106     /**
107      * Get a model from the database given the model name.
108      *
109      * @param modelName
110      * @return model
111      */
112     public CldsModel getModel(String modelName) {
113         return getModel(modelName, null);
114     }
115
116     /**
117      * Get a model from the database given the controlNameUuid.
118      *
119      * @param controlNameUuid
120      * @return model
121      */
122     public CldsModel getModelByUuid(String controlNameUuid) {
123         return getModel(null, controlNameUuid);
124     }
125
126     /**
127      * Get a model from the database given the model name or a controlNameUuid.
128      *
129      * @param modelName
130      * @return model
131      */
132     private CldsModel getModel(String modelName, String controlNameUuid) {
133         CldsModel model = new CldsModel();
134         model.setName(modelName);
135         SqlParameterSource in = new MapSqlParameterSource().addValue("v_model_name", modelName)
136                 .addValue("v_control_name_uuid", controlNameUuid);
137         Map<String, Object> out = logSqlExecution(procGetModel, in);
138         model.setControlNamePrefix((String) out.get("v_control_name_prefix"));
139         model.setControlNameUuid((String) out.get("v_control_name_uuid"));
140         model.setId((String) (out.get("v_model_id")));
141         model.setTemplateId((String) (out.get("v_template_id")));
142         model.setTemplateName((String) (out.get("v_template_name")));
143         model.setBpmnId((String) (out.get("v_template_bpmn_id")));
144         model.setBpmnUserid((String) out.get("v_template_bpmn_user_id"));
145         model.setBpmnText((String) out.get("v_template_bpmn_text"));
146         model.setPropId((String) (out.get("v_model_prop_id")));
147         model.setPropUserid((String) out.get("v_model_prop_user_id"));
148         model.setPropText((String) out.get("v_model_prop_text"));
149         model.setImageId((String) (out.get("v_template_image_id")));
150         model.setImageUserid((String) out.get("v_template_image_user_id"));
151         model.setImageText((String) out.get("v_template_image_text"));
152         model.setDocId((String) (out.get("v_template_doc_id")));
153         model.setDocUserid((String) out.get("v_template_doc_user_id"));
154         model.setDocText((String) out.get("v_template_doc_text"));
155         model.setBlueprintText((String) out.get("v_model_blueprint_text"));
156         model.getEvent().setId((String) (out.get("v_event_id")));
157         model.getEvent().setActionCd((String) out.get("v_action_cd"));
158         model.getEvent().setActionStateCd((String) out.get("v_action_state_cd"));
159         model.getEvent().setProcessInstanceId((String) out.get("v_event_process_instance_id"));
160         model.getEvent().setUserid((String) out.get("v_event_user_id"));
161         model.setTypeId((String) out.get("v_service_type_id"));
162         model.setDeploymentId((String) out.get("v_deployment_id"));
163         return model;
164     }
165
166     /**
167      * Get a model and template information from the database given the model
168      * name.
169      *
170      * @param modelName
171      * @return model
172      */
173     public CldsModel getModelTemplate(String modelName) {
174         CldsModel model = new CldsModel();
175         model.setName(modelName);
176         SqlParameterSource in = new MapSqlParameterSource().addValue("v_model_name", modelName);
177         Map<String, Object> out = logSqlExecution(procGetModelTemplate, in);
178         // todo : rationalize
179         model.setControlNamePrefix((String) out.get("v_control_name_prefix"));
180         model.setControlNameUuid((String) out.get("v_control_name_uuid"));
181         model.setId((String) (out.get("v_model_id")));
182         model.setTemplateId((String) (out.get("v_template_id")));
183         model.setTemplateName((String) (out.get("v_template_name")));
184         model.setBpmnId((String) (out.get("v_template_bpmn_id")));
185         model.setBpmnUserid((String) out.get("v_template_bpmn_user_id"));
186         model.setBpmnText((String) out.get("v_template_bpmn_text"));
187         model.setPropId((String) (out.get("v_model_prop_id")));
188         model.setPropUserid((String) out.get("v_model_prop_user_id"));
189         model.setPropText((String) out.get("v_model_prop_text"));
190         model.setImageId((String) (out.get("v_template_image_id")));
191         model.setImageUserid((String) out.get("v_template_image_user_id"));
192         model.setImageText((String) out.get("v_template_image_text"));
193         model.setDocId((String) (out.get("v_template_doc_id")));
194         model.setDocUserid((String) out.get("v_template_doc_user_id"));
195         model.setDocText((String) out.get("v_template_doc_text"));
196         model.setBlueprintText((String) out.get("v_model_blueprint_text"));
197         model.getEvent().setId((String) (out.get("v_event_id")));
198         model.getEvent().setActionCd((String) out.get("v_action_cd"));
199         model.getEvent().setActionStateCd((String) out.get("v_action_state_cd"));
200         model.getEvent().setProcessInstanceId((String) out.get("v_event_process_instance_id"));
201         model.getEvent().setUserid((String) out.get("v_event_user_id"));
202         model.setTypeId((String) out.get("v_service_type_id"));
203         model.setDeploymentId((String) out.get("v_deployment_id"));
204
205         Map<String, Object> modelResults = logSqlExecution(procGetModel, in);
206         Object modelResultObject = modelResults.get("#result-set-1");
207         if (modelResultObject != null && modelResultObject instanceof ArrayList) {
208             List<Object> modelInstanceRs = (List<Object>) modelResultObject;
209             for (Object currModelInstance : modelInstanceRs) {
210                 if (currModelInstance != null && currModelInstance instanceof HashMap) {
211                     HashMap<String, String> modelInstanceMap = (HashMap<String, String>) currModelInstance;
212                     CldsModelInstance modelInstance = new CldsModelInstance();
213                     modelInstance.setModelInstanceId(modelInstanceMap.get("model_instance_id"));
214                     modelInstance.setVmName(modelInstanceMap.get("vm_name"));
215                     modelInstance.setLocation(modelInstanceMap.get("location"));
216                     model.getCldsModelInstanceList().add(modelInstance);
217                     logger.info("value of currModel: {}", currModelInstance);
218                 }
219             }
220         }
221         return model;
222     }
223
224     /**
225      * Update model in the database using parameter values and return updated
226      * model object.
227      *
228      * @param model
229      * @param userid
230      * @return
231      */
232     public CldsModel setModel(CldsModel model, String userid) {
233         SqlParameterSource in = new MapSqlParameterSource().addValue("v_model_name", model.getName())
234                 .addValue("v_template_id", model.getTemplateId()).addValue("v_user_id", userid)
235                 .addValue("v_model_prop_text", model.getPropText())
236                 .addValue("v_model_blueprint_text", model.getBlueprintText())
237                 .addValue("v_service_type_id", model.getTypeId()).addValue("v_deployment_id", model.getDeploymentId())
238                 .addValue("v_control_name_prefix", model.getControlNamePrefix())
239                 .addValue("v_control_name_uuid", model.getControlNameUuid());
240         Map<String, Object> out = logSqlExecution(procSetModel, in);
241         model.setControlNamePrefix((String) out.get("v_control_name_prefix"));
242         model.setControlNameUuid((String) out.get("v_control_name_uuid"));
243         model.setId((String) (out.get("v_model_id")));
244         model.setPropId((String) (out.get("v_model_prop_id")));
245         model.setPropUserid((String) (out.get("v_model_prop_user_id")));
246         model.setBlueprintId((String) (out.get("v_model_blueprint_id")));
247         model.setBlueprintUserid((String) out.get("v_model_blueprint_user_id"));
248         model.getEvent().setId((String) (out.get("v_event_id")));
249         model.getEvent().setActionCd((String) out.get("v_action_cd"));
250         model.getEvent().setActionStateCd((String) out.get("v_action_state_cd"));
251         model.getEvent().setProcessInstanceId((String) out.get("v_event_process_instance_id"));
252         model.getEvent().setUserid((String) out.get("v_event_user_id"));
253         return model;
254     }
255
256     /**
257      * Inserts new modelInstance in the database using parameter values and
258      * return updated model object.
259      *
260      * @param model
261      * @param modelInstancesList
262      * @return
263      */
264     public void insModelInstance(CldsModel model, List<CldsModelInstance> modelInstancesList) {
265         // Delete all existing model instances for given controlNameUUID
266         logger.debug("deleting instances for: {}", model.getControlNameUuid());
267         delAllModelInstances(model.getControlNameUuid());
268
269         if (modelInstancesList == null) {
270             logger.debug("modelInstancesList == null");
271         } else {
272             for (CldsModelInstance currModelInstance : modelInstancesList) {
273                 logger.debug("v_control_name_uuid={}", model.getControlNameUuid());
274                 logger.debug("v_vm_name={}", currModelInstance.getVmName());
275                 logger.debug("v_location={}", currModelInstance.getLocation());
276                 SqlParameterSource in = new MapSqlParameterSource()
277                         .addValue("v_control_name_uuid", model.getControlNameUuid())
278                         .addValue("v_vm_name", currModelInstance.getVmName())
279                         .addValue("v_location", currModelInstance.getLocation());
280                 Map<String, Object> out = logSqlExecution(procInsModelInstance, in);
281                 model.setId((String) (out.get("v_model_id")));
282                 CldsModelInstance modelInstance = new CldsModelInstance();
283                 modelInstance.setLocation(currModelInstance.getLocation());
284                 modelInstance.setVmName(currModelInstance.getVmName());
285                 modelInstance.setModelInstanceId((String) (out.get("v_model_instance_id")));
286                 model.getCldsModelInstanceList().add(modelInstance);
287             }
288         }
289     }
290
291     /**
292      * Delete a list of modelInstance from the database using parameter values
293      * and returns updated model object. This method is defunct - DCAE Proxy
294      * will not undeploy individual instances. It will send an empty list of
295      * deployed instances to indicate all have been removed. Or it will send an
296      * updated list to indicate those that are still deployed with any not on
297      * the list considered undeployed.
298      *
299      * @param controlNameUUid
300      * @param modelInstancesList
301      * @return
302      */
303     private CldsModel delModelInstance(String controlNameUUid, List<CldsModelInstance> modelInstancesList) {
304         CldsModel model = new CldsModel();
305         for (CldsModelInstance currModelInstance : modelInstancesList) {
306             SqlParameterSource in = new MapSqlParameterSource().addValue("v_control_name_uuid", controlNameUUid)
307                     .addValue("v_vm_name", currModelInstance.getVmName());
308             Map<String, Object> out = logSqlExecution(procDelModelInstance, in);
309             model.setId((String) (out.get("v_model_id")));
310         }
311         return model;
312     }
313
314     /**
315      * Insert an event in the database - require either modelName or
316      * controlNamePrefix/controlNameUuid.
317      *
318      * @param modelName
319      * @param controlNamePrefix
320      * @param controlNameUuid
321      * @param cldsEvent
322      * @return
323      */
324     public CldsEvent insEvent(String modelName, String controlNamePrefix, String controlNameUuid, CldsEvent cldsEvent) {
325         CldsEvent event = new CldsEvent();
326         SqlParameterSource in = new MapSqlParameterSource().addValue("v_model_name", modelName)
327                 .addValue("v_control_name_prefix", controlNamePrefix).addValue("v_control_name_uuid", controlNameUuid)
328                 .addValue("v_user_id", cldsEvent.getUserid()).addValue("v_action_cd", cldsEvent.getActionCd())
329                 .addValue("v_action_state_cd", cldsEvent.getActionStateCd())
330                 .addValue("v_process_instance_id", cldsEvent.getProcessInstanceId());
331         Map<String, Object> out = logSqlExecution(procInsEvent, in);
332         event.setId((String) (out.get("v_event_id")));
333         return event;
334     }
335
336     /**
337      * Method to delete all model instances based on controlNameUUID
338      *
339      * @param controlNameUUid
340      * @return
341      */
342     private String delAllModelInstances(String controlNameUUid) {
343         SqlParameterSource in = new MapSqlParameterSource().addValue("v_control_name_uuid", controlNameUUid);
344         Map<String, Object> out = logSqlExecution(procDelAllModelInstances, in);
345         return (String) (out.get("v_model_id"));
346     }
347
348     /**
349      * Update event with process instance id.
350      *
351      * @param eventId
352      * @param processInstanceId
353      */
354     public void updEvent(String eventId, String processInstanceId) {
355         SqlParameterSource in = new MapSqlParameterSource().addValue("v_event_id", eventId)
356                 .addValue("v_process_instance_id", processInstanceId);
357         logSqlExecution(procUpdEvent, in);
358     }
359
360     /**
361      * Generic mapper for list of values
362      */
363     private static final class ValueItemMapper implements RowMapper<ValueItem> {
364         @Override
365         public ValueItem mapRow(ResultSet rs, int rowNum) throws SQLException {
366             ValueItem item = new ValueItem();
367             item.setValue(rs.getString(1));
368             return item;
369         }
370     }
371
372     /**
373      * Generic mapper for CldsDBServiceCache
374      */
375     private static final class CldsServiceDataMapper implements RowMapper<CldsServiceData> {
376         @Override
377         public CldsServiceData mapRow(ResultSet rs, int rowNum) throws SQLException {
378             CldsServiceData cldsServiceData = new CldsServiceData();
379             long age;
380             age = rs.getLong(5);
381             Blob blob = rs.getBlob(4);
382             InputStream is = blob.getBinaryStream();
383             ObjectInputStream oip;
384             try {
385                 oip = new ObjectInputStream(is);
386                 cldsServiceData = (CldsServiceData) oip.readObject();
387                 cldsServiceData.setAgeOfRecord(age);
388             } catch (IOException | ClassNotFoundException e) {
389                 logger.error("Error caught while retrieving cldsServiceData from database", e);
390             }
391             return cldsServiceData;
392         }
393     }
394
395     /**
396      * Return list of model names
397      *
398      * @return model names
399      */
400     public List<ValueItem> getBpmnNames() {
401         String sql = "SELECT model_name FROM model ORDER BY 1;";
402         return jdbcTemplateObject.query(sql, new ValueItemMapper());
403     }
404
405     /**
406      * Update template in the database using parameter values and return updated
407      * template object.
408      *
409      * @param template
410      * @param userid
411      */
412     public void setTemplate(CldsTemplate template, String userid) {
413         SqlParameterSource in = new MapSqlParameterSource().addValue("v_template_name", template.getName())
414                 .addValue("v_user_id", userid).addValue("v_template_bpmn_text", template.getBpmnText())
415                 .addValue("v_template_image_text", template.getImageText())
416                 .addValue("v_template_doc_text", template.getPropText());
417         Map<String, Object> out = logSqlExecution(procSetTemplate, in);
418         template.setId((String) (out.get("v_template_id")));
419         template.setBpmnUserid((String) (out.get("v_template_bpmn_user_id")));
420         template.setBpmnId((String) (out.get("v_template_bpmn_id")));
421         template.setBpmnText((String) (out.get("v_template_bpmn_text")));
422         template.setImageId((String) (out.get("v_template_image_id")));
423         template.setImageUserid((String) out.get("v_template_image_user_id"));
424         template.setImageText((String) out.get("v_template_image_text"));
425         template.setPropId((String) (out.get("v_template_doc_id")));
426         template.setPropUserid((String) out.get("v_template_doc_user_id"));
427         template.setPropText((String) out.get("v_template_doc_text"));
428     }
429
430     /**
431      * Return list of template names
432      *
433      * @return template names
434      */
435     public List<ValueItem> getTemplateNames() {
436         String sql = "SELECT template_name FROM template ORDER BY 1;";
437         return jdbcTemplateObject.query(sql, new ValueItemMapper());
438     }
439
440     /**
441      * Get a template from the database given the model name.
442      *
443      * @param templateName
444      * @return model
445      */
446     public CldsTemplate getTemplate(String templateName) {
447         CldsTemplate template = new CldsTemplate();
448         template.setName(templateName);
449         SqlParameterSource in = new MapSqlParameterSource().addValue("v_template_name", templateName);
450         Map<String, Object> out = logSqlExecution(procGetTemplate, in);
451         template.setId((String) (out.get("v_template_id")));
452         template.setBpmnUserid((String) (out.get("v_template_bpmn_user_id")));
453         template.setBpmnId((String) (out.get("v_template_bpmn_id")));
454         template.setBpmnText((String) (out.get("v_template_bpmn_text")));
455         template.setImageId((String) (out.get("v_template_image_id")));
456         template.setImageUserid((String) out.get("v_template_image_user_id"));
457         template.setImageText((String) out.get("v_template_image_text"));
458         template.setPropId((String) (out.get("v_template_doc_id")));
459         template.setPropUserid((String) out.get("v_template_doc_user_id"));
460         template.setPropText((String) out.get("v_template_doc_text"));
461         return template;
462     }
463
464     public CldsServiceData getCldsServiceCache(String invariantUUID) {
465         CldsServiceData cldsServiceData = null;
466         List<CldsServiceData> cldsServiceDataList = new ArrayList<>();
467         try {
468             String getCldsServiceSQL = "SELECT * , TIMESTAMPDIFF(SECOND, timestamp, CURRENT_TIMESTAMP()) FROM clds_service_cache where invariant_service_id  = ? ";
469             cldsServiceData = jdbcTemplateObject.queryForObject(getCldsServiceSQL, new Object[] { invariantUUID },
470                     new CldsServiceDataMapper());
471             logger.info("value of cldsServiceDataList: {}", cldsServiceDataList);
472         } catch (EmptyResultDataAccessException e) {
473             logger.info("cache row not found for invariantUUID: {}", invariantUUID);
474         }
475         return cldsServiceData;
476     }
477
478     public void setCldsServiceCache(CldsDBServiceCache cldsDBServiceCache) {
479         if (cldsDBServiceCache != null && cldsDBServiceCache.getInvariantId() != null
480                 && cldsDBServiceCache.getServiceId() != null) {
481             String invariantUuid = cldsDBServiceCache.getInvariantId();
482             String serviceUuid = cldsDBServiceCache.getServiceId();
483             InputStream is = cldsDBServiceCache.getCldsDataInstream();
484             String insertCldsServiceCacheSql = "INSERT INTO clds_service_cache"
485                     + "(invariant_service_id,service_id,timestamp,object_data) VALUES"
486                     + "(?,?,CURRENT_TIMESTAMP,?) ON DUPLICATE KEY UPDATE invariant_service_id = VALUES(invariant_service_id) , timestamp = CURRENT_TIMESTAMP , object_data = VALUES(object_data) ";
487             jdbcTemplateObject.update(insertCldsServiceCacheSql, invariantUuid, serviceUuid, is);
488         }
489     }
490
491     private static Map<String, Object> logSqlExecution(SimpleJdbcCall call, SqlParameterSource source) {
492         try {
493             return call.execute(source);
494         } catch (Exception e) {
495             logger.error("Exception occured in " + source.getClass().getCanonicalName() + ": " + e);
496             throw e;
497         }
498     }
499
500     public void doHealthCheck() {
501         jdbcTemplateObject.execute(HEALTHCHECK);
502     }
503
504 }