From 63be201ed60ca0d0b16ebe5a1a9d3a8e3f7b8482 Mon Sep 17 00:00:00 2001 From: niamhcore Date: Mon, 15 Mar 2021 15:54:12 +0000 Subject: Internal Server Error when creating the same data node twice This change adds a generic exception handler class for a already defined object and handles a JsonSyntaxException. Issue-ID: CPS-290 Signed-off-by: niamhcore Change-Id: Ie645237b5dd5b8e2b1d074c5613e7da560f57484 --- .../rest/exceptions/CpsRestExceptionHandler.java | 11 +++++------ .../rest/controller/AdminRestControllerSpec.groovy | 6 +++--- .../rest/controller/DataRestControllerSpec.groovy | 12 ++++++----- .../exceptions/CpsRestExceptionHandlerSpec.groovy | 23 ++++++++-------------- 4 files changed, 23 insertions(+), 29 deletions(-) (limited to 'cps-rest') diff --git a/cps-rest/src/main/java/org/onap/cps/rest/exceptions/CpsRestExceptionHandler.java b/cps-rest/src/main/java/org/onap/cps/rest/exceptions/CpsRestExceptionHandler.java index 7719417c1..0437e70fe 100755 --- a/cps-rest/src/main/java/org/onap/cps/rest/exceptions/CpsRestExceptionHandler.java +++ b/cps-rest/src/main/java/org/onap/cps/rest/exceptions/CpsRestExceptionHandler.java @@ -1,6 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2020 Pantheon.tech + * Copyright (C) 2021 Nordix Foundation * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +25,7 @@ import org.onap.cps.rest.controller.AdminRestController; import org.onap.cps.rest.controller.DataRestController; import org.onap.cps.rest.controller.QueryRestController; import org.onap.cps.rest.model.ErrorMessage; +import org.onap.cps.spi.exceptions.AlreadyDefinedException; import org.onap.cps.spi.exceptions.CpsAdminException; import org.onap.cps.spi.exceptions.CpsException; import org.onap.cps.spi.exceptions.CpsPathException; @@ -42,8 +44,6 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; QueryRestController.class}) public class CpsRestExceptionHandler { - private static final String CHECK_LOGS_FOR_DETAILS = "Check logs for details."; - private CpsRestExceptionHandler() { } @@ -54,8 +54,7 @@ public class CpsRestExceptionHandler { * @return response with response code 500. */ @ExceptionHandler - public static ResponseEntity handleInternalServerErrorExceptions( - final Exception exception) { + public static ResponseEntity handleInternalServerErrorExceptions(final Exception exception) { return buildErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR, exception); } @@ -70,7 +69,7 @@ public class CpsRestExceptionHandler { return buildErrorResponse(HttpStatus.NOT_FOUND, exception); } - @ExceptionHandler({DataInUseException.class}) + @ExceptionHandler({DataInUseException.class, AlreadyDefinedException.class}) public static ResponseEntity handleDataInUseException(final CpsException exception) { return buildErrorResponse(HttpStatus.CONFLICT, exception); } @@ -88,7 +87,7 @@ public class CpsRestExceptionHandler { errorMessage.setStatus(status.toString()); errorMessage.setMessage(exception.getMessage()); errorMessage.setDetails(exception instanceof CpsException ? ((CpsException) exception).getDetails() : - CHECK_LOGS_FOR_DETAILS); + "Check logs for details."); return new ResponseEntity<>(errorMessage, status); } } diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy index 5b5be1c16..3387fb4e1 100755 --- a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy +++ b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy @@ -32,7 +32,7 @@ import org.onap.cps.api.CpsAdminService import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsModuleService import org.onap.cps.api.CpsQueryService -import org.onap.cps.spi.exceptions.DataspaceAlreadyDefinedException +import org.onap.cps.spi.exceptions.AlreadyDefinedException import org.onap.cps.spi.exceptions.SchemaSetInUseException import org.onap.cps.spi.model.Anchor import org.onap.cps.spi.model.SchemaSet @@ -98,7 +98,7 @@ class AdminRestControllerSpec extends Specification { given: 'an endpoint' def createDataspaceEndpoint = "$basePath/v1/dataspaces"; and: 'the service method throws an exception indicating the dataspace is already defined' - def thrownException = new DataspaceAlreadyDefinedException("", new RuntimeException()) + def thrownException = new AlreadyDefinedException(dataspaceName, new RuntimeException()) mockCpsAdminService.createDataspace(dataspaceName) >> { throw thrownException } when: 'post is invoked' def response = @@ -107,7 +107,7 @@ class AdminRestControllerSpec extends Specification { .param('dataspace-name', dataspaceName)) .andReturn().response then: 'dataspace creation fails' - response.status == HttpStatus.BAD_REQUEST.value() + response.status == HttpStatus.CONFLICT.value() } def 'Create schema set from yang file.'() { diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy index 15627d598..5794f88ed 100755 --- a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy +++ b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy @@ -33,6 +33,7 @@ import org.onap.cps.api.CpsAdminService import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsModuleService import org.onap.cps.api.CpsQueryService +import org.onap.cps.spi.exceptions.AlreadyDefinedException import org.onap.cps.spi.exceptions.AnchorNotFoundException import org.onap.cps.spi.exceptions.DataNodeNotFoundException import org.onap.cps.spi.exceptions.DataspaceNotFoundException @@ -159,11 +160,12 @@ class DataRestControllerSpec extends Specification { then: 'a success response is returned' response.status == httpStatus.value() where: - scenario | xpath | exception || httpStatus - 'no dataspace' | '/x-path' | new DataspaceNotFoundException('') || HttpStatus.BAD_REQUEST - 'no anchor' | '/x-path' | new AnchorNotFoundException('', '') || HttpStatus.BAD_REQUEST - 'no data' | '/x-path' | new DataNodeNotFoundException('', '', '') || HttpStatus.NOT_FOUND - 'empty path' | '' | new IllegalStateException() || HttpStatus.NOT_IMPLEMENTED + scenario | xpath | exception || httpStatus + 'no dataspace' | '/x-path' | new DataspaceNotFoundException('') || HttpStatus.BAD_REQUEST + 'no anchor' | '/x-path' | new AnchorNotFoundException('', '') || HttpStatus.BAD_REQUEST + 'no data' | '/x-path' | new DataNodeNotFoundException('', '', '') || HttpStatus.NOT_FOUND + 'empty path' | '' | new IllegalStateException() || HttpStatus.NOT_IMPLEMENTED + 'already defined' | '/x-path' | new AlreadyDefinedException('', '') || HttpStatus.CONFLICT } @Unroll diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy index fb4037271..30d5b62a2 100644 --- a/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy +++ b/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy @@ -33,14 +33,13 @@ import org.onap.cps.api.CpsAdminService import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsModuleService import org.onap.cps.api.CpsQueryService -import org.onap.cps.spi.exceptions.AnchorAlreadyDefinedException +import org.onap.cps.spi.exceptions.AlreadyDefinedException import org.onap.cps.spi.exceptions.CpsException import org.onap.cps.spi.exceptions.CpsPathException import org.onap.cps.spi.exceptions.DataInUseException import org.onap.cps.spi.exceptions.DataValidationException import org.onap.cps.spi.exceptions.ModelValidationException import org.onap.cps.spi.exceptions.NotFoundInDataspaceException -import org.onap.cps.spi.exceptions.SchemaSetAlreadyDefinedException import org.onap.cps.spi.exceptions.SchemaSetInUseException import org.spockframework.spring.SpringBean import org.springframework.beans.factory.annotation.Autowired @@ -112,20 +111,14 @@ class CpsRestExceptionHandlerSpec extends Specification { 'Description does not exist in dataspace MyDataSpace.') } - @Unroll - def 'request with an expectedObjectTypeInMessage object already defined exception returns HTTP Status Bad Request'() { - when: 'no data found CPS exception is thrown by the service' - setupTestException(exceptionThrown) + def 'Request with an object already defined exception returns HTTP Status Conflict.'() { + when: 'AlreadyDefinedException exception is thrown by the service' + setupTestException(new AlreadyDefinedException("Anchor", existingObjectName, dataspaceName, new Throwable())) def response = performTestRequest() - then: 'an HTTP Bad Request response is returned with correct message an details' - assertTestResponse(response, BAD_REQUEST, - "Duplicate ${expectedObjectTypeInMessage}", - "${expectedObjectTypeInMessage} with name ${existingObjectName} " + - 'already exists for dataspace MyDataSpace.') - where: 'the following exceptions are thrown' - exceptionThrown || expectedObjectTypeInMessage - new SchemaSetAlreadyDefinedException(dataspaceName, existingObjectName, null) || 'Schema Set' - new AnchorAlreadyDefinedException(dataspaceName, existingObjectName, null) || 'Anchor' + then: 'a HTTP conflict response is returned with correct message an details' + assertTestResponse(response, CONFLICT, + "Already defined exception", + "Anchor with name ${existingObjectName} already exists for ${dataspaceName}.") } @Unroll -- cgit 1.2.3-korg