Update Logging
[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.http.client.BufferingClientHttpRequestFactory;
54 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
55 import org.springframework.web.client.RestTemplate;
56 import org.springframework.stereotype.Component;
57
58 import com.fasterxml.jackson.databind.ObjectMapper;
59
60 @Component
61 public class ValetClient {
62         private static MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA, ValetClient.class);
63
64         @Autowired
65         private Environment environment;
66         
67         private static final String VALET_BASE_URL = "org.onap.so.adapters.valet.base_url";
68         private static final String VALET_BASE_PATH = "org.onap.so.adapters.valet.base_path";
69         private static final String VALET_AUTH = "org.onap.so.adapters.valet.basic_auth";
70         private static final String REQ_ID_HEADER_NAME = "X-RequestID";
71         protected static final String NO_STATUS_RETURNED = "no status returned from Valet";
72         
73         private static final String DEFAULT_BASE_URL = "http://localhost:8080/";
74         private static final String DEFAULT_BASE_PATH = "api/valet/placement/v1";
75         private static final String DEFAULT_AUTH_STRING = "";
76         private static final String REQUEST_ID="requestId";
77         private static final String HEADERS=", headers=";
78         private static final String BODY=", body=";
79         @Autowired
80         private ObjectMapper mapper;
81         
82         protected String baseUrl;
83         protected String basePath;
84         protected String authString;
85         
86         /* 
87          * Setup the properties needed from properties file. Each will fall to a default  
88          */
89         @PostConstruct
90         private void setupParams() {
91                 try {
92             this.baseUrl = this.environment.getProperty(ValetClient.VALET_BASE_URL, ValetClient.DEFAULT_BASE_URL);
93             this.basePath = this.environment.getProperty(ValetClient.VALET_BASE_PATH, ValetClient.DEFAULT_BASE_PATH);
94                         this.authString = this.environment.getProperty(ValetClient.VALET_AUTH, ValetClient.DEFAULT_AUTH_STRING);
95                 } catch (Exception e) {
96                         LOGGER.debug("Error retrieving valet properties. " + e.getMessage());
97                 }
98         }
99                 
100         /*
101          * This method will be invoked to send a Create request to Valet. 
102          */
103         public GenericValetResponse<ValetCreateResponse> callValetCreateRequest(String requestId, String regionId, String tenantId, String serviceInstanceId,
104                         String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) throws Exception {
105                 ResponseEntity<ValetCreateResponse> response = null;
106                 GenericValetResponse<ValetCreateResponse> gvr = null;
107
108                 try {
109                         UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
110                         URI uri = builder.build();
111                         
112                         ValetCreateRequest vcr = this.createValetCreateRequest(regionId, tenantId, serviceInstanceId, vnfId, vnfName, vfModuleId, vfModuleName, keystoneUrl, heatRequest);
113                         String body = mapper.writeValueAsString(vcr);
114                         HttpHeaders headers = generateHeaders(requestId);
115                         HttpEntity<String> entity = new HttpEntity<>(body, headers);                            
116                         
117                         response = getRestTemplate().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         private RestTemplate getRestTemplate(){
127                 RestTemplate restTemplate = new RestTemplate();
128                 restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory()));
129                 return restTemplate;
130         }
131         
132         /*
133          * This method will be invoked to send an Update request to Valet. 
134          */
135         public GenericValetResponse<ValetUpdateResponse> callValetUpdateRequest(String requestId, String regionId, String tenantId, String serviceInstanceId, 
136                         String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) throws Exception {
137                 ResponseEntity<ValetUpdateResponse> response = null;
138                 GenericValetResponse<ValetUpdateResponse> gvr = null;
139
140                 try {
141                         UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
142                         URI uri = builder.build();
143                         
144                         ValetUpdateRequest vur = this.createValetUpdateRequest(regionId, tenantId, serviceInstanceId, vnfId, vnfName, vfModuleId, vfModuleName, keystoneUrl, heatRequest);                      
145                         String body = mapper.writeValueAsString(vur);
146                         HttpHeaders headers = generateHeaders(requestId);       
147                         HttpEntity<String> entity = new HttpEntity<>(body, headers);
148                 
149                         
150                         response = getRestTemplate().exchange(uri, HttpMethod.PUT, entity, ValetUpdateResponse.class);
151                         gvr = this.getGVRFromResponse(response);
152                 } catch (Exception e) {
153                         LOGGER.error("An exception occurred in callValetUpdateRequest", e);
154                         throw e;
155                 }
156                 return gvr;
157         }
158         
159         /*
160          * This method will be invoked to send a Delete request to Valet.
161          */
162         public GenericValetResponse<ValetDeleteResponse> callValetDeleteRequest(String requestId, String regionId, String tenantId, String vfModuleId, String vfModuleName) throws Exception {
163                 ResponseEntity<ValetDeleteResponse> response = null;
164                 GenericValetResponse<ValetDeleteResponse> gvr = null;
165
166                 try {
167                         UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
168                         URI uri = builder.build();
169                         
170                         ValetDeleteRequest vdr = this.createValetDeleteRequest(regionId, tenantId, vfModuleId, vfModuleName);
171                         
172                         String body = mapper.writeValueAsString(vdr);
173                         HttpHeaders headers = generateHeaders(requestId);
174                         HttpEntity<String> entity = new HttpEntity<>(body, headers);
175                         
176                         
177                         response = getRestTemplate().exchange(uri, HttpMethod.DELETE, entity, ValetDeleteResponse.class);
178                         gvr = this.getGVRFromResponse(response);
179                 } catch (Exception e) {
180                         LOGGER.error("An exception occurred in callValetDeleteRequest", e);
181                         throw e;
182                 }
183                 return gvr;
184         }
185         
186         /*
187          * This method is called to invoke a Confirm request to Valet. 
188          */
189         public GenericValetResponse<ValetConfirmResponse> callValetConfirmRequest(String requestId, String stackId) throws Exception {
190                 ResponseEntity<ValetConfirmResponse> response = null;
191                 GenericValetResponse<ValetConfirmResponse> gvr = null;
192
193                 try {
194                         UriBuilder builder = UriBuilder.fromPath(this.baseUrl).path(this.basePath).path("{requestId}/confirm/");
195                         URI uri = builder.build(requestId);
196                         
197                         ValetConfirmRequest vcr = this.createValetConfirmRequest(stackId);
198                         
199                         String body = mapper.writeValueAsString(vcr);
200                         HttpHeaders headers = generateHeaders(requestId);
201                         HttpEntity<String> entity = new HttpEntity<>(body, headers);
202                         LOGGER.debug("valet confirm req: " + uri.toString() + HEADERS + headers.toString() + BODY + body);
203                         
204                         response = getRestTemplate().exchange(uri, HttpMethod.PUT, entity, ValetConfirmResponse.class);
205                         gvr = this.getGVRFromResponse(response);
206                 } catch (Exception e) {
207                         LOGGER.error("An exception occurred in callValetConfirmRequest", e);
208                         throw e;
209                 }
210                 return gvr;
211         }
212         
213         /* 
214          * This method is called to invoke a Rollback request to Valet.
215          */
216         public GenericValetResponse<ValetRollbackResponse> callValetRollbackRequest(String requestId, String stackId, Boolean suppressRollback, String errorMessage) throws Exception {
217                 ResponseEntity<ValetRollbackResponse> response = null;
218                 GenericValetResponse<ValetRollbackResponse> gvr = null;
219
220                 try {
221                         UriBuilder builder = UriBuilder.fromPath(this.baseUrl).path(this.basePath).path("{requestId}/rollback/");
222                         URI uri = builder.build(requestId);
223                         
224                         ValetRollbackRequest vrr = this.createValetRollbackRequest(stackId, suppressRollback, errorMessage);
225                 
226                         String body = mapper.writeValueAsString(vrr);
227                         HttpHeaders headers = generateHeaders(requestId);
228                         HttpEntity<String> entity = new HttpEntity<>(body, headers);
229                         
230                         
231                         response = getRestTemplate().exchange(uri, HttpMethod.PUT, entity, ValetRollbackResponse.class);
232                         gvr = this.getGVRFromResponse(response);
233                 } catch (Exception e) {
234                         LOGGER.error("An exception occurred in callValetRollbackRequest", e);
235                         throw e;
236                 }
237                 return gvr;
238         }
239         
240         /*
241          * This method is to construct the ValetCreateRequest pojo
242          */
243         private ValetCreateRequest createValetCreateRequest(String regionId, String tenantId, String serviceInstanceId,
244                         String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) {
245                 ValetCreateRequest vcr = new ValetCreateRequest();
246                 vcr.setHeatRequest(heatRequest);
247                 vcr.setKeystoneUrl(keystoneUrl);
248                 vcr.setRegionId(regionId);
249                 vcr.setServiceInstanceId(serviceInstanceId);
250                 vcr.setTenantId(tenantId);
251                 vcr.setVfModuleId(vfModuleId);
252                 vcr.setVfModuleName(vfModuleName);
253                 vcr.setVnfId(vnfId);
254                 vcr.setVnfName(vnfName);
255                 
256                 return vcr;
257         }
258         
259         /*
260          * This method is to construct the ValetUpdateRequest pojo
261          */
262         private ValetUpdateRequest createValetUpdateRequest(String regionId, String tenantId, String serviceInstanceId,
263                         String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) {
264                 ValetUpdateRequest vur = new ValetUpdateRequest();
265                 vur.setHeatRequest(heatRequest);
266                 vur.setKeystoneUrl(keystoneUrl);
267                 vur.setRegionId(regionId == null ? "" : regionId);
268                 vur.setServiceInstanceId(serviceInstanceId == null ? "" : serviceInstanceId);
269                 vur.setTenantId(tenantId == null ? "" : tenantId);
270                 vur.setVfModuleId(vfModuleId == null ? "" : vfModuleId);
271                 vur.setVfModuleName(vfModuleName == null ? "" : vfModuleName);
272                 vur.setVnfId(vnfId == null ? "" : vnfId);
273                 vur.setVnfName(vnfName == null ? "" : vnfName);
274                 
275                 return vur;
276         }
277         
278         /*
279          * This method is to construct the ValetDeleteRequest pojo
280          */
281         private ValetDeleteRequest createValetDeleteRequest(String regionId, String tenantId, String vfModuleId, String vfModuleName) {
282                 ValetDeleteRequest vdr = new ValetDeleteRequest();
283                 vdr.setRegionId(regionId == null ? "" : regionId);
284                 vdr.setTenantId(tenantId == null ? "" : tenantId);
285                 vdr.setVfModuleId(vfModuleId == null ? "" : vfModuleId);
286                 vdr.setVfModuleName(vfModuleName == null ? "" : vfModuleName);
287                 
288                 return vdr;
289         }
290         
291         /*
292          * This method is to construct the ValetDeleteRequest pojo
293          */
294         private ValetConfirmRequest createValetConfirmRequest(String stackId) {
295                 ValetConfirmRequest vcr = new ValetConfirmRequest();
296                 vcr.setStackId(stackId);
297                 
298                 return vcr;
299         }
300         
301         /*
302          * This method is to construct the ValetRollbackRequest pojo
303          */
304         private ValetRollbackRequest createValetRollbackRequest(String stackId, Boolean suppressRollback, String errorMessage) {
305                 ValetRollbackRequest vrr = new ValetRollbackRequest();
306                 vrr.setStackId(stackId);
307                 vrr.setSuppressRollback(suppressRollback);
308                 vrr.setErrorMessage(errorMessage);
309                 
310                 return vrr;
311         }
312         
313         private HttpHeaders generateHeaders(String requestId) {
314                 HttpHeaders headers = new HttpHeaders();
315                 headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
316                 if (!(this.authString == null || this.authString.isEmpty())) {
317                         headers.add("Authorization",  "Basic " + this.authString);
318                 }
319                 headers.add(ValetClient.REQ_ID_HEADER_NAME, requestId);
320                 
321                 return headers;
322         }
323         
324         private <T> GenericValetResponse<T> getGVRFromResponse(ResponseEntity<T> response) {
325                 GenericValetResponse<T> gvr = null;
326                 if (response != null) {
327                         T responseObj = response.getBody();
328                         gvr = new GenericValetResponse<>(response.getStatusCodeValue(), ValetClient.NO_STATUS_RETURNED, responseObj);
329                         
330                 } else {
331                         gvr = new GenericValetResponse<>(-1, ValetClient.NO_STATUS_RETURNED, null);
332                 }
333                 return gvr;
334         }
335 }