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