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