start up failed without msb
[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
70
71     @PostConstruct
72     private void setUpAndLogSOUrl() {
73         createSoUrl = new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_CREATE_SERVICE_INSTANCE_PATH).toString();
74         createE2ESoUrl = new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_CREATE_E2ESERVICE_INSTANCE_PATH).toString();
75         deleteSoUrl= new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_DELETE_REQUEST_STATUS_PATH).toString();
76         deleteE2ESoUrl= new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_DELETE_E2ESERVICE_INSTANCE_PATH).toString();
77         getSoStatus= new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_GET_REQUEST_STATUS_PATH).toString();
78         getE2ESoStatus= new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_GET_E2EREQUEST_STATUS_PATH).toString();
79
80         LOGGER.info("SO create service url :  "+ createSoUrl);
81         LOGGER.info("SO create e2e service url :  "+ createE2ESoUrl);
82         LOGGER.info("SO delete service url :  "+deleteSoUrl);
83         LOGGER.info("SO delete e2e service url :  "+deleteE2ESoUrl);
84         LOGGER.info("SO get so status url :  "+getSoStatus);
85         LOGGER.info("SO get e2e so status url :  "+getE2ESoStatus);
86
87     }
88
89
90     public ResponseEntity<CreateServiceInstanceResponse> callCreateServiceInstance(MSOPayload msoPayload) {
91
92         if (LOGGER.isDebugEnabled()) {
93             LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
94         }
95
96         try {
97             ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(createSoUrl, HttpMethod.POST,
98                 new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
99
100             logResponsePost(createSoUrl, response);
101             return response;
102
103         } catch (BackendFunctionalException e) {
104             LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e);
105             return new ResponseEntity(e.getBodyResponse(),e.getHttpStatus());
106         } catch (ResourceAccessException e) {
107             LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e);
108             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
109         }
110     }
111     
112     public ResponseEntity<CreateE2EServiceInstanceResponse> callE2ECreateServiceInstance(MSOE2EPayload msoPayloadE2E) {
113
114         if (LOGGER.isDebugEnabled()) {
115             LOGGER.debug("Calling SO CreateServiceInstanceE2E with msoPayload : " + msoPayloadE2E.toString());
116         }
117
118         try {
119             ResponseEntity<CreateE2EServiceInstanceResponse> response = restTemplate.exchange(createE2ESoUrl, HttpMethod.POST,
120                     new HttpEntity<>(msoPayloadE2E, buildRequestHeader()), CreateE2EServiceInstanceResponse.class);
121
122             logE2EResponsePost(createE2ESoUrl, response);
123             return response;
124
125         } catch (BackendFunctionalException e) {
126             LOGGER.error(ERROR_ON_CALLING + createE2ESoUrl + " ," + e);
127             return new ResponseEntity(e.getBodyResponse(),e.getHttpStatus());
128         } catch (ResourceAccessException e) {
129             LOGGER.error(ERROR_ON_CALLING + createE2ESoUrl + " ," + e);
130             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
131         }
132     }
133
134     public ResponseEntity<CreateServiceInstanceResponse> callDeleteServiceInstance(MSOPayload msoPayload, String serviceId) {
135
136         if (LOGGER.isDebugEnabled()) {
137             LOGGER.debug("Calling SO DeleteServiceInstance with msoPayload : " + msoPayload.toString());
138         }
139
140         String url = deleteSoUrl + serviceId;
141
142         try {
143             ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.DELETE,
144                 new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
145
146             logResponsePost(url, response);
147             return response;
148
149         } catch (BackendFunctionalException e) {
150             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
151             return new ResponseEntity<>(e.getHttpStatus());
152         } catch (ResourceAccessException e) {
153             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
154             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
155         }
156
157     }
158
159     public ResponseEntity<CreateE2EServiceInstanceResponse> callE2EDeleteServiceInstance(String globalSubscriberId, String serviceType,
160             String serviceInstanceId) {
161
162             String url = deleteE2ESoUrl + serviceInstanceId;
163             MSODeleteE2EPayload msoDeleteE2EPayload = new MSODeleteE2EPayload();
164             msoDeleteE2EPayload.setGlobalSubscriberId(globalSubscriberId);
165             msoDeleteE2EPayload.setServiceType(serviceType);
166             
167             if (LOGGER.isDebugEnabled()) {
168                 LOGGER.debug("Calling SO DeleteE2EServiceInstance with url : " + url + " MSODeleteE2EPayload : " + msoDeleteE2EPayload.toString() );
169             }
170             
171             try {
172                 ResponseEntity<DeleteE2EServiceInstanceResponse> deleteresponse = restTemplate.exchange(url, HttpMethod.DELETE,
173                         new HttpEntity<>(msoDeleteE2EPayload, buildRequestHeader()), DeleteE2EServiceInstanceResponse.class);
174
175                 // For E2E Services , Create and Delete Service responses are different, to maintain consistentcy with ServiceInstances
176                 // Copy contents of DeleteE2EServiceInstanceResponse to CreateE2EServiceInstanceResponse
177                 CreateE2EServiceInstanceResponse dummyresponse = new CreateE2EServiceInstanceResponse();
178                 ServiceResponse serviceResponse = new ServiceResponse();
179                 dummyresponse.setService(serviceResponse);
180                 dummyresponse.getService().setOperationId(deleteresponse.getBody().getOperationId());
181                 dummyresponse.getService().setServiceId(serviceInstanceId);
182                 
183                 ResponseEntity<CreateE2EServiceInstanceResponse> response = new ResponseEntity(dummyresponse, deleteresponse.getStatusCode());  
184                 logE2EResponsePost(url, response);
185                 return response;
186
187             } catch (BackendFunctionalException e) {
188                 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
189                 return new ResponseEntity<>(e.getHttpStatus());
190             } catch (ResourceAccessException e) {
191                 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
192                 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
193             }
194         }
195
196     private void logResponsePost(String url, ResponseEntity<CreateServiceInstanceResponse> response) {
197         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
198         if (LOGGER.isDebugEnabled()) {
199             LOGGER.debug("response body : {}", response.getBody().toString());
200         }
201
202         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
203             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
204                 response.getBody().toString());
205         }
206     }
207
208     private void logE2EResponsePost(String url, ResponseEntity<CreateE2EServiceInstanceResponse> response) {
209         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
210         if (LOGGER.isDebugEnabled()) {
211             LOGGER.debug("response body : {}", response.getBody().toString());
212         }
213
214         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
215             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
216                 response.getBody().toString());
217         }
218     }
219
220     public GetRequestStatusResponse callGetRequestStatus(String requestId) {
221         String url = getSoStatus + requestId;
222
223         try {
224
225             ResponseEntity<GetRequestStatusResponse> response = restTemplate.exchange(url, HttpMethod.GET,
226                 new HttpEntity<>(buildRequestHeader()), GetRequestStatusResponse.class);
227             logResponseGet(url, response);
228             if (null == response)
229                 return null;
230             else
231                 return response.getBody();
232
233         } catch (BackendFunctionalException | ResourceAccessException e) {
234             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
235             return null;
236         }
237     }
238
239 public GetE2ERequestStatusResponse callE2EGetRequestStatus(String operationId, String serviceId) {
240         
241         String callUrlFormated = getE2ESoStatus.replace("$serviceId", serviceId);
242         callUrlFormated = callUrlFormated.replace("$operationId", operationId);
243
244         if (LOGGER.isDebugEnabled()) {
245             LOGGER.debug("Calling SO callE2EGetRequestStatus with url : " + callUrlFormated );
246         }
247         
248         try {
249
250             ResponseEntity<GetE2ERequestStatusResponse> response = restTemplate.exchange(callUrlFormated, HttpMethod.GET,
251                 new HttpEntity<>(buildRequestHeader()), GetE2ERequestStatusResponse.class);
252             logE2EResponseGet(callUrlFormated, response);
253             if (null == response)
254                 return null;
255             else
256                 return response.getBody();
257
258         } catch (BackendFunctionalException|ResourceAccessException e) {
259             LOGGER.error(ERROR_ON_CALLING + callUrlFormated + " ," + e);
260             return null;
261         }
262     }
263
264     private void logResponseGet(String url, ResponseEntity<GetRequestStatusResponse> response) {
265         if (response != null) {
266             if (LOGGER.isDebugEnabled()) {
267                 LOGGER.debug("response body : {}", response.getBody().toString());
268             }
269             LOGGER.info("response status : {}", response.getStatusCodeValue());
270             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
271                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
272                     response.getBody().toString());
273             }
274         } else {
275             LOGGER.info("no response calling url {}", url);
276         }
277     }
278     
279     private void logE2EResponseGet(String url, ResponseEntity<GetE2ERequestStatusResponse> response) {
280         if(response!=null){
281                 if (LOGGER.isDebugEnabled()) {
282                 LOGGER.debug("response body : {}", response.getBody().toString());
283             }
284                 LOGGER.info("response status : {}", response.getStatusCodeValue());
285             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
286                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
287                     response.getBody().toString());
288             }
289         } else {
290             LOGGER.info("no response calling url {}",url);
291         }
292     }
293
294     private HttpHeaders buildRequestHeader() {
295         HttpHeaders httpHeaders = new HttpHeaders();
296         httpHeaders.add(HEADER_AUTHORIZATION, soHeaderAuthorization);
297         httpHeaders.add(X_FROM_APP_ID, soApiId);
298         httpHeaders.add("Accept", "application/json");
299         httpHeaders.add("Content-Type", "application/json");
300         return httpHeaders;
301     }
302
303 }