diff options
author | wr148d <wr148d@att.com> | 2021-02-11 09:14:58 -0500 |
---|---|---|
committer | wr148d <wr148d@att.com> | 2021-02-11 09:16:26 -0500 |
commit | 4d750d21cffd991b4bc5b735455fc9fceb516937 (patch) | |
tree | 6465cd80ca211e1581e4600857a81137dc8c7865 /sparkybe-onap-service | |
parent | fc96fb063d9acc08173ef659088a993baf5c0dbf (diff) |
Update the Sparky backend to support proxying calls to resources and traversal
Issue-ID: AAI-3250
Change-Id: I1c4d587ca30ea379ae28697b95ba2ca4602cd4e8
Signed-off-by: wr148d <wr148d@att.com>
Diffstat (limited to 'sparkybe-onap-service')
-rw-r--r-- | sparkybe-onap-service/src/main/java/org/onap/aai/sparky/exception/ProxyServiceException.java | 36 | ||||
-rw-r--r-- | sparkybe-onap-service/src/main/java/org/onap/aai/sparky/util/ProxyClient.java | 293 |
2 files changed, 329 insertions, 0 deletions
diff --git a/sparkybe-onap-service/src/main/java/org/onap/aai/sparky/exception/ProxyServiceException.java b/sparkybe-onap-service/src/main/java/org/onap/aai/sparky/exception/ProxyServiceException.java new file mode 100644 index 0000000..3c6a59b --- /dev/null +++ b/sparkybe-onap-service/src/main/java/org/onap/aai/sparky/exception/ProxyServiceException.java @@ -0,0 +1,36 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2021 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.aai.sparky.exception; + +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.http.HttpStatus; + +@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) +public class ProxyServiceException extends RuntimeException { + + + private static final long serialVersionUID = 1L; + + public ProxyServiceException(String exception) { + super(exception); + } + +} diff --git a/sparkybe-onap-service/src/main/java/org/onap/aai/sparky/util/ProxyClient.java b/sparkybe-onap-service/src/main/java/org/onap/aai/sparky/util/ProxyClient.java new file mode 100644 index 0000000..4b057d8 --- /dev/null +++ b/sparkybe-onap-service/src/main/java/org/onap/aai/sparky/util/ProxyClient.java @@ -0,0 +1,293 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 Amdocs + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.aai.sparky.util; + +import org.onap.aai.cl.mdc.MdcContext; +import org.onap.aai.restclient.client.OperationResult; +import org.onap.aai.restclient.client.RestClient; +import org.onap.aai.restclient.enums.RestAuthenticationMode; +import org.onap.aai.sparky.dal.rest.RestClientConstructionException; +import org.onap.aai.sparky.dal.rest.RestClientFactory; +import org.onap.aai.sparky.dal.rest.config.RestEndpointConfig; +import org.onap.aai.sparky.util.Encryptor; +import org.onap.aai.sparky.viewandinspect.config.SparkyConstants; +import org.onap.aai.sparky.exception.ProxyServiceException; +import org.slf4j.MDC; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.IOException; +import java.util.*; + +public class ProxyClient { + private RestEndpointConfig endpointConfig; + private RestClient restClient; + private RestClient historyRestClient; + private RestClient apertureRestClient; + private static final String HEADER_AUTHORIZATION = "Authorization"; + Map<String, List<String>> headers; + + /** + * Proxy Client Service + * + * @param endpointConfig the configuration for the endpoints to call + */ + public ProxyClient(RestEndpointConfig endpointConfig) + throws IOException, RestClientConstructionException { + + this.endpointConfig = endpointConfig; + + if (endpointConfig.getRestAuthenticationMode() == RestAuthenticationMode.SSL_BASIC) { + String basicAuthPassword = endpointConfig.getBasicAuthPassword(); + if (basicAuthPassword != null && basicAuthPassword.startsWith("OBF:")) { + org.onap.aai.sparky.util.Encryptor enc = new Encryptor(); + endpointConfig.setBasicAuthPassword(enc.decryptValue(basicAuthPassword)); + } + } + this.restClient = RestClientFactory.buildClient(endpointConfig); + setHeaders(); + } + + public RestEndpointConfig getEndpointConfig() { + return endpointConfig; + } + + protected String getBasicAuthenticationCredentials() { + + String usernameAndPassword = String.join(":", endpointConfig.getBasicAuthUserName(), + endpointConfig.getBasicAuthPassword()); + return "Basic " + java.util.Base64.getEncoder().encodeToString(usernameAndPassword.getBytes()); + } + + /** + * Method to set common headers + * + */ + public void setHeaders() { + this.headers = new HashMap<>(); + headers.put("X-FromAppId", Arrays.asList("AAI-UI")); + headers.put("X-TransactionId", Arrays.asList(MDC.get(MdcContext.MDC_REQUEST_ID))); + //headers.put("X-FromAppId", Arrays.asList(MDC.get(MdcContext.MDC_PARTNER_NAME))); + if (endpointConfig.getRestAuthenticationMode() == RestAuthenticationMode.SSL_BASIC) { + headers.putIfAbsent(HEADER_AUTHORIZATION, new ArrayList<String>()); + headers.get(HEADER_AUTHORIZATION).add(getBasicAuthenticationCredentials()); + } + } + + /** + * Method to set headers from request + * + */ + public void populateHeadersFromRequest(HttpServletRequest request) { + List<String> includeList = Arrays.asList("X-DslApiVersion"); + Enumeration<String> names = request.getHeaderNames(); + while (names.hasMoreElements()) { + String name = names.nextElement(); + String value = request.getHeader(name); + if(includeList.contains(name)) { + this.headers.put(name, Arrays.asList(value)); + } + } + this.headers.put("X-DslApiVersion",Arrays.asList("V2")); + } + + /** + * Method to get rest client + * + */ + public RestClient getRestClient(HttpServletRequest request) { + if(isHistory(request.getRequestURL().substring(request.getRequestURL().lastIndexOf("/proxy") + 6))){ + return this.historyRestClient; + }else if(isAperture(request.getRequestURL().substring(request.getRequestURL().lastIndexOf("/proxy") + 6))) { + return this.apertureRestClient; + }else{ + return this.restClient; + } + } + + /** + * Get server string from config + * + * @return the server url as a string + */ + public String getServer(RestEndpointConfig epc) { + switch (epc.getRestAuthenticationMode()) { + case SSL_BASIC: + case SSL_CERT: { + return String.format("https://%s:%s", epc.getEndpointIpAddress(), + epc.getEndpointServerPort()); + } + default: { + return String.format("http://%s:%s", epc.getEndpointIpAddress(), + epc.getEndpointServerPort()); + } + } + + } + + /** + * Get the request body from a request for use on the proxy call + * + * @param request + * @return the request's body in string form + */ + private String getRequestBody(final HttpServletRequest request) { + final StringBuilder builder = new StringBuilder(); + try (BufferedReader reader = request.getReader()) { + if (reader == null) { + return null; + } + String line; + while ((line = reader.readLine()) != null) { + builder.append(line); + } + return builder.toString(); + } catch (final Exception e) { + return null; + } + } + + /** + * Get whether the incoming call was a history call or not + * + * @param uri + * @return true or false if it is a history traversal call + */ + private Boolean isHistory(String uri){ + String[] tokens = uri.split("/"); + return tokens.length >= 3 && tokens[2].equals("history-traversal"); + } + + /** + * Get whether the incoming call was a aperture call or not + * + * @param uri + * @return true or false if it is a aperture traversal call + */ + private Boolean isAperture(String uri){ + String[] tokens = uri.split("/"); + return tokens[2].equals("aperture"); + } + + + /** + * Build Url, builds the full url to call + * + * @param request + * @return the string of the endpoint to call + */ + public String buildUrl(HttpServletRequest request) { + RestEndpointConfig epc = endpointConfig; + String uri = + request.getRequestURL().substring(request.getRequestURL().lastIndexOf("/proxy") + 6); + String server = getServer(epc); + if (request.getQueryString() != null) { + uri = String.format("%s?%s", uri, request.getQueryString()); + } + return String.format("%s%s", server, uri); + } + + /** + * Method to make the get call to proxy + * + * @param request + * @return the operation result object from the call + */ + public OperationResult get(HttpServletRequest request) { + OperationResult resp = null; + String url = buildUrl(request); + this.populateHeadersFromRequest(request); + try { + resp = (getRestClient(request)).get(url, this.headers, MediaType.APPLICATION_JSON_TYPE); + } catch (Exception e) { + throw new ProxyServiceException("Exception while processing GET request- " + e); + } + return resp; + } + + /** + * Method to make the post call to proxy + * + * @param request + * @return the operation result object from the call + */ + public OperationResult post(HttpServletRequest request) { + OperationResult resp = null; + String url = buildUrl(request); + this.populateHeadersFromRequest(request); + try { + resp = (getRestClient(request)).post(url, getRequestBody(request), this.headers, + MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE); + } catch (Exception e) { + throw new ProxyServiceException("Exception while processing POST request- " + e); + } + return resp; + } + + /** + * Method to make the patch call to proxy + * + * @param request + * @return the operation result object from the call + */ + public OperationResult bulkSingleTransaction(HttpServletRequest request, String attuid) { + OperationResult resp = null; + Map<String, List<String>> updatedHeaders = this.headers; + String url; + RestEndpointConfig epc = endpointConfig; + String uri = request.getRequestURL().substring(request.getRequestURL().lastIndexOf("/aai")); + String server = getServer(epc); + if (request.getQueryString() != null) { + uri = String.format("%s?%s", uri, request.getQueryString()); + } + url = String.format("%s%s", server, uri); + this.populateHeadersFromRequest(request); + updatedHeaders.put("X-FromAppId", Arrays.asList("AAI-UI-" + attuid)); + try { + resp = (getRestClient(request)).post(url, getRequestBody(request), updatedHeaders, + MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE); + } catch (Exception e) { + throw new ProxyServiceException("Exception while processing PATCH request- " + e); + } + return resp; + } + + /** + * Method to make the put call to proxy + * + * @param request + * @return the operation result object from the call + */ + public OperationResult put(HttpServletRequest request) { + OperationResult resp = null; + String url = buildUrl(request); + this.populateHeadersFromRequest(request); + try { + resp = (getRestClient(request)).put(url, getRequestBody(request), this.headers, + MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE); + } catch (Exception e) { + throw new ProxyServiceException("Exception while processing PUT request- " + e); + } + return resp; + } +} |