2 * ============LICENSE_START=======================================================
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
23 package org.onap.so.bpmn.infrastructure.workflow.serviceTask;
25 import java.io.IOException;
26 import java.util.Arrays;
27 import java.util.HashMap;
28 import java.util.Iterator;
30 import org.apache.commons.lang3.StringUtils;
31 import org.apache.http.client.methods.CloseableHttpResponse;
32 import org.apache.http.client.methods.HttpPost;
33 import org.apache.http.entity.ContentType;
34 import org.apache.http.entity.StringEntity;
35 import org.apache.http.impl.client.CloseableHttpClient;
36 import org.apache.http.impl.client.HttpClients;
37 import org.apache.http.util.EntityUtils;
38 import org.camunda.bpm.engine.delegate.DelegateExecution;
39 import org.json.JSONObject;
40 import org.onap.msb.sdk.discovery.common.RouteException;
41 import org.onap.msb.sdk.httpclient.RestServiceCreater;
42 import org.onap.msb.sdk.httpclient.msb.MSBServiceClient;
43 import org.onap.so.bpmn.core.BaseTask;
44 import org.onap.so.bpmn.core.UrnPropertiesReader;
45 import org.onap.so.bpmn.infrastructure.workflow.serviceTask.client.GenericResourceApi;
46 import org.onap.so.db.request.beans.ResourceOperationStatus;
47 import org.onap.so.logger.ErrorCode;
48 import org.onap.so.logger.MessageEnum;
49 import org.onap.so.requestsdb.RequestsDbConstant;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52 import org.springframework.beans.factory.annotation.Autowired;
53 import org.springframework.core.env.Environment;
54 import com.fasterxml.jackson.annotation.JsonInclude;
55 import com.fasterxml.jackson.core.JsonProcessingException;
56 import com.fasterxml.jackson.databind.ObjectMapper;
58 public abstract class AbstractSdncOperationTask extends BaseTask {
60 private static final Logger logger = LoggerFactory.getLogger(AbstractSdncOperationTask.class);
63 private Environment env;
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 private static final String TOPOLOGY_PROPERTIES = "topology.properties";
68 public static final String ONAP_IP = "ONAP_IP";
70 private static final String POST_BODY_TEMPLATE =
71 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://org.onap.so/requestsdb\"><soapenv:Header/><soapenv:Body>\n"
72 + " <ns:updateResourceOperationStatus>\n"
73 + " <errorCode>$errorCode</errorCode>\n" + " <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 GET_BODY_TEMPLATE =
84 " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://org.onap.so/requestsdb\"><soapenv:Header/><soapenv:Body>\n"
85 + " <ns:getResourceOperationStatus>\n"
86 + " <operationId>$operationId</operationId>\n"
87 + " <resourceTemplateUUID>$resourceTemplateUUID</resourceTemplateUUID>\n"
88 + " <serviceId>$serviceId</serviceId>\n"
89 + " </ns:getResourceOperationStatus></soapenv:Body></soapenv:Envelope>";
92 private void updateResOperStatus(ResourceOperationStatus resourceOperationStatus) throws RouteException {
93 logger.info("AbstractSdncOperationTask.updateResOperStatus begin!");
94 String requestsdbEndPoint = env.getProperty("mso.adapters.openecomp.db.endpoint");
95 HttpPost httpPost = new HttpPost(requestsdbEndPoint);
96 httpPost.addHeader("Authorization", "Basic YnBlbDpwYXNzd29yZDEk");
97 httpPost.addHeader("Content-type", "application/soap+xml");
98 String postBody = getPostStringBody(resourceOperationStatus);
99 httpPost.setEntity(new StringEntity(postBody, ContentType.APPLICATION_XML));
100 httpPost(requestsdbEndPoint, httpPost);
101 logger.info("AbstractSdncOperationTask.updateResOperStatus end!");
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) {
111 logger.error(Arrays.toString(e.getStackTrace()));
116 protected String httpPost(String url, HttpPost httpPost) throws RouteException {
117 logger.info("AbstractSdncOperationTask.httpPost begin!");
118 String result = null;
121 try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
122 CloseableHttpResponse closeableHttpResponse = httpClient.execute(httpPost);
123 result = EntityUtils.toString(closeableHttpResponse.getEntity());
124 logger.info("result = {}", result);
125 if (closeableHttpResponse.getStatusLine().getStatusCode() != 200) {
126 logger.info("exception: fail for status code = {}",
127 closeableHttpResponse.getStatusLine().getStatusCode());
128 throw new RouteException(result, "SERVICE_GET_ERR");
131 closeableHttpResponse.close();
132 } catch (IOException e) {
133 errorMsg = url + ":httpPostWithJSON connect faild";
134 logger.info("exception: POST_CONNECT_FAILD : {}", errorMsg);
135 throwsRouteException(errorMsg, e, "POST_CONNECT_FAILD");
138 logger.info("AbstractSdncOperationTask.httpPost end!");
142 private static void throwsRouteException(String errorMsg, Exception e, String errorCode) throws RouteException {
143 String msg = errorMsg + ".errorMsg:" + e.getMessage();
144 logger.info("exception: {}", msg);
145 throw new RouteException(errorMsg, errorCode);
148 private String getPostStringBody(ResourceOperationStatus resourceOperationStatus) {
149 logger.info("AbstractSdncOperationTask.getPostStringBody begin!");
150 String postBody = POST_BODY_TEMPLATE;
151 postBody = postBody.replace("$errorCode", resourceOperationStatus.getErrorCode());
152 postBody = postBody.replace("$jobId", resourceOperationStatus.getJobId());
153 postBody = postBody.replace("$operType", resourceOperationStatus.getOperType());
154 postBody = postBody.replace("$operationId", resourceOperationStatus.getOperationId());
155 postBody = postBody.replace("$progress", resourceOperationStatus.getProgress());
156 postBody = postBody.replace("$resourceTemplateUUID", resourceOperationStatus.getResourceTemplateUUID());
157 postBody = postBody.replace("$serviceId", resourceOperationStatus.getServiceId());
158 postBody = postBody.replace("$status", resourceOperationStatus.getStatus());
159 postBody = postBody.replace("$statusDescription", resourceOperationStatus.getStatusDescription());
160 logger.info("AbstractSdncOperationTask.getPostStringBody end!");
164 private String getGetStringBody(String serviceId, String operationId, String resourceTemplateUUID) {
165 logger.info("AbstractSdncOperationTask.getGetStringBody begin!");
166 String getBody = GET_BODY_TEMPLATE;
167 getBody = getBody.replace("$operationId", operationId);
168 getBody = getBody.replace("$resourceTemplateUUID", resourceTemplateUUID);
169 getBody = getBody.replace("$serviceId", serviceId);
170 logger.info("AbstractSdncOperationTask.getGetStringBody end!");
174 private ResourceOperationStatus getResourceOperationStatus(String serviceId, String operationId,
175 String resourceTemplateUUID) throws RouteException {
176 logger.info("AbstractSdncOperationTask.getResourceOperationStatus begin!");
177 String requestsdbEndPoint = env.getProperty("mso.adapters.openecomp.db.endpoint");
178 HttpPost httpPost = new HttpPost(requestsdbEndPoint);
179 httpPost.addHeader("Authorization", "Basic YnBlbDpwYXNzd29yZDEk");
180 httpPost.addHeader("Content-type", "application/soap+xml");
181 String getBody = getGetStringBody(serviceId, operationId, resourceTemplateUUID);
182 httpPost.setEntity(new StringEntity(getBody, ContentType.APPLICATION_XML));
183 String result = httpPost(requestsdbEndPoint, httpPost);
184 ResourceOperationStatus resourceOperationStatus = getResourceOperationStatusFromXmlString(result);
185 logger.info("AbstractSdncOperationTask.getResourceOperationStatus end!");
186 return resourceOperationStatus;
189 private ResourceOperationStatus getResourceOperationStatusFromXmlString(String result) {
190 logger.info("AbstractSdncOperationTask.getResourceOperationStatusFromXmlString begin!");
191 ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus();
192 resourceOperationStatus.setErrorCode(getValueByName("errorCode", result));
193 resourceOperationStatus.setJobId(getValueByName("jobId", result));
194 resourceOperationStatus.setOperType(getValueByName("operType", result));
195 resourceOperationStatus.setOperationId(getValueByName("operationId", result));
196 resourceOperationStatus.setProgress(getValueByName("progress", result));
197 resourceOperationStatus.setResourceTemplateUUID(getValueByName("resourceTemplateUUID", result));
198 resourceOperationStatus.setServiceId(getValueByName("serviceId", result));
199 resourceOperationStatus.setStatus(getValueByName("status", result));
200 resourceOperationStatus.setStatusDescription(getValueByName("statusDescription", result));
201 logger.info("AbstractSdncOperationTask.getResourceOperationStatusFromXmlString end!");
202 return resourceOperationStatus;
205 private String getValueByName(String name, String xml) {
206 if (!StringUtils.isBlank(xml) && xml.contains(name)) {
207 String start = "<" + name + ">";
208 String end = "</" + name + ">";
209 return xml.substring(xml.indexOf(start), xml.indexOf(end)).replace(start, "");
215 public void execute(DelegateExecution execution) {
216 logger.info("AbstractSdncOperationTask.execute begin!");
217 GenericResourceApi genericResourceApiClient = getGenericResourceApiClient();
219 Map<String, String> inputs = getInputs(execution);
221 sendRestrequestAndHandleResponse(execution, inputs, genericResourceApiClient);
222 execution.setVariable("SDNCA_SuccessIndicator", true);
223 } catch (Exception e) {
224 logger.info("exception: AbstractSdncOperationTask.fail!");
225 logger.error("exception: AbstractSdncOperationTask.fail!:", e);
226 logger.error(Arrays.toString(e.getStackTrace()));
227 execution.setVariable("SDNCA_SuccessIndicator", false);
228 updateProgress(execution, RequestsDbConstant.Status.ERROR, null, "100",
229 "sendRestrequestAndHandleResponse finished!");
232 logger.info("AbstractSdncOperationTask.execute end!");
235 protected Map<String, String> getInputs(DelegateExecution execution) {
236 logger.info("AbstractSdncOperationTask.getInputs begin!");
237 Map<String, String> inputs = new HashMap<>();
238 String json = (String) execution.getVariable(SDCADAPTOR_INPUTS);
239 if (!StringUtils.isBlank(json)) {
240 JSONObject jsonObject = new JSONObject(json);
241 JSONObject paras = jsonObject.getJSONObject("additionalParamForNs");
242 Iterator<String> iterator = paras.keys();
243 while (iterator.hasNext()) {
244 String key = iterator.next();
245 inputs.put(key, paras.getString(key));
248 logger.info("AbstractSdncOperationTask.getInputs end!");
252 public abstract void sendRestrequestAndHandleResponse(DelegateExecution execution, Map<String, String> inputs,
253 GenericResourceApi genericResourceApiClient) throws Exception;
255 public void updateProgress(DelegateExecution execution, String status, String errorCode, String progress,
256 String statusDescription) {
257 logger.info("AbstractSdncOperationTask.updateProgress begin!");
258 String serviceId = (String) execution.getVariable("serviceId");
259 serviceId = StringUtils.isBlank(serviceId) ? (String) execution.getVariable("serviceInstanceId") : serviceId;
260 String operationId = (String) execution.getVariable("operationId");
261 String resourceTemplateUUID = (String) execution.getVariable("resourceUUID");
262 String resourceTemplateId = (String) execution.getVariable("resourceTemplateId");
263 resourceTemplateId = StringUtils.isBlank(resourceTemplateId) ? "" : resourceTemplateUUID;
264 resourceTemplateUUID = StringUtils.isBlank(resourceTemplateUUID) ? resourceTemplateId : resourceTemplateUUID;
266 ResourceOperationStatus resourceOperationStatus =
267 getResourceOperationStatus(serviceId, operationId, resourceTemplateUUID);
268 if (!StringUtils.isBlank(status)) {
269 resourceOperationStatus.setStatus(status);
271 if (!StringUtils.isBlank(errorCode)) {
272 resourceOperationStatus.setErrorCode(errorCode);
274 if (!StringUtils.isBlank(progress)) {
275 resourceOperationStatus.setProgress(progress);
277 if (!StringUtils.isBlank(statusDescription)) {
278 resourceOperationStatus.setStatusDescription(statusDescription);
280 updateResOperStatus(resourceOperationStatus);
281 logger.info("AbstractSdncOperationTask.updateProgress end!");
282 } catch (Exception exception) {
283 logger.info("exception: AbstractSdncOperationTask.updateProgress fail!");
284 logger.error("exception: AbstractSdncOperationTask.updateProgress fail:", exception);
285 logger.error("{} {} {} {} {}", MessageEnum.GENERAL_EXCEPTION.toString(),
286 " updateProgress catch exception: ", this.getTaskName(), ErrorCode.UnknownError.getValue(),
287 exception.getClass().toString());
292 protected boolean isSend2SdncDirectly() {
293 logger.info("AbstractSdncOperationTask.isSend2SdncDirectly begin!");
294 String sdncHost = UrnPropertiesReader.getVariable("sdnc.host");
295 if (!StringUtils.isBlank(sdncHost)) {
296 logger.info("AbstractSdncOperationTask.isSend2SdncDirectly = true.");
300 logger.info("AbstractSdncOperationTask.isSend2SdncDirectly = false.");
304 protected String getSdncIp() {
305 logger.info("AbstractSdncOperationTask.getSdncIp begin.");
306 String sdncIp = null;
307 sdncIp = UrnPropertiesReader.getVariable("sdnc-ip");
308 String returnIp = StringUtils.isBlank(sdncIp) || !isIp(sdncIp) ? null : sdncIp;
309 logger.info("AbstractSdncOperationTask.getSdncIp: sdncIp = {}", returnIp);
313 protected String getSdncPort() {
314 logger.info("AbstractSdncOperationTask.getSdncPort begin.");
315 String sdncPort = UrnPropertiesReader.getVariable("sdnc-port");
316 String returnPort = StringUtils.isBlank(sdncPort) ? null : sdncPort;
317 logger.info("AbstractSdncOperationTask.getSdncPort: returnPort = {}", sdncPort);
321 protected String getSdncHost() {
322 String sdncHost = UrnPropertiesReader.getVariable("sdnc.host");
323 logger.info("AbstractSdncOperationTask.getSdncPort: returnPort = {}", sdncHost);
327 private GenericResourceApi getGenericResourceApiClient() {
328 logger.info("AbstractSdncOperationTask.getGenericResourceApiClient begin!");
329 String msbIp = System.getenv().get(ONAP_IP);
330 int msbPort = DEFAULT_MSB_PORT;
331 if (StringUtils.isBlank(msbIp) || !isIp(msbIp)) {
332 msbIp = env.getProperty("msb-ip");
333 if (StringUtils.isBlank(msbIp)) {
334 msbIp = env.getProperty("msb.address", DEFAULT_MSB_IP);
337 String strMsbPort = env.getProperty("msb-port");
338 if (StringUtils.isBlank(strMsbPort)) {
339 strMsbPort = env.getProperty("msb.port", String.valueOf(DEFAULT_MSB_PORT));
341 msbPort = Integer.valueOf(strMsbPort);
343 logger.info("AbstractSdncOperationTask.getGenericResourceApiClient msbIp = " + msbIp + " msbPort = " + msbPort);
344 MSBServiceClient msbClient = new MSBServiceClient(msbIp, msbPort);
345 RestServiceCreater restServiceCreater = new RestServiceCreater(msbClient);
346 logger.info("AbstractSdncOperationTask.getGenericResourceApiClient end!");
347 return restServiceCreater.createService(GenericResourceApi.class);
350 protected boolean isIp(String msbIp) {
351 return !StringUtils.isBlank(msbIp) && msbIp.split("\\.").length == 4;
354 public String getProcessKey(DelegateExecution execution) {
355 return execution.getProcessEngineServices().getRepositoryService()
356 .getProcessDefinition(execution.getProcessDefinitionId()).getKey();