2 * ============LICENSE_START=======================================================
\r
4 * ================================================================================
\r
5 * Copyright (C) 2018 Huawei Technologies Co., Ltd. All rights reserved.
\r
6 * ================================================================================
\r
7 * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * you may not use this file except in compliance with the License.
\r
9 * You may obtain a copy of the License at
\r
11 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
18 * ============LICENSE_END=========================================================
\r
21 package org.openecomp.mso.bpmn.common.recipe;
\r
23 import java.io.IOException;
\r
24 import java.security.GeneralSecurityException;
\r
26 import javax.xml.bind.DatatypeConverter;
\r
28 import org.apache.http.HttpResponse;
\r
29 import org.apache.http.client.ClientProtocolException;
\r
30 import org.apache.http.client.HttpClient;
\r
31 import org.apache.http.client.config.RequestConfig;
\r
32 import org.apache.http.client.methods.HttpPost;
\r
33 import org.apache.http.entity.StringEntity;
\r
34 import org.apache.http.impl.client.HttpClientBuilder;
\r
35 import org.openecomp.mso.logger.MessageEnum;
\r
36 import org.openecomp.mso.logger.MsoLogger;
\r
37 import org.openecomp.mso.properties.MsoJavaProperties;
\r
38 import org.openecomp.mso.properties.MsoPropertiesFactory;
\r
39 import org.openecomp.mso.utils.CryptoUtils;
\r
42 * Support to call resource recipes from the BPMN workflow.
\r
43 * Such as call resource recipe in service workflow.
\r
49 * @version ONAP Beijing Release 2018-02-27
\r
51 public class BpmnRestClient {
\r
53 public static final String DEFAULT_BPEL_AUTH = "admin:admin";
\r
55 public static final String ENCRYPTION_KEY = "aa3871669d893c7fb8abbcda31b88b4f";
\r
57 public static final String CONTENT_TYPE_JSON = "application/json";
\r
59 public static final String CAMUNDA_AUTH = "camundaAuth";
\r
61 private final static String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
\r
63 private static MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory();
\r
65 private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL);
\r
67 private static boolean noProperties = true;
\r
69 public synchronized static MsoJavaProperties loadMsoProperties() {
\r
70 MsoJavaProperties msoProperties;
\r
72 msoProperties = msoPropertiesFactory.getMsoJavaProperties(MSO_PROP_APIHANDLER_INFRA);
\r
73 } catch(Exception e) {
\r
74 msoLogger.error(MessageEnum.APIH_LOAD_PROPERTIES_FAIL, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError,
\r
75 "Exception when loading MSO Properties", e);
\r
79 if(msoProperties != null && msoProperties.size() > 0) {
\r
80 noProperties = false;
\r
81 msoLogger.info(MessageEnum.APIH_PROPERTY_LOAD_SUC, "", "");
\r
82 return msoProperties;
\r
84 msoLogger.error(MessageEnum.APIH_NO_PROPERTIES, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError,
\r
85 "No MSO APIH_INFRA Properties found");
\r
90 public synchronized static final boolean getNoPropertiesState() {
\r
91 return noProperties;
\r
95 * post the recipe Uri
\r
98 * @param recipeUri The request recipe uri
\r
99 * @param requestId the request id
\r
100 * @param recipeTimeout The recipe time out
\r
101 * @param requestAction The request action
\r
102 * @param serviceInstanceId The service instance id
\r
103 * @param serviceType The service Type
\r
104 * @param requestDetails The request Details, these information is from runtime
\r
105 * @param recipeParamXsd The recipe params, its from recipe design
\r
106 * @return The response of the recipe.
\r
107 * @throws ClientProtocolException
\r
108 * @throws IOException
\r
109 * @since ONAP Beijing Release
\r
111 public static HttpResponse post(String recipeUri, String requestId, int recipeTimeout, String requestAction, String serviceInstanceId, String serviceType,
\r
112 String requestDetails, String recipeParamXsd) throws ClientProtocolException, IOException {
\r
114 HttpClient client = HttpClientBuilder.create().build();
\r
116 HttpPost post = new HttpPost(recipeUri);
\r
117 MsoJavaProperties props = loadMsoProperties();
\r
118 RequestConfig requestConfig =
\r
119 RequestConfig.custom().setSocketTimeout(recipeTimeout).setConnectTimeout(recipeTimeout).setConnectionRequestTimeout(recipeTimeout).build();
\r
120 post.setConfig(requestConfig);
\r
121 msoLogger.debug("call the bpmn, url:" + recipeUri);
\r
122 String jsonReq = wrapResourceRequest(requestId, recipeTimeout, requestAction, serviceInstanceId, serviceType, requestDetails, recipeParamXsd);
\r
124 StringEntity input = new StringEntity(jsonReq);
\r
125 input.setContentType(CONTENT_TYPE_JSON);
\r
126 String encryptedCredentials;
\r
127 if(props != null) {
\r
128 encryptedCredentials = props.getProperty(CAMUNDA_AUTH, null);
\r
129 if(encryptedCredentials != null) {
\r
130 String userCredentials = getEncryptedPropValue(encryptedCredentials, DEFAULT_BPEL_AUTH, ENCRYPTION_KEY);
\r
131 if(userCredentials != null) {
\r
132 post.addHeader("Authorization", "Basic " + DatatypeConverter.printBase64Binary(userCredentials.getBytes()));
\r
136 post.setEntity(input);
\r
137 return client.execute(post);
\r
141 * prepare the resource recipe bpmn request.
\r
145 * @param recipeTimeout
\r
146 * @param requestAction
\r
147 * @param serviceInstanceId
\r
148 * @param serviceType
\r
149 * @param requestDetails
\r
150 * @param recipeParams
\r
152 * @since ONAP Beijing Release
\r
154 private static String wrapResourceRequest(String requestId, int recipeTimeout, String requestAction, String serviceInstanceId, String serviceType,
\r
155 String requestDetails, String recipeParams) {
\r
156 String jsonReq = null;
\r
157 if(requestId == null) {
\r
160 if(requestAction == null) {
\r
161 requestAction = "";
\r
163 if(serviceInstanceId == null) {
\r
164 serviceInstanceId = "";
\r
167 if(requestDetails == null) {
\r
168 requestDetails = "";
\r
172 ResourceRecipeRequest recipeRequest = new ResourceRecipeRequest();
\r
173 BpmnParam resourceInput = new BpmnParam();
\r
174 BpmnParam host = new BpmnParam();
\r
175 BpmnParam requestIdInput = new BpmnParam();
\r
176 BpmnParam requestActionInput = new BpmnParam();
\r
177 BpmnParam serviceInstanceIdInput = new BpmnParam();
\r
178 BpmnParam serviceTypeInput = new BpmnParam();
\r
179 BpmnParam recipeParamsInput = new BpmnParam();
\r
180 // host.setValue(parseURL());
\r
181 requestIdInput.setValue(requestId);
\r
182 requestActionInput.setValue(requestAction);
\r
183 serviceInstanceIdInput.setValue(serviceInstanceId);
\r
184 recipeParamsInput.setValue(recipeParams);
\r
185 resourceInput.setValue(requestDetails);
\r
186 recipeRequest.setHost(host);
\r
187 recipeRequest.setRequestId(requestIdInput);
\r
188 recipeRequest.setRequestAction(requestActionInput);
\r
189 recipeRequest.setServiceInstanceId(serviceInstanceIdInput);
\r
190 recipeRequest.setServiceType(serviceTypeInput);
\r
191 recipeRequest.setRecipeParams(recipeParamsInput);
\r
192 jsonReq = recipeRequest.toString();
\r
193 msoLogger.debug("request body is " + jsonReq);
\r
194 } catch(Exception e) {
\r
195 msoLogger.error(MessageEnum.APIH_WARP_REQUEST, "Camunda", "wrapVIDRequest", MsoLogger.ErrorCode.BusinessProcesssError, "Error in APIH Warp request",
\r
205 * @param defaultValue
\r
206 * @param encryptionKey
\r
208 * @since ONAP Beijing Release
\r
210 protected static String getEncryptedPropValue(String prop, String defaultValue, String encryptionKey) {
\r
212 return CryptoUtils.decrypt(prop, encryptionKey);
\r
213 } catch(GeneralSecurityException e) {
\r
214 msoLogger.debug("Security exception", e);
\r
216 return defaultValue;
\r