Implement E2EService activation/deactivation for NetworkSlicing
[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
5  * in compliance with 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
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
12  * the License.
13  */
14
15 package org.onap.nbi.apis.serviceorder;
16
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;
44
45 @Service
46 public class SoClient {
47
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 ";
51     @Autowired
52     private RestTemplate restTemplate;
53
54     @Value("${so.host}")
55     private String soHostname;
56
57     @Value("${so.onap.partner.name}")
58     private String soOnapPartnerName;
59
60     @Value("${so.header.authorization}")
61     private String soHeaderAuthorization;
62
63     private static final String HEADER_AUTHORIZATION = "Authorization";
64     private static final String X_ONAP_PARTNER_HEADER = "X-ONAP-PartnerName";
65
66     private static final Logger LOGGER = LoggerFactory.getLogger(SoClient.class);
67
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;
76
77     @PostConstruct
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)
90                 .toString();
91         getE2ESoStatus = new StringBuilder().append(soHostname)
92                 .append(OnapComponentsUrlPaths.MSO_GET_E2EREQUEST_STATUS_PATH).toString();
93         SoHealthCheck =
94                 new StringBuilder().append(soHostname).append(OnapComponentsUrlPaths.MSO_HEALTH_CHECK).toString();
95
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);
104
105     }
106
107     public ResponseEntity<CreateServiceInstanceResponse> callCreateServiceInstance(MSOPayload msoPayload) {
108
109         if (LOGGER.isDebugEnabled()) {
110             LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
111         }
112
113         try {
114             ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(createSoUrl, HttpMethod.POST,
115                     new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
116
117             logResponsePost(createSoUrl, response);
118             return response;
119
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);
126         }
127     }
128
129     public ResponseEntity<CreateMacroServiceInstanceResponse> callMacroCreateServiceInstance(MSOPayload msoPayload) {
130
131         if (LOGGER.isDebugEnabled()) {
132           LOGGER.debug("Calling SO CreateServiceInstance with msoPayload : " + msoPayload.toString());
133         }
134
135         try {
136           ResponseEntity<CreateMacroServiceInstanceResponse> response = restTemplate.exchange(createSoUrl,
137                    HttpMethod.POST, new HttpEntity<>(msoPayload, buildRequestHeader()),CreateMacroServiceInstanceResponse.class);
138           
139           logMacroResponsePost(createSoUrl, response);
140           return 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);
147         }
148     }
149     
150     public ResponseEntity<CreateE2EServiceInstanceResponse> callE2ECreateServiceInstance(MSOE2EPayload msoPayloadE2E) {
151
152         if (LOGGER.isDebugEnabled()) {
153             LOGGER.debug("Calling SO CreateServiceInstanceE2E with msoPayload : " + msoPayloadE2E.toString());
154         }
155
156         try {
157             ResponseEntity<CreateE2EServiceInstanceResponse> response = restTemplate.exchange(createE2ESoUrl,
158                     HttpMethod.POST, new HttpEntity<>(msoPayloadE2E, buildRequestHeader()),
159                     CreateE2EServiceInstanceResponse.class);
160
161             logE2EResponsePost(createE2ESoUrl, response);
162             return response;
163
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);
170         }
171     }
172
173     public ResponseEntity<CreateServiceInstanceResponse> callDeleteServiceInstance(MSOPayload msoPayload,
174             String serviceId) {
175
176         if (LOGGER.isDebugEnabled()) {
177             LOGGER.debug("Calling SO DeleteServiceInstance with msoPayload : " + msoPayload.toString());
178         }
179
180         String url = deleteSoUrl + serviceId;
181
182         try {
183             ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.DELETE,
184                     new HttpEntity<>(msoPayload, buildRequestHeader()), CreateServiceInstanceResponse.class);
185
186             logResponsePost(url, response);
187             return response;
188
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);
195         }
196
197     }
198
199     public ResponseEntity<CreateE2EServiceInstanceResponse> callE2EDeleteServiceInstance(String globalSubscriberId,
200             String serviceType, String serviceInstanceId) {
201
202         String url = deleteE2ESoUrl + serviceInstanceId;
203         MSODeleteE2EPayload msoDeleteE2EPayload = new MSODeleteE2EPayload();
204         msoDeleteE2EPayload.setGlobalSubscriberId(globalSubscriberId);
205         msoDeleteE2EPayload.setServiceType(serviceType);
206
207         if (LOGGER.isDebugEnabled()) {
208             LOGGER.debug("Calling SO DeleteE2EServiceInstance with url : " + url + " MSODeleteE2EPayload : "
209                     + msoDeleteE2EPayload.toString());
210         }
211
212         try {
213             ResponseEntity<DeleteE2EServiceInstanceResponse> deleteresponse = restTemplate.exchange(url,
214                     HttpMethod.DELETE, new HttpEntity<>(msoDeleteE2EPayload, buildRequestHeader()),
215                     DeleteE2EServiceInstanceResponse.class);
216
217             CreateE2EServiceInstanceResponse dummyresponse = buildDummyResponse(serviceInstanceId,
218                         deleteresponse.getBody().getOperationId());
219             ResponseEntity<CreateE2EServiceInstanceResponse> response =
220                     new ResponseEntity(dummyresponse, deleteresponse.getStatusCode());
221             logE2EResponsePost(url, response);
222             return response;
223
224         } catch (BackendFunctionalException e) {
225             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
226             return new ResponseEntity<>(e.getHttpStatus());
227         } catch (ResourceAccessException e) {
228             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
229             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
230         }
231     }
232         public ResponseEntity<CreateE2EServiceInstanceResponse> callServiceActivationE2EService(String globalSubscriberId,
233                         String serviceType, String serviceInstanceId, String operation) {
234         String url = new StringBuilder(activationE2ESoUrl).append(serviceInstanceId).append("/").append(operation).toString();
235                 MSOE2EServiceActivationPayload msoE2EServiceActivationPayload = new MSOE2EServiceActivationPayload();
236                 msoE2EServiceActivationPayload.setGlobalSubscriberId(globalSubscriberId);
237                 msoE2EServiceActivationPayload.setServiceType(serviceType);
238
239                 if (LOGGER.isDebugEnabled()) {
240             LOGGER.debug("Calling SO E2E Service Activation/Deactivation  with url : " + url + " MSOE2EServiceActivationPayload : "
241                     + msoE2EServiceActivationPayload.toString());
242         }
243
244         try {
245             ResponseEntity<MSOE2EServiceActivationReponse> activationResponse = restTemplate.exchange(url,
246                     HttpMethod.POST, new HttpEntity<>(msoE2EServiceActivationPayload, buildRequestHeader()),
247                     MSOE2EServiceActivationReponse.class);
248             CreateE2EServiceInstanceResponse dummyresponse = buildDummyResponse(serviceInstanceId,
249                         activationResponse.getBody().getOperationId());
250
251             ResponseEntity<CreateE2EServiceInstanceResponse> response =
252                     new ResponseEntity(dummyresponse, activationResponse.getStatusCode());
253             logE2EResponsePost(url, response);
254             return response;
255
256         } catch (BackendFunctionalException e) {
257             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
258             return new ResponseEntity<>(e.getHttpStatus());
259         } catch (ResourceAccessException e) {
260             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
261             return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
262         }
263
264         }
265
266         /**
267          * @param serviceInstanceId
268          * @param operationId
269          * @return
270          * For E2E Services , Create and Delete/Activate/Deactivate Service responses are different,
271          * to maintain consistentcy with ServiceInstances Copy contents of ServiceActivationE2EReponse
272          * to CreateE2EServiceInstanceResponse
273          */
274         private CreateE2EServiceInstanceResponse buildDummyResponse(String serviceInstanceId,
275                         String operationId) {
276                 CreateE2EServiceInstanceResponse dummyresponse = new CreateE2EServiceInstanceResponse();
277                 ServiceResponse serviceResponse = new ServiceResponse();
278                 dummyresponse.setService(serviceResponse);
279                 dummyresponse.getService().setOperationId(operationId);
280                 dummyresponse.getService().setServiceId(serviceInstanceId);
281                 return dummyresponse;
282         }
283     private void logResponsePost(String url, ResponseEntity<CreateServiceInstanceResponse> response) {
284         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
285         if (LOGGER.isDebugEnabled()) {
286             LOGGER.debug("response body : {}", response.getBody().toString());
287         }
288
289         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
290             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
291                     response.getBody().toString());
292         }
293     }
294
295     private void logMacroResponsePost(String url, ResponseEntity<CreateMacroServiceInstanceResponse> response) {
296       LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
297       if (LOGGER.isDebugEnabled()) {
298         LOGGER.debug("response body : {}", response.getBody().toString());
299       }
300       
301       if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
302         LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
303                     response.getBody().toString());
304       }
305     }
306     
307     private void logE2EResponsePost(String url, ResponseEntity<CreateE2EServiceInstanceResponse> response) {
308         LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
309         if (LOGGER.isDebugEnabled()) {
310             LOGGER.debug("response body : {}", response.getBody().toString());
311         }
312
313         if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.CREATED)) {
314             LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
315                     response.getBody().toString());
316         }
317     }
318
319     public GetRequestStatusResponse callGetRequestStatus(String requestId) {
320         String url = getSoStatus + requestId;
321
322         try {
323
324             ResponseEntity<GetRequestStatusResponse> response = restTemplate.exchange(url, HttpMethod.GET,
325                     new HttpEntity<>(buildRequestHeader()), GetRequestStatusResponse.class);
326             logResponseGet(url, response);
327             if (null == response) {
328                 return null;
329             } else {
330                 return response.getBody();
331             }
332
333         } catch (BackendFunctionalException | ResourceAccessException e) {
334             LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
335             return null;
336         }
337     }
338
339     public void callCheckConnectivity() {
340         String url = SoHealthCheck;
341         restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(buildRequestHeader()), String.class);
342
343     }
344
345     public GetE2ERequestStatusResponse callE2EGetRequestStatus(String operationId, String serviceId) {
346
347         String callUrlFormated = getE2ESoStatus.replace("$serviceId", serviceId);
348         callUrlFormated = callUrlFormated.replace("$operationId", operationId);
349
350         if (LOGGER.isDebugEnabled()) {
351             LOGGER.debug("Calling SO callE2EGetRequestStatus with url : " + callUrlFormated);
352         }
353
354         try {
355
356             ResponseEntity<GetE2ERequestStatusResponse> response = restTemplate.exchange(callUrlFormated,
357                     HttpMethod.GET, new HttpEntity<>(buildRequestHeader()), GetE2ERequestStatusResponse.class);
358             logE2EResponseGet(callUrlFormated, response);
359             if (null == response) {
360                 return null;
361             } else {
362                 return response.getBody();
363             }
364
365         } catch (BackendFunctionalException | ResourceAccessException e) {
366             LOGGER.error(ERROR_ON_CALLING + callUrlFormated + " ," + e);
367             return null;
368         }
369     }
370
371     private void logResponseGet(String url, ResponseEntity<GetRequestStatusResponse> response) {
372         if (response != null) {
373             if (LOGGER.isDebugEnabled()) {
374                 LOGGER.debug("response status : {} , response body : {}", response.getStatusCodeValue(),
375                         response.getBody().toString());
376             }
377             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
378                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
379                         response.getBody().toString());
380             }
381         } else {
382             if (LOGGER.isWarnEnabled()) {
383                 LOGGER.warn("no response calling url {}", url);
384             }
385         }
386     }
387
388     private void logE2EResponseGet(String url, ResponseEntity<GetE2ERequestStatusResponse> response) {
389         if (response != null) {
390             if (LOGGER.isDebugEnabled()) {
391                 LOGGER.debug("response status : {} , response body : {}", response.getStatusCodeValue(),
392                         response.getBody().toString());
393             }
394             if (LOGGER.isWarnEnabled() && !response.getStatusCode().equals(HttpStatus.OK)) {
395                 LOGGER.warn("HTTP call SO on {} returns {} , {}", url, response.getStatusCodeValue(),
396                         response.getBody().toString());
397             }
398         } else {
399             if (LOGGER.isWarnEnabled()) {
400                 LOGGER.warn("no response calling url {}", url);
401             }
402         }
403     }
404
405     private HttpHeaders buildRequestHeader() {
406         HttpHeaders httpHeaders = new HttpHeaders();
407         httpHeaders.add(HEADER_AUTHORIZATION, soHeaderAuthorization);
408         httpHeaders.add(X_ONAP_PARTNER_HEADER, soOnapPartnerName);
409         httpHeaders.add("Accept", "application/json");
410         httpHeaders.add("Content-Type", "application/json");
411         return httpHeaders;
412     }
413
414 }