2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 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
11 * http://www.apache.org/licenses/LICENSE-2.0
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 * ============LICENSE_END=========================================================
21 package org.openecomp.mso.bpmn.infrastructure.workflow.serviceTask;
23 import com.fasterxml.jackson.annotation.JsonInclude;
24 import com.fasterxml.jackson.core.JsonProcessingException;
25 import com.fasterxml.jackson.databind.ObjectMapper;
26 import org.apache.commons.lang3.StringUtils;
27 import org.apache.http.client.ClientProtocolException;
28 import org.apache.http.client.methods.CloseableHttpResponse;
29 import org.apache.http.client.methods.HttpGet;
30 import org.apache.http.client.methods.HttpPost;
31 import org.apache.http.entity.ContentType;
32 import org.apache.http.entity.StringEntity;
33 import org.apache.http.impl.client.CloseableHttpClient;
34 import org.apache.http.impl.client.HttpClients;
35 import org.apache.http.util.EntityUtils;
36 import org.camunda.bpm.engine.delegate.DelegateExecution;
37 import org.json.JSONObject;
38 import org.onap.msb.sdk.discovery.common.RouteException;
39 import org.onap.msb.sdk.httpclient.RestServiceCreater;
40 import org.onap.msb.sdk.httpclient.msb.MSBServiceClient;
41 import org.openecomp.mso.bpmn.core.BaseTask;
42 import org.openecomp.mso.bpmn.core.PropertyConfiguration;
43 import org.openecomp.mso.bpmn.infrastructure.workflow.serviceTask.client.GenericResourceApi;
44 import org.openecomp.mso.logger.MessageEnum;
45 import org.openecomp.mso.logger.MsoLogger;
46 import org.openecomp.mso.requestsdb.RequestsDatabase;
47 import org.openecomp.mso.requestsdb.RequestsDbConstant;
48 import org.openecomp.mso.requestsdb.ResourceOperationStatus;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
52 import java.io.IOException;
53 import java.util.HashMap;
54 import java.util.Iterator;
58 * Created by 10112215 on 2017/9/16.
60 public abstract class AbstractSdncOperationTask extends BaseTask {
62 private static final Logger logger = LoggerFactory.getLogger(AbstractSdncOperationTask.class);
64 private static final String DEFAULT_MSB_IP = "127.0.0.1";
65 private static final int DEFAULT_MSB_Port = 80;
66 private static final String SDCADAPTOR_INPUTS = "resourceParameters";
67 public static final String ONAP_IP = "ONAP_IP";
68 private RequestsDatabase requestsDB = RequestsDatabase.getInstance();
70 private static final String postBodyTemplate = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://org.openecomp.mso/requestsdb\"><soapenv:Header/><soapenv:Body>\n"+
71 " <ns:updateResourceOperationStatus>\n"+
72 " <errorCode>$errorCode</errorCode>\n"+
73 " <jobId>$jobId</jobId>\n"+
74 " <operType>$operType</operType>\n"+
75 " <operationId>$operationId</operationId>\n"+
76 " <progress>$progress</progress>\n"+
77 " <resourceTemplateUUID>$resourceTemplateUUID</resourceTemplateUUID>\n"+
78 " <serviceId>$serviceId</serviceId>\n"+
79 " <status>$status</status>\n"+
80 " <statusDescription>$statusDescription</statusDescription>\n"+
81 " </ns:updateResourceOperationStatus></soapenv:Body></soapenv:Envelope>";
83 private static final String getBodyTemplate = " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://org.openecomp.mso/requestsdb\"><soapenv:Header/><soapenv:Body>\n" +
84 " <ns:getResourceOperationStatus>\n" +
85 " <operationId>$operationId</operationId>\n" +
86 " <resourceTemplateUUID>$resourceTemplateUUID</resourceTemplateUUID>\n" +
87 " <serviceId>$serviceId</serviceId>\n" +
88 " </ns:getResourceOperationStatus></soapenv:Body></soapenv:Envelope>";
91 private void updateResOperStatus(ResourceOperationStatus resourceOperationStatus) throws RouteException {
92 logger.info("AbstractSdncOperationTask.updateResOperStatus begin!");
93 String url = "http://mso:8080/dbadapters/RequestsDbAdapter";
94 HttpPost httpPost = new HttpPost(url);
95 httpPost.addHeader("Authorization", "Basic QlBFTENsaWVudDpwYXNzd29yZDEk");
96 httpPost.addHeader("Content-type", "application/soap+xml");
97 String postBody = getPostStringBody(resourceOperationStatus);
98 httpPost.setEntity(new StringEntity(postBody, ContentType.APPLICATION_XML));
99 httpPost(url, httpPost);
100 logger.info("AbstractSdncOperationTask.updateResOperStatus end!");
101 //requestsDB.updateResOperStatus(resourceOperationStatus);
104 protected String getPostbody(Object inputEntity) {
105 ObjectMapper objectMapper = new ObjectMapper();
106 String postBody = null;
108 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
109 postBody = objectMapper.writeValueAsString(inputEntity);
110 } catch (JsonProcessingException e) {
116 protected String httpPost(String url, HttpPost httpPost) throws RouteException {
117 logger.info("AbstractSdncOperationTask.httpPost begin!");
118 CloseableHttpClient httpClient = HttpClients.createDefault();
119 String result = null;
120 boolean var15 = false;
126 CloseableHttpResponse closeableHttpResponse = httpClient.execute(httpPost);
127 result = EntityUtils.toString(closeableHttpResponse.getEntity());
128 logger.info("result = {}", result);
129 // LOGGER.info(MessageEnum.RA_RESPONSE_FROM_SDNC, result.toString(), "SDNC", "");
130 if(closeableHttpResponse.getStatusLine().getStatusCode() != 200) {
131 logger.info("exception: fail for status code = {}", closeableHttpResponse.getStatusLine().getStatusCode());
132 throw new RouteException(result, "SERVICE_GET_ERR");
135 closeableHttpResponse.close();
138 } catch (IOException var19) {
139 errorMsg = url + ":httpPostWithJSON connect faild";
140 logger.info("exception: POST_CONNECT_FAILD : {}", errorMsg);
141 throwsRouteException(errorMsg, var19, "POST_CONNECT_FAILD");
147 } catch (IOException var16) {
148 String errorMsg1 = url + ":close httpClient faild";
149 logger.info("exception: CLOSE_CONNECT_FAILD : {}", errorMsg1);
150 throwsRouteException(errorMsg1, var16, "CLOSE_CONNECT_FAILD");
158 } catch (IOException var17) {
159 errorMsg = url + ":close httpClient faild";
160 logger.info("exception: CLOSE_CONNECT_FAILD : {}", errorMsg);
161 throwsRouteException(errorMsg, var17, "CLOSE_CONNECT_FAILD");
167 } catch (IOException var18) {
168 errorMsg = url + ":close httpClient faild";
169 logger.info("exception: CLOSE_CONNECT_FAILD : {}", errorMsg);
170 throwsRouteException(errorMsg, var18, "CLOSE_CONNECT_FAILD");
172 logger.info("AbstractSdncOperationTask.httpPost end!");
176 private static void throwsRouteException(String errorMsg, Exception e, String errorCode) throws RouteException {
177 String msg = errorMsg + ".errorMsg:" + e.getMessage();
178 logger.info("exception: {}", msg);
179 throw new RouteException(errorMsg, errorCode);
182 private String getPostStringBody(ResourceOperationStatus resourceOperationStatus) {
183 logger.info("AbstractSdncOperationTask.getPostStringBody begin!");
184 String postBody = new String(postBodyTemplate);
185 postBody = postBody.replace("$errorCode", resourceOperationStatus.getErrorCode());
186 postBody = postBody.replace("$jobId", resourceOperationStatus.getJobId());
187 postBody = postBody.replace("$operType", resourceOperationStatus.getOperType());
188 postBody = postBody.replace("$operationId", resourceOperationStatus.getOperationId());
189 postBody = postBody.replace("$progress", resourceOperationStatus.getProgress());
190 postBody = postBody.replace("$resourceTemplateUUID", resourceOperationStatus.getResourceTemplateUUID());
191 postBody = postBody.replace("$serviceId", resourceOperationStatus.getServiceId());
192 postBody = postBody.replace("$status", resourceOperationStatus.getStatus());
193 postBody = postBody.replace("$statusDescription", resourceOperationStatus.getStatusDescription());
194 logger.info("AbstractSdncOperationTask.getPostStringBody end!");
198 private String getGetStringBody(String serviceId, String operationId, String resourceTemplateUUID) {
199 logger.info("AbstractSdncOperationTask.getGetStringBody begin!");
200 String getBody = new String(getBodyTemplate);
201 getBody = getBody.replace("$operationId", operationId);
202 getBody = getBody.replace("$resourceTemplateUUID", resourceTemplateUUID);
203 getBody = getBody.replace("$serviceId", serviceId);
204 logger.info("AbstractSdncOperationTask.getGetStringBody end!");
208 private ResourceOperationStatus getResourceOperationStatus(String serviceId, String operationId, String resourceTemplateUUID) throws RouteException {
209 logger.info("AbstractSdncOperationTask.getResourceOperationStatus begin!");
210 String url = "http://mso:8080/dbadapters/RequestsDbAdapter";
211 HttpPost httpPost = new HttpPost(url);
212 httpPost.addHeader("Authorization", "Basic QlBFTENsaWVudDpwYXNzd29yZDEk");
213 httpPost.addHeader("Content-type", "application/soap+xml");
214 String getBody = getGetStringBody(serviceId, operationId, resourceTemplateUUID);
215 httpPost.setEntity(new StringEntity(getBody, ContentType.APPLICATION_XML));
216 String result = httpPost(url, httpPost);
217 ResourceOperationStatus resourceOperationStatus = getResourceOperationStatusFromXmlString(result);
218 logger.info("AbstractSdncOperationTask.getResourceOperationStatus end!");
219 return resourceOperationStatus;
221 //return requestsDB.getResourceOperationStatus(serviceId, operationId, resourceTemplateUUID);
224 private String httpGet(String url, HttpGet httpGet) throws RouteException {
225 logger.info("AbstractSdncOperationTask.httpGet begin!");
226 boolean var16 = false;
227 CloseableHttpClient httpClient = HttpClients.createDefault();
236 CloseableHttpResponse e = httpClient.execute(httpGet);
237 result = EntityUtils.toString(e.getEntity());
238 logger.info("result = {}", result);
239 if (e.getStatusLine().getStatusCode() != 200) {
240 logger.info("exception: fail for status code = {}", e.getStatusLine().getStatusCode());
241 throw new RouteException(result, "SERVICE_GET_ERR");
247 } catch (ClientProtocolException var21) {
248 errorMsg = url + ":httpGetWithJSON connect faild";
249 logger.info("exception: GET_CONNECT_FAILD {}", errorMsg);
250 throwsRouteException(errorMsg, var21, "GET_CONNECT_FAILD");
252 } catch (IOException var22) {
253 errorMsg = url + ":httpGetWithJSON connect faild";
254 logger.info("exception: GET_CONNECT_FAILD {}", errorMsg);
255 throwsRouteException(errorMsg, var22, "GET_CONNECT_FAILD");
262 } catch (IOException var17) {
263 String errorMsg1 = url + ":close httpClient faild";
264 logger.info("exception: CLOSE_CONNECT_FAILD {}", errorMsg1);
265 throwsRouteException(errorMsg1, var17, "CLOSE_CONNECT_FAILD");
273 } catch (IOException var19) {
274 errorMsg = url + ":close httpClient faild";
275 logger.info("exception: CLOSE_CONNECT_FAILD {}", errorMsg);
276 throwsRouteException(errorMsg, var19, "CLOSE_CONNECT_FAILD");
283 } catch (IOException var20) {
284 errorMsg = url + ":close httpClient faild";
285 logger.info("exception: CLOSE_CONNECT_FAILD {}", errorMsg);
286 throwsRouteException(errorMsg, var20, "CLOSE_CONNECT_FAILD");
293 } catch (IOException var18) {
294 errorMsg = url + ":close httpClient faild";
295 logger.info("exception: CLOSE_CONNECT_FAILD {}", errorMsg);
296 throwsRouteException(errorMsg, var18, "CLOSE_CONNECT_FAILD");
298 logger.info("AbstractSdncOperationTask.httpGet end!");
302 private ResourceOperationStatus getResourceOperationStatusFromXmlString(String result) {
303 logger.info("AbstractSdncOperationTask.getResourceOperationStatusFromXmlString begin!");
304 ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus();
305 resourceOperationStatus.setErrorCode(getValueByName("errorCode", result));
306 resourceOperationStatus.setJobId(getValueByName("jobId", result));
307 resourceOperationStatus.setOperType(getValueByName("operType", result));
308 resourceOperationStatus.setOperationId(getValueByName("operationId", result));
309 resourceOperationStatus.setProgress(getValueByName("progress", result));
310 resourceOperationStatus.setResourceTemplateUUID(getValueByName("resourceTemplateUUID", result));
311 resourceOperationStatus.setServiceId(getValueByName("serviceId", result));
312 resourceOperationStatus.setStatus(getValueByName("status", result));
313 resourceOperationStatus.setStatusDescription(getValueByName("statusDescription", result));
314 logger.info("AbstractSdncOperationTask.getResourceOperationStatusFromXmlString end!");
315 return resourceOperationStatus;
318 private String getValueByName(String Name, String xml) {
319 if (!StringUtils.isBlank(xml) && xml.contains(Name)) {
320 String start = "<" + Name + ">";
321 String end = "</" + Name + ">";
322 return xml.substring(xml.indexOf(start), xml.indexOf(end)).replace(start, "");
327 protected static MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA);
330 public void execute(DelegateExecution execution) {
331 logger.info("AbstractSdncOperationTask.execute begin!");
332 GenericResourceApi genericResourceApiClient = getGenericResourceApiClient(execution);
333 // updateProgress(execution, RequestsDbConstant.Status.PROCESSING, null, "10", "execute begin!");
335 Map<String, String> inputs = getInputs(execution);
336 // updateProgress(execution, null, null, "30", "getGenericResourceApiClient finished!");
338 sendRestrequestAndHandleResponse(execution, inputs, genericResourceApiClient);
339 execution.setVariable("SDNCA_SuccessIndicator", true);
340 // updateProgress(execution, RequestsDbConstant.Status.FINISHED, null, RequestsDbConstant.Progress.ONE_HUNDRED, "execute finished!");
341 } catch (Exception e) {
342 logger.info("exception: AbstractSdncOperationTask.fail!");
343 logger.error("exception: AbstractSdncOperationTask.fail!:", e);
345 execution.setVariable("SDNCA_SuccessIndicator", false);
346 updateProgress(execution, RequestsDbConstant.Status.ERROR, null, "100", "sendRestrequestAndHandleResponse finished!");
349 logger.info("AbstractSdncOperationTask.execute end!");
352 protected Map<String, String> getInputs(DelegateExecution execution) {
353 logger.info("AbstractSdncOperationTask.getInputs begin!");
354 Map<String, String> inputs = new HashMap<>();
355 String json = (String) execution.getVariable(SDCADAPTOR_INPUTS);
356 if (!StringUtils.isBlank(json)) {
357 JSONObject jsonObject = new JSONObject(json);
358 JSONObject paras = jsonObject.getJSONObject("additionalParamForNs");
359 Iterator<String> iterator = paras.keys();
360 while (iterator.hasNext()) {
361 String key = iterator.next();
362 inputs.put(key, paras.getString(key));
364 /* if (paras.keys().hasNext()) {
365 paras.keySet().stream().forEach(key -> inputs.put(key, paras.getString((String) key)));
368 logger.info("AbstractSdncOperationTask.getInputs end!");
372 public abstract void sendRestrequestAndHandleResponse(DelegateExecution execution,
373 Map<String, String> inputs,
374 GenericResourceApi genericResourceApiClient) throws Exception;
376 public void updateProgress(DelegateExecution execution,
380 String statusDescription) {
381 logger.info("AbstractSdncOperationTask.updateProgress begin!");
382 String serviceId = (String) execution.getVariable("serviceId");
383 serviceId = StringUtils.isBlank(serviceId) ? (String) execution.getVariable("serviceInstanceId") : serviceId;
384 String operationId = (String) execution.getVariable("operationId");
385 String resourceTemplateUUID = (String) execution.getVariable("resourceUUID");
386 resourceTemplateUUID = StringUtils.isBlank(resourceTemplateUUID) ? (String) execution.getVariable("resourceTemplateId") : resourceTemplateUUID;
388 ResourceOperationStatus resourceOperationStatus = getResourceOperationStatus(serviceId, operationId, resourceTemplateUUID);
389 if (!StringUtils.isBlank(status)) {
390 resourceOperationStatus.setStatus(status);
392 if (!StringUtils.isBlank(errorCode)) {
393 resourceOperationStatus.setErrorCode(errorCode);
395 if (!StringUtils.isBlank(progress)) {
396 resourceOperationStatus.setProgress(progress);
398 if (!StringUtils.isBlank(statusDescription)) {
399 resourceOperationStatus.setStatusDescription(statusDescription);
401 updateResOperStatus(resourceOperationStatus);
402 logger.info("AbstractSdncOperationTask.updateProgress end!");
403 } catch (Exception exception) {
404 System.out.println(exception);
405 logger.info("exception: AbstractSdncOperationTask.updateProgress fail!");
406 logger.error("exception: AbstractSdncOperationTask.updateProgress fail:", exception);
407 LOGGER.error(MessageEnum.GENERAL_EXCEPTION, " updateProgress catch exception: ", "", this.getTaskName(), MsoLogger.ErrorCode.UnknownError, exception.getClass().toString());
412 protected boolean isSend2SdncDirectly() {
413 logger.info("AbstractSdncOperationTask.isSend2SdncDirectly begin!");
414 Map<String, String> properties = PropertyConfiguration.getInstance().getProperties("topology.properties");
415 if (properties != null) {
416 String sdncIp = properties.get("sdnc-ip");
417 String sdncPort = properties.get("sdnc-port");
418 if (!StringUtils.isBlank(sdncIp) && isIp(sdncIp) && !StringUtils.isBlank(sdncPort)) {
419 logger.info("AbstractSdncOperationTask.isSend2SdncDirectly = true.");
423 logger.info("AbstractSdncOperationTask.isSend2SdncDirectly = false.");
427 protected String getSdncIp() {
428 logger.info("AbstractSdncOperationTask.getSdncIp begin.");
429 String sdncIp = null;
430 Map<String, String> properties = PropertyConfiguration.getInstance().getProperties("topology.properties");
431 if (properties != null) {
432 sdncIp = properties.get("sdnc-ip");
434 String returnIp = StringUtils.isBlank(sdncIp) || !isIp(sdncIp) ? null : sdncIp;
435 logger.info("AbstractSdncOperationTask.getSdncIp: sdncIp = {}", returnIp);
439 protected String getSdncPort() {
440 logger.info("AbstractSdncOperationTask.getSdncPort begin.");
441 String sdncPort = null;
442 Map<String, String> properties = PropertyConfiguration.getInstance().getProperties("topology.properties");
443 if (properties != null) {
444 sdncPort = properties.get("sdnc-port");
446 String returnPort = StringUtils.isBlank(sdncPort) ? null : sdncPort;
447 logger.info("AbstractSdncOperationTask.getSdncPort: returnPort = {}", sdncPort);
451 private GenericResourceApi getGenericResourceApiClient(DelegateExecution execution) {
452 logger.info("AbstractSdncOperationTask.getGenericResourceApiClient begin!");
453 // updateProgress(execution, null, null, "20", "getGenericResourceApiClient begin!");
454 String msbIp = System.getenv().get(ONAP_IP);
455 int msbPort = DEFAULT_MSB_Port;
456 Map<String, String> properties = PropertyConfiguration.getInstance().getProperties("topology.properties");
457 if (properties != null) {
458 if (StringUtils.isBlank(msbIp) || !isIp(msbIp)) {
459 msbIp = properties.get("msb-ip");
460 if (StringUtils.isBlank(msbIp)) {
461 msbIp = getString(properties, "msb.address", DEFAULT_MSB_IP);
464 String strMsbPort = properties.get("msb-port");
465 if (StringUtils.isBlank(strMsbPort)) {
466 strMsbPort = getString(properties, "msb.port", String.valueOf(DEFAULT_MSB_Port));
468 msbPort = Integer.valueOf(strMsbPort);
470 logger.info("AbstractSdncOperationTask.getGenericResourceApiClient msbIp = " + msbIp + " msbPort = " + msbPort);
471 MSBServiceClient msbClient = new MSBServiceClient(msbIp, msbPort);
472 RestServiceCreater restServiceCreater = new RestServiceCreater(msbClient);
473 logger.info("AbstractSdncOperationTask.getGenericResourceApiClient end!");
474 return restServiceCreater.createService(GenericResourceApi.class);
477 protected boolean isIp(String msbIp) {
478 return !StringUtils.isBlank(msbIp) && msbIp.split("\\.").length == 4;
481 private String getString(Map<String, String> properties, String name, String defaultValue) {
482 String vlaue = properties.get(name);
484 if (!StringUtils.isBlank(vlaue)) {
487 } catch (Exception e) {
488 System.out.println(e);
489 LOGGER.error(MessageEnum.GENERAL_EXCEPTION, " getMsbIp catch exception: ", "", this.getTaskName(), MsoLogger.ErrorCode.UnknownError, e.getClass().toString());
494 private Integer getInteger(DelegateExecution execution, String name, Integer defaultValue) {
495 Integer vlaue = (Integer) execution.getVariable(name);
500 } catch (Exception e) {
501 System.out.println(e);
502 LOGGER.error(MessageEnum.GENERAL_EXCEPTION, " getMsbIp catch exception: ", "", this.getTaskName(), MsoLogger.ErrorCode.UnknownError, e.getClass().toString());
507 public String getProcessKey(DelegateExecution execution) {
508 return execution.getProcessEngineServices().getRepositoryService().getProcessDefinition(execution.getProcessDefinitionId()).getKey();