5cce4dd35fb3f319ff88bf50177c2d851c3b4cde
[so.git] / adapters / mso-openstack-adapters / src / main / java / org / onap / so / adapters / valet / ValetClient.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7  * ================================================================================
8  * Modifications Copyright (C) 2018 IBM.
9  * ================================================================================
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  * 
14  *      http://www.apache.org/licenses/LICENSE-2.0
15  * 
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  * ============LICENSE_END=========================================================
22  */
23
24 package org.onap.so.adapters.valet;
25
26 import org.onap.so.adapters.valet.beans.HeatRequest;
27 import org.onap.so.adapters.valet.beans.ValetConfirmRequest;
28 import org.onap.so.adapters.valet.beans.ValetConfirmResponse;
29 import org.onap.so.adapters.valet.beans.ValetCreateRequest;
30 import org.onap.so.adapters.valet.beans.ValetCreateResponse;
31 import org.onap.so.adapters.valet.beans.ValetDeleteRequest;
32 import org.onap.so.adapters.valet.beans.ValetDeleteResponse;
33 import org.onap.so.adapters.valet.beans.ValetRollbackRequest;
34 import org.onap.so.adapters.valet.beans.ValetRollbackResponse;
35 import org.onap.so.adapters.valet.beans.ValetUpdateRequest;
36 import org.onap.so.adapters.valet.beans.ValetUpdateResponse;
37
38 import java.net.URI;
39
40 import javax.annotation.PostConstruct;
41 import javax.ws.rs.core.MediaType;
42 import javax.ws.rs.core.UriBuilder;
43
44 import org.onap.so.adapters.valet.GenericValetResponse;
45
46 import org.onap.so.logger.MsoLogger;
47 import org.springframework.beans.factory.annotation.Autowired;
48 import org.springframework.core.env.Environment;
49 import org.springframework.http.HttpEntity;
50 import org.springframework.http.HttpHeaders;
51 import org.springframework.http.HttpMethod;
52 import org.springframework.http.ResponseEntity;
53 import org.springframework.web.client.RestTemplate;
54 import org.springframework.stereotype.Component;
55
56 import com.fasterxml.jackson.databind.ObjectMapper;
57
58 @Component
59 public class ValetClient {
60         private static MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA, ValetClient.class);
61
62         @Autowired
63         private Environment environment;
64         
65         private static final String VALET_BASE_URL = "org.onap.so.adapters.valet.base_url";
66         private static final String VALET_BASE_PATH = "org.onap.so.adapters.valet.base_path";
67         private static final String VALET_AUTH = "org.onap.so.adapters.valet.basic_auth";
68         private static final String REQ_ID_HEADER_NAME = "X-RequestID";
69         protected static final String NO_STATUS_RETURNED = "no status returned from Valet";
70         
71         private static final String DEFAULT_BASE_URL = "http://localhost:8080/";
72         private static final String DEFAULT_BASE_PATH = "api/valet/placement/v1";
73         private static final String DEFAULT_AUTH_STRING = "";
74         private static final String REQUEST_ID="requestId";
75         private static final String HEADERS=", headers=";
76         private static final String BODY=", body=";
77         @Autowired
78         private ObjectMapper mapper;
79         
80         protected String baseUrl;
81         protected String basePath;
82         protected String authString;
83         
84         /* 
85          * Setup the properties needed from properties file. Each will fall to a default  
86          */
87         @PostConstruct
88         private void setupParams() {
89                 try {
90             this.baseUrl = this.environment.getProperty(ValetClient.VALET_BASE_URL, ValetClient.DEFAULT_BASE_URL);
91             this.basePath = this.environment.getProperty(ValetClient.VALET_BASE_PATH, ValetClient.DEFAULT_BASE_PATH);
92                         this.authString = this.environment.getProperty(ValetClient.VALET_AUTH, ValetClient.DEFAULT_AUTH_STRING);
93                 } catch (Exception e) {
94                         LOGGER.debug("Error retrieving valet properties. " + e.getMessage());
95                 }
96         }
97                 
98         /*
99          * This method will be invoked to send a Create request to Valet. 
100          */
101         public GenericValetResponse<ValetCreateResponse> callValetCreateRequest(String requestId, String regionId, String tenantId, String serviceInstanceId,
102                         String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) throws Exception {
103                 ResponseEntity<ValetCreateResponse> response = null;
104                 GenericValetResponse<ValetCreateResponse> gvr = null;
105
106                 try {
107                         UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
108                         URI uri = builder.build();
109                         
110                         ValetCreateRequest vcr = this.createValetCreateRequest(regionId, tenantId, serviceInstanceId, vnfId, vnfName, vfModuleId, vfModuleName, keystoneUrl, heatRequest);
111                         RestTemplate restTemplate = new RestTemplate();
112                         String body = mapper.writeValueAsString(vcr);
113                         HttpHeaders headers = generateHeaders(requestId);
114                         HttpEntity<String> entity = new HttpEntity<>(body, headers);    
115                         LOGGER.debug("valet create req: " + uri.toString() + HEADERS + headers.toString() + BODY + body);
116                         
117                         response = restTemplate.exchange(uri, HttpMethod.POST, entity, ValetCreateResponse.class);
118                         gvr = this.getGVRFromResponse(response);
119                 } catch (Exception e) {
120                         LOGGER.error("An exception occurred in callValetCreateRequest", e);
121                         throw e;
122                 }
123                 return gvr;
124         }
125         
126         /*
127          * This method will be invoked to send an Update request to Valet. 
128          */
129         public GenericValetResponse<ValetUpdateResponse> callValetUpdateRequest(String requestId, String regionId, String tenantId, String serviceInstanceId, 
130                         String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) throws Exception {
131                 ResponseEntity<ValetUpdateResponse> response = null;
132                 GenericValetResponse<ValetUpdateResponse> gvr = null;
133
134                 try {
135                         UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
136                         URI uri = builder.build();
137                         
138                         ValetUpdateRequest vur = this.createValetUpdateRequest(regionId, tenantId, serviceInstanceId, vnfId, vnfName, vfModuleId, vfModuleName, keystoneUrl, heatRequest);
139                         RestTemplate restTemplate = new RestTemplate();
140                         String body = mapper.writeValueAsString(vur);
141                         HttpHeaders headers = generateHeaders(requestId);       
142                         HttpEntity<String> entity = new HttpEntity<>(body, headers);
143                         LOGGER.debug("valet update req: " + uri.toString() + HEADERS + headers.toString() + BODY + body);
144                         
145                         response = restTemplate.exchange(uri, HttpMethod.PUT, entity, ValetUpdateResponse.class);
146                         gvr = this.getGVRFromResponse(response);
147                 } catch (Exception e) {
148                         LOGGER.error("An exception occurred in callValetUpdateRequest", e);
149                         throw e;
150                 }
151                 return gvr;
152         }
153         
154         /*
155          * This method will be invoked to send a Delete request to Valet.
156          */
157         public GenericValetResponse<ValetDeleteResponse> callValetDeleteRequest(String requestId, String regionId, String tenantId, String vfModuleId, String vfModuleName) throws Exception {
158                 ResponseEntity<ValetDeleteResponse> response = null;
159                 GenericValetResponse<ValetDeleteResponse> gvr = null;
160
161                 try {
162                         UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
163                         URI uri = builder.build();
164                         
165                         ValetDeleteRequest vdr = this.createValetDeleteRequest(regionId, tenantId, vfModuleId, vfModuleName);
166                         RestTemplate restTemplate = new RestTemplate();
167                         String body = mapper.writeValueAsString(vdr);
168                         HttpHeaders headers = generateHeaders(requestId);
169                         HttpEntity<String> entity = new HttpEntity<>(body, headers);
170                         LOGGER.debug("valet delete req: " + uri.toString() + HEADERS + headers.toString() + ", body=" + body);
171                         
172                         response = restTemplate.exchange(uri, HttpMethod.DELETE, entity, ValetDeleteResponse.class);
173                         gvr = this.getGVRFromResponse(response);
174                 } catch (Exception e) {
175                         LOGGER.error("An exception occurred in callValetDeleteRequest", e);
176                         throw e;
177                 }
178                 return gvr;
179         }
180         
181         /*
182          * This method is called to invoke a Confirm request to Valet. 
183          */
184         public GenericValetResponse<ValetConfirmResponse> callValetConfirmRequest(String requestId, String stackId) throws Exception {
185                 ResponseEntity<ValetConfirmResponse> response = null;
186                 GenericValetResponse<ValetConfirmResponse> gvr = null;
187
188                 try {
189                         UriBuilder builder = UriBuilder.fromPath(this.baseUrl).path(this.basePath).path("{requestId}/confirm/");
190                         URI uri = builder.build(requestId);
191                         
192                         ValetConfirmRequest vcr = this.createValetConfirmRequest(stackId);
193                         RestTemplate restTemplate = new RestTemplate();
194                         String body = mapper.writeValueAsString(vcr);
195                         HttpHeaders headers = generateHeaders(requestId);
196                         HttpEntity<String> entity = new HttpEntity<>(body, headers);
197                         LOGGER.debug("valet confirm req: " + uri.toString() + HEADERS + headers.toString() + BODY + body);
198                         
199                         response = restTemplate.exchange(uri, HttpMethod.PUT, entity, ValetConfirmResponse.class);
200                         gvr = this.getGVRFromResponse(response);
201                 } catch (Exception e) {
202                         LOGGER.error("An exception occurred in callValetConfirmRequest", e);
203                         throw e;
204                 }
205                 return gvr;
206         }
207         
208         /* 
209          * This method is called to invoke a Rollback request to Valet.
210          */
211         public GenericValetResponse<ValetRollbackResponse> callValetRollbackRequest(String requestId, String stackId, Boolean suppressRollback, String errorMessage) throws Exception {
212                 ResponseEntity<ValetRollbackResponse> response = null;
213                 GenericValetResponse<ValetRollbackResponse> gvr = null;
214
215                 try {
216                         UriBuilder builder = UriBuilder.fromPath(this.baseUrl).path(this.basePath).path("{requestId}/rollback/");
217                         URI uri = builder.build(requestId);
218                         
219                         ValetRollbackRequest vrr = this.createValetRollbackRequest(stackId, suppressRollback, errorMessage);
220                         RestTemplate restTemplate = new RestTemplate();
221                         String body = mapper.writeValueAsString(vrr);
222                         HttpHeaders headers = generateHeaders(requestId);
223                         HttpEntity<String> entity = new HttpEntity<>(body, headers);
224                         LOGGER.debug("valet rollback req: " + uri.toString() + HEADERS + headers.toString() + BODY + body);
225                         
226                         response = restTemplate.exchange(uri, HttpMethod.PUT, entity, ValetRollbackResponse.class);
227                         gvr = this.getGVRFromResponse(response);
228                 } catch (Exception e) {
229                         LOGGER.error("An exception occurred in callValetRollbackRequest", e);
230                         throw e;
231                 }
232                 return gvr;
233         }
234         
235         /*
236          * This method is to construct the ValetCreateRequest pojo
237          */
238         private ValetCreateRequest createValetCreateRequest(String regionId, String tenantId, String serviceInstanceId,
239                         String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) {
240                 ValetCreateRequest vcr = new ValetCreateRequest();
241                 vcr.setHeatRequest(heatRequest);
242                 vcr.setKeystoneUrl(keystoneUrl);
243                 vcr.setRegionId(regionId);
244                 vcr.setServiceInstanceId(serviceInstanceId);
245                 vcr.setTenantId(tenantId);
246                 vcr.setVfModuleId(vfModuleId);
247                 vcr.setVfModuleName(vfModuleName);
248                 vcr.setVnfId(vnfId);
249                 vcr.setVnfName(vnfName);
250                 
251                 return vcr;
252         }
253         
254         /*
255          * This method is to construct the ValetUpdateRequest pojo
256          */
257         private ValetUpdateRequest createValetUpdateRequest(String regionId, String tenantId, String serviceInstanceId,
258                         String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) {
259                 ValetUpdateRequest vur = new ValetUpdateRequest();
260                 vur.setHeatRequest(heatRequest);
261                 vur.setKeystoneUrl(keystoneUrl);
262                 vur.setRegionId(regionId == null ? "" : regionId);
263                 vur.setServiceInstanceId(serviceInstanceId == null ? "" : serviceInstanceId);
264                 vur.setTenantId(tenantId == null ? "" : tenantId);
265                 vur.setVfModuleId(vfModuleId == null ? "" : vfModuleId);
266                 vur.setVfModuleName(vfModuleName == null ? "" : vfModuleName);
267                 vur.setVnfId(vnfId == null ? "" : vnfId);
268                 vur.setVnfName(vnfName == null ? "" : vnfName);
269                 
270                 return vur;
271         }
272         
273         /*
274          * This method is to construct the ValetDeleteRequest pojo
275          */
276         private ValetDeleteRequest createValetDeleteRequest(String regionId, String tenantId, String vfModuleId, String vfModuleName) {
277                 ValetDeleteRequest vdr = new ValetDeleteRequest();
278                 vdr.setRegionId(regionId == null ? "" : regionId);
279                 vdr.setTenantId(tenantId == null ? "" : tenantId);
280                 vdr.setVfModuleId(vfModuleId == null ? "" : vfModuleId);
281                 vdr.setVfModuleName(vfModuleName == null ? "" : vfModuleName);
282                 
283                 return vdr;
284         }
285         
286         /*
287          * This method is to construct the ValetDeleteRequest pojo
288          */
289         private ValetConfirmRequest createValetConfirmRequest(String stackId) {
290                 ValetConfirmRequest vcr = new ValetConfirmRequest();
291                 vcr.setStackId(stackId);
292                 
293                 return vcr;
294         }
295         
296         /*
297          * This method is to construct the ValetRollbackRequest pojo
298          */
299         private ValetRollbackRequest createValetRollbackRequest(String stackId, Boolean suppressRollback, String errorMessage) {
300                 ValetRollbackRequest vrr = new ValetRollbackRequest();
301                 vrr.setStackId(stackId);
302                 vrr.setSuppressRollback(suppressRollback);
303                 vrr.setErrorMessage(errorMessage);
304                 
305                 return vrr;
306         }
307         
308         private HttpHeaders generateHeaders(String requestId) {
309                 HttpHeaders headers = new HttpHeaders();
310                 headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
311                 if (!(this.authString == null || this.authString.isEmpty())) {
312                         headers.add("Authorization",  "Basic " + this.authString);
313                 }
314                 headers.add(ValetClient.REQ_ID_HEADER_NAME, requestId);
315                 
316                 return headers;
317         }
318         
319         private <T> GenericValetResponse<T> getGVRFromResponse(ResponseEntity<T> response) {
320                 GenericValetResponse<T> gvr = null;
321                 if (response != null) {
322                         T responseObj = response.getBody();
323                         gvr = new GenericValetResponse<>(response.getStatusCodeValue(), ValetClient.NO_STATUS_RETURNED, responseObj);
324                         
325                 } else {
326                         gvr = new GenericValetResponse<>(-1, ValetClient.NO_STATUS_RETURNED, null);
327                 }
328                 return gvr;
329         }
330 }