2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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.
24 package org.onap.clamp.clds.dao;
26 import com.att.eelf.configuration.EELFLogger;
27 import com.att.eelf.configuration.EELFManager;
29 import java.io.InputStream;
30 import java.util.ArrayList;
31 import java.util.HashMap;
32 import java.util.List;
35 import javax.sql.DataSource;
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;
53 * Data Access for CLDS Model tables.
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";
73 * Log message when instantiating
76 logger.info("CldsDao instantiating...");
80 * When dataSource is provided, instantiate spring jdbc objects.
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");
99 * Get a model from the database given the model name.
104 public CldsModel getModel(String modelName) {
105 return getModel(modelName, null);
109 * Get a model from the database given the controlNameUuid.
111 * @param controlNameUuid
114 public CldsModel getModelByUuid(String controlNameUuid) {
115 return getModel(null, controlNameUuid);
119 * Get a model from the database given the model name or a controlNameUuid.
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"));
159 * Get a model and template information from the database given the model
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);
216 * Update model in the database using parameter values and return updated
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"));
248 * Inserts new modelInstance in the database using parameter values and
249 * return updated model object.
252 * @param modelInstancesList
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");
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);
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.
289 * @param controlNameUUid
290 * @param modelInstancesList
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")));
305 * Insert an event in the database - require either modelName or
306 * controlNamePrefix/controlNameUuid.
309 * @param controlNamePrefix
310 * @param controlNameUuid
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")));
327 * Method to delete all model instances based on controlNameUUID
329 * @param controlNameUUid
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"));
339 * Update event with process instance id.
342 * @param processInstanceId
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);
351 * Return list of model names
353 * @return model names
355 public List<ValueItem> getBpmnNames() {
356 String sql = "SELECT model_name FROM model ORDER BY 1;";
357 return jdbcTemplateObject.query(sql, new ValueItemMapper());
361 * Update template in the database using parameter values and return updated
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"));
386 * Return list of template names
388 * @return template names
390 public List<ValueItem> getTemplateNames() {
391 String sql = "SELECT template_name FROM template ORDER BY 1;";
392 return jdbcTemplateObject.query(sql, new ValueItemMapper());
396 * Get a template from the database given the model name.
398 * @param templateName
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"));
419 public CldsServiceData getCldsServiceCache(String invariantUUID) {
420 CldsServiceData cldsServiceData = null;
421 List<CldsServiceData> cldsServiceDataList = new ArrayList<>();
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);
430 return cldsServiceData;
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);
446 private static Map<String, Object> logSqlExecution(SimpleJdbcCall call, SqlParameterSource source) {
448 return call.execute(source);
449 } catch (Exception e) {
450 logger.error("Exception occured in " + source.getClass().getCanonicalName() + ": " + e);
455 public void doHealthCheck() {
456 jdbcTemplateObject.execute(HEALTHCHECK);
460 * Method to get deployed/active models with model properties.
462 * @return list of CldsModelProp
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);
478 return cldsModelPropList;