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.methods.CloseableHttpResponse;
28 import org.apache.http.client.methods.HttpPost;
29 import org.apache.http.entity.ContentType;
30 import org.apache.http.entity.StringEntity;
31 import org.apache.http.impl.client.CloseableHttpClient;
32 import org.apache.http.impl.client.HttpClients;
33 import org.apache.http.util.EntityUtils;
34 import org.camunda.bpm.engine.delegate.DelegateExecution;
35 import org.json.JSONObject;
36 import org.onap.msb.sdk.discovery.common.RouteException;
37 import org.onap.msb.sdk.httpclient.RestServiceCreater;
38 import org.onap.msb.sdk.httpclient.msb.MSBServiceClient;
39 import org.openecomp.mso.bpmn.core.BaseTask;
40 import org.openecomp.mso.bpmn.core.PropertyConfiguration;
41 import org.openecomp.mso.bpmn.infrastructure.workflow.serviceTask.client.GenericResourceApi;
42 import org.openecomp.mso.logger.MessageEnum;
43 import org.openecomp.mso.logger.MsoLogger;
44 import org.openecomp.mso.requestsdb.RequestsDbConstant;
45 import org.openecomp.mso.requestsdb.ResourceOperationStatus;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
49 import java.io.IOException;
50 import java.util.HashMap;
51 import java.util.Iterator;
54 public abstract class AbstractSdncOperationTask extends BaseTask {
56 private static final Logger logger = LoggerFactory.getLogger(AbstractSdncOperationTask.class);
58 private static final String DEFAULT_MSB_IP = "127.0.0.1";
59 private static final int DEFAULT_MSB_PORT = 80;
60 private static final String SDCADAPTOR_INPUTS = "resourceParameters";
61 private static final String TOPOLOGY_PROPERTIES = "topology.properties";
62 public static final String ONAP_IP = "ONAP_IP";
64 private static final String POST_BODY_TEMPLATE = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://org.openecomp.mso/requestsdb\"><soapenv:Header/><soapenv:Body>\n"+
65 " <ns:updateResourceOperationStatus>\n"+
66 " <errorCode>$errorCode</errorCode>\n"+
67 " <jobId>$jobId</jobId>\n"+
68 " <operType>$operType</operType>\n"+
69 " <operationId>$operationId</operationId>\n"+
70 " <progress>$progress</progress>\n"+
71 " <resourceTemplateUUID>$resourceTemplateUUID</resourceTemplateUUID>\n"+
72 " <serviceId>$serviceId</serviceId>\n"+
73 " <status>$status</status>\n"+
74 " <statusDescription>$statusDescription</statusDescription>\n"+
75 " </ns:updateResourceOperationStatus></soapenv:Body></soapenv:Envelope>";
77 private static final String GET_BODY_TEMPLATE = " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://org.openecomp.mso/requestsdb\"><soapenv:Header/><soapenv:Body>\n" +
78 " <ns:getResourceOperationStatus>\n" +
79 " <operationId>$operationId</operationId>\n" +
80 " <resourceTemplateUUID>$resourceTemplateUUID</resourceTemplateUUID>\n" +
81 " <serviceId>$serviceId</serviceId>\n" +
82 " </ns:getResourceOperationStatus></soapenv:Body></soapenv:Envelope>";
85 private void updateResOperStatus(ResourceOperationStatus resourceOperationStatus) throws RouteException {
86 logger.info("AbstractSdncOperationTask.updateResOperStatus begin!");
87 Map<String, String> properties = PropertyConfiguration.getInstance().getProperties("mso.bpmn.urn.properties");
88 String requestsdbEndPoint = properties.get("mso.adapters.openecomp.db.endpoint");
89 HttpPost httpPost = new HttpPost(requestsdbEndPoint);
90 httpPost.addHeader("Authorization", "Basic QlBFTENsaWVudDpwYXNzd29yZDEk");
91 httpPost.addHeader("Content-type", "application/soap+xml");
92 String postBody = getPostStringBody(resourceOperationStatus);
93 httpPost.setEntity(new StringEntity(postBody, ContentType.APPLICATION_XML));
94 httpPost(requestsdbEndPoint, httpPost);
95 logger.info("AbstractSdncOperationTask.updateResOperStatus end!");
98 protected String getPostbody(Object inputEntity) {
99 ObjectMapper objectMapper = new ObjectMapper();
100 String postBody = null;
102 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
103 postBody = objectMapper.writeValueAsString(inputEntity);
104 } catch (JsonProcessingException e) {
105 logger.error(e.getStackTrace().toString());
110 protected String httpPost(String url, HttpPost httpPost) throws RouteException {
111 logger.info("AbstractSdncOperationTask.httpPost begin!");
112 String result = null;
115 try(CloseableHttpClient httpClient = HttpClients.createDefault()) {
116 CloseableHttpResponse closeableHttpResponse = httpClient.execute(httpPost);
117 result = EntityUtils.toString(closeableHttpResponse.getEntity());
118 logger.info("result = {}", result);
119 if(closeableHttpResponse.getStatusLine().getStatusCode() != 200) {
120 logger.info("exception: fail for status code = {}", closeableHttpResponse.getStatusLine().getStatusCode());
121 throw new RouteException(result, "SERVICE_GET_ERR");
124 closeableHttpResponse.close();
125 } catch (IOException e) {
126 errorMsg = url + ":httpPostWithJSON connect faild";
127 logger.info("exception: POST_CONNECT_FAILD : {}", errorMsg);
128 throwsRouteException(errorMsg, e, "POST_CONNECT_FAILD");
131 logger.info("AbstractSdncOperationTask.httpPost end!");
135 private static void throwsRouteException(String errorMsg, Exception e, String errorCode) throws RouteException {
136 String msg = errorMsg + ".errorMsg:" + e.getMessage();
137 logger.info("exception: {}", msg);
138 throw new RouteException(errorMsg, errorCode);
141 private String getPostStringBody(ResourceOperationStatus resourceOperationStatus) {
142 logger.info("AbstractSdncOperationTask.getPostStringBody begin!");
143 String postBody = POST_BODY_TEMPLATE;
144 postBody = postBody.replace("$errorCode", resourceOperationStatus.getErrorCode());
145 postBody = postBody.replace("$jobId", resourceOperationStatus.getJobId());
146 postBody = postBody.replace("$operType", resourceOperationStatus.getOperType());
147 postBody = postBody.replace("$operationId", resourceOperationStatus.getOperationId());
148 postBody = postBody.replace("$progress", resourceOperationStatus.getProgress());
149 postBody = postBody.replace("$resourceTemplateUUID", resourceOperationStatus.getResourceTemplateUUID());
150 postBody = postBody.replace("$serviceId", resourceOperationStatus.getServiceId());
151 postBody = postBody.replace("$status", resourceOperationStatus.getStatus());
152 postBody = postBody.replace("$statusDescription", resourceOperationStatus.getStatusDescription());
153 logger.info("AbstractSdncOperationTask.getPostStringBody end!");
157 private String getGetStringBody(String serviceId, String operationId, String resourceTemplateUUID) {
158 logger.info("AbstractSdncOperationTask.getGetStringBody begin!");
159 String getBody = GET_BODY_TEMPLATE;
160 getBody = getBody.replace("$operationId", operationId);
161 getBody = getBody.replace("$resourceTemplateUUID", resourceTemplateUUID);
162 getBody = getBody.replace("$serviceId", serviceId);
163 logger.info("AbstractSdncOperationTask.getGetStringBody end!");
167 private ResourceOperationStatus getResourceOperationStatus(String serviceId, String operationId, String resourceTemplateUUID) throws RouteException {
168 logger.info("AbstractSdncOperationTask.getResourceOperationStatus begin!");
169 Map<String, String> properties = PropertyConfiguration.getInstance().getProperties("mso.bpmn.urn.properties");
170 String requestsdbEndPoint = properties.get("mso.adapters.openecomp.db.endpoint");
171 HttpPost httpPost = new HttpPost(requestsdbEndPoint);
172 httpPost.addHeader("Authorization", "Basic QlBFTENsaWVudDpwYXNzd29yZDEk");
173 httpPost.addHeader("Content-type", "application/soap+xml");
174 String getBody = getGetStringBody(serviceId, operationId, resourceTemplateUUID);
175 httpPost.setEntity(new StringEntity(getBody, ContentType.APPLICATION_XML));
176 String result = httpPost(requestsdbEndPoint, httpPost);
177 ResourceOperationStatus resourceOperationStatus = getResourceOperationStatusFromXmlString(result);
178 logger.info("AbstractSdncOperationTask.getResourceOperationStatus end!");
179 return resourceOperationStatus;
182 private ResourceOperationStatus getResourceOperationStatusFromXmlString(String result) {
183 logger.info("AbstractSdncOperationTask.getResourceOperationStatusFromXmlString begin!");
184 ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus();
185 resourceOperationStatus.setErrorCode(getValueByName("errorCode", result));
186 resourceOperationStatus.setJobId(getValueByName("jobId", result));
187 resourceOperationStatus.setOperType(getValueByName("operType", result));
188 resourceOperationStatus.setOperationId(getValueByName("operationId", result));
189 resourceOperationStatus.setProgress(getValueByName("progress", result));
190 resourceOperationStatus.setResourceTemplateUUID(getValueByName("resourceTemplateUUID", result));
191 resourceOperationStatus.setServiceId(getValueByName("serviceId", result));
192 resourceOperationStatus.setStatus(getValueByName("status", result));
193 resourceOperationStatus.setStatusDescription(getValueByName("statusDescription", result));
194 logger.info("AbstractSdncOperationTask.getResourceOperationStatusFromXmlString end!");
195 return resourceOperationStatus;
198 private String getValueByName(String name, String xml) {
199 if (!StringUtils.isBlank(xml) && xml.contains(name)) {
200 String start = "<" + name + ">";
201 String end = "</" + name + ">";
202 return xml.substring(xml.indexOf(start), xml.indexOf(end)).replace(start, "");
207 protected static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA);
210 public void execute(DelegateExecution execution) {
211 logger.info("AbstractSdncOperationTask.execute begin!");
212 GenericResourceApi genericResourceApiClient = getGenericResourceApiClient();
214 Map<String, String> inputs = getInputs(execution);
216 sendRestrequestAndHandleResponse(execution, inputs, genericResourceApiClient);
217 execution.setVariable("SDNCA_SuccessIndicator", true);
218 } catch (Exception e) {
219 logger.info("exception: AbstractSdncOperationTask.fail!");
220 logger.error("exception: AbstractSdncOperationTask.fail!:", e);
221 logger.error(e.getStackTrace().toString());
222 execution.setVariable("SDNCA_SuccessIndicator", false);
223 updateProgress(execution, RequestsDbConstant.Status.ERROR, null, "100", "sendRestrequestAndHandleResponse finished!");
226 logger.info("AbstractSdncOperationTask.execute end!");
229 protected Map<String, String> getInputs(DelegateExecution execution) {
230 logger.info("AbstractSdncOperationTask.getInputs begin!");
231 Map<String, String> inputs = new HashMap<>();
232 String json = (String) execution.getVariable(SDCADAPTOR_INPUTS);
233 if (!StringUtils.isBlank(json)) {
234 JSONObject jsonObject = new JSONObject(json);
235 JSONObject paras = jsonObject.getJSONObject("additionalParamForNs");
236 Iterator<String> iterator = paras.keys();
237 while (iterator.hasNext()) {
238 String key = iterator.next();
239 inputs.put(key, paras.getString(key));
242 logger.info("AbstractSdncOperationTask.getInputs end!");
246 public abstract void sendRestrequestAndHandleResponse(DelegateExecution execution,
247 Map<String, String> inputs,
248 GenericResourceApi genericResourceApiClient) throws Exception;
250 public void updateProgress(DelegateExecution execution,
254 String statusDescription) {
255 logger.info("AbstractSdncOperationTask.updateProgress begin!");
256 String serviceId = (String) execution.getVariable("serviceId");
257 serviceId = StringUtils.isBlank(serviceId) ? (String) execution.getVariable("serviceInstanceId") : serviceId;
258 String operationId = (String) execution.getVariable("operationId");
259 String resourceTemplateUUID = (String) execution.getVariable("resourceUUID");
260 String resourceTemplateId = (String) execution.getVariable("resourceTemplateId");
261 resourceTemplateId = StringUtils.isBlank(resourceTemplateId) ? "" : resourceTemplateUUID;
262 resourceTemplateUUID = StringUtils.isBlank(resourceTemplateUUID) ? resourceTemplateId : resourceTemplateUUID;
264 ResourceOperationStatus resourceOperationStatus = getResourceOperationStatus(serviceId, operationId, resourceTemplateUUID);
265 if (!StringUtils.isBlank(status)) {
266 resourceOperationStatus.setStatus(status);
268 if (!StringUtils.isBlank(errorCode)) {
269 resourceOperationStatus.setErrorCode(errorCode);
271 if (!StringUtils.isBlank(progress)) {
272 resourceOperationStatus.setProgress(progress);
274 if (!StringUtils.isBlank(statusDescription)) {
275 resourceOperationStatus.setStatusDescription(statusDescription);
277 updateResOperStatus(resourceOperationStatus);
278 logger.info("AbstractSdncOperationTask.updateProgress end!");
279 } catch (Exception exception) {
280 logger.info("exception: AbstractSdncOperationTask.updateProgress fail!");
281 logger.error("exception: AbstractSdncOperationTask.updateProgress fail:", exception);
282 msoLogger.error(MessageEnum.GENERAL_EXCEPTION, " updateProgress catch exception: ", "", this.getTaskName(), MsoLogger.ErrorCode.UnknownError, exception.getClass().toString());
287 protected boolean isSend2SdncDirectly() {
288 logger.info("AbstractSdncOperationTask.isSend2SdncDirectly begin!");
289 Map<String, String> properties = PropertyConfiguration.getInstance().getProperties(TOPOLOGY_PROPERTIES);
290 if (properties != null) {
291 String sdncIp = properties.get("sdnc-ip");
292 String sdncPort = properties.get("sdnc-port");
293 if (!StringUtils.isBlank(sdncIp) && isIp(sdncIp) && !StringUtils.isBlank(sdncPort)) {
294 logger.info("AbstractSdncOperationTask.isSend2SdncDirectly = true.");
298 logger.info("AbstractSdncOperationTask.isSend2SdncDirectly = false.");
302 protected String getSdncIp() {
303 logger.info("AbstractSdncOperationTask.getSdncIp begin.");
304 String sdncIp = null;
305 Map<String, String> properties = PropertyConfiguration.getInstance().getProperties("topology.properties");
306 if (properties != null) {
307 sdncIp = properties.get("sdnc-ip");
309 String returnIp = StringUtils.isBlank(sdncIp) || !isIp(sdncIp) ? null : sdncIp;
310 logger.info("AbstractSdncOperationTask.getSdncIp: sdncIp = {}", returnIp);
314 protected String getSdncPort() {
315 logger.info("AbstractSdncOperationTask.getSdncPort begin.");
316 String sdncPort = null;
317 Map<String, String> properties = PropertyConfiguration.getInstance().getProperties("topology.properties");
318 if (properties != null) {
319 sdncPort = properties.get("sdnc-port");
321 String returnPort = StringUtils.isBlank(sdncPort) ? null : sdncPort;
322 logger.info("AbstractSdncOperationTask.getSdncPort: returnPort = {}", sdncPort);
326 private GenericResourceApi getGenericResourceApiClient() {
327 logger.info("AbstractSdncOperationTask.getGenericResourceApiClient begin!");
328 String msbIp = System.getenv().get(ONAP_IP);
329 int msbPort = DEFAULT_MSB_PORT;
330 Map<String, String> properties = PropertyConfiguration.getInstance().getProperties("topology.properties");
331 if (properties != null) {
332 if (StringUtils.isBlank(msbIp) || !isIp(msbIp)) {
333 msbIp = properties.get("msb-ip");
334 if (StringUtils.isBlank(msbIp)) {
335 msbIp = getString(properties, "msb.address", DEFAULT_MSB_IP);
338 String strMsbPort = properties.get("msb-port");
339 if (StringUtils.isBlank(strMsbPort)) {
340 strMsbPort = getString(properties, "msb.port", String.valueOf(DEFAULT_MSB_PORT));
342 msbPort = Integer.valueOf(strMsbPort);
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);
351 protected boolean isIp(String msbIp) {
352 return !StringUtils.isBlank(msbIp) && msbIp.split("\\.").length == 4;
355 private String getString(Map<String, String> properties, String name, String defaultValue) {
356 String vlaue = properties.get(name);
358 if (!StringUtils.isBlank(vlaue)) {
361 } catch (Exception e) {
362 msoLogger.error(MessageEnum.GENERAL_EXCEPTION, " getMsbIp catch exception: ", "", this.getTaskName(), MsoLogger.ErrorCode.UnknownError, e.getClass().toString(),e);
367 public String getProcessKey(DelegateExecution execution) {
368 return execution.getProcessEngineServices().getRepositoryService().getProcessDefinition(execution.getProcessDefinitionId()).getKey();