733d03bf6f76a4518e92568d85f6b8f9135af780
[appc.git] / appc-config / appc-flow-controller / provider / src / main / java / org / onap / appc / flow / controller / dbervices / FlowControlDBService.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP : APPC
4  * ================================================================================
5  * Copyright (C) 2017-2018 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  *
19  * ============LICENSE_END=========================================================
20  */
21 package org.onap.appc.flow.controller.dbervices;
22
23 import com.att.eelf.configuration.EELFLogger;
24 import com.att.eelf.configuration.EELFManager;
25 import java.util.Map;
26 import org.apache.commons.lang.StringUtils;
27 import org.onap.appc.flow.controller.data.Transaction;
28 import org.onap.appc.flow.controller.utils.EscapeUtils;
29 import org.onap.appc.flow.controller.utils.FlowControllerConstants;
30 import org.onap.ccsdk.sli.adaptors.resource.sql.SqlResource;
31 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
32 import org.onap.ccsdk.sli.core.sli.SvcLogicException;
33 import org.onap.ccsdk.sli.core.sli.SvcLogicResource;
34 import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus;
35
36 public class FlowControlDBService {
37
38     private static final EELFLogger log = EELFManager.getInstance().getLogger(FlowControlDBService.class);
39     private static final String QUERY_STR = "Query String : ";
40     private static final String FAILURE_PARAM = "FAILURE";
41     private static final String GET_FLOW_REF_DATA_ERROR = "Error - while getting FlowReferenceData ";
42     private static final String SELECT_AS_QUERY_STR = "select max(internal_version) as maxInternalVersion, artifact_name as artifactName from ";
43     private static final String WHERE_ART_NAME_QUERY_STR = " where artifact_name in (select artifact_name from ";
44     private static final String WHERE_VNF_TYPE_QUERY_STR = " where vnf_type= $";
45     private static final String SELECT_ART_CONTENT_QUERY_STR = "select artifact_content from ";
46     private static final String WHERE_ARTIFACT_NAME_QUERY_STR = " where artifact_name = $artifactName  and internal_version = $maxInternalVersion ";
47     private static final String ARTIFACT_CONTENT_PARAM = "artifact-content";
48     private static final String COUNT_PROTOCOL_PARAM = "count(protocol)";
49     private static final String WHERE_ACTION_QUERY_STR = " where action = '";
50     private static final String AND_ACTION_LEVEL_QUERY_STR = " and action_level = '";
51
52     private SvcLogicResource serviceLogic;
53     private static FlowControlDBService dgGeneralDBService = null;
54
55     private FlowControlDBService() {
56         if (serviceLogic == null) {
57             serviceLogic = new SqlResource();
58         }
59     }
60
61     protected FlowControlDBService(SqlResource svcLogic) {
62             serviceLogic = svcLogic;
63     }
64
65     public static FlowControlDBService initialise() {
66         if (dgGeneralDBService == null) {
67             dgGeneralDBService = new FlowControlDBService();
68         }
69         return dgGeneralDBService;
70     }
71
72     public void getFlowReferenceData(SvcLogicContext ctx, Map<String, String> inParams, SvcLogicContext localContext)
73         throws SvcLogicException {
74
75         String fn = "DBService.getflowModelInfo";
76         String whereClause = " where ACTION = $" + FlowControllerConstants.REQUEST_ACTION;
77
78         if (StringUtils.isNotBlank(ctx.getAttribute(FlowControllerConstants.VNF_TYPE))) {
79             whereClause = whereClause.concat(" and VNF_TYPE = $" + FlowControllerConstants.VNF_TYPE);
80         }
81         if (StringUtils.isNotBlank(ctx.getAttribute(FlowControllerConstants.ACTION_LEVEL))) {
82             whereClause = whereClause.concat(" and ACTION_LEVEL = $" + FlowControllerConstants.ACTION_LEVEL);
83         }
84
85         QueryStatus status;
86         if (serviceLogic != null && localContext != null) {
87             String key = "select SEQUENCE_TYPE, CATEGORY, GENERATION_NODE, EXECUTION_NODE from "
88                 + FlowControllerConstants.DB_MULTISTEP_FLOW_REFERENCE + whereClause;
89             log.debug(fn + QUERY_STR + key);
90             status = serviceLogic.query("SQL", false, null, key, null, null, localContext);
91             if (status.toString().equals(FAILURE_PARAM)) {
92                 throw new SvcLogicException(GET_FLOW_REF_DATA_ERROR);
93             }
94         }
95     }
96
97     public String getEndPointByAction(String action) {
98         return null;
99     }
100
101     public String getDesignTimeFlowModel(SvcLogicContext localContext) throws SvcLogicException {
102         String fn = "DBService.getDesignTimeFlowModel ";
103         QueryStatus status;
104         if (serviceLogic != null && localContext != null) {
105             String queryString =
106                 SELECT_AS_QUERY_STR
107                     + FlowControllerConstants.DB_SDC_ARTIFACTS + WHERE_ART_NAME_QUERY_STR
108                     + FlowControllerConstants.DB_SDC_REFERENCE + WHERE_VNF_TYPE_QUERY_STR
109                     + FlowControllerConstants.VNF_TYPE
110                     + " and  vnfc_type = $" + FlowControllerConstants.VNFC_TYPE + " and  action = $"
111                     + FlowControllerConstants.REQUEST_ACTION + " and file_category =  $"
112                     + FlowControllerConstants.CATEGORY + " )";
113
114             log.debug(fn + QUERY_STR + queryString);
115             status = serviceLogic.query("SQL", false, null, queryString, null, null, localContext);
116
117             if (status.toString().equals(FAILURE_PARAM)) {
118                 throw new SvcLogicException(GET_FLOW_REF_DATA_ERROR);
119             }
120
121             String queryString1 = SELECT_ART_CONTENT_QUERY_STR + FlowControllerConstants.DB_SDC_ARTIFACTS
122                 + WHERE_ARTIFACT_NAME_QUERY_STR;
123
124             log.debug(fn + QUERY_STR + queryString1);
125             status = serviceLogic.query("SQL", false, null, queryString1, null, null, localContext);
126             if (status.toString().equals(FAILURE_PARAM)) {
127                 throw new SvcLogicException(GET_FLOW_REF_DATA_ERROR);
128             }
129         }
130         return localContext != null ? localContext.getAttribute(ARTIFACT_CONTENT_PARAM) : null;
131     }
132
133     public QueryStatus loadSequenceIntoDB(SvcLogicContext localContext) throws SvcLogicException {
134
135         QueryStatus status = null;
136         if (localContext != null) {
137             String fn = "DBService.saveArtifacts";
138
139             localContext.setAttribute(FlowControllerConstants.ARTIFACT_CONTENT_ESCAPED,
140                 EscapeUtils.escapeSql(localContext.getAttribute(FlowControllerConstants.ARTIFACT_CONTENT)));
141             log.debug("ESCAPED sequence for DB : "
142                 + localContext.getAttribute(FlowControllerConstants.ARTIFACT_CONTENT_ESCAPED));
143
144             for (Object key : localContext.getAttributeKeySet()) {
145                 String parmName = (String) key;
146                 String parmValue = localContext.getAttribute(parmName);
147                 log.debug(" loadSequenceIntoDB " + parmName + "=" + parmValue);
148             }
149
150             String queryString = "INSERT INTO " + FlowControllerConstants.DB_REQUEST_ARTIFACTS + " set request_id =  $"
151                 + FlowControllerConstants.REQUEST_ID + " , action =  $" + FlowControllerConstants.REQUEST_ACTION
152                 + " , action_level =  $" + FlowControllerConstants.ACTION_LEVEL + " , vnf_type = $"
153                 + FlowControllerConstants.VNF_TYPE + " , category = $" + FlowControllerConstants.CATEGORY
154                 + " , artifact_content = $" + FlowControllerConstants.ARTIFACT_CONTENT_ESCAPED
155                 + " , updated_date = sysdate() ";
156
157             log.debug(fn + QUERY_STR + queryString);
158             status = serviceLogic.save("SQL", false, false, queryString, null, null, localContext);
159             if (status.toString().equals(FAILURE_PARAM)) {
160                 throw new SvcLogicException("Error While processing storing Artifact: "
161                     + localContext.getAttribute(FlowControllerConstants.ARTIFACT_NAME));
162             }
163         }
164         return status;
165
166     }
167
168     public void populateModuleAndRPC(Transaction transaction, String vnfType) throws SvcLogicException {
169         String fn = "FlowControlDBService.populateModuleAndRPC ";
170         QueryStatus status;
171         SvcLogicContext context = new SvcLogicContext();
172         String protocolType = getProtocolType(transaction, vnfType, fn, context);
173
174         String key = "select execution_type, execution_module, execution_rpc from "
175             + FlowControllerConstants.DB_PROCESS_FLOW_REFERENCE + WHERE_ACTION_QUERY_STR + transaction.getAction()
176             + "'" + AND_ACTION_LEVEL_QUERY_STR + transaction.getActionLevel() + "'" + " and protocol = '"
177             + protocolType + "'";
178
179         log.debug(fn + QUERY_STR + key);
180         status = serviceLogic.query("SQL", false, null, key, null, null, context);
181         if (status.toString().equals(FAILURE_PARAM)) {
182             throw new SvcLogicException(GET_FLOW_REF_DATA_ERROR);
183         }
184
185         transaction.setExecutionModule(context.getAttribute(FlowControllerConstants.EXECUTTION_MODULE));
186         transaction.setExecutionRPC(context.getAttribute(FlowControllerConstants.EXECUTION_RPC));
187         transaction.setExecutionType(context.getAttribute(FlowControllerConstants.EXECUTION_TYPE));
188
189     }
190
191     private String getProtocolType(Transaction transaction, String vnfType, String fn, SvcLogicContext context)
192         throws SvcLogicException {
193         QueryStatus status;
194         String protocolQuery;
195         int protocolCount;
196         protocolQuery = "select count(protocol) from " + FlowControllerConstants.DB_PROTOCOL_REFERENCE
197             + WHERE_ACTION_QUERY_STR + transaction.getAction() + "'" + AND_ACTION_LEVEL_QUERY_STR
198             + transaction.getActionLevel() + "'";
199
200         log.debug(fn + QUERY_STR + protocolQuery);
201         status = serviceLogic.query("SQL", false, null, protocolQuery, null, null, context);
202         if (status.toString().equals(FAILURE_PARAM)) {
203             throw new SvcLogicException(GET_FLOW_REF_DATA_ERROR);
204         }
205
206         log.debug(" Protocol Count " + context.getAttribute(COUNT_PROTOCOL_PARAM));
207         protocolCount = Integer.parseInt(context.getAttribute(COUNT_PROTOCOL_PARAM));
208
209         if (protocolCount == 1) {
210             protocolQuery = "select protocol from " + FlowControllerConstants.DB_PROTOCOL_REFERENCE
211                 + WHERE_ACTION_QUERY_STR + transaction.getAction() + "'" + AND_ACTION_LEVEL_QUERY_STR
212                 + transaction.getActionLevel() + "'";
213
214             log.debug(fn + QUERY_STR + protocolQuery);
215             status = serviceLogic.query("SQL", false, null, protocolQuery, null, null, context);
216             if (status.toString().equals(FAILURE_PARAM)) {
217                 throw new SvcLogicException(GET_FLOW_REF_DATA_ERROR);
218             }
219             return context.getAttribute("protocol");
220         } else {
221             if (hasSingleProtocol(transaction, vnfType, fn, context)) {
222                 return context.getAttribute("protocol");
223             }
224         }
225         return null;
226     }
227
228     private boolean hasSingleProtocol(Transaction transaction, String vnfType, String fn, SvcLogicContext context)
229         throws SvcLogicException {
230         String protocolQuery;
231         QueryStatus status;
232         int protocolCount;
233         protocolQuery = "select count(protocol) from " + FlowControllerConstants.DB_PROTOCOL_REFERENCE
234             + WHERE_ACTION_QUERY_STR + transaction.getAction() + "'" + AND_ACTION_LEVEL_QUERY_STR
235             + transaction.getActionLevel() + "'" + " and vnf_type = '" + vnfType + "'";
236
237         log.debug(fn + QUERY_STR + protocolQuery);
238         status = serviceLogic.query("SQL", false, null, protocolQuery, null, null, context);
239         if (status.toString().equals(FAILURE_PARAM)) {
240             throw new SvcLogicException(GET_FLOW_REF_DATA_ERROR);
241         }
242
243         log.debug(" Protocol Count " + context.getAttribute(COUNT_PROTOCOL_PARAM));
244         protocolCount = Integer.parseInt(context.getAttribute(COUNT_PROTOCOL_PARAM));
245         if (protocolCount > 1) {
246             throw new SvcLogicException("Got more than 2 values..");
247         } else if (protocolCount == 1) {
248             protocolQuery = "select protocol from " + FlowControllerConstants.DB_PROTOCOL_REFERENCE
249                 + WHERE_ACTION_QUERY_STR + transaction.getAction() + "'" + AND_ACTION_LEVEL_QUERY_STR
250                 + transaction.getActionLevel() + "'" + " and vnf_type = '" + vnfType + "'";
251             log.debug(fn + QUERY_STR + protocolQuery);
252             status = serviceLogic.query("SQL", false, null, protocolQuery, null, null, context);
253             if (status.toString().equals(FAILURE_PARAM)) {
254                 throw new SvcLogicException(GET_FLOW_REF_DATA_ERROR);
255             }
256             return true;
257         }
258         return false;
259     }
260
261     public String getDependencyInfo(SvcLogicContext localContext) throws SvcLogicException {
262         String fn = "DBService.getDependencyInfo ";
263         QueryStatus status;
264         if (serviceLogic != null && localContext != null) {
265             String queryString =
266                 SELECT_AS_QUERY_STR
267                     + FlowControllerConstants.DB_SDC_ARTIFACTS + WHERE_ART_NAME_QUERY_STR
268                     + FlowControllerConstants.DB_SDC_REFERENCE + WHERE_VNF_TYPE_QUERY_STR
269                     + FlowControllerConstants.VNF_TYPE
270                     + " and file_category = '" + FlowControllerConstants.DEPENDENCYMODEL + "' )";
271
272             log.debug(fn + QUERY_STR + queryString);
273             status = serviceLogic.query("SQL", false, null, queryString, null, null, localContext);
274
275             if (status.toString().equals(FAILURE_PARAM)) {
276                 throw new SvcLogicException("Error - while getting dependencydata ");
277             }
278
279             String queryString1 = SELECT_ART_CONTENT_QUERY_STR + FlowControllerConstants.DB_SDC_ARTIFACTS
280                 + WHERE_ARTIFACT_NAME_QUERY_STR;
281
282             log.debug(fn + QUERY_STR + queryString1);
283             status = serviceLogic.query("SQL", false, null, queryString1, null, null, localContext);
284             if (status.toString().equals(FAILURE_PARAM)) {
285                 throw new SvcLogicException("Error - while getting dependencyData ");
286             }
287         }
288
289         return localContext != null ? localContext.getAttribute(ARTIFACT_CONTENT_PARAM) : null;
290
291     }
292
293     public String getCapabilitiesData(SvcLogicContext localContext) throws SvcLogicException {
294         String fn = "DBService.getCapabilitiesData ";
295         QueryStatus status;
296         if (serviceLogic != null && localContext != null) {
297             String queryString =
298                 SELECT_AS_QUERY_STR
299                     + FlowControllerConstants.DB_SDC_ARTIFACTS + WHERE_ART_NAME_QUERY_STR
300                     + FlowControllerConstants.DB_SDC_REFERENCE + WHERE_VNF_TYPE_QUERY_STR
301                     + FlowControllerConstants.VNF_TYPE
302                     + " and file_category = '" + FlowControllerConstants.CAPABILITY + "' )";
303
304             log.info(fn + QUERY_STR + queryString);
305             status = serviceLogic.query("SQL", false, null, queryString, null, null, localContext);
306
307             if (status.toString().equals(FAILURE_PARAM)) {
308                 throw new SvcLogicException("Error - while getting capabilitiesData ");
309             }
310
311             String queryString1 = SELECT_ART_CONTENT_QUERY_STR + FlowControllerConstants.DB_SDC_ARTIFACTS
312                 + WHERE_ARTIFACT_NAME_QUERY_STR;
313
314             log.debug(fn + QUERY_STR + queryString1);
315             status = serviceLogic.query("SQL", false, null, queryString1, null, null, localContext);
316             if (status.toString().equals(FAILURE_PARAM)) {
317                 throw new SvcLogicException("Error - while getting capabilitiesData ");
318             }
319         }
320         return localContext != null ? localContext.getAttribute(ARTIFACT_CONTENT_PARAM) : null;
321     }
322 }