Chore: Fix typo in INFO
[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.CreateMacroServiceInstanceResponse;
21 import org.onap.nbi.apis.serviceorder.model.consumer.CreateServiceInstanceResponse;
22 import org.onap.nbi.apis.serviceorder.model.consumer.DeleteE2EServiceInstanceResponse;
23 import org.onap.nbi.apis.serviceorder.model.consumer.GetE2ERequestStatusResponse;
24 import org.onap.nbi.apis.serviceorder.model.consumer.GetRequestStatusResponse;
25 import org.onap.nbi.apis.serviceorder.model.consumer.MSODeleteE2EPayload;
26 import org.onap.nbi.apis.serviceorder.model.consumer.MSOE2EPayload;
27 import org.onap.nbi.apis.serviceorder.model.consumer.MSOE2EServiceActivationPayload;
28 import org.onap.nbi.apis.serviceorder.model.consumer.MSOE2EServiceActivationReponse;
29 import org.onap.nbi.apis.serviceorder.model.consumer.MSOPayload;
30 import org.onap.nbi.apis.serviceorder.model.consumer.ServiceResponse;
31 import org.onap.nbi.exceptions.BackendFunctionalException;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34 import org.springframework.beans.factory.annotation.Autowired;
35 import org.springframework.beans.factory.annotation.Value;
36 import org.springframework.http.HttpEntity;
37 import org.springframework.http.HttpHeaders;
38 import org.springframework.http.HttpMethod;
39 import org.springframework.http.HttpStatus;
40 import org.springframework.http.ResponseEntity;
41 import org.springframework.stereotype.Service;
42 import org.springframework.web.client.ResourceAccessException;
43 import org.springframework.web.client.RestTemplate;
44
45 @Service
46 public class SoClient {
47
48     public static final String RESPONSE_STATUS = "response status : ";
49     public static final String RETURNS = " returns ";
50     public static final String ERROR_ON_CALLING = "error on calling ";
51     @Autowired
52     private RestTemplate restTemplate;
53
54     @Value("${so.host}")
55     private String soHostname;
56
57     @Value("${so.onap.partner.name}")
58     private String soOnapPartnerName;
59
60     @Value("${so.header.authorization}")
61     private String soHeaderAuthorization;
62
63     private static final String HEADER_AUTHORIZATION = "Authorization";
64     private static final String X_ONAP_PARTNER_HEADER = "X-ONAP-PartnerName";
65
66     private static final Logger LOGGER = LoggerFactory.getLogger(SoClient.class);
67
68     private String createSoUrl;
69     private String createE2ESoUrl;
70     private String getSoStatus;
71     private String getE2ESoStatus;
72     private String deleteE2ESoUrl;
73     private String activationE2ESoUrl;
74     private String deleteSoUrl;
75     private String SoHealthCheck;
76
77     @PostConstruct
78     private void setUpAndLogSOUrl() {
79         createSoUrl = new StringBuilder().append(soHostname)
80                 .append(OnapComponentsUrlPaths.MSO_CREATE_SERVICE_INSTANCE_PATH).toString();
81         createE2ESoUrl = new StringBuilder().append(soHostname)
82                 .append(OnapComponentsUrlPaths.MSO_CREATE_E2ESERVICE_INSTANCE_PATH).toString();
83         deleteSoUrl = new StringBuilder().append(soHostname)
84                 .append(OnapComponentsUrlPaths.MSO_DELETE_REQUEST_STATUS_PATH).toString();
85         deleteE2ESoUrl = new StringBuilder().append(soHostname)
86                 .append(OnapComponentsUrlPaths.MSO_DELETE_E2ESERVICE_INSTANCE_PATH).toString();
87         activationE2ESoUrl = new StringBuilder().append(soHostname)     
88                 .append(OnapComponentsUrlPaths.MSO_ACTIVATION_E2ESERVICE_INSTANCE_PATH).toString();
89         getSoStatus = new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_GET_REQUEST_STATUS_PATH)
90                 .toString();
91         getE2ESoStatus = new StringBuilder().append(soHostname)
92                 .append(OnapComponentsUrlPaths.MSO_GET_E2EREQUEST_STATUS_PATH).toString();
93         SoHealthCheck =
94                 new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_HEALTH_CHECK).toString();
95
96         LOGGER.info("SO create service url :  " + createSoUrl);
97         LOGGER.info("SO create e2e service url :  " + createE2ESoUrl);
98         LOGGER.info("SO delete service url :  " + deleteSoUrl);
99         LOGGER.info("SO delete e2e service url :  " + deleteE2ESoUrl);
100         LOGGER.info("SO e2e service actiavtion url :  " + activationE2ESoUrl);
101         LOGGER.info("SO get so status url :  " + getSoStatus);
102         LOGGER.info("SO get e2e so status url :  " + getE2ESoStatus);
103         LOGGER.info("SO healthCheck :  " + SoHealthCheck);
104
105     }
106
107     public ResponseEntity<CreateServiceInstanceResponse> callCreateServiceInstance(MSOPayload msoPayload) {
108
109         if (LOGGER.isDebugEnabled()) {
110             LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
111         }
112
113         try {
114             ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(createSoUrl, HttpMethod.POST,
115                     new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
116
117             logResponsePost(createSoUrl, response);
118             return response;
119
120         } catch (BackendFunctionalException e) {
121             LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e.getHttpStatus() + " , " + e.getBodyResponse());
122             return new ResponseEntity(e.getBodyResponse(), e.getHttpStatus());
123         } catch (ResourceAccessException e) {
124             LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e.getMessage());
125             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
126         }
127     }
128
129     public ResponseEntity<CreateMacroServiceInstanceResponse> callMacroCreateServiceInstance(MSOPayload msoPayload) {
130
131         if (LOGGER.isDebugEnabled()) {
132           LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
133         }
134
135         try {
136           ResponseEntity<CreateMacroServiceInstanceResponse> response = restTemplate.exchange(createSoUrl,
137                    HttpMethod.POST, new HttpEntity<>(msoPayload, buildRequestHeader()),CreateMacroServiceInstanceResponse.class);
138           
139           logMacroResponsePost(createSoUrl, response);
140           return response;
141         } catch (BackendFunctionalException e) {
142           LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e.getHttpStatus() + " , " + e.getBodyResponse());
143           return new ResponseEntity(e.getBodyResponse(), e.getHttpStatus());
144         } catch (ResourceAccessException e) {
145           LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e.getMessage());
146           return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
147         }
148     }
149     
150     public ResponseEntity<CreateE2EServiceInstanceResponse> callE2ECreateServiceInstance(MSOE2EPayload msoPayloadE2E) {
151
152         if (LOGGER.isDebugEnabled()) {
153             LOGGER.debug("Calling SO CreateServiceInstanceE2E with msoPayload : " + msoPayloadE2E.toString());
154         }
155
156         try {
157             ResponseEntity<CreateE2EServiceInstanceResponse> response = restTemplate.exchange(createE2ESoUrl,
158                     HttpMethod.POST, new HttpEntity<>(msoPayloadE2E, buildRequestHeader()),
159                     CreateE2EServiceInstanceResponse.class);
160
161             logE2EResponsePost(createE2ESoUrl, response);
162             return response;
163
164         } catch (BackendFunctionalException e) {
165             LOGGER.error(ERROR_ON_CALLING + createE2ESoUrl + " ," + e.getHttpStatus() + " , " + e.getBodyResponse());
166             return new ResponseEntity(e.getBodyResponse(), e.getHttpStatus());
167         } catch (ResourceAccessException e) {
168             LOGGER.error(ERROR_ON_CALLING + createE2ESoUrl + " ," + e.getMessage());
169             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
170         }
171     }
172
173     public ResponseEntity<CreateServiceInstanceResponse> callDeleteServiceInstance(MSOPayload msoPayload,
174             String serviceId) {
175
176         if (LOGGER.isDebugEnabled()) {
177             LOGGER.debug("Calling SO DeleteServiceInstance with msoPayload : " + msoPayload.toString());
178         }
179
180         String url = deleteSoUrl + serviceId;
181
182         try {
183             ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.DELETE,
184                     new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
185
186             logResponsePost(url, response);
187             return response;
188
189         } catch (BackendFunctionalException e) {
190             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
191             return new ResponseEntity<>(e.getHttpStatus());
192         } catch (ResourceAccessException e) {
193             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
194             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
195         }
196
197     }
198     //Delete Macro
199     
200     public ResponseEntity<CreateMacroServiceInstanceResponse> callMacroDeleteServiceInstance(MSOPayload msoPayload,
201             String serviceId) {
202
203         if (LOGGER.isDebugEnabled()) {
204             LOGGER.debug("Calling SO Macro DeleteServiceInstance with msoPayload : " + msoPayload.toString());
205         }
206
207         String url = deleteSoUrl + serviceId;
208
209         try {
210             ResponseEntity<CreateMacroServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.DELETE,
211                     new HttpEntity<>(msoPayload, buildRequestHeader()), CreateMacroServiceInstanceResponse.class);
212
213             logMacroResponsePost(url, response);
214             return response;
215
216         } catch (BackendFunctionalException e) {
217             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
218             return new ResponseEntity<>(e.getHttpStatus());
219         } catch (ResourceAccessException e) {
220             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
221             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
222         }
223
224     }
225
226     public ResponseEntity<CreateE2EServiceInstanceResponse> callE2EDeleteServiceInstance(String globalSubscriberId,
227             String serviceType, String serviceInstanceId) {
228
229         String url = deleteE2ESoUrl + serviceInstanceId;
230         MSODeleteE2EPayload msoDeleteE2EPayload = new MSODeleteE2EPayload();
231         msoDeleteE2EPayload.setGlobalSubscriberId(globalSubscriberId);
232         msoDeleteE2EPayload.setServiceType(serviceType);
233
234         if (LOGGER.isDebugEnabled()) {
235             LOGGER.debug("Calling SO DeleteE2EServiceInstance with url : " + url + " MSODeleteE2EPayload : "
236                     + msoDeleteE2EPayload.toString());
237         }
238
239         try {
240             ResponseEntity<DeleteE2EServiceInstanceResponse> deleteresponse = restTemplate.exchange(url,
241                     HttpMethod.DELETE, new HttpEntity<>(msoDeleteE2EPayload, buildRequestHeader()),
242                     DeleteE2EServiceInstanceResponse.class);
243
244             CreateE2EServiceInstanceResponse dummyresponse = buildDummyResponse(serviceInstanceId,
245                         deleteresponse.getBody().getOperationId());
246             ResponseEntity<CreateE2EServiceInstanceResponse> response =
247                     new ResponseEntity(dummyresponse, deleteresponse.getStatusCode());
248             logE2EResponsePost(url, response);
249             return response;
250
251         } catch (BackendFunctionalException e) {
252             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
253             return new ResponseEntity<>(e.getHttpStatus());
254         } catch (ResourceAccessException e) {
255             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
256             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
257         }
258     }
259         public ResponseEntity<CreateE2EServiceInstanceResponse> callServiceActivationE2EService(String globalSubscriberId,
260                         String serviceType, String serviceInstanceId, String operation) {
261         String url = new StringBuilder(activationE2ESoUrl).append(serviceInstanceId).append("/").append(operation).toString();
262                 MSOE2EServiceActivationPayload msoE2EServiceActivationPayload = new MSOE2EServiceActivationPayload();
263                 msoE2EServiceActivationPayload.setGlobalSubscriberId(globalSubscriberId);
264                 msoE2EServiceActivationPayload.setServiceType(serviceType);
265
266                 if (LOGGER.isDebugEnabled()) {
267             LOGGER.debug("Calling SO E2E Service Activation/Deactivation  with url : " + url + " MSOE2EServiceActivationPayload : "
268                     + msoE2EServiceActivationPayload.toString());
269         }
270
271         try {
272             ResponseEntity<MSOE2EServiceActivationReponse> activationResponse = restTemplate.exchange(url,
273                     HttpMethod.POST, new HttpEntity<>(msoE2EServiceActivationPayload, buildRequestHeader()),
274                     MSOE2EServiceActivationReponse.class);
275             CreateE2EServiceInstanceResponse dummyresponse = buildDummyResponse(serviceInstanceId,
276                         activationResponse.getBody().getOperationId());
277
278             ResponseEntity<CreateE2EServiceInstanceResponse> response =
279                     new ResponseEntity(dummyresponse, activationResponse.getStatusCode());
280             logE2EResponsePost(url, response);
281             return response;
282
283         } catch (BackendFunctionalException e) {
284             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
285             return new ResponseEntity<>(e.getHttpStatus());
286         } catch (ResourceAccessException e) {
287             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
288             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
289         }
290
291         }
292
293         /**
294          * @param serviceInstanceId
295          * @param operationId
296          * @return
297          * For E2E Services , Create and Delete/Activate/Deactivate Service responses are different,
298          * to maintain consistentcy with ServiceInstances Copy contents of ServiceActivationE2EReponse
299          * to CreateE2EServiceInstanceResponse
300          */
301         private CreateE2EServiceInstanceResponse buildDummyResponse(String serviceInstanceId,
302                         String operationId) {
303                 CreateE2EServiceInstanceResponse dummyresponse = new CreateE2EServiceInstanceResponse();
304                 ServiceResponse serviceResponse = new ServiceResponse();
305                 dummyresponse.setService(serviceResponse);
306                 dummyresponse.getService().setOperationId(operationId);
307                 dummyresponse.getService().setServiceId(serviceInstanceId);
308                 return dummyresponse;
309         }
310     private void logResponsePost(String url, ResponseEntity<CreateServiceInstanceResponse> response) {
311         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
312         if (LOGGER.isDebugEnabled()) {
313             LOGGER.debug("response body : {}", response.getBody().toString());
314         }
315
316         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
317             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
318                     response.getBody().toString());
319         }
320     }
321
322     private void logMacroResponsePost(String url, ResponseEntity<CreateMacroServiceInstanceResponse> response) {
323       LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
324       if (LOGGER.isDebugEnabled()) {
325         LOGGER.debug("response body : {}", response.getBody().toString());
326       }
327       
328       if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
329         LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
330                     response.getBody().toString());
331       }
332     }
333     
334     private void logE2EResponsePost(String url, ResponseEntity<CreateE2EServiceInstanceResponse> response) {
335         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
336         if (LOGGER.isDebugEnabled()) {
337             LOGGER.debug("response body : {}", response.getBody().toString());
338         }
339
340         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
341             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
342                     response.getBody().toString());
343         }
344     }
345
346     public GetRequestStatusResponse callGetRequestStatus(String requestId) {
347         String url = getSoStatus + requestId;
348
349         try {
350
351             ResponseEntity<GetRequestStatusResponse> response = restTemplate.exchange(url, HttpMethod.GET,
352                     new HttpEntity<>(buildRequestHeader()), GetRequestStatusResponse.class);
353             logResponseGet(url, response);
354             if (null == response) {
355                 return null;
356             } else {
357                 return response.getBody();
358             }
359
360         } catch (BackendFunctionalException | ResourceAccessException e) {
361             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
362             return null;
363         }
364     }
365
366     public void callCheckConnectivity() {
367         String url = SoHealthCheck;
368         restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(buildRequestHeader()), String.class);
369
370     }
371
372     public GetE2ERequestStatusResponse callE2EGetRequestStatus(String operationId, String serviceId) {
373
374         String callUrlFormated = getE2ESoStatus.replace("$serviceId", serviceId);
375         callUrlFormated = callUrlFormated.replace("$operationId", operationId);
376
377         if (LOGGER.isDebugEnabled()) {
378             LOGGER.debug("Calling SO callE2EGetRequestStatus with url : " + callUrlFormated);
379         }
380
381         try {
382
383             ResponseEntity<GetE2ERequestStatusResponse> response = restTemplate.exchange(callUrlFormated,
384                     HttpMethod.GET, new HttpEntity<>(buildRequestHeader()), GetE2ERequestStatusResponse.class);
385             logE2EResponseGet(callUrlFormated, response);
386             if (null == response) {
387                 return null;
388             } else {
389                 return response.getBody();
390             }
391
392         } catch (BackendFunctionalException | ResourceAccessException e) {
393             LOGGER.error(ERROR_ON_CALLING + callUrlFormated + " ," + e);
394             return null;
395         }
396     }
397
398     private void logResponseGet(String url, ResponseEntity<GetRequestStatusResponse> response) {
399         if (response != null) {
400             if (LOGGER.isDebugEnabled()) {
401                 LOGGER.debug("response status : {} , response body : {}", response.getStatusCodeValue(),
402                         response.getBody().toString());
403             }
404             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
405                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
406                         response.getBody().toString());
407             }
408         } else {
409             if (LOGGER.isWarnEnabled()) {
410                 LOGGER.warn("no response calling url {}", url);
411             }
412         }
413     }
414
415     private void logE2EResponseGet(String url, ResponseEntity<GetE2ERequestStatusResponse> response) {
416         if (response != null) {
417             if (LOGGER.isDebugEnabled()) {
418                 LOGGER.debug("response status : {} , response body : {}", response.getStatusCodeValue(),
419                         response.getBody().toString());
420             }
421             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
422                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
423                         response.getBody().toString());
424             }
425         } else {
426             if (LOGGER.isWarnEnabled()) {
427                 LOGGER.warn("no response calling url {}", url);
428             }
429         }
430     }
431
432     private HttpHeaders buildRequestHeader() {
433         HttpHeaders httpHeaders = new HttpHeaders();
434         httpHeaders.add(HEADER_AUTHORIZATION, soHeaderAuthorization);
435         httpHeaders.add(X_ONAP_PARTNER_HEADER, soOnapPartnerName);
436         httpHeaders.add("Accept", "application/json");
437         httpHeaders.add("Content-Type", "application/json");
438         return httpHeaders;
439     }
440
441 }