aa16664e23050e493717c8471fc7f1d13600866c
[so.git] /
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.logging.filter.base.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     private static final ObjectMapper objectMapper;
63
64     static {
65         objectMapper = new ObjectMapper();
66         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
67     }
68
69     @Autowired
70     private Environment env;
71     private static final String DEFAULT_MSB_IP = "127.0.0.1";
72     private static final int DEFAULT_MSB_PORT = 80;
73     private static final String SDCADAPTOR_INPUTS = "resourceParameters";
74     private static final String TOPOLOGY_PROPERTIES = "topology.properties";
75     public static final String ONAP_IP = "ONAP_IP";
76
77     private static final String POST_BODY_TEMPLATE =
78             "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://org.onap.so/requestsdb\"><soapenv:Header/><soapenv:Body>\n"
79                     + "     <ns:updateResourceOperationStatus>\n"
80                     + "                <errorCode>$errorCode</errorCode>\n" + "                <jobId>$jobId</jobId>\n"
81                     + "                <operType>$operType</operType>\n"
82                     + "                <operationId>$operationId</operationId>\n"
83                     + "                <progress>$progress</progress>\n"
84                     + "                <resourceTemplateUUID>$resourceTemplateUUID</resourceTemplateUUID>\n"
85                     + "                <serviceId>$serviceId</serviceId>\n"
86                     + "                <status>$status</status>\n"
87                     + "                <statusDescription>$statusDescription</statusDescription>\n"
88                     + "     </ns:updateResourceOperationStatus></soapenv:Body></soapenv:Envelope>";
89
90     private static final String GET_BODY_TEMPLATE =
91             " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://org.onap.so/requestsdb\"><soapenv:Header/><soapenv:Body>\n"
92                     + "     <ns:getResourceOperationStatus>\n"
93                     + "                <operationId>$operationId</operationId>\n"
94                     + "                <resourceTemplateUUID>$resourceTemplateUUID</resourceTemplateUUID>\n"
95                     + "                <serviceId>$serviceId</serviceId>\n"
96                     + "     </ns:getResourceOperationStatus></soapenv:Body></soapenv:Envelope>";
97
98
99     private void updateResOperStatus(ResourceOperationStatus resourceOperationStatus) throws RouteException {
100         logger.info("AbstractSdncOperationTask.updateResOperStatus begin!");
101         String requestsdbEndPoint = env.getProperty("mso.adapters.openecomp.db.endpoint");
102         HttpPost httpPost = new HttpPost(requestsdbEndPoint);
103         httpPost.addHeader("Authorization", "Basic YnBlbDpwYXNzd29yZDEk");
104         httpPost.addHeader("Content-type", "application/soap+xml");
105         String postBody = getPostStringBody(resourceOperationStatus);
106         httpPost.setEntity(new StringEntity(postBody, ContentType.APPLICATION_XML));
107         httpPost(requestsdbEndPoint, httpPost);
108         logger.info("AbstractSdncOperationTask.updateResOperStatus end!");
109     }
110
111     protected String getPostbody(Object inputEntity) {
112         String postBody = null;
113         try {
114             postBody = objectMapper.writeValueAsString(inputEntity);
115         } catch (JsonProcessingException e) {
116             logger.error("JsonProcessingException in getPostbody", e);
117         }
118         return postBody;
119     }
120
121     protected String httpPost(String url, HttpPost httpPost) throws RouteException {
122         logger.info("AbstractSdncOperationTask.httpPost begin!");
123         String result = null;
124
125         String errorMsg;
126         try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
127             CloseableHttpResponse closeableHttpResponse = httpClient.execute(httpPost);
128             result = EntityUtils.toString(closeableHttpResponse.getEntity());
129             logger.info("result = {}", result);
130             if (closeableHttpResponse.getStatusLine().getStatusCode() != 200) {
131                 logger.info("exception: fail for status code = {}",
132                         closeableHttpResponse.getStatusLine().getStatusCode());
133                 throw new RouteException(result, "SERVICE_GET_ERR");
134             }
135
136             closeableHttpResponse.close();
137         } catch (IOException e) {
138             errorMsg = url + ":httpPostWithJSON connect faild";
139             logger.info("exception: POST_CONNECT_FAILD : {}", errorMsg);
140             throwsRouteException(errorMsg, e, "POST_CONNECT_FAILD");
141         }
142
143         logger.info("AbstractSdncOperationTask.httpPost end!");
144         return result;
145     }
146
147     private static void throwsRouteException(String errorMsg, Exception e, String errorCode) throws RouteException {
148         String msg = errorMsg + ".errorMsg:" + e.getMessage();
149         logger.info("exception: {}", msg);
150         throw new RouteException(errorMsg, errorCode);
151     }
152
153     private String getPostStringBody(ResourceOperationStatus resourceOperationStatus) {
154         logger.info("AbstractSdncOperationTask.getPostStringBody begin!");
155         String postBody = POST_BODY_TEMPLATE;
156         postBody = postBody.replace("$errorCode", resourceOperationStatus.getErrorCode());
157         postBody = postBody.replace("$jobId", resourceOperationStatus.getJobId());
158         postBody = postBody.replace("$operType", resourceOperationStatus.getOperType());
159         postBody = postBody.replace("$operationId", resourceOperationStatus.getOperationId());
160         postBody = postBody.replace("$progress", resourceOperationStatus.getProgress());
161         postBody = postBody.replace("$resourceTemplateUUID", resourceOperationStatus.getResourceTemplateUUID());
162         postBody = postBody.replace("$serviceId", resourceOperationStatus.getServiceId());
163         postBody = postBody.replace("$status", resourceOperationStatus.getStatus());
164         postBody = postBody.replace("$statusDescription", resourceOperationStatus.getStatusDescription());
165         logger.info("AbstractSdncOperationTask.getPostStringBody end!");
166         return postBody;
167     }
168
169     private String getGetStringBody(String serviceId, String operationId, String resourceTemplateUUID) {
170         logger.info("AbstractSdncOperationTask.getGetStringBody begin!");
171         String getBody = GET_BODY_TEMPLATE;
172         getBody = getBody.replace("$operationId", operationId);
173         getBody = getBody.replace("$resourceTemplateUUID", resourceTemplateUUID);
174         getBody = getBody.replace("$serviceId", serviceId);
175         logger.info("AbstractSdncOperationTask.getGetStringBody end!");
176         return getBody;
177     }
178
179     private ResourceOperationStatus getResourceOperationStatus(String serviceId, String operationId,
180             String resourceTemplateUUID) throws RouteException {
181         logger.info("AbstractSdncOperationTask.getResourceOperationStatus begin!");
182         String requestsdbEndPoint = env.getProperty("mso.adapters.openecomp.db.endpoint");
183         HttpPost httpPost = new HttpPost(requestsdbEndPoint);
184         httpPost.addHeader("Authorization", "Basic YnBlbDpwYXNzd29yZDEk");
185         httpPost.addHeader("Content-type", "application/soap+xml");
186         String getBody = getGetStringBody(serviceId, operationId, resourceTemplateUUID);
187         httpPost.setEntity(new StringEntity(getBody, ContentType.APPLICATION_XML));
188         String result = httpPost(requestsdbEndPoint, httpPost);
189         ResourceOperationStatus resourceOperationStatus = getResourceOperationStatusFromXmlString(result);
190         logger.info("AbstractSdncOperationTask.getResourceOperationStatus end!");
191         return resourceOperationStatus;
192     }
193
194     private ResourceOperationStatus getResourceOperationStatusFromXmlString(String result) {
195         logger.info("AbstractSdncOperationTask.getResourceOperationStatusFromXmlString begin!");
196         ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus();
197         resourceOperationStatus.setErrorCode(getValueByName("errorCode", result));
198         resourceOperationStatus.setJobId(getValueByName("jobId", result));
199         resourceOperationStatus.setOperType(getValueByName("operType", result));
200         resourceOperationStatus.setOperationId(getValueByName("operationId", result));
201         resourceOperationStatus.setProgress(getValueByName("progress", result));
202         resourceOperationStatus.setResourceTemplateUUID(getValueByName("resourceTemplateUUID", result));
203         resourceOperationStatus.setServiceId(getValueByName("serviceId", result));
204         resourceOperationStatus.setStatus(getValueByName("status", result));
205         resourceOperationStatus.setStatusDescription(getValueByName("statusDescription", result));
206         logger.info("AbstractSdncOperationTask.getResourceOperationStatusFromXmlString end!");
207         return resourceOperationStatus;
208     }
209
210     private String getValueByName(String name, String xml) {
211         if (!StringUtils.isBlank(xml) && xml.contains(name)) {
212             String start = "<" + name + ">";
213             String end = "</" + name + ">";
214             return xml.substring(xml.indexOf(start), xml.indexOf(end)).replace(start, "");
215         }
216         return "";
217     }
218
219     @Override
220     public void execute(DelegateExecution execution) {
221         logger.info("AbstractSdncOperationTask.execute begin!");
222         GenericResourceApi genericResourceApiClient = getGenericResourceApiClient();
223         try {
224             Map<String, String> inputs = getInputs(execution);
225
226             sendRestrequestAndHandleResponse(execution, inputs, genericResourceApiClient);
227             execution.setVariable("SDNCA_SuccessIndicator", true);
228         } catch (Exception e) {
229             logger.info("exception: AbstractSdncOperationTask.fail!");
230             logger.error("exception: AbstractSdncOperationTask.fail!:", e);
231             logger.error(Arrays.toString(e.getStackTrace()));
232             execution.setVariable("SDNCA_SuccessIndicator", false);
233             updateProgress(execution, RequestsDbConstant.Status.ERROR, null, "100",
234                     "sendRestrequestAndHandleResponse finished!");
235
236         }
237         logger.info("AbstractSdncOperationTask.execute end!");
238     }
239
240     protected Map<String, String> getInputs(DelegateExecution execution) {
241         logger.info("AbstractSdncOperationTask.getInputs begin!");
242         Map<String, String> inputs = new HashMap<>();
243         String json = (String) execution.getVariable(SDCADAPTOR_INPUTS);
244         if (!StringUtils.isBlank(json)) {
245             JSONObject jsonObject = new JSONObject(json);
246             JSONObject paras = jsonObject.getJSONObject("additionalParamForNs");
247             Iterator<String> iterator = paras.keys();
248             while (iterator.hasNext()) {
249                 String key = iterator.next();
250                 inputs.put(key, paras.getString(key));
251             }
252         }
253         logger.info("AbstractSdncOperationTask.getInputs end!");
254         return inputs;
255     }
256
257     public abstract void sendRestrequestAndHandleResponse(DelegateExecution execution, Map<String, String> inputs,
258             GenericResourceApi genericResourceApiClient) throws Exception;
259
260     public void updateProgress(DelegateExecution execution, String status, String errorCode, String progress,
261             String statusDescription) {
262         logger.info("AbstractSdncOperationTask.updateProgress begin!");
263         String serviceId = (String) execution.getVariable("serviceId");
264         serviceId = StringUtils.isBlank(serviceId) ? (String) execution.getVariable("serviceInstanceId") : serviceId;
265         String operationId = (String) execution.getVariable("operationId");
266         String resourceTemplateUUID = (String) execution.getVariable("resourceUUID");
267         String resourceTemplateId = (String) execution.getVariable("resourceTemplateId");
268         resourceTemplateId = StringUtils.isBlank(resourceTemplateId) ? "" : resourceTemplateUUID;
269         resourceTemplateUUID = StringUtils.isBlank(resourceTemplateUUID) ? resourceTemplateId : resourceTemplateUUID;
270         try {
271             ResourceOperationStatus resourceOperationStatus =
272                     getResourceOperationStatus(serviceId, operationId, resourceTemplateUUID);
273             if (!StringUtils.isBlank(status)) {
274                 resourceOperationStatus.setStatus(status);
275             }
276             if (!StringUtils.isBlank(errorCode)) {
277                 resourceOperationStatus.setErrorCode(errorCode);
278             }
279             if (!StringUtils.isBlank(progress)) {
280                 resourceOperationStatus.setProgress(progress);
281             }
282             if (!StringUtils.isBlank(statusDescription)) {
283                 resourceOperationStatus.setStatusDescription(statusDescription);
284             }
285             updateResOperStatus(resourceOperationStatus);
286             logger.info("AbstractSdncOperationTask.updateProgress end!");
287         } catch (Exception exception) {
288             logger.info("exception: AbstractSdncOperationTask.updateProgress fail!");
289             logger.error("exception: AbstractSdncOperationTask.updateProgress fail:", exception);
290             logger.error(LoggingAnchor.FIVE, MessageEnum.GENERAL_EXCEPTION.toString(),
291                     " updateProgress catch exception: ", ErrorCode.UnknownError.getValue(),
292                     exception.getClass().toString());
293         }
294     }
295
296
297     protected boolean isSend2SdncDirectly() {
298         logger.info("AbstractSdncOperationTask.isSend2SdncDirectly begin!");
299         String sdncHost = UrnPropertiesReader.getVariable("sdnc.host");
300         if (!StringUtils.isBlank(sdncHost)) {
301             logger.info("AbstractSdncOperationTask.isSend2SdncDirectly = true.");
302             return true;
303         }
304
305         logger.info("AbstractSdncOperationTask.isSend2SdncDirectly = false.");
306         return false;
307     }
308
309     protected String getSdncIp() {
310         logger.info("AbstractSdncOperationTask.getSdncIp begin.");
311         String sdncIp = null;
312         sdncIp = UrnPropertiesReader.getVariable("sdnc-ip");
313         String returnIp = StringUtils.isBlank(sdncIp) || !isIp(sdncIp) ? null : sdncIp;
314         logger.info("AbstractSdncOperationTask.getSdncIp: sdncIp = {}", returnIp);
315         return returnIp;
316     }
317
318     protected String getSdncPort() {
319         logger.info("AbstractSdncOperationTask.getSdncPort begin.");
320         String sdncPort = UrnPropertiesReader.getVariable("sdnc-port");
321         String returnPort = StringUtils.isBlank(sdncPort) ? null : sdncPort;
322         logger.info("AbstractSdncOperationTask.getSdncPort: returnPort = {}", sdncPort);
323         return returnPort;
324     }
325
326     protected String getSdncHost() {
327         String sdncHost = UrnPropertiesReader.getVariable("sdnc.host");
328         logger.info("AbstractSdncOperationTask.getSdncPort: returnPort = {}", sdncHost);
329         return sdncHost;
330     }
331
332     private GenericResourceApi getGenericResourceApiClient() {
333         logger.info("AbstractSdncOperationTask.getGenericResourceApiClient begin!");
334         String msbIp = System.getenv().get(ONAP_IP);
335         int msbPort = DEFAULT_MSB_PORT;
336         if (StringUtils.isBlank(msbIp) || !isIp(msbIp)) {
337             msbIp = env.getProperty("msb-ip");
338             if (StringUtils.isBlank(msbIp)) {
339                 msbIp = env.getProperty("msb.address", DEFAULT_MSB_IP);
340             }
341         }
342         String strMsbPort = env.getProperty("msb-port");
343         if (StringUtils.isBlank(strMsbPort)) {
344             strMsbPort = env.getProperty("msb.port", String.valueOf(DEFAULT_MSB_PORT));
345         }
346         msbPort = Integer.valueOf(strMsbPort);
347
348         logger.info("AbstractSdncOperationTask.getGenericResourceApiClient msbIp = " + msbIp + " msbPort = " + msbPort);
349         MSBServiceClient msbClient = new MSBServiceClient(msbIp, msbPort);
350         RestServiceCreater restServiceCreater = new RestServiceCreater(msbClient);
351         logger.info("AbstractSdncOperationTask.getGenericResourceApiClient end!");
352         return restServiceCreater.createService(GenericResourceApi.class);
353     }
354
355     protected boolean isIp(String msbIp) {
356         return !StringUtils.isBlank(msbIp) && msbIp.split("\\.").length == 4;
357     }
358
359     public String getProcessKey(DelegateExecution execution) {
360         return execution.getProcessEngineServices().getRepositoryService()
361                 .getProcessDefinition(execution.getProcessDefinitionId()).getKey();
362     }
363 }