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