2 * Copyright (c) 2018 Orange
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
7 * http://www.apache.org/licenses/LICENSE-2.0
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
14 package org.onap.nbi.apis.serviceorder;
16 import javax.annotation.PostConstruct;
17 import org.onap.nbi.OnapComponentsUrlPaths;
18 import org.onap.nbi.apis.serviceorder.model.consumer.CreateE2EServiceInstanceResponse;
19 import org.onap.nbi.apis.serviceorder.model.consumer.CreateServiceInstanceResponse;
20 import org.onap.nbi.apis.serviceorder.model.consumer.DeleteE2EServiceInstanceResponse;
21 import org.onap.nbi.apis.serviceorder.model.consumer.GetE2ERequestStatusResponse;
22 import org.onap.nbi.apis.serviceorder.model.consumer.GetRequestStatusResponse;
23 import org.onap.nbi.apis.serviceorder.model.consumer.MSODeleteE2EPayload;
24 import org.onap.nbi.apis.serviceorder.model.consumer.MSOE2EPayload;
25 import org.onap.nbi.apis.serviceorder.model.consumer.MSOPayload;
26 import org.onap.nbi.apis.serviceorder.model.consumer.ServiceResponse;
27 import org.onap.nbi.exceptions.BackendFunctionalException;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30 import org.springframework.beans.factory.annotation.Autowired;
31 import org.springframework.beans.factory.annotation.Value;
32 import org.springframework.http.HttpEntity;
33 import org.springframework.http.HttpHeaders;
34 import org.springframework.http.HttpMethod;
35 import org.springframework.http.HttpStatus;
36 import org.springframework.http.ResponseEntity;
37 import org.springframework.stereotype.Service;
38 import org.springframework.web.client.ResourceAccessException;
39 import org.springframework.web.client.RestTemplate;
42 public class SoClient {
44 public static final String RESPONSE_STATUS = "response status : ";
45 public static final String RETURNS = " returns ";
46 public static final String ERROR_ON_CALLING = "error on calling ";
48 private RestTemplate restTemplate;
51 private String soHostname;
53 @Value("${so.api.id}")
54 private String soApiId;
56 @Value("${so.header.authorization}")
57 private String soHeaderAuthorization;
59 private static final String HEADER_AUTHORIZATION = "Authorization";
60 private static final String X_FROM_APP_ID = "X-FromAppId";
62 private static final Logger LOGGER = LoggerFactory.getLogger(SoClient.class);
64 private String createSoUrl;
65 private String createE2ESoUrl;
66 private String getSoStatus;
67 private String getE2ESoStatus;
68 private String deleteE2ESoUrl;
69 private String deleteSoUrl;
70 private String SoHealthCheck;
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)
84 .append(OnapComponentsUrlPaths.MSO_GET_REQUEST_STATUS_PATH).toString();
85 getE2ESoStatus = new StringBuilder().append(soHostname)
86 .append(OnapComponentsUrlPaths.MSO_GET_E2EREQUEST_STATUS_PATH).toString();
87 SoHealthCheck = new StringBuilder().append(soHostname)
88 .append(OnapComponentsUrlPaths.MSO_HEALTH_CHECK).toString();
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);
101 public ResponseEntity<CreateServiceInstanceResponse> callCreateServiceInstance(
102 MSOPayload msoPayload) {
104 if (LOGGER.isDebugEnabled()) {
105 LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
109 ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(createSoUrl,
110 HttpMethod.POST, new HttpEntity<>(msoPayload, buildRequestHeader()),
111 CreateServiceInstanceResponse.class);
113 logResponsePost(createSoUrl, response);
116 } catch (BackendFunctionalException e) {
118 ERROR_ON_CALLING + createSoUrl + " ," + e.getHttpStatus() + " , " + e.getBodyResponse());
119 return new ResponseEntity(e.getBodyResponse(), e.getHttpStatus());
120 } catch (ResourceAccessException e) {
121 LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e.getMessage());
122 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
126 public ResponseEntity<CreateE2EServiceInstanceResponse> callE2ECreateServiceInstance(
127 MSOE2EPayload msoPayloadE2E) {
129 if (LOGGER.isDebugEnabled()) {
131 "Calling SO CreateServiceInstanceE2E with msoPayload : " + msoPayloadE2E.toString());
135 ResponseEntity<CreateE2EServiceInstanceResponse> response = restTemplate.exchange(
136 createE2ESoUrl, HttpMethod.POST, new HttpEntity<>(msoPayloadE2E, buildRequestHeader()),
137 CreateE2EServiceInstanceResponse.class);
139 logE2EResponsePost(createE2ESoUrl, response);
142 } catch (BackendFunctionalException e) {
144 ERROR_ON_CALLING + createSoUrl + " ," + e.getHttpStatus() + " , " + e.getBodyResponse());
145 return new ResponseEntity(e.getBodyResponse(), e.getHttpStatus());
146 } catch (ResourceAccessException e) {
147 LOGGER.error(ERROR_ON_CALLING + createE2ESoUrl + " ," + e.getMessage());
148 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
152 public ResponseEntity<CreateServiceInstanceResponse> callDeleteServiceInstance(
153 MSOPayload msoPayload, String serviceId) {
155 if (LOGGER.isDebugEnabled()) {
156 LOGGER.debug("Calling SO DeleteServiceInstance with msoPayload : " + msoPayload.toString());
159 String url = deleteSoUrl + serviceId;
162 ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url,
163 HttpMethod.DELETE, new HttpEntity<>(msoPayload, buildRequestHeader()),
164 CreateServiceInstanceResponse.class);
166 logResponsePost(url, response);
169 } catch (BackendFunctionalException e) {
170 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
171 return new ResponseEntity<>(e.getHttpStatus());
172 } catch (ResourceAccessException e) {
173 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
174 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
179 public ResponseEntity<CreateE2EServiceInstanceResponse> callE2EDeleteServiceInstance(
180 String globalSubscriberId, String serviceType, String serviceInstanceId) {
182 String url = deleteE2ESoUrl + serviceInstanceId;
183 MSODeleteE2EPayload msoDeleteE2EPayload = new MSODeleteE2EPayload();
184 msoDeleteE2EPayload.setGlobalSubscriberId(globalSubscriberId);
185 msoDeleteE2EPayload.setServiceType(serviceType);
187 if (LOGGER.isDebugEnabled()) {
188 LOGGER.debug("Calling SO DeleteE2EServiceInstance with url : " + url
189 + " MSODeleteE2EPayload : " + msoDeleteE2EPayload.toString());
193 ResponseEntity<DeleteE2EServiceInstanceResponse> deleteresponse = restTemplate.exchange(url,
194 HttpMethod.DELETE, new HttpEntity<>(msoDeleteE2EPayload, buildRequestHeader()),
195 DeleteE2EServiceInstanceResponse.class);
197 // For E2E Services , Create and Delete Service responses are different, to maintain
198 // consistentcy with ServiceInstances
199 // Copy contents of DeleteE2EServiceInstanceResponse to CreateE2EServiceInstanceResponse
200 CreateE2EServiceInstanceResponse dummyresponse = new CreateE2EServiceInstanceResponse();
201 ServiceResponse serviceResponse = new ServiceResponse();
202 dummyresponse.setService(serviceResponse);
203 dummyresponse.getService().setOperationId(deleteresponse.getBody().getOperationId());
204 dummyresponse.getService().setServiceId(serviceInstanceId);
206 ResponseEntity<CreateE2EServiceInstanceResponse> response =
207 new ResponseEntity(dummyresponse, deleteresponse.getStatusCode());
208 logE2EResponsePost(url, response);
211 } catch (BackendFunctionalException e) {
212 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
213 return new ResponseEntity<>(e.getHttpStatus());
214 } catch (ResourceAccessException e) {
215 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
216 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
220 private void logResponsePost(String url, ResponseEntity<CreateServiceInstanceResponse> response) {
221 LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
222 if (LOGGER.isDebugEnabled()) {
223 LOGGER.debug("response body : {}", response.getBody().toString());
226 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
227 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
228 response.getBody().toString());
232 private void logE2EResponsePost(String url,
233 ResponseEntity<CreateE2EServiceInstanceResponse> response) {
234 LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
235 if (LOGGER.isDebugEnabled()) {
236 LOGGER.debug("response body : {}", response.getBody().toString());
239 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
240 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
241 response.getBody().toString());
245 public GetRequestStatusResponse callGetRequestStatus(String requestId) {
246 String url = getSoStatus + requestId;
250 ResponseEntity<GetRequestStatusResponse> response = restTemplate.exchange(url, HttpMethod.GET,
251 new HttpEntity<>(buildRequestHeader()), GetRequestStatusResponse.class);
252 logResponseGet(url, response);
253 if (null == response) {
256 return response.getBody();
259 } catch (BackendFunctionalException | ResourceAccessException e) {
260 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
266 public void callCheckConnectivity() {
267 String url = SoHealthCheck;
268 restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(buildRequestHeader()),
273 public GetE2ERequestStatusResponse callE2EGetRequestStatus(String operationId, String serviceId) {
275 String callUrlFormated = getE2ESoStatus.replace("$serviceId", serviceId);
276 callUrlFormated = callUrlFormated.replace("$operationId", operationId);
278 if (LOGGER.isDebugEnabled()) {
279 LOGGER.debug("Calling SO callE2EGetRequestStatus with url : " + callUrlFormated);
284 ResponseEntity<GetE2ERequestStatusResponse> response =
285 restTemplate.exchange(callUrlFormated, HttpMethod.GET,
286 new HttpEntity<>(buildRequestHeader()), GetE2ERequestStatusResponse.class);
287 logE2EResponseGet(callUrlFormated, response);
288 if (null == response) {
291 return response.getBody();
294 } catch (BackendFunctionalException | ResourceAccessException e) {
295 LOGGER.error(ERROR_ON_CALLING + callUrlFormated + " ," + e);
300 private void logResponseGet(String url, ResponseEntity<GetRequestStatusResponse> response) {
301 if (response != null) {
302 if (LOGGER.isDebugEnabled()) {
303 LOGGER.debug("response status : {} , response body : {}", response.getStatusCodeValue(),
304 response.getBody().toString());
306 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
307 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
308 response.getBody().toString());
311 if (LOGGER.isWarnEnabled()) {
312 LOGGER.warn("no response calling url {}", url);
317 private void logE2EResponseGet(String url, ResponseEntity<GetE2ERequestStatusResponse> response) {
318 if (response != null) {
319 if (LOGGER.isDebugEnabled()) {
320 LOGGER.debug("response status : {} , response body : {}", response.getStatusCodeValue(),
321 response.getBody().toString());
323 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
324 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
325 response.getBody().toString());
328 if (LOGGER.isWarnEnabled()) {
329 LOGGER.warn("no response calling url {}", url);
334 private HttpHeaders buildRequestHeader() {
335 HttpHeaders httpHeaders = new HttpHeaders();
336 httpHeaders.add(HEADER_AUTHORIZATION, soHeaderAuthorization);
337 httpHeaders.add(X_FROM_APP_ID, soApiId);
338 httpHeaders.add("Accept", "application/json");
339 httpHeaders.add("Content-Type", "application/json");