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 * 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
15 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
25 package org.onap.so.adapters.valet;
27 import com.fasterxml.jackson.databind.ObjectMapper;
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;
57 public class ValetClient {
59 private static Logger logger = LoggerFactory.getLogger(ValetClient.class);
62 private Environment environment;
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";
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=";
77 private ObjectMapper mapper;
79 protected String baseUrl;
80 protected String basePath;
81 protected String authString;
84 * Setup the properties needed from properties file. Each will fall to a default
87 private void setupParams() {
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());
98 * This method will be invoked to send a Create request to Valet.
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;
106 UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
107 URI uri = builder.build();
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);
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);
123 private RestTemplate getRestTemplate(){
124 RestTemplate restTemplate = new RestTemplate();
125 restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory()));
130 * This method will be invoked to send an Update request to Valet.
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;
138 UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
139 URI uri = builder.build();
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);
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);
157 * This method will be invoked to send a Delete request to Valet.
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;
164 UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
165 URI uri = builder.build();
167 ValetDeleteRequest vdr = this.createValetDeleteRequest(regionId, ownerId, tenantId, vfModuleId, vfModuleName);
169 String body = mapper.writeValueAsString(vdr);
170 HttpHeaders headers = generateHeaders(requestId);
171 HttpEntity<String> entity = new HttpEntity<>(body, headers);
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);
184 * This method is called to invoke a Confirm request to Valet.
186 public GenericValetResponse<ValetConfirmResponse> callValetConfirmRequest(String requestId, String stackId) throws Exception {
187 ResponseEntity<ValetConfirmResponse> response = null;
188 GenericValetResponse<ValetConfirmResponse> gvr = null;
191 UriBuilder builder = UriBuilder.fromPath(this.baseUrl).path(this.basePath).path("{requestId}/confirm/");
192 URI uri = builder.build(requestId);
194 ValetConfirmRequest vcr = this.createValetConfirmRequest(stackId);
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);
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);
211 * This method is called to invoke a Rollback request to Valet.
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;
218 UriBuilder builder = UriBuilder.fromPath(this.baseUrl).path(this.basePath).path("{requestId}/rollback/");
219 URI uri = builder.build(requestId);
221 ValetRollbackRequest vrr = this.createValetRollbackRequest(stackId, suppressRollback, errorMessage);
223 String body = mapper.writeValueAsString(vrr);
224 HttpHeaders headers = generateHeaders(requestId);
225 HttpEntity<String> entity = new HttpEntity<>(body, headers);
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);
238 * This method is to construct the ValetCreateRequest pojo
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);
252 vcr.setVnfName(vnfName);
258 * This method is to construct the ValetUpdateRequest pojo
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);
278 * This method is to construct the ValetDeleteRequest pojo
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);
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);