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

     import ietf-yang-types {
       prefix yang;
       reference
         "RFC 6991: Common YANG Data Types";
     }
     import ietf-inet-types {
       prefix inet;
       reference
         "RFC 6991: Common YANG Data Types";
     }
     import ietf-datastores {
       prefix ds;
       reference
         "RFC 8342: Network Management Datastore Architecture
                    (NMDA)";
     }

     organization
       "IETF NETCONF (Network Configuration) Working Group";
     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netconf/>
        WG List:  <mailto:netconf@ietf.org>

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

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

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

        Author:   Kent Watsen
                  <mailto:kent+ietf@watsen.net>

        Author:   Robert Wilton
                  <mailto:rwilton@cisco.com>";
     description
       "This module provides information about the YANG modules,
        datastores, and datastore schemas used by a network
        management server.

        The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
        NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
        'MAY', and 'OPTIONAL' in this document are to be interpreted as
        described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
        they appear in all capitals, as shown here.

        Copyright (c) 2019 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
        (https://trustee.ietf.org/license-info).

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

     revision 2019-01-04 {
       description
         "Added support for multiple datastores according to the
          Network Management Datastore Architecture (NMDA).";
       reference
         "RFC 8525: YANG Library";
     }
     revision 2016-04-09 {
       description
         "Initial revision.";
       reference
         "RFC 7895: YANG Module Library";
     }

     /*
      * Typedefs
      */

     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-identification-leafs {
       description
         "Parameters for identifying YANG modules and submodules.";
       leaf name {
         type yang:yang-identifier;
         mandatory true;
         description
           "The YANG module or submodule name.";
       }
       leaf revision {
         type revision-identifier;
         description
           "The YANG module or submodule revision date.  If no revision
            statement is present in the YANG module or submodule, this
            leaf is not instantiated.";
       }
     }

     grouping location-leaf-list {
       description
         "Common leaf-list parameter for the locations of modules and
          submodules.";
       leaf-list location {
         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.";
       }
     }

     grouping module-implementation-parameters {
       description
         "Parameters for describing the implementation of a module.";
       leaf-list feature {
         type yang:yang-identifier;
         description
           "List of all YANG feature names from this module that are
            supported by the server, regardless whether they are defined
            in the module or any included submodule.";
       }
       leaf-list deviation {
         type leafref {
           path "../../module/name";
         }
         description
           "List of all YANG deviation modules 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.

            This reference MUST NOT (directly or indirectly)
            refer to the module being deviated.

            Robust clients may want to make sure that they handle a
            situation where a module deviates itself (directly or
            indirectly) gracefully.";
       }
     }

     grouping module-set-parameters {
       description
         "A set of parameters that describe a module set.";
       leaf name {
         type string;
         description
           "An arbitrary name of the module set.";
       }
       list module {
         key "name";
         description
           "An entry in this list represents a module implemented by the
            server, as per Section 5.6.5 of RFC 7950, with a particular
            set of supported features and deviations.";
         reference
           "RFC 7950: The YANG 1.1 Data Modeling Language";
         uses module-identification-leafs;
         leaf namespace {
           type inet:uri;
           mandatory true;
           description
             "The XML namespace identifier for this module.";
         }
         uses location-leaf-list;
         list submodule {
           key "name";
           description
             "Each entry represents one submodule within the
              parent module.";
           uses module-identification-leafs;
           uses location-leaf-list;
         }
         uses module-implementation-parameters;
       }
       list import-only-module {
         key "name revision";
         description
           "An entry in this list 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 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.";
         leaf name {
           type yang:yang-identifier;
           description
             "The YANG module name.";
         }
         leaf revision {
           type union {
             type revision-identifier;
             type string {
               length "0";
             }
           }
           description
             "The YANG module revision date.
              A zero-length string is used if no revision statement
              is present in the YANG module.";
         }
         leaf namespace {
           type inet:uri;
           mandatory true;
           description
             "The XML namespace identifier for this module.";
         }
         uses location-leaf-list;
         list submodule {
           key "name";
           description
             "Each entry represents one submodule within the
              parent module.";
           uses module-identification-leafs;
           uses location-leaf-list;
         }
       }
     }

     grouping yang-library-parameters {
       description
         "The YANG library data structure is represented as a grouping
          so it can be reused in configuration or another monitoring
          data structure.";
       list module-set {
         key "name";
         description
           "A set of modules that may be used by one or more schemas.

            A module set does not have to be referentially complete,
            i.e., it may define modules that contain import statements
            for other modules not included in the module set.";
         uses module-set-parameters;
       }
       list schema {
         key "name";
         description
           "A datastore schema that may be used by one or more
            datastores.

            The schema must be valid and referentially complete, i.e.,
            it must contain modules to satisfy all used import
            statements for all modules specified in the schema.";
         leaf name {
           type string;
           description
             "An arbitrary name of the schema.";
         }
         leaf-list module-set {
           type leafref {
             path "../../module-set/name";
           }
           description
             "A set of module-sets that are included in this schema.
              If a non-import-only module appears in multiple module
              sets, then the module revision and the associated features
              and deviations must be identical.";
         }
       }
       list datastore {
         key "name";
         description
           "A datastore supported by this server.

            Each datastore indicates which schema it supports.

            The server MUST instantiate one entry in this list per
            specific datastore it supports.
            Each datastore entry with the same datastore schema SHOULD
            reference the same schema.";
         leaf name {
           type ds:datastore-ref;
           description
             "The identity of the datastore.";
         }
         leaf schema {
           type leafref {
             path "../../schema/name";
           }
           mandatory true;
           description
             "A reference to the schema supported by this datastore.
              All non-import-only modules of the schema are implemented
              with their associated features and deviations.";
         }
       }
     }

     /*
      * Top-level container
      */

     container yang-library {
       config false;
       description
         "Container holding the entire YANG library of this server.";
       uses yang-library-parameters;
       leaf content-id {
         type string;
         mandatory true;
         description
           "A server-generated identifier of the contents of the
            '/yang-library' tree.  The server MUST change the value of
            this leaf if the information represented by the
            '/yang-library' tree, except '/yang-library/content-id', has
            changed.";
       }
     }

     /*
      * Notifications
      */

     notification yang-library-update {
       description
         "Generated when any YANG library information on the
          server has changed.";
       leaf content-id {
         type leafref {
           path "/yanglib:yang-library/yanglib:content-id";
         }
         mandatory true;
         description
           "Contains the YANG library content identifier for the updated
            YANG library at the time the notification is generated.";
       }
     }

     /*
      * Legacy groupings
      */

     grouping module-list {
       status deprecated;
       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 {
         status deprecated;
         description
           "Common parameters for YANG modules and submodules.";
         leaf name {
           type yang:yang-identifier;
           status deprecated;
           description
             "The YANG module or submodule name.";
         }
         leaf revision {
           type union {
             type revision-identifier;
             type string {
               length "0";
             }
           }
           status deprecated;
           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.";
         }
       }

       grouping schema-leaf {
         status deprecated;
         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";
         status deprecated;
         description
           "Each entry represents one revision of one module
            currently supported by the server.";
         uses common-leafs {
           status deprecated;
         }
         uses schema-leaf {
           status deprecated;
         }
         leaf namespace {
           type inet:uri;
           mandatory true;
           status deprecated;
           description
             "The XML namespace identifier for this module.";
         }
         leaf-list feature {
           type yang:yang-identifier;
           status deprecated;
           description
             "List of YANG feature names from this module that are
              supported by the server, regardless of whether they are
              defined in the module or any included submodule.";
         }
         list deviation {
           key "name revision";
           status deprecated;
           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 {
             status deprecated;
           }
         }
         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;
           status deprecated;
           description
             "Indicates the type of conformance the server is claiming
              for the YANG module identified by this entry.";
         }
         list submodule {
           key "name revision";
           status deprecated;
           description
             "Each entry represents one submodule within the
              parent module.";
           uses common-leafs {
             status deprecated;
           }
           uses schema-leaf {
             status deprecated;
           }
         }
       }
     }

     /*
      * Legacy operational state data nodes
      */

     container modules-state {
       config false;
       status deprecated;
       description
         "Contains YANG module monitoring information.";
       leaf module-set-id {
         type string;
         mandatory true;
         status deprecated;
         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 {
         status deprecated;
       }
     }

     /*
      * Legacy notifications
      */

     notification yang-library-change {
       status deprecated;
       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;
         status deprecated;
         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.";
       }
     }
   }
