Revise controllers to use ResponseEntity 78/2578/3
authorLott, Christopher (cl778h) <cl778h@att.com>
Tue, 25 Feb 2020 21:37:11 +0000 (16:37 -0500)
committerLott, Christopher (cl778h) <cl778h@att.com>
Wed, 26 Feb 2020 14:55:49 +0000 (09:55 -0500)
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) <cl778h@att.com>
14 files changed:
dashboard/pom.xml
dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/A1MediatorController.java
dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AdminController.java
dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AppManagerController.java
dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/CaasIngressController.java
dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/CustomResponseEntityExceptionHandler.java
dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/E2ManagerController.java
dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/ErrorTransport.java [deleted file]
dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/SuccessTransport.java
dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/AdminControllerExtension.java
dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/AdminControllerTest.java
dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/CaasIngressControllerTest.java
dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/model/ModelTest.java
docs/release-notes.rst

index ed9148d..3723fc3 100644 (file)
@@ -26,7 +26,7 @@ limitations under the License.
                <!-- this group Id must match LF gerrit repository -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
-               <version>2.1.11.RELEASE</version>
+               <version>2.2.4.RELEASE</version>
                <relativePath /> <!-- lookup parent from repository -->
        </parent>
        <groupId>org.o-ran-sc.portal.ric-dashboard</groupId>
index 30f4092..2b64e8d 100644 (file)
@@ -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<String> 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);
        }
 
 }
index ce52f7a..58e9481 100644 (file)
@@ -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<Object> 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);
        }
 
 }
index 0a9d0c8..b9695f5 100644 (file)
@@ -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<String> 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<String> 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<String> 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);
        }
 
 }
index 7d91f17..455e179 100644 (file)
@@ -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<String> 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);
                }
        }
 
index a881616..e75dfcb 100644 (file)
@@ -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<ErrorTransport> handleProxyMethodException(Exception ex, WebRequest request) {
+       public final ResponseEntity<String> 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<ErrorTransport> handleUnknownInstanceException(Exception ex, WebRequest request) {
+       public final ResponseEntity<String> 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));
        }
 
 }
index 749ecae..296d33b 100644 (file)
@@ -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<String> 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<String> 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<String> 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<String> 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<String> 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 (file)
index 2a90fca..0000000
+++ /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() + "]";
-       }
-
-}
index 281d72f..a3b38e4 100644 (file)
  */
 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;
 
index 7783336..dedbadc 100644 (file)
@@ -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)
index 02534fb..fa1a832 100644 (file)
@@ -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<ErrorTransport> errorResponse = testRestTemplateStandardRole().exchange(uri, HttpMethod.GET,
-                               null, ErrorTransport.class);
-               logger.debug("{}", errorResponse.getBody().getError().toString());
+               ResponseEntity<String> 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<ErrorTransport> errorResponse = testRestTemplateStandardRole().exchange(uri, HttpMethod.GET,
-                               null, ErrorTransport.class);
-               logger.debug("{}", errorResponse.getBody().getError().toString());
-               Assertions.assertTrue(errorResponse.getStatusCode().is5xxServerError());
+               ResponseEntity<String> 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<ErrorTransport> errorResponse = testRestTemplateStandardRole().exchange(uri, HttpMethod.GET,
-                               null, ErrorTransport.class);
-               logger.debug("{}", errorResponse.getBody().getError().toString());
+               ResponseEntity<String> errorResponse = testRestTemplateStandardRole().exchange(uri, HttpMethod.GET, null,
+                               String.class);
+               logger.debug("{}", errorResponse.getBody());
                Assertions.assertTrue(errorResponse.getStatusCode().is5xxServerError());
        }
 
index b91c44c..e7145df 100644 (file)
@@ -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
index c668afc..8e2ddeb 100644 (file)
@@ -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());
index 27fccfc..03c6eb7 100644 (file)
@@ -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
 --------------------------