2 * ============LICENSE_START=======================================================
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
14 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
24 package org.onap.so.adapters.valet;
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;
40 import javax.annotation.PostConstruct;
41 import javax.ws.rs.core.MediaType;
42 import javax.ws.rs.core.UriBuilder;
44 import org.onap.so.adapters.valet.GenericValetResponse;
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;
58 import com.fasterxml.jackson.databind.ObjectMapper;
61 public class ValetClient {
62 private static MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA, ValetClient.class);
65 private Environment environment;
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";
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=";
80 private ObjectMapper mapper;
82 protected String baseUrl;
83 protected String basePath;
84 protected String authString;
87 * Setup the properties needed from properties file. Each will fall to a default
90 private void setupParams() {
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());
101 * This method will be invoked to send a Create request to Valet.
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;
109 UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
110 URI uri = builder.build();
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);
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);
126 private RestTemplate getRestTemplate(){
127 RestTemplate restTemplate = new RestTemplate();
128 restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory()));
133 * This method will be invoked to send an Update request to Valet.
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;
141 UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
142 URI uri = builder.build();
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);
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);
160 * This method will be invoked to send a Delete request to Valet.
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;
167 UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
168 URI uri = builder.build();
170 ValetDeleteRequest vdr = this.createValetDeleteRequest(regionId, tenantId, vfModuleId, vfModuleName);
172 String body = mapper.writeValueAsString(vdr);
173 HttpHeaders headers = generateHeaders(requestId);
174 HttpEntity<String> entity = new HttpEntity<>(body, headers);
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);
187 * This method is called to invoke a Confirm request to Valet.
189 public GenericValetResponse<ValetConfirmResponse> callValetConfirmRequest(String requestId, String stackId) throws Exception {
190 ResponseEntity<ValetConfirmResponse> response = null;
191 GenericValetResponse<ValetConfirmResponse> gvr = null;
194 UriBuilder builder = UriBuilder.fromPath(this.baseUrl).path(this.basePath).path("{requestId}/confirm/");
195 URI uri = builder.build(requestId);
197 ValetConfirmRequest vcr = this.createValetConfirmRequest(stackId);
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);
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);
214 * This method is called to invoke a Rollback request to Valet.
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;
221 UriBuilder builder = UriBuilder.fromPath(this.baseUrl).path(this.basePath).path("{requestId}/rollback/");
222 URI uri = builder.build(requestId);
224 ValetRollbackRequest vrr = this.createValetRollbackRequest(stackId, suppressRollback, errorMessage);
226 String body = mapper.writeValueAsString(vrr);
227 HttpHeaders headers = generateHeaders(requestId);
228 HttpEntity<String> entity = new HttpEntity<>(body, headers);
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);
241 * This method is to construct the ValetCreateRequest pojo
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);
254 vcr.setVnfName(vnfName);
260 * This method is to construct the ValetUpdateRequest pojo
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);
279 * This method is to construct the ValetDeleteRequest pojo
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);
292 * This method is to construct the ValetDeleteRequest pojo
294 private ValetConfirmRequest createValetConfirmRequest(String stackId) {
295 ValetConfirmRequest vcr = new ValetConfirmRequest();
296 vcr.setStackId(stackId);
302 * This method is to construct the ValetRollbackRequest pojo
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);
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);
319 headers.add(ValetClient.REQ_ID_HEADER_NAME, requestId);
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);
331 gvr = new GenericValetResponse<>(-1, ValetClient.NO_STATUS_RETURNED, null);