c286d60ca2630a05cba76552211f423839b7b325
[externalapi/nbi.git] / src / main / java / org / onap / nbi / apis / serviceorder / SoClient.java
1 /**
2  * Copyright (c) 2018 Orange
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14
15 package org.onap.nbi.apis.serviceorder;
16
17 import javax.annotation.PostConstruct;
18 import org.onap.nbi.OnapComponentsUrlPaths;
19 import org.onap.nbi.apis.serviceorder.model.consumer.CreateE2EServiceInstanceResponse;
20 import org.onap.nbi.apis.serviceorder.model.consumer.CreateServiceInstanceResponse;
21 import org.onap.nbi.apis.serviceorder.model.consumer.DeleteE2EServiceInstanceResponse;
22 import org.onap.nbi.apis.serviceorder.model.consumer.GetE2ERequestStatusResponse;
23 import org.onap.nbi.apis.serviceorder.model.consumer.GetRequestStatusResponse;
24 import org.onap.nbi.apis.serviceorder.model.consumer.MSODeleteE2EPayload;
25 import org.onap.nbi.apis.serviceorder.model.consumer.MSOE2EPayload;
26 import org.onap.nbi.apis.serviceorder.model.consumer.MSOPayload;
27 import org.onap.nbi.apis.serviceorder.model.consumer.ServiceResponse;
28 import org.onap.nbi.exceptions.BackendFunctionalException;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31 import org.springframework.beans.factory.annotation.Autowired;
32 import org.springframework.beans.factory.annotation.Value;
33 import org.springframework.http.HttpEntity;
34 import org.springframework.http.HttpHeaders;
35 import org.springframework.http.HttpMethod;
36 import org.springframework.http.HttpStatus;
37 import org.springframework.http.ResponseEntity;
38 import org.springframework.stereotype.Service;
39 import org.springframework.web.client.ResourceAccessException;
40 import org.springframework.web.client.RestTemplate;
41
42 @Service
43 public class SoClient {
44
45     public static final String RESPONSE_STATUS = "response status : ";
46     public static final String RETURNS = " returns ";
47     public static final String ERROR_ON_CALLING = "error on calling ";
48     @Autowired
49     private RestTemplate restTemplate;
50
51     @Value("${so.host}")
52     private String soHostname;
53
54     @Value("${so.onap.partner.name}")
55     private String soOnapPartnerName;
56
57     @Value("${so.header.authorization}")
58     private String soHeaderAuthorization;
59
60     private static final String HEADER_AUTHORIZATION = "Authorization";
61     private static final String X_ONAP_PARTNER_HEADER = "X-ONAP-PartnerName";
62
63     private static final Logger LOGGER = LoggerFactory.getLogger(SoClient.class);
64
65     private String createSoUrl;
66     private String createE2ESoUrl;
67     private String getSoStatus;
68     private String getE2ESoStatus;
69     private String deleteE2ESoUrl;
70     private String deleteSoUrl;
71     private String SoHealthCheck;
72
73     @PostConstruct
74     private void setUpAndLogSOUrl() {
75         createSoUrl = new StringBuilder().append(soHostname)
76                 .append(OnapComponentsUrlPaths.MSO_CREATE_SERVICE_INSTANCE_PATH).toString();
77         createE2ESoUrl = new StringBuilder().append(soHostname)
78                 .append(OnapComponentsUrlPaths.MSO_CREATE_E2ESERVICE_INSTANCE_PATH).toString();
79         deleteSoUrl = new StringBuilder().append(soHostname)
80                 .append(OnapComponentsUrlPaths.MSO_DELETE_REQUEST_STATUS_PATH).toString();
81         deleteE2ESoUrl = new StringBuilder().append(soHostname)
82                 .append(OnapComponentsUrlPaths.MSO_DELETE_E2ESERVICE_INSTANCE_PATH).toString();
83         getSoStatus = new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_GET_REQUEST_STATUS_PATH)
84                 .toString();
85         getE2ESoStatus = new StringBuilder().append(soHostname)
86                 .append(OnapComponentsUrlPaths.MSO_GET_E2EREQUEST_STATUS_PATH).toString();
87         SoHealthCheck =
88                 new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_HEALTH_CHECK).toString();
89
90         LOGGER.info("SO create service url :  " + createSoUrl);
91         LOGGER.info("SO create e2e service url :  " + createE2ESoUrl);
92         LOGGER.info("SO delete service url :  " + deleteSoUrl);
93         LOGGER.info("SO delete e2e service url :  " + deleteE2ESoUrl);
94         LOGGER.info("SO get so status url :  " + getSoStatus);
95         LOGGER.info("SO get e2e so status url :  " + getE2ESoStatus);
96         LOGGER.info("SO healthCheck :  " + SoHealthCheck);
97
98     }
99
100     public ResponseEntity<CreateServiceInstanceResponse> callCreateServiceInstance(MSOPayload msoPayload) {
101
102         if (LOGGER.isDebugEnabled()) {
103             LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
104         }
105
106         try {
107             ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(createSoUrl, HttpMethod.POST,
108                     new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
109
110             logResponsePost(createSoUrl, response);
111             return response;
112
113         } catch (BackendFunctionalException e) {
114             LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e.getHttpStatus() + " , " + e.getBodyResponse());
115             return new ResponseEntity(e.getBodyResponse(), e.getHttpStatus());
116         } catch (ResourceAccessException e) {
117             LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e.getMessage());
118             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
119         }
120     }
121
122     public ResponseEntity<CreateE2EServiceInstanceResponse> callE2ECreateServiceInstance(MSOE2EPayload msoPayloadE2E) {
123
124         if (LOGGER.isDebugEnabled()) {
125             LOGGER.debug("Calling SO CreateServiceInstanceE2E with msoPayload : " + msoPayloadE2E.toString());
126         }
127
128         try {
129             ResponseEntity<CreateE2EServiceInstanceResponse> response = restTemplate.exchange(createE2ESoUrl,
130                     HttpMethod.POST, new HttpEntity<>(msoPayloadE2E, buildRequestHeader()),
131                     CreateE2EServiceInstanceResponse.class);
132
133             logE2EResponsePost(createE2ESoUrl, response);
134             return response;
135
136         } catch (BackendFunctionalException e) {
137             LOGGER.error(ERROR_ON_CALLING + createE2ESoUrl + " ," + e.getHttpStatus() + " , " + e.getBodyResponse());
138             return new ResponseEntity(e.getBodyResponse(), e.getHttpStatus());
139         } catch (ResourceAccessException e) {
140             LOGGER.error(ERROR_ON_CALLING + createE2ESoUrl + " ," + e.getMessage());
141             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
142         }
143     }
144
145     public ResponseEntity<CreateServiceInstanceResponse> callDeleteServiceInstance(MSOPayload msoPayload,
146             String serviceId) {
147
148         if (LOGGER.isDebugEnabled()) {
149             LOGGER.debug("Calling SO DeleteServiceInstance with msoPayload : " + msoPayload.toString());
150         }
151
152         String url = deleteSoUrl + serviceId;
153
154         try {
155             ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.DELETE,
156                     new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
157
158             logResponsePost(url, response);
159             return response;
160
161         } catch (BackendFunctionalException e) {
162             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
163             return new ResponseEntity<>(e.getHttpStatus());
164         } catch (ResourceAccessException e) {
165             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
166             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
167         }
168
169     }
170
171     public ResponseEntity<CreateE2EServiceInstanceResponse> callE2EDeleteServiceInstance(String globalSubscriberId,
172             String serviceType, String serviceInstanceId) {
173
174         String url = deleteE2ESoUrl + serviceInstanceId;
175         MSODeleteE2EPayload msoDeleteE2EPayload = new MSODeleteE2EPayload();
176         msoDeleteE2EPayload.setGlobalSubscriberId(globalSubscriberId);
177         msoDeleteE2EPayload.setServiceType(serviceType);
178
179         if (LOGGER.isDebugEnabled()) {
180             LOGGER.debug("Calling SO DeleteE2EServiceInstance with url : " + url + " MSODeleteE2EPayload : "
181                     + msoDeleteE2EPayload.toString());
182         }
183
184         try {
185             ResponseEntity<DeleteE2EServiceInstanceResponse> deleteresponse = restTemplate.exchange(url,
186                     HttpMethod.DELETE, new HttpEntity<>(msoDeleteE2EPayload, buildRequestHeader()),
187                     DeleteE2EServiceInstanceResponse.class);
188
189             // For E2E Services , Create and Delete Service responses are different, to maintain
190             // consistentcy with ServiceInstances
191             // Copy contents of DeleteE2EServiceInstanceResponse to CreateE2EServiceInstanceResponse
192             CreateE2EServiceInstanceResponse dummyresponse = new CreateE2EServiceInstanceResponse();
193             ServiceResponse serviceResponse = new ServiceResponse();
194             dummyresponse.setService(serviceResponse);
195             dummyresponse.getService().setOperationId(deleteresponse.getBody().getOperationId());
196             dummyresponse.getService().setServiceId(serviceInstanceId);
197
198             ResponseEntity<CreateE2EServiceInstanceResponse> response =
199                     new ResponseEntity(dummyresponse, deleteresponse.getStatusCode());
200             logE2EResponsePost(url, response);
201             return response;
202
203         } catch (BackendFunctionalException e) {
204             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
205             return new ResponseEntity<>(e.getHttpStatus());
206         } catch (ResourceAccessException e) {
207             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
208             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
209         }
210     }
211
212     private void logResponsePost(String url, ResponseEntity<CreateServiceInstanceResponse> response) {
213         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
214         if (LOGGER.isDebugEnabled()) {
215             LOGGER.debug("response body : {}", response.getBody().toString());
216         }
217
218         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
219             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
220                     response.getBody().toString());
221         }
222     }
223
224     private void logE2EResponsePost(String url, ResponseEntity<CreateE2EServiceInstanceResponse> response) {
225         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
226         if (LOGGER.isDebugEnabled()) {
227             LOGGER.debug("response body : {}", response.getBody().toString());
228         }
229
230         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
231             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
232                     response.getBody().toString());
233         }
234     }
235
236     public GetRequestStatusResponse callGetRequestStatus(String requestId) {
237         String url = getSoStatus + requestId;
238
239         try {
240
241             ResponseEntity<GetRequestStatusResponse> response = restTemplate.exchange(url, HttpMethod.GET,
242                     new HttpEntity<>(buildRequestHeader()), GetRequestStatusResponse.class);
243             logResponseGet(url, response);
244             if (null == response) {
245                 return null;
246             } else {
247                 return response.getBody();
248             }
249
250         } catch (BackendFunctionalException | ResourceAccessException e) {
251             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
252             return null;
253         }
254     }
255
256     public void callCheckConnectivity() {
257         String url = SoHealthCheck;
258         restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(buildRequestHeader()), String.class);
259
260     }
261
262     public GetE2ERequestStatusResponse callE2EGetRequestStatus(String operationId, String serviceId) {
263
264         String callUrlFormated = getE2ESoStatus.replace("$serviceId", serviceId);
265         callUrlFormated = callUrlFormated.replace("$operationId", operationId);
266
267         if (LOGGER.isDebugEnabled()) {
268             LOGGER.debug("Calling SO callE2EGetRequestStatus with url : " + callUrlFormated);
269         }
270
271         try {
272
273             ResponseEntity<GetE2ERequestStatusResponse> response = restTemplate.exchange(callUrlFormated,
274                     HttpMethod.GET, new HttpEntity<>(buildRequestHeader()), GetE2ERequestStatusResponse.class);
275             logE2EResponseGet(callUrlFormated, response);
276             if (null == response) {
277                 return null;
278             } else {
279                 return response.getBody();
280             }
281
282         } catch (BackendFunctionalException | ResourceAccessException e) {
283             LOGGER.error(ERROR_ON_CALLING + callUrlFormated + " ," + e);
284             return null;
285         }
286     }
287
288     private void logResponseGet(String url, ResponseEntity<GetRequestStatusResponse> response) {
289         if (response != null) {
290             if (LOGGER.isDebugEnabled()) {
291                 LOGGER.debug("response status : {} , response body : {}", response.getStatusCodeValue(),
292                         response.getBody().toString());
293             }
294             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
295                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
296                         response.getBody().toString());
297             }
298         } else {
299             if (LOGGER.isWarnEnabled()) {
300                 LOGGER.warn("no response calling url {}", url);
301             }
302         }
303     }
304
305     private void logE2EResponseGet(String url, ResponseEntity<GetE2ERequestStatusResponse> response) {
306         if (response != null) {
307             if (LOGGER.isDebugEnabled()) {
308                 LOGGER.debug("response status : {} , response body : {}", response.getStatusCodeValue(),
309                         response.getBody().toString());
310             }
311             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
312                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
313                         response.getBody().toString());
314             }
315         } else {
316             if (LOGGER.isWarnEnabled()) {
317                 LOGGER.warn("no response calling url {}", url);
318             }
319         }
320     }
321
322     private HttpHeaders buildRequestHeader() {
323         HttpHeaders httpHeaders = new HttpHeaders();
324         httpHeaders.add(HEADER_AUTHORIZATION, soHeaderAuthorization);
325         httpHeaders.add(X_ONAP_PARTNER_HEADER, soOnapPartnerName);
326         httpHeaders.add("Accept", "application/json");
327         httpHeaders.add("Content-Type", "application/json");
328         return httpHeaders;
329     }
330
331 }