From: Lott, Christopher (cl778h) Date: Tue, 25 Feb 2020 21:37:11 +0000 (-0500) Subject: Revise controllers to use ResponseEntity X-Git-Tag: 2.0.2~18 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=e0adfb63c5c6eb10bcea3bdf0d080e48aea38a51;p=portal%2Fric-dashboard.git Revise controllers to use ResponseEntity Drop use of HttpServletResponse and ErrorTransport; errors are now plain string, not JSON. Upgrade Spring-Boot to version 2.2.4.RELEASE from 2.1.11.RELEASE. Change-Id: I8d5747591706119f034cd650d7af9aaa569cf50a Signed-off-by: Lott, Christopher (cl778h) --- diff --git a/dashboard/pom.xml b/dashboard/pom.xml index ed9148dd..3723fc34 100644 --- a/dashboard/pom.xml +++ b/dashboard/pom.xml @@ -26,7 +26,7 @@ limitations under the License. org.springframework.boot spring-boot-starter-parent - 2.1.11.RELEASE + 2.2.4.RELEASE org.o-ran-sc.portal.ric-dashboard diff --git a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/A1MediatorController.java b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/A1MediatorController.java index 30f4092d..2b64e8d1 100644 --- a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/A1MediatorController.java +++ b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/A1MediatorController.java @@ -22,8 +22,6 @@ package org.oransc.ric.portal.dashboard.controller; import java.lang.invoke.MethodHandles; import java.util.List; -import javax.servlet.http.HttpServletResponse; - import org.oransc.ric.a1med.client.api.A1MediatorApi; import org.oransc.ric.a1med.client.model.PolicyTypeSchema; import org.oransc.ric.portal.dashboard.DashboardApplication; @@ -34,6 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.GetMapping; @@ -124,16 +123,16 @@ public class A1MediatorController { @ApiOperation(value = "Creates or replaces the specified policy instance at the A1 Mediator") @PutMapping(POLICY_INSTANCE_METHOD_PATH) @Secured({ DashboardConstants.ROLE_ADMIN }) - public void createPolicyInstance(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, + public ResponseEntity createPolicyInstance( + @PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, @PathVariable(PP_TYPE_ID) Integer policyTypeId, // @PathVariable(PP_INST_ID) String policyInstanceId, - @ApiParam(value = "Policy body") @RequestBody String policyBody, // - HttpServletResponse response) { + @ApiParam(value = "Policy body") @RequestBody String policyBody) { logger.debug("createPolicyInstance: instance {} typeId {} instanceId {}", instanceKey, policyTypeId, policyInstanceId); A1MediatorApi api = a1MediatorClientBuilder.getA1MediatorApi(instanceKey); api.a1ControllerCreateOrReplacePolicyInstance(policyTypeId, policyInstanceId, policyBody); - response.setStatus(api.getApiClient().getStatusCode().value()); + return ResponseEntity.status(api.getApiClient().getStatusCode().value()).body(null); } } diff --git a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AdminController.java b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AdminController.java index ce52f7a0..58e94810 100644 --- a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AdminController.java +++ b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AdminController.java @@ -22,14 +22,10 @@ package org.oransc.ric.portal.dashboard.controller; import java.lang.invoke.MethodHandles; import java.util.List; -import javax.servlet.http.HttpServletResponse; - import org.onap.portalsdk.core.restful.domain.EcompUser; import org.oransc.ric.portal.dashboard.DashboardApplication; import org.oransc.ric.portal.dashboard.DashboardConstants; import org.oransc.ric.portal.dashboard.DashboardUserManager; -import org.oransc.ric.portal.dashboard.model.ErrorTransport; -import org.oransc.ric.portal.dashboard.model.IDashboardResponse; import org.oransc.ric.portal.dashboard.model.RicRegion; import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.oransc.ric.portal.dashboard.model.RicRegionTransport; @@ -38,7 +34,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -114,7 +112,7 @@ public class AdminController { @ApiOperation(value = "Gets the kibana metrics URL for the specified app.", response = SuccessTransport.class) @GetMapping(XAPPMETRICS_METHOD) @Secured({ DashboardConstants.ROLE_ADMIN, DashboardConstants.ROLE_STANDARD }) - public IDashboardResponse getAppMetricsUrl(@RequestParam String app, HttpServletResponse response) { + public ResponseEntity getAppMetricsUrl(@RequestParam String app) { String metricsUrl = null; if (DashboardConstants.APP_NAME_AC.equals(app)) metricsUrl = acAppMetricsUrl; @@ -122,11 +120,8 @@ public class AdminController { metricsUrl = mcAppMetricsUrl; logger.debug("getAppMetricsUrl: app {} metricsurl {}", app, metricsUrl); if (metricsUrl != null) - return new SuccessTransport(200, metricsUrl); - else { - response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - return new ErrorTransport(400, "Client provided app name is invalid as: " + app); - } + return new ResponseEntity<>(new SuccessTransport(HttpStatus.OK.ordinal(), metricsUrl), HttpStatus.OK); + return ResponseEntity.badRequest().body("Client provided app name is invalid as: " + app); } } diff --git a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AppManagerController.java b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AppManagerController.java index 0a9d0c80..b9695f5b 100644 --- a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AppManagerController.java +++ b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AppManagerController.java @@ -21,8 +21,6 @@ package org.oransc.ric.portal.dashboard.controller; import java.lang.invoke.MethodHandles; -import javax.servlet.http.HttpServletResponse; - import org.oransc.ric.plt.appmgr.client.api.HealthApi; import org.oransc.ric.plt.appmgr.client.api.XappApi; import org.oransc.ric.plt.appmgr.client.model.AllDeployableXapps; @@ -43,6 +41,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.DeleteMapping; @@ -108,24 +107,23 @@ public class AppManagerController { @GetMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/" + HEALTH_ALIVE_METHOD) // No role required - public void getHealth(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, - HttpServletResponse response) { + public ResponseEntity getHealth(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey) { logger.debug("getHealthAlive instance {}", instanceKey); HealthApi api = appManagerApiBuilder.getHealthApi(instanceKey); api.getHealthAlive(); - response.setStatus(api.getApiClient().getStatusCode().value()); + return ResponseEntity.status(api.getApiClient().getStatusCode().value()).body(null); } @ApiOperation(value = "Readiness check of App Manager - Readiness probe.") @GetMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/" + HEALTH_READY_METHOD) // No role required - public void getHealthReady(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, - HttpServletResponse response) { + public ResponseEntity getHealthReady( + @PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey) { logger.debug("getHealthReady instance {}", instanceKey); HealthApi api = appManagerApiBuilder.getHealthApi(instanceKey); api.getHealthReady(); - response.setStatus(api.getApiClient().getStatusCode().value()); + return ResponseEntity.status(api.getApiClient().getStatusCode().value()).body(null); } @ApiOperation(value = "Returns the configuration of all Xapps.", response = AllXappConfig.class) @@ -191,12 +189,12 @@ public class AppManagerController { @ApiOperation(value = "Undeploy an existing xapp.") @DeleteMapping(XAPPS_METHOD_PATH + "/{" + PP_XAPP_NAME + "}") @Secured({ DashboardConstants.ROLE_ADMIN }) - public void undeployXapp(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, - @PathVariable(PP_XAPP_NAME) String appName, HttpServletResponse response) { + public ResponseEntity undeployXapp(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, + @PathVariable(PP_XAPP_NAME) String appName) { logger.debug("undeployXapp instance {} name {}", instanceKey, appName); XappApi api = appManagerApiBuilder.getXappApi(instanceKey); api.undeployXapp(appName); - response.setStatus(api.getApiClient().getStatusCode().value()); + return ResponseEntity.status(api.getApiClient().getStatusCode().value()).body(null); } } diff --git a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/CaasIngressController.java b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/CaasIngressController.java index 7d91f17b..455e1793 100644 --- a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/CaasIngressController.java +++ b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/CaasIngressController.java @@ -21,8 +21,6 @@ package org.oransc.ric.portal.dashboard.controller; import java.lang.invoke.MethodHandles; -import javax.servlet.http.HttpServletResponse; - import org.oransc.ric.portal.dashboard.DashboardConstants; import org.oransc.ric.portal.dashboard.config.SimpleKubernetesClientBuilder; import org.oransc.ric.portal.dashboard.k8sapi.SimpleKubernetesClient; @@ -30,8 +28,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.GetMapping; @@ -86,17 +84,17 @@ public class CaasIngressController { @GetMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/" + PODS_METHOD + "/" + PP_CLUSTER + "/{" + PP_CLUSTER + "}" + "/" + PP_NAMESPACE + "/{" + PP_NAMESPACE + "}") @Secured({ DashboardConstants.ROLE_ADMIN, DashboardConstants.ROLE_STANDARD }) - public String listPods(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, // + public ResponseEntity listPods(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, // @PathVariable(PP_CLUSTER) String cluster, // - @PathVariable(PP_NAMESPACE) String namespace, HttpServletResponse response) { + @PathVariable(PP_NAMESPACE) String namespace) { logger.debug("listPods: instance {} cluster {} namespace {}", instanceKey, cluster, namespace); SimpleKubernetesClient client = simpleKubernetesClientBuilder.getSimpleKubernetesClient(instanceKey); if (CLUSTER_PLT.equalsIgnoreCase(cluster) || CLUSTER_RIC.equalsIgnoreCase(cluster)) { - return client.listPods(namespace); + return ResponseEntity.ok().body(client.listPods(namespace)); } else { - logger.warn("listPods: unknown cluster {}", cluster); - response.setStatus(HttpStatus.BAD_REQUEST.value()); - return null; + final String msg = "listPods: unknown cluster " + cluster; + logger.warn(msg); + return ResponseEntity.badRequest().body(msg); } } diff --git a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/CustomResponseEntityExceptionHandler.java b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/CustomResponseEntityExceptionHandler.java index a8816162..e75dfcb1 100644 --- a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/CustomResponseEntityExceptionHandler.java +++ b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/CustomResponseEntityExceptionHandler.java @@ -22,7 +22,6 @@ package org.oransc.ric.portal.dashboard.controller; import java.lang.invoke.MethodHandles; import org.oransc.ric.portal.dashboard.exception.UnknownInstanceException; -import org.oransc.ric.portal.dashboard.model.ErrorTransport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; @@ -48,6 +47,19 @@ public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptio // Superclass has "logger" that is exposed here, so use a different name private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + /** + * Generates a message with an upper limit on size. + * + * @param t + * Throwable + * @return Message + */ + private String getShortExceptionMessage(Throwable t) { + final int enough = 256; + String exString = t.toString(); + return exString.length() > enough ? exString.substring(0, enough) : exString; + } + /** * Logs the error and generates a JSON response when a REST controller method * takes a RestClientResponseException. This is thrown by the Http client when a @@ -65,18 +77,17 @@ public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptio * @param request * The original request * - * @return A response entity with status code 502 plus some details in the body. + * @return A response entity with status code 502 and an unstructured message. */ @ExceptionHandler({ RestClientResponseException.class }) - public final ResponseEntity handleProxyMethodException(Exception ex, WebRequest request) { + public final ResponseEntity handleProxyMethodException(Exception ex, WebRequest request) { // Capture the full stack trace in the log. log.error("handleProxyMethodException: request {}, exception {}", request.getDescription(false), ex); if (ex instanceof HttpStatusCodeException) { HttpStatusCodeException hsce = (HttpStatusCodeException) ex; - return new ResponseEntity<>(new ErrorTransport(hsce.getRawStatusCode(), hsce.getResponseBodyAsString(), - ex.toString(), request.getDescription(false)), HttpStatus.BAD_GATEWAY); + return ResponseEntity.status(HttpStatus.BAD_GATEWAY).body(hsce.getResponseBodyAsString()); } else { - return new ResponseEntity<>(new ErrorTransport(500, ex), HttpStatus.BAD_GATEWAY); + return ResponseEntity.status(HttpStatus.BAD_GATEWAY).body(getShortExceptionMessage(ex)); } } @@ -87,13 +98,13 @@ public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptio * The exception * @param request * The original request - * @return A response entity with status code 400 + * @return A response entity with status code 400 and an unstructured message. */ @ExceptionHandler({ UnknownInstanceException.class }) - public final ResponseEntity handleUnknownInstanceException(Exception ex, WebRequest request) { + public final ResponseEntity handleUnknownInstanceException(Exception ex, WebRequest request) { log.warn("handleUnknownInstanceException: request {}, exception {}", request.getDescription(false), ex.toString()); - return new ResponseEntity<>(new ErrorTransport(400, ex), HttpStatus.BAD_REQUEST); + return ResponseEntity.badRequest().body(getShortExceptionMessage(ex)); } } diff --git a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/E2ManagerController.java b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/E2ManagerController.java index 749ecaeb..296d33be 100644 --- a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/E2ManagerController.java +++ b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/E2ManagerController.java @@ -23,8 +23,6 @@ import java.lang.invoke.MethodHandles; import java.util.ArrayList; import java.util.List; -import javax.servlet.http.HttpServletResponse; - import org.oransc.ric.e2mgr.client.api.HealthCheckApi; import org.oransc.ric.e2mgr.client.api.NodebApi; import org.oransc.ric.e2mgr.client.model.GetNodebResponse; @@ -41,6 +39,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.GetMapping; @@ -106,12 +105,11 @@ public class E2ManagerController { @ApiOperation(value = "Gets the health from the E2 manager, expressed as the response code.") @GetMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/" + HEALTH_METHOD) // No role required - public void healthGet(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, - HttpServletResponse response) { + public ResponseEntity healthGet(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey) { logger.debug("healthGet instance {}", instanceKey); HealthCheckApi api = e2ManagerApiBuilder.getHealthCheckApi(instanceKey); api.healthGet(); - response.setStatus(api.getApiClient().getStatusCode().value()); + return ResponseEntity.status(api.getApiClient().getStatusCode().value()).body(null); } // This calls other methods to simplify the task of the front-end. @@ -163,49 +161,49 @@ public class E2ManagerController { @PostMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/" + ENDC_SETUP_METHOD) @Secured({ DashboardConstants.ROLE_ADMIN }) - public void endcSetup(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, - @RequestBody SetupRequest setupRequest, HttpServletResponse response) { + public ResponseEntity endcSetup(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, + @RequestBody SetupRequest setupRequest) { logger.debug("endcSetup instance {} request {}", instanceKey, setupRequest); NodebApi api = e2ManagerApiBuilder.getNodebApi(instanceKey); api.endcSetup(setupRequest); - response.setStatus(api.getApiClient().getStatusCode().value()); + return ResponseEntity.status(api.getApiClient().getStatusCode().value()).body(null); } @ApiOperation(value = "Sets up an X2 RAN connection via the E2 manager.") @PostMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/" + X2_SETUP_METHOD) @Secured({ DashboardConstants.ROLE_ADMIN }) - public void x2Setup(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, - @RequestBody SetupRequest setupRequest, HttpServletResponse response) { + public ResponseEntity x2Setup(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, + @RequestBody SetupRequest setupRequest) { logger.debug("x2Setup instance {} request {}", instanceKey, setupRequest); NodebApi api = e2ManagerApiBuilder.getNodebApi(instanceKey); api.x2Setup(setupRequest); - response.setStatus(api.getApiClient().getStatusCode().value()); + return ResponseEntity.status(api.getApiClient().getStatusCode().value()).body(null); } @ApiOperation(value = "Close all connections to the RANs and delete the data from the nodeb-rnib DB.") @PutMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/" + NODEB_SHUTDOWN_METHOD) @Secured({ DashboardConstants.ROLE_ADMIN }) - public void nodebShutdownPut(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, - HttpServletResponse response) { + public ResponseEntity nodebShutdownPut( + @PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey) { logger.debug("nodebShutdownPut instance {}", instanceKey); NodebApi api = e2ManagerApiBuilder.getNodebApi(instanceKey); api.nodebShutdownPut(); - response.setStatus(api.getApiClient().getStatusCode().value()); + return ResponseEntity.status(api.getApiClient().getStatusCode().value()).body(null); + } @ApiOperation(value = "Abort any other ongoing procedures over X2 between the RIC and the RAN.") @PutMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/" + NODEB_PREFIX + "/{" + PP_RANNAME + "}/" + RESET_METHOD) @Secured({ DashboardConstants.ROLE_ADMIN }) - public void reset(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, - @PathVariable(PP_RANNAME) String ranName, @RequestBody ResetRequest resetRequest, - HttpServletResponse response) { + public ResponseEntity reset(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, + @PathVariable(PP_RANNAME) String ranName, @RequestBody ResetRequest resetRequest) { logger.debug("reset instance {} name {}", instanceKey, ranName); NodebApi api = e2ManagerApiBuilder.getNodebApi(instanceKey); api.reset(ranName, resetRequest); - response.setStatus(api.getApiClient().getStatusCode().value()); + return ResponseEntity.status(api.getApiClient().getStatusCode().value()).body(null); } } diff --git a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/ErrorTransport.java b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/ErrorTransport.java deleted file mode 100644 index 2a90fca5..00000000 --- a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/ErrorTransport.java +++ /dev/null @@ -1,139 +0,0 @@ -/*- - * ========================LICENSE_START================================= - * O-RAN-SC - * %% - * Copyright (C) 2019 AT&T Intellectual Property - * %% - * 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.oransc.ric.portal.dashboard.model; - -import java.time.Instant; - -/** - * This mimics the model Spring-Boot uses for a message returned on failure, to - * be serialized as JSON. - */ -public class ErrorTransport implements IDashboardResponse { - - private Instant timestamp; - private Integer status; - private String error; - private String message; - private String path; - - /** - * Builds an empty object. - */ - public ErrorTransport() { - // no-arg constructor - } - - /** - * Convenience constructor for minimal value set. - * - * @param status - * Integer value like 400 - * @param error - * Error message - */ - public ErrorTransport(int status, String error) { - this(status, error, null, null); - } - - /** - * Convenience constructor for populating an error from an exception - * - * @param status - * Integer value like 400 - * @param throwable - * The caught exception/throwable to convert to String with - * an upper bound on characters - */ - public ErrorTransport(int status, Throwable throwable) { - this.timestamp = Instant.now(); - this.status = status; - final int enough = 256; - String exString = throwable.toString(); - this.error = exString.length() > enough ? exString.substring(0, enough) : exString; - } - - /** - * Builds an object with all fields - * - * @param status - * Integer value like 500 - * @param error - * Explanation - * @param message - * Additional explanation - * @param path - * Requested path - */ - public ErrorTransport(int status, String error, String message, String path) { - this.timestamp = Instant.now(); - this.status = status; - this.error = error; - this.message = message; - this.path = path; - } - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public String getMessage() { - return message; - } - - public void setMessage(String error) { - this.message = error; - } - - public Instant getTimestamp() { - return timestamp; - } - - public void setTimestamp(Instant timestamp) { - this.timestamp = timestamp; - } - - public String getError() { - return error; - } - - public void setError(String error) { - this.error = error; - } - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - @Override - public String toString() { - return this.getClass().getSimpleName() + "[timestamp=" + getTimestamp() + ", error=" + getError() + ", path=" - + getPath() + "]"; - } - -} diff --git a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/SuccessTransport.java b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/SuccessTransport.java index 281d72f4..a3b38e43 100644 --- a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/SuccessTransport.java +++ b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/SuccessTransport.java @@ -19,8 +19,13 @@ */ package org.oransc.ric.portal.dashboard.model; +/** + * Trivial POJO used to transport scalar data like integer or string wrapped in + * a JSON structure. + */ public class SuccessTransport implements IDashboardResponse { + // Status is redundant :/ private int status; private Object data; diff --git a/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/AdminControllerExtension.java b/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/AdminControllerExtension.java index 77833365..dedbadce 100644 --- a/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/AdminControllerExtension.java +++ b/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/AdminControllerExtension.java @@ -20,6 +20,7 @@ package org.oransc.ric.portal.dashboard.controller; import java.lang.invoke.MethodHandles; +import java.nio.charset.Charset; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,8 +50,10 @@ public class AdminControllerExtension { @GetMapping(HTTP_STATUS_CODE_EXCEPTION_METHOD) public void throwHttpStatusCodeException() { - logger.warn("throwing HttpStatusCodeException"); - throw new HttpClientErrorException(HttpStatus.CHECKPOINT, "simulate http status code exception"); + logger.warn("throwing HttpClientErrorException"); + final String mockResponseBody = "mock http status code exception"; + throw new HttpClientErrorException(HttpStatus.CHECKPOINT, "mock status", mockResponseBody.getBytes(), + Charset.defaultCharset()); } @GetMapping(REST_CLIENT_RESPONSE_EXCEPTION_METHOD) diff --git a/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/AdminControllerTest.java b/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/AdminControllerTest.java index 02534fb0..fa1a832d 100644 --- a/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/AdminControllerTest.java +++ b/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/AdminControllerTest.java @@ -29,7 +29,6 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.onap.portalsdk.core.restful.domain.EcompUser; import org.oransc.ric.portal.dashboard.DashboardConstants; -import org.oransc.ric.portal.dashboard.model.ErrorTransport; import org.oransc.ric.portal.dashboard.model.RicInstanceKeyName; import org.oransc.ric.portal.dashboard.model.SuccessTransport; import org.slf4j.Logger; @@ -117,9 +116,9 @@ public class AdminControllerTest extends AbstractControllerTest { metricsQueryParms.put("app", "ABCD"); URI uri = buildUri(metricsQueryParms, AdminController.CONTROLLER_PATH, AdminController.XAPPMETRICS_METHOD); logger.debug("Invoking {}", uri); - ResponseEntity errorResponse = testRestTemplateStandardRole().exchange(uri, HttpMethod.GET, - null, ErrorTransport.class); - logger.debug("{}", errorResponse.getBody().getError().toString()); + ResponseEntity errorResponse = testRestTemplateStandardRole().exchange(uri, HttpMethod.GET, null, + String.class); + logger.debug("{}", errorResponse.getBody().toString()); Assertions.assertTrue(errorResponse.getStatusCode().is4xxClientError()); } @@ -128,10 +127,10 @@ public class AdminControllerTest extends AbstractControllerTest { URI uri = buildUri(null, AdminController.CONTROLLER_PATH, AdminControllerExtension.HTTP_STATUS_CODE_EXCEPTION_METHOD); logger.debug("Invoking {}", uri); - ResponseEntity errorResponse = testRestTemplateStandardRole().exchange(uri, HttpMethod.GET, - null, ErrorTransport.class); - logger.debug("{}", errorResponse.getBody().getError().toString()); - Assertions.assertTrue(errorResponse.getStatusCode().is5xxServerError()); + ResponseEntity response = testRestTemplateStandardRole().exchange(uri, HttpMethod.GET, null, + String.class); + logger.debug("{}", response.getBody().toString()); + Assertions.assertTrue(response.getStatusCode().is5xxServerError()); } @Test @@ -139,9 +138,9 @@ public class AdminControllerTest extends AbstractControllerTest { URI uri = buildUri(null, AdminController.CONTROLLER_PATH, AdminControllerExtension.REST_CLIENT_RESPONSE_EXCEPTION_METHOD); logger.debug("Invoking {}", uri); - ResponseEntity errorResponse = testRestTemplateStandardRole().exchange(uri, HttpMethod.GET, - null, ErrorTransport.class); - logger.debug("{}", errorResponse.getBody().getError().toString()); + ResponseEntity errorResponse = testRestTemplateStandardRole().exchange(uri, HttpMethod.GET, null, + String.class); + logger.debug("{}", errorResponse.getBody()); Assertions.assertTrue(errorResponse.getStatusCode().is5xxServerError()); } diff --git a/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/CaasIngressControllerTest.java b/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/CaasIngressControllerTest.java index b91c44c6..e7145df0 100644 --- a/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/CaasIngressControllerTest.java +++ b/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/CaasIngressControllerTest.java @@ -22,7 +22,6 @@ package org.oransc.ric.portal.dashboard.controller; import java.lang.invoke.MethodHandles; import java.net.URI; -import org.junit.Assert; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.oransc.ric.portal.dashboard.DashboardConstants; @@ -55,7 +54,8 @@ public class CaasIngressControllerTest extends AbstractControllerTest { CaasIngressController.PP_CLUSTER, "cluster", CaasIngressController.PP_NAMESPACE, nsPlt); logger.info("Invoking {}", uri); String s = testRestTemplateStandardRole().getForObject(uri, String.class); - Assert.assertNull(s); + Assertions.assertFalse(s.isEmpty()); + Assertions.assertTrue(s.contains("unknown")); } // Unknown namespace triggers a controller exception diff --git a/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/model/ModelTest.java b/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/model/ModelTest.java index c668afc1..8e2ddeb9 100644 --- a/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/model/ModelTest.java +++ b/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/model/ModelTest.java @@ -67,29 +67,6 @@ public class ModelTest extends AbstractModelTest { logger.info(eud.toString()); } - private void checkErrorTransport(ErrorTransport m) { - Assert.assertEquals(s1, m.getError()); - Assert.assertEquals(s2, m.getMessage()); - Assert.assertEquals(s3, m.getPath()); - Assert.assertEquals(i1, m.getStatus()); - Assert.assertEquals(t1, m.getTimestamp()); - } - - @Test - public void testErrorTransport() { - ErrorTransport m = new ErrorTransport(i1, s1); - m = new ErrorTransport(i1, new Exception()); - m = new ErrorTransport(i1, s1, s2, s3); - m = new ErrorTransport(); - m.setError(s1); - m.setMessage(s2); - m.setPath(s3); - m.setStatus(i1); - m.setTimestamp(t1); - checkErrorTransport(m); - logger.info(m.toString()); - } - private void checkInstanceTransport(RicInstanceKeyName m) { Assert.assertEquals(s1, m.getKey()); Assert.assertEquals(s2, m.getName()); diff --git a/docs/release-notes.rst b/docs/release-notes.rst index 27fccfcb..03c6eb7a 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -5,8 +5,10 @@ RIC Dashboard Release Notes =========================== -Version 2.0.1, ? Feb 2020 +Version 2.0.1, 26 Feb 2020 -------------------------- +* Revise controllers to use ResponseEntity +* Upgrade to Spring-Boot 2.2.4.RELEASE Version 2.0.0, 5 Feb 2020 --------------------------