PMS Bugfix - A1 Istanbul 13/121413/1
authorPatrikBuhr <patrik.buhr@est.tech>
Wed, 19 May 2021 11:29:44 +0000 (13:29 +0200)
committerPatrikBuhr <patrik.buhr@est.tech>
Wed, 19 May 2021 11:30:05 +0000 (13:30 +0200)
Bugfix, rejecting putting and getting configuratioon via REST if
the consul is used (then the configuration file has no effect)..

Issue-ID: CCSDK-3256
Signed-off-by: PatrikBuhr <patrik.buhr@est.tech>
Change-Id: Ia3b4a387f450b137b576a9d82ba2f7093a5839ef

a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ConfigurationController.java
a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ErrorResponse.java
a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/exceptions/ServiceException.java
a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/tasks/RefreshConfigTask.java
a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ApplicationTest.java
a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/controllers/v2/ConfigurationControllerTest.java
a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/utils/MockA1Client.java

index e6b938a..b677a40 100644 (file)
@@ -36,6 +36,8 @@ 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.exceptions.ServiceException;
+import org.onap.ccsdk.oran.a1policymanagementservice.tasks.RefreshConfigTask;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -58,6 +60,9 @@ public class ConfigurationController {
     @Autowired
     ConfigurationFile configurationFile;
 
+    @Autowired
+    RefreshConfigTask refreshConfigTask;
+
     private static Gson gson = new GsonBuilder() //
             .create(); //
 
@@ -77,6 +82,7 @@ public class ConfigurationController {
     })
     public ResponseEntity<Object> putConfiguration(@RequestBody Object configuration) {
         try {
+            validateConfigFileIsUsed();
             String configAsString = gson.toJson(configuration);
             JsonObject configJson = JsonParser.parseString(configAsString).getAsJsonObject();
             ApplicationConfigParser configParser = new ApplicationConfigParser();
@@ -86,11 +92,10 @@ public class ConfigurationController {
             return new ResponseEntity<>(HttpStatus.OK);
         } catch (IOException ioe) {
             logger.warn("Configuration file not written, {}.", ioe.getMessage());
-            return ErrorResponse.create("Internal error when writing the configuration. Try again.",
+            return ErrorResponse.create("Internal error when writing the configuration.",
                     HttpStatus.INTERNAL_SERVER_ERROR);
         } catch (Exception e) {
-            return ErrorResponse.create(String.format("Faulty configuration. %s", e.getMessage()),
-                    HttpStatus.BAD_REQUEST);
+            return ErrorResponse.create(e, HttpStatus.BAD_REQUEST);
         }
     }
 
@@ -108,6 +113,7 @@ public class ConfigurationController {
     })
     public ResponseEntity<Object> getConfiguration() {
         try {
+            validateConfigFileIsUsed();
             Optional<JsonObject> rootObject = configurationFile.readFile();
             if (rootObject.isPresent()) {
                 return new ResponseEntity<>(rootObject.get().toString(), HttpStatus.OK);
@@ -119,4 +125,11 @@ public class ConfigurationController {
         }
     }
 
+    private void validateConfigFileIsUsed() throws ServiceException {
+        if (this.refreshConfigTask.isConsulUsed()) {
+            throw new ServiceException("Config file not used (Consul is used)", HttpStatus.FORBIDDEN);
+        }
+
+    }
+
 }
index c3ee195..78ba6b6 100644 (file)
@@ -26,6 +26,7 @@ import com.google.gson.annotations.SerializedName;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
+import org.onap.ccsdk.oran.a1policymanagementservice.exceptions.ServiceException;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
@@ -96,7 +97,15 @@ public class ErrorResponse {
         return new ResponseEntity<>(json, headers, code);
     }
 
-    public static ResponseEntity<Object> create(Exception e, HttpStatus code) {
+    public static ResponseEntity<Object> create(Throwable e, HttpStatus code) {
+        if (e instanceof RuntimeException) {
+            code = HttpStatus.INTERNAL_SERVER_ERROR;
+        } else if (e instanceof ServiceException) {
+            ServiceException se = (ServiceException) e;
+            if (se.getHttpStatus() != null) {
+                code = se.getHttpStatus();
+            }
+        }
         return create(e.toString(), code);
     }
 
index 17e651a..8f5956c 100644 (file)
 
 package org.onap.ccsdk.oran.a1policymanagementservice.exceptions;
 
+import lombok.Getter;
+
+import org.springframework.http.HttpStatus;
+
 public class ServiceException extends Exception {
 
     private static final long serialVersionUID = 1L;
 
+    @Getter
+    private final HttpStatus httpStatus;
+
     public ServiceException(String message) {
         super(message);
+        httpStatus = null;
     }
 
     public ServiceException(String message, Exception originalException) {
         super(message, originalException);
+        httpStatus = null;
     }
+
+    public ServiceException(String message, HttpStatus httpStatus) {
+        super(message);
+        this.httpStatus = httpStatus;
+    }
+
 }
index e84c983..3027981 100644 (file)
@@ -80,8 +80,11 @@ public class RefreshConfigTask {
 
     final ConfigurationFile configurationFile;
     final ApplicationConfig appConfig;
+
     @Getter(AccessLevel.PROTECTED)
     private Disposable refreshTask = null;
+
+    @Getter
     private boolean isConsulUsed = false;
 
     private final Rics rics;
index 91eb633..9c9331d 100644 (file)
@@ -283,13 +283,12 @@ class ApplicationTest {
     }
 
     @Test
-    void testAddingRicFromConfiguration_nonRespondingRic() throws ServiceException {
+    void testAddingRicFromConfiguration_nonRespondingRic() throws Exception {
         putService("service");
 
         final String RIC = "NonRespondingRic";
         MockA1Client a1Client = a1ClientFactory.getOrCreateA1Client(RIC);
-        WebClientResponseException a1Exception = new WebClientResponseException(404, "", null, null, null);
-        doReturn(Mono.error(a1Exception)).when(a1Client).getPolicyTypeIdentities();
+        doReturn(MockA1Client.monoError("error", HttpStatus.BAD_GATEWAY)).when(a1Client).getPolicyTypeIdentities();
 
         refreshConfigTask.handleUpdatedRicConfig( //
                 new RicConfigUpdate(ricConfig(RIC, "me1"), RicConfigUpdate.Type.ADDED)) //
index 6192c93..030b831 100644 (file)
@@ -135,7 +135,8 @@ class ConfigurationControllerTest {
         String url = "a1-policy/v2/configuration";
 
         // Valid JSON but invalid configuration.
-        testErrorCode(restClient().put(url, "{\"error\":\"error\"}"), HttpStatus.BAD_REQUEST, "Faulty configuration");
+        testErrorCode(restClient().put(url, "{\"error\":\"error\"}"), HttpStatus.BAD_REQUEST,
+                "Missing root configuration");
     }
 
     private void testErrorCode(Mono<?> request, HttpStatus expStatus, String responseContains) {
index 22ac243..2a3b28e 100644 (file)
@@ -124,7 +124,7 @@ public class MockA1Client implements A1Client {
         }
     }
 
-    Mono<String> monoError(String responseBody, HttpStatus status) {
+    public static Mono<String> monoError(String responseBody, HttpStatus status) {
         byte[] responseBodyBytes = responseBody.getBytes(StandardCharsets.UTF_8);
         WebClientResponseException a1Exception = new WebClientResponseException(status.value(),
                 status.getReasonPhrase(), null, responseBodyBytes, StandardCharsets.UTF_8, null);