[ONOS-4694] YANG management system outline and YMSM/YDT interfaces
Change-Id: I050ed98ba18edc2c2cea2abafeee6d8c9061b579
diff --git a/apps/pom.xml b/apps/pom.xml
index 15a4917..1978f9d 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -13,7 +13,9 @@
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
- --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
@@ -72,6 +74,7 @@
<module>xosclient</module>
<module>scalablegateway</module>
<module>bmv2-demo</module>
+ <module>yms</module>
</modules>
diff --git a/apps/yms/BUCK b/apps/yms/BUCK
new file mode 100644
index 0000000..163d67e
--- /dev/null
+++ b/apps/yms/BUCK
@@ -0,0 +1,11 @@
+BUNDLES = [
+ '//apps/yms/api:onos-apps-yms-api',
+ '//apps/yms/app:onos-apps-yms-app',
+]
+
+onos_app(
+ title = 'YANG Management System App',
+ category = 'Utility',
+ url = 'http://onosproject.org',
+ included_bundles = BUNDLES,
+)
diff --git a/apps/yms/api/BUCK b/apps/yms/api/BUCK
new file mode 100644
index 0000000..013d7cc
--- /dev/null
+++ b/apps/yms/api/BUCK
@@ -0,0 +1,7 @@
+COMPILE_DEPS = [
+ '//lib:CORE_DEPS',
+]
+
+osgi_jar_with_tests(
+ deps = COMPILE_DEPS,
+)
diff --git a/apps/yms/api/pom.xml b/apps/yms/api/pom.xml
new file mode 100644
index 0000000..32fd818
--- /dev/null
+++ b/apps/yms/api/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2015-present Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>onos-yms</artifactId>
+ <groupId>org.onosproject</groupId>
+ <version>1.7.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>onos-app-yms-api</artifactId>
+ <packaging>bundle</packaging>
+
+ <url>http://onosproject.org</url>
+
+ <description>YANG Management System API</description>
+
+</project>
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/package-info.java b/apps/yms/api/src/main/java/org/onosproject/yms/package-info.java
new file mode 100644
index 0000000..1a6e8fa
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/package-info.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Provides interfaces to YANG management system. YANG management system
+ * is a core of YANG in ONOS.
+ *
+ * In NBI, it acts as a broker in between the protocol and application,
+ * here there is a separate protocol implementation, which does the conversion
+ * of protocol representation to abstract data tree. The protocol
+ * implementation takes care of the protocol specific actions for
+ * e.g. RESTCONF handling the entity-tag / timestamp related operations.
+ *
+ * In SBI, driver or provider uses YANG codec handler as a utility to translate
+ * the request information in java(YANG utils generated) to protocol specific
+ * format and vice versa.
+ */
+package org.onosproject.yms;
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangCodecHandler.java b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangCodecHandler.java
new file mode 100644
index 0000000..f2433fa
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangCodecHandler.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ych;
+
+/**
+ * Abstraction of an entity which provides interfaces to YANG codec handler.
+ *
+ * In SBI, the provider or driver uses YANG management system as a CODEC
+ * utility. These providers/drivers use the YANG codec utility to register
+ * the device schema. YANG utils is used to generate the java files
+ * corresponding to the device schema. Provider or driver use these classes
+ * to seamlessly manage the device as java objects. While sending the request
+ * to device, drivers use the utility to translate the objects to protocol
+ * specific data representation and then send to the device.
+ * Protocol or driver use the same instance of the codec utility across multiple
+ * translation request.
+ * Protocol or driver should not use the same instance of utility concurrently.
+ */
+public interface YangCodecHandler {
+ //TODO
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ych/package-info.java b/apps/yms/api/src/main/java/org/onosproject/yms/ych/package-info.java
new file mode 100644
index 0000000..8e74d10
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ych/package-info.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * In SBI, the provider or driver uses YANG management system as a CODEC
+ * utility. These providers/drivers use the YANG codec utility to register
+ * the device schema. YANG utils is used to generate the java files
+ * corresponding to the device schema. Provider or driver use these classes
+ * to seamlessly manage the device as java objects. While sending the request
+ * to device, drivers use the utility to translate the objects to protocol
+ * specific data representation and then send to the device.
+ * Protocol or driver use the same instance of the codec utility across multiple
+ * translation request.
+ * Protocol or driver should not use the same instance of utility concurrently.
+ */
+package org.onosproject.yms.ych;
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/Ydt.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/Ydt.java
new file mode 100644
index 0000000..72790e2
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/Ydt.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ydt;
+
+import org.onosproject.yms.ymsm.YmsOperationType;
+
+/**
+ * Abstraction of an entity which represent YANG data tree. This is used
+ * for exchanging information between YANG management system and NBI protocol.
+ */
+public interface Ydt {
+
+ /**
+ * Returns the root context information available in YDT node. This root
+ * node is a logical container of a protocol which holds the complete data
+ * tree. After building YANG data tree, root node can be obtained from this.
+ *
+ * @return root YDT context which is logical container of a protocol which
+ * is holder of the complete tree
+ */
+ YdtContext getRootNode();
+
+ /**
+ * Returns YANG management system operation type. It represents type of
+ * root level operation for the request. This is used by protocols to
+ * specify the root level operation associated with the request.
+ *
+ * @return YANG management system operation type
+ */
+ YmsOperationType getYmsOperationType();
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtBuilder.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtBuilder.java
new file mode 100644
index 0000000..b31ce04
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtBuilder.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ydt;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Abstraction of an entity which provides interfaces to build and obtain YANG
+ * data tree which is data (sub)instance representation, abstract of protocol.
+ *
+ * NBI protocols need to translate the protocol operation request, into a
+ * protocol independent abstract tree called the YANG data tree (YDT). In order
+ * to enable the protocol in building these abstract data tree, YANG
+ * management system provides a utility called the YANG data tree builder.
+ */
+public interface YdtBuilder
+ extends Ydt {
+
+ /**
+ * Sets root node tag attributes. This is used by protocol
+ * to specify tag attributes associated with root resource.
+ *
+ * @param attributeTag map of root tags attribute values indexed by root
+ * tag name.
+ */
+ void setRootTagAttributeMap(Map<String, String> attributeTag);
+
+ /**
+ * Returns map of tag attribute list associated with root resource.
+ *
+ * @return linked hash map of tag name with value
+ */
+ Map<String, String> getRootTagAttributeMap();
+
+ /**
+ * Adds a last child to YANG data tree, this method is to be used by
+ * protocols which are unaware of the nature (single/multiple) of node and
+ * also unaware of the operation type at every node(Example: RESTCONF).
+ *
+ * Add child is used to add module/sub-module nodes also. Request may
+ * contain revision number corresponding to Module/sub-module in that
+ * case YMS expect revision number to be appended to module/sub-module
+ * name in the below mentioned format.
+ * module-or-submodule-name ['@' date-arg]
+ * date-arg = 4DIGIT "-" 2DIGIT "-" 2DIGIT
+ * Example: testModule@2016-10-27.
+ *
+ * If the revision date is not specified YMS first search for
+ * registered module/sub-module without revision date, if still can't obtain
+ * then uses registered module/sub-module with latest revision date.
+ *
+ * @param name name of child to be added
+ * @param namespace namespace of child to be added, if it's null, parent's
+ * namespace will be applied to child
+ */
+ void addChild(String name, String namespace);
+
+ /**
+ * Adds a last child to YANG data tree, this method is to be used by
+ * protocols which are aware of the nature (single/multiple) of node.
+ *
+ * Add child is used to add module/sub-module nodes also. Request may
+ * contain revision number corresponding to Module/sub-module in that
+ * case YMS expect revision number to be appended to module/sub-module
+ * name in the below mentioned format.
+ * module-or-submodule-name ['@' date-arg]
+ * date-arg = 4DIGIT "-" 2DIGIT "-" 2DIGIT
+ * Example: testModule@2016-10-27.
+ *
+ * If the revision date is not specified YMS first search for
+ * registered module/sub-module without revision date, if still can't obtain
+ * then uses registered module/sub-module with latest revision date.
+ *
+ * @param name name of child to be added
+ * @param namespace namespace of child to be added, if it's null, parent's
+ * namespace will be applied to child
+ * @param ydtType type of YDT node to be added
+ */
+ void addChild(String name, String namespace, YdtType ydtType);
+
+ /**
+ * Adds a last child to YANG data tree, this method is to be used by
+ * protocols which are unaware of the nature (single/multiple) of node.
+ * This is an overloaded method with operation type. This method can
+ * optionally
+ * be used when protocol doesn't want to specify operation type by
+ * keeping it null.
+ *
+ * Add child is used to add module/sub-module nodes also. Request may
+ * contain revision number corresponding to Module/sub-module in that
+ * case YMS expect revision number to be appended to module/sub-module
+ * name in the below mentioned format.
+ * module-or-submodule-name ['@' date-arg]
+ * date-arg = 4DIGIT "-" 2DIGIT "-" 2DIGIT
+ * Example: testModule@2016-10-27.
+ *
+ * If the revision date is not specified YMS first search for
+ * registered module/sub-module without revision date, if still can't obtain
+ * then uses registered module/sub-module with latest revision date.
+ *
+ * @param name name of child to be added
+ * @param namespace namespace of child to be added, if it's null, parent's
+ * namespace will be applied to child
+ * @param opType type of requested operation over a node
+ */
+ void addChild(String name, String namespace,
+ YdtContextOperationType opType);
+
+ /**
+ * Adds a last child to YANG data tree, this method is to be used by
+ * protocols which are aware of the nature (single/multiple) of node.
+ * This is an overloaded method with operation type. This method can
+ * optionally
+ * be used when protocol doesn't want to specify operation type by
+ * keeping it null.
+ *
+ * Add child is used to add module/sub-module nodes also. Request may
+ * contain revision number corresponding to Module/sub-module in that
+ * case YMS expect revision number to be appended to module/sub-module
+ * name in the below mentioned format.
+ * module-or-submodule-name ['@' date-arg]
+ * date-arg = 4DIGIT "-" 2DIGIT "-" 2DIGIT
+ * Example: testModule@2016-10-27.
+ *
+ * If the revision date is not specified YMS first search for
+ * registered module/sub-module without revision date, if still can't obtain
+ * then uses registered module/sub-module with latest revision date.
+ *
+ * @param name name of child to be added
+ * @param namespace namespace of child to be added, if it's null, parent's
+ * namespace will be applied to child
+ * @param ydtType type of YDT node to be added
+ * @param opType type of requested operation over a node
+ */
+ void addChild(String name, String namespace, YdtType ydtType,
+ YdtContextOperationType opType);
+
+
+ /**
+ * Adds a last leaf with value to YANG data tree. Protocols unaware of
+ * nature
+ * of leaf (single/multiple) will use it to add both single instance and
+ * multi instance node. Protocols aware of nature of node will use it for
+ * single instance value node addition.
+ * Value of leaf can be null which indicates selection node in get
+ * operation.
+ *
+ * @param name name of child to be added
+ * @param namespace namespace of child to be added, if it's null, parent's
+ * namespace will be applied to child
+ * @param value value of the child
+ */
+ void addLeaf(String name, String namespace, String value);
+
+ /**
+ * Adds a last leaf with list of values to YANG data tree. This method is
+ * used by protocols which knows the nature (single/multiple) of node for
+ * multi instance node addition.
+ * Value of leaf can be null which indicates selection node in get
+ * operation.
+ *
+ * @param name name of child to be added
+ * @param namespace namespace of child to be added, if it's null, parent's
+ * namespace will be applied to child
+ * @param valueSet list of value of the child
+ */
+ void addLeaf(String name, String namespace, Set<String> valueSet);
+
+ /**
+ * Adds YANG list's keys value in the order defined in list's key statement.
+ * All the keys must be present any missing key or invalid key will result
+ * in exception.
+ *
+ * @param keysValueList values of the keys in URI in the same order
+ * as defined in YANG file
+ */
+ void addKeyLeafs(List<String> keysValueList);
+
+ /**
+ * Traverses up in YANG data tree to the parent node, it is to be used when
+ * protocol is using context type "current" and wanted to traverse up the
+ * tree.
+ */
+ void traverseToParent();
+
+ /**
+ * Returns the current context information available in YDT node.
+ *
+ * @return current YDT context
+ */
+ YdtContext getCurNode();
+
+ /**
+ * Sets default operation type. This operation type is taken if operation
+ * type is not explicitly specified in request. If default operation type
+ * is not set, merge will be taken as default operation type.
+ *
+ * @param ydtContextOperationType default edit operation type
+ */
+ void setDefaultEditOperationType(
+ YdtContextOperationType ydtContextOperationType);
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContext.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContext.java
new file mode 100644
index 0000000..8d8152b
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContext.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ydt;
+
+import java.util.Set;
+
+/**
+ * Abstraction of an entity which represents YANG data tree context
+ * information. This context information will be used protocol to obtain
+ * the information associated with YDT node. This is used when protocol is
+ * walking the data tree in both visitor and listener mechanism.
+ */
+public interface YdtContext {
+
+ /**
+ * Returns the node name.
+ *
+ * @return node name
+ */
+ String getName();
+
+ /**
+ * Returns the node namespace.
+ *
+ * @return node namespace
+ */
+ String getNamespace();
+
+ /**
+ * Returns the YDT node extended context information corresponding to YDT
+ * node.
+ *
+ * @param <T> specifies YMS operation specific extended information
+ * associated with YDT context. It will be
+ * YdtContextOperationType in case extended information type
+ * is EDIT_REQUEST and will be YdtContextResponseInfo in case
+ * extended information type is RESPONSE.
+ * @return YdtContextOperationType YDT node operation type
+ */
+ <T> T getYdtContextExtendedInfo();
+
+ /**
+ * Returns YANG data tree extended information type. This is used to
+ * identify the type of extended information applicable for YDT node.
+ *
+ * @return type of extended information
+ */
+ YdtExtendedInfoType getYdtExtendedInfoType();
+
+ /**
+ * Returns the type of YDT entity. This type will be used by protocols to
+ * identify the nature of node and can implement it accordingly.
+ *
+ * @return YDT entity type
+ */
+ YdtType getYdtType();
+
+ /**
+ * Returns the context of parent node.
+ *
+ * @return context of parent node
+ */
+ YdtContext getParent();
+
+ /**
+ * Returns the context of first child.
+ *
+ * @return context of first child
+ */
+ YdtContext getFirstChild();
+
+ /**
+ * Returns the context of last child.
+ *
+ * @return context of last child
+ */
+ YdtContext getLastChild();
+
+ /**
+ * Returns the context of next sibling.
+ *
+ * @return context of next sibling
+ */
+ YdtContext getNextSibling();
+
+ /**
+ * Returns the context of previous sibling.
+ *
+ * @return context of previous sibling
+ */
+ YdtContext getPreviousSibling();
+
+ /**
+ * Returns value of node, this is only valid for single instance leaf
+ * node, to obtain the nature of the node protocols need to use
+ * getYdtType().
+ *
+ * @return value of node
+ */
+ String getValue();
+
+ /**
+ * Returns set of values of a node, this is only valid for multi instance
+ * leaf node, to obtain the nature of the node protocols need to use
+ * getYdtType().
+ *
+ * @return value of YDT leaf
+ */
+ Set<String> getValueSet();
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContextOperationType.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContextOperationType.java
new file mode 100644
index 0000000..4e2c686
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContextOperationType.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ydt;
+
+/**
+ * Represents type of YANG data tree node operation.
+ *
+ * This is used by protocols to specify edit operation associate with the node.
+ * YMS data validation and data handling will vary based on the edit operation
+ * type, for an instance, default leafs if not present in data should be added
+ * if edit operation type is create and shouldn't be added if operation type is
+ * delete.
+ * Edit operation type is mapped to "operation type" of YANG utils generated
+ * classes by YMS.
+ *
+ * In case of SBI driver/provider creates JAVA object (of YANG utils generated
+ * classes) and specifies the edit operation type in "operation type" field.
+ * YMS map this operation type to "edit operation type" of YDT, which will be
+ * further encoded in corresponding data format.
+ *
+ * This is only applicable if YANG root level interaction type is EDIT_CONFIG.
+ * If edit operation type is not specified when root interaction type is
+ * EDIT_CONFIG then default operation type will be selected.
+ * By default "default operation type" is "merge" unless explicitly specified
+ * by protocol.
+ */
+
+/*
+ * Edit operation type mapping with RESTCONF and NETCONF as example:
+ * +----------+----------------------------+------------+
+ * | RESTCONF | NETCONF | EditOpType |
+ * +----------+----------------------------+------------+
+ * | OPTIONS | none | NA |
+ * | HEAD | none | NA |
+ * | GET | <get-config>, <get> | NA |
+ * | POST | (operation="create") | CREATE |
+ * | PUT | (operation="replace") | REPLACE |
+ * | PATCH | (operation="merge") | MERGE |
+ * | DELETE | (operation="delete") | DELETE |
+ * | none | (operation="remove") | REMOVE |
+ * +----------+----------------------------+------------+
+ * Note: Additionally RESTCONF must use API resource to figure out whether
+ * request contains data resource or it's for data model specific operation.
+ * +--rw restconf
+ * +--rw data
+ * +--rw operations
+ * Edit operation type is only applicable for data resource.
+ *
+ * Additionally protocols has to use operation type NONE to specify the URI
+ * path.
+ */
+public enum YdtContextOperationType {
+
+ /**
+ * Type of YANG data tree action for below action:
+ * The configuration data identified by the element
+ * containing this attribute is added to the configuration if
+ * and only if the configuration data does not already exist in
+ * the configuration datastore. If the configuration data
+ * exists, an error is returned.
+ */
+ CREATE,
+
+ /**
+ * Type of YANG data tree action for below action:
+ * The configuration data identified by the element
+ * containing this attribute is deleted from the configuration
+ * if and only if the configuration data currently exists in
+ * the configuration datastore. If the configuration data does
+ * not exist, an error is returned".
+ */
+ DELETE,
+
+ /**
+ * Type of YANG data tree action for below action:
+ * The configuration data identified by the element
+ * containing this attribute is merged with the configuration
+ * at the corresponding level in the configuration datastore.
+ */
+ MERGE,
+
+ /**
+ * Type of YANG data tree action for below action:
+ * The configuration data identified by the element
+ * containing this attribute replaces any related configuration
+ * in the configuration datastore. If no such configuration
+ * data exists in the configuration datastore, it is created.
+ */
+ REPLACE,
+
+ /**
+ * Type of YANG data tree action for below action:
+ * The configuration data identified by the element
+ * containing this attribute is deleted from the configuration
+ * if the configuration data currently exists in the
+ * configuration datastore. If the configuration data does not
+ * exist, the "remove" operation is silently ignored by the
+ * server.
+ */
+ REMOVE,
+
+ /**
+ * The node is used as a containment node to reach the child node,
+ * There is no change in the data store for the values of this node in the
+ * edit request.
+ */
+ NONE
+}
+
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContextResponseInfo.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContextResponseInfo.java
new file mode 100644
index 0000000..279d33e
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContextResponseInfo.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ydt;
+
+/**
+ * Represents YANG context response information. It contains YDT node specific
+ * information for operation response like error information, particular node
+ * operation result etc.
+ */
+public interface YdtContextResponseInfo {
+ //TODO
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtExtendedInfoType.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtExtendedInfoType.java
new file mode 100644
index 0000000..2b75db0
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtExtendedInfoType.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ydt;
+
+/**
+ * Represents type of YANG data tree node operation.
+ */
+public enum YdtExtendedInfoType {
+
+ /**
+ * It specifies operation type edit request for YDT node. It is used to
+ * identify the YMS operation specific extended information associated
+ * with YDT context.
+ */
+ EDIT_REQUEST,
+
+ /**
+ * It specifies operation type RESPONSE for YDT node. It is used to
+ * identify the YMS operation specific extended information associated
+ * with YDT context.
+ */
+ RESPONSE
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtListener.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtListener.java
new file mode 100644
index 0000000..dbe4de3
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtListener.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ydt;
+
+/**
+ * Abstraction of an entity which provide call back methods which are called
+ * by YDT walker while walking the YANG data tree.
+ *
+ * In a response to execute operation YMS returns the YMS operation results
+ * with root YDT node. Now, protocols needs to walk through the YDT node and
+ * constructs the corresponding data format string. Protocol can opt to use
+ * listener or visitor based walking mechanism.
+ *
+ * This interface needs to be implemented by protocol implementing listener's
+ * based call backs while YDT walk.
+ */
+public interface YdtListener {
+
+ /**
+ * YANG data tree node's entry, it will be called during a node entry.
+ * All the related information about the node can be obtain from the YDT
+ * context.
+ *
+ * @param ydtContext YANG data tree context
+ */
+ void enterYdtNode(YdtContext ydtContext);
+
+ /**
+ * YANG data tree node's exit, it will be called during a node exit.
+ * All the related information about the node can be obtain from the YDT
+ * context.
+ *
+ * @param ydtContext YANG data tree context
+ */
+ void exitYdtNode(YdtContext ydtContext);
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtResponse.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtResponse.java
new file mode 100644
index 0000000..08d4aeb
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtResponse.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ydt;
+
+/**
+ * Represents YANG management system results. Protocols sends request to
+ * YANG management system for execution. YMS returns response in form of
+ * YANG data tree response
+ */
+public interface YdtResponse extends Ydt {
+
+ /**
+ * Returns YANG management system operation result. This status of the
+ * operation execution is returned
+ *
+ * @return YMS operation result
+ */
+ YmsOperationExecutionStatus getYmsOperationResult();
+
+ /*
+ * TODO: Applications layer error reporting to protocols.
+ */
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtType.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtType.java
new file mode 100644
index 0000000..01f6509
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtType.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ydt;
+
+/**
+ * Represents type of node in YANG data tree. Protocols based on input data
+ * format provide this information to YMS during YDT building. YMS use this
+ * information to carry out the validation against the schema information
+ * obtained as a part of application registration. Also as a part of response
+ * YMS encode this information in YDT node, protocol may use this information
+ * while construction the data format string.
+ *
+ * Protocols unaware of node type like NETCONF, may opt not to provide this
+ * information.
+ */
+public enum YdtType {
+
+ /**
+ * Single instance node.
+ */
+ SINGLE_INSTANCE_NODE,
+
+ /**
+ * Multi instance node.
+ */
+ MULTI_INSTANCE_NODE,
+
+ /**
+ * Single instance leaf node.
+ */
+ SINGLE_INSTANCE_LEAF_VALUE_NODE,
+
+ /**
+ * Multi instance leaf node.
+ */
+ MULTI_INSTANCE_LEAF_VALUE_NODE
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtWalker.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtWalker.java
new file mode 100644
index 0000000..569ae05
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtWalker.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ydt;
+
+/**
+ * Abstraction of an entity which provides interfaces for YDT walk.
+ *
+ * When YANG management system gets data from application to be returned
+ * to protocol for any protocol operation or as a part of notification, YANG
+ * management system encodes this data in a YANG data tree and sends the same
+ * to protocol.
+ * Protocols can use the YANG data tree walker utility to have their
+ * callbacks to be invoked as per the YANG data tree walking.
+ * By this way protocols can encode the data from abstract YANG data tree
+ * into a protocol specific representation.
+ *
+ * YDT walker provides entry and exit callbacks for each node in YANG data
+ * tree.
+ */
+public interface YdtWalker {
+
+ /**
+ * Walks the YANG data tree. Protocols implements YDT listener service
+ * and walks YDT tree with input as implemented object. YDT walker provides
+ * call backs to implemented methods.
+ *
+ * @param ydtListener YDT listener implemented by the protocol
+ * @param rootNode root node of YDT
+ */
+ void walk(YdtListener ydtListener, YdtContext rootNode);
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YmsOperationExecutionStatus.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YmsOperationExecutionStatus.java
new file mode 100644
index 0000000..3ac63ee
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YmsOperationExecutionStatus.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ydt;
+
+/**
+ * Abstraction of an entity which represents YANG management system operation
+ * result. Once the protocol translates the request information into a abstract
+ * YANG data tree, it uses YANG management system as a broker to get the
+ * operation executed in ONOS. Protocols uses a request Yang management
+ * system to delegate the operation request.
+ *
+ * YANG management system is responsible to split the protocol operation
+ * across application(s) which needs to participate, and collate the
+ * response(s) from application(s) and return an effective result of the
+ * operation request. The result of the operation request is returned in
+ * YMS operation result.
+ */
+public interface YmsOperationExecutionStatus {
+ // TODO
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/package-info.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/package-info.java
new file mode 100644
index 0000000..fb5a29f
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/package-info.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Provides interfaces to build and obtain YANG data tree which is data
+ * (sub)instance representation, abstract of protocol.
+ *
+ * NBI protocol implementation takes care of the protocol specific
+ * operations. They are abstracted from the intricacies of understanding
+ * the application identification or handling the interaction with
+ * applications.
+ *
+ * NBI protocols need to handle the encoding and decoding of data to the
+ * protocol specific format. They are unaware of the YANG of applications,
+ * i.e. protocols are unaware of the data structure / organization in
+ * applications.
+ *
+ * They need to translate the protocol operation request, into a protocol
+ * independent abstract tree called the YANG data tree (YDT). In order to
+ * enable the protocol in building these abstract data tree, YANG
+ * management system provides a utility called the YANG data tree builder.
+ *
+ * Using the YANG data tree utility API's protocols are expected to walk
+ * the data received in request and pass the information during the walk.
+ * YANG data tree builder, identifies the application which supports the
+ * request and validates it against the schema defined in YANG, and
+ * constructs the abstract YANG data tree.
+ */
+package org.onosproject.yms.ydt;
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsOperationType.java b/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsOperationType.java
new file mode 100644
index 0000000..45958de
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsOperationType.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ymsm;
+
+/**
+ * Represents type of root level operation for the request.
+ *
+ * This is used by protocols to specify the root level operation associated
+ * with the request. YMS data validation and data handling will vary based
+ * on the edit operation type, for an instance YANG specified "mandatory"
+ * leafs needn't be present for QUERY_CONFIG and QUERY, but they may be
+ * mandatory to be present in request for EDIT_CONFIG type. The validation
+ * and handling is further dependent on edit operation type.
+ *
+ * In SBI, driver/provider must provide this information to YMS which needs
+ * to encode this information in corresponding data format.
+ *
+ * YmsOperationType MUST be specified by protocol.
+ */
+
+/*
+ * Yang interaction type with RESTCONF and NETCONF as example:
+ * +--------------+-------------------+-------------+
+ * | RESTCONF | NETCONF | EditOpType |
+ * +--------------+-------------------+-------------+
+ * | OPTIONS | NA | NA |
+ * | HEAD | NA | NA |
+ * | GET | <get> | QUERY |
+ * | none | <get-config> | QUERY_CONFIG|
+ * | POST (data) | <edit-config> | EDIT_CONFIG |
+ * | PUT | <edit-config> | EDIT_CONFIG |
+ * | PATCH | <edit-config> | EDIT_CONFIG |
+ * | DELETE | <edit-config> | EDIT_CONFIG |
+ * | POST (op) | <rpc> | RPC |
+ * +--------------+-------------------+-------------+
+ *
+ * Note: Additionally RESTCONF must use API resource to figure out whether
+ * request contains data resource or it's for data model specific operation.
+ * +--rw restconf
+ * +--rw data
+ * +--rw operations
+ */
+public enum YmsOperationType {
+ /**
+ * The YANG based request is to edit a config node / subtree in the data
+ * store.
+ */
+ EDIT_CONFIG,
+
+ /**
+ * The YANG based request is to query a config node / subtree in the data
+ * store.
+ */
+ QUERY_CONFIG,
+
+ /**
+ * The YANG based request is to query a node / subtree in the data store.
+ */
+ QUERY,
+
+ /**
+ * The YANG based request is to execute an RPC defined in YANG.
+ */
+ RPC,
+
+ /**
+ * The YANG based request is to execute an RPC defined in YANG.
+ */
+ NOTIFICATION
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsService.java b/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsService.java
new file mode 100644
index 0000000..0c9d5f3
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsService.java
@@ -0,0 +1,308 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ymsm;
+
+import java.util.List;
+
+import org.onosproject.yms.ych.YangCodecHandler;
+import org.onosproject.yms.ydt.YdtBuilder;
+import org.onosproject.yms.ydt.YdtResponse;
+import org.onosproject.yms.ydt.YdtWalker;
+import org.onosproject.yms.ynh.YangNotificationService;
+
+/**
+ * Abstraction of an entity which provides interfaces to YANG management
+ * system. YMS is a core of YANG in ONOS.
+ *
+ * In NBI, it acts as a broker in between the protocol and application,
+ * here there is a separate protocol implementation, which does the conversion
+ * of protocol representation to abstract data tree. The protocol
+ * implementation takes care of the protocol specific actions for
+ * e.g. RESTCONF handling the entity-tag / timestamp related operations.
+ *
+ * In SBI, driver or provider uses YANG codec handler as a utility to translate
+ * the request information in java(YANG utils generated) to protocol specific
+ * format and vice versa.
+ */
+public interface YmsService {
+
+ /**
+ * Returns YANG data tree builder.
+ *
+ * NBI protocol implementation takes care of the protocol specific
+ * operations. They are abstracted from the intricacies of understanding
+ * the application identification or handling the interaction with
+ * applications.
+ *
+ * NBI protocols need to handle the encoding and decoding of data to the
+ * protocol specific format. They are unaware of the YANG of applications,
+ * i.e. protocols are unaware of the data structure / organization in
+ * applications.
+ *
+ * They need to translate the protocol operation request, into a protocol
+ * independent abstract tree called the YANG data tree (YDT). In order to
+ * enable the protocol in building these abstract data tree, YANG
+ * management system provides a utility called the YANG data tree builder.
+ *
+ * Using the YANG data tree utility API's protocols are expected to walk
+ * the data received in request and pass the information during the walk.
+ * YANG data tree builder, identifies the application which supports the
+ * request and validates it against the schema defined in YANG, and
+ * constructs the abstract YANG data tree.
+ *
+ * Interaction type is a MANDATORY parameter which is used by YANG
+ * management system to perform the required operation in ONOS.
+ *
+ * NOTE: Same YDT builder instance cannot be reused across different
+ * operation request. A new instance needs to be used for every operation.
+ *
+ * Returns YANG data tree builder logical root container node.
+ * Protocol use this to logical root container to hold schema specific data
+ * that spans across different modules schema.
+ *
+ * @param logicalRootName name of a protocol specific logical container
+ * node to group data across multiple applications.
+ * This is only a logical container to group more
+ * than one application's root node. It is not
+ * validated against any YANG definition
+ * @param rootNamespace namespace of logical root container, if any,
+ * otherwise it can be sent as null
+ * @param operationType maps the request type to a corresponding
+ * operation request type to YANG management system
+ * @return YANG data tree builder, using which the abstract tree can be
+ * built corresponding to the data exchanged between protocol and YANG
+ * management system.
+ */
+ YdtBuilder getYdtBuilder(String logicalRootName, String rootNamespace,
+ YmsOperationType operationType);
+
+ /**
+ * Returns YANG data tree builder attached with a given schema registry.
+ *
+ * YMS provides a framework where-in protocols can register their protocol
+ * data format specific CODECS with YMS. These registered CODEC will be
+ * used by YMS to perform translations from data format to YDT and YDT to
+ * data format. YMS may intend to use these CODECS both for NBI and SBI.
+ *
+ * To perform decode i.e. generate YDT for given data format string, these
+ * CODECS implementation needs to call the API's of YDT. YDT referred the
+ * registered schema information while building tree. In case of NBI their
+ * is a single schema registry, but for SBI schema registry is per
+ * driver/provider.
+ *
+ * Now this schema registry information is provided to protocols
+ * CODECS while invoking "decodeProtocolDataToYdt" and
+ * "decodeCompositeProtocolDataToYdt", protocol CODECS needs to provide
+ * the schema registry while getting instance of YDT builder.
+ * The schemaRegistry may be null when the YMS is performing decode for NBI
+ * protocols.
+ *
+ * Validations for NBI and SBI will vary, schemaRegistry value will also
+ * indicate the usage scenario and will be used by YdtBuilder to carry out
+ * necessary validations.
+ *
+ * This is an overloaded method to YdtBuilder which MUST be used by the
+ * overridden protocols CODECS.
+ *
+ * @param logicalRootName name of a protocol specific logical container
+ * node to group data across multiple
+ * applications.
+ * This is only a logical container to group
+ * more
+ * than one application's root node. It is not
+ * validated against any YANG definition
+ * @param rootNamespace namespace of logical root container, if any,
+ * otherwise it can be sent as null
+ * @param operationType maps the request type to a corresponding
+ * operation request type to YANG management
+ * system
+ * @param schemaRegistryForYdt schema registry for Ydt, protocol CODECS get
+ * this value from YMS in
+ * "decodeProtocolDataToYdt" and
+ * "decodeCompositeProtocolDataToYdt" and
+ * provide it while obtaining YdtBuilder
+ * @return YANG data tree builder, using which the abstract tree can be
+ * built corresponding to the data exchanged between protocol and YANG
+ * management system.
+ */
+ YdtBuilder getYdtBuilder(String logicalRootName, String rootNamespace,
+ YmsOperationType operationType,
+ Object schemaRegistryForYdt);
+
+ /**
+ * Returns YANG data tree walker.
+ *
+ * YANG management system gets data from application to be returned
+ * in protocol operation or to notify to protocol(s) clients, YANG
+ * management system encodes the data in a YANG data tree and informs the
+ * protocol.
+ * Protocols can use the YANG data tree walker utility to have their
+ * callbacks to be invoked as per the YANG data tree walking.
+ * By this way protocols can encode the data from abstract YANG data tree
+ * into a protocol specific representation.
+ *
+ * @return YANG data tree walker utility
+ */
+ YdtWalker getYdtWalker();
+
+ /**
+ * Once the NBI protocol translates the request information into an abstract
+ * YANG data tree, it uses YANG management system as a broker to get the
+ * operation executed in ONOS.
+ *
+ * YANG management system is responsible to split the protocol operation
+ * across application(s) which needs to participate, and collate the
+ * response(s) from application(s) and return an effective result of the
+ * operation request.
+ *
+ * YMS identifies the type of operation to be performed using the
+ * operation type in YANG builder data tree and process the corresponding
+ * operation request on the applicable application(s).
+ * The response information maintained in response YANG data tree and
+ * given to NBI protocol's to encode it using a YANG data tree walker.
+ *
+ * Depending on the operation type set in the YANG builder tree, the
+ * application(s) get / set / operation interface is invoked.
+ * These interface are part to the YANG modelled service interface.
+ *
+ * @param operationRequest operation request that was constructed
+ * by NBI protocol using YANG data tree
+ * builder. This operation request contains
+ * operation request that needs to be
+ * executed on the applicable application(s)
+ * @return returns the result of the operation execution.
+ * Depending on the operation type, the YANG response data tree can have
+ * the following information.
+ *
+ * In case of EDIT_CONFIG operation, it will have the status of the
+ * operation execution. If there is any applications schema specific
+ * error, then the schema error information will be encoded in the
+ * corresponding context node. In case the edit operation is successful
+ * there is no YANG response data tree created, hence getRootNode will
+ * return null.
+ *
+ * In case of query operation, it will have the status of the operation
+ * execution. If there is any application schema specific error, then
+ * schema error information will be encoded in the corresponding YANG
+ * context. In case the query operation is successful, YANG data tree
+ * contains the application data that matched the filter in the
+ * operation request. NBI protocol to use a Yang data tree walker to
+ * construct the protocol specific reply.
+ *
+ * In case of RPC operation, it will have the status of the operation
+ * execution. If there is any application schema specific error, then
+ * schema error information will be encoded in the corresponding YANG
+ * context. In case the RPC operation is successful, and the RPC
+ * does not have any RPC reply in YANG, then the YANG data tree will
+ * be null.
+ * In case the RPC has a RPC reply in YANG, then the YANG data tree
+ * will contain the application's RPC reply schema specific .
+ * NBI protocol to use a Yang data tree walker to construct the
+ * protocol specific reply.
+ */
+ YdtResponse executeOperation(YdtBuilder operationRequest);
+
+ // TODO execute operation which directly take data format string as input.
+
+ /**
+ * Returns YANG notification service.
+ *
+ * NBI Protocols which can support notification delivery for application(s)
+ * needs to add themselves as a listeners with YANG notification service.
+ * Also protocols can use YANG notification service to check if a received
+ * notification should be filtered against any of their protocol specific
+ * filtering mechanism.
+ *
+ * @return YANG notification service instance
+ */
+ YangNotificationService getYangNotificationService();
+
+ /**
+ * Registers service with YANG management system.
+ *
+ * Applications model their exposed interface in YANG, and register with
+ * YANG management system, so that it can be configured / managed by the
+ * set of protocols supported in ONOS.
+ *
+ * ONOS YANG tools generate the applications service interface
+ * corresponding to the application's interface designed in YANG.
+ *
+ * The Application which implements this service registers the generated
+ * service with YANG management system. The generated service interfaces
+ * have all the information modeled by applications in YANG.
+ *
+ * Registers application's YANG model with YANG management system. This
+ * is used by applications/core to register their service with YMS.
+ *
+ * @param appManager application manager instance which is
+ * implementing the service defined in YANG.
+ * @param yangService service interface generated by ONOS YANG
+ * tools corresponding to the interface modeled
+ * in YANG.
+ * @param supportedFeatureList mentions the list of YANG features supported
+ * by the application implementation.
+ * If it is null, then the application
+ * implementation supports all the features
+ * defined in the registered YANG module.
+ */
+ void registerService(Object appManager, Class<?> yangService,
+ List<String> supportedFeatureList);
+
+ /**
+ * Unregisters service which is registered in YANG management system.
+ *
+ * Applications model their exposed interface in YANG, and register with
+ * YANG management system, so that it can be configured / managed by the
+ * set of protocols supported in ONOS.
+ *
+ * ONOS YANG tools generate the applications service interface
+ * corresponding to the application's interface designed in YANG.
+ *
+ * The Application which implements this service registers the generated
+ * service with YANG management system. The generated service interfaces
+ * have all the information modeled by applications in YANG.
+ *
+ * Registers application's YANG model with YANG management system. This
+ * is used by applications/core to register their service with YMS.
+ *
+ * @param appManager application manager instance which is implementing
+ * the service defined in YANG.
+ * @param yangService service interface generated by ONOS YANG tools
+ * corresponding to the interface modeled in YANG.
+ */
+ void unRegisterService(Object appManager, Class<?> yangService);
+
+ /**
+ * Returns YANG codec handler utility.
+ *
+ * In SBI, the provider or driver uses YANG management system as a CODEC
+ * utility. These providers/drivers use the YANG codec utility to register
+ * the device schema. YANG utils is used to generate the java files
+ * corresponding to the device schema. Provider or driver use these classes
+ * to seamlessly manage the device as java objects. While sending the
+ * request to device, drivers use the utility to translate the objects to
+ * protocol specific data representation and then send to the device.
+ * Protocol or driver use the same instance of the codec utility across
+ * multiple translation request. Protocol or driver should not use the same
+ * instance of utility concurrently.
+ *
+ * @return YANG codec utility
+ */
+ YangCodecHandler getYangCodecHandler();
+
+ // TODO exceptions handling and sending.
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/package-info.java b/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/package-info.java
new file mode 100644
index 0000000..d6bbc6e
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/package-info.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Provides interfaces to YANG application management system manager. YMSM is
+ * manager of the YANG Core.
+ *
+ * In NBI, it acts as a broker in between the protocol and application,
+ * here there is a separate protocol implementation, which does the conversion
+ * of protocol representation to abstract data tree. The protocol
+ * implementation takes care of the protocol specific actions for
+ * e.g. RESTCONF handling the entity-tag / timestamp related operations.
+ *
+ * In SBI, driver or provider uses YANG codec handler as a utility to translate
+ * the request information in java(YANG utils generated) to protocol specific
+ * format and vice versa.
+ */
+package org.onosproject.yms.ymsm;
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationService.java b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationService.java
new file mode 100644
index 0000000..1beb498
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationService.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.ynh;
+
+/**
+ * Abstraction of an entity which provides interfaces to YANG notification
+ * service. YNH handles notification from the application/core and provide
+ * it to the protocols.
+ * <p>
+ * NBI Protocols which can support notification delivery for application(s)
+ * needs to add themselves as a listeners with YANG notification service.
+ * Protocols can use YANG notification service to check if a received
+ * notification should be filtered against any of their protocol specific
+ * filtering mechanism.
+ */
+public interface YangNotificationService {
+ //TODO
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ynh/package-info.java b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/package-info.java
new file mode 100644
index 0000000..4c62822
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/package-info.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Provides interfaces to YANG notification handler. YNH handles notification
+ * from the application and provide it to the protocols.
+ */
+
+/**
+ * Provides interfaces to YANG notification service.
+ *
+ * NBI Protocols which can support notification delivery for application(s)
+ * needs to add themselves as a listeners with YANG notification service.
+ * Protocols can use YANG notification service to check if a received
+ * notification should be filtered against any of their protocol specific
+ * filtering mechanism.
+ */
+package org.onosproject.yms.ynh;
diff --git a/apps/yms/app/BUCK b/apps/yms/app/BUCK
new file mode 100644
index 0000000..8da70d1
--- /dev/null
+++ b/apps/yms/app/BUCK
@@ -0,0 +1,8 @@
+COMPILE_DEPS = [
+ '//lib:CORE_DEPS',
+ '//apps/yms/api:onos-apps-yms-api',
+]
+
+osgi_jar_with_tests(
+ deps = COMPILE_DEPS,
+)
diff --git a/apps/yms/app/app.xml b/apps/yms/app/app.xml
new file mode 100644
index 0000000..6749a2a
--- /dev/null
+++ b/apps/yms/app/app.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2015-present Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<app name="org.onosproject.yms" origin="ON.Lab" version="${project.version}"
+ category="Utility" url="http://onosproject.org" title="YMS App"
+ featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
+ features="${project.artifactId}">
+ <description>${project.description}</description>
+ <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
+ <artifact>mvn:${project.groupId}/onos-app-yms-api/${project.version}</artifact>
+</app>
diff --git a/apps/yms/app/features.xml b/apps/yms/app/features.xml
new file mode 100644
index 0000000..4daf677
--- /dev/null
+++ b/apps/yms/app/features.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+ ~ Copyright 2015-present Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
+ <feature name="${project.artifactId}" version="${project.version}"
+ description="${project.description}">
+ <feature>onos-api</feature>
+ <bundle>mvn:${project.groupId}/onos-app-yms-api/${project.version}</bundle>
+ <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
+ </feature>
+</features>
diff --git a/apps/yms/app/pom.xml b/apps/yms/app/pom.xml
new file mode 100644
index 0000000..ea9a64d
--- /dev/null
+++ b/apps/yms/app/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2015-present Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>onos-yms</artifactId>
+ <groupId>org.onosproject</groupId>
+ <version>1.7.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>onos-app-yms</artifactId>
+ <packaging>bundle</packaging>
+
+ <url>http://onosproject.org</url>
+
+ <description>YANG management system application</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-yms-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onlab-junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-api</artifactId>
+ <classifier>tests</classifier>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/apps/yms/pom.xml b/apps/yms/pom.xml
new file mode 100644
index 0000000..1b9ba48
--- /dev/null
+++ b/apps/yms/pom.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2015-present Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-apps</artifactId>
+ <version>1.7.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>onos-yms</artifactId>
+ <packaging>pom</packaging>
+
+ <description>ONOS YANG management system</description>
+
+ <modules>
+ <module>api</module>
+ <module>app</module>
+ </modules>
+
+</project>