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 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;
40 public class SoClient {
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 ";
46 private RestTemplate restTemplate;
49 private String soHostname;
51 @Value("${so.api.id}")
52 private String soApiId;
54 @Value("${so.header.authorization}")
55 private String soHeaderAuthorization;
57 private static final String HEADER_AUTHORIZATION = "Authorization";
58 private static final String X_FROM_APP_ID = "X-FromAppId";
60 private static final Logger LOGGER = LoggerFactory.getLogger(SoClient.class);
63 public ResponseEntity<CreateServiceInstanceResponse> callCreateServiceInstance(MSOPayload msoPayload) {
65 if (LOGGER.isDebugEnabled()) {
66 LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
69 String url = soHostname + OnapComponentsUrlPaths.MSO_CREATE_SERVICE_INSTANCE_PATH;
72 ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.POST,
73 new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
75 logResponsePost(url, response);
78 } catch (BackendFunctionalException e) {
79 LOGGER.error("error on calling " + url + " ," + e);
80 return new ResponseEntity<>(e.getHttpStatus());
81 } catch (ResourceAccessException e) {
82 LOGGER.error("error on calling " + url + " ," + e);
83 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
87 public ResponseEntity<CreateE2EServiceInstanceResponse> callE2ECreateServiceInstance(MSOE2EPayload msoPayloadE2E) {
89 if (LOGGER.isDebugEnabled()) {
90 LOGGER.debug("Calling SO CreateServiceInstanceE2E with msoPayload : " + msoPayloadE2E.toString());
93 String url = soHostname + OnapComponentsUrlPaths.MSO_CREATE_E2ESERVICE_INSTANCE_PATH;
96 ResponseEntity<CreateE2EServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.POST,
97 new HttpEntity<>(msoPayloadE2E, buildRequestHeader()), CreateE2EServiceInstanceResponse.class);
99 logE2EResponsePost(url, response);
102 } catch (BackendFunctionalException e) {
103 LOGGER.error("error on calling " + url + " ," + e);
104 return new ResponseEntity<>(e.getHttpStatus());
105 } catch (ResourceAccessException e) {
106 LOGGER.error("error on calling " + url + " ," + e);
107 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
111 public ResponseEntity<CreateServiceInstanceResponse> callDeleteServiceInstance(MSOPayload msoPayload, String serviceId) {
113 if (LOGGER.isDebugEnabled()) {
114 LOGGER.debug("Calling SO DeleteServiceInstance with msoPayload : " + msoPayload.toString());
117 String url = soHostname + OnapComponentsUrlPaths.MSO_DELETE_REQUEST_STATUS_PATH + serviceId;
120 ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.DELETE,
121 new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
123 logResponsePost(url, response);
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);
136 public ResponseEntity<CreateE2EServiceInstanceResponse> callE2EDeleteServiceInstance(String globalSubscriberId, String serviceType,
137 String serviceInstanceId) {
139 String url = soHostname + OnapComponentsUrlPaths.MSO_DELETE_E2ESERVICE_INSTANCE_PATH + serviceInstanceId;
140 MSODeleteE2EPayload msoDeleteE2EPayload = new MSODeleteE2EPayload();
141 msoDeleteE2EPayload.setGlobalSubscriberId(globalSubscriberId);
142 msoDeleteE2EPayload.setServiceType(serviceType);
144 if (LOGGER.isDebugEnabled()) {
145 LOGGER.debug("Calling SO DeleteE2EServiceInstance with url : " + url + " MSODeleteE2EPayload : " + msoDeleteE2EPayload.toString() );
149 ResponseEntity<DeleteE2EServiceInstanceResponse> deleteresponse = restTemplate.exchange(url, HttpMethod.DELETE,
150 new HttpEntity<>(msoDeleteE2EPayload, buildRequestHeader()), DeleteE2EServiceInstanceResponse.class);
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);
160 ResponseEntity<CreateE2EServiceInstanceResponse> response = new ResponseEntity(dummyresponse, deleteresponse.getStatusCode());
161 logE2EResponsePost(url, response);
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);
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());
179 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
180 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
181 response.getBody().toString());
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());
191 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
192 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
193 response.getBody().toString());
197 public GetRequestStatusResponse callGetRequestStatus(String requestId) {
198 String url = soHostname + OnapComponentsUrlPaths.MSO_GET_REQUEST_STATUS_PATH + requestId;
202 ResponseEntity<GetRequestStatusResponse> response = restTemplate.exchange(url, HttpMethod.GET,
203 new HttpEntity<>(buildRequestHeader()), GetRequestStatusResponse.class);
204 logResponseGet(url, response);
205 return response.getBody();
207 } catch (BackendFunctionalException | ResourceAccessException e) {
208 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
213 public GetE2ERequestStatusResponse callE2EGetRequestStatus(String operationId, String serviceId) {
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);
220 if (LOGGER.isDebugEnabled()) {
221 LOGGER.debug("Calling SO callE2EGetRequestStatus with url : " + callUrlFormated );
226 ResponseEntity<GetE2ERequestStatusResponse> response = restTemplate.exchange(callUrlFormated, HttpMethod.GET,
227 new HttpEntity<>(buildRequestHeader()), GetE2ERequestStatusResponse.class);
228 logE2EResponseGet(callUrlFormated, response);
229 return response.getBody();
231 } catch (BackendFunctionalException|ResourceAccessException e) {
232 LOGGER.error(ERROR_ON_CALLING + callUrlFormated + " ," + e);
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());
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());
248 LOGGER.info("no response calling url {}", url);
252 private void logE2EResponseGet(String url, ResponseEntity<GetE2ERequestStatusResponse> response) {
254 if (LOGGER.isDebugEnabled()) {
255 LOGGER.debug("response body : {}", response.getBody().toString());
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());
263 LOGGER.info("no response calling url {}",url);
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");