Improve nbi status
[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 in compliance with
5  * 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 is distributed on
10  * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
11  * specific language governing permissions and limitations under the License.
12  */
13 package org.onap.nbi.apis.serviceorder;
14
15 import javax.annotation.PostConstruct;
16 import org.onap.nbi.OnapComponentsUrlPaths;
17 import org.onap.nbi.apis.serviceorder.model.consumer.CreateE2EServiceInstanceResponse;
18 import org.onap.nbi.apis.serviceorder.model.consumer.CreateServiceInstanceResponse;
19 import org.onap.nbi.apis.serviceorder.model.consumer.DeleteE2EServiceInstanceResponse;
20 import org.onap.nbi.apis.serviceorder.model.consumer.GetE2ERequestStatusResponse;
21 import org.onap.nbi.apis.serviceorder.model.consumer.GetRequestStatusResponse;
22 import org.onap.nbi.apis.serviceorder.model.consumer.MSODeleteE2EPayload;
23 import org.onap.nbi.apis.serviceorder.model.consumer.MSOE2EPayload;
24 import org.onap.nbi.apis.serviceorder.model.consumer.MSOPayload;
25 import org.onap.nbi.apis.serviceorder.model.consumer.ServiceResponse;
26 import org.onap.nbi.exceptions.BackendFunctionalException;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29 import org.springframework.beans.factory.annotation.Autowired;
30 import org.springframework.beans.factory.annotation.Value;
31 import org.springframework.http.HttpEntity;
32 import org.springframework.http.HttpHeaders;
33 import org.springframework.http.HttpMethod;
34 import org.springframework.http.HttpStatus;
35 import org.springframework.http.ResponseEntity;
36 import org.springframework.stereotype.Service;
37 import org.springframework.web.client.ResourceAccessException;
38 import org.springframework.web.client.RestTemplate;
39
40 @Service
41 public class SoClient {
42
43     public static final String RESPONSE_STATUS = "response status : ";
44     public static final String RETURNS = " returns ";
45     public static final String ERROR_ON_CALLING = "error on calling ";
46     @Autowired
47     private RestTemplate restTemplate;
48
49     @Value("${so.host}")
50     private String soHostname;
51
52     @Value("${so.api.id}")
53     private String soApiId;
54
55     @Value("${so.header.authorization}")
56     private String soHeaderAuthorization;
57
58     private static final String HEADER_AUTHORIZATION = "Authorization";
59     private static final String X_FROM_APP_ID = "X-FromAppId";
60
61     private static final Logger LOGGER = LoggerFactory.getLogger(SoClient.class);
62
63     private String createSoUrl;
64     private String createE2ESoUrl;
65     private String getSoStatus;
66     private String getE2ESoStatus;
67     private String deleteE2ESoUrl;
68     private String deleteSoUrl;
69     private String SoHealthCheck;
70
71
72     @PostConstruct
73     private void setUpAndLogSOUrl() {
74         createSoUrl = new StringBuilder().append(soHostname)
75             .append(OnapComponentsUrlPaths.MSO_CREATE_SERVICE_INSTANCE_PATH).toString();
76         createE2ESoUrl = new StringBuilder().append(soHostname)
77             .append(OnapComponentsUrlPaths.MSO_CREATE_E2ESERVICE_INSTANCE_PATH).toString();
78         deleteSoUrl = new StringBuilder().append(soHostname)
79             .append(OnapComponentsUrlPaths.MSO_DELETE_REQUEST_STATUS_PATH).toString();
80         deleteE2ESoUrl = new StringBuilder().append(soHostname)
81             .append(OnapComponentsUrlPaths.MSO_DELETE_E2ESERVICE_INSTANCE_PATH).toString();
82         getSoStatus = new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_GET_REQUEST_STATUS_PATH)
83             .toString();
84         getE2ESoStatus = new StringBuilder().append(soHostname)
85             .append(OnapComponentsUrlPaths.MSO_GET_E2EREQUEST_STATUS_PATH).toString();
86         SoHealthCheck = new StringBuilder().append(soHostname)
87             .append(OnapComponentsUrlPaths.MSO_HEALTH_CHECK).toString();
88
89         LOGGER.info("SO create service url :  " + createSoUrl);
90         LOGGER.info("SO create e2e service url :  " + createE2ESoUrl);
91         LOGGER.info("SO delete service url :  " + deleteSoUrl);
92         LOGGER.info("SO delete e2e service url :  " + deleteE2ESoUrl);
93         LOGGER.info("SO get so status url :  " + getSoStatus);
94         LOGGER.info("SO get e2e so status url :  " + getE2ESoStatus);
95         LOGGER.info("SO healthCheck :  " + SoHealthCheck);
96
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
130                 .exchange(createE2ESoUrl, HttpMethod.POST,
131                     new HttpEntity<>(msoPayloadE2E, buildRequestHeader()), CreateE2EServiceInstanceResponse.class);
132
133             logE2EResponsePost(createE2ESoUrl, response);
134             return response;
135
136         } catch (BackendFunctionalException e) {
137             LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + 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,
173         String serviceInstanceId) {
174
175         String url = deleteE2ESoUrl + serviceInstanceId;
176         MSODeleteE2EPayload msoDeleteE2EPayload = new MSODeleteE2EPayload();
177         msoDeleteE2EPayload.setGlobalSubscriberId(globalSubscriberId);
178         msoDeleteE2EPayload.setServiceType(serviceType);
179
180         if (LOGGER.isDebugEnabled()) {
181             LOGGER.debug("Calling SO DeleteE2EServiceInstance with url : " + url + " MSODeleteE2EPayload : "
182                 + msoDeleteE2EPayload.toString());
183         }
184
185         try {
186             ResponseEntity<DeleteE2EServiceInstanceResponse> deleteresponse = restTemplate
187                 .exchange(url, HttpMethod.DELETE,
188                     new HttpEntity<>(msoDeleteE2EPayload, buildRequestHeader()),
189                     DeleteE2EServiceInstanceResponse.class);
190
191             // For E2E Services , Create and Delete Service responses are different, to maintain consistentcy with ServiceInstances
192             // Copy contents of DeleteE2EServiceInstanceResponse to CreateE2EServiceInstanceResponse
193             CreateE2EServiceInstanceResponse dummyresponse = new CreateE2EServiceInstanceResponse();
194             ServiceResponse serviceResponse = new ServiceResponse();
195             dummyresponse.setService(serviceResponse);
196             dummyresponse.getService().setOperationId(deleteresponse.getBody().getOperationId());
197             dummyresponse.getService().setServiceId(serviceInstanceId);
198
199             ResponseEntity<CreateE2EServiceInstanceResponse> response = new ResponseEntity(dummyresponse,
200                 deleteresponse.getStatusCode());
201             logE2EResponsePost(url, response);
202             return response;
203
204         } catch (BackendFunctionalException e) {
205             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
206             return new ResponseEntity<>(e.getHttpStatus());
207         } catch (ResourceAccessException e) {
208             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
209             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
210         }
211     }
212
213     private void logResponsePost(String url, ResponseEntity<CreateServiceInstanceResponse> response) {
214         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
215         if (LOGGER.isDebugEnabled()) {
216             LOGGER.debug("response body : {}", response.getBody().toString());
217         }
218
219         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
220             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
221                 response.getBody().toString());
222         }
223     }
224
225     private void logE2EResponsePost(String url, ResponseEntity<CreateE2EServiceInstanceResponse> response) {
226         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
227         if (LOGGER.isDebugEnabled()) {
228             LOGGER.debug("response body : {}", response.getBody().toString());
229         }
230
231         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
232             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
233                 response.getBody().toString());
234         }
235     }
236
237     public GetRequestStatusResponse callGetRequestStatus(String requestId) {
238         String url = getSoStatus + requestId;
239
240         try {
241
242             ResponseEntity<GetRequestStatusResponse> response = restTemplate.exchange(url, HttpMethod.GET,
243                 new HttpEntity<>(buildRequestHeader()), GetRequestStatusResponse.class);
244             logResponseGet(url, response);
245             if (null == response) {
246                 return null;
247             } else {
248                 return response.getBody();
249             }
250
251         } catch (BackendFunctionalException | ResourceAccessException e) {
252             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
253             return null;
254         }
255     }
256
257
258     public void callCheckConnectivity() {
259         String url = SoHealthCheck;
260         restTemplate.exchange(url, HttpMethod.GET,
261             new HttpEntity<>(buildRequestHeader()), String.class);
262
263     }
264
265     public GetE2ERequestStatusResponse callE2EGetRequestStatus(String operationId, String serviceId) {
266
267         String callUrlFormated = getE2ESoStatus.replace("$serviceId", serviceId);
268         callUrlFormated = callUrlFormated.replace("$operationId", operationId);
269
270         if (LOGGER.isDebugEnabled()) {
271             LOGGER.debug("Calling SO callE2EGetRequestStatus with url : " + callUrlFormated);
272         }
273
274         try {
275
276             ResponseEntity<GetE2ERequestStatusResponse> response = restTemplate
277                 .exchange(callUrlFormated, HttpMethod.GET,
278                     new HttpEntity<>(buildRequestHeader()), GetE2ERequestStatusResponse.class);
279             logE2EResponseGet(callUrlFormated, response);
280             if (null == response) {
281                 return null;
282             } else {
283                 return response.getBody();
284             }
285
286         } catch (BackendFunctionalException | ResourceAccessException e) {
287             LOGGER.error(ERROR_ON_CALLING + callUrlFormated + " ," + e);
288             return null;
289         }
290     }
291
292     private void logResponseGet(String url, ResponseEntity<GetRequestStatusResponse> response) {
293         if (response != null) {
294             if (LOGGER.isDebugEnabled()) {
295                 LOGGER.debug("response body : {}", response.getBody().toString());
296             }
297             LOGGER.info("response status : {}", response.getStatusCodeValue());
298             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
299                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
300                     response.getBody().toString());
301             }
302         } else {
303             LOGGER.info("no response calling url {}", url);
304         }
305     }
306
307     private void logE2EResponseGet(String url, ResponseEntity<GetE2ERequestStatusResponse> response) {
308         if (response != null) {
309             if (LOGGER.isDebugEnabled()) {
310                 LOGGER.debug("response body : {}", response.getBody().toString());
311             }
312             LOGGER.info("response status : {}", response.getStatusCodeValue());
313             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
314                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
315                     response.getBody().toString());
316             }
317         } else {
318             LOGGER.info("no response calling url {}", url);
319         }
320     }
321
322     private HttpHeaders buildRequestHeader() {
323         HttpHeaders httpHeaders = new HttpHeaders();
324         httpHeaders.add(HEADER_AUTHORIZATION, soHeaderAuthorization);
325         httpHeaders.add(X_FROM_APP_ID, soApiId);
326         httpHeaders.add("Accept", "application/json");
327         httpHeaders.add("Content-Type", "application/json");
328         return httpHeaders;
329     }
330
331 }