Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents
maxLevel4
Team


NameOrganizationEmail
Adarsh MHuawei Technologiesadarsh.m@huawei.com
Bharat SaraswalHuawei Technologiesbharat.saraswal@huawei.com
Gaurav Agrawal Huawei Technologiesgaurav.agrawal@huawei.com
Janani BHuawei Technologiesjanani.b@huawei.com
Sathish Kumar MHuawei Technologiessathishkumar.m@huawei.com
Suchitra H NHuawei Technologiessuchitra.hn@huawei.com
Vidyashree RamaHuawei Technologiesvidyashree.rama@huawei.com
Vinod Kumar SHuawei Technologiesvinods.kumar@huawei.com
ShankaraHuawei Technologies

shankara@huawei.com

Mahesh Poojary SHuawei Technologies

mahesh.poojary@huawei.com

Requirements for Hummingbird Release

Requested ByRequirementsSuggested Priority (high - Middle -Low)Current Status
Thomas Vachuska
Thanks for the demo of the YANG utilities at today’s TST meeting. While a lot of good work was done in the last release, I was a little bit surprised that the codec functionality was pushed off to the next release - and that NB-related concerns superseded SB-related ones. In my view, this is the basic value of using the YANG models - as it provides the ability to consume/produce XML payloads that are complaint with the model in a structured manner via Java API.
We have a set of use-cases for this to control/configure devices via NETCONF. Presently we have to accomplish this using hand-crafted XML and we were hoping to use the YANG tools-generated codecs for this. Consequently the SB use of YANG is of much more importance to us than the NB use of YANG - at least for the near-term.
In the Hummingbird release we need to be able to use the YANG tools generated artifacts together with our existing NETCONF sub-controller to produce driver implementations for several packet and optical devices. For this reason, I would like to request that this work be prioritized over anything else with respect to other YANG-related work. In order for that to happen, I think a number of other important questions will have to be answered and accounted for in the overall design of the YANG utilities:
  • Generated code for device models needs to be able to facilitate interactions with multiple devices that support the same model. This means that generated code should be stateless and avoid singleton service pattern. It should also take care not to intertwine transport concerns with encoding concerns (it should really only cover the latter).
  • Generated code should avoid commingling of code that is pure codec and not expected to be touched by humans versus RPC skeletal code whose innards are expected to be manually ‘implemented’ by humans and checked-in. This should simplify code re-generation as the model evolves
Highreviewing
Ali Al-ShabibiJSON or JSON-Schema Intermediary Representation. It would be nice if we could go from YANG to JSON or JSON-Schema because from this IR format we can easily go to XML or JSON or some other format that another protocol may want to use. As you probably know, Netconf is only one of the southbound to deliver payloads other ones such as gRPC or REST can be used.medium 
Marc De Leenheer

Support for OpenROADM YANG models. The specification contains two parts, a service-level model (NB) and a device-level model (SB). The first phase has already started, we want to integrate the device model into ONOS by early Q3 2016. In Q4 we will do the service level models. This is high priority work in collaboration with AT&T.

http://openroadm.org/home.html

high 
Aihua GuoIn order to support the use of standard IETF YANG models as an NBI for hierarchical SDN control, it is expected that the following YANG data constructs be supported in the H releases: augment (partially supported in G release), identity, feature/if-feature, when, must, leafref, path, require-instance. These data constructs are defined by YANG 1.1, and most of the IETF YANG models contain those constructs written in YANG 1.1.high 

Overview

    YANG is a data modeling language used to model configuration & state data. Modeling languages such as SMI (SNMP), UML, XML Schema, and others already existed. However, none of these languages were specifically targeted to the needs of configuration management. They lacked critical capabilities like being easily read and understood by human implementers, and fell short in providing mechanisms to validate models of configuration data for semantics and syntax.

     YANG Utils are the basic building block to achieve the final goal of abstracting the language based Syntax/Semantics processing by APPs.

 Image Removed

The YANG modeled interfaces need to be implemented by corresponding application component. There are 2 parts in implementing the interface:

  1. syntax/semantics processing of the request/response being exchanged.
  2. business logic to compute the request.

We intend to abstract the applications from syntactic processing of information encoding with external world.We intend to provide a framework in which the applications only need to implement the business logic and seamlessly support any interface language like REST, NETCONF etc.    

Steps to use YANG utils

Step1 : Create a test app and add YANG utils maven plugin to pom file’s build section

Code Block
<build>
  <plugins>
    <plugin>
      <groupId>org.onosproject</groupId>
      <artifactId>yangutils-maven-plugin</artifactId>
      <version>1.0.0-SNAPSHOT</version>
      <executions>
        <execution>
          <configuration>
          </configuration>
          <goals>
            <goal>yang2java</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Step 2 : Add dependency to pom file’s dependency section

Code Block
<dependencies>
    <dependency>
        <groupId>org.onosproject</groupId>
        <artifactId>yangutils-maven-plugin</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.onosproject</groupId>
        <artifactId>onos-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.apache.felix.scr.annotations</artifactId>
    </dependency>
</dependencies>

Step 3 : Plugin configuration supported in YANG utils 

  1. Create a folder structure as “src/main/yang” in the test app folder and place your YANG files in it. In case user want to give desired path for source YANG files and generated java files, the following configuration can be appended to the above pom.xml file.

    Code Block
    <configuration>
        <yangFilesDir>DesiredYangFilesPath</yangFilesDir>
        <genFilesDir>DesiredGeneratedJavaFilesPath</genFilesDir> 
    </configuration>

Step 4 : Execution of application

Build using mvn clean install/ mvn install. Generated java code will be placed in default directory or in desired destination folder configured by user.

Info
titleCode generated is as per ONOS coding guidelines.

 

YANG utils constructs support/plan

YANG ConstructSupported/Planned version
anyxmlNot planned
argumentNot planned
augmentGoldeneye
baseHummingbird
belongs-toGoldeneye
bitGoldeneye
caseGoldeneye
choiceGoldeneye
configFalcon
contact

Goldeneye

Enhancement in Hummingbird

containerFalcon
default

Goldeneye

Enhancement in Humminbird

description

Goldeneye

Enhancement in Hummingbird

deviateNot planned
deviationNot planned
enumGoldeneye
error-app-tagNot planned
error-messageNot planned
extensionNot planned
featureHummingbird
fraction-digitsGoldeneye
groupingGoldeneye
identityHummingbird
if-featureHummingbird
import

Goldeneye

Enhancement in Hummingbird

include

Goldeneye

Enhancement in Hummingbird

inputGoldeneye
keyGoldeneye
leafFalcon
leaf-listFalcon
lengthGoldeneye
listFalcon
mandatoryFalcon
max-elementsGoldeneye
min-elementsGoldeneye
moduleFalcon
mustHummingbird
namespaceGoldeneye
notificationGoldeneye
ordered-byNot planned
organization

Goldeneye

Enhancement in Hummingbird
outputGoldeneye
pathHummingbird
patternGoldeneye
positionGoldeneye
prefixGoldeneye
presenceGoldeneye
rangeGoldeneye
reference

Goldeneye

Enhancement in Hummingbird
refineNot planned
require-instanceNot planned
revision

Goldeneye

Enhancement in Hummingbird
revision-date

Goldeneye

rpcGoldeneye
status

Goldeneye

Enhancement in Hummingbird
submoduleGoldeneye
typeGoldeneye
typedefGoldeneye
uniqueNot Planned
units

Goldeneye

uses

Goldeneye

Enhancement in Hummingbird

valueGoldeneye
whenHummingbird
yang-versionGoldeneye
yin-elementNot Planned

Built-in YANG data types support/plan

Binary

Goldeneye

Enhancement in Hummingbird
Bits

Goldeneye

Enhancement in Hummingbird
booleanGoldeneye
decimal64

Goldeneye

Enhancement in Hummingbird
emptyGoldeneye
enumerationGoldeneye
identityrefHummingbird
instance-identifierHummingbird
int8Goldeneye
int16Goldeneye
int32Goldeneye
int64Goldeneye
leafrefHummingbird
stringFalcon
uint8Goldeneye
uint16Goldeneye
uint32Goldeneye
uint64Goldeneye
unionGoldeneye

Generated JAVA Details

Common behavior

Identifier

The identifier name of YANG constructs are taken, and are used in java by converting it to lower camel case. Identifier names are allowed to have three special characters such as “-”, ”_”, “.”. Whereas, in java, we cannot use these special characters. These characters will be removed during conversion. Conversion takes place by following the below rules of lower camel case.

  • The first letter of the identifier will be a small letter. If the three special characters occur alone or in group, they will be removed and the consecutive letter will be capitalized.

      • name-conversion will be mapped as nameConversion

      • yang-._constuct-generation will be mapped as yangConstuctGeneration

  • When identifier name has a special character followed by a number, the following letter from the digits will be capitalized.

      • yang_123construct will be mapped to yang123Construct

  • In java file, class name or attribute name cannot have java keyword or start with digits. During the conversion into java, we add prefix to the identifier “yangAutoPrefix”, by default.

      • _123date will be mapped to yangAutoPrefix123Date

      • const will be mapped to yangAutoPrefixConst

  • As per camelcase conversion rules, no two consecutive letters will have capitalization and the last letter will also not be capitalized. 

      • ca-l.e_nder will be mapped to caLeNder
      • tric-._k will be mapped to trick  
  • If users input has capital case, the following will be the conversion methods.

      • TESTNAME will be mapped to testname

      • TEST-NAME will be mapped to testName

      • TestName will be mapped to testName

      •  TEST3NAME will be mapped to test3Name

Info
titleWhen the identifier has to be used as java class name, after the above conversion, the first letter will be capitalized and if consecutive capital letters are present, it will be corrected and assigned as java class name.

 

Namespace

The namespace is a mandatory statement in the module. We define namespace for URL/URI and for folder structure of generated java code. Here in ONOS YANG plugin, namespace forms a folder structure which in turn will be the package name in java.

The package will have “org.onosproject.yang.gen.v1.” by default in it. The namespace will be added to the above and the folder structure will also be formed respectively. This becomes the parent package. The conversion from YANG namespace to the java package will take place as below.

Rama Subba Reddy SHuawei Technologies

Rama.Subba.Reddy.S@huawei.com

Sonu GuptaHuawei Technologiessonu.gupta@huawei.com
A U suryaHuawei Technologies

A.u.surya@huawei.com

Overview

    YANG is a data modeling language used to model configuration & state data. Modeling languages such as SMI (SNMP), UML, XML Schema, and others already existed. However, none of these languages were specifically targeted to the needs of configuration management. They lacked critical capabilities like being easily read and understood by human implementers, and fell short in providing mechanisms to validate models of configuration data for semantics and syntax.

     YANG tools are the basic building block to achieve the final goal of abstracting the language based Syntax/Semantics processing by APPs.

 Image Added

The YANG modeled interfaces need to be implemented by corresponding application component. There are 2 parts in implementing the interface:

  1. Syntax/semantics processing of the request/response being exchanged. 
  2. Business logic to compute the request. 

We intend to abstract the applications from syntactic processing of information encoding with external world.We intend to provide a framework in which the applications only need to implement the business logic and seamlessly support any interface language like REST, NETCONF etc.    

Steps to use YANG tools

Yang Buck Plugin :

Step 1 : Create a test app and add yang dependency as shown below.

Code Block
COMPILE_DEPS = [
  '//lib:CORE_DEPS',
  '//lib:onos-yang-model',
]
yang_osgi_jar(
  deps = COMPILE_DEPS,
  name = 'onos-apps-l3vpn-yangmodel',
  srcs = glob(['src/main/**/*.yang']),
  visibility = [
    'PUBLIC'
  ],
)

Step 2: Create a folder structure as “src/main/yang” in the test app folder and place your YANG files in it.

Step 3 : Build using buck build onos command. Generated java code will be placed in default directory or in desired destination folder configured by user.


Yang Maven Plugin :

Step1 : Create a test app and add YANG tools maven plugin to pom file’s build section

Code Block
<build>
  <plugins>
    <plugin>
      <groupId>org.onosproject</groupId>
      <artifactId>onos-yang-maven-plugin</artifactId>
      <version>1.9</version>
      <executions>
        <execution>
         <configuration>
             <classFileDir>src/main/java</classFileDir>
          </configuration>
          <goals>
            <goal>yang2java</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Step 2 : Add dependency to pom file’s dependency section only if your yang file contains notification in it. You need to add dependencies for "onos-api".

Step 3 : Plugin configuration supported in YANG tools 

  1. Create a folder structure as “src/main/yang” in the test app folder and place your YANG files in it. In case user want to give desired path for source YANG files and generated java files, the following configuration can be appended to the above pom.xml file. 

    Code Block
    <configuration>
        <yangFilesDir>DesiredYangFilesPath</yangFilesDir>
        <classFileDir>DesiredGeneratedJavaFilesPath</classFileDir> 
    </configuration>

Step 4 : Execution of application

Build using mvn clean install/ mvn install. Generated java code will be placed in default directory or in desired destination folder configured by user.

Info
titleCode generated is as per ONOS coding guidelines.

Note:

  1. If user does not provide any configurations for code generation , code will be generated in "target/generated-sources" folder. This folder conatains majorly,
    i) Service interface for module.
    ii) Module interface and its param class.
    iii) Interfaces of child constructs of module and their default implementation class.
  2. If a yang file contains only typedef/grouping nodes, there will not be any generation of service class only one interface will be generated.

YANG tools constructs support/plan

YANG ConstructSupported/Planned version
anyxmlNot planned
argumentHummingbird(partial support)
augmentGoldeneye
uses-augmentLoon
baseHummingbird
belongs-toGoldeneye
bitHummingbird
caseGoldeneye
choiceGoldeneye
configFalcon
contact

Goldeneye

Enhancement in Hummingbird

containerFalcon
default

Goldeneye

Enhancement in Humminbird

description

Goldeneye

Enhancement in Hummingbird

deviateNot planned
deviationNot planned
enumGoldeneye
error-app-tagHummingbird
error-messageHummingbird
extensionHummingbird(partial support)
featureHummingbird
fraction-digitsHummingbird
groupingGoldeneye
identityHummingbird
if-featureHummingbird
import

Goldeneye

Enhancement in Hummingbird

include

Goldeneye

Enhancement in Hummingbird

inputGoldeneye
keyGoldeneye
leafFalcon
leaf-listFalcon
lengthGoldeneye
listFalcon
mandatoryFalcon
max-elementsGoldeneye
min-elementsGoldeneye
moduleFalcon
mustHummingbird
namespaceGoldeneye
notificationGoldeneye
ordered-byNot planned
organization

Goldeneye

Enhancement in Hummingbird
outputGoldeneye
pathHummingbird
patternGoldeneye
positionGoldeneye
prefixGoldeneye
presenceGoldeneye
rangeGoldeneye
reference

Goldeneye

Enhancement in Hummingbird
refineNot planned
require-instanceHummingbird
revision

Goldeneye

Enhancement in Hummingbird
revision-date

Goldeneye

rpcGoldeneye
status

Goldeneye

Enhancement in Hummingbird
submoduleGoldeneye
typeGoldeneye
typedefGoldeneye
unique  Kingfisher
unknown Kingfisher
units

Goldeneye

uses

Goldeneye

Enhancement in Hummingbird

valueGoldeneye
whenHummingbird
yang-versionGoldeneye
yin-elementNot Planned

Built-in YANG data types support/plan

Binary

Goldeneye

Enhancement in Hummingbird
Bits

Goldeneye

Enhancement in Hummingbird
booleanGoldeneye
decimal64

Goldeneye

Enhancement in Hummingbird
emptyGoldeneye
enumerationGoldeneye
identityrefHummingbird
instance-identifierHummingbird
int8Goldeneye
int16Goldeneye
int32Goldeneye
int64Goldeneye
leafrefHummingbird
stringFalcon
uint8Goldeneye
uint16Goldeneye
uint32Goldeneye
uint64Goldeneye
unionGoldeneye

Generated JAVA Details

Common behavior

Identifier

The identifier name of YANG constructs are taken, and are used in java by converting it to lower camel case. Identifier names are allowed to have three special characters such as “-”, ”_”, “.”. Whereas, in java, we cannot use these special characters. These characters will be removed during conversion. Conversion takes place by following the below rules of lower camel case.

  • The first letter of the identifier will be a small letter. If the three special characters occur alone or in group, they will be removed and the consecutive letter will be capitalized.

    • name-conversion will be mapped as nameConversion

    • yang-._constuct-generation will be mapped as yangConstuctGeneration

  • When identifier name has a special character followed by a number, the following letter from the digits will be capitalized.

    • yang_123construct will be mapped to yang123Construct

  • In java file, class name or attribute name cannot have java keyword or start with digits. During the conversion into java, we add prefix to the identifier “yangAutoPrefix”, by default.

    • _123date will be mapped to yangAutoPrefix123Date

    • const will be mapped to yangAutoPrefixConst

  • As per camelcase conversion rules, no two consecutive letters will have capitalization and the last letter will also not be capitalized. 

      • ca-l.e_nder will be mapped to caLeNder
      • tric-._k will be mapped to trick  
  • If users input has capital case, the following will be the conversion methods.

    • TESTNAME will be mapped to testname

    • TEST-NAME will be mapped to testName

    • TestName will be mapped to testName

    •  TEST3NAME will be mapped to test3Name

Info
titleWhen the identifier has to be used as java class name, after the above conversion, the first letter will be capitalized and if consecutive capital letters are present, it will be corrected and assigned as java class name.

If an identifier for a construct contains java keywords, then it name will be prefixed with "yangAutoPrefix" in generated code.

Namespace

The namespace is a mandatory statement in the module. We define namespace for URL/URI and for folder structure of generated java code. Here in ONOS YANG plugin, namespace forms a folder structure which in turn will be the package name in java.

  • The package will have “org.onosproject.yang.gen.v1.” by default in it. The namespace will be added to the above and the folder structure will also be formed respectively. This becomes the parent package. The conversion from YANG namespace to the java package will take place as below.

  • When a node appears, with child node in it, a new package will be generated under the parent package, for that node. The new package is, parent package appended with the node name. The class for that node will be placed under this newly created package.

Example
Code Block
titleInput YANG file
File : acme-system.yang
module acme-system {
     namespace 

...

The complete namespace will be changed to lowercase letters. When special characters or a group of special characters are found, it replaces those characters by dot.

"http://acme.example.com/system"

...

In java the package cannot have folder name  which begins with digits or java keyword. Incase if found in YANG file these will be converted by adding prefix “yangautoprefix”.

...

When a node appears, with child node in it, a new package will be generated under the parent package, for that node. The new package is, parent package appended with the node name. The class for that node will be placed under this newly created package.

Example
Code Block
titleInput YANG file
File : acme-system.yang
module acme-system {
     namespace "http://acme.example.com/system;
     prefix "acme";
     organization "ACME Inc.";
     contact "joe@acme.example.com";
     description
        "The module for entities implementing the ACME system.";
     revision 2007-06-09 {
         description "Initial revision.";
     prefix "acme";}
     organizationcontainer "ACME Inc.";system {
     contact "joe@acme.example.com";
   container login description{
        "The module for entities implementing theleaf ACME system.";message {
     revision 2007-06-09 {
         description "Initial revision.";
     }
       container system {
         container login {
             leaf message {
                 type string;
                 description
                     "Message given at start of login session";
             }
        }
    }
    .
    .
    .
}

...

Code Block
titleGenerated Java files
File : System.java
package org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem;
    .
    .
    .
public interface System extends AugmentationHolder  {
    .
    .
    .
}

File : Login.java
package 
import org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem.system.Login; 

/** 
 * Abstraction .
of an entity which .
represents the functionality of system. 
 */ 
public interface Login extends AugmentationHolder  {
 System { 

    /** 
     * Returns the attribute login. 
     * .
    .
}

Javadocs

 * @return login value of login 
     */ 
    Login login(); 

    /** 
     * Sets the attribute login. 
     * 
     * @param login value of login 
     */ 
    void login(Login login); 

}

Javadocs

Currently Java doc will be generated as per ONOS javadoc guidelines.

...

.

...

YANG statements

Module

Overview

The primary unit of YANG is module. The module statement groups all the statements that belong to module together. The module statement argument is name of the module followed by sub-statements. 

JAVA mapping

Module statement is mapped to

  1. Service

    interface 

    interface  
    It includes:
    a) java methods corresponding to the YANG RPC (Refer RPC section for more details)
    b) If module contains notification, generated service interface will extend listener service (refer notification for more details)

    Manager class
    It includes:
    a ) Activate/Deactivate methods
    b) If module contains child data nodes, getters and setters for those nodes will be generated for app developers to implement.
    c)If module contains notification, generated manager class will extend ListenerRegistry(refer notification for more details) .
     
    The manager class implements the service interface. The name of service interface and manager class is <module_name>Service.java and <module_name>Manager.java.

    .The name of service interface is <module_name>Service.java .
    c) If module contains augment the get and setter for augmented module will be generated.

    Info

    Service file will be generated only if RPC/Notification is present.

  2. Interface and implementation class (Note: for module implementation class will have name xxxxOpParam.java)
Example
Code Block
titleInput YANG file
File : network.yang
  module network { 
     yang-version 1; 
     namespace "urn:TBD:params:xml:ns:yang:nodes"; 
     prefix nd; 
 
     organization "TBD"; 
     contact 
       "WILL-BE-DEFINED-LATER"; 
     description 
       "This module defines a common base model for a collection 
        of nodes in a network. Node definitions s are further used 
        in network topologies and inventories."; 
 
     revision 2014-03-09 { 
       description 
         "Initial revision."; 
       reference "draft-clemm-i2rs-yang-network-topo-04"; 
     } 
      
     list networklist { 
       key "network-id"; 
 
       leaf network-id { 
         type string; 
       } 
 
       leaf server-provided { 
         type boolean; 
         config false; 
       } 
     } 
      ….
}rpc rpc-test { 
      input { 
        container cont { 
            leaf lf { 
                type string; 
            } 
        } 
      } 
    }  
}
Code Block
titleGenerated Java files
File : NetworkService.java

Code Block
titleGenerated Java files
File : NetworkService.java
package org.onosproject.yang.gen.v1.urn.tbd.params.xml.ns.yang.nodes.rev20140309;

import java.util.List;
import org.onosproject.yang.gen.v1.urn.tbd.params.xml.ns.yang.nodes.rev20140309.network.Networklist;

public interface NetworkService {

    List<Networklist> getNetworklist();

    void setNetworklist(List<Networklist> networklist);
}


File : NetworkManager.java
package org.onosproject.yang.gen.v1.urn.tbd.params.xml.ns.yang.nodes.rev20140309;

import java.util.List;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.yang.gen.v1.urn.tbd.params.xml.ns.yang.nodes.rev20140309.network.Networklist;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;

@Component (immediate = true)
@Service
public class NetworkManager implements NetworkService {

    private final Logger log = getLogger(getClass());

    @Activaterpctest.RpcTestInput; 

/** 
 * Abstraction of an entity which represents the functionality of network. 
 */ 
public interface NetworkService { 
    /** 
    public void* activate() {
   Service interface of rpcTest. 
     //TODO: YANG utils generated code
          log.info("Started");* 
     * @param inputVar input of service interface rpcTest 
    }

 */   @Deactivate
    public void deactivaterpcTest(RpcTestInput inputVar); {

}


File : Network.java
 
package org.onosproject.yang.gen.v1.urn.tbd.params.xml.ns.yang.nodes.rev20140309; 

import java.util.List; 
import org.onosproject.yang.gen.v1.urn.tbd.params.xml.ns.yang.nodes.rev20140309.network.Networklist; //TODO: YANG utils generated code
          log.info("Stopped");
    }

/** 
 * Abstraction of an entity which represents the functionality of network. 
 */ 
public interface Network { 

    @Override/** 
    public List<Networklist>* getNetworklist() {
   Returns the attribute networklist. 
     //TODO: YANG utils generated code* 
     * @return networklist list of returnnetworklist null;
    }

 */   @Override
    public void setNetworklist(List<Networklist> networklist(); {
 
    /** 
    //TODO: YANG utils generated code * Sets the attribute networklist. 
    }
}

Sub Module

Overview

The “submodule” groups all the statements that belongs to the submodule together. The "submodule" statement's argument is the name of the submodule, followed by a block of sub statements.

JAVA mapping

Submodule mapping to java is same as module and files with be generated in module’s namespace.

Example
Code Block
titleInput YANG files
File : acme-system.yang
module acme-system {
    namespace "http://yang-central.org/ns/example/acme";
    prefix acme;

    include "acme-types";
 * 
     * @param networklist list of networklist 
     */ 
    leafvoid id {
        type string;
    }
}
File : acme-types.yang
submodule acme-types {networklist(List<Networklist> networklist); 

    /** 
    yang-version 1;
    belongs-to "acme-system" {
        prefix "acme"; * Adds to the list of networklist. 
    }
    leaf access-timeout { * 
     * @param addTo typevalue uint32;
of networklist   }
    leaf retries*/ {
    void addToNetworklist(Networklist   type uint8;
    }
}
Code Block
titleGenerated Java files
File : AcmeSystemManager.java
addTo); 

}
 
File: NetworkOpParam.java

package org.onosproject.yang.gen.v1.httpurn.yangtbd.centralparams.orgxml.ns.exampleyang.acmenodes.rev20160526rev20140309; 

import orgcom.apachegoogle.felixcommon.scrbase.annotations.ActivateMoreObjects; 
import orgjava.apache.felix.scr.annotations.Component;util.ArrayList; 
import java.util.List; 
import orgjava.apache.felix.scr.annotations.Deactivate;util.Map; 
import orgjava.apache.felix.scr.annotations.Service;util.Objects; 
import org.slf4j.Logger;.onosproject.yang.gen.v1.urn.tbd.params.xml.ns.yang.nodes.rev20140309.network.Networklist; 
import static org.onosproject.slf4jyang.LoggerFactorymodel.getLoggerInnerModelObject; 

@Component (immediate = true)
@Service
public class AcmeSystemManager implements AcmeSystemService {

    private final Logger log = getLogger(getClass());

    @Activate
    public void activate() {
        //TODO: YANG utils generated code
          log.info("Started");
    }

    @Deactivate/** 
 * Represents the implementation of network. 
 * 
 * <p> 
 * valueLeafFlags identify the leafs whose value are explicitly set 
 * Applicable in protocol edit and query operation. 
 * </p> 
 */ 
public class NetworkOpParam extends InnerModelObject implements Network { 
    protected List<Networklist> networklist; 

    @Override 
    public voidList<Networklist> deactivatenetworklist() {
        //TODO: YANG utils generated code
        return  log.info("Stopped");networklist; 
    } 

    @Override 
    public Stringvoid getIdnetworklist(List<Networklist> networklist) { 
        this.networklist = networklist; 
 //TODO: YANG utils generated} code

    @Override 
    public return null;
    }

void addToNetworklist(Networklist addTo) { 
    @Override
    publicif void setId(String id(networklist == null) { 
        //TODO: YANG utils generated code    networklist = new ArrayList<>(); 
        }
}

File : AcmeSystemService.java
package org.onosproject.yang.gen.v1.http.yang.central.org.ns.example.acme.rev20160526;

public interface AcmeSystemService {

    String getId();

    void setId(String id);
}

File : AcmeTypesManager.java
package org.onosproject.yang.gen.v1.http.yang.central.org.ns.example.acme.rev20160526;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;

@Component (immediate = true)
@Service
public class AcmeTypesManager implements AcmeTypesService {

    private final Logger log = getLogger(getClass());

    @Activate
    public void activate() {
        //TODO: YANG utils generated code 
        networklist.add(addTo); 
    } 


    @Override 
    public int hashCode() { 
        return Objects.hash(networklist); 
    } 

    @Override 
    public boolean equals(Object obj) { 
        if (this == obj) { 
            return true; 
        } 
        if (obj instanceof NetworkOpParam) { 
          log.info("Started");
   NetworkOpParam }

other = (NetworkOpParam) obj; @Deactivate
    public void deactivate() {
     return 
  //TODO: YANG utils generated code
          logObjects.info("Stopped"equals(networklist, other.networklist); 
    }

    } @Override
    public long getAccessTimeout() {   return false; 
    } 

   //TODO: YANG utils generated code
      @Override 
    public String toString() { 
     return 0;
  return  }

MoreObjects.toStringHelper(getClass()) 
      @Override
    public short getRetries.omitNullValues() {
          //TODO: YANG utils generated code .add("networklist", networklist) 
          return 0;  .toString(); 
    } 

    @Override/** 
    public void setAccessTimeout(long accessTimeout) { * Creates an instance of networkOpParam. 
     */ 
   //TODO: YANGpublic utilsNetworkOpParam() generated{ code
    } 


    @Override 
    public void setRetriesaddAugmentation(shortInnerModelObject retriesobj) { 
    } 

     //TODO: YANG utils generated code
    }
}

File : AcmeTypesService.java
package org.onosproject.yang.gen.v1.http.yang.central.org.ns.example.acme.rev20160526;

public interface AcmeTypesService {@Override 
    public void removeAugmentation(InnerModelObject obj) { 
    } 

    long@Override getAccessTimeout();

    short getRetries();

    void setAccessTimeout(long accessTimeout);

    void setRetries(short retries);
}

Prefix 

Overview

Prefix is used to define prefix associated with module. It is used as a hint to other module developers when they import our module.

JAVA mapping

There is no java mapping for prefix statement.

Example
public Map<Class<? extends InnerModelObject>, InnerModelObject> augmentations() { 

        return null; 
    } 

    @Override 
    public <T extends InnerModelObject> T augmentation(Class<T> c) { 

        return null; 
    } 
}


Sub Module

Overview

The “submodule” groups all the statements that belongs to the submodule together. The "submodule" statement's argument is the name of the submodule, followed by a block of sub statements.

JAVA mapping

Submodule mapping to java is same as module and files with be generated in module’s namespace.

Example
Code Block
titleInput YANG files
File : acme-system.yang
module acme-system {
    
Code Block
module dhcp {
  namespace "http://yang-central.org/ns/example/dhcpacme";
    prefix dhcpacme;

 import ietf-yang-types { prefix yang; }include "acme-types";
 
 import ietf-inet-types { prefix inet; }
}

Note the prefixes above. In order to refer to the yang-module from now on, we use the prefix, e.g. the statement:

type yang:date-and-time;

refers to the date-and-time type defined in the yang-types module.

We use the prefix defined in the module itself, e.g. in the yang-types module, the prefix is defined as yang. You can use which prefix you want in your import, as long as it is unique within the module, but by using the prefix from the module, your module will be easier to read for others.

Import

Overview

A module can import definitions from other module or submodule by using import statement. It takes an argument, the name of the module or submodule followed by sub statements prefix and revision statement. Multiple import statements may be specified to import from different modules. Prefix statement inside import is mandatory and its scope is within the imported module or sub-module.

JAVA mapping

When imported YANG file is used in any of the nodes in current YANG file, then Java code will genereted for imported YANG file. If it is imported YANG file is not used in any of the node in current YANG file then Java code for imported file will not be genereted.

Example
container access {
        leaf id {
            type uint32;
        }
        
    }
}
File : acme-types.yang
submodule acme-types {
    yang-version 1;
    belongs-to "acme-system" {
        prefix "acme";
    }
    
    container access {
        leaf access-timeout {
            type uint32;
        }
        leaf retries {
            type uint8;
        }
    }
}
Info

Code generation will be same as module.


Prefix 

Overview

Prefix is used to define prefix associated with module. It is used as a hint to other module developers when they import our module.

JAVA mapping

There is no java mapping for prefix statement.

Example
Code Block
module dhcp {
  namespace "http://yang-central.org/ns/example/dhcp";
  prefix dhcp;

 import ietf-yang-types { prefix yang; }
 import ietf-inet-types { prefix inet; }
}

Note the prefixes above. In order to refer to the yang-module from now on, we use the prefix, e.g. the statement:

type yang:date-and-time;

refers to the date-and-time type defined in the yang-types module.

We use the prefix defined in the module itself, e.g. in the yang-types module, the prefix is defined as yang. You can use which prefix you want in your import, as long as it is unique within the module, but by using the prefix from the module, your module will be easier to read for others.

Import

Overview

A module can import definitions from other module or submodule by using import statement. It takes an argument, the name of the module or submodule followed by sub statements prefix and revision statement. Multiple import statements may be specified to import from different modules. Prefix statement inside import is mandatory and its scope is within the imported module or sub-module.

JAVA mapping

When imported YANG file is used in any of the nodes in current YANG file, then Java code will genereted for imported YANG file. If it is imported YANG file is not used in any of the node in current YANG file then Java code for imported file will not be genereted.

Example
Code Block
titleInput YANG files
File : flow-classifier.yang
module flow-classifier {
    yang-version 1;
    namespace "sfc.flowclassifier";
    prefix "flow-classifier";
    import "ietf-yang-types" {
        prefix "yang";
    } 
    
    organization "ON-LAB";
    description "This submodule defines for flow classifier.";
    revision "2016-05-24" {
        description "Initial revision.";
    }
   
    leaf id {
        type yang:uuid;
    }
}

File : ietf-yang-types.yang
module ietf-yang-types {

     namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
     prefix "yang
Code Block
titleInput YANG files
File : flow-classifier.yang
module flow-classifier {
    yang-version 1;
    namespace "sfc.flowclassifier";
    prefix "flow-classifier";
    import "ietf-yang-types" {
        prefix "yang";
    } 
    
    organization "ON-LAB";
    description "This submodule defines for flow classifier.";
    revision "2016-05-24" {
        description "Initial revision.";
    }
   
    leaf id {
        type yang:uuid;
    }
}

File : ietf-yang-types.yang
module ietf-yang-types {

     namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
     prefix "yang";

     organization
      "IETF NETMOD (NETCONF Data Modeling Language) Working Group";

     contact
      "WG Web:   <http://tools.ietf.org/wg/netmod/>
       WG List:  <mailto:netmod@ietf.org>

       WG Chair: David Kessens
                 <mailto:david.kessens@nsn.com>

       WG Chair: Juergen Schoenwaelder
                 <mailto:j.schoenwaelder@jacobs-university.de>

       Editor:   Juergen Schoenwaelder
                 <mailto:j.schoenwaelder@jacobs-university.de>";

     descriptionorganization
      "ThisIETF moduleNETMOD contains(NETCONF aData collectionModeling ofLanguage) generally useful derivedWorking Group";

       YANG data types.

contact
      "WG CopyrightWeb: (c) 2013 IETF Trust and the persons identified as
       authors of the code.  All rights reserved.

 <http://tools.ietf.org/wg/netmod/>
       WG List:  <mailto:netmod@ietf.org>

       WG Chair: David Kessens
        Redistribution and use in source and binary forms, with or <mailto:david.kessens@nsn.com>

       withoutWG modification,Chair: isJuergen permittedSchoenwaelder
 pursuant to, and subject
       to the license terms contained in, the Simplified BSD License <mailto:j.schoenwaelder@jacobs-university.de>

       setEditor: forth in Section 4.c of the IETF Trust's Legal ProvisionsJuergen Schoenwaelder
       Relating to IETF Documents
       (http://trustee.ietf.org/license-info).<mailto:j.schoenwaelder@jacobs-university.de>";

     description
  This version of this YANG"This module contains isa partcollection of RFCgenerally 6991;useful seederived
       theYANG RFC itself for full legal notices.";data types.

     revision 2013-07-15 {
       description
   Copyright (c) 2013 IETF Trust and the persons identified as
      "This revisionauthors addsof the followingcode.  newAll data types:rights reserved.

       Redistribution and - yang-identifier
      use in source and binary forms, with or
   - hex-string
   without modification, is permitted pursuant to, -and uuidsubject
       to the - dotted-quad";
       referencelicense terms contained in, the Simplified BSD License
       set "RFCforth 6991:in CommonSection YANG4.c Data Types";
     }

of the IETF Trust's Legal Provisions
       Relating revision 2010-09-24 {to IETF Documents
       description(http://trustee.ietf.org/license-info).

        "Initial revision.";
       referenceThis version of this YANG module is part of RFC 6991; see
       the "RFC 6021:itself Commonfor YANGfull Datalegal Typesnotices.";

     }
revision 2013-07-15 {
     typedef uuid {description
       type string {
     "This revision adds the following new data types:
     pattern '    - yang-identifier
         - hex-string
         - uuid
         - dotted-quad";
       reference
        "RFC 6991: Common YANG Data Types";
     }

     revision 2010-09-24 {
       description
        "Initial revision.";
       reference
        "RFC 6021: Common YANG Data Types";
     }

     typedef uuid {
       type string {
         pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
               + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
       }
       description
        "A Universally Unique IDentifier in the string representation
         defined in RFC 4122.  The canonical representation uses
         lowercase characters.

         The following is an example of a UUID in string representation:
         f81d4fae-7dec-11d0-a765-00a0c91e6bf6
         ";
       reference
        "RFC 4122: A Universally Unique IDentifier (UUID) URN
                   Namespace";
     }
}
Code Block
titleGenerated Java files
File : FlowClassifierManagerUuid.java
package org.onosproject.yang.gen.v1.sfc.flowclassifier.rev20160524;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20100924.ietfyangtypes.Uuid;
import orgjava.slf4jutil.LoggerObjects;
import static org.slf4j.LoggerFactory.getLoggercom.google.common.base.MoreObjects;

@Component (immediate = true)
@Service
public class FlowClassifierManager implements FlowClassifierService {public final class Uuid {
    private String string;

    private final Logger log = getLogger(getClassUuid()); {

    @Activate}

    public void activate(Uuid(String value) {
        //TODO: YANG utils generated codethis.string = value;
    }

    public static Uuid  log.info("Started");
of(String value) {
     }

   return new Uuid(value);
    @Deactivate}

    public voidString deactivatestring() {
        //TODO: YANG utils generated code
return string;
    }

    @Override
    public int hashCode() {
        return logObjects.infohash("Stopped"string);
    }

    @Override
    public Uuidboolean getIdequals(Object obj) {
        //TODO: YANG utils generated codeif (this == obj) {
            return nulltrue;
        }

     @Override
   if public(obj voidinstanceof setId(Uuid id) {
            //TODO: YANG utils generated code
Uuid other = (Uuid) obj;
           }

}

File : FlowClassifierService
package org.onosproject.yang.gen.v1.sfc.flowclassifier.rev20160524;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20100924.ietfyangtypes.Uuid;

public interface FlowClassifierService {

 return
           Uuid getId();

    void setId(Uuid id);
}

File : IetfYangTypesManager.java
package org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20100924;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;

@Component (immediate = true)
@Service
public class IetfYangTypesManager implements IetfYangTypesService {

    private final Logger log = getLogger(getClass());

    @Activate
    public void activate() {Objects.equals(string, other.string);
        }
        return false;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(getClass())
            .add("string", string)
        //TODO: YANG utils generated code
        log.info("Started".toString();
    }

    @Deactivate
public static Uuid  public void deactivate(fromString(String valInString) {
        //TODO: YANG utils generated code
try {
            String tmpVal = (valInString);
            return of(tmpVal);
        } log.info("Stopped")catch (Exception e) {
        }
        return null;
    }
}
 
File : IetfYangTypesServiceDefaultCont1.java

package org.onosproject.yang.gen.v1.urnsfc.ietfflowclassifier.params.xml.ns.yang.ietf.yang.types.rev20100924;

public interface IetfYangTypesService {
}

File : Uuid.java
packagerev20160524.flowclassifier; 

import com.google.common.base.MoreObjects; 
import java.util.BitSet; 
import java.util.Objects; 
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20100924rev20130715.ietfyangtypes.Uuid;
import java.util.Objects;
import comorg.googleonosproject.commonyang.basemodel.MoreObjectsInnerModelObject; 

public/** final
 class* UuidRepresents {
the implementation of cont1. private
 String* string;

 * <p> 
 private* Uuid() {
    }

    public Uuid(String value) {valueLeafFlags identify the leafs whose value are explicitly set 
 * Applicable in protocol edit and query operation. 
 * </p> 
 */ 
public class DefaultCont1 extends InnerModelObject implements Cont1 { 
    protected Uuid id;  this.string
    protected BitSet valueLeafFlags = valuenew BitSet(); 

    }
@Override 
    public static Uuid ofid(String value) { 
        return new Uuid(value); id; 
    } 

    @Override 
    public BitSet valueLeafFlags() { 
        return valueLeafFlags; 
    } 

    @Override 
    public Stringvoid stringid(Uuid id) { 
        valueLeafFlags.set(LeafIdentifier.ID.getLeafIndex()); 
        return string;this.id = id; 
    } 

    @Override 
    public int hashCode() { 
        return Objects.hash(stringid, valueLeafFlags); 
    } 

    @Override 
    public boolean equals(Object obj) { 
        if (this == obj) { 
            return true; 
        } 
        if (obj instanceof UuidDefaultCont1) { 
            UuidDefaultCont1 other = (UuidDefaultCont1) obj; 
            return 
                 Objects.equals(stringid, other.stringid);
 && 
                Objects.equals(valueLeafFlags, other.valueLeafFlags); 
        } 
        return false; 
    } 

    @Override 
    public String toString() { 
        return MoreObjects.toStringHelper(getClass()) 
            .add("string", string)omitNullValues() 
            .toString();add("id", id) 
    }

     public static Uuid fromString(String valInString.add("valueLeafFlags", valueLeafFlags) {
           try {
  .toString(); 
    } 


    /** 
     * StringCreates tmpValan = (valInString);
  instance of defaultCont1. 
     */ 
    returnpublic ofDefaultCont1(tmpVal);
 { 
    } 


 } catch (Exception e)@Override {
    public boolean isLeafValueSet(LeafIdentifier leaf) { }
        return null;valueLeafFlags.get(leaf.getLeafIndex()); 
    } 

}

 


Include

Overview

A module uses a include statement to include sub-module that belongs to module. The argument is the name of sub-module. Modules are only allowed to include sub-module that belongs to module, as defined by belongs-to statement. When a module includes a submodule, it incorporates the contents of the submodule into the node hierarchy of the module.

JAVA mapping

There is no java mapping for include statement.

Example

Please refer submodule example

Organization

Overview

   The "organization" statement defines the party responsible for this module.  The argument is a string that is used to specify a textual description of the organization(s) under whose auspices this module was developed.

JAVA mapping

 Organization will be used as javadoc in generated java code in Hummingbird release version. Currently it is not used in generated java code.

Example

Please refer module example section

Contact

Overview

  The "contact" statement provides contact information for the module. The argument is a string that is used to specify contact information for the person or persons to whom technical queries concerning this  module should be sent, such as their name, postal address, telephone number, and electronic mail address.

JAVA mapping

 Contact information will be used as javadoc in generated java code in Hummingbird release version. Currently it is not used in generated java code.

Example

Please refer module example section

Belongs to

Overview

The "belongs-to" statement specifies the module to which the submodule belongs.  The argument is an identifier that is the name of the module. A  A submodule must only be included by the module to which it belongs, or by another submodule that belongs to that module.

JAVA mapping

No java mapping for belongs to statement in generated code.

Example

Please refer submodule example section.

Leaf

Overview

A leaf is an atomic element in YANG. It has value, but does not have child. It is used for defining the scalar variable of a built-in type or a derived type.

Java mapping

In java leaf is converted to define variable with its respective java built-in type or derived type.

Example
Code Block
titleInput YANG file
File : acme-system.yang
module acme-system {
     namespace "http://acme.example.com/system";
     prefix "acme";
     organization "ACME Inc.";
     contact "joe@acme.example.com";
     description
        "The module for entities implementing the ACME system.";
     revision 2007-06-09 {
         description "Initial revision.";
     }
     container system {
            leaf host-name {
                type string;
                description "Hostname for this system";
           }
     }
    .
    .
    .
}

    

Code Block
titleGenerated Java files
File: System.java
public interface System extends AugmentationHolder  {
    String hostName();
    interface SystemBuilder {
        String hostName();
        SystemBuilder hostName(String hostName);
        System build();
    }
}

File : SystemBuilder.java
public class SystemBuilder implements System.SystemBuilder {
    private String hostName;

    @Override
    public String hostName() {
        return hostName;
    }

    @Override
    public SystemBuilder hostName(String hostName) {package org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem; 

import java.util.BitSet; 

/** 
 * Abstraction of an entity which represents the functionality of system. 
 */ 
public interface System { 

    /** 
     * Identify the leaf of System. 
     */ 
    public enum LeafIdentifier implements org.onosproject.yang.model.LeafIdentifier{ 
        /** 
         * Represents hostName. 
         */ 
        HOSTNAME(1); 

        this.hostNameprivate =int hostNameleafIndex; 

        return this;
    }
public int getLeafIndex() { 
      .
    .
  return leafIndex; .
    public final class SystemImpl implements} System {

        private String hostName;LeafIdentifier(int value) { 
        @Override
    this.leafIndex = value; 
 public String hostName() {
    } 
    } 
 
 return hostName;
  /** 
     }
* Returns the attribute hostName. 
    . * 
     .
* @return hostName  }
}

Leaf-list

 Overview

A leaf-list is also used for defining scalar variable, like leaf, but in an array of a particular type. The type of the variable can be either built-in type or a derived type.

Java mapping

In java leaf-list is stored in List, with respect to, java built-in type or derived type.

Example
Code Block
titleInput YANG file
File : acme-system.yang
module acme-system {value of hostName 
     */ 
    String namespace "http://acme.example.com/system";hostName(); 

    /** prefix "acme";

     * Returns organizationthe "ACMEattribute IncvalueLeafFlags."; 
     contact "joe@acme.example.com";* 
     description
* @return valueLeafFlags value of valueLeafFlags 
  "The module for entities*/ implementing
 the ACME system.";
  BitSet valueLeafFlags(); 

     revision 2007-06-09 {/** 
     * Sets the attribute descriptionhostName. "Initial revision.";

     * }
     container* system@param {
hostName value of hostName 
     */ 
   leaf-list domain-search { void hostName(String hostName); 


    /** 
     * Checks if the leaf value is typeset. string;
     * 
     * @param leaf leaf whose value descriptionstatus "Listneeds ofto domainchecked names
 to search";
   * @return result of leaf value set in object  }
     }
    .*/ 
    .
boolean isLeafValueSet(LeafIdentifier leaf);  .
}

 

Code Block
titleGenerated Java files



File : SystemDefaultSystem.java
public interface System extends AugmentationHolder  {
    String hostName();
    interface SystemBuilder {
        String hostName();
        SystemBuilder hostName(String hostName);
        System build();
    }
}

File : SystemBuilder.java
public class SystemBuilder implements System.SystemBuilder {
    private List<String> domainSearch;

    @Override
package org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem; 

import com.google.common.base.MoreObjects; 
import java.util.BitSet; 
import java.util.Objects; 
import org.onosproject.yang.model.InnerModelObject; 

/** 
 * Represents the implementation of system. 
 * 
 * <p> 
 * valueLeafFlags identify the leafs whose value are explicitly set 
 * Applicable in protocol edit and query operation. 
 * </p> 
 */ 
public class DefaultSystem extends InnerModelObject implements System { 
    protected String hostName; 
    protected BitSet valueLeafFlags = new BitSet(); 

    @Override 
    public List<String>String domainSearchhostName() { 
        return domainSearchhostName; 
    } 

    @Override 
    public SystemBuilderBitSet domainSearchvalueLeafFlags(List<String> domainSearch) { 
        this.domainSearch = domainSearch;return valueLeafFlags; 
    } 

    return@Override this;
    }
    .public void hostName(String hostName) { 
    .
    valueLeafFlags.set(LeafIdentifier.HOSTNAME.getLeafIndex()); 
    public  final class SystemImplthis.hostName implements= SystemhostName; {
    } 

    @Override 
    public int hashCode() { 
        private List<String> domainSearch;
return Objects.hash(hostName, valueLeafFlags); 
    } 

    @Override 
    public boolean equals(Object  public List<String> domainSearch(obj) { 
        if (this == obj) { 
            return domainSearchtrue; 
        } 
    .
    if (obj instanceof DefaultSystem) { 
            DefaultSystem other = (DefaultSystem) obj; 
            return 
                Objects.equals(hostName, other.hostName) && 
                Objects.equals(valueLeafFlags, other.valueLeafFlags); 
        } 
        return false; 
}

Container

Overview

Container is a holder that can hold many nodes within it. It is used for logically grouping certain set of nodes.

Java mapping

In java, container acts as a class which can hold information contained within. A class of the container is formed only when container has nodes in it. In addition to that, container's parent holder will have container class’s information.

Container statement is mapped to java as                  

  1. Interface File
    It includes:
    a) Getters for the attributes. 
    b) Builder interface which contains getters/setters and build method.
  2. Builder Class File
    It includes:
    a) Builder class which is the implementation of builder interface defined in interface file.
    b) Impl class which is the implementation of interface file. 
    c) hashCode(), equals(), toString() methods overridden in it. 
Example
Code Block
titleInput YANG file
File : acme-system.yang
module acme-system {    } 

    @Override 
    public namespace "http://acme.example.com/system";
  String toString() { 
   prefix "acme";
     organization "ACME Inc.";return MoreObjects.toStringHelper(getClass()) 
     contact "joe@acme.example.com";
     description
 .omitNullValues() 
      "The module for entities implementing the ACME system.";
  add("hostName", hostName) 
   revision 2007-06-09 {
         description "Initial revision.";
     }.add("valueLeafFlags", valueLeafFlags) 
     container system {
     .toString(); 
   container login} {


             leaf message {/** 
     * Creates an instance of defaultSystem. 
      type*/ string;
    public DefaultSystem() { 
    } 


    @Override description
    public boolean isLeafValueSet(LeafIdentifier leaf) { 
        return valueLeafFlags.get(leaf.getLeafIndex()); 
  "Message given at start of login session";
             }
        }
    }
    .
    .
    .
}

 

} 

}


Leaf-list

 Overview

A leaf-list is also used for defining scalar variable, like leaf, but in an array of a particular type. The type of the variable can be either built-in type or a derived type.

Java mapping

In java leaf-list is stored in List, with respect to, java built-in type or derived type.

Example
Code Block
titleInput YANG file
File : acme-system.yang
module acme-system {
     namespace "http://acme.example.com/system";
     prefix "acme"
Code Block
titleGenerated Java files
File : Login.java
public interface Login extends AugmentationHolder  {
    String message();
    interface organization LoginBuilder {"ACME Inc.";
        String message()contact "joe@acme.example.com";
     description
    LoginBuilder message(String message);
  "The module for entities implementing the Login build()ACME system.";
    }
}

File : SystemBuilder.java
public class LoginBuilder implements Login.LoginBuilder {
 revision 2007-06-09 {
         privatedescription String message"Initial revision.";

     @Override}
    public Stringcontainer message()system {
        return message;
    }

    @Overrideleaf-list domain-search {
    public LoginBuilder message(String message) {
        this.message =type messagestring;
        return this;
    }

    @Override
description "List of domain publicnames Login build() {to search";
        return new LoginImpl(this);
    }
    public LoginBuilder() {}
    }.
    public.
 final class  .
}

 

Code Block
titleGenerated Java files
File : System.java
package org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem; 

import java.util.BitSet; 
import java.util.List; 

/** 
 * Abstraction of an entity which represents the functionality of system. 
 */ 
public interface System { LoginImpl implements Login {
        private List<AugmentedInfo> augmentedInfoList = new ArrayList<>();
        private String message;

    /** 
   @Override
  * Identify the leaf of System. public
 String message() {
  */ 
    public enum LeafIdentifier implements  return message;
org.onosproject.yang.model.LeafIdentifier{ 
        /** }

        @Override
 * Represents domainSearch. 
    public int hashCode() {
  */ 
         return Objects.hash(messageDOMAINSEARCH(1); 

        }

private int leafIndex; 
     @Override
        public booleanint equalsgetLeafIndex(Object obj) { 
            ifreturn (this == obj) {
leafIndex; 
        } 

         return true;LeafIdentifier(int value) { 
            }
  this.leafIndex = value; 
        } 
 if (obj instanceof LoginImpl)} {

    /** 
     * Returns the attribute domainSearch. 
  LoginImpl other = (LoginImpl)* obj;
     * @return domainSearch list of domainSearch 
     return*/ 
    List<String> domainSearch(); 

    /** 
     * Returns the attribute  Objects.equals(message, other.message);
valueLeafFlags. 
     * 
     * @return }
valueLeafFlags value of valueLeafFlags 
        return false;*/ 
        }BitSet valueLeafFlags(); 

        @Override/** 
     * Sets the publicattribute String toString() {domainSearch. 
     * 
     * return MoreObjects.toStringHelper(getClass())
    @param domainSearch list of domainSearch 
     */ 
    void  .add("message", message)domainSearch(List<String> domainSearch); 

    /** 
     * Adds to the list of domainSearch.toString(); 
     *   }
     * @param addTo publicvalue LoginImpl(LoginBuilder builderObject) {of domainSearch 
     */ 
    void  this.message = builderObject.message();addToDomainSearch(String addTo); 


    /** 
   }

  * Checks if the leaf value @Override
is set. 
     * public
 void addAugmentation(AugmentedInfo value) {
 * @param leaf leaf whose value status needs to   getAugmentedInfoList().add(value);checked 
     * @return result }

of leaf value set in  object  @Override
     */ 
   public List<AugmentedInfo>boolean getAugmentedInfoListisLeafValueSet(LeafIdentifier leaf); {
}

File : DefaultSystem.java

package org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem; 

import com.google.common.base.MoreObjects; 
import java.util.ArrayList; 
import java.util.BitSet; 
import  return augmentedInfoList;
        }

        @Override
        public void removeAugmentation() {java.util.List; 
import java.util.Objects; 
import org.onosproject.yang.model.InnerModelObject; 

/** 
 * Represents the implementation of system. 
 * 
 * <p> 
 * valueLeafFlags identify the leafs whose value are explicitly set 
 * Applicable in protocol edit and query operation. 
 * </p> 
 */ 
public class DefaultSystem extends InnerModelObject implements System { 
    protected List<String> domainSearch; 
     getAugmentedInfoListprotected BitSet valueLeafFlags = new BitSet().clear(); 

    @Override 
   }
 public List<String> domainSearch() { 
        return domainSearch; 
    } 

    @Override 
}

List

Overview

List is also like container that can hold many nodes by logically grouping. The only difference is, list can have multiple instances whereas container has only one instance.

Java mapping

    In java, list acts as a class which can hold information contained within. A class of the list is formed only when list has nodes in it. In addition to that, list's parent holder will have list information by creating the list information in java List so that many instances of the class can be stored in it.

   The list statement mapping in java is as same as container for the generation of java (refer container to know what files are generated).

   In the below example the list holder is also a list with the same name. In such cases the complete path is defined for attribute in parent, in order to make sure that they are not referring to themselves. This case is same for any class generating YANG constructs.

Example

Code Block
titleInput YANG file
File : acme-system.yang
module acme-system {
    namespace "http://acme.example.com/system";
    prefix "acme";
    organization "ACME Inc.";
    contact "joe@acme.example.com";
    description    public BitSet valueLeafFlags() { 
        return valueLeafFlags; 
    } 

    @Override 
    public void domainSearch(List<String> domainSearch) { 
        valueLeafFlags.set(LeafIdentifier.DOMAINSEARCH.getLeafIndex()); 
        this.domainSearch = domainSearch; 
    } 

    @Override 
    public void addToDomainSearch(String addTo) { 
        if (domainSearch == null) { 
        "The module for entities implementingdomainSearch the= ACME system.";new ArrayList<>(); 
    revision  2007-06-09 {
 } 
      description "Initial revision.";domainSearch.add(addTo); 
    } 


    list login@Override {
    public int hashCode() { key
 "name";
        list login {return Objects.hash(domainSearch, valueLeafFlags); 
    } 

    @Override 
   key "name";
public boolean equals(Object obj) { 
       leaf nameif {
(this == obj) { 
            typereturn stringtrue; 
        } 
   }
     if (obj instanceof DefaultSystem) { 
  leaf full-name {
        DefaultSystem other = (DefaultSystem) obj; 
   type string;
        return 
   }
             leaf class {Objects.equals(domainSearch, other.domainSearch) && 
                type string;
Objects.equals(valueLeafFlags, other.valueLeafFlags); 
        } 
     }
   return false; 
    } 

    @Override 
   leaf namepublic {
String toString() { 
         type string;return MoreObjects.toStringHelper(getClass()) 
        }
    .omitNullValues() }
    .
    .
    .
}
Code Block
titleGenerated Java files
File : Login.java
public interface Login extends AugmentationHolder  {
add("domainSearch", domainSearch) 
           String name();.add("valueLeafFlags", valueLeafFlags) 
    String fullName();
       String addThisBeforeClass.toString(); 
    interface LoginBuilder {} 


    /** 
   String name();
 * Creates an instance of defaultSystem. 
 String fullName();
   */ 
    Stringpublic addThisBeforeClassDefaultSystem(); { 
    } 


   LoginBuilder name(String name);@Override 
    public boolean   LoginBuilder fullName(String fullName);
        LoginBuilder addThisBeforeClass(String addThisBeforeClass);isLeafValueSet(LeafIdentifier leaf) { 
        Login build(return valueLeafFlags.get(leaf.getLeafIndex()); 
    } 

}

File : LoginBuilder.java
public class LoginBuilder implements Login.LoginBuilder {
    private String name;
    private String fullName

Container

Overview

Container is a holder that can hold many nodes within it. It is used for logically grouping certain set of nodes.

Java mapping 

In java, container acts as a class which can hold information contained within. A class of the container is formed only when container has nodes in it. In addition to that, container's parent holder will have container class’s information.

Container statement is mapped to java as                  

  1. Interface File
    It includes:
    a) Getters for the attributes. 
    b) Builder interface which contains getters/setters and build method.
    c) If container contains a leaf then one LeafIdentifier enum will be generated in interface.

  2. Default implementation Class File
    It includes:
    a) Builder class which is the implementation of builder interface defined in interface file.
    b) Impl class which is the implementation of interface file. 
    c) hashCode(), equals(), toString() methods overridden in it. 
Example
Code Block
titleInput YANG file
File : acme-system.yang
File : acme-system.yang
module acme-system {
     namespace "http://acme.example.com/system";
    private Stringprefix addThisBeforeClass"acme";

    @Override
 organization   public String name() {"ACME Inc.";
        return namecontact "joe@acme.example.com";
    }

    @Override description
    public String fullName() {
 "The module for entities implementing the  return fullNameACME system.";
    }

 revision   @Override2007-06-09 {
    public String addThisBeforeClass() {
  description "Initial revision.";
    return addThisBeforeClass;}
    }

 container system  @Override{
    public LoginBuilder name(String name) {
    leaf host-name {
  this.name = name;
        return this;
   type }string;

    @Override
    public LoginBuilder fullName(String fullName) {
     description "Hostname for this.fullName = fullName system";
        return this;
    }

     @Override}
    public LoginBuilder addThisBeforeClass(String addThisBeforeClass) {
 .
       this.addThisBeforeClass = addThisBeforeClass;
    .
}

 

Code Block
titleGenerated Java files
File: System.java
package org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem; 

import java.util.BitSet; 

/** 
 * Abstraction of an entity which represents the functionality of system. 
 */ 
public interface System { 

    /** 
     * Identify the leaf of System. 
     */     return this;
    }

    @Override
    public Login build() {
        return new LoginImpl(this);
    }
    public LoginBuilder() {
    }
    public finalenum classLeafIdentifier LoginImpl implements Login {org.onosproject.yang.model.LeafIdentifier{ 
        private/** List<AugmentedInfo>
 augmentedInfoList = new ArrayList<>();
       * privateRepresents StringhostName. name;
        private String*/ fullName;
        private String addThisBeforeClass;HOSTNAME(1); 

         @Overrideprivate int leafIndex; 

        public Stringint namegetLeafIndex() { 
            return nameleafIndex; 
        } 

        @Override
   LeafIdentifier(int value) { 
     public String fullName() {
    this.leafIndex = value; 
     return fullName;
   } 
    } 

        @Override/** 
     * Returns the public String addThisBeforeClass() {attribute hostName. 
     * 
     * return@return addThisBeforeClass;
hostName value of  hostName    }

      */  @Override
        public int hashCodeString hostName(); {

    /** 
     * Returns returnthe attribute ObjectsvalueLeafFlags.hash(name, fullName, addThisBeforeClass);
 
     * 
   }

  * @return valueLeafFlags value of valueLeafFlags @Override
     */ 
   public booleanBitSet equalsvalueLeafFlags(Object obj); {

    /** 
     * Sets ifthe (this == obj) {attribute hostName. 
     * 
     * @param hostName value of returnhostName true;
     */ 
    void  }hostName(String hostName); 


    /** 
     * Checks if (obj instanceof LoginImpl) { the leaf value is set. 
     * 
     * @param leaf leaf whose value LoginImplstatus otherneeds =to (LoginImpl)checked obj;
     * @return result of leaf value set in object 
   return
  */ 
    boolean isLeafValueSet(LeafIdentifier leaf); 
}


File : DefaultSystem.java

package org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem; 

import com.google.common.base.MoreObjects; 
import java.util.BitSet; 
import java.util.Objects;  Objects.equals(name, other.name) &&
                     Objects.equals(fullName, other.fullName) &&
                     Objects.equals(addThisBeforeClass, other.addThisBeforeClass);
            }
            return false;
        }

import org.onosproject.yang.model.InnerModelObject; 

/** 
 * Represents the implementation of system. 
 * 
 * <p> 
 * valueLeafFlags identify the leafs whose value are explicitly set 
 * Applicable in protocol edit and query operation. 
 * </p> 
 */ 
public class DefaultSystem extends InnerModelObject implements System { 
    protected String hostName; 
    protected BitSet valueLeafFlags = new BitSet(); 

    @Override 
    public String hostName() { 
        @Override
   return hostName; 
    } 

    @Override 
    public StringBitSet toStringvalueLeafFlags() { 
            return MoreObjects.toStringHelper(getClass())return valueLeafFlags; 
    } 

    @Override 
    public void .add("name", name)hostName(String hostName) { 
        valueLeafFlags.set(LeafIdentifier.HOSTNAME.getLeafIndex()); 
        .add("fullName", fullName)this.hostName = hostName; 
    } 

    @Override 
    public int .add("addThisBeforeClass", addThisBeforeClass)
  hashCode() { 
        return      .toString(Objects.hash(hostName, valueLeafFlags); 
    } 

   }
 @Override 
    public boolean public LoginImplequals(LoginBuilderObject builderObjectobj) { 
        if    (this.name == builderObject.name();obj) { 
            this.fullName = builderObject.fullName();
return true; 
        } 
     this.addThisBeforeClass = builderObject.addThisBeforeClass();   if (obj instanceof DefaultSystem) { 
        }

    DefaultSystem other = (DefaultSystem) obj; @Override
        public  void addAugmentation(AugmentedInfo value)return {
            getAugmentedInfoList().add(value);    Objects.equals(hostName, other.hostName) && 
        }

        @Override
  Objects.equals(valueLeafFlags, other.valueLeafFlags); 
      public List<AugmentedInfo> getAugmentedInfoList()} {
        return false; 
  return augmentedInfoList;
 } 

    @Override  }

    public String toString() { @Override
        public void removeAugmentation(return MoreObjects.toStringHelper(getClass()) {
            getAugmentedInfoList().clearomitNullValues(); 
            .add("hostName", hostName) }
      }
}

Generated java files for list's holder(another list):

File : Login.java
public interface Login extends AugmentationHolder  {
    String name();
List<org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem.login.Login> login();
    interface LoginBuilder {
        String name();
List<org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem.login.Login> login();
        LoginBuilder name(String name);
        LoginBuilder login(List<org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem
                .login      .add("valueLeafFlags", valueLeafFlags) 
            .toString(); 
    } 


    /** 
     * Creates an instance of defaultSystem. 
     */ 
    public DefaultSystem() { 
    } 


    @Override 
    public boolean isLeafValueSet(LeafIdentifier leaf) { 
                .Login> login);return valueLeafFlags.get(leaf.getLeafIndex()); 
        Login build();
    }
}

File : LoginBuilder.java
public class LoginBuilder implements Login.LoginBuilder {
    private String name;
    private List<org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem.login.Login> login;

    @Override
    public String name() {
        return name;
    }

    @Override
    public List<org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem.login
            .Login> login()} 

}

List

Overview

List is also like container that can hold many nodes by logically grouping. The only difference is, list can have multiple instances whereas container has only one instance.

Java mapping 

    In java, list acts as a class which can hold information contained within. A class of the list is formed only when list has nodes in it. In addition to that, list's parent holder will have list information by creating the list information in java List so that many instances of the class can be stored in it.

   The list statement mapping in java is as same as container for the generation of java (refer container to know what files are generated).

   In the below example the list holder is also a list with the same name. In such cases the complete path is defined for attribute in parent, in order to make sure that they are not referring to themselves. This case is same for any class generating YANG constructs.

Example

Code Block
titleInput YANG file
File : acme-system.yang
module acme-system {
    namespace "http://acme.example.com/system";
    prefix "acme";
    organization "ACME Inc.";
    contact "joe@acme.example.com";
    description
        "The module for entities implementing the ACME system.";
    revision 2007-06-09 {
        return logindescription "Initial revision.";
    }
    list login {
    @Override
    key "name";
      public LoginBuilder name(String name)list login {
        this.name = name    key "name";
         return this;   leaf name {
    }

       @Override
    public LoginBuilder login(List<org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609type string;
            .acmesystem}
            .login.Login> login)leaf full-name {
        this.login = login;
      type  return thisstring;
    }
    .
    .}
    .
    public final class LoginImpl implementsleaf Loginclass {
    .
    .
    .
    }
}

Grouping and uses

Overview

Grouping the nodes together, for reusing them at many places, can be done in YANG. Grouping the nodes is done by grouping statement and using those grouped nodes at different places is done by uses statement.

Java mapping

During YANG to java conversion, the contents of grouping is copied wherever uses statement is used and code will be generated for nodes inside grouping wherever it is used.

Example
Code Block
titleInput YANG file
module Test {
type string;
      namespace "http://test.example.com/";
    prefix "test";}
    organization "ACME Inc.";
    grouping endpoint { }
        leaf addressname {
            type int32string; 
        } 
    }
    leaf port {.
    .
    .
}
Code Block
titleGenerated Java files
Note: Qualified name is typeused int8;for 
child node  "login".     }
    }
    container connection { 
        container source {
            uses endpoint;
        }
 
File : Login.java
package org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem; 

import java.util.BitSet; 
import java.util.List; 

/** 
 * Abstraction of an entity which represents the functionality of login. 
 */ 
public interface Login { 

    /** 
     * Identify the container destination {
leaf of Login. 
     */ 
    public enum LeafIdentifier  uses endpoint;implements org.onosproject.yang.model.LeafIdentifier{ 
        /** }
    }
    .
 * Represents name. .
    .
}
Code Block
titleGenerated Java files
File : Connection.java
package org.onosproject.yang.gen.v1.http.test.example.com.rev20160718.test;

import org.onosproject.yang.gen.v1.http.test.example.com.rev20160718.test.connection.Source;

public interface Connection {

     */ 
       Source sourceNAME(1); 

    interface ConnectionBuilder {   private int leafIndex; 

        Sourcepublic int sourcegetLeafIndex();

 { 
           ConnectionBuilder source(Source source);
return leafIndex; 
        } 

        Connection build();
LeafIdentifier(int value) { 
          }
}

File : Source.java

package org.onosproject.yang.gen.v1.http.test.example.com.rev20160718.test.connection;

public interface Source {
this.leafIndex = value; 
        } 
    int} address();

    byte port();

/** 
     interface* SourceBuilderReturns {

the attribute name. 
     int* address();

     * @return name byte port();

value of name 
     */ 
    SourceBuilderString addressname(int address); 

    /** 
   SourceBuilder port(byte port);

     * Returns the attribute valueLeafFlags. 
     Source* build();
    }
}

 

Choice and case

Overview

The choice statement defines a set of alternatives, only one of which may exist at any one time. The argument is an identifier, followed by a block of sub-statements that holds detailed choice information.

A choice consists of a number of branches, defined with the “case” substatement. Each branch contains a number of child nodes. The nodes from at most one of the choice's branches exist at the same time.
The case statement is used to define branches of the choice. It takes identifier as an argument, followed by a block of sub-statements that holds detailed case information.

JAVA mapping

Choice is mapped to interface(marker interface).

Case statement are mapped to the JAVA interfaces

It includes

  1. Interface file which extends choice marker interface

  2. Builder class which implements the builder interface and impl class which implements the interface

  3. Impl class includes overridden methods, hashcode, equals, toString methods.
Example
Code Block
titleInput YANG file
File : link.yang
module link {
    yang-version 1; * @return valueLeafFlags value of valueLeafFlags 
     */ 
    namespace http://huawei.com;
BitSet valueLeafFlags(); 

    prefix Ant;
/** 
    container link* {
Returns the attribute login. 
    choice interfaceType* {
     * @return login list of login 
   case  ethernerType*/ {
    List<org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem.login.Login> login(); 

    /** 
     leaf* ethernetSets {the typeattribute string;name. }
     * 
     * }
@param name value of name 
     */ 
 case p2pType {
 void name(String name); 

    /** 
     * leafSets p2pthe {attribute type string; }login. 
     * 
     * }
@param login list of login 
   }
  */ 
  }
}
Code Block
titleGenerated Java files
File : InterfaceType.java
package orgvoid login(List<org.onosproject.yang.gen.v1.http.huaweiacme.example.com.system.rev20160509rev20070609.choicecasetestacmesystem.link1;

import org.onosproject.yangutils.translator.tojava.AugmentationHolder;

public interface InterfaceType extends AugmentationHolder  {
}

File : EthernerType.java
package login 
            .Login> login); 

    /** 
     * Adds to the list of login. 
     * 
     * @param addTo value of login 
     */ 
    void addToLogin(org.onosproject.yang.gen.v1.http.acme.huaweiexample.com.rev20160509system.choicecasetestrev20070609.link1.interfacetype;

import org.onosproject.yang.gen.v1.http.huawei.com.rev20160509.choicecasetest.link1.InterfaceType;
import org.onosproject.yangutils.translator.tojava.AugmentationHolder;

public interface EthernerType extends AugmentationHolder, InterfaceType  {

acmesystem.login 
            String.Login ethernet(addTo); 


    interface EthernerTypeBuilder {
/** 
     * Checks if String ethernet();

    the leaf value is set. 
    EthernerTypeBuilder ethernet(String ethernet);
* 
     * @param leaf EthernerType build();leaf whose value status needs to checked 
     * @return result of leaf value set in object 
     */ 
    }boolean isLeafValueSet(LeafIdentifier leaf); 
}

File : EthernerTypeBuilderDefaultLogin.java

package org.onosproject.yang.gen.v1.http.huaweiacme.example.com.rev20160509system.choicecasetestrev20070609.link1.interfacetypeacmesystem; 

import com.google.common.base.MoreObjects; 
import java.util.ArrayList; 
import java.util.BitSet; 
import java.util.List; 
import java.util.Objects; 
import org.onosproject.yangutils.translator.tojava.AugmentedInfo;

public class EthernerTypeBuilder implements EthernerType.EthernerTypeBuilder {

    private String ethernet;

    @Override
    public String ethernet() {
        return ethernet;
    }

    @Override
    public EthernerTypeBuilder ethernet(String ethernet) {
        this.ethernet = ethernet;
        return this;
    }

   @Override
   public EthernerType build() {
       return new EthernerTypeImpl(this);
   }

   public EthernerTypeBuilder() {
   }

   public final class EthernerTypeImpl implements EthernerType {

        private String ethernet;

        @Override.yang.model.InnerModelObject; 
import org.onosproject.yang.model.MultiInstanceObject; 

/** 
 * Represents the implementation of login. 
 * 
 * <p> 
 * valueLeafFlags identify the leafs whose value are explicitly set 
 * Applicable in protocol edit and query operation. 
 * </p> 
 */ 
public class DefaultLogin extends InnerModelObject 
        implements Login, MultiInstanceObject<LoginKeys> { 
    protected String name; 
    protected BitSet valueLeafFlags = new BitSet(); 
    protected List<org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem.login 
            .Login> login; 

    @Override 
    public String name() { 
        return name; 
    } 

    @Override 
    public BitSet valueLeafFlags() { 
        publicreturn String ethernet() {valueLeafFlags; 
    } 

    @Override 
  return ethernet;
 public   List<org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem 
    }

        public EthernerTypeImpl.login.Login> login() { 
        return login; 
    } 

    @Override 
    public EthernerTypeImplvoid name(EthernerTypeBuilderString builderObjectname) { 
        valueLeafFlags.set(LeafIdentifier.NAME.getLeafIndex()); 
        this.ethernetname = builderObject.ethernet()name; 
    } 

   } @Override 
     }
}

RPC

Overview

RPCs are modeled with RPC statement. The input statement is used to define input parameters to the RPC and output statement is used to define output parameters to the RPC.

JAVA mapping

Rpc statement is mapped to a method in module manager class and service interface.

The generated method will depends on the sub statements input and output. Input and Output will have there own java classes and RPC method will contain Output class's object as return type and Input class's object will be input for the method. If no output node is present , return type will be "void". Same way if no input is present , there will be no input parameter for the method.

Example
Code Block
titleInput YANG file
File: sfc.yang
module Sfc {
    yang-version 1;
    namespace http://huawei.com;
    prefix Ant;
    rpc SFP {
        input {public void login(List<org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem 
            .login.Login> login) { 
        this.login = login; 
    } 

    @Override 
    public void addToLogin(org.onosproject.yang.gen.v1.http.acme.example.com.system.rev20070609.acmesystem 
            leaf port.login.Login addTo) { 
        if (login == null) { 
           type string;
login = new ArrayList<>(); 
        } 
        login.add(addTo); 
    } 


    @Override 
    public int outputhashCode() { 
        return Objects.hash(name, valueLeafFlags, login); leaf
 path {
  } 

    @Override 
    public boolean equals(Object obj) type{ string;
        if (this == obj) }
{ 
            return true; }
        }
}
Code Block
titleGenerated Java files
File : SfcService.java

package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526;

import org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp.SfpInput;
import org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp.SfpOutput;

public interface SfcService {
    SfpOutput sfp(SfpInput inputVar);
}
File : SfcManager.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp.SfpInput;
import org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp.SfpOutput;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;

@Component (immediate = true)
@Service
public class SfcManager implements SfcService {

    private final Logger log = getLogger(getClass());

    @Activate 
        if (obj instanceof DefaultLogin) { 
            DefaultLogin other = (DefaultLogin) obj; 
            return 
                Objects.equals(name, other.name) && 
                Objects.equals(valueLeafFlags, other.valueLeafFlags) && 
                Objects.equals(login, other.login); 
        } 
        return false; 
    } 

    @Override 
    public voidString activatetoString() { 
        return  //TODO: YANG utils generated code
MoreObjects.toStringHelper(getClass()) 
            log.infoomitNullValues("Started"); 
    }

    @Deactivate
    public void deactivate(.add("name", name) {
        //TODO: YANG utils generated code
    .add("valueLeafFlags", valueLeafFlags) 
         log   .infoadd("Stoppedlogin", login);
     }

     @Override
     public SfpOutput sfp.toString(SfpInput inputVar); {
    } 


    //TODO: YANG utils generated code** 
     * Creates an returninstance null;
of     }
}

File : SfpInput.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp;

public interface SfpInput {

defaultLogin. 
     */ 
    Stringpublic portDefaultLogin(); { 

    interface} SfpInputBuilder {


        String port();

@Override 
    public boolean isLeafValueSet(LeafIdentifier leaf) SfpInputBuilder port(String port);
{ 
        SfpInput buildreturn valueLeafFlags.get(leaf.getLeafIndex()); 
    } 

}
 
 
File : SfpinputBuilderLoginKeys.java

package org.onosproject.yang.gen.v1.http.acme.huaweiexample.com.rev20160526system.sfcrev20070609.sfpacmesystem;
import java.lang.String;
import comorg.googleonosproject.commonyang.basemodel.MoreObjectsKeyInfo;
import java.util.Objects;

public class SfpInputBuilder implements SfpInput.SfpInputBuilder {

     private String port;

    @Override
    public String port() {/**
 * Represents the implementation of login.
 */
public class LoginKeys implements KeyInfo<DefaultLogin> {
    protected String name;
    /**
     * Returns the returnattribute port;name.
     }*

    @Override
 * @return name publicvalue SfpInputBuilder port(String port) {
of name
     */
    public  this.port = port;String name() {
         return thisname;
    }

    @Override/**
    public SfpInput* build() {
    Sets the value to attribute name.
     return new SfpInputImpl(this);*
    }

 * @param name publicvalue SfpInputBuilder()of {name
    } */

    public finalvoid class SfpInputImpl implements SfpInputname(String name) {

        this.name private= String portname;

    }

    @Override
        public Stringint porthashCode() {
            return portObjects.hash(name);
    }
    }
@Override
    public boolean equals(Object obj) @Override{
        public int hashCode(if (this == obj) {
            return Objects.hash(port)true;
        }

        @Override
        public boolean equals(Object obj) {
             if (this == obj) {
                 return true;
             }
            if (obj instanceof SfpInputImplif (obj instanceof LoginKeys) {
               LoginKeys SfpInputImpl other = (SfpInputImplLoginKeys) obj;
                return
                     Objects.equals(portname, other.portname);
            }
            return false;
         }

        @Override
        public String toString() {
                return MoreObjects.toStringHelper(getClass())
                   .add("port", port)
   }


 

Grouping and uses

Overview

Grouping the nodes together, for reusing them at many places, can be done in YANG. Grouping the nodes is done by grouping statement and using those grouped nodes at different places is done by uses statement.

Java mapping

During YANG to java conversion, the contents of grouping is copied wherever uses statement is used and code will be generated for nodes inside grouping's generated package. 

Note: if a yang file only contains grouping then for that module no service interface will be generated. one interface will be generated but there will not be any OpParam file for module. For other nodes code generation will be same.

Example
Code Block
titleInput YANG file
module Test {
    namespace "http://test.example.com/";
    prefix "test";
    organization "ACME Inc.";
    grouping endpoint { 
        leaf address {
      .toString();
      type int32; }

        } 
 public SfpInputImpl(SfpInputBuilder builderObject) {
    leaf port {
           this.port = builderObject.port();type int8; 
        }
    }
}
File   : Sfpoutput.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp;

public interface SfpOutput {

 container connection { 
        container source {
            Stringuses path()endpoint;
        }
    interface SfpOutputBuilder    container destination {

            Stringuses path()endpoint;

        }
  SfpOutputBuilder path(String path);

 }
    .
    SfpOutput build();.
     }.
}
Code Block
titleGenerated Java files

File : SfpOutputBuilderConnection.java

package org.onosproject.yang.gen.v1.http.huaweitest.example.com.rev20160526.sfc.sfptest; 

import org.onosproject.yang.gen.v1.http.test.example.com.googletest.commonconnection.base.MoreObjectsDestination; 
import java.util.Objects;
public class SfpOutputBuilder implements SfpOutput.SfpOutputBuilder {

     private String path;

    @Overrideorg.onosproject.yang.gen.v1.http.test.example.com.test.connection.Source; 

/** 
 * Abstraction of an entity which represents the functionality of connection. 
 */ 
public interface Connection { 

    public/** String
 path() {
   * Returns the attribute source. 
 return path;
   * }

    @Override
 * @return source publicvalue SfpOutputBuilderof path(String path) {source 
     */ 
   this.path =Source pathsource(); 

    /** 
    return this;
* Returns the attribute }

    @Overridedestination. 
    public SfpOutput* build() {
     * @return destination value returnof newdestination SfpOutputImpl(this);
     */ }

    publicDestination SfpOutputBuilderdestination(); {

    }
/** 
    public final* classSets SfpOutputImplthe implementsattribute SfpOutputsource. {

     * 
   private String path;

* @param source value of    source @Override
     */ 
   public Stringvoid pathsource(Source source); {

    /** 
     * Sets the return path;attribute destination. 
     * 
   }

  * @param destination value of destination  @Override
     */ 
   public intvoid hashCodedestination(Destination destination); 

}


Choice and case 

Overview

The choice statement defines a set of alternatives, only one of which may exist at any one time. The argument is an identifier, followed by a block of sub-statements that holds detailed choice information.

A choice consists of a number of branches, defined with the “case” substatement. Each branch contains a number of child nodes. The nodes from at most one of the choice's branches exist at the same time.
The case statement is used to define branches of the choice. It takes identifier as an argument, followed by a block of sub-statements that holds detailed case information.

JAVA mapping

Choice is mapped to interface(marker interface).

Case statement are mapped to the JAVA interfaces 

It includes

  1. Interface file which extends choice marker interface

  2. Builder class which implements the builder interface and impl class which implements the interface

  3. Impl class includes overridden methods, hashcode, equals, toString methods.
Example
Code Block
titleInput YANG file
File : link.yang
module link {
    yang-version 1;
    namespace http://huawei.com;
    prefix Ant;
    container link {
        choice interfaceType {
) {
            return Objects.hash(path);
         }

         @Override
         public boolean equals(Object obj) {
            if (this == obj) {
                     return true;
            }
            if (obj instanceof SfpOutputImpl) {
                     SfpOutputImpl other = (SfpOutputImpl) obj;
                     return Objects.equals(path, other.path);
            }
   case ethernerType {
       return false;
        leaf }

ethernet { type        @Overridestring; }
         public String toString() {}
            return MoreObjects.toStringHelper(getClass())case p2pType {
                .add("path", path)
   leaf p2p { type string; }
             .toString();
 }
        }

     }
}
Code Block
titleGenerated Java files
File : InterfaceType.java

package  public SfpOutputImpl(SfpOutputBuilder builderObject) {
            this.path = builderObject.path();
         }
     }
}

Notification 

Overview

The "notification" statement is used to define a notification.  It takes one argument, which is an identifier, followed by a block of substatements that holds detailed notification information.

JAVA mapping

Notification is mapped to events and event listeners in ONOS. Events are used by Managers to notify its listeners about changes in the network, and by Stores to notify their peers of events in a distributed setting. An Event is comprised of a event type and a subject built of model objects.

When notification statement is present in YANG, an event class , event subject class, event listener interface and notification interface  and builder will be generated.

When multiple notifications are present event class include the an enum with types of events for all notification  like DEVICE_ADDED, DEVICE_REMOVED and it extends AbstractEvent with event type and event subject class. It is used to notify EventListeners about the event.

Event Subject class will have all the objects of events for multiple notifications and getters and setters for the events.

Event Listener is interface which extends EventListener.

Manager Extends ListenerRegistry with event and eventListener.

Example
Code Block
titleInput YANG files
File : ospf.yang
module ospf {
    namespace "http://example.com/ospf";
    prefix "ospf";

    notification test {
           leaf event-class {org.onosproject.yang.gen.v1.http.huawei.com.link.link; 

/** 
 * Abstraction of an entity which represents the functionality of interfaceType. 
 */ 
public interface InterfaceType { 
}


File : EthernerType.java
package org.onosproject.yang.gen.v1.http.huawei.com.link.link.interfacetype; 

import java.util.BitSet; 
import org.onosproject.yang.gen.v1.http.huawei.com.link.link.InterfaceType; 

/** 
 * Abstraction of an entity which represents the functionality of ethernerType. 
 */ 
public interface EthernerType extends InterfaceType  { 

    /** 
     * Identify the leaf of EthernerType. 
     */ 
    public enum LeafIdentifier implements org.onosproject.yang.model.LeafIdentifier{ 
        /** 
        type string;
 * Represents ethernet. 
         */ 
      }
  ETHERNET(1); 

        private leafint severityleafIndex; {

        public int getLeafIndex() { 
  type string;
         return leafIndex; }
        }
}
Code Block
titleGenerated Java files
File : OspfManager.java
package org.onosproject.yang.gen.v1.http.example.com.ospf.rev20160519;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.event.ListenerRegistry;
import org.onosproject.yang.gen.v1.http.example.com.ospf.rev20160519.ospf.OspfEvent;
import org.onosproject.yang.gen.v1.http.example.com.ospf.rev20160519.ospf.OspfListener;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;

@Component (immediate = true)
@Service
public class OspfManager
        extends ListenerRegistry<OspfEvent, OspfListener>
        implements OspfService { 

        LeafIdentifier(int value) { 
            this.leafIndex = value; 
        } 
    } 

    private/** final
 Logger log = getLogger(getClass());

    @Activate * Returns the attribute ethernet. 
    public * void
 activate() {
   * @return ethernet value of //TODO: YANG utils generated code
   ethernet 
     */ 
    String log.info("Started"ethernet(); 

    }/** 

    @Deactivate
 * Returns the public void deactivate() {attribute valueLeafFlags. 
     * 
  //TODO: YANG utils generated* code
@return valueLeafFlags value of valueLeafFlags 
    log.info("Stopped");
    }
}

File : OspfService.java
package org.onosproject.yang.gen.v1.http.example.com.ospf.rev20160519;

import org.onosproject.event.ListenerService;
import org.onosproject.yang.gen.v1.http.example.com.ospf.rev20160519.ospf.OspfEvent;
import org.onosproject.yang.gen.v1.http.example.com.ospf.rev20160519.ospf.OspfListener;

public interface OspfService */ 
    BitSet valueLeafFlags(); 

    /** 
     * Sets the extendsattribute ListenerService<OspfEvent,ethernet. OspfListener> {
}

File : OspfEvent.java
package org.onosproject.yang.gen.v1.http.example.com.ospf.rev20160527.ospf;

import org.onosproject.event.AbstractEvent;

public class OspfEvent extends AbstractEvent<OspfEvent.Type, OspfEventSubject> {

    public enum Type {

    TEST
    }

    public OspfEvent(Type type, OspfEventSubject subject) {
     * 
     * @param ethernet value of ethernet 
     */ 
    void ethernet(String ethernet); 


    /** 
     * Checks if the leaf value is set. 
     * 
     * @param  super(type, subject);
    }

    public OspfEvent(Type type, OspfEventSubject subject, long time) {leaf leaf whose value status needs to checked 
     * @return result of leaf value set in object 
     */ 
  super(type, subject, time);
    }
}  boolean isLeafValueSet(LeafIdentifier leaf); 
}



File : OspfEventSubjectDefaultEthernerType.java
package org.onosproject.yang.gen.v1.http.examplehuawei.com.ospflink.rev20160519link.ospfinterfacetype; 

public class OspfEventSubject {

    private Test test;

    public Test test() {
        return test;
    }

import com.google.common.base.MoreObjects; 
import java.util.BitSet; 
import java.util.Objects; 
import org.onosproject.yang.gen.v1.http.huawei.com.link.link.InterfaceType; 
import org.onosproject.yang.model.InnerModelObject; 

/** 
 * Represents the implementation of ethernerType. 
 * 
 * <p> 
 * valueLeafFlags identify the leafs whose value are explicitly set 
 * Applicable in protocol edit and query operation. 
 * </p> 
 */ 
public class DefaultEthernerType extends InnerModelObject implements EthernerType { 
    protected String ethernet; 
    protected BitSet valueLeafFlags = new BitSet(); 

    @Override 
    public voidString testethernet(Test test) { 
        this.test = test;return ethernet; 
    } 
}

File  : OspfListener.java

package org.onosproject.yang.gen.v1.http.example.com.ospf.rev20160519.ospf;

import org.onosproject.event.EventListener;

public interface OspfListener extends EventListener<OspfEvent> {
}

File : Test.java

package org.onosproject.yang.gen.v1.http.example.com.ospf.rev20160519.ospf;

import org.onosproject.yangutils.translator.tojava.AugmentationHolder;

public interface Test extends AugmentationHolder  {

    String eventClass();  @Override 
    public BitSet valueLeafFlags() { 
        return valueLeafFlags; 
    } 

    String@Override severity();

    public interface TestBuildervoid ethernet(String ethernet) { 

         String eventClassvalueLeafFlags.set(LeafIdentifier.ETHERNET.getLeafIndex()); 

        this.ethernet String= severity();ethernet; 
    } 

    @Override 
    TestBuilderpublic int eventClasshashCode(String eventClass);

) { 
         TestBuilder severity(String severity);
return Objects.hash(ethernet, valueLeafFlags); 
    } 

    Test@Override build();
     }
}

File : TestBuilder.java
package org.onosproject.yang.gen.v1.http.example.com.ospf.rev20160519.ospf;

import com.google.common.base.MoreObjects;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.onosproject.yangutils.translator.tojava.AugmentedInfo;

public class TestBuilder implements Test.TestBuilder {

    private String eventClass;
    private String severity;

    @Override
    public String eventClass() {
        return eventClass;
    }

    @Override
    public String severity() {public boolean equals(Object obj) { 
        if (this == obj) { 
            return true; 
        } 
        if (obj instanceof DefaultEthernerType) { 
            DefaultEthernerType other = (DefaultEthernerType) obj; 
        return severity;
   return }

    @Override
    public TestBuilder eventClass(String eventClass) {
        this.eventClass = eventClass;Objects.equals(ethernet, other.ethernet) && 
        return this;
    }

    @Override
    public TestBuilder severity(String severity) {Objects.equals(valueLeafFlags, other.valueLeafFlags); 
        this.severity = severity;} 
        return thisfalse; 
    } 

    @Override 
    public TestString buildtoString() { 
        return new TestImpl(this);
MoreObjects.toStringHelper(getClass()) 
       }

    public TestBuilder.omitNullValues() {
    }

    public final class TestImpl implements Test {

 .add("ethernet", ethernet) 
        private List<AugmentedInfo> augmentedInfoList = new ArrayList<>(); .add("valueLeafFlags", valueLeafFlags) 
        private String eventClass;
  .toString(); 
     private String severity;} 


        @Override/** 
     * Creates an publicinstance String eventClass() {of defaultEthernerType. 
     */ 
    public DefaultEthernerType() return{ eventClass;
    }    }


    @Override    @Override
        public Stringboolean severityisLeafValueSet(LeafIdentifier leaf) { 
            return severity;valueLeafFlags.get(leaf.getLeafIndex()); 
    }    

}

        @Override
        public int hashCode() 

RPC

Overview

RPCs are modeled with RPC statement. The input statement is used to define input parameters to the RPC and output statement is used to define output parameters to the RPC.

JAVA mapping

Rpc statement is mapped to a method in module manager class and service interface.

The generated method will depends on the sub statements input and output. Input and Output will have there own java classes and RPC method will contain Output class's object as return type and Input class's object will be input for the method. If no output node is present , return type will be "void". Same way if no input is present , there will be no input parameter for the method.

Rpc node is an non operation type node so all the nodes under it will not contain operationType, processSubTreeFiltereing, select leaf flags in their generated code.

Example
Code Block
titleInput YANG file
File: sfc.yang
module Sfc {
    yang-version 1;
       return Objects.hash(eventClass, severity)namespace http://huawei.com;
        }
prefix Ant;
    rpc SFP   @Override{
        public boolean equals(Object obj) input {
           if (this == obj)leaf port {
                returntype truestring;
            }
          }
  if (obj instanceof TestImpl) {
    output {
           TestImpl otherleaf = (TestImpl) obj;path {
                return Objects.equals(eventClass, other.eventClass) &&type string;
            }
           Objects.equals(severity, other.severity);}
    }
}
Code Block
titleGenerated Java files
File : SfcService.java
package org.onosproject.yang.gen.v1.http.huawei.com; 

import org.onosproject.yang.gen.v1.http.huawei.com.sfc.sfp.SfpInput; 
import  }
            return false;
        }

        @Overrideorg.onosproject.yang.gen.v1.http.huawei.com.sfc.sfp.SfpOutput; 

/** 
 * Abstraction of an entity which represents the functionality of sfc. 
 */ 
public interface SfcService { 
    /** 
     * Service interface of sfp. 
     * 
  public String toString() {
* @param inputVar input of service interface sfp 
    return MoreObjects.toStringHelper(getClass())
         * @return sfpOutput output of service interface sfp 
     */ 
    SfpOutput  .add("eventClass", eventClass)
                    .add("severity", severity)
         sfp(SfpInput inputVar); 

}

File : SfpInput.java
package org.onosproject.yang.gen.v1.http.huawei.com.sfc.sfp; 

import java.util.BitSet; 

/** 
 * Abstraction of an entity which represents the functionality of sfpInput. 
 */ 
public interface SfpInput { 

    /** 
     * Identify the leaf of SfpInput. .toString();
     */ 
  }

  public enum LeafIdentifier implements org.onosproject.yang.model.LeafIdentifier{ 
   public TestImpl(TestBuilder builderObject) {
  /** 
         this.eventClass* =Represents builderObject.eventClass();port. 
         */ 
  this.severity = builderObject.severity();
      PORT(1); 

         }

private int leafIndex; 

        public int getLeafIndex() { 
          @Override  return leafIndex; 
        public void addAugmentation(AugmentedInfo} 

        LeafIdentifier(int value) { 
            getAugmentedInfoList().add(value);this.leafIndex = value; 
        } 
    } 

    /** 
     * Returns  @Overridethe attribute port. 
     * 
     * @return  public List<AugmentedInfo> getAugmentedInfoList() {
   port value of port 
     */ 
    String port(); 

    /** 
     * Returns the attribute returnvalueLeafFlags. augmentedInfoList;
     * 
   }

  * @return valueLeafFlags value of valueLeafFlags @Override
     */ 
   public voidBitSet removeAugmentationvalueLeafFlags(); {

    /** 
     *  getAugmentedInfoList().clear();Sets the attribute port. 
     * 
  }
   *  }
}

Augment

Overview

Augment means “make (something) greater by adding to it; increase.” in YANG augment adds some information in target node. Here in YANG, container, list, choice, case, input, output, or notification node can come as a target node.

As the child node of augment node only "container", "leaf", "list", "leaf-list", "uses", and "choice" can come. If augment comes under a module or submodule.

If a target node is a choice node the "case" statement, or a case shorthand statement can be come as a child node of augment node.

If a target node is from some other YANG file than a mandatory node which is is one of:

  • A leaf, choice, or anyxml node with a "mandatory" statement with   the value "true".

  • A list or leaf-list node with a "min-elements" statement with a value greater than zero.

  • A container node without a "presence" statement, which has at least one mandatory node as a child.

should not come as a child node of augment node.

Info
titleA augment node can't add the same augmented info to an augmented node multiple times.

 

Java mapping

For a given augment node in the YANG file one interface file and one builder class file will be generated. Generated files will be having attributes, getters and setters for augment node's child nodes and leaf or leaf-list.

For augment we have given two interface named as “AugmentationHolder” and “AugmentedInfo” as part of YANG utils plugin.

File generated for augment node will be implementing AugmentedInfo class.

Node in data model tree which can be augmented as per the YANG rules, will be implementing AugmentationHolder class. We have given 3 api in AugmentationHolder class, which are :

addAugmentation(AugmentedInfo augmentedInfo);

removeAugmentation();

getAugmentation();

these apis will be providing augmentation functionalities for augmented nodes. These class will be keeping a list of augmentedInfo , which is nothing but a list of augment nodes which are augmenting this node.

Example
@param port value of port 
     */ 
    void port(String port); 


    /** 
     * Checks if the leaf value is set. 
     * 
     * @param leaf leaf whose value status needs to checked 
     * @return result of leaf value set in object 
     */ 
    boolean isLeafValueSet(LeafIdentifier leaf); 
}


File : DefaultSfpInput.java
package org.onosproject.yang.gen.v1.http.huawei.com.sfc.sfp; 

import com.google.common.base.MoreObjects; 
import java.util.BitSet; 
import java.util.Objects; 
import org.onosproject.yang.model.InnerModelObject; 

/** 
 * Represents the implementation of sfpInput. 
 */ 
public class DefaultSfpInput extends InnerModelObject implements SfpInput { 
    protected String port; 
    protected BitSet valueLeafFlags = new BitSet(); 

    @Override 
    public String port() { 
        return port; 
    } 

    @Override 
    public BitSet valueLeafFlags() { 
        return valueLeafFlags; 
    } 

    @Override 
    public void port(String port) { 
        valueLeafFlags.set(LeafIdentifier.PORT.getLeafIndex()); 
        this.port = port; 
    } 

    @Override 
    public int hashCode() { 
        return Objects.hash(port, valueLeafFlags); 
    } 

    @Override 
    public boolean equals(Object obj) { 
        if (this == obj) { 
            return true; 
        } 
        if (obj instanceof DefaultSfpInput) { 
            DefaultSfpInput other = (DefaultSfpInput) obj; 
            return 
                Objects.equals(port, other.port) && 
                Objects.equals(valueLeafFlags, other.valueLeafFlags); 
        } 
        return false; 
    } 

    @Override 
    public String toString() { 
        return MoreObjects.toStringHelper(getClass()) 
            .omitNullValues() 
            .add("port", port) 
            .add("valueLeafFlags", valueLeafFlags) 
            .toString(); 
    } 


    /** 
     * Creates an instance of defaultSfpInput. 
     */ 
    public DefaultSfpInput() { 
    } 


    @Override 
    public boolean isLeafValueSet(LeafIdentifier leaf) { 
        return valueLeafFlags.get(leaf.getLeafIndex()); 
    } 

}


File : Sfpoutput.java

package org.onosproject.yang.gen.v1.http.huawei.com.sfc.sfp; 

import java.util.BitSet; 

/** 
 * Abstraction of an entity which represents the functionality of sfpOutput. 
 */ 
public interface SfpOutput { 

    /** 
     * Identify the leaf of SfpOutput. 
     */ 
    public enum LeafIdentifier implements org.onosproject.yang.model.LeafIdentifier{ 
        /** 
         * Represents path. 
         */ 
        PATH(1); 

        private int leafIndex; 

        public int getLeafIndex() { 
            return leafIndex; 
        } 

        LeafIdentifier(int value) { 
            this.leafIndex = value; 
        } 
    } 

    /** 
     * Returns the attribute path. 
     * 
     * @return path value of path 
     */ 
    String path(); 

    /** 
     * Returns the attribute valueLeafFlags. 
     * 
     * @return valueLeafFlags value of valueLeafFlags 
     */ 
    BitSet valueLeafFlags(); 

    /** 
     * Sets the attribute path. 
     * 
     * @param path value of path 
     */ 
    void path(String path); 


    /** 
     * Checks if the leaf value is set. 
     * 
     * @param leaf leaf whose value status needs to checked 
     * @return result of leaf value set in object 
     */ 
    boolean isLeafValueSet(LeafIdentifier leaf); 
}


File : DefaultSfpOutput.java

package org.onosproject.yang.gen.v1.http.huawei.com.sfc.sfp; 

import com.google.common.base.MoreObjects; 
import java.util.BitSet; 
import java.util.Objects; 
import org.onosproject.yang.model.InnerModelObject; 

/** 
 * Represents the implementation of sfpOutput. 
 */ 
public class DefaultSfpOutput extends InnerModelObject implements SfpOutput { 
    protected String path; 
    protected BitSet valueLeafFlags = new BitSet(); 

    @Override 
    public String path() { 
        return path; 
    } 

    @Override 
    public BitSet valueLeafFlags() { 
        return valueLeafFlags; 
    } 

    @Override 
    public void path(String path) { 
        valueLeafFlags.set(LeafIdentifier.PATH.getLeafIndex()); 
        this.path = path; 
    } 

    @Override 
    public int hashCode() { 
        return Objects.hash(path, valueLeafFlags); 
    } 

    @Override 
    public boolean equals(Object obj) { 
        if (this == obj) { 
            return true; 
        } 
        if (obj instanceof DefaultSfpOutput) { 
            DefaultSfpOutput other = (DefaultSfpOutput) obj; 
            return 
                Objects.equals(path, other.path) && 
                Objects.equals(valueLeafFlags, other.valueLeafFlags); 
        } 
        return false; 
    } 

    @Override 
    public String toString() { 
        return MoreObjects.toStringHelper(getClass()) 
            .omitNullValues() 
            .add("path", path) 
            .add("valueLeafFlags", valueLeafFlags) 
            .toString(); 
    } 


    /** 
     * Creates an instance of defaultSfpOutput. 
     */ 
    public DefaultSfpOutput() { 
    } 


    @Override 
    public boolean isLeafValueSet(LeafIdentifier leaf) { 
        return valueLeafFlags.get(leaf.getLeafIndex()); 
    } 

}
 
 
File : DefaultRpcHandler.java
 
package org.onosproject.yang.gen.v1.http.huawei.com;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.onosproject.config.RpcHandler;
import org.onosproject.config.RpcCommand;
import org.onosproject.config.RpcInput;
/**
 * Represents the implementation of RPC handler.
 */
public class DefaultRpcHandler implements RpcHandler {
    private ExecutorService executor;
    @Override
    public void executeRpc(Integer msgId, RpcCommand cmd, RpcInput input) {
        executor = Executors.newSingleThreadExecutor();
        executor.execute(new RpcExecuter(msgId, (RpcExtendedCommand) cmd, input));
    }
    /**
     * Runnable capable of invoking the appropriate RPC command's execute method.
     */
    public class RpcExecuter implements Runnable {
        Integer msgId;
        RpcExtendedCommand cmd;
        RpcInput input;
        /**
         * Constructs a RPC executor for the given msg id, RPC command and
         * RPC input.
         *
         * @param msgId msgId of the RPC message to be executed
         * @param cmd RPC command to be executed
         * @param input input data to the RPC command
         */
        public RpcExecuter(Integer msgId, RpcExtendedCommand cmd, RpcInput input) {
            this.msgId = msgId;
            this.cmd = cmd;
            this.input = input;
        }
        @Override
        public void run() {
            cmd.execute(input, msgId);
        }
    }
}
 
 
File : RegisterRpc.java
 
package org.onosproject.yang.gen.v1.http.huawei.com;
import org.onosproject.yang.gen.v1.http.huawei.com.sfc.SfpCommand;
import java.util.LinkedList;
import java.util.List;
import org.onosproject.config.RpcCommand;
import org.onosproject.config.RpcHandler;
import org.onosproject.config.DynamicConfigService;
import org.onosproject.yang.model.ModelConverter;
/**
 * Represents the implementation of register RPC.
 */
public class RegisterRpc {
    private List<RpcCommand> rpcCommands;
    private RpcHandler rpcHandler;
    private DynamicConfigService storeService;
    private ModelConverter modelConverter;
    private SfcService sfcService;
    /**
     * Constructs a register rpc for the given store service, mode converter and
     * application service.
     *
     * @param store dynamic config service
     * @param modelConverter model converter for convertion
     * @param allService application service
     */
    public RegisterRpc(DynamicConfigService store, ModelConverter modelConverter, SfcService sfcService) {
        this.rpcCommands = new LinkedList<RpcCommand>();
        this.rpcHandler = new DefaultRpcHandler();
        this.storeService = store;
        this.modelConverter = modelConverter;
        this.sfcService = sfcService;
    }
    /**
     * Registers RPC handler with dynamic config service.
     */
    public void registerRpc() {
        createRpcCommands();
        for (RpcCommand rpcCommand : rpcCommands) {
            storeService.registerHandler(rpcHandler, rpcCommand);
        }
    }
    /**
     * Creates RPC command for all the RPC.
     */
    public void createRpcCommands() {
        RpcCommand sfp = new SfpCommand(storeService, modelConverter, sfcService);
        rpcCommands.add(sfp);
    }
}
 
 
File : RpcExtendedCommand.java
 
package org.onosproject.yang.gen.v1.http.huawei.com;
import org.onosproject.yang.model.ResourceId;
import org.onosproject.config.RpcInput;
import org.onosproject.config.RpcCommand;
/**
 * Abstract implementation of an RPC extended command.
 */
public abstract class RpcExtendedCommand extends RpcCommand {
    /**
     * Creates an instance of RPC extended command.
     *
     * @param cmdId of RPC command
     */
    public RpcExtendedCommand(ResourceId cmdId) {
        super(cmdId);
    }
    /**
     * Executes the RPC command.
     *
     * @param input input data to the RPC command
     * @param msgId of the RPC message to be executed
     */
    public abstract void execute(RpcInput rpcInput, int msgId);
}
 
 
File : SfpCommand.java
 
package org.onosproject.yang.gen.v1.http.huawei.com.sfc;
import org.onosproject.yang.gen.v1.http.huawei.com.RpcExtendedCommand;
import org.onosproject.yang.gen.v1.http.huawei.com.SfcService;
import org.onosproject.yang.gen.v1.http.huawei.com.sfc.sfp.DefaultSfpOutput;
import org.onosproject.yang.gen.v1.http.huawei.com.sfc.sfp.SfpInput;
import org.onosproject.yang.model.ModelConverter;
import org.onosproject.yang.model.ResourceId;
import org.onosproject.config.RpcInput;
import org.onosproject.config.RpcOutput;
import org.onosproject.config.DynamicConfigService;
import org.onosproject.yang.model.ResourceData;
import org.onosproject.yang.model.ModelObjectData;
import org.onosproject.yang.runtime.DefaultResourceData;
import org.onosproject.yang.model.DefaultModelObjectData;
import static org.onosproject.config.RpcOutput.Status.RPC_SUCCESS;
/**
 * Represents the implementation of sfp.
 */
public class SfpCommand extends RpcExtendedCommand {
    private ModelConverter modelConverter;
    private SfcService sfcService;
    private DynamicConfigService storeService;
    /**
     * Constructs a sfp command for the given cmd id, model converter,
     * application service.
     *
     * @param cmdId identifier of RPC command
     * @param modelConverter model converter for convertion
     * @param allService application service
     */
    public SfpCommand(DynamicConfigService store, ModelConverter modelConverter, SfcService sfcService) {
        super(getResourceId());
        this.storeService = store;
        this.modelConverter = modelConverter;
        this.sfcService = sfcService;
    }
    @Override
    public void execute(RpcInput rpcInput) {
    }
    /**
     * Executes the RPC command.
     *
     * @param rpcInput input data to the RPC command
     * @param msgId msgId of the RPC message to be executed
     */
    public void execute(RpcInput rpcInput, int msgId) {
        ResourceData inputData = DefaultResourceData.builder()
                .resourceId(getResourceId())
                .addDataNode(rpcInput.input()).build();
        ModelObjectData inputMo = modelConverter.createModel(inputData);
        SfpInput inputObject = ((SfpInput) inputMo.modelObjects().get(0));
        DefaultSfpOutput outputObject = (DefaultSfpOutput) sfcService.sfp(inputObject);
        ModelObjectData outputMo = DefaultModelObjectData.builder()
                .addModelObject(outputObject).build();
        ResourceData outputData = modelConverter.createDataNode(outputMo);
        RpcOutput output = new RpcOutput(RPC_SUCCESS, outputData.dataNodes().get(0));
        storeService.rpcResponse(msgId, output);
    }
    private static ResourceId getResourceId() {
        return new ResourceId.Builder().addBranchPointSchema("/", null)
                .addBranchPointSchema("SFP", "http://huawei.com").build();
    }
}

Notification 

Overview

The "notification" statement is used to define a notification.  It takes one argument, which is an identifier, followed by a block of substatements that holds detailed notification information.

JAVA mapping

Notification is mapped to events and event listeners in ONOS. Events are used by Managers to notify its listeners about changes in the network or topology etc, and by Stores to notify their peers of events in a distributed setting. An Event is comprised of a event type and a subject built of model objects.

When notification statement is present in YANG, an event class , event subject class, event listener interface and notification interface  and builder will be generated.

When multiple notifications are present event class include the an enum with types of events for all notification  like DEVICE_ADDED, DEVICE_REMOVED and it extends AbstractEvent with event type and event subject class. It is used to notify EventListeners about the event.

xxxEvent Subject class will have all the objects of events for multiple notifications and getters and setters for the events.

xxxEvent Listener is interface which extends EventListener.

Notification is an non operation type node so all the nodes under it will not contains operation type, process sub tree filtering and select leaf flag in generated code.

Example
Code Block
titleInput YANG files
File : ospf.yang
module ospf {
    namespace "http://example.com/ospf";
    prefix "ospf";

    notification test {
           leaf event-class {
              type string;
           }
           leaf severity {
              type string;
           }
    }
}
Code Block
titleGenerated Java files
File : OspfService.java

package org.onosproject.yang.gen.v1.http.example.com.ospf; 

import org.onosproject.event.ListenerService; 
import org.onosproject.yang.gen.v1.http.example.com.ospf.ospf.OspfEvent; 
import org.onosproject.yang.gen.v1.http.example.com.ospf.ospf.OspfEventListener; 

/** 
 * Abstraction of an entity which represents the functionality of ospf. 
 */ 
public interface OspfService extends ListenerService<OspfEvent, OspfEventListener> { 
}


File : OspfEvent.java

package org.onosproject.yang.gen.v1.http.example.com.ospf.ospf; 

import org.onosproject.event.AbstractEvent; 

/** 
 * Represents event implementation of ospf. 
 */ 
public class OspfEvent extends AbstractEvent<OspfEvent.Type, OspfEventSubject> { 

    public enum Type { 

        /** 
         * Represents test. 
         */ 
        TEST 
    } 

    /** 
     * Creates OspfEventSubject event with type and subject. 
     * 
     * @param type event type 
     * @param subject subject OspfEventSubject 
     */ 
    public OspfEvent(Type type, OspfEventSubject subject) { 
        super(type, subject); 
    } 

    /** 
     * Creates OspfEventSubject event with type, subject and time. 
     * 
     * @param type event type 
     * @param subject subject OspfEventSubject 
     * @param time time of event 
     */ 
    public OspfEvent(Type type, OspfEventSubject subject, long time) { 
        super(type, subject, time); 
    } 

}


File : OspfEventSubject.java

package org.onosproject.yang.gen.v1.http.example.com.ospf.ospf; 
/** 
 * Represents the implementation of ospf. 
 */ 
public class OspfEventSubject { 

    protected Test test; 
    /** 
     * Returns the attribute test. 
     * 
     * @return test value of test 
     */ 
    public Test test() { 
        return test; 
    } 

    /** 
     * Sets the value to attribute test. 
     * 
     * @param test value of test 
     */ 
    public void test(Test test) { 
        this.test = test; 
    } 

}


File : OspfEventListener.java

package org.onosproject.yang.gen.v1.http.example.com.ospf.ospf; 

import org.onosproject.event.EventListener; 

/** 
 * Abstraction for event listener of ospf. 
 */ 
public interface OspfEventListener extends EventListener<OspfEvent> { 
}


File : Test.java

package org.onosproject.yang.gen.v1.http.example.com.ospf.ospf; 

import java.util.BitSet; 

/** 
 * Abstraction of an entity which represents the functionality of test. 
 */ 
public interface Test { 

    /** 
     * Identify the leaf of Test. 
     */ 
    public enum LeafIdentifier implements org.onosproject.yang.model.LeafIdentifier{ 
        /** 
         * Represents eventClass. 
         */ 
        EVENTCLASS(1), 
        /** 
         * Represents severity. 
         */ 
        SEVERITY(2); 

        private int leafIndex; 

        public int getLeafIndex() { 
            return leafIndex; 
        } 
 
        LeafIdentifier(int value) { 
            this.leafIndex = value; 
        } 
    } 

    /** 
     * Returns the attribute eventClass. 
     * 
     * @return eventClass value of eventClass 
     */ 
    String eventClass(); 

    /** 
     * Returns the attribute severity. 
     * 
     * @return severity value of severity 
     */ 
    String severity(); 

    /** 
     * Returns the attribute valueLeafFlags. 
     * 
     * @return valueLeafFlags value of valueLeafFlags 
     */ 
    BitSet valueLeafFlags(); 

    /** 
     * Sets the attribute eventClass. 
     * 
     * @param eventClass value of eventClass 
     */ 
    void eventClass(String eventClass); 

    /** 
     * Sets the attribute severity. 
     * 
     * @param severity value of severity 
     */ 
    void severity(String severity); 


    /** 
     * Checks if the leaf value is set. 
     * 
     * @param leaf leaf whose value status needs to checked 
     * @return result of leaf value set in object 
     */ 
    boolean isLeafValueSet(LeafIdentifier leaf); 
}


File : DefaultTest.java

package org.onosproject.yang.gen.v1.http.example.com.ospf.ospf; 

import com.google.common.base.MoreObjects; 
import java.util.BitSet; 
import java.util.Objects; 
import org.onosproject.yang.model.InnerModelObject; 

/** 
 * Represents the implementation of test. 
 */ 
public class DefaultTest extends InnerModelObject implements Test { 
    protected String eventClass; 
    protected String severity; 
    protected BitSet valueLeafFlags = new BitSet(); 

    @Override 
    public String eventClass() { 
        return eventClass; 
    } 

    @Override 
    public String severity() { 
        return severity; 
    } 

    @Override 
    public BitSet valueLeafFlags() { 
        return valueLeafFlags; 
    } 

    @Override 
    public void eventClass(String eventClass) { 
        valueLeafFlags.set(LeafIdentifier.EVENTCLASS.getLeafIndex()); 
        this.eventClass = eventClass; 
    } 

    @Override 
    public void severity(String severity) { 
        valueLeafFlags.set(LeafIdentifier.SEVERITY.getLeafIndex()); 
        this.severity = severity; 
    } 

    @Override 
    public int hashCode() { 
        return Objects.hash(eventClass, severity, valueLeafFlags); 
    } 

    @Override 
    public boolean equals(Object obj) { 
        if (this == obj) { 
            return true; 
        } 
        if (obj instanceof DefaultTest) { 
            DefaultTest other = (DefaultTest) obj; 
            return 
                Objects.equals(eventClass, other.eventClass) && 
                Objects.equals(severity, other.severity) && 
                Objects.equals(valueLeafFlags, other.valueLeafFlags); 
        } 
        return false; 
    } 

    @Override 
    public String toString() { 
        return MoreObjects.toStringHelper(getClass()) 
            .omitNullValues() 
            .add("eventClass", eventClass) 
            .add("severity", severity) 
            .add("valueLeafFlags", valueLeafFlags) 
            .toString(); 
    } 


    /** 
     * Creates an instance of defaultTest. 
     */ 
    public DefaultTest() { 
    } 


    @Override 
    public boolean isLeafValueSet(LeafIdentifier leaf) { 
        return valueLeafFlags.get(leaf.getLeafIndex()); 
    } 

}

Augment

Overview

Augment means “make (something) greater by adding to it; increase.” in YANG augment adds some information in target node. Here in YANG, container, list, choice, case, input, output, or notification node can come as a target node.

As the child node of augment node only "container", "leaf", "list", "leaf-list", "uses", and "choice" can come. If augment comes under a module or submodule.

If a target node is a choice node the "case" statement, or a case shorthand statement can be come as a child node of augment node.

If a target node is from some other YANG file than a mandatory node which is is one of:

  • A leaf, choice, or anyxml node with a "mandatory" statement with   the value "true".

  • A list or leaf-list node with a "min-elements" statement with a value greater than zero.

  • A container node without a "presence" statement, which has at least one mandatory node as a child.

should not come as a child node of augment node.

Info

 A augment node can't add the same augmented info to an augmented node multiple times.

Java mapping

For a given augment node in the YANG file one interface file and one builder class file will be generated. Generated files will be having attributes, getters and setters for augment node's child nodes and leaf or leaf-list.

For augment we have given one interface named as "YangAugmentedInfo” as part of YANG tools plugin.

File generated for augment node will be implementing AugmentedInfo class.

Node in data model tree which can be augmented as per the YANG rules for them we have given 3 methods , which are :


 public void addAugmentedInfo(YangAugmentedInfo value, Class classObject) {
        yangAugmentedInfoMap.put(classObject, value);
    }

    public YangAugmentedInfo getAugmentedInfo(Class classObject) {
        return yangAugmentedInfoMap.get(classObject);
    }

    public Map<Class<?>, YangAugmentedInfo> getYangAugmentedInfoMap() {
        return yangAugmentedInfoMap;
    }

these methods will be providing augmentation functionalities for augmentable nodes. These class will be storing augmentedInfo , which is nothing but a augment node which are augmenting this node. Also we have provides one code snippet in OpParam file which checks if augmented info is set or not in IsFilterMatchMethod().

OpParam file will extend "YangAugmentedOpParamInfo" interface provides by Yangtools.

Example
Code Block
titleInput YANG file
File : Test.yang
module Test {
     yang-version 1;
     namespace "http://huawei.com";
     prefix Ant;
     description "Interval before a route is declared invalid";

     container interface {
          leaf ifType {
                type string;
          }
     }

     augment "/interface" {
          leaf ds0ChannelNumber {
               type int16;
         }
    }
}
Code Block
titleGenerated Java files
 
File : AugmentedInterface.java

package org.onosproject.yang.gen.v1.http.huawei.com.test.yangautoprefixinterface; 

import java.util.BitSet; 

/** 
 * Abstraction of an entity which represents the functionality of augmentedInterface. 
 */ 
public interface AugmentedInterface { 

    /** 
     * Identify the leaf of AugmentedInterface. 
     */ 
    public enum LeafIdentifier implements org.onosproject.yang.model.LeafIdentifier{ 
        /** 
         * Represents ds0ChannelNumber. 
         */ 
        DS0CHANNELNUMBER(1); 

        private int leafIndex; 

        public int getLeafIndex() { 
            return leafIndex; 
        } 

        LeafIdentifier(int value) { 
            this.leafIndex = value; 
        } 
    } 

    /** 
     * Returns the attribute ds0ChannelNumber. 
     * 
     * @return ds0ChannelNumber value of ds0ChannelNumber 
     */ 
    short ds0ChannelNumber(); 

    /** 
     * Returns the attribute valueLeafFlags. 
     * 
     * @return valueLeafFlags value of valueLeafFlags 
     */ 
    BitSet valueLeafFlags(); 

    /** 
     * Sets the attribute ds0ChannelNumber. 
     * 
     * @param ds0ChannelNumber value of ds0ChannelNumber 
     */ 
    void ds0ChannelNumber(short ds0ChannelNumber); 


    /** 
     * Checks if the leaf value is set. 
     * 
     * @param leaf leaf whose value status needs to checked 
     * @return result of leaf value set in object 
     */ 
    boolean isLeafValueSet(LeafIdentifier leaf); 
}


File : DefaultAugmentedInterface.java
package org.onosproject.yang.gen.v1.http.huawei.com.test.yangautoprefixinterface; 

import com.google.common.base.MoreObjects; 
import java.util.BitSet; 
import java.util.Objects; 
import org.onosproject.yang.model.InnerModelObject; 

/** 
 * Represents the implementation of augmentedInterface. 
 * 
 * <p> 
 * valueLeafFlags identify the leafs whose value are explicitly set 
 * Applicable in protocol edit and query operation. 
 * </p> 
 */ 
public class DefaultAugmentedInterface extends InnerModelObject implements AugmentedInterface { 
    protected short ds0ChannelNumber; 
    protected BitSet valueLeafFlags = new BitSet(); 

    @Override 
    public short ds0ChannelNumber() { 
        return ds0ChannelNumber; 
    } 

    @Override 
    public BitSet valueLeafFlags() { 
        return valueLeafFlags; 
    } 

    @Override 
    public void ds0ChannelNumber(short ds0ChannelNumber) { 
        valueLeafFlags.set(LeafIdentifier.DS0CHANNELNUMBER.getLeafIndex()); 
        this.ds0ChannelNumber = ds0ChannelNumber; 
    } 

    @Override 
    public int hashCode() { 
        return Objects.hash(ds0ChannelNumber, valueLeafFlags); 
    } 

    @Override 
    public boolean equals(Object obj) { 
        if (this == obj) { 
            return true; 
        } 
        if (obj instanceof DefaultAugmentedInterface) { 
            DefaultAugmentedInterface other = (DefaultAugmentedInterface) obj; 
            return 
                Objects.equals(ds0ChannelNumber, other.ds0ChannelNumber) && 
                Objects.equals(valueLeafFlags, other.valueLeafFlags); 
        } 
        return false; 
    } 

    @Override 
    public String toString() { 
        return MoreObjects.toStringHelper(getClass()) 
            .omitNullValues() 
            .add("ds0ChannelNumber", ds0ChannelNumber) 
            .add("valueLeafFlags", valueLeafFlags) 
            .toString(); 
    } 


    /** 
     * Creates an instance of defaultAugmentedInterface. 
     */ 
    public DefaultAugmentedInterface() { 
    } 


    @Override 
    public boolean isLeafValueSet(LeafIdentifier leaf) { 
        return valueLeafFlags.get(leaf.getLeafIndex()); 
    } 

}


Type

Overview

The "type" statement takes as an argument a string that is the name of a YANG built-in type or a derived type, followed by an optional block of sub statements that are used to put further restrictions on the type.

Java mapping


YANG

Description

JAVA

binary

Any binary data

byte[]

bits

A set of bits or flags

BitSet in container class (A enum class for bits leaf)

boolean

"True" or "false"

boolean

decimal64

64-bit    signed decimal number

               BigDecimal

empty

A leaf that does not have any value

boolean

enumeration

Enumerated strings

Enum class will be generated

identityref

A reference to an abstract identity

To be implemented

instance-identifier

References a data tree node

String

int8

8-bit signed integer

byte   

int16

16-bit signed integer

short

int32

32-bit signed integer

int

int64

64-bit signed integer

long   

leafref   

A reference to a leaf instance

The type of referenced leaf/leaf-list will be used

string   

Human-readable string

String

uint8   

8-bit unsigned integer

short

uint16   

16-bit unsigned integer        

int   

uint32

32-bit unsigned integer

long   

uint64   

64-bit unsigned integer

BigInteger

union   

Choice of member types

Union  class will be generated

Example
Code Block
titleInput YANG file
leaf one {                         
    type string;
}

leaf two {                           
    type int32;
}

leaf-list three {
    type boolean;
}

leaf-list four {            
    type int16;
}
leaf mybits {
    type bits {
        bit disable-nagle {
            position 0;
        }
        bit auto-sense-speed {
            position 1;
        }
        bit Mb-only {
            position 2;
        }
    }
    default "auto-sense-speed";
}
Code Block
titleGenerated Java file
File : Test.java

package org.onosproject.yang.gen.v1.http.huawei.com;

import java.util.BitSet;
import java.util.List;

/**
 * Abstraction of an entity which represents the functionality of test.
 */
public interface Test {

    /**
     * Identify the leaf of Test.
     */
    public enum LeafIdentifier implements org.onosproject.yang.model.LeafIdentifier{
        
        ONE(1),
        /**
         * Represents two.
         */
        TWO(2),
        /**
         * Represents mybits.
         */
        MYBITS(3),
        /**
         * Represents three.
         */
        THREE(4),
        /**
         * Represents four.
         */
        FOUR(5);

        private int leafIndex;

        public int getLeafIndex() {
            return leafIndex;
        }

        LeafIdentifier(int value) {
            this.leafIndex = value;
        }
    }

    /**
     * Returns the attribute one.
     *
     * @return one value of one
     */
    String one();

    /**
     * Returns the attribute two.
     *
     * @return two value of two
     */
    int two();

    /**
     * Returns the attribute mybits.
     *
     * @return mybits value of mybits
     */
    BitSet mybits();

    /**
     * Returns the attribute three.
     *
     * @return three list of three
     */
    List<Boolean> three();

    /**
     * Returns the attribute four.
     *
     * @return four list of four
     */
    List<Short> four();

    /**
     * Returns the attribute valueLeafFlags.
     *
     * @return valueLeafFlags value of valueLeafFlags
     */
    BitSet valueLeafFlags();

    /**
     * Sets the attribute one.
     *
     * @param one value of one
     */
    void one(String one);

    /**
     * Sets the attribute two.
     *
     * @param two value of two
     */
    void two(int two);

    /**
     * Sets the attribute mybits.
     *
     * @param mybits value of mybits
     */
    void mybits(BitSet mybits);

    /**
     * Sets the attribute three.
     *
     * @param three list of three
     */
    void three(List<Boolean> three);

    /**
     * Sets the attribute four.
     *
     * @param four list of four
     */
    void four(List<Short> four);

    /**
     * Adds to the list of three.
     *
     * @param addTo value of three
     */
    void addToThree(Boolean addTo);

    /**
     * Adds to the list of four.
     *
     * @param addTo value of four
     */
    void addToFour(Short addTo);


    /**
     * Checks if the leaf value is set.
     *
     * @param leaf leaf whose value status needs to checked
     * @return result of leaf value set in object
     */
    boolean isLeafValueSet(LeafIdentifier leaf);
}



File : TestOpParam

package org.onosproject.yang.gen.v1.http.huawei.com;

import com.google.common.base.MoreObjects;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.onosproject.yang.model.InnerModelObject;

/**
 * Represents the implementation of test.
 *
 * <p>
 * valueLeafFlags identify the leafs whose value are explicitly set
 * Applicable in protocol edit and query operation.
 * </p>
 */
public class TestOpParam extends InnerModelObject implements Test {
    protected String one;
    protected int two;
    protected BitSet mybits;
    protected List<Boolean> three;
    protected List<Short> four;
    protected BitSet valueLeafFlags = new BitSet();

    @Override
    public String one() {
        return one;
    }

    @Override
    public int two() {
        return two;
    }

    @Override
    public BitSet mybits() {
        return mybits;
    }

    @Override
    public List<Boolean> three() {
        return three;
    }

    @Override
    public List<Short> four() {
        return four;
    }

    @Override
    public BitSet valueLeafFlags() {
        return valueLeafFlags;
    }

    @Override
    public void one(String one) {
        valueLeafFlags.set(LeafIdentifier.ONE.getLeafIndex());
        this.one = one;
    }

    @Override
    public void two(int two) {
        valueLeafFlags.set(LeafIdentifier.TWO.getLeafIndex());
        this.two = two;
    }

    @Override
    public void mybits(BitSet mybits) {
        valueLeafFlags.set(LeafIdentifier.MYBITS.getLeafIndex());
        this.mybits = mybits;
    }

    @Override
    public void three(List<Boolean> three) {
        valueLeafFlags.set(LeafIdentifier.THREE.getLeafIndex());
        this.three = three;
    }

    @Override
    public void four(List<Short> four) {
        valueLeafFlags.set(LeafIdentifier.FOUR.getLeafIndex());
        this.four = four;
    }

    @Override
    public void addToThree(Boolean addTo) {
        if (three == null) {
            three = new ArrayList<>();
        }
        three.add(addTo);
    }


    @Override
    public void addToFour(Short addTo) {
        if (four == null) {
            four = new ArrayList<>();
        }
        four.add(addTo);
    }


    @Override
    public int hashCode() {
        return Objects.hash(one, two, mybits, three, four, valueLeafFlags);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof TestOpParam) {
            TestOpParam other = (TestOpParam) obj;
            return
                Objects.equals(one, other.one) &&
                Objects.equals(two, other.two) &&
                Objects.equals(mybits, other.mybits) &&
                Objects.equals(three, other.three) &&
                Objects.equals(four, other.four) &&
                Objects.equals(valueLeafFlags, other.valueLeafFlags);
        }
        return false;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(getClass())
            .omitNullValues()
            .add("one", one)
            .add("two", two)
            .add("mybits", mybits)
            .add("three", three)
            .add("four", four)
            .add("valueLeafFlags", valueLeafFlags)
            .toString();
    }

    /**
     * Creates an instance of testOpParam.
     */
    public TestOpParam() {
    }


    @Override
    public boolean isLeafValueSet(LeafIdentifier leaf) {
        return valueLeafFlags.get(leaf.getLeafIndex());
    }


    @Override
    public void addAugmentation(InnerModelObject obj) {
    }

    @Override
    public void removeAugmentation(InnerModelObject obj) {
    }

    @Override
    public Map<Class<? extends InnerModelObject>, InnerModelObject> augmentations() {

        return null;
    }

    @Override
    public <T extends InnerModelObject> T augmentation(Class<T> c) {

        return null;
    }
}


Typedef

Overview

Typedef is user defined type for his implementation. It has the base type which is must for typedef. To give more information about the typedef there should be sub statements to describe it. Unit statement is optional for typedef which give info about the unit of the type. Default is like a value which will be assigned to the typedef if no value is given.default value should follow all restriction defined for the base-type.

Java mapping

For a given typedef node one class file will be generated which will have an attribute with the base type of typedef. There will be a constructor and a getter method, of method and implementation of hashcode, equals and toString methods.

Example
Code Block
titleInput YANG file
File : test.yang

module test {

    yang-version 1;
    namespace "http://huawei.com";
    prefix "test";

    typedef percent {
        type uint8;
           description "Percentage";
    }

    leaf completed {
        type percent;
    }
}
Code Block
titleGenerated Java file
File : Percent.java
package org.onosproject.yang.gen.v1.http.huawei.com.test;

import java.util.Objects;

/**
 * Represents the implementation of percent.
 */
public final class Percent {

    private short uint8;

    /**
     * Creates an instance of percent.
     */
    private Percent() {
    }

    /**
     * Creates an instance of uint8.
     *
     * @param uint8 value of uint8
     */
    public Percent(short uint8) {
        this.uint8 = uint8;
    }

    /**
     * Returns the object of percent for type uint8.
     *
     * @param value value of percent for type uint8
     * @return percent for type uint8
     */
    public static Percent of(short value) {
        return new Percent(value);
    }

    /**
     * Returns the attribute uint8.
     *
     * @return uint8 value of uint8
     */
    public short uint8() {
        return uint8;
    }
    /**
     * Sets the attribute uint8.
     *
     * @param uint8 value of uint8
     */
    public void uint8(short uint8) {
        this.uint8 = uint8;
    }

    @Override
    public int hashCode() {
        return Objects.hash(uint8);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof Percent) {
            Percent other = (Percent) obj;
            return
                Objects.equals(uint8, other.uint8);
        }
        return false;
    }

    @Override
    public String toString() {
        return String.valueOf(uint8);
    }
    /**
     * Returns the object of percent fromString input String percent.
     *
     * @param valInString value of input String
     * @return percent
     */
    public static Percent fromString(String valInString) {
        try {
            short tmpVal = Short.parseShort(valInString);
            return of(tmpVal);
        } catch (Exception e) {
            throw new IllegalArgumentException("not a valid input element");
        }
    }
}

Enumeration

Overview

Enum statement only can come when a leaf is of type enumeration. Each enum has one string then should be unique . The string must not be empty string and must not have white spaces. Enum can have sub statements, value statement will give the info about its value. If the enum statement in enumeration has no value statement then its value is considered as zero and subsequently incremented by one for next values.

Java mapping

For a given enumeration node one enum file will be generated which will have all the enum as its attributes. There will be a constructor and a getter method for the values.

Example
Code Block
titleInput YANG file
File: test.yang
module Test {

    yang-version 1;
    namespace "http://huawei.com";
    prefix Ant;
    description "Interval before a route is declared invalid";

    leaf  packetType {
         type enumeration {
             enum "unbounded";
             enum ZERO;
           enum two;
             enum four;
         }         
       }
}
Code Block
titleGenerated Java files
File : PacketTypeEnum.java

package org.onosproject.yang.gen.v1.http.huawei.com.test;

/**
 * Represents ENUM data of packetTypeEnum.
 */
public enum PacketTypeEnum {

    /**
     * Represents unbounded.
     */
    UNBOUNDED(0, "unbounded"),

    /**
     * Represents zERO.
     */
    ZERO(1, "ZERO"),

    /**
     * Represents two.
     */
    TWO(2, "two"),

    /**
     * Represents four.
     */
    FOUR(3, "four");

    private int packetTypeEnum;
    private String schemaName;

    /**
     * Creates an instance of packetTypeEnum.
     *
     * @param packetTypeEnum value of packetTypeEnum
     */
     PacketTypeEnum(int packetTypeEnum, String schemaName) {
        this.packetTypeEnum = packetTypeEnum;
        this.schemaName = schemaName;
    }

    /**
     * Returns the object of packetTypeEnum for.
     *
     * @param value value of packetTypeEnum for
     * @return packetTypeEnum for
     */
    public static PacketTypeEnum of(int value) {
        switch (value) {
            case 0:
                return PacketTypeEnum.UNBOUNDED;
            case 1:
                return PacketTypeEnum.ZERO;
            case 2:
                return PacketTypeEnum.TWO;
            case 3:
                return PacketTypeEnum.FOUR;
            default :
                throw new IllegalArgumentException("not a valid input element");
        }
    }
    /**
     * Returns the object of packetTypeEnum for.
     *
     * @param value value of packetTypeEnum for
     * @return packetTypeEnum for
     */
    public static PacketTypeEnum of(String value) {
        switch (value) {
            case "unbounded":
                return PacketTypeEnum.UNBOUNDED;
            case "ZERO":
                return PacketTypeEnum.ZERO;
            case "two":
                return PacketTypeEnum.TWO;
            case "four":
                return PacketTypeEnum.FOUR;
            default :
                throw new IllegalArgumentException("not a valid input element");
        }
    }
    /**
     * Returns the attribute packetTypeEnum.
     *
     * @return packetTypeEnum value of packetTypeEnum
     */
    public int packetTypeEnum() {
        return packetTypeEnum;
    }


    @Override
    public String toString() {
        return schemaName;
    }
}


Union

Overview

Union is a built in type which represents its member types. Union can have multiple member types. To use union there must be a type statement. Except empty and leafref all types can come under union.

When a value comes for union , which can match to multiple member types of union, then in that case to whichever type value matches from the member types defined in union value, will be taken from union as the values type.

Java mapping

For a given union node one class file will be generated which will have all the an attribute with the type union is having. There will be a constructor , getter method, of method, fromString, HashCode, equals and ToString methods for the values.

Example
Code Block
titleInput YANG file
File : test.yang
module test {
    yang-version 1;
    namespace "http://huawei.com";
    prefix "test";

    typedef ip-address {
        type union {
            type int32;
            type uint32;
        }
    }
}
Code Block
titleGenerated java files
File : IpAddressUnion.java
package org.onosproject.yang.gen.v1.http.huawei.com.test.ipaddress;

import java.util.Objects;
import java.util.BitSet;

/**
 * Represents the implementation of ipAddressUnion.
 */
public final class IpAddressUnion {
    private int int32;
    private long uint32;
    private BitSet setValue = new BitSet();

    /**
     * Creates an instance of ipAddressUnion.
     */
    private IpAddressUnion() {
    }

    /**
     * Creates an instance of int32.
     *
     * @param int32 value of int32
     */
    public IpAddressUnion(int int32) {
        setValue.set(0);
        this.int32 = int32;
    }

    /**
     * Creates an instance of uint32.
     *
     * @param uint32 value of uint32
     */
    public IpAddressUnion(long uint32) {
        setValue.set(1);
        this.uint32 = uint32;
    }

    /**
     * Returns the object of ipAddressUnion for type int32.
     *
     * @param value value of ipAddressUnion for type int32
     * @return ipAddressUnion for type int32
     */
    public static IpAddressUnion of(int value) {
        return new IpAddressUnion(value);
    }

    /**
     * Returns the object of ipAddressUnion for type uint32.
     *
     * @param value value of ipAddressUnion for type uint32
     * @return ipAddressUnion for type uint32
     */
    public static IpAddressUnion of(long value) {
        return new IpAddressUnion(value);
    }

    /**
     * Returns the attribute int32.
     *
     * @return int32 value of int32
     */
    public int int32() {
        return int32;
    }
    /**
     * Returns the attribute uint32.
     *
     * @return uint32 value of uint32
     */
    public long uint32() {
        return uint32;
    }
    /**
     * Sets the attribute int32.
     *
     * @param int32 value of int32
     */
    public void int32(int int32) {
        this.int32 = int32;
    }
    /**
     * Sets the attribute uint32.
     *
     * @param uint32 value of uint32
     */
    public void uint32(long uint32) {
        this.uint32 = uint32;
    }

    @Override
    public int hashCode() {
        return Objects.hash(int32, uint32);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof IpAddressUnion) {
            IpAddressUnion other = (IpAddressUnion) obj;
            return
                Objects.equals(int32, other.int32) &&
                Objects.equals(uint32, other.uint32);
        }
        return false;
    }

    @Override
    public String toString() {
        if (setValue.get(0)) {
            return String.valueOf(int32);
        }
        if (setValue.get(1)) {
            return String.valueOf(uint32);
        }
        return null;
    }
    /**
     * Returns the object of ipAddressUnion fromString input String ipAddressUnion.
     *
     * @param valInString value of input String
     * @return ipAddressUnion
     */
    public static IpAddressUnion fromString(String valInString) {
        try {
            int tmpVal = Integer.parseInt(valInString);
            return of(tmpVal);
        } catch (Exception e) {
        }
        try {
            long tmpVal = Long.parseLong(valInString);
            return of(tmpVal);
        } catch (Exception e) {
            throw new IllegalArgumentException("not a valid input element");
        }
    }
}

When there are two types with same java mapping. for resolving this conflict we will be checking the range of the value and then we will assign it to the right attribute. Order will be taken care of while code generation and conflict range validation . for example : if union have type int32 followed by uint16, then range validation will be done on basis of int32 , in other case range will be validated on basis of uint16.

Code Block
titleInput YANG file
File : test.yang
module test {
    yang-version 1;
    namespace "http://huawei.com";
    prefix "test";

    typedef ip-address {
        type union {
            type int32;
            type uint16;
            type int64;
            type uint32;
            type string;
        }
    }
}
Code Block
titleGenerated java files
File : IpAddressUnion.java

package org.onosproject.yang.gen.v1.http.huawei.com.test.ipaddress;

import java.math.BigInteger;
import java.util.BitSet;
import java.util.Objects;

/**
 * Represents the implementation of ipAddressUnion.
 */
public final class IpAddressUnion {
    private static final int INT32_MIN_RANGE = -2147483648;
    private static final int INT32_MAX_RANGE = 2147483647;
    private static final BigInteger INT64_MIN_RANGE = new BigInteger("-9223372036854775808");
    private static final BigInteger INT64_MAX_RANGE = new BigInteger("9223372036854775807");
    private int int32;
    private int uint16;
    private long int64;
    private long uint32;
    private String string;
    private BitSet setValue = new BitSet();

    /**
     * Creates an instance of ipAddressUnion.
     */
    private IpAddressUnion() {
    }

    /**
     * Creates an instance of string.
     *
     * @param string value of string
     */
    public IpAddressUnion(String string) {
        setValue.set(4);
        this.string = string;
    }

    /**
     * Creates an instance of int32.
     *
     * @param int32 value of int32
     */
    public IpAddressUnion(int int32) {
        setValue.set(0);
        if (validateRange(INT32_MIN_RANGE, INT32_MAX_RANGE, int32)) {
            this.int32 = int32;
        } else {
            this.uint16 = int32;
    }
        }

    /**
     * Creates an instance of int64.
     *
     * @param int64 value of int64
     */
    public IpAddressUnion(long int64) {
        setValue.set(2);
        if (validateRange(INT64_MIN_RANGE, INT64_MAX_RANGE, int64)) {
            this.int64 = int64;
        } else {
            this.uint32 = int64;
    }
        }

    /**
     * Returns the object of ipAddressUnion for type string.
     *
     * @param value value of ipAddressUnion for type string
     * @return ipAddressUnion for type string
     */
    public static IpAddressUnion of(String value) {
        return new IpAddressUnion(value);
    }

    /**
     * Returns the object of ipAddressUnion for type int32.
     *
     * @param value value of ipAddressUnion for type int32
     * @return ipAddressUnion for type int32
     */
    public static IpAddressUnion of(int value) {
        return new IpAddressUnion(value);
    }

    /**
     * Returns the object of ipAddressUnion for type int64.
     *
     * @param value value of ipAddressUnion for type int64
     * @return ipAddressUnion for type int64
     */
    public static IpAddressUnion of(long value) {
        return new IpAddressUnion(value);
    }

    /**
     * Returns the attribute int32.
     *
     * @return int32 value of int32
     */
    public int int32() {
        return int32;
    }
    /**
     * Returns the attribute int64.
     *
     * @return int64 value of int64
     */
    public long int64() {
        return int64;
    }
    /**
     * Returns the attribute string.
     *
     * @return string value of string
     */
    public String string() {
        return string;
    }
    /**
     * Sets the attribute int32.
     *
     * @param int32 value of int32
     */
    public void int32(int int32) {
        this.int32 = int32;
    }
    /**
     * Sets the attribute uint16.
     *
     * @param uint16 value of uint16
     */
    public void uint16(int uint16) {
        this.uint16 = uint16;
    }
    /**
     * Sets the attribute int64.
     *
     * @param int64 value of int64
     */
    public void int64(long int64) {
        this.int64 = int64;
    }
    /**
     * Sets the attribute uint32.
     *
     * @param uint32 value of uint32
     */
    public void uint32(long uint32) {
        this.uint32 = uint32;
    }
    /**
     * Sets the attribute string.
     *
     * @param string value of string
     */
    public void string(String string) {
        this.string = string;
    }

    @Override
    public int hashCode() {
        return Objects.hash(int32, uint16, int64, uint32, string);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof IpAddressUnion) {
            IpAddressUnion other = (IpAddressUnion) obj;
            return
                Objects.equals(int32, other.int32) &&
                Objects.equals(uint16, other.uint16) &&
                Objects.equals(int64, other.int64) &&
                Objects.equals(uint32, other.uint32) &&
                Objects.equals(string, other.string);
        }
        return false;
    }

    @Override
    public String toString() {
        if (setValue.get(0)) {
            return String.valueOf(int32);
        }
        if (setValue.get(1)) {
            return String.valueOf(uint16);
        }
        if (setValue.get(2)) {
            return String.valueOf(int64);
        }
        if (setValue.get(3)) {
            return String.valueOf(uint32);
        }
        if (setValue.get(4)) {
            return string;
        }
        return null;
    }
    /**
     * Returns the object of ipAddressUnion fromString input String ipAddressUnion.
     *
     * @param valInString value of input String
     * @return ipAddressUnion
     */
    public static IpAddressUnion fromString(String valInString) {
        try {
            int tmpVal = Integer.parseInt(valInString);
            return of(tmpVal);
        } catch (Exception e) {
        }
        try {
            long tmpVal = Long.parseLong(valInString);
            return of(tmpVal);
        } catch (Exception e) {
        }
        try {
            String tmpVal = (valInString);
            return of(tmpVal);
        } catch (Exception e)
Code Block
titleInput YANG file
File : Test.yang
module Test {
     yang-version 1;
     namespace "http://huawei.com";
     prefix Ant;
     description "Interval before a route is declared invalid";

     container interface {
          leaf ifType {
throw new IllegalArgumentException("not a valid input element");
        }
  type  string;}
    /**
     * Validates }
if value is in given }

range.validateRange.
     *
   augment "/Test/interface" {
      * @param minRange value of minRange
     leaf* ds0ChannelNumber@param {
minRange value of maxRange
     * @return  true if value is typein int16;range
     */
    }
private boolean validateRange(int  }
}
Code Block
titleGenerated Java files
File : AugmentedInterface.java


package org.onosproject.yang.gen.v1.http.huawei.com.rev20160428.test;
import org.onosproject.yangutils.utils.AugmentedInfo;

public interface AugmentedInterface extends AugmentedInfo  {
   
    short getDs0ChannelNumber()minRange, int maxRange, int value) {
        return value >= minRange && value <= maxRange;
    }
    interface/**
 AugmentedInterfaceBuilder {
 
  * Validates if value is in short getDs0ChannelNumber();
given range.validateRange.
     *
     * @param minRange AgmentedInterfaceBuildervalue setDs0ChannelNumber(short ds0ChannelNumber);

of minRange
     * @param AugmentedInterface build();
    }
}

File : AugmentedInterfaceBuilder.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160428.test;
import java.util.Objects;
import com.google.common.base.MoreObjects;
import org.onosproject.yang.gen.v1.http.huawei.com.rev20160428.test.InterfaceBuilder.InterfaceImpl;

public class AugmentedInterfaceBuilder implements AugmentedInterface.AugmentedInterfaceBuilder {
   private short ds0ChannelNumber;

   @Override
   public short getDs0ChannelNumber() {
minRange value of maxRange
     * @return  true if value is in range
     */
    private boolean validateRange(BigInteger minRange, BigInteger maxRange, long value) {
        returnBigInteger ds0ChannelNumber;
bigInteger =  }

   @Overridenew BigInteger(" " + value);
   public AugmentedInterfaceBuilder setDs0ChannelNumber(short ds0ChannelNumber)  {
       this.ds0ChannelNumber = ds0ChannelNumberreturn bigInteger.compareTo(minRange) == 1 && bigInteger.compareTo(maxRange) == 1;
    }
}

Leafref

Overview

The leafref type is used to reference a particular leaf instance in the data tree. Path statement must be present for leafref type. The path under leafref must refer to existing leaf or leaf-list. The leaf or leaf-list with leafref will use the instance of the referred leaf or leaf-list.

If leafref comes under grouping and typedef, it will be resolved where it is used. It will not be resolved where it is defined.

 

Java mapping

The leaf or leaf-list with type leafref, will copy the type of referred leaf or leaf-list, during java file generation. If leaf-ref is directly inside grouping then the generated return type of that leaf will be Object.

Example
Code Block
titleinput YANG file
File : ietf-network.yang
module ietf-network    return this;
   }

   @Override
   public AugmentedInterface build() {
       return new AugmentedInterfaceImpl(this)yang-version 1;
   }

   public AugmentedInterfaceBuilder() {
   }
namespace "urn:ietf:params:xml:ns:yang:ietf-network";
   public final class AugmentedInterfaceImpl implements AugmentedInterface {

       private short ds0ChannelNumberprefix nd;

    container   @Override
       public short getDs0ChannelNumber() networks {
           return ds0ChannelNumber;description
       }

     "Serves as @Override
top-level container for a    Public int hashCode() {list of
           return Objects.hash(ds0ChannelNumber)networks.";
       }

       @Override
       public boolean equals(Object obj) leaf id {
           if (this == obj) {
type uint8;
            description
     return true;
      "Identifies a network.";
   }

     }
      if (obj instanceofcontainer AugmentedInterfaceImpl)network {
            leaf network-id {
 AugmentedInterfaceImpl  other = (AugmentedInterfaceImpl) obj;
          type leafref {
   return
                 path "/nd:networks/nd:id";
    Objects.equals(ds0ChannelNumber, other.ds0ChannelNumber);
           }
           return false;}
        }

        @Overrideuses network-id;
    }
   public String toString()grouping network-id {
        description
   return MoreObjects.toStringHelper(getClass())
        "Serves as top-level container for a  .add("ds0ChannelNumber", ds0ChannelNumber)list of
               .toString()networks.";
       }

 leaf network-id {
    Public AugmentedInterfaceImpl(AugmentedInterfaceBuilder builderObject) {
     type leafref {
    this.ds0ChannelNumber = builderObject.getDs0ChannelNumber();
          InterfaceImpl interfaceImpl = new InterfaceBuilder().new InterfaceImpl();
path "/nd:networks/nd:id";
           interfaceImpl.addAugmentation(this); }
        }
   }
}

Type

Overview

The "type" statement takes as an argument a string that is the name of a YANG built-in type or a derived type, followed by an optional block of sub statements that are used to put further restrictions on the type.

Java mapping

 

...

YANG

...

Description

...

JAVA

...

binary

...

Any binary data

...

To be implemented

...

bits

...

A set of bits or flags

...

To be implemented

...

boolean

...

"True" or "false"

...

boolean

...

decimal64

...

64-bit    signed decimal number

...

To be implemented

...

empty

...

A leaf that does not have any value

...

boolean

...

enumeration

...

Enumerated strings

...

Enum class will be generated

...

identityref

...

A reference to an abstract identity

...

To be implemented

...

instance-identifier

...

References a data tree node

...

String

...

int8

...

8-bit signed integer

...

byte   

...

int16

...

16-bit signed integer

...

short

...

int32

...

32-bit signed integer

...

int

...

int64

...

64-bit signed integer

...

long   

...

leafref   

...

A reference to a leaf instance

...

The type of referenced leaf/leaf-list will be used

...

string   

...

Human-readable string

...

String

...

uint8   

...

8-bit unsigned integer

...

short

...

uint16   

...

16-bit unsigned integer        

...

int   

...

uint32

...

32-bit unsigned integer

...

long   

...

uint64   

...

64-bit unsigned integer

...

BigInteger

...

union   

...

Choice of member types

...

Union  class will be generated

 }
}
Code Block
titleGenerated java files
File : Networks.java
package org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.ietfnetwork;

import java.util.BitSet;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.ietfnetwork.networks.Network;

/**
 * Abstraction of an entity which represents the functionality of networks.
 */
public interface Networks {

    /**
     * Identify the leaf of Networks.
     */
    public enum LeafIdentifier implements org.onosproject.yang.model.LeafIdentifier{
        /**
         * Represents id.
         */
        ID(1),
Example
Code Block
titleInput YANG file
leaf one {                         
    type string;
}

leaf two {              /**
         * Represents networkId.
         */
     type int32;
}

leaf-list three {
   NETWORKID(2);

        private int leafIndex;

        public int getLeafIndex() {
            typereturn booleanleafIndex;
}

leaf-list four {        }

        LeafIdentifier(int value) {
            this.leafIndex = value;
        }
    }

    type int16;
}
Code Block
titleGenerated Java file
private String one;

private int two;

private List<Boolean> three;

private List<Short> four;

Typedef

Overview

Typedef is user defined type for his implementation. It has the base type which is must for typedef. To give more information about the typedef there should be sub statements to describe it. Unit statement is optional for typedef which give info about the unit of the type. Default is like a value which will be assigned to the typedef if no value is given.default value should follow all restriction defined for the base-type.

Java mapping

For a given typedef node one class file will be generated which will have an attribute with the base type of typedef. There will be a constructor and a getter method, of method and implementation of hashcode, equals and toString methods.

Example
Code Block
titleInput YANG file
File : test.yang

module test {

    yang-version 1;
    namespace "http://huawei.com";
    prefix "test"/**
     * Returns the attribute id.
     *
     * @return id value of id
     */
    short id();

    typedef percent {/**
     * Returns the typeattribute uint8;networkId.
     *
     * description "Percentage";
    }
@return networkId value of networkId
    leaf completed {*/
    Object networkId();

   type percent;/**
     }
}
Code Block
titleGenerated Java file
File : Percent.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.test;

import java.util.Objects;
import com.google.common.base.MoreObjects;

public final class Percent {
* Returns the attribute valueLeafFlags.
     *
    private short uint8;

    private Percent() {
    }


* @return valueLeafFlags value of valueLeafFlags
     */
    publicBitSet Percent(short value) {valueLeafFlags();

    /**
     * Returns the this.uint8 = value;attribute network.
    }
 *
    public static* Percent@return of(shortnetwork value) of {network
     */
   return newNetwork Percentnetwork(value);

    }/**

    public short* uint8() {
  Sets the attribute id.
     *
 return uint8;
   * }

@param id value of @Overrideid
    public int hashCode() { */
    void    return Objects.hash(uint8id(short id);

    }/**

    @Override
 * Sets the publicattribute boolean equals(Object obj) {
  networkId.
     *
     * if@param (thisnetworkId ==value obj)of {networkId
     */
    void   return truenetworkId(Object networkId);

        }/**
     * Sets the if (obj instanceof Percent) {attribute network.
     *
     * @param Percentnetwork othervalue = (Percent) obj;of network
     */
       return Objects.equals(uint8, other.uint8void network(Network network);


        }/**
     * Checks if returnthe false;
leaf value is set.
 }

    @Override*
    public String* toString() {
        return MoreObjects.toStringHelper(getClass())@param leaf leaf whose value status needs to checked
     * @return result of leaf value  .add("uint8", uint8)set in object
     */
    boolean   .toString(isLeafValueSet(LeafIdentifier leaf);
}


File : Networks.java
package  }

    public static Percent fromString(String valInString) {
        try {org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.ietfnetwork.networks;

import java.util.BitSet;

/**
 * Abstraction of an entity which represents the functionality of network.
 */
public interface Network {

    /**
     * Identify the shortleaf tmpValof = Short.parseShort(valInString);Network.
     */
    public enum LeafIdentifier return of(tmpVal);
implements org.onosproject.yang.model.LeafIdentifier{
        /**
   } catch (Exception e) {
  * Represents networkId.
      }
   */
       return nullNETWORKID(1);

    }
}

Enumeration

Overview

Enum statement only can come when a leaf is of type enumeration. Each enum has one string then should be unique . The string must not be empty string and must not have white spaces. Enum can have sub statements, value statement will give the info about its value. If the enum statement in enumeration has no value statement then its value is considered as zero and subsequently incremented by one for next values.

Java mapping

For a given enumeration node one enum file will be generated which will have all the enum as its attributes. There will be a constructor and a getter method for the values.

Example
Code Block
titleInput YANG file
File: test.yang
module Test {

 private   yang-version 1int leafIndex;

    namespace "http://huawei.com";
    public int prefix Ant;
getLeafIndex() {
      description "Interval before a route is declaredreturn invalid"leafIndex;

     leaf  packetType {}

         type enumerationLeafIdentifier(int value) {
            this.leafIndex enum= "unbounded"value;
        }
    }

  enum ZERO;  /**
     * Returns the attribute networkId.
   enum  two;*
     * @return networkId value of networkId
    enum four;*/
    short networkId();

    }/**
     * Returns the attribute valueLeafFlags.
     *
    }
}
Code Block
titleGenerated Java files
File : PacketTypeEnum.java

package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.test;

public enum PacketTypeEnum {

    UNBOUNDED(0),

    ZERO(1), * @return valueLeafFlags value of valueLeafFlags
     */
    BitSet valueLeafFlags();

    TWO(2),

/**
    FOUR(3);

 * Sets the private int packetTypeEnum;

attribute networkId.
    PacketTypeEnum(int value) { *
     * @param networkId packetTypeEnumvalue =of value;networkId
    }

  */
  public static PacketTypeEnumvoid ofnetworkId(intshort value) {networkId);


    /**
    switch (value) {
      * Checks if the leaf value is set.
     *
 case 0:
   * @param leaf leaf whose value status needs to checked
    return PacketTypeEnum.UNBOUNDED;
* @return result of leaf value set in object
    case 1:*/
    boolean isLeafValueSet(LeafIdentifier leaf);
}


Identity

Overview

The identity is used to define a new globally unique, abstract, and untyped identity. Its only purpose is to denote its name, semantics, and existence. An identity can iether be defined from scratch or derived from a base identity. The base statement, which is optional, takes as an argument a string that is the name of an existing identity, from which the new identity is derived.

Java mapping

For a given identity one abstract class file will be generated.

Example
Code Block
titleinput YANG file
File : ietf-network.yang
module ietf-network {
    yang-version 1;
     return PacketTypeEnum.ZEROnamespace "urn:ietf:params:xml:ns:yang:ietf-network";
    prefix nd;

    identity tunnel-type {
 case 2:
    description  "Base identity from which specific tunnel types are derived.";
    }

}
Code Block
titleGenerated java files
File  return PacketTypeEnum.TWO;
            case 3:: TunnelType.java

package org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.ietfnetwork;
/**
 * Represents the implementation of tunnelType.
 */
public abstract class TunnelType {

    /**
     * Returns the attribute tunnel-type.
     *
  return PacketTypeEnum.FOUR;
  * @return tunnel-type value of tunnel-type
     default :*/
    public static String tunnelTypeToString() {
        return "tunnel-type";
   return null;}

    /**
     * Returns the object of }
tunnelType fromString input String }

tunnelType.
    public int*
 packetTypeEnum() {
   * @param valInString value of input String
    return packetTypeEnum;
 * @return tunnelType
     }*/

    public static PacketTypeEnumClass fromString(String valInString) {
        if (valInString.equals("tunnel-type")) {
  try {
         return TunnelType.class;
      int tmpVal = Integer.parseInt(valInString); }
        throw new IllegalArgumentException("not a valid input  element");
    }
}

Identityref

Overview

The identityref type is used to reference an existing identity. Base statement, which is a substatement to the type statement,  must be present if the type is identityref. The base under identityref must refer to existing identity.

If identityref comes under grouping and typedef, it will be resolved where it is used. It will not be resolved where it is defined.

Java mapping

The leaf or leaf-list with type identityref, will referred to identity, during java file generation.

Example
Code Block
titleinput YANG file
File : ietf-network.yang
module ietf-network { return of(tmpVal);
    yang-version 1;
    namespace "urn:ietf:params:xml:ns:yang:ietf-network";
  } catch (Exception e) {prefix nd;

    identity    }tunnel-type {
      description  return null;
    }
}

Union

Overview

Union is a built in type which represents its member types. Union can have multiple member types. To use union there must be a type statement. Except empty and leafref all types can come under union.

When a value comes for union , which can match to multiple member types of union, then in that case to whichever type value matches from the member types defined in union value, will be taken from union as the values type.

Java mapping

For a given union node one class file will be generated which will have all the an attribute with the type union is having. There will be a constructor , getter method, of method, fromString, HashCode, equals and ToString methods for the values.

Example
Code Block
titleInput YANG file
File : test.yang
module test {
    yang-version 1;
    namespace "http://huawei.com"Base identity from which specific tunnel types are derived.";
    }

    container network-id {
        description "Serves as top-level container for a list of networks.";
    prefix "test";

    typedef ip-addressleaf leaf-network-id {
            type unionidentityref {
              type int32  base tunnel-type;
            type uint32;}
        }
    }

}
Code Block
titleGenerated java files
File : IpAddressUnionTunnelType.java

package org.onosproject.yang.gen.v1.httpurn.huaweiietf.comparams.rev20160526xml.test.ipaddress;

import java.util.Objects;
import com.google.common.base.MoreObjects;

public final class IpAddressUnion {

    private int int32;
    private long uint32;

    private IpAddressUnion() {
    }

    public IpAddressUnion(int value) {
        this.int32 = value;
    }ns.yang.ietf.network.ietfnetwork;
/**
 * Represents the implementation of tunnelType.
 */
public abstract class TunnelType {

    public IpAddressUnion(long value) {
        this.uint32 = value;
    }
/**
     * Returns the attribute tunnel-type.
     *
    public static* IpAddressUnion of(int@return tunnel-type value) { of tunnel-type
        return new IpAddressUnion(value);
 */
   }

    public static IpAddressUnionString oftunnelTypeToString(long value) {
        return new IpAddressUnion(value)"tunnel-type";
    }

    public int int32() {/**
     * Returns the returnobject int32;
of tunnelType fromString input }

    public long uint32() {String tunnelType.
        return uint32;*
    }

 * @param valInString @Override
value of   public int hashCode() {input String
     *   return Objects.hash(int32, uint32);
    }

@return tunnelType
     @Override*/
    public booleanstatic Class equalsfromString(ObjectString objvalInString) {
        if (this == objvalInString.equals("tunnel-type")) {
            return trueTunnelType.class;
        }
        throw ifnew (obj instanceof IpAddressUnion) {
            IpAddressUnion other = (IpAddressUnion) obj;
      IllegalArgumentException("not a valid input element");
    }
}
 
File : NetworkId.java

package org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.ietfnetwork;

import java.util.BitSet;

/**
 * Abstraction of an entity which represents the functionality of networkId.
 */
public interface NetworkId {

    /**
     * return
Identify the leaf of NetworkId.
     */
    public enum LeafIdentifier implements Objects.equals(int32, other.int32) &&org.onosproject.yang.model.LeafIdentifier{
        /**
          Objects.equals(uint32, other.uint32);* Represents leafNetworkId.
        }
 */
        LEAFNETWORKID(1);

     return false;
  private int }leafIndex;

    @Override
    public Stringint toStringgetLeafIndex() {
        return MoreObjects.toStringHelper(getClass())
   return leafIndex;
        .omitNullValues()}

            .add("int32", int32)LeafIdentifier(int value) {
            .add("uint32", uint32)this.leafIndex = value;
        }
    .toString();}

    }

    public static IpAddressUnion fromString(String valInString) {/**
     * Returns the attribute leafNetworkId.
     *
     * @return leafNetworkId value tryof {leafNetworkId
     */
    Class<? intextends tmpVal = Integer.parseInt(valInStringTunnelType> leafNetworkId();

    /**
     * return of(tmpVal);Returns the attribute valueLeafFlags.
     *
   } catch (Exception* e)@return {
valueLeafFlags value of valueLeafFlags
     }*/
    BitSet valueLeafFlags();

   try {/**
     * Sets the attribute leafNetworkId.
 long  tmpVal = Long.parseLong(valInString); *
     * @param leafNetworkId value of leafNetworkId
    return of(tmpVal); */
    void leafNetworkId(Class<? extends  } catch (Exception e) {TunnelType> leafNetworkId);


    /**
     * Checks if }
the leaf value is set.
    return null;*
   }
}
Code Block
titleGenerated Java files
File : * @param leaf leaf whose value status needs to checked
     * @return result of leaf value set in object
     */
    boolean isLeafValueSet(LeafIdentifier leaf);
}



Bits

Overview

The bits built-in type represents a bit set.  That is, a bits value is a set of flags identified by small integer position numbers starting at 0.

The "bit" statement, which is a substatement to the "type" statement, MUST be present if the type is "bits". It is repeatedly used to specify each assigned named bit of a bits type. It takes as an argument a string that is the assigned name of the bit. All assigned names in a bits type MUST be unique.

The "position" statement, which is optional, takes as an argument a non-negative integer value that specifies the bit's position.

Java mapping

Container BitSet is used to store bits during code generation.

Example 
Code Block
titleinput YANG file
File : test.yang
module Test {
    yang-version 1;
    namespace http://huawei.com;
    prefix Ant;
    typedef MyBits {
        type bits {
             bit disable-nagleFlowClassifierService.java
package org.onosproject.yang.gen.v1.sfc.flowclassifier.rev20160524;

import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20100924.ietfyangtypes.Uuid;

public interface FlowClassifierService {

    Uuid getId();

    void setId(Uuid id);
}

File : FlowClassifierManager.java
package org.onosproject.yang.gen.v1.sfc.flowclassifier.rev20160524;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20100924.ietfyangtypes.Uuid;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;

@Component (immediate = true)
@Service
public class FlowClassifierManager implements FlowClassifierService {

    private final Logger log = getLogger(getClass());

    @Activate
    public void activate() {
        //TODO: YANG utils generated code
         position 0;
         log.info("Started");
    }

        @Deactivate
    public void deactivate()bit auto-sense-speed {
        //TODO: YANG utils generated code
        log.info("Stopped")position 1;
    }

     @Override
    public}
 Uuid getId() {
        //TODO: YANG utilsbit generatedMb-only code{
         return null;
    }

   position @Override2;
    public   void setId(Uuid id) {
   }
     //TODO: YANG utils generated code}
    }

}

 

Code Block
titlebits generated enum


File : IetfYangTypesServiceBits.java

package org.onosproject.yang.gen.v1.urnhttp.ietfhuawei.paramscom.xml.ns.yang.ietf.yang.types.rev20100924;

public interface IetfYangTypesService {
}

File : IetfYangTypesManager.java
package org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20100924;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;

@Component (immediate = true)
@Service
public class IetfYangTypesManager implements IetfYangTypesService {

    private final Logger log = getLogger(getClass()test.mybits;

import java.util.BitSet;
import java.util.regex.Pattern;

/**
 * Represents ENUM data of bits.
 */
public enum Bits {

    /**
     * Represents disable-nagle.
     */
    DISABLE_NAGLE(0, "disable-nagle"),

    /**
     * Represents auto-sense-speed.
     */
    AUTO_SENSE_SPEED(1, "auto-sense-speed"),

    /**
     * Represents mb-only.
     */
    MB_ONLY(2, "Mb-only");

    @Activate
    public void activate() {private int bits;
    private String schemaName;

    /**
     * Creates  //TODO: YANG utils generated code
  an instance of bits.
     *
      log.info("Started");
    }

* @param bits value of bits
     @Deactivate*/
    public void deactivate( Bits(int bits, String schemaName) {
        //TODO: YANG utils generated code
this.bits = bits;
        this.schemaName  log.info("Stopped")= schemaName;
    }
}

File : Uuid.java
package org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20100924.ietfyangtypes;
import java.util.Objects;
import com.google.common.base.MoreObjects;

public final class Uuid {
    private String string;
 /**
     * Returns the object of bits for.
    private Uuid() {*
    }

 * @param value publicvalue Uuid(String value) {of bits for
     * @return bits this.stringfor
 = value;
    }
*/
    public static UuidBits of(Stringint value) {
        returnswitch new Uuid(value); {
    }

        case 0:
     public String string() {
        return stringBits.DISABLE_NAGLE;
    }

    @Override
    public int hashCode() {case 1:
        return Objects.hash(string);
    }

    @Override
    public boolean equals(Object obj) {
return Bits.AUTO_SENSE_SPEED;
            case if2:
 (this == obj) {
            return trueBits.MB_ONLY;
        }
    default :
   if (obj instanceof Uuid) {
         throw new IllegalArgumentException("not Uuida othervalid =input (Uuidelement") obj;
        }
    return}
    /**
     * Returns the object of bits for.
  Objects.equals(string, other.string);
  *
     * }
@param value value of bits for
   return false;
 * @return bits }for

     @Override*/
    public static Bits of(String toString(value) {
        returnswitch MoreObjects.toStringHelper(getClass(value)) {
            case .add("string", string)
"disable-nagle":
                return .toString()Bits.DISABLE_NAGLE;
    }

        case "auto-sense-speed":
    public static Uuid fromString(String valInString) {
        try {
return Bits.AUTO_SENSE_SPEED;
             String tmpVal = (valInString);
case "Mb-only":
                return of(tmpVal)Bits.MB_ONLY;
         } catch (Exception e)default {:
        }
        throw new IllegalArgumentException("not a valid returninput nullelement");
    }
}

Leafref

Overview

The leafref type is used to reference a particular leaf instance in the data tree. Path statement must be present for leafref type. The path under leafref must refer to existing leaf or leaf-list. The leaf or leaf-list with leafref will use the instance of the referred leaf or leaf-list.

If leafref comes under grouping and typedef, it will be resolved where it is used. It will not be resolved where it is defined.

 

Java mapping

The leaf or leaf-list with type leafref, will copy the type of referred leaf or leaf-list, during java file generation.

Example
Code Block
titleinput YANG file
File : ietf-network.yang
module ietf-network {
    yang-version 1;    }
    }
    /**
     * Returns the attribute bits.
    namespace "urn:ietf:params:xml:ns:yang:ietf-network";
    prefix nd;
 *
     * @return bits value of bits
     */
    container networkspublic int bits() {
        return bits;
    description}

    /**
     * Returns  "Serves as top-level container for a list of
    the object of bits fromString input String bits.
     *
     * @param valInString value of input String
     * @return bits
     */
    public static BitSet fromString(String  networks.";valInString) {
        leaf network-id {BitSet tmpVal = new BitSet();
        String[] bitNames =  type uint8valInString.trim().split(Pattern.quote(" "));
        for (String bitName : bitNames) description{
            "Identifies a network."Bits bits = of(bitName);
        }
    }
if (bits !=  container network-id null) {
        description
            "Serves as top-level container for a list oftmpVal.set(bits.bits());
            networks.";}
        leaf network-id {}
        if    type leafref (tmpVal.isEmpty()) {
            throw new IllegalArgumentException("not a valid pathinput "/nd:networks/nd:network-id"element");
        }
    }
        }return tmpVal;
    }
}
Code Block
titleGenerated java files
File : Networks.java
public interface Networkspublic {static 
String    short networkId(); toString(BitSet bits) {
    interface NetworksBuilder { 
 StringBuilder sBuild =     short networkId(new StringBuilder("");
        NetworksBuilder networkId(short networkId); 
 if (bits.get(Bits.DISABLE_NAGLE.bits())) {
           Networks build(sBuild.append("disable-nagle");
    }
}

File : NetworkId.java
public interface NetworkId { 
    short networkRef(sBuild.append(" ");
 
    interface NetworkIdBuilder { }
        short networkRef();
        NetworkIdBuilder networkRef(short networkRef); 
  if (bits.get(Bits.AUTO_SENSE_SPEED.bits())) {
      NetworkId build();
    }
} 

Identity

Overview

The identity is used to define a new globally unique, abstract, and untyped identity. Its only purpose is to denote its name, semantics, and existence. An identity can iether be defined from scratch or derived from a base identity. The base statement, which is optional, takes as an argument a string that is the name of an existing identity, from which the new identity is derived.

Java mapping

For a given identity one abstract class file will be generated.

Example
Code Block
titleinput YANG file
File : ietf-network.yang
module ietf-network {
    yang-version 1;
    namespace "urn:ietf:params:xml:ns:yang:ietf-network" sBuild.append("auto-sense-speed");
            sBuild.append(" ");
        }
        if (bits.get(Bits.MB_ONLY.bits())) {
            sBuild.append("Mb-only");
    prefix nd;
        sBuild.append(" ");
        }
    identity tunnel-type {
  return sBuild.toString();
   description  "Base identity from which specific tunnel types are derived.";
    }

}
Code Block
titleGenerated java files
File : TunnelType.java
public abstract class TunnelType {
}

Identityref

Overview

The identityref type is used to reference an existing identity. Base statement, which is a substatement to the type statement,  must be present if the type is identityref. The base under identityref must refer to existing identity.

If identityref comes under grouping and typedef, it will be resolved where it is used. It will not be resolved where it is defined.

Java mapping

The leaf or leaf-list with type identityref, will referred to identity, during java file generation.

Example
Code Block
titleinput YANG file
File : ietf-network.yang
module ietf-network {
    yang-version 1;
    namespace "urn:ietf:params:xml:ns:yang:ietf-network";
    prefix nd;

    identity tunnel-type {
      description  "Base identity from which specific tunnel types are derived.";
    }

    container network-id {
        description "Serves as top-level container for a list of networks.";
        leaf leaf-network-id {
            type identityref {
                base tunnel-type;
            }
        }
    }

}
Code Block
titleGenerated java files
File : TunnelType.java
public abstract class TunnelType {
}
 
File : NetworkId.java
public interface NetworkId { 
    TunnelType leafNetworkId(); 
    interface NetworkIdBuilder { 
        TunnelType leafNetworkId(); 
        NetworkIdBuilder leafNetworkId(TunnelType leafNetworkId);  }
}
 
 
File: MyBits.java

package org.onosproject.yang.gen.v1.http.huawei.com.test;

import java.util.BitSet;
import org.onosproject.yang.gen.v1.http.huawei.com.test.mybits.Bits;
import java.util.Objects;

/**
 * Represents the implementation of myBits.
 */
public final class MyBits {

    private BitSet bits;

    /**
     * Creates an instance of myBits.
     */
    private MyBits() {
    }

    /**
     * Creates an instance of bits.
     *
     * @param bits value of bits
     */
    public MyBits(BitSet bits) {
        this.bits = bits;
    }

    /**
     * Returns the object of myBits for type bits.
     *
     * @param value value of myBits for type bits
     * @return myBits for type bits
     */
    public static MyBits of(BitSet value) {
        return new MyBits(value);
    }

    /**
     * Returns the attribute bits.
     *
     * @return bits value of bits
     */
    public BitSet bits() {
        NetworkIdreturn build()bits;
    }

 

Bits

Overview

The bits built-in type represents a bit set.  That is, a bits value is a set of flags identified by small integer position numbers starting at 0.

The "bit" statement, which is a substatement to the "type" statement, MUST be present if the type is "bits". It is repeatedly used to specify each assigned named bit of a bits type. It takes as an argument a string that is the assigned name of the bit. All assigned names in a bits type MUST be unique.

The "position" statement, which is optional, takes as an argument a non-negative integer value that specifies the bit's position.

Java mapping

Container BitSet is used to store bits during code generation.

Example 
Code Block
titleinput YANG file
File : test.yang
module Test {
    yang-version 1;
    namespace http://huawei.com;
    prefix Ant;
    typedef MyBits {
    /**
     * Sets the attribute bits.
     *
     * @param bits value of bits
     */
    public void bits(BitSet bits) {
        this.bits = bits;
    }

    @Override
    public int hashCode() {
        return Objects.hash(bits);
    }

    @Override
    public boolean equals(Object obj) {
        if type bits(this == obj) {
             bit disable-naglereturn true;
        }
        if (obj instanceof MyBits) {
            MyBits other =   position 0(MyBits) obj;
            return
 }
              bit auto-sense-speed { Objects.equals(bits, other.bits);
        }
        return position 1false;
    }

    @Override
     }
public String toString() {
        return Bits.toString(bits);
    }
  bit Mb-only { /**
     * Returns the object of myBits fromString input String myBits.
   position  2;*
     * @param valInString value of input String
  }
   * @return myBits
    } */
    }
}

 

Code Block
titleGenerated java files
File: MyBits.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160718.test;
import java.util.BitSet;
import java.util.Objects;
import com.google.common.base.MoreObjects;
/**
 * Represents the implementation of myBits.
 */
public final class MyBits {
    private BitSet bitspublic static MyBits fromString(String valInString) {
        try {
            BitSet tmpVal = Bits.fromString(valInString);
    /**
     * Creates an instancereturn of myBits.(tmpVal);
     */
   } privatecatch MyBits(Exception e) {
    }
    /**
    throw * Creates an instance of myBitsForTypeBits.new IllegalArgumentException("not a valid input element");
     *
   }
  * @param value value of myBitsForTypeBits
     */
    public MyBits(BitSet value) {
        this.bits = value;
    }
    /** }
}
 



Binary

Overview

The binary built-in type represents any binary data, i.e., a sequence of octets.

A binary can be restricted with the "length" statement. The length of a binary value is the number of octets it contains.

Binary values are encoded with the base64 encoding scheme.

Java mapping

Byte array is used to store decoded binary during code generation.

Example
Code Block
titleinput YANG file
File : test.yang
module Test {
   yang-version 1;
   namespace http://huawei.com;
   prefix Ant;

   typedef MyBinary {
      type binary {
     * Returns the object of myBitsForTypeBits.
length "4";
      *}
   }
}

 

Code Block
titleGenerated java files
File:  * @param value value of myBitsForTypeBits
     * @return Object of myBitsForTypeBits
     */
    public static MyBits of(BitSetMyBinary.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160718.test;
import java.util.Objects;
import com.google.common.base.MoreObjects;
import java.util.Base64;

public final class MyBinary {
   private byte[] binary;
   private MyBinary() {
   }

   public MyBinary(byte[] value) {
      this.binary = return new MyBits(value);
    }
    /**
   public static * Returns the attribute bits.MyBinary of(byte[] value) {
     *
 return    * @return value of bitsnew MyBinary(value);
   }
  */
    public BitSetbyte[] bitsbinary() {
        return bitsbinary;
    }
 
   @Override
    public int hashCode() {
        return Objects.hash(bitsbinary);
    }
 
   @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof MyBitsMyBinary) {
            MyBitsMyBinary other = (MyBitsMyBinary) obj;
            return
                 Objects.equals(bitsbinary, other.bitsbinary);
        }
        return false;
    }
 
   @Override
    public String toString() {
        return bits.toString(Base64.getEncoder().encodeToString(binary);
    }
    /**
     * Returns the object of myBits fromString input String.
     *
     * @param valInString input String
     * @return Object of myBits
     */
    public static MyBitsMyBinary fromString(String valInString) {
        try {
            BitSetbyte[] tmpVal = new BitSet(Base64.getDecoder().decode(valInString);
         return of(tmpVal);
  valInString = valInString.replace('{', ' ');
} catch (Exception e) {
      }
  valInString = valInString.replace('}', ' ');
            valInString = valInString.trim();
            String[] bitsTemp = valInString.split(",", 0);
            for (String bitTemp : bitsTemp) {
                bitTemp = bitTemp.trim();
                tmpVal.set(Integer.parseInt(bitTemp));
            }
            return of(tmpVal);
        } catch (Exception e) {
        }
        return null;
    }
}

 

Binary

Overview

The binary built-in type represents any binary data, i.e., a sequence of octets.

A binary can be restricted with the "length" statement. The length of a binary value is the number of octets it contains.

Binary values are encoded with the base64 encoding scheme.

Java mapping
    return null;
   }
}


Decimal64

Overview

The decimal64 type represents a subset of the real numbers, which can be represented by decimal numerals.

A decimal64 type can be restricted with the "range" statement.

The "fraction-digits" statement, which is a substatement to the "type" statement, MUST be present if the type is "decimal64".  It takes as an argument an integer between 1 and 18, inclusively. It controls the size of the minimum difference between values of a decimal64 type.

The Minimum and Maximum decimal64 value table for each fraction-digit value.

fraction-digitsminmax
1-922337203685477580.8922337203685477580.7
2-92233720368547758.0892233720368547758.07
3-9223372036854775.8089223372036854775.807
4-922337203685477.5808922337203685477.5807
5-92233720368547.7580892233720368547.75807
6-9223372036854.7758089223372036854.775807
7-922337203685.4775808922337203685.4775807
8-92233720368.5477580892233720368.54775807
9-9223372036.8547758089223372036.854775807
10-922337203.6854775808922337203.6854775807
11-92233720.3685477580892233720.36854775807
12-9223372.0368547758089223372.036854775807
13-922337.2036854775808922337.2036854775807
14-92233.7203685477580892233.72036854775807
15-9223.3720368547758089223.372036854775807
16-922.3372036854775808922.3372036854775807
17-92.2337203685477580892.23372036854775807
18-9.2233720368547758089.223372036854775807
Java mapping

BigDecimal is used to store decimal64 value Byte array is used to store decoded binary during code generation.

Example


Code Block
titleinput YANG file
File : test.yang
module Test {
    yang-version

...

 1;
    namespace http://huawei.com;
    prefix Ant;

    typedef MyDecimal {
        type decimal64 {
   

...

 

...

   

...

 

...

   

...

 

...

fraction-digits 2;
       

...

 

...

 

...

   range "1 .. 3.14 | 10 

...

| 20..max"

...

;
        }
    }
}

 

Code Block
titleGenerated java files
File: 

...

MyDecimal.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160718.test;
import java.math.BigDecimal;
import java.util.Objects;
import com.google.common.base.MoreObjects

...

;

public final class MyDecimal {
    private 

...

BigDecimal decimal64;

   

...

 

...

private 

...

MyDecimal() {
   

...

 

...

}

 

...

 

...

 

...

 

...

public MyDecimal(BigDecimal value) {
   

...

 

...

 

...

 

...

 

...

 

...

this.decimal64 = value;
 

...

 

...

 

...

 

...

}

   

...

 

...

public static 

...

MyDecimal of(

...

BigDecimal value) {
        return new 

...

MyDecimal(value);
    }

...


   

...

 

...

public BigDecimal decimal64() {
        return 

...

decimal64;
    }

 

...

   @Override
    public int hashCode() {
        return Objects.hash(

...

decimal64);
    }

 

...

   @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof 

...

MyDecimal) {
          

...

  MyDecimal other = (

...

MyDecimal) obj;
            return
                 Objects.equals(

...

decimal64, other.

...

decimal64);
        }
        return false;
    }

 

...

   @Override
    public String toString() {
        return 

...

MoreObjects.

...

toStringHelper(getClass()

...

)

...


   

...

 

...

   

...

   

...

 

...

 .add("decimal64", decimal64)
        

...

   

...

 .toString();
   

...

 }

   

...

 

...

public static 

...

MyDecimal fromString(String valInString) {
        try {
           

...

 BigDecimal tmpVal = 

...

new BigDecimal(valInString);
            return of(tmpVal);
        } catch (Exception e) {
        }
        return null;
    }
}
 

Unknown Statement

Overview
If a YANG compiler does not support a particular extension, which appears in a YANG module as an unknown-statement, 
the entire unknown-statement is ignored by the onos-yang-tools and it is logged.

Golden Eye Demo 

Link:   https://www.youtube.com/watch?v=ipbu0x0LcDk  

Presentation: YANG Demo.pptx

Note :

In case of typedef or identity when both have same name, But follow different typographical conventions is supported in compilation (It is limited to only one pair of identity and typedef naming conflict), other then that any name conflict is not supported as of now.

References

RFC6020 - https://tools.ietf.org/html/rfc6020