Merge "Sonar fix in mso-adapter-utils"
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / java / org / onap / so / bpmn / infrastructure / workflow / serviceTask / AbstractSdncOperationTask.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.so.bpmn.infrastructure.workflow.serviceTask;
24
25 import java.io.IOException;
26 import java.util.Arrays;
27 import java.util.HashMap;
28 import java.util.Iterator;
29 import java.util.Map;
30 import org.camunda.bpm.engine.delegate.JavaDelegate;
31 import org.onap.so.logger.LoggingAnchor;
32 import org.apache.commons.lang3.StringUtils;
33 import org.apache.http.client.methods.CloseableHttpResponse;
34 import org.apache.http.client.methods.HttpPost;
35 import org.apache.http.entity.ContentType;
36 import org.apache.http.entity.StringEntity;
37 import org.apache.http.impl.client.CloseableHttpClient;
38 import org.apache.http.impl.client.HttpClients;
39 import org.apache.http.util.EntityUtils;
40 import org.camunda.bpm.engine.delegate.DelegateExecution;
41 import org.json.JSONObject;
42 import org.onap.msb.sdk.discovery.common.RouteException;
43 import org.onap.msb.sdk.httpclient.RestServiceCreater;
44 import org.onap.msb.sdk.httpclient.msb.MSBServiceClient;
45 import org.onap.so.bpmn.core.UrnPropertiesReader;
46 import org.onap.so.bpmn.infrastructure.workflow.serviceTask.client.GenericResourceApi;
47 import org.onap.so.db.request.beans.ResourceOperationStatus;
48 import org.onap.so.logger.ErrorCode;
49 import org.onap.so.logger.MessageEnum;
50 import org.onap.so.requestsdb.RequestsDbConstant;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53 import org.springframework.beans.factory.annotation.Autowired;
54 import org.springframework.core.env.Environment;
55 import com.fasterxml.jackson.annotation.JsonInclude;
56 import com.fasterxml.jackson.core.JsonProcessingException;
57 import com.fasterxml.jackson.databind.ObjectMapper;
58
59 public abstract class AbstractSdncOperationTask implements JavaDelegate {
60
61     private static final Logger logger = LoggerFactory.getLogger(AbstractSdncOperationTask.class);
62
63     @Autowired
64     private Environment env;
65     private static final String DEFAULT_MSB_IP = "127.0.0.1";
66     private static final int DEFAULT_MSB_PORT = 80;
67     private static final String SDCADAPTOR_INPUTS = "resourceParameters";
68     private static final String TOPOLOGY_PROPERTIES = "topology.properties";
69     public static final String ONAP_IP = "ONAP_IP";
70
71     private static final String POST_BODY_TEMPLATE =
72             "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://org.onap.so/requestsdb\"><soapenv:Header/><soapenv:Body>\n"
73                     + "     <ns:updateResourceOperationStatus>\n"
74                     + "                <errorCode>$errorCode</errorCode>\n" + "                <jobId>$jobId</jobId>\n"
75                     + "                <operType>$operType</operType>\n"
76                     + "                <operationId>$operationId</operationId>\n"
77                     + "                <progress>$progress</progress>\n"
78                     + "                <resourceTemplateUUID>$resourceTemplateUUID</resourceTemplateUUID>\n"
79                     + "                <serviceId>$serviceId</serviceId>\n"
80                     + "                <status>$status</status>\n"
81                     + "                <statusDescription>$statusDescription</statusDescription>\n"
82                     + "     </ns:updateResourceOperationStatus></soapenv:Body></soapenv:Envelope>";
83
84     private static final String GET_BODY_TEMPLATE =
85             " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://org.onap.so/requestsdb\"><soapenv:Header/><soapenv:Body>\n"
86                     + "     <ns:getResourceOperationStatus>\n"
87                     + "                <operationId>$operationId</operationId>\n"
88                     + "                <resourceTemplateUUID>$resourceTemplateUUID</resourceTemplateUUID>\n"
89                     + "                <serviceId>$serviceId</serviceId>\n"
90                     + "     </ns:getResourceOperationStatus></soapenv:Body></soapenv:Envelope>";
91
92
93     private void updateResOperStatus(ResourceOperationStatus resourceOperationStatus) throws RouteException {
94         logger.info("AbstractSdncOperationTask.updateResOperStatus begin!");
95         String requestsdbEndPoint = env.getProperty("mso.adapters.openecomp.db.endpoint");
96         HttpPost httpPost = new HttpPost(requestsdbEndPoint);
97         httpPost.addHeader("Authorization", "Basic YnBlbDpwYXNzd29yZDEk");
98         httpPost.addHeader("Content-type", "application/soap+xml");
99         String postBody = getPostStringBody(resourceOperationStatus);
100         httpPost.setEntity(new StringEntity(postBody, ContentType.APPLICATION_XML));
101         httpPost(requestsdbEndPoint, httpPost);
102         logger.info("AbstractSdncOperationTask.updateResOperStatus end!");
103     }
104
105     protected String getPostbody(Object inputEntity) {
106         ObjectMapper objectMapper = new ObjectMapper();
107         String postBody = null;
108         try {
109             objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
110             postBody = objectMapper.writeValueAsString(inputEntity);
111         } catch (JsonProcessingException e) {
112             logger.error(Arrays.toString(e.getStackTrace()));
113         }
114         return postBody;
115     }
116
117     protected String httpPost(String url, HttpPost httpPost) throws RouteException {
118         logger.info("AbstractSdncOperationTask.httpPost begin!");
119         String result = null;
120
121         String errorMsg;
122         try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
123             CloseableHttpResponse closeableHttpResponse = httpClient.execute(httpPost);
124             result = EntityUtils.toString(closeableHttpResponse.getEntity());
125             logger.info("result = {}", result);
126             if (closeableHttpResponse.getStatusLine().getStatusCode() != 200) {
127                 logger.info("exception: fail for status code = {}",
128                         closeableHttpResponse.getStatusLine().getStatusCode());
129                 throw new RouteException(result, "SERVICE_GET_ERR");
130             }
131
132             closeableHttpResponse.close();
133         } catch (IOException e) {
134             errorMsg = url + ":httpPostWithJSON connect faild";
135             logger.info("exception: POST_CONNECT_FAILD : {}", errorMsg);
136             throwsRouteException(errorMsg, e, "POST_CONNECT_FAILD");
137         }
138
139         logger.info("AbstractSdncOperationTask.httpPost end!");
140         return result;
141     }
142
143     private static void throwsRouteException(String errorMsg, Exception e, String errorCode) throws RouteException {
144         String msg = errorMsg + ".errorMsg:" + e.getMessage();
145         logger.info("exception: {}", msg);
146         throw new RouteException(errorMsg, errorCode);
147     }
148
149     private String getPostStringBody(ResourceOperationStatus resourceOperationStatus) {
150         logger.info("AbstractSdncOperationTask.getPostStringBody begin!");
151         String postBody = POST_BODY_TEMPLATE;
152         postBody = postBody.replace("$errorCode", resourceOperationStatus.getErrorCode());
153         postBody = postBody.replace("$jobId", resourceOperationStatus.getJobId());
154         postBody = postBody.replace("$operType", resourceOperationStatus.getOperType());
155         postBody = postBody.replace("$operationId", resourceOperationStatus.getOperationId());
156         postBody = postBody.replace("$progress", resourceOperationStatus.getProgress());
157         postBody = postBody.replace("$resourceTemplateUUID", resourceOperationStatus.getResourceTemplateUUID());
158         postBody = postBody.replace("$serviceId", resourceOperationStatus.getServiceId());
159         postBody = postBody.replace("$status", resourceOperationStatus.getStatus());
160         postBody = postBody.replace("$statusDescription", resourceOperationStatus.getStatusDescription());
161         logger.info("AbstractSdncOperationTask.getPostStringBody end!");
162         return postBody;
163     }
164
165     private String getGetStringBody(String serviceId, String operationId, String resourceTemplateUUID) {
166         logger.info("AbstractSdncOperationTask.getGetStringBody begin!");
167         String getBody = GET_BODY_TEMPLATE;
168         getBody = getBody.replace("$operationId", operationId);
169         getBody = getBody.replace("$resourceTemplateUUID", resourceTemplateUUID);
170         getBody = getBody.replace("$serviceId", serviceId);
171         logger.info("AbstractSdncOperationTask.getGetStringBody end!");
172         return getBody;
173     }
174
175     private ResourceOperationStatus getResourceOperationStatus(String serviceId, String operationId,
176             String resourceTemplateUUID) throws RouteException {
177         logger.info("AbstractSdncOperationTask.getResourceOperationStatus begin!");
178         String requestsdbEndPoint = env.getProperty("mso.adapters.openecomp.db.endpoint");
179         HttpPost httpPost = new HttpPost(requestsdbEndPoint);
180         httpPost.addHeader("Authorization", "Basic YnBlbDpwYXNzd29yZDEk");
181         httpPost.addHeader("Content-type", "application/soap+xml");
182         String getBody = getGetStringBody(serviceId, operationId, resourceTemplateUUID);
183         httpPost.setEntity(new StringEntity(getBody, ContentType.APPLICATION_XML));
184         String result = httpPost(requestsdbEndPoint, httpPost);
185         ResourceOperationStatus resourceOperationStatus = getResourceOperationStatusFromXmlString(result);
186         logger.info("AbstractSdncOperationTask.getResourceOperationStatus end!");
187         return resourceOperationStatus;
188     }
189
190     private ResourceOperationStatus getResourceOperationStatusFromXmlString(String result) {
191         logger.info("AbstractSdncOperationTask.getResourceOperationStatusFromXmlString begin!");
192         ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus();
193         resourceOperationStatus.setErrorCode(getValueByName("errorCode", result));
194         resourceOperationStatus.setJobId(getValueByName("jobId", result));
195         resourceOperationStatus.setOperType(getValueByName("operType", result));
196         resourceOperationStatus.setOperationId(getValueByName("operationId", result));
197         resourceOperationStatus.setProgress(getValueByName("progress", result));
198         resourceOperationStatus.setResourceTemplateUUID(getValueByName("resourceTemplateUUID", result));
199         resourceOperationStatus.setServiceId(getValueByName("serviceId", result));
200         resourceOperationStatus.setStatus(getValueByName("status", result));
201         resourceOperationStatus.setStatusDescription(getValueByName("statusDescription", result));
202         logger.info("AbstractSdncOperationTask.getResourceOperationStatusFromXmlString end!");
203         return resourceOperationStatus;
204     }
205
206     private String getValueByName(String name, String xml) {
207         if (!StringUtils.isBlank(xml) && xml.contains(name)) {
208             String start = "<" + name + ">";
209             String end = "</" + name + ">";
210             return xml.substring(xml.indexOf(start), xml.indexOf(end)).replace(start, "");
211         }
212         return "";
213     }
214
215     @Override
216     public void execute(DelegateExecution execution) {
217         logger.info("AbstractSdncOperationTask.execute begin!");
218         GenericResourceApi genericResourceApiClient = getGenericResourceApiClient();
219         try {
220             Map<String, String> inputs = getInputs(execution);
221
222             sendRestrequestAndHandleResponse(execution, inputs, genericResourceApiClient);
223             execution.setVariable("SDNCA_SuccessIndicator", true);
224         } catch (Exception e) {
225             logger.info("exception: AbstractSdncOperationTask.fail!");
226             logger.error("exception: AbstractSdncOperationTask.fail!:", e);
227             logger.error(Arrays.toString(e.getStackTrace()));
228             execution.setVariable("SDNCA_SuccessIndicator", false);
229             updateProgress(execution, RequestsDbConstant.Status.ERROR, null, "100",
230                     "sendRestrequestAndHandleResponse finished!");
231
232         }
233         logger.info("AbstractSdncOperationTask.execute end!");
234     }
235
236     protected Map<String, String> getInputs(DelegateExecution execution) {
237         logger.info("AbstractSdncOperationTask.getInputs begin!");
238         Map<String, String> inputs = new HashMap<>();
239         String json = (String) execution.getVariable(SDCADAPTOR_INPUTS);
240         if (!StringUtils.isBlank(json)) {
241             JSONObject jsonObject = new JSONObject(json);
242             JSONObject paras = jsonObject.getJSONObject("additionalParamForNs");
243             Iterator<String> iterator = paras.keys();
244             while (iterator.hasNext()) {
245                 String key = iterator.next();
246                 inputs.put(key, paras.getString(key));
247             }
248         }
249         logger.info("AbstractSdncOperationTask.getInputs end!");
250         return inputs;
251     }
252
253     public abstract void sendRestrequestAndHandleResponse(DelegateExecution execution, Map<String, String> inputs,
254             GenericResourceApi genericResourceApiClient) throws Exception;
255
256     public void updateProgress(DelegateExecution execution, String status, String errorCode, String progress,
257             String statusDescription) {
258         logger.info("AbstractSdncOperationTask.updateProgress begin!");
259         String serviceId = (String) execution.getVariable("serviceId");
260         serviceId = StringUtils.isBlank(serviceId) ? (String) execution.getVariable("serviceInstanceId") : serviceId;
261         String operationId = (String) execution.getVariable("operationId");
262         String resourceTemplateUUID = (String) execution.getVariable("resourceUUID");
263         String resourceTemplateId = (String) execution.getVariable("resourceTemplateId");
264         resourceTemplateId = StringUtils.isBlank(resourceTemplateId) ? "" : resourceTemplateUUID;
265         resourceTemplateUUID = StringUtils.isBlank(resourceTemplateUUID) ? resourceTemplateId : resourceTemplateUUID;
266         try {
267             ResourceOperationStatus resourceOperationStatus =
268                     getResourceOperationStatus(serviceId, operationId, resourceTemplateUUID);
269             if (!StringUtils.isBlank(status)) {
270                 resourceOperationStatus.setStatus(status);
271             }
272             if (!StringUtils.isBlank(errorCode)) {
273                 resourceOperationStatus.setErrorCode(errorCode);
274             }
275             if (!StringUtils.isBlank(progress)) {
276                 resourceOperationStatus.setProgress(progress);
277             }
278             if (!StringUtils.isBlank(statusDescription)) {
279                 resourceOperationStatus.setStatusDescription(statusDescription);
280             }
281             updateResOperStatus(resourceOperationStatus);
282             logger.info("AbstractSdncOperationTask.updateProgress end!");
283         } catch (Exception exception) {
284             logger.info("exception: AbstractSdncOperationTask.updateProgress fail!");
285             logger.error("exception: AbstractSdncOperationTask.updateProgress fail:", exception);
286             logger.error(LoggingAnchor.FIVE, MessageEnum.GENERAL_EXCEPTION.toString(),
287                     " updateProgress catch exception: ", ErrorCode.UnknownError.getValue(),
288                     exception.getClass().toString());
289         }
290     }
291
292
293     protected boolean isSend2SdncDirectly() {
294         logger.info("AbstractSdncOperationTask.isSend2SdncDirectly begin!");
295         String sdncHost = UrnPropertiesReader.getVariable("sdnc.host");
296         if (!StringUtils.isBlank(sdncHost)) {
297             logger.info("AbstractSdncOperationTask.isSend2SdncDirectly = true.");
298             return true;
299         }
300
301         logger.info("AbstractSdncOperationTask.isSend2SdncDirectly = false.");
302         return false;
303     }
304
305     protected String getSdncIp() {
306         logger.info("AbstractSdncOperationTask.getSdncIp begin.");
307         String sdncIp = null;
308         sdncIp = UrnPropertiesReader.getVariable("sdnc-ip");
309         String returnIp = StringUtils.isBlank(sdncIp) || !isIp(sdncIp) ? null : sdncIp;
310         logger.info("AbstractSdncOperationTask.getSdncIp: sdncIp = {}", returnIp);
311         return returnIp;
312     }
313
314     protected String getSdncPort() {
315         logger.info("AbstractSdncOperationTask.getSdncPort begin.");
316         String sdncPort = UrnPropertiesReader.getVariable("sdnc-port");
317         String returnPort = StringUtils.isBlank(sdncPort) ? null : sdncPort;
318         logger.info("AbstractSdncOperationTask.getSdncPort: returnPort = {}", sdncPort);
319         return returnPort;
320     }
321
322     protected String getSdncHost() {
323         String sdncHost = UrnPropertiesReader.getVariable("sdnc.host");
324         logger.info("AbstractSdncOperationTask.getSdncPort: returnPort = {}", sdncHost);
325         return sdncHost;
326     }
327
328     private GenericResourceApi getGenericResourceApiClient() {
329         logger.info("AbstractSdncOperationTask.getGenericResourceApiClient begin!");
330         String msbIp = System.getenv().get(ONAP_IP);
331         int msbPort = DEFAULT_MSB_PORT;
332         if (StringUtils.isBlank(msbIp) || !isIp(msbIp)) {
333             msbIp = env.getProperty("msb-ip");
334             if (StringUtils.isBlank(msbIp)) {
335                 msbIp = env.getProperty("msb.address", DEFAULT_MSB_IP);
336             }
337         }
338         String strMsbPort = env.getProperty("msb-port");
339         if (StringUtils.isBlank(strMsbPort)) {
340             strMsbPort = env.getProperty("msb.port", String.valueOf(DEFAULT_MSB_PORT));
341         }
342         msbPort = Integer.valueOf(strMsbPort);
343
344         logger.info("AbstractSdncOperationTask.getGenericResourceApiClient msbIp = " + msbIp + " msbPort = " + msbPort);
345         MSBServiceClient msbClient = new MSBServiceClient(msbIp, msbPort);
346         RestServiceCreater restServiceCreater = new RestServiceCreater(msbClient);
347         logger.info("AbstractSdncOperationTask.getGenericResourceApiClient end!");
348         return restServiceCreater.createService(GenericResourceApi.class);
349     }
350
351     protected boolean isIp(String msbIp) {
352         return !StringUtils.isBlank(msbIp) && msbIp.split("\\.").length == 4;
353     }
354
355     public String getProcessKey(DelegateExecution execution) {
356         return execution.getProcessEngineServices().getRepositoryService()
357                 .getProcessDefinition(execution.getProcessDefinitionId()).getKey();
358     }
359 }