From 3b56b4ff40eba05108651d04df4b9a2ef3a4eb1d Mon Sep 17 00:00:00 2001 From: PatrikBuhr Date: Mon, 23 Nov 2020 13:24:45 +0100 Subject: Added GET config Corrected config so that PUT config receives an object intestead of a string Change-Id: Id784cc2840a2e2e981b0c4e874b8a848964e00ea Issue-ID: CCSDK-2966 Signed-off-by: PatrikBuhr --- .../controllers/v2/ConfigurationController.java | 49 +++++++++++++++++----- .../controllers/v2/Consts.java | 2 +- .../tasks/RefreshConfigTask.java | 3 +- .../controllers/v2/ApplicationTest.java | 10 +++-- .../v2/ConfigurationControllerTest.java | 29 ++++++++----- 5 files changed, 68 insertions(+), 25 deletions(-) (limited to 'a1-policy-management') diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ConfigurationController.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ConfigurationController.java index 7a432f83..86ae2734 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ConfigurationController.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ConfigurationController.java @@ -18,9 +18,10 @@ package org.onap.ccsdk.oran.a1policymanagementservice.controllers.v2; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import com.google.gson.JsonSyntaxException; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -28,18 +29,19 @@ import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import java.io.IOException; +import java.util.Optional; import org.onap.ccsdk.oran.a1policymanagementservice.configuration.ApplicationConfigParser; import org.onap.ccsdk.oran.a1policymanagementservice.configuration.ConfigurationFile; import org.onap.ccsdk.oran.a1policymanagementservice.controllers.VoidResponse; import org.onap.ccsdk.oran.a1policymanagementservice.controllers.v2.ErrorResponse.ErrorInfo; -import org.onap.ccsdk.oran.a1policymanagementservice.exceptions.ServiceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -52,29 +54,56 @@ public class ConfigurationController { @Autowired ConfigurationFile configurationFile; + private static Gson gson = new GsonBuilder() // + .create(); // + @PutMapping(path = Consts.V2_API_ROOT + "/configuration", consumes = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Replace the current configuration with the given configuration") + @ApiOperation(value = "Replace the current configuration file with the given configuration", // + notes = "Note that the file is ignored if the Consul is used.") @ApiResponses(value = { // @ApiResponse(code = 200, message = "Configuration updated", response = VoidResponse.class), // @ApiResponse(code = 400, message = "Invalid configuration provided", response = ErrorInfo.class), // @ApiResponse(code = 500, message = "Something went wrong when replacing the configuration. Try again.", response = ErrorResponse.ErrorInfo.class) // }) - public ResponseEntity putConfiguration(@RequestBody String configuration) { + public ResponseEntity putConfiguration(@RequestBody Object configuration) { try { - JsonObject configJson = JsonParser.parseString(configuration).getAsJsonObject(); + String configAsString = gson.toJson(configuration); + JsonObject configJson = JsonParser.parseString(configAsString).getAsJsonObject(); ApplicationConfigParser configParser = new ApplicationConfigParser(); configParser.parse(configJson); configurationFile.writeFile(configJson); logger.info("Configuration changed through REST call."); - } catch (ServiceException | JsonSyntaxException e) { - return ErrorResponse.create(String.format("Faulty configuration. %s", e.getMessage()), - HttpStatus.BAD_REQUEST); + return new ResponseEntity<>(HttpStatus.OK); } catch (IOException ioe) { logger.warn("Configuration file not written, {}.", ioe.getMessage()); - ErrorResponse.create("Internal error when writing the configuration. Try again.", + return ErrorResponse.create("Internal error when writing the configuration. Try again.", HttpStatus.INTERNAL_SERVER_ERROR); + } catch (Exception e) { + return ErrorResponse.create(String.format("Faulty configuration. %s", e.getMessage()), + HttpStatus.BAD_REQUEST); } - return new ResponseEntity<>(HttpStatus.OK); } + + @GetMapping(path = Consts.V2_API_ROOT + "/configuration", produces = MediaType.APPLICATION_JSON_VALUE) + @ApiOperation(value = "Returns the contents of the configuration file", // + notes = "Note that the file contents is not relevant if the Consul is used.") // + @ApiResponses(value = { // + @ApiResponse(code = 200, message = "Configuration", response = Object.class), // + @ApiResponse(code = 404, message = "File is not found or readable", + response = ErrorResponse.ErrorInfo.class)} // + ) + public ResponseEntity getConfiguration() { + try { + Optional rootObject = configurationFile.readFile(); + if (rootObject.isPresent()) { + return new ResponseEntity<>(rootObject.get().toString(), HttpStatus.OK); + } else { + return ErrorResponse.create("File does not exist", HttpStatus.NOT_FOUND); + } + } catch (Exception e) { + return ErrorResponse.create(e, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + } diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/Consts.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/Consts.java index e1961c17..81021b15 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/Consts.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/Consts.java @@ -30,7 +30,7 @@ public class Consts { public static final String V2_API_ROOT = "/v2"; public static final String V2_API_NAME = "A1 Policy Management Version 2.0 (in progress)"; - public static final String V2_CONFIG_API_NAME = "A1 Policy Management Configuration"; + public static final String V2_CONFIG_API_NAME = "Component Configuration"; private Consts() {} } diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/tasks/RefreshConfigTask.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/tasks/RefreshConfigTask.java index dfb8d49e..29d2e4eb 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/tasks/RefreshConfigTask.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/tasks/RefreshConfigTask.java @@ -71,7 +71,8 @@ public class RefreshConfigTask { public Properties systemEnvironment; /** - * The time between refreshes of the configuration. Not final so tests can modify it. + * The time between refreshes of the configuration. Not final so tests can + * modify it. */ private static Duration configRefreshInterval = Duration.ofMinutes(1); diff --git a/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ApplicationTest.java b/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ApplicationTest.java index 516ddd5f..30ce4c3e 100644 --- a/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ApplicationTest.java +++ b/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ApplicationTest.java @@ -30,10 +30,12 @@ import static org.mockito.Mockito.doReturn; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.IOException; import java.io.PrintStream; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; import java.time.Duration; import java.time.Instant; import java.util.ArrayList; @@ -211,12 +213,14 @@ class ApplicationTest { } @Test - void createApiDoc() throws FileNotFoundException { + void createApiDoc() throws IOException { String url = "https://localhost:" + this.port + "/v2/api-docs"; ResponseEntity resp = restClient("", false).getForEntity(url).block(); assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK); String indented = (new JSONObject(resp.getBody())).toString(4); - try (PrintStream out = new PrintStream(new FileOutputStream("../docs/offeredapis/swagger/pms-api.json"))) { + String docDir = "../docs/offeredapis/swagger/"; + Files.createDirectories(Paths.get(docDir)); + try (PrintStream out = new PrintStream(new FileOutputStream(docDir + "pms-api.json"))) { out.print(indented); } } diff --git a/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ConfigurationControllerTest.java b/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ConfigurationControllerTest.java index 8f9d236b..376ce76e 100644 --- a/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ConfigurationControllerTest.java +++ b/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ConfigurationControllerTest.java @@ -105,27 +105,36 @@ class ConfigurationControllerTest { @Test void putValidConfigurationWithNewRic_shouldUpdateRepository() throws Exception { - String url = "https://localhost:" + this.port + "/v2/configuration"; + String url = "/v2/configuration"; - File configFile = new File(getClass().getClassLoader() - .getResource("test_application_configuration_with_dmaap_config.json").getFile()); - String configFileAsString = FileUtils.readFileToString(configFile, "UTF-8"); - - String resp = restClient().put(url, configFileAsString).block(); + String resp = restClient().put(url, configAsString()).block(); assertThat(resp).isEmpty(); await().until(rics::size, equalTo(2)); + + // GET config + resp = restClient().get(url).block(); + assertThat(resp).contains("config"); + } + + @Test + void getNoFileExists() { + String url = "/v2/configuration"; + testErrorCode(restClient().get(url), HttpStatus.NOT_FOUND, "File does not exist"); + } + + private String configAsString() throws Exception { + File configFile = new File(getClass().getClassLoader() + .getResource("test_application_configuration_with_dmaap_config.json").getFile()); + return FileUtils.readFileToString(configFile, "UTF-8"); } @Test void putInvalidConfiguration_shouldReturnError400() throws Exception { - String url = "https://localhost:" + this.port + "/v2/configuration"; + String url = "/v2/configuration"; // Valid JSON but invalid configuration. testErrorCode(restClient().put(url, "{\"error\":\"error\"}"), HttpStatus.BAD_REQUEST, "Faulty configuration"); - - // Invalid JSON. - testErrorCode(restClient().put(url, "{\"error\":\"error\""), HttpStatus.BAD_REQUEST, "Faulty configuration"); } private void testErrorCode(Mono request, HttpStatus expStatus, String responseContains) { -- cgit 1.2.3-korg