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.web.client.RestTemplate;
54 import org.springframework.stereotype.Component;
56 import com.fasterxml.jackson.databind.ObjectMapper;
59 public class ValetClient {
60 private static MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA, ValetClient.class);
63 private Environment environment;
65 private static final String VALET_BASE_URL = "org.onap.so.adapters.valet.base_url";
66 private static final String VALET_BASE_PATH = "org.onap.so.adapters.valet.base_path";
67 private static final String VALET_AUTH = "org.onap.so.adapters.valet.basic_auth";
68 private static final String REQ_ID_HEADER_NAME = "X-RequestID";
69 protected static final String NO_STATUS_RETURNED = "no status returned from Valet";
71 private static final String DEFAULT_BASE_URL = "http://localhost:8080/";
72 private static final String DEFAULT_BASE_PATH = "api/valet/placement/v1";
73 private static final String DEFAULT_AUTH_STRING = "";
74 private static final String REQUEST_ID="requestId";
75 private static final String HEADERS=", headers=";
76 private static final String BODY=", body=";
78 private ObjectMapper mapper;
80 protected String baseUrl;
81 protected String basePath;
82 protected String authString;
85 * Setup the properties needed from properties file. Each will fall to a default
88 private void setupParams() {
90 this.baseUrl = this.environment.getProperty(ValetClient.VALET_BASE_URL, ValetClient.DEFAULT_BASE_URL);
91 this.basePath = this.environment.getProperty(ValetClient.VALET_BASE_PATH, ValetClient.DEFAULT_BASE_PATH);
92 this.authString = this.environment.getProperty(ValetClient.VALET_AUTH, ValetClient.DEFAULT_AUTH_STRING);
93 } catch (Exception e) {
94 LOGGER.debug("Error retrieving valet properties. " + e.getMessage());
99 * This method will be invoked to send a Create request to Valet.
101 public GenericValetResponse<ValetCreateResponse> callValetCreateRequest(String requestId, String regionId, String tenantId, String serviceInstanceId,
102 String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) throws Exception {
103 ResponseEntity<ValetCreateResponse> response = null;
104 GenericValetResponse<ValetCreateResponse> gvr = null;
107 UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
108 URI uri = builder.build();
110 ValetCreateRequest vcr = this.createValetCreateRequest(regionId, tenantId, serviceInstanceId, vnfId, vnfName, vfModuleId, vfModuleName, keystoneUrl, heatRequest);
111 RestTemplate restTemplate = new RestTemplate();
112 String body = mapper.writeValueAsString(vcr);
113 HttpHeaders headers = generateHeaders(requestId);
114 HttpEntity<String> entity = new HttpEntity<>(body, headers);
115 LOGGER.debug("valet create req: " + uri.toString() + HEADERS + headers.toString() + BODY + body);
117 response = restTemplate.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);
127 * This method will be invoked to send an Update request to Valet.
129 public GenericValetResponse<ValetUpdateResponse> callValetUpdateRequest(String requestId, String regionId, String tenantId, String serviceInstanceId,
130 String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) throws Exception {
131 ResponseEntity<ValetUpdateResponse> response = null;
132 GenericValetResponse<ValetUpdateResponse> gvr = null;
135 UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
136 URI uri = builder.build();
138 ValetUpdateRequest vur = this.createValetUpdateRequest(regionId, tenantId, serviceInstanceId, vnfId, vnfName, vfModuleId, vfModuleName, keystoneUrl, heatRequest);
139 RestTemplate restTemplate = new RestTemplate();
140 String body = mapper.writeValueAsString(vur);
141 HttpHeaders headers = generateHeaders(requestId);
142 HttpEntity<String> entity = new HttpEntity<>(body, headers);
143 LOGGER.debug("valet update req: " + uri.toString() + HEADERS + headers.toString() + BODY + body);
145 response = restTemplate.exchange(uri, HttpMethod.PUT, entity, ValetUpdateResponse.class);
146 gvr = this.getGVRFromResponse(response);
147 } catch (Exception e) {
148 LOGGER.error("An exception occurred in callValetUpdateRequest", e);
155 * This method will be invoked to send a Delete request to Valet.
157 public GenericValetResponse<ValetDeleteResponse> callValetDeleteRequest(String requestId, String regionId, String tenantId, String vfModuleId, String vfModuleName) throws Exception {
158 ResponseEntity<ValetDeleteResponse> response = null;
159 GenericValetResponse<ValetDeleteResponse> gvr = null;
162 UriBuilder builder = UriBuilder.fromPath(baseUrl).path(basePath).queryParam(REQUEST_ID, requestId);
163 URI uri = builder.build();
165 ValetDeleteRequest vdr = this.createValetDeleteRequest(regionId, tenantId, vfModuleId, vfModuleName);
166 RestTemplate restTemplate = new RestTemplate();
167 String body = mapper.writeValueAsString(vdr);
168 HttpHeaders headers = generateHeaders(requestId);
169 HttpEntity<String> entity = new HttpEntity<>(body, headers);
170 LOGGER.debug("valet delete req: " + uri.toString() + HEADERS + headers.toString() + ", body=" + body);
172 response = restTemplate.exchange(uri, HttpMethod.DELETE, entity, ValetDeleteResponse.class);
173 gvr = this.getGVRFromResponse(response);
174 } catch (Exception e) {
175 LOGGER.error("An exception occurred in callValetDeleteRequest", e);
182 * This method is called to invoke a Confirm request to Valet.
184 public GenericValetResponse<ValetConfirmResponse> callValetConfirmRequest(String requestId, String stackId) throws Exception {
185 ResponseEntity<ValetConfirmResponse> response = null;
186 GenericValetResponse<ValetConfirmResponse> gvr = null;
189 UriBuilder builder = UriBuilder.fromPath(this.baseUrl).path(this.basePath).path("{requestId}/confirm/");
190 URI uri = builder.build(requestId);
192 ValetConfirmRequest vcr = this.createValetConfirmRequest(stackId);
193 RestTemplate restTemplate = new RestTemplate();
194 String body = mapper.writeValueAsString(vcr);
195 HttpHeaders headers = generateHeaders(requestId);
196 HttpEntity<String> entity = new HttpEntity<>(body, headers);
197 LOGGER.debug("valet confirm req: " + uri.toString() + HEADERS + headers.toString() + BODY + body);
199 response = restTemplate.exchange(uri, HttpMethod.PUT, entity, ValetConfirmResponse.class);
200 gvr = this.getGVRFromResponse(response);
201 } catch (Exception e) {
202 LOGGER.error("An exception occurred in callValetConfirmRequest", e);
209 * This method is called to invoke a Rollback request to Valet.
211 public GenericValetResponse<ValetRollbackResponse> callValetRollbackRequest(String requestId, String stackId, Boolean suppressRollback, String errorMessage) throws Exception {
212 ResponseEntity<ValetRollbackResponse> response = null;
213 GenericValetResponse<ValetRollbackResponse> gvr = null;
216 UriBuilder builder = UriBuilder.fromPath(this.baseUrl).path(this.basePath).path("{requestId}/rollback/");
217 URI uri = builder.build(requestId);
219 ValetRollbackRequest vrr = this.createValetRollbackRequest(stackId, suppressRollback, errorMessage);
220 RestTemplate restTemplate = new RestTemplate();
221 String body = mapper.writeValueAsString(vrr);
222 HttpHeaders headers = generateHeaders(requestId);
223 HttpEntity<String> entity = new HttpEntity<>(body, headers);
224 LOGGER.debug("valet rollback req: " + uri.toString() + HEADERS + headers.toString() + BODY + body);
226 response = restTemplate.exchange(uri, HttpMethod.PUT, entity, ValetRollbackResponse.class);
227 gvr = this.getGVRFromResponse(response);
228 } catch (Exception e) {
229 LOGGER.error("An exception occurred in callValetRollbackRequest", e);
236 * This method is to construct the ValetCreateRequest pojo
238 private ValetCreateRequest createValetCreateRequest(String regionId, String tenantId, String serviceInstanceId,
239 String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) {
240 ValetCreateRequest vcr = new ValetCreateRequest();
241 vcr.setHeatRequest(heatRequest);
242 vcr.setKeystoneUrl(keystoneUrl);
243 vcr.setRegionId(regionId);
244 vcr.setServiceInstanceId(serviceInstanceId);
245 vcr.setTenantId(tenantId);
246 vcr.setVfModuleId(vfModuleId);
247 vcr.setVfModuleName(vfModuleName);
249 vcr.setVnfName(vnfName);
255 * This method is to construct the ValetUpdateRequest pojo
257 private ValetUpdateRequest createValetUpdateRequest(String regionId, String tenantId, String serviceInstanceId,
258 String vnfId, String vnfName, String vfModuleId, String vfModuleName, String keystoneUrl, HeatRequest heatRequest) {
259 ValetUpdateRequest vur = new ValetUpdateRequest();
260 vur.setHeatRequest(heatRequest);
261 vur.setKeystoneUrl(keystoneUrl);
262 vur.setRegionId(regionId == null ? "" : regionId);
263 vur.setServiceInstanceId(serviceInstanceId == null ? "" : serviceInstanceId);
264 vur.setTenantId(tenantId == null ? "" : tenantId);
265 vur.setVfModuleId(vfModuleId == null ? "" : vfModuleId);
266 vur.setVfModuleName(vfModuleName == null ? "" : vfModuleName);
267 vur.setVnfId(vnfId == null ? "" : vnfId);
268 vur.setVnfName(vnfName == null ? "" : vnfName);
274 * This method is to construct the ValetDeleteRequest pojo
276 private ValetDeleteRequest createValetDeleteRequest(String regionId, String tenantId, String vfModuleId, String vfModuleName) {
277 ValetDeleteRequest vdr = new ValetDeleteRequest();
278 vdr.setRegionId(regionId == null ? "" : regionId);
279 vdr.setTenantId(tenantId == null ? "" : tenantId);
280 vdr.setVfModuleId(vfModuleId == null ? "" : vfModuleId);
281 vdr.setVfModuleName(vfModuleName == null ? "" : vfModuleName);
287 * This method is to construct the ValetDeleteRequest pojo
289 private ValetConfirmRequest createValetConfirmRequest(String stackId) {
290 ValetConfirmRequest vcr = new ValetConfirmRequest();
291 vcr.setStackId(stackId);
297 * This method is to construct the ValetRollbackRequest pojo
299 private ValetRollbackRequest createValetRollbackRequest(String stackId, Boolean suppressRollback, String errorMessage) {
300 ValetRollbackRequest vrr = new ValetRollbackRequest();
301 vrr.setStackId(stackId);
302 vrr.setSuppressRollback(suppressRollback);
303 vrr.setErrorMessage(errorMessage);
308 private HttpHeaders generateHeaders(String requestId) {
309 HttpHeaders headers = new HttpHeaders();
310 headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
311 if (!(this.authString == null || this.authString.isEmpty())) {
312 headers.add("Authorization", "Basic " + this.authString);
314 headers.add(ValetClient.REQ_ID_HEADER_NAME, requestId);
319 private <T> GenericValetResponse<T> getGVRFromResponse(ResponseEntity<T> response) {
320 GenericValetResponse<T> gvr = null;
321 if (response != null) {
322 T responseObj = response.getBody();
323 gvr = new GenericValetResponse<>(response.getStatusCodeValue(), ValetClient.NO_STATUS_RETURNED, responseObj);
326 gvr = new GenericValetResponse<>(-1, ValetClient.NO_STATUS_RETURNED, null);