[ONOS-6673] YANG Runtime: GET API's for YANG Models
Change-Id: Iab3b8a0aeb63bdb88ce7b8cc9f6edc6f3bb4d41f
diff --git a/apps/yang/web/BUCK b/apps/yang/web/BUCK
index 9563765..b988cc6 100644
--- a/apps/yang/web/BUCK
+++ b/apps/yang/web/BUCK
@@ -1,5 +1,6 @@
COMPILE_DEPS = [
'//lib:CORE_DEPS',
+ '//lib:JACKSON',
'//lib:javax.ws.rs-api',
'//utils/rest:onlab-rest',
'//lib:jersey-media-multipart',
diff --git a/apps/yang/web/src/main/java/org/onosproject/yang/web/YangWebResource.java b/apps/yang/web/src/main/java/org/onosproject/yang/web/YangWebResource.java
index d293b32..61bc704 100644
--- a/apps/yang/web/src/main/java/org/onosproject/yang/web/YangWebResource.java
+++ b/apps/yang/web/src/main/java/org/onosproject/yang/web/YangWebResource.java
@@ -16,38 +16,45 @@
package org.onosproject.yang.web;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.commons.io.IOUtils;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.onosproject.app.ApplicationAdminService;
import org.onosproject.rest.AbstractWebResource;
import org.onosproject.yang.YangLiveCompilerService;
+import org.onosproject.yang.model.DefaultYangModuleId;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.model.YangModule;
+import org.onosproject.yang.runtime.YangModelRegistry;
+import org.slf4j.Logger;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Set;
+
+import static javax.ws.rs.core.Response.Status.NOT_FOUND;
+import static org.slf4j.LoggerFactory.getLogger;
/**
* Yang files upload resource.
*/
@Path("models")
public class YangWebResource extends AbstractWebResource {
- private static final String YANG_FILE_EXTENSION = ".yang";
- private static final String SER_FILE_EXTENSION = ".ser";
- private static final String JAR_FILE_EXTENSION = ".jar";
- private static final String ZIP_FILE_EXTENSION = ".zip";
- private static final String REGISTER = "register";
- private static final String UNREGISTER = "unregister";
- private static final String CODE_GEN_DIR = "target/generated-sources/";
- private static final String YANG_RESOURCES = "target/yang/resources/";
- private static final String SERIALIZED_FILE_NAME = "YangMetaData.ser";
- private static final String UNKNOWN_KEY = "Key must be either register " +
- "or unregister.";
- private static final String SLASH = "/";
+
+ private final Logger log = getLogger(getClass());
+ private YangModelRegistry modelRegistry = getService(YangModelRegistry.class);
/**
* Compiles and registers the given yang files.
@@ -67,4 +74,91 @@
appService.activate(appService.getId(modelId));
return Response.ok().build();
}
+
+ /**
+ * Returns all models registered with YANG runtime. If the operation is
+ * successful, the JSON presentation of the resource plus HTTP status
+ * code "200 OK" is returned.Otherwise,
+ * HTTP error status code "400 Bad Request" is returned.
+ *
+ * @return HTTP response
+ */
+ @GET
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response getModels() {
+
+ modelRegistry = getService(YangModelRegistry.class);
+ ObjectNode result = mapper().createObjectNode();
+ Set<YangModel> models = modelRegistry.getModels();
+ ArrayNode ids = result.putArray("Model_ids");
+ for (YangModel m : models) {
+ ids.add(m.getYangModelId());
+ }
+ return Response.ok(result.toString()).build();
+ }
+
+ /**
+ * Returns all modules registered with YANG runtime under given model
+ * identifier.If the operation is successful, the JSON presentation of the
+ * resource plus HTTP status code "200 OK" is returned. Otherwise,
+ * HTTP error status code "400 Bad Request" is returned.
+ *
+ * @param id for model
+ * @return HTTP response
+ */
+ @GET
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("/{id}")
+ public Response getModules(@PathParam("id") String
+ id) {
+ modelRegistry = getService(YangModelRegistry.class);
+ ObjectNode result = mapper().createObjectNode();
+ YangModel model = modelRegistry.getModel(id);
+ if (model == null) {
+ return Response.status(NOT_FOUND).build();
+ }
+ Set<YangModule> modules = model.getYangModules();
+ ArrayNode ids = result.putArray(id);
+ for (YangModule m : modules) {
+ ids.add(m.getYangModuleId().moduleName() + "@" + m
+ .getYangModuleId().revision());
+ }
+ return Response.ok(result).build();
+ }
+
+ /**
+ * Returns module registered with YANG runtime with given module
+ * identifier.
+ * If the operation is successful, the JSON presentation of the resource
+ * plus HTTP status code "200 OK" is returned. Otherwise,
+ * HTTP error status code "400 Bad Request" is returned.
+ *
+ * @param n for module name
+ * @param r for module revision
+ * @return HTTP response
+ */
+ @GET
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.TEXT_PLAIN)
+ @Path("/{name}@{revision}")
+ public String getModule(@PathParam("name") String n,
+ @PathParam("revision") String r) {
+
+ modelRegistry = getService(YangModelRegistry.class);
+ YangModule m = modelRegistry.getModule(new DefaultYangModuleId(n, r));
+ if (m == null) {
+ return Response.status(NOT_FOUND).build().toString();
+ }
+ String x;
+ try {
+ x = IOUtils.toString(m.getYangSource(), StandardCharsets.UTF_8);
+ } catch (IOException e) {
+ log.error("ERROR: handleModuleGetRequest", e.getMessage());
+ log.debug("Exception in handleModuleGetRequest:", e);
+ return e.getMessage();
+ }
+ return x;
+ }
}