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