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;
@Autowired
ConfigurationFile configurationFile;
+ @Autowired
+ RefreshConfigTask refreshConfigTask;
+
private static Gson gson = new GsonBuilder() //
.create(); //
})
public ResponseEntity<Object> putConfiguration(@RequestBody Object configuration) {
try {
+ validateConfigFileIsUsed();
String configAsString = gson.toJson(configuration);
JsonObject configJson = JsonParser.parseString(configAsString).getAsJsonObject();
ApplicationConfigParser configParser = new ApplicationConfigParser();
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);
}
}
})
public ResponseEntity<Object> getConfiguration() {
try {
+ validateConfigFileIsUsed();
Optional<JsonObject> rootObject = configurationFile.readFile();
if (rootObject.isPresent()) {
return new ResponseEntity<>(rootObject.get().toString(), HttpStatus.OK);
}
}
+ private void validateConfigFileIsUsed() throws ServiceException {
+ if (this.refreshConfigTask.isConsulUsed()) {
+ throw new ServiceException("Config file not used (Consul is used)", HttpStatus.FORBIDDEN);
+ }
+
+ }
+
}
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;
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);
}
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;
+ }
+
}
final ConfigurationFile configurationFile;
final ApplicationConfig appConfig;
+
@Getter(AccessLevel.PROTECTED)
private Disposable refreshTask = null;
+
+ @Getter
private boolean isConsulUsed = false;
private final Rics rics;
}
@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)) //
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) {
}
}
- 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);