Fix for ONOS-4621. If any errors in parsing the configurations, continue with the next config key and return the list of subjectClass, subject, config failures
Change-Id: I4883342b4920aa4d6d641a17a395e5f6e4f27d6a
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java
index fc0b55d..b8dbb09 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/NetworkConfigWebResource.java
@@ -16,6 +16,7 @@
package org.onosproject.rest.resources;
import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.net.config.Config;
import org.onosproject.net.config.NetworkConfigService;
@@ -33,6 +34,8 @@
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Set;
import static org.onlab.util.Tools.emptyIsNotFound;
@@ -44,6 +47,9 @@
@Path("network/configuration")
public class NetworkConfigWebResource extends AbstractWebResource {
+ //FIX ME not found Multi status error code 207 in jaxrs Response Status.
+ private static final int MULTI_STATUS_RESPONE = 207;
+
private String subjectClassNotFoundErrorString(String subjectClassKey) {
return "Config for '" + subjectClassKey + "' not found";
}
@@ -191,9 +197,16 @@
public Response upload(InputStream request) throws IOException {
NetworkConfigService service = get(NetworkConfigService.class);
ObjectNode root = (ObjectNode) mapper().readTree(request);
+ List<String> errorMsgs = new ArrayList<String>();
root.fieldNames()
- .forEachRemaining(sk -> consumeJson(service, (ObjectNode) root.path(sk),
- service.getSubjectFactory(sk)));
+ .forEachRemaining(sk ->
+ {
+ errorMsgs.addAll(consumeJson(service, (ObjectNode) root.path(sk),
+ service.getSubjectFactory(sk)));
+ });
+ if (errorMsgs.toString().length() > 0) {
+ return Response.status(MULTI_STATUS_RESPONE).entity(produceErrorJson(errorMsgs)).build();
+ }
return Response.ok().build();
}
@@ -213,7 +226,10 @@
InputStream request) throws IOException {
NetworkConfigService service = get(NetworkConfigService.class);
ObjectNode root = (ObjectNode) mapper().readTree(request);
- consumeJson(service, root, service.getSubjectFactory(subjectClassKey));
+ List<String> errorMsgs = consumeJson(service, root, service.getSubjectFactory(subjectClassKey));
+ if (errorMsgs.toString().length() > 0) {
+ return Response.status(MULTI_STATUS_RESPONE).entity(produceErrorJson(errorMsgs)).build();
+ }
return Response.ok().build();
}
@@ -235,9 +251,12 @@
InputStream request) throws IOException {
NetworkConfigService service = get(NetworkConfigService.class);
ObjectNode root = (ObjectNode) mapper().readTree(request);
- consumeSubjectJson(service, root,
- service.getSubjectFactory(subjectClassKey).createSubject(subjectKey),
- subjectClassKey);
+ List<String> errorMsgs = consumeSubjectJson(service, root,
+ service.getSubjectFactory(subjectClassKey).createSubject(subjectKey),
+ subjectClassKey);
+ if (errorMsgs.size() > 0) {
+ return Response.status(MULTI_STATUS_RESPONE).entity(produceErrorJson(errorMsgs)).build();
+ }
return Response.ok().build();
}
@@ -267,21 +286,37 @@
return Response.ok().build();
}
- private void consumeJson(NetworkConfigService service, ObjectNode classNode,
+ private List<String> consumeJson(NetworkConfigService service, ObjectNode classNode,
SubjectFactory subjectFactory) {
- classNode.fieldNames().forEachRemaining(s ->
- consumeSubjectJson(service, (ObjectNode) classNode.path(s),
- subjectFactory.createSubject(s),
- subjectFactory.subjectClassKey()));
+ List<String> errorMsgs = new ArrayList<String>();
+ classNode.fieldNames().forEachRemaining(s -> {
+ List<String> error = consumeSubjectJson(service, (ObjectNode) classNode.path(s),
+ subjectFactory.createSubject(s),
+ subjectFactory.subjectClassKey());
+ errorMsgs.addAll(error);
+ });
+ return errorMsgs;
}
- private void consumeSubjectJson(NetworkConfigService service,
+ private List<String> consumeSubjectJson(NetworkConfigService service,
ObjectNode subjectNode, Object subject,
String subjectClassKey) {
- subjectNode.fieldNames().forEachRemaining(configKey ->
- service.applyConfig(subjectClassKey, subject, configKey, subjectNode.path(configKey)));
+ List<String> errorMsgs = new ArrayList<String>();
+ subjectNode.fieldNames().forEachRemaining(configKey -> {
+ try {
+ service.applyConfig(subjectClassKey, subject, configKey, subjectNode.path(configKey));
+ } catch (IllegalArgumentException e) {
+ errorMsgs.add("Error parsing config " + subjectClassKey + "/" + subject + "/" + configKey);
+ }
+ });
+ return errorMsgs;
}
+ private ObjectNode produceErrorJson(List<String> errorMsgs) {
+ ObjectMapper mapper = new ObjectMapper();
+ ObjectNode result = mapper.createObjectNode().put("code", 207).putPOJO("message", errorMsgs);
+ return result;
+ }
// FIXME: Refactor to allow queued configs to be removed