/*- * ============LICENSE_START======================================================= * ONAP - SO * ================================================================================ * Copyright (C) 2018 Huawei Technologies Co., Ltd. All rights reserved. * ================================================================================ * Modifications Copyright (c) 2019 Samsung * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.onap.so.bpmn.common.recipe; import java.io.IOException; import java.security.GeneralSecurityException; import javax.xml.bind.DatatypeConverter; import org.onap.so.logger.LoggingAnchor; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.onap.so.bpmn.core.UrnPropertiesReader; import org.onap.logging.filter.base.ErrorCode; import org.onap.so.logger.MessageEnum; import org.onap.so.utils.CryptoUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * Support to call resource recipes from the BPMN workflow. Such as call resource recipe in service workflow.
*

*

* * @author * @version ONAP Beijing Release 2018-02-27 */ @Component public class BpmnRestClient { private static Logger logger = LoggerFactory.getLogger(BpmnRestClient.class); public static final String DEFAULT_BPEL_AUTH = "admin:admin"; public static final String ENCRYPTION_KEY_PROP = "org.onap.so.adapters.network.encryptionKey"; public static final String CONTENT_TYPE_JSON = "application/json"; public static final String CAMUNDA_AUTH = "mso.camundaAuth"; @Autowired private UrnPropertiesReader urnPropertiesReader; private static boolean noProperties = true; public final synchronized boolean getNoPropertiesState() { return noProperties; } /** * post the recipe Uri
* * @param recipeUri The request recipe uri * @param requestId the request id * @param recipeTimeout The recipe time out * @param requestAction The request action * @param serviceInstanceId The service instance id * @param serviceType The service Type * @param requestDetails The request Details, these information is from runtime * @param recipeParamXsd The recipe params, its from recipe design * @return The response of the recipe. * @throws ClientProtocolException * @throws IOException * @since ONAP Beijing Release */ public HttpResponse post(String recipeUri, String requestId, int recipeTimeout, String requestAction, String serviceInstanceId, String serviceType, String requestDetails, String recipeParamXsd) throws IOException { HttpClient client = HttpClientBuilder.create().build(); HttpPost post = new HttpPost(recipeUri); RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(recipeTimeout) .setConnectTimeout(recipeTimeout).setConnectionRequestTimeout(recipeTimeout).build(); post.setConfig(requestConfig); logger.debug("call the bpmn, url: {}", recipeUri); String jsonReq = wrapResourceRequest(requestId, recipeTimeout, requestAction, serviceInstanceId, serviceType, requestDetails, recipeParamXsd); StringEntity input = new StringEntity(jsonReq); input.setContentType(CONTENT_TYPE_JSON); String encryptedCredentials; encryptedCredentials = urnPropertiesReader.getVariable(CAMUNDA_AUTH); if (encryptedCredentials != null) { String userCredentials = getEncryptedPropValue(encryptedCredentials, DEFAULT_BPEL_AUTH, ENCRYPTION_KEY_PROP); if (userCredentials != null) { post.addHeader("Authorization", "Basic " + DatatypeConverter.printBase64Binary(userCredentials.getBytes())); } } post.setEntity(input); return client.execute(post); } /** * prepare the resource recipe bpmn request.
* * @param requestId * @param recipeTimeout * @param requestAction * @param serviceInstanceId * @param serviceType * @param requestDetails * @param recipeParams * @return * @since ONAP Beijing Release */ private String wrapResourceRequest(String requestId, int recipeTimeout, String requestAction, String serviceInstanceId, String serviceType, String requestDetails, String recipeParams) { String jsonReq = null; if (requestId == null) { requestId = ""; } if (requestAction == null) { requestAction = ""; } if (serviceInstanceId == null) { serviceInstanceId = ""; } if (requestDetails == null) { requestDetails = ""; } try { ResourceRecipeRequest recipeRequest = new ResourceRecipeRequest(); BpmnParam resourceInput = new BpmnParam(); BpmnParam host = new BpmnParam(); BpmnParam requestIdInput = new BpmnParam(); BpmnParam requestActionInput = new BpmnParam(); BpmnParam serviceInstanceIdInput = new BpmnParam(); BpmnParam serviceTypeInput = new BpmnParam(); BpmnParam recipeParamsInput = new BpmnParam(); BpmnIntegerParam recipeTimeoutInput = new BpmnIntegerParam(); recipeTimeoutInput.setValue(recipeTimeout); requestIdInput.setValue(requestId); requestActionInput.setValue(requestAction); serviceInstanceIdInput.setValue(serviceInstanceId); serviceTypeInput.setValue(serviceType); recipeParamsInput.setValue(recipeParams); resourceInput.setValue(requestDetails); recipeRequest.setHost(host); recipeRequest.setRequestId(requestIdInput); recipeRequest.setRequestAction(requestActionInput); recipeRequest.setServiceInstanceId(serviceInstanceIdInput); recipeRequest.setServiceType(serviceTypeInput); recipeRequest.setRecipeParams(recipeParamsInput); recipeRequest.setResourceInput(resourceInput); recipeRequest.setRecipeTimeout(recipeTimeoutInput); jsonReq = recipeRequest.toString(); logger.trace("request body is {}", jsonReq); } catch (Exception e) { logger.error(LoggingAnchor.FIVE, MessageEnum.APIH_WARP_REQUEST.toString(), "Camunda", "wrapVIDRequest", ErrorCode.BusinessProcessError.getValue(), "Error in APIH Warp request", e); } return jsonReq; } /** *
* * @param prop * @param defaultValue * @param encryptionKey * @return * @since ONAP Beijing Release */ protected String getEncryptedPropValue(String prop, String defaultValue, String encryptionKey) { try { return CryptoUtils.decrypt(prop, urnPropertiesReader.getVariable(encryptionKey)); } catch (GeneralSecurityException e) { logger.debug("Security exception", e); } return defaultValue; } }