2dbf2feaf7e975d2042bc89524277048fb885a44
[so.git] / bpmn / MSOCommonBPMN / src / main / java / org / onap / so / bpmn / common / recipe / BpmnRestClient.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
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
12  * 
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  * 
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=========================================================
21  */
22
23 package org.onap.so.bpmn.common.recipe;
24
25 import java.io.IOException;
26 import java.security.GeneralSecurityException;
27
28 import javax.xml.bind.DatatypeConverter;
29
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;
46
47 /**
48  * Support to call resource recipes from the BPMN workflow.
49  * Such as call resource recipe in service workflow.
50  * <br>
51  * <p>
52  * </p>
53  * 
54  * @author
55  * @version ONAP Beijing Release 2018-02-27
56  */
57 @Component
58 public class BpmnRestClient {
59
60     private static Logger logger = LoggerFactory.getLogger(BpmnRestClient.class);
61
62     public static final String DEFAULT_BPEL_AUTH = "admin:admin";
63
64     public static final String ENCRYPTION_KEY_PROP = "org.onap.so.adapters.network.encryptionKey";
65
66     public static final String CONTENT_TYPE_JSON = "application/json";
67
68     public static final String CAMUNDA_AUTH = "mso.camundaAuth";
69
70     private static final  String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
71     @Autowired
72     private UrnPropertiesReader urnPropertiesReader;
73
74     private static boolean noProperties = true;
75
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";
78
79     public synchronized final boolean getNoPropertiesState() {
80         return noProperties;
81     }
82
83     /**
84      * post the recipe Uri
85      * <br>
86      * 
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
97      * @throws IOException
98      * @since ONAP Beijing Release
99      */
100     public HttpResponse post(String recipeUri, String requestId, int recipeTimeout, String requestAction, String serviceInstanceId, String serviceType,
101             String requestDetails, String recipeParamXsd) throws ClientProtocolException, IOException {
102
103         HttpClient client = HttpClientBuilder.create().build();
104
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);
111
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()));
120             }
121         }
122         
123         post.setEntity(input);
124         return client.execute(post);
125     }
126
127     /**
128      * prepare the resource recipe bpmn request.
129      * <br>
130      * 
131      * @param requestId
132      * @param recipeTimeout
133      * @param requestAction
134      * @param serviceInstanceId
135      * @param serviceType
136      * @param requestDetails
137      * @param recipeParams
138      * @return
139      * @since ONAP Beijing Release
140      */
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) {
145             requestId = "";
146         }
147         if(requestAction == null) {
148             requestAction = "";
149         }
150         if(serviceInstanceId == null) {
151             serviceInstanceId = "";
152         }
153
154         if(requestDetails == null) {
155             requestDetails = "";
156         }
157
158         try {
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);
189         }
190         return jsonReq;
191     }
192
193     /**
194      * <br>
195      * 
196      * @param prop
197      * @param defaultValue
198      * @param encryptionKey
199      * @return
200      * @since ONAP Beijing Release
201      */
202     protected String getEncryptedPropValue(String prop, String defaultValue, String encryptionKey) {
203         try {
204             return CryptoUtils.decrypt(prop, urnPropertiesReader.getVariable(encryptionKey));
205         } catch(GeneralSecurityException e) {
206             logger.debug("Security exception", e);
207         }
208         return defaultValue;
209     }
210
211 }