Help NBI user to get information
[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 org.onap.nbi.OnapComponentsUrlPaths;
16 import org.onap.nbi.apis.serviceorder.model.consumer.CreateE2EServiceInstanceResponse;
17 import org.onap.nbi.apis.serviceorder.model.consumer.CreateServiceInstanceResponse;
18 import org.onap.nbi.apis.serviceorder.model.consumer.DeleteE2EServiceInstanceResponse;
19 import org.onap.nbi.apis.serviceorder.model.consumer.GetE2ERequestStatusResponse;
20 import org.onap.nbi.apis.serviceorder.model.consumer.GetRequestStatusResponse;
21 import org.onap.nbi.apis.serviceorder.model.consumer.MSODeleteE2EPayload;
22 import org.onap.nbi.apis.serviceorder.model.consumer.MSOE2EPayload;
23 import org.onap.nbi.apis.serviceorder.model.consumer.MSOPayload;
24 import org.onap.nbi.apis.serviceorder.model.consumer.ServiceResponse;
25 import org.onap.nbi.exceptions.BackendFunctionalException;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28 import org.springframework.beans.factory.annotation.Autowired;
29 import org.springframework.beans.factory.annotation.Value;
30 import org.springframework.http.HttpEntity;
31 import org.springframework.http.HttpHeaders;
32 import org.springframework.http.HttpMethod;
33 import org.springframework.http.HttpStatus;
34 import org.springframework.http.ResponseEntity;
35 import org.springframework.stereotype.Service;
36 import org.springframework.web.client.ResourceAccessException;
37 import org.springframework.web.client.RestTemplate;
38
39 @Service
40 public class SoClient {
41
42     public static final String RESPONSE_STATUS = "response status : ";
43     public static final String RETURNS = " returns ";
44     public static final String ERROR_ON_CALLING = "error on calling ";
45     @Autowired
46     private RestTemplate restTemplate;
47
48     @Value("${so.host}")
49     private String soHostname;
50
51     @Value("${so.api.id}")
52     private String soApiId;
53
54     @Value("${so.header.authorization}")
55     private String soHeaderAuthorization;
56
57     private static final String HEADER_AUTHORIZATION = "Authorization";
58     private static final String X_FROM_APP_ID = "X-FromAppId";
59
60     private static final Logger LOGGER = LoggerFactory.getLogger(SoClient.class);
61
62
63     public ResponseEntity<CreateServiceInstanceResponse> callCreateServiceInstance(MSOPayload msoPayload) {
64
65         if (LOGGER.isDebugEnabled()) {
66             LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
67         }
68
69         String url = soHostname + OnapComponentsUrlPaths.MSO_CREATE_SERVICE_INSTANCE_PATH;
70
71         try {
72             ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.POST,
73                 new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
74
75             logResponsePost(url, response);
76             return response;
77
78         } catch (BackendFunctionalException e) {
79             LOGGER.error("error on calling " + url + " ," + e);
80             return new ResponseEntity(e.getBodyResponse(),e.getHttpStatus());
81         } catch (ResourceAccessException e) {
82             LOGGER.error("error on calling " + url + " ," + e);
83             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
84         }
85     }
86     
87     public ResponseEntity<CreateE2EServiceInstanceResponse> callE2ECreateServiceInstance(MSOE2EPayload msoPayloadE2E) {
88
89         if (LOGGER.isDebugEnabled()) {
90             LOGGER.debug("Calling SO CreateServiceInstanceE2E with msoPayload : " + msoPayloadE2E.toString());
91         }
92
93         String url = soHostname + OnapComponentsUrlPaths.MSO_CREATE_E2ESERVICE_INSTANCE_PATH;
94
95         try {
96             ResponseEntity<CreateE2EServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.POST,
97                     new HttpEntity<>(msoPayloadE2E, buildRequestHeader()), CreateE2EServiceInstanceResponse.class);
98
99             logE2EResponsePost(url, response);
100             return response;
101
102         } catch (BackendFunctionalException e) {
103             LOGGER.error("error on calling " + url + " ," + e);
104             return new ResponseEntity(e.getBodyResponse(),e.getHttpStatus());
105         } catch (ResourceAccessException e) {
106             LOGGER.error("error on calling " + url + " ," + e);
107             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
108         }
109     }
110
111     public ResponseEntity<CreateServiceInstanceResponse> callDeleteServiceInstance(MSOPayload msoPayload, String serviceId) {
112
113         if (LOGGER.isDebugEnabled()) {
114             LOGGER.debug("Calling SO DeleteServiceInstance with msoPayload : " + msoPayload.toString());
115         }
116
117         String url = soHostname + OnapComponentsUrlPaths.MSO_DELETE_REQUEST_STATUS_PATH + serviceId;
118
119         try {
120             ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.DELETE,
121                 new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
122
123             logResponsePost(url, response);
124             return response;
125
126         } catch (BackendFunctionalException e) {
127             LOGGER.error("error on calling " + url + " ," + e);
128             return new ResponseEntity<>(e.getHttpStatus());
129         } catch (ResourceAccessException e) {
130             LOGGER.error("error on calling " + url + " ," + e);
131             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
132         }
133
134     }
135
136     public ResponseEntity<CreateE2EServiceInstanceResponse> callE2EDeleteServiceInstance(String globalSubscriberId, String serviceType,
137             String serviceInstanceId) {
138
139             String url = soHostname + OnapComponentsUrlPaths.MSO_DELETE_E2ESERVICE_INSTANCE_PATH + serviceInstanceId;
140             MSODeleteE2EPayload msoDeleteE2EPayload = new MSODeleteE2EPayload();
141             msoDeleteE2EPayload.setGlobalSubscriberId(globalSubscriberId);
142             msoDeleteE2EPayload.setServiceType(serviceType);
143             
144             if (LOGGER.isDebugEnabled()) {
145                 LOGGER.debug("Calling SO DeleteE2EServiceInstance with url : " + url + " MSODeleteE2EPayload : " + msoDeleteE2EPayload.toString() );
146             }
147             
148             try {
149                 ResponseEntity<DeleteE2EServiceInstanceResponse> deleteresponse = restTemplate.exchange(url, HttpMethod.DELETE,
150                         new HttpEntity<>(msoDeleteE2EPayload, buildRequestHeader()), DeleteE2EServiceInstanceResponse.class);
151
152                 // For E2E Services , Create and Delete Service responses are different, to maintain consistentcy with ServiceInstances
153                 // Copy contents of DeleteE2EServiceInstanceResponse to CreateE2EServiceInstanceResponse
154                 CreateE2EServiceInstanceResponse dummyresponse = new CreateE2EServiceInstanceResponse();
155                 ServiceResponse serviceResponse = new ServiceResponse();
156                 dummyresponse.setService(serviceResponse);
157                 dummyresponse.getService().setOperationId(deleteresponse.getBody().getOperationId());
158                 dummyresponse.getService().setServiceId(serviceInstanceId);
159                 
160                 ResponseEntity<CreateE2EServiceInstanceResponse> response = new ResponseEntity(dummyresponse, deleteresponse.getStatusCode());  
161                 logE2EResponsePost(url, response);
162                 return response;
163
164             } catch (BackendFunctionalException e) {
165                 LOGGER.error("error on calling " + url + " ," + e);
166                 return new ResponseEntity<>(e.getHttpStatus());
167             } catch (ResourceAccessException e) {
168                 LOGGER.error("error on calling " + url + " ," + e);
169                 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
170             }
171         }
172
173     private void logResponsePost(String url, ResponseEntity<CreateServiceInstanceResponse> response) {
174         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
175         if (LOGGER.isDebugEnabled()) {
176             LOGGER.debug("response body : {}", response.getBody().toString());
177         }
178
179         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
180             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
181                 response.getBody().toString());
182         }
183     }
184
185     private void logE2EResponsePost(String url, ResponseEntity<CreateE2EServiceInstanceResponse> response) {
186         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
187         if (LOGGER.isDebugEnabled()) {
188             LOGGER.debug("response body : {}", response.getBody().toString());
189         }
190
191         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
192             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
193                 response.getBody().toString());
194         }
195     }
196
197     public GetRequestStatusResponse callGetRequestStatus(String requestId) {
198         String url = soHostname + OnapComponentsUrlPaths.MSO_GET_REQUEST_STATUS_PATH + requestId;
199
200         try {
201
202             ResponseEntity<GetRequestStatusResponse> response = restTemplate.exchange(url, HttpMethod.GET,
203                 new HttpEntity<>(buildRequestHeader()), GetRequestStatusResponse.class);
204             logResponseGet(url, response);
205             return response.getBody();
206
207         } catch (BackendFunctionalException | ResourceAccessException e) {
208             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
209             return null;
210         }
211     }
212
213 public GetE2ERequestStatusResponse callE2EGetRequestStatus(String operationId, String serviceId) {
214         
215         StringBuilder callURL =
216                 new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_GET_E2EREQUEST_STATUS_PATH);
217         String callUrlFormated = callURL.toString().replace("$serviceId", serviceId);
218         callUrlFormated = callUrlFormated.replace("$operationId", operationId);
219
220         if (LOGGER.isDebugEnabled()) {
221             LOGGER.debug("Calling SO callE2EGetRequestStatus with url : " + callUrlFormated );
222         }
223         
224         try {
225
226             ResponseEntity<GetE2ERequestStatusResponse> response = restTemplate.exchange(callUrlFormated, HttpMethod.GET,
227                 new HttpEntity<>(buildRequestHeader()), GetE2ERequestStatusResponse.class);
228             logE2EResponseGet(callUrlFormated, response);
229             return response.getBody();
230
231         } catch (BackendFunctionalException|ResourceAccessException e) {
232             LOGGER.error(ERROR_ON_CALLING + callUrlFormated + " ," + e);
233             return null;
234         }
235     }
236
237     private void logResponseGet(String url, ResponseEntity<GetRequestStatusResponse> response) {
238         if (response != null) {
239             if (LOGGER.isDebugEnabled()) {
240                 LOGGER.debug("response body : {}", response.getBody().toString());
241             }
242             LOGGER.info("response status : {}", response.getStatusCodeValue());
243             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
244                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
245                     response.getBody().toString());
246             }
247         } else {
248             LOGGER.info("no response calling url {}", url);
249         }
250     }
251     
252     private void logE2EResponseGet(String url, ResponseEntity<GetE2ERequestStatusResponse> response) {
253         if(response!=null){
254                 if (LOGGER.isDebugEnabled()) {
255                 LOGGER.debug("response body : {}", response.getBody().toString());
256             }
257                 LOGGER.info("response status : {}", response.getStatusCodeValue());
258             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
259                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
260                     response.getBody().toString());
261             }
262         } else {
263             LOGGER.info("no response calling url {}",url);
264         }
265     }
266
267     private HttpHeaders buildRequestHeader() {
268         HttpHeaders httpHeaders = new HttpHeaders();
269         httpHeaders.add(HEADER_AUTHORIZATION, soHeaderAuthorization);
270         httpHeaders.add(X_FROM_APP_ID, soApiId);
271         httpHeaders.add("Accept", "application/json");
272         httpHeaders.add("Content-Type", "application/json");
273         return httpHeaders;
274     }
275
276 }