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.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;
59 public abstract class AbstractSdncOperationTask implements JavaDelegate {
61 private static final Logger logger = LoggerFactory.getLogger(AbstractSdncOperationTask.class);
62 private static final ObjectMapper objectMapper;
65 objectMapper = new ObjectMapper();
66 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
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";
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>";
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>";
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!");
111 protected String getPostbody(Object inputEntity) {
112 String postBody = null;
114 postBody = objectMapper.writeValueAsString(inputEntity);
115 } catch (JsonProcessingException e) {
116 logger.error("JsonProcessingException in getPostbody", e);
121 protected String httpPost(String url, HttpPost httpPost) throws RouteException {
122 logger.info("AbstractSdncOperationTask.httpPost begin!");
123 String result = null;
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");
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");
143 logger.info("AbstractSdncOperationTask.httpPost end!");
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);
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!");
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!");
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;
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;
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, "");
220 public void execute(DelegateExecution execution) {
221 logger.info("AbstractSdncOperationTask.execute begin!");
222 GenericResourceApi genericResourceApiClient = getGenericResourceApiClient();
224 Map<String, String> inputs = getInputs(execution);
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!");
237 logger.info("AbstractSdncOperationTask.execute end!");
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));
253 logger.info("AbstractSdncOperationTask.getInputs end!");
257 public abstract void sendRestrequestAndHandleResponse(DelegateExecution execution, Map<String, String> inputs,
258 GenericResourceApi genericResourceApiClient) throws Exception;
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;
271 ResourceOperationStatus resourceOperationStatus =
272 getResourceOperationStatus(serviceId, operationId, resourceTemplateUUID);
273 if (!StringUtils.isBlank(status)) {
274 resourceOperationStatus.setStatus(status);
276 if (!StringUtils.isBlank(errorCode)) {
277 resourceOperationStatus.setErrorCode(errorCode);
279 if (!StringUtils.isBlank(progress)) {
280 resourceOperationStatus.setProgress(progress);
282 if (!StringUtils.isBlank(statusDescription)) {
283 resourceOperationStatus.setStatusDescription(statusDescription);
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());
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.");
305 logger.info("AbstractSdncOperationTask.isSend2SdncDirectly = false.");
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);
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);
326 protected String getSdncHost() {
327 String sdncHost = UrnPropertiesReader.getVariable("sdnc.host");
328 logger.info("AbstractSdncOperationTask.getSdncPort: returnPort = {}", sdncHost);
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);
342 String strMsbPort = env.getProperty("msb-port");
343 if (StringUtils.isBlank(strMsbPort)) {
344 strMsbPort = env.getProperty("msb.port", String.valueOf(DEFAULT_MSB_PORT));
346 msbPort = Integer.valueOf(strMsbPort);
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);
355 protected boolean isIp(String msbIp) {
356 return !StringUtils.isBlank(msbIp) && msbIp.split("\\.").length == 4;
359 public String getProcessKey(DelegateExecution execution) {
360 return execution.getProcessEngineServices().getRepositoryService()
361 .getProcessDefinition(execution.getProcessDefinitionId()).getKey();