2 * Copyright (c) 2018 Orange
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
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 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.
13 package org.onap.nbi.apis.serviceorder;
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;
41 public class SoClient {
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 ";
47 private RestTemplate restTemplate;
50 private String soHostname;
52 @Value("${so.api.id}")
53 private String soApiId;
55 @Value("${so.header.authorization}")
56 private String soHeaderAuthorization;
58 private static final String HEADER_AUTHORIZATION = "Authorization";
59 private static final String X_FROM_APP_ID = "X-FromAppId";
61 private static final Logger LOGGER = LoggerFactory.getLogger(SoClient.class);
63 private String createSoUrl;
64 private String createE2ESoUrl;
65 private String getSoStatus;
66 private String getE2ESoStatus;
67 private String deleteE2ESoUrl;
68 private String deleteSoUrl;
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();
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);
90 public ResponseEntity<CreateServiceInstanceResponse> callCreateServiceInstance(MSOPayload msoPayload) {
92 if (LOGGER.isDebugEnabled()) {
93 LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
97 ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(createSoUrl, HttpMethod.POST,
98 new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
100 logResponsePost(createSoUrl, response);
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);
112 public ResponseEntity<CreateE2EServiceInstanceResponse> callE2ECreateServiceInstance(MSOE2EPayload msoPayloadE2E) {
114 if (LOGGER.isDebugEnabled()) {
115 LOGGER.debug("Calling SO CreateServiceInstanceE2E with msoPayload : " + msoPayloadE2E.toString());
119 ResponseEntity<CreateE2EServiceInstanceResponse> response = restTemplate.exchange(createE2ESoUrl, HttpMethod.POST,
120 new HttpEntity<>(msoPayloadE2E, buildRequestHeader()), CreateE2EServiceInstanceResponse.class);
122 logE2EResponsePost(createE2ESoUrl, response);
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);
134 public ResponseEntity<CreateServiceInstanceResponse> callDeleteServiceInstance(MSOPayload msoPayload, String serviceId) {
136 if (LOGGER.isDebugEnabled()) {
137 LOGGER.debug("Calling SO DeleteServiceInstance with msoPayload : " + msoPayload.toString());
140 String url = deleteSoUrl + serviceId;
143 ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.DELETE,
144 new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
146 logResponsePost(url, response);
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);
159 public ResponseEntity<CreateE2EServiceInstanceResponse> callE2EDeleteServiceInstance(String globalSubscriberId, String serviceType,
160 String serviceInstanceId) {
162 String url = deleteE2ESoUrl + serviceInstanceId;
163 MSODeleteE2EPayload msoDeleteE2EPayload = new MSODeleteE2EPayload();
164 msoDeleteE2EPayload.setGlobalSubscriberId(globalSubscriberId);
165 msoDeleteE2EPayload.setServiceType(serviceType);
167 if (LOGGER.isDebugEnabled()) {
168 LOGGER.debug("Calling SO DeleteE2EServiceInstance with url : " + url + " MSODeleteE2EPayload : " + msoDeleteE2EPayload.toString() );
172 ResponseEntity<DeleteE2EServiceInstanceResponse> deleteresponse = restTemplate.exchange(url, HttpMethod.DELETE,
173 new HttpEntity<>(msoDeleteE2EPayload, buildRequestHeader()), DeleteE2EServiceInstanceResponse.class);
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);
183 ResponseEntity<CreateE2EServiceInstanceResponse> response = new ResponseEntity(dummyresponse, deleteresponse.getStatusCode());
184 logE2EResponsePost(url, response);
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);
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());
202 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
203 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
204 response.getBody().toString());
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());
214 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
215 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
216 response.getBody().toString());
220 public GetRequestStatusResponse callGetRequestStatus(String requestId) {
221 String url = getSoStatus + requestId;
225 ResponseEntity<GetRequestStatusResponse> response = restTemplate.exchange(url, HttpMethod.GET,
226 new HttpEntity<>(buildRequestHeader()), GetRequestStatusResponse.class);
227 logResponseGet(url, response);
228 if (null == response)
231 return response.getBody();
233 } catch (BackendFunctionalException | ResourceAccessException e) {
234 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
239 public GetE2ERequestStatusResponse callE2EGetRequestStatus(String operationId, String serviceId) {
241 String callUrlFormated = getE2ESoStatus.replace("$serviceId", serviceId);
242 callUrlFormated = callUrlFormated.replace("$operationId", operationId);
244 if (LOGGER.isDebugEnabled()) {
245 LOGGER.debug("Calling SO callE2EGetRequestStatus with url : " + callUrlFormated );
250 ResponseEntity<GetE2ERequestStatusResponse> response = restTemplate.exchange(callUrlFormated, HttpMethod.GET,
251 new HttpEntity<>(buildRequestHeader()), GetE2ERequestStatusResponse.class);
252 logE2EResponseGet(callUrlFormated, response);
253 if (null == response)
256 return response.getBody();
258 } catch (BackendFunctionalException|ResourceAccessException e) {
259 LOGGER.error(ERROR_ON_CALLING + callUrlFormated + " ," + e);
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());
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());
275 LOGGER.info("no response calling url {}", url);
279 private void logE2EResponseGet(String url, ResponseEntity<GetE2ERequestStatusResponse> response) {
281 if (LOGGER.isDebugEnabled()) {
282 LOGGER.debug("response body : {}", response.getBody().toString());
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());
290 LOGGER.info("no response calling url {}",url);
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");