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
15 package org.onap.nbi.apis.serviceorder;
17 import javax.annotation.PostConstruct;
18 import org.onap.nbi.OnapComponentsUrlPaths;
19 import org.onap.nbi.apis.serviceorder.model.consumer.CreateE2EServiceInstanceResponse;
20 import org.onap.nbi.apis.serviceorder.model.consumer.CreateMacroServiceInstanceResponse;
21 import org.onap.nbi.apis.serviceorder.model.consumer.CreateServiceInstanceResponse;
22 import org.onap.nbi.apis.serviceorder.model.consumer.DeleteE2EServiceInstanceResponse;
23 import org.onap.nbi.apis.serviceorder.model.consumer.GetE2ERequestStatusResponse;
24 import org.onap.nbi.apis.serviceorder.model.consumer.GetRequestStatusResponse;
25 import org.onap.nbi.apis.serviceorder.model.consumer.MSODeleteE2EPayload;
26 import org.onap.nbi.apis.serviceorder.model.consumer.MSOE2EPayload;
27 import org.onap.nbi.apis.serviceorder.model.consumer.MSOE2EServiceActivationPayload;
28 import org.onap.nbi.apis.serviceorder.model.consumer.MSOE2EServiceActivationReponse;
29 import org.onap.nbi.apis.serviceorder.model.consumer.MSOPayload;
30 import org.onap.nbi.apis.serviceorder.model.consumer.ServiceResponse;
31 import org.onap.nbi.exceptions.BackendFunctionalException;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34 import org.springframework.beans.factory.annotation.Autowired;
35 import org.springframework.beans.factory.annotation.Value;
36 import org.springframework.http.HttpEntity;
37 import org.springframework.http.HttpHeaders;
38 import org.springframework.http.HttpMethod;
39 import org.springframework.http.HttpStatus;
40 import org.springframework.http.ResponseEntity;
41 import org.springframework.stereotype.Service;
42 import org.springframework.web.client.ResourceAccessException;
43 import org.springframework.web.client.RestTemplate;
46 public class SoClient {
48 public static final String RESPONSE_STATUS = "response status : ";
49 public static final String RETURNS = " returns ";
50 public static final String ERROR_ON_CALLING = "error on calling ";
52 private RestTemplate restTemplate;
55 private String soHostname;
57 @Value("${so.onap.partner.name}")
58 private String soOnapPartnerName;
60 @Value("${so.header.authorization}")
61 private String soHeaderAuthorization;
63 private static final String HEADER_AUTHORIZATION = "Authorization";
64 private static final String X_ONAP_PARTNER_HEADER = "X-ONAP-PartnerName";
66 private static final Logger LOGGER = LoggerFactory.getLogger(SoClient.class);
68 private String createSoUrl;
69 private String createE2ESoUrl;
70 private String getSoStatus;
71 private String getE2ESoStatus;
72 private String deleteE2ESoUrl;
73 private String activationE2ESoUrl;
74 private String deleteSoUrl;
75 private String SoHealthCheck;
78 private void setUpAndLogSOUrl() {
79 createSoUrl = new StringBuilder().append(soHostname)
80 .append(OnapComponentsUrlPaths.MSO_CREATE_SERVICE_INSTANCE_PATH).toString();
81 createE2ESoUrl = new StringBuilder().append(soHostname)
82 .append(OnapComponentsUrlPaths.MSO_CREATE_E2ESERVICE_INSTANCE_PATH).toString();
83 deleteSoUrl = new StringBuilder().append(soHostname)
84 .append(OnapComponentsUrlPaths.MSO_DELETE_REQUEST_STATUS_PATH).toString();
85 deleteE2ESoUrl = new StringBuilder().append(soHostname)
86 .append(OnapComponentsUrlPaths.MSO_DELETE_E2ESERVICE_INSTANCE_PATH).toString();
87 activationE2ESoUrl = new StringBuilder().append(soHostname)
88 .append(OnapComponentsUrlPaths.MSO_ACTIVATION_E2ESERVICE_INSTANCE_PATH).toString();
89 getSoStatus = new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_GET_REQUEST_STATUS_PATH)
91 getE2ESoStatus = new StringBuilder().append(soHostname)
92 .append(OnapComponentsUrlPaths.MSO_GET_E2EREQUEST_STATUS_PATH).toString();
94 new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_HEALTH_CHECK).toString();
96 LOGGER.info("SO create service url : " + createSoUrl);
97 LOGGER.info("SO create e2e service url : " + createE2ESoUrl);
98 LOGGER.info("SO delete service url : " + deleteSoUrl);
99 LOGGER.info("SO delete e2e service url : " + deleteE2ESoUrl);
100 LOGGER.info("SO e2e service actiavtion url : " + activationE2ESoUrl);
101 LOGGER.info("SO get so status url : " + getSoStatus);
102 LOGGER.info("SO get e2e so status url : " + getE2ESoStatus);
103 LOGGER.info("SO healthCheck : " + SoHealthCheck);
107 public ResponseEntity<CreateServiceInstanceResponse> callCreateServiceInstance(MSOPayload msoPayload) {
109 if (LOGGER.isDebugEnabled()) {
110 LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
114 ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(createSoUrl, HttpMethod.POST,
115 new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
117 logResponsePost(createSoUrl, response);
120 } catch (BackendFunctionalException e) {
121 LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e.getHttpStatus() + " , " + e.getBodyResponse());
122 return new ResponseEntity(e.getBodyResponse(), e.getHttpStatus());
123 } catch (ResourceAccessException e) {
124 LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e.getMessage());
125 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
129 public ResponseEntity<CreateMacroServiceInstanceResponse> callMacroCreateServiceInstance(MSOPayload msoPayload) {
131 if (LOGGER.isDebugEnabled()) {
132 LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
136 ResponseEntity<CreateMacroServiceInstanceResponse> response = restTemplate.exchange(createSoUrl,
137 HttpMethod.POST, new HttpEntity<>(msoPayload, buildRequestHeader()),CreateMacroServiceInstanceResponse.class);
139 logMacroResponsePost(createSoUrl, response);
141 } catch (BackendFunctionalException e) {
142 LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e.getHttpStatus() + " , " + e.getBodyResponse());
143 return new ResponseEntity(e.getBodyResponse(), e.getHttpStatus());
144 } catch (ResourceAccessException e) {
145 LOGGER.error(ERROR_ON_CALLING + createSoUrl + " ," + e.getMessage());
146 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
150 public ResponseEntity<CreateE2EServiceInstanceResponse> callE2ECreateServiceInstance(MSOE2EPayload msoPayloadE2E) {
152 if (LOGGER.isDebugEnabled()) {
153 LOGGER.debug("Calling SO CreateServiceInstanceE2E with msoPayload : " + msoPayloadE2E.toString());
157 ResponseEntity<CreateE2EServiceInstanceResponse> response = restTemplate.exchange(createE2ESoUrl,
158 HttpMethod.POST, new HttpEntity<>(msoPayloadE2E, buildRequestHeader()),
159 CreateE2EServiceInstanceResponse.class);
161 logE2EResponsePost(createE2ESoUrl, response);
164 } catch (BackendFunctionalException e) {
165 LOGGER.error(ERROR_ON_CALLING + createE2ESoUrl + " ," + e.getHttpStatus() + " , " + e.getBodyResponse());
166 return new ResponseEntity(e.getBodyResponse(), e.getHttpStatus());
167 } catch (ResourceAccessException e) {
168 LOGGER.error(ERROR_ON_CALLING + createE2ESoUrl + " ," + e.getMessage());
169 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
173 public ResponseEntity<CreateServiceInstanceResponse> callDeleteServiceInstance(MSOPayload msoPayload,
176 if (LOGGER.isDebugEnabled()) {
177 LOGGER.debug("Calling SO DeleteServiceInstance with msoPayload : " + msoPayload.toString());
180 String url = deleteSoUrl + serviceId;
183 ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.DELETE,
184 new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
186 logResponsePost(url, response);
189 } catch (BackendFunctionalException e) {
190 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
191 return new ResponseEntity<>(e.getHttpStatus());
192 } catch (ResourceAccessException e) {
193 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
194 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
200 public ResponseEntity<CreateMacroServiceInstanceResponse> callMacroDeleteServiceInstance(MSOPayload msoPayload,
203 if (LOGGER.isDebugEnabled()) {
204 LOGGER.debug("Calling SO Macro DeleteServiceInstance with msoPayload : " + msoPayload.toString());
207 String url = deleteSoUrl + serviceId;
210 ResponseEntity<CreateMacroServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.DELETE,
211 new HttpEntity<>(msoPayload, buildRequestHeader()), CreateMacroServiceInstanceResponse.class);
213 logMacroResponsePost(url, response);
216 } catch (BackendFunctionalException e) {
217 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
218 return new ResponseEntity<>(e.getHttpStatus());
219 } catch (ResourceAccessException e) {
220 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
221 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
226 public ResponseEntity<CreateE2EServiceInstanceResponse> callE2EDeleteServiceInstance(String globalSubscriberId,
227 String serviceType, String serviceInstanceId) {
229 String url = deleteE2ESoUrl + serviceInstanceId;
230 MSODeleteE2EPayload msoDeleteE2EPayload = new MSODeleteE2EPayload();
231 msoDeleteE2EPayload.setGlobalSubscriberId(globalSubscriberId);
232 msoDeleteE2EPayload.setServiceType(serviceType);
234 if (LOGGER.isDebugEnabled()) {
235 LOGGER.debug("Calling SO DeleteE2EServiceInstance with url : " + url + " MSODeleteE2EPayload : "
236 + msoDeleteE2EPayload.toString());
240 ResponseEntity<DeleteE2EServiceInstanceResponse> deleteresponse = restTemplate.exchange(url,
241 HttpMethod.DELETE, new HttpEntity<>(msoDeleteE2EPayload, buildRequestHeader()),
242 DeleteE2EServiceInstanceResponse.class);
244 CreateE2EServiceInstanceResponse dummyresponse = buildDummyResponse(serviceInstanceId,
245 deleteresponse.getBody().getOperationId());
246 ResponseEntity<CreateE2EServiceInstanceResponse> response =
247 new ResponseEntity(dummyresponse, deleteresponse.getStatusCode());
248 logE2EResponsePost(url, response);
251 } catch (BackendFunctionalException e) {
252 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
253 return new ResponseEntity<>(e.getHttpStatus());
254 } catch (ResourceAccessException e) {
255 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
256 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
259 public ResponseEntity<CreateE2EServiceInstanceResponse> callServiceActivationE2EService(String globalSubscriberId,
260 String serviceType, String serviceInstanceId, String operation) {
261 String url = new StringBuilder(activationE2ESoUrl).append(serviceInstanceId).append("/").append(operation).toString();
262 MSOE2EServiceActivationPayload msoE2EServiceActivationPayload = new MSOE2EServiceActivationPayload();
263 msoE2EServiceActivationPayload.setGlobalSubscriberId(globalSubscriberId);
264 msoE2EServiceActivationPayload.setServiceType(serviceType);
266 if (LOGGER.isDebugEnabled()) {
267 LOGGER.debug("Calling SO E2E Service Activation/Deactivation with url : " + url + " MSOE2EServiceActivationPayload : "
268 + msoE2EServiceActivationPayload.toString());
272 ResponseEntity<MSOE2EServiceActivationReponse> activationResponse = restTemplate.exchange(url,
273 HttpMethod.POST, new HttpEntity<>(msoE2EServiceActivationPayload, buildRequestHeader()),
274 MSOE2EServiceActivationReponse.class);
275 CreateE2EServiceInstanceResponse dummyresponse = buildDummyResponse(serviceInstanceId,
276 activationResponse.getBody().getOperationId());
278 ResponseEntity<CreateE2EServiceInstanceResponse> response =
279 new ResponseEntity(dummyresponse, activationResponse.getStatusCode());
280 logE2EResponsePost(url, response);
283 } catch (BackendFunctionalException e) {
284 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
285 return new ResponseEntity<>(e.getHttpStatus());
286 } catch (ResourceAccessException e) {
287 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
288 return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
294 * @param serviceInstanceId
297 * For E2E Services , Create and Delete/Activate/Deactivate Service responses are different,
298 * to maintain consistentcy with ServiceInstances Copy contents of ServiceActivationE2EReponse
299 * to CreateE2EServiceInstanceResponse
301 private CreateE2EServiceInstanceResponse buildDummyResponse(String serviceInstanceId,
302 String operationId) {
303 CreateE2EServiceInstanceResponse dummyresponse = new CreateE2EServiceInstanceResponse();
304 ServiceResponse serviceResponse = new ServiceResponse();
305 dummyresponse.setService(serviceResponse);
306 dummyresponse.getService().setOperationId(operationId);
307 dummyresponse.getService().setServiceId(serviceInstanceId);
308 return dummyresponse;
310 private void logResponsePost(String url, ResponseEntity<CreateServiceInstanceResponse> response) {
311 LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
312 if (LOGGER.isDebugEnabled()) {
313 LOGGER.debug("response body : {}", response.getBody().toString());
316 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
317 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
318 response.getBody().toString());
322 private void logMacroResponsePost(String url, ResponseEntity<CreateMacroServiceInstanceResponse> response) {
323 LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
324 if (LOGGER.isDebugEnabled()) {
325 LOGGER.debug("response body : {}", response.getBody().toString());
328 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
329 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
330 response.getBody().toString());
334 private void logE2EResponsePost(String url, ResponseEntity<CreateE2EServiceInstanceResponse> response) {
335 LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
336 if (LOGGER.isDebugEnabled()) {
337 LOGGER.debug("response body : {}", response.getBody().toString());
340 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
341 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
342 response.getBody().toString());
346 public GetRequestStatusResponse callGetRequestStatus(String requestId) {
347 String url = getSoStatus + requestId;
351 ResponseEntity<GetRequestStatusResponse> response = restTemplate.exchange(url, HttpMethod.GET,
352 new HttpEntity<>(buildRequestHeader()), GetRequestStatusResponse.class);
353 logResponseGet(url, response);
354 if (null == response) {
357 return response.getBody();
360 } catch (BackendFunctionalException | ResourceAccessException e) {
361 LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
366 public void callCheckConnectivity() {
367 String url = SoHealthCheck;
368 restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(buildRequestHeader()), String.class);
372 public GetE2ERequestStatusResponse callE2EGetRequestStatus(String operationId, String serviceId) {
374 String callUrlFormated = getE2ESoStatus.replace("$serviceId", serviceId);
375 callUrlFormated = callUrlFormated.replace("$operationId", operationId);
377 if (LOGGER.isDebugEnabled()) {
378 LOGGER.debug("Calling SO callE2EGetRequestStatus with url : " + callUrlFormated);
383 ResponseEntity<GetE2ERequestStatusResponse> response = restTemplate.exchange(callUrlFormated,
384 HttpMethod.GET, new HttpEntity<>(buildRequestHeader()), GetE2ERequestStatusResponse.class);
385 logE2EResponseGet(callUrlFormated, response);
386 if (null == response) {
389 return response.getBody();
392 } catch (BackendFunctionalException | ResourceAccessException e) {
393 LOGGER.error(ERROR_ON_CALLING + callUrlFormated + " ," + e);
398 private void logResponseGet(String url, ResponseEntity<GetRequestStatusResponse> response) {
399 if (response != null) {
400 if (LOGGER.isDebugEnabled()) {
401 LOGGER.debug("response status : {} , response body : {}", response.getStatusCodeValue(),
402 response.getBody().toString());
404 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
405 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
406 response.getBody().toString());
409 if (LOGGER.isWarnEnabled()) {
410 LOGGER.warn("no response calling url {}", url);
415 private void logE2EResponseGet(String url, ResponseEntity<GetE2ERequestStatusResponse> response) {
416 if (response != null) {
417 if (LOGGER.isDebugEnabled()) {
418 LOGGER.debug("response status : {} , response body : {}", response.getStatusCodeValue(),
419 response.getBody().toString());
421 if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
422 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
423 response.getBody().toString());
426 if (LOGGER.isWarnEnabled()) {
427 LOGGER.warn("no response calling url {}", url);
432 private HttpHeaders buildRequestHeader() {
433 HttpHeaders httpHeaders = new HttpHeaders();
434 httpHeaders.add(HEADER_AUTHORIZATION, soHeaderAuthorization);
435 httpHeaders.add(X_ONAP_PARTNER_HEADER, soOnapPartnerName);
436 httpHeaders.add("Accept", "application/json");
437 httpHeaders.add("Content-Type", "application/json");