2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2018 Huawei Technologies Co., Ltd. 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.common.recipe;
25 import java.io.IOException;
26 import java.security.GeneralSecurityException;
28 import javax.xml.bind.DatatypeConverter;
30 import org.apache.http.HttpResponse;
31 import org.apache.http.client.ClientProtocolException;
32 import org.apache.http.client.HttpClient;
33 import org.apache.http.client.config.RequestConfig;
34 import org.apache.http.client.methods.HttpPost;
35 import org.apache.http.entity.StringEntity;
36 import org.apache.http.impl.client.HttpClientBuilder;
37 import org.onap.so.bpmn.core.UrnPropertiesReader;
38 import org.onap.so.logger.MessageEnum;
39 import org.onap.so.logger.MsoLogger;
40 import org.onap.so.utils.CryptoUtils;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
43 import org.springframework.beans.factory.annotation.Autowired;
44 import org.springframework.beans.factory.annotation.Value;
45 import org.springframework.stereotype.Component;
48 * Support to call resource recipes from the BPMN workflow.
49 * Such as call resource recipe in service workflow.
55 * @version ONAP Beijing Release 2018-02-27
58 public class BpmnRestClient {
60 private static Logger logger = LoggerFactory.getLogger(BpmnRestClient.class);
62 public static final String DEFAULT_BPEL_AUTH = "admin:admin";
64 public static final String ENCRYPTION_KEY_PROP = "org.onap.so.adapters.network.encryptionKey";
66 public static final String CONTENT_TYPE_JSON = "application/json";
68 public static final String CAMUNDA_AUTH = "mso.camundaAuth";
70 private static final String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
72 private UrnPropertiesReader urnPropertiesReader;
74 private static boolean noProperties = true;
76 //because for NS it will take a long time the time out of the resouce will be 2 hours.
77 private static final String DEFAULT_TIME_OUT = "7200";
79 public synchronized final boolean getNoPropertiesState() {
87 * @param recipeUri The request recipe uri
88 * @param requestId the request id
89 * @param recipeTimeout The recipe time out
90 * @param requestAction The request action
91 * @param serviceInstanceId The service instance id
92 * @param serviceType The service Type
93 * @param requestDetails The request Details, these information is from runtime
94 * @param recipeParamXsd The recipe params, its from recipe design
95 * @return The response of the recipe.
96 * @throws ClientProtocolException
98 * @since ONAP Beijing Release
100 public HttpResponse post(String recipeUri, String requestId, int recipeTimeout, String requestAction, String serviceInstanceId, String serviceType,
101 String requestDetails, String recipeParamXsd) throws ClientProtocolException, IOException {
103 HttpClient client = HttpClientBuilder.create().build();
105 HttpPost post = new HttpPost(recipeUri);
106 RequestConfig requestConfig =
107 RequestConfig.custom().setSocketTimeout(recipeTimeout).setConnectTimeout(recipeTimeout).setConnectionRequestTimeout(recipeTimeout).build();
108 post.setConfig(requestConfig);
109 logger.debug("call the bpmn, url: {}", recipeUri);
110 String jsonReq = wrapResourceRequest(requestId, recipeTimeout, requestAction, serviceInstanceId, serviceType, requestDetails, recipeParamXsd);
112 StringEntity input = new StringEntity(jsonReq);
113 input.setContentType(CONTENT_TYPE_JSON);
114 String encryptedCredentials;
115 encryptedCredentials = urnPropertiesReader.getVariable(CAMUNDA_AUTH);
116 if(encryptedCredentials != null) {
117 String userCredentials = getEncryptedPropValue(encryptedCredentials, DEFAULT_BPEL_AUTH, ENCRYPTION_KEY_PROP);
118 if(userCredentials != null) {
119 post.addHeader("Authorization", "Basic " + DatatypeConverter.printBase64Binary(userCredentials.getBytes()));
123 post.setEntity(input);
124 return client.execute(post);
128 * prepare the resource recipe bpmn request.
132 * @param recipeTimeout
133 * @param requestAction
134 * @param serviceInstanceId
136 * @param requestDetails
137 * @param recipeParams
139 * @since ONAP Beijing Release
141 private String wrapResourceRequest(String requestId, int recipeTimeout, String requestAction, String serviceInstanceId, String serviceType,
142 String requestDetails, String recipeParams) {
143 String jsonReq = null;
144 if(requestId == null) {
147 if(requestAction == null) {
150 if(serviceInstanceId == null) {
151 serviceInstanceId = "";
154 if(requestDetails == null) {
159 ResourceRecipeRequest recipeRequest = new ResourceRecipeRequest();
160 BpmnParam resourceInput = new BpmnParam();
161 BpmnParam host = new BpmnParam();
162 BpmnParam requestIdInput = new BpmnParam();
163 BpmnParam requestActionInput = new BpmnParam();
164 BpmnParam serviceInstanceIdInput = new BpmnParam();
165 BpmnParam serviceTypeInput = new BpmnParam();
166 BpmnParam recipeParamsInput = new BpmnParam();
167 BpmnIntegerParam recipeTimeoutInput = new BpmnIntegerParam();
168 recipeTimeoutInput.setValue(recipeTimeout);
169 // host.setValue(parseURL());
170 requestIdInput.setValue(requestId);
171 requestActionInput.setValue(requestAction);
172 serviceInstanceIdInput.setValue(serviceInstanceId);
173 serviceTypeInput.setValue(serviceType);
174 recipeParamsInput.setValue(recipeParams);
175 resourceInput.setValue(requestDetails);
176 recipeRequest.setHost(host);
177 recipeRequest.setRequestId(requestIdInput);
178 recipeRequest.setRequestAction(requestActionInput);
179 recipeRequest.setServiceInstanceId(serviceInstanceIdInput);
180 recipeRequest.setServiceType(serviceTypeInput);
181 recipeRequest.setRecipeParams(recipeParamsInput);
182 recipeRequest.setResourceInput(resourceInput);
183 recipeRequest.setRecipeTimeout(recipeTimeoutInput);
184 jsonReq = recipeRequest.toString();
185 logger.trace("request body is {}", jsonReq);
186 } catch(Exception e) {
187 logger.error("{} {} {} {} {}", MessageEnum.APIH_WARP_REQUEST.toString(), "Camunda", "wrapVIDRequest",
188 MsoLogger.ErrorCode.BusinessProcesssError.getValue(), "Error in APIH Warp request", e);
197 * @param defaultValue
198 * @param encryptionKey
200 * @since ONAP Beijing Release
202 protected String getEncryptedPropValue(String prop, String defaultValue, String encryptionKey) {
204 return CryptoUtils.decrypt(prop, urnPropertiesReader.getVariable(encryptionKey));
205 } catch(GeneralSecurityException e) {
206 logger.debug("Security exception", e);