module ietf-yang-library {
    namespace "urn:ietf:params:xml:ns:yang:ietf-yang-library";
    prefix "yanglib";

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

    organization
      "IETF NETCONF (Network Configuration) Working Group";

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

       WG Chair: Mehmet Ersue
                 <mailto:mehmet.ersue@nsn.com>

       WG Chair: Mahesh Jethanandani
                 <mailto:mjethanandani@gmail.com>

       Editor:   Andy Bierman
                 <mailto:andy@yumaworks.com>

       Editor:   Martin Bjorklund
                 <mailto:mbj@tail-f.com>

       Editor:   Kent Watsen
                 <mailto:kwatsen@juniper.net>";

    description
      "This module contains monitoring information about the YANG
       modules and submodules that are used within a YANG-based
       server.

       Copyright (c) 2016 IETF Trust and the persons identified as
       authors of the code.  All rights reserved.

       Redistribution and use in source and binary forms, with or
       without modification, is permitted pursuant to, and subject
       to the license terms contained in, the Simplified BSD License
       set forth in Section 4.c of the IETF Trust's Legal Provisions
       Relating to IETF Documents
       (http://trustee.ietf.org/license-info).

       This version of this YANG module is part of RFC XXXX; see
       the RFC itself for full legal notices.";

    // RFC Ed.: replace XXXX with actual RFC number and remove this
    // note.

    // RFC Ed.: remove this note
    // Note: extracted from draft-ietf-netconf-yang-library-06.txt

    // RFC Ed.: update the date below with the date of RFC publication
    // and remove this note.
    revision 2016-04-09 {
      description
        "Initial revision.";
      reference
        "RFC XXXX: YANG Module Library.";
    }

    /*
     * Typedefs
     */

    // FIXME inline this union after https://bugs.opendaylight.org/show_bug.cgi?id=5826 is fixed
    typedef optional-revision {
      type union {
        type revision-identifier;
        type string { length 0; }
      }
      description
        "The YANG module or submodule revision date.
         A zero-length string is used if no revision statement
         is present in the YANG module or submodule.";
    }

    typedef revision-identifier {
      type string {
        pattern '\d{4}-\d{2}-\d{2}';
      }
      description
        "Represents a specific date in YYYY-MM-DD format.";
    }

    /*
     * Groupings
     */

    grouping module-list {
      description
        "The module data structure is represented as a grouping
         so it can be reused in configuration or another monitoring
         data structure.";

      grouping common-leafs {
        description
          "Common parameters for YANG modules and submodules.";

        leaf name {
          type yang:yang-identifier;
          description
            "The YANG module or submodule name.";
        }
        leaf revision {
          type optional-revision;
        }
      }

      grouping schema-leaf {
        description
          "Common schema leaf parameter for modules and submodules.";

        leaf schema {
          type inet:uri;
          description
            "Contains a URL that represents the YANG schema
             resource for this module or submodule.

             This leaf will only be present if there is a URL
             available for retrieval of the schema for this entry.";
        }
      }

      list module {
        key "name revision";
        description
          "Each entry represents one revision of one module
           currently supported by the server.";

        uses common-leafs;
        uses schema-leaf;

        leaf namespace {
          type inet:uri;
          mandatory true;
          description
            "The XML namespace identifier for this module.";
        }
        leaf-list feature {
          type yang:yang-identifier;
          description
            "List of YANG feature names from this module that are
             supported by the server, regardless whether they are
             defined in the module or any included submodule.";
        }
        list deviation {
          key "name revision";
          description
            "List of YANG deviation module names and revisions
             used by this server to modify the conformance of
             the module associated with this entry.  Note that
             the same module can be used for deviations for
             multiple modules, so the same entry MAY appear
             within multiple 'module' entries.

             The deviation module MUST be present in the 'module'
             list, with the same name and revision values.
             The 'conformance-type' value will be 'implement' for
             the deviation module.";
          uses common-leafs;
        }
        leaf conformance-type {
          type enumeration {
            enum implement {
              description
                "Indicates that the server implements one or more
                 protocol-accessible objects defined in the YANG module
                 identified in this entry.  This includes deviation
                 statements defined in the module.

                 For YANG version 1.1 modules, there is at most one
                 module entry with conformance type 'implement' for a
                 particular module name, since YANG 1.1 requires that
                 at most one revision of a module is implemented.

                 For YANG version 1 modules, there SHOULD NOT be more
                 than one module entry for a particular module name.";
            }
            enum import {
              description
                "Indicates that the server imports reusable definitions
                 from the specified revision of the module, but does
                 not implement any protocol accessible objects from
                 this revision.

                 Multiple module entries for the same module name MAY
                 exist. This can occur if multiple modules import the
                 same module, but specify different revision-dates in
                 the import statements.";
            }
          }
          mandatory true;
          description
            "Indicates the type of conformance the server is claiming
             for the YANG module identified by this entry.";
        }
        container submodules {
          description
            "Contains information about all the submodules used
             by the parent module entry";

          list submodule {
            key "name revision";
            description
              "Each entry represents one submodule within the
               parent module.";
            uses common-leafs;
            uses schema-leaf;
          }
        }
      }
    }

    /*
     * Operational state data nodes
     */

    container modules-state {
      config false;
      description
        "Contains YANG module monitoring information.";

      leaf module-set-id {
        type string;
        mandatory true;
        description
          "Contains a server-specific identifier representing
           the current set of modules and submodules.  The
           server MUST change the value of this leaf if the
           information represented by the 'module' list instances
           has changed.";
      }

      uses module-list;
    }

    /*
     * Notifications
     */

    notification yang-library-change {
      description
       "Generated when the set of modules and submodules supported
        by the server has changed.";
      leaf module-set-id {
        type leafref {
          path "/yanglib:modules-state/yanglib:module-set-id";
        }
        mandatory true;
        description
          "Contains the module-set-id value representing the
           set of modules and submodules supported at the server at
           the time the notification is generated.";
      }
    }

}