<?xml version="1.0" encoding="UTF-8"?>

<!-- This is built from a template for a generic Internet Draft. Suggestions for
     improvement welcome - write to Brian Carpenter, brian.e.carpenter @ gmail.com -->

<!-- This can be converted using the Web service at http://xml.resource.org/experimental.html
     (which supports the latest, sometimes undocumented and under-tested, features.) -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>            <!-- You want a table of contents -->
<?rfc symrefs="yes"?>        <!-- Use symbolic labels for references -->
<?rfc sortrefs="yes"?>       <!-- This sorts the references -->
<?rfc iprnotified="no" ?>    <!-- Change to "yes" if someone has disclosed IPR for the draft -->
<?rfc compact="yes"?>

<!-- This defines the specific filename and version number of your draft (and inserts the appropriate IETF boilerplate -->
<rfc ipr="trust200902" docName="draft-ietf-netmod-yang-model-classification-03" category="info"  >

<front>
  <title abbrev="YANG Module Classification">YANG Module Classification</title>

  <author fullname="Dean Bogdanovic" initials="D." surname="Bogdanovic">
    <organization abbrev="Volta Networks, Inc.">
	Volta Networks, Inc.
    </organization>
    <address>
      <email>dean@voltanet.io</email>
    </address>
  </author>

  <author initials="B." surname="Claise" fullname="Benoit Claise">
    <organization abbrev="Cisco Systems, Inc.">
	Cisco Systems, Inc.
    </organization>
    <address>
      <postal>
        <street>De Kleetlaan 6a b1</street>
        <city>1831 Diegem</city>
        <country>Belgium</country>
      </postal>
      <phone>+32 2 704 5622</phone>
      <email>bclaise@cisco.com</email>
    </address>
  </author>

  <author fullname="Carl Moberg" initials="C." surname="Moberg">
    <organization>Cisco Systems, Inc.</organization>
    <address>
      <email>camoberg@cisco.com</email>
    </address>
  </author>

  <!-- Let xml2rfc figure out the date -->
  <date/>

  <area>Operations and Management</area>
  <workgroup>NETMOD</workgroup>

  <abstract>
    <t>The YANG <xref target="RFC6020"/> data modeling language is currently
      being considered for a wide variety of applications throughout the
      networking industry at large. Many standards-defining organizations
      (SDOs), open source software projects, vendors and users are using YANG to
      develop and publish YANG modules for a wide variety of applications. At
      the same time, there is currently no well-known terminology to categorize
      various types of YANG modules.</t>

    <t>A consistent terminology would help with the categorization of YANG modules,
      assist in the analysis of the YANG data modeling efforts in the IETF and
      other organizations, and bring clarity to the YANG-related discussions
      between the different groups.</t>

    <t>This document describes a set of concepts and associated terms to
      support consistent classification of YANG modules.</t>
  </abstract>
</front>

<middle>
  <section anchor="introduction" title="Introduction">
    <t>The Internet Engineering Steering Group (IESG) has been actively
      encouraging IETF working groups to use the YANG modeling language <xref
      target="RFC6020"/>, <xref target="RFC7950"/> and
      NETCONF protocol <xref target="RFC6241"/> for configuration
      management purposes, especially in new working group charters
      <xref target="Writable-MIB-Module-IESG-Statement"/>.</t>

    <t>YANG is also gaining wide acceptance as the de-facto standard modeling
      language in the broader industry. This extends beyond the IETF,
      including many standards development organizations, industry consortia,
      ad hoc groups, open source projects, vendors, and end-users.</t>

    <t>There are currently no clear guidelines on how to classify the layering
      of YANG modules according to abstraction, or how to classify modules along
      the continuum spanning formal standards publications, vendor-specific
      modules and modules provided by end-users.</t>

    <t>This document presents a set of concepts and terms to form a useful
      taxonomy for consistent classification of YANG modules in two dimensions:
      <list style="symbols">
        <t>The layering of modules based on their abstraction levels</t>
        <t>The type of module based on the nature and intent of the content</t>
      </list>
    </t>

    <t>The intent of this document is to provide a taxonomy to simplify human
      communication around YANG modules. The authors acknowledge that the
      classification boundaries are at times blurry, but believe that this
      document should provide a robust starting point as the YANG community
      gains further experience with designing and deploying modules. To be more
      explicit, the authors believe that the classification criteria will
      change over time.</t>

    <t>A number of module types have created substantial discussion during
      the development of this document including those concerned with
      topologies. Topology modules are useful both on the Network Element
      level (e.g. link-state database content) as well as on the Network
      Service level (e.g. network-wide, configured topologies). In the end,
      it is the module developer that classifies the module according to the
      initial intent of the module content.</t>

      <t>This document should provide benefits to multiple audiences:
        <list style="symbols">
          <t>First, a common taxonomy helps with the different standards
            development organizations and industry consortia discussions, whose
            goals are determined in their respective areas of work.</t>

          <t>Second, operators might look at the YANG module classification
            type to understand which Network Service YANG modules and Network
            Element YANG modules are available for their service composition.
            It is difficult to determine the module type without inspecting
            the YANG module itself. The YANG module name might provide some
            useful information but is not a definite answer. For example, an
            L2VPN YANG module might be a Network Service YANG module, ready
            to be used by the operators. Alternatively, it might be a Network
            Element YANG module that contains the L2VPN data definitions
            required to be configured on a single device.</t>

          <t>And thirdly, this taxonomy would help equipment vendors (whether
            physical or virtual), controller vendors, orchestrator vendors to
            explain to their customers the relationship between the different
            YANG modules they propose in their products. See
            <xref target="modulelayers"/>.</t>
        </list>
      </t>

    <section anchor="terminology" title="Terminology">
      <t><xref target='RFC7950'/> specifies:
        <list style="symbols">
          <t>data model: A data model describes how data is represented and
            accessed.</t>
          <t>module: A YANG module defines a hierarchy of nodes that can be
            used for NETCONF-based operations.  With its definitions and the
            definitions it imports or includes from elsewhere, a module is
            self-contained and "compilable".
          </t>
        </list>
      </t>
    </section>
  </section>

  <section anchor="firstdimension" title="First Dimension: YANG Module Abstraction Layers">
    <t>Module developers have taken two approaches to developing YANG modules:
      top-down and bottom-up. The top-down approach starts with high level
      abstractions modeling business or customer requirements and maps them to
      specific networking technologies. The bottom-up approach starts with
      fundamental networking technologies and maps them into more abstract
      constructs.</t>

	  <t>There are currently no specific requirements on, or well-defined best
      practices around the development of YANG modules. For the purpose of this
      document we assume that both approaches (bottom-up and top-down) will
      be used as they both provide benefits that appeal to different groups.
    </t>

	  <t>For layering purposes, this document suggests the classification of
      YANG modules into two distinct abstraction layers:</t>
	   <t>
       <list style="symbols">
		     <t>Network Element YANG Modules describe the configuration, state
          data, operations and notifications of specific device-centric
          technologies or features</t>
         <t>Network Service YANG Modules describe the configuration, state
          data, operations and notifications of abstract representations of services
          implemented on one or multiple network elements</t>
        </list>
      </t>

    <figure title="YANG Module Layers" anchor="modulelayers">
      <artwork align="center">

                    +--------------------------+
                    |  Operations and Business |
                    |      Support Systems     |
                    |        (OSS/BSS)         |
                    +--------------------------+

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Network Service YANG Modules 

         +------------+      +-------------+      +-------------+
         |            |      |             |      |             |
         |  - L2VPN   |      |   - L2VPN   |      |    L3VPN    |
         |  - VPWS    |      |   - VPLS    |      |             |
         |            |      |             |      |             |
         +------------+      +-------------+      +-------------+
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Network Element YANG Modules

    +------------+  +------------+  +-------------+  +------------+
    |            |  |            |  |             |  |            |
    |    MPLS    |  |    BGP     |  | IPv4 / IPv6 |  |  Ethernet  |
    |            |  |            |  |             |  |            |
    +------------+  +------------+  +-------------+  +------------+

      L2VPN: Layer 2 Virtual Private Network
      L3VPN: Layer 3 Virtual Private Network
      VPWS: Virtual Private Wire Service
      VPLS: Virtual Private LAN Service
      </artwork>
    </figure>

    <t><xref target="modulelayers"/> illustrates the application of YANG
      modules at different layers of abstraction. Layering of modules
      allows for reusability of existing lower layer modules by higher level
      modules while limiting duplication of features across layers.</t>

    <t>For module developers, per-layer modeling allows for separation of
      concern across editing teams focusing on specific areas.</t>

    <t>As an example, experience from the IETF shows that creating useful
      network element YANG modules for e.g. routing or switching protocols
      requires teams that include developers with experience of
      implementing those protocols.</t>

    <t>On the other hand, network service YANG modules are best developed by 
      network operators experienced in defining network services for consumption by
      programmers developing e.g. flow-through provisioning systems or self-service
      portals.</t>

  <section anchor="networkservice" title="Network Service YANG Modules">
    <t>Network Service YANG Modules describe the characteristics of a
      service, as agreed upon with consumers of that service. That is, a
      service module does not expose the detailed configuration parameters of
      all participating network elements and features, but describes an
      abstract model that allows instances of the service to be decomposed
      into instance data according to the Network Element YANG Modules of
      the participating network elements. The service-to-element decomposition
      is a separate process with details depending on how the network operator
      chooses to realize the service. For the purpose of this document we
      will use the term "orchestrator" to describe a system implementing such
      a process.</t>

     <t>As an example, the Network Service YANG Module defined in
      <xref target='YANG-Data-Model-for-L3VPN-service-delivery'/> provides
      an abstract model for Layer 3 IP VPN service configuration. This module
      includes e.g. the concept of a 'site-network-access' to represent
      bearer and connection parameters. An orchestrator receives operations
      on service instances according to the service module and decomposes the
      data into specific Network Element YANG Modules to configure the
      participating network elements to perform the intent of the service.
      In the case of the L3VPN module, this would include translating the
      'site-network-access' parameters to the appropriate parameters in
      the Network Element YANG Module implemented on the constituent
      elements.</t>

     <t>Network Service YANG Modules define service models to be consumed 
      by external systems. These modules are commonly designed, developed and
      deployed by network infrastructure teams.</t>

    <t>YANG allows for different design patterns to describe network services,
      ranging from monolithic to component-based approaches.</t>

    <t>The monolithic approach captures the entire service in a single module
      and does not put focus on reusability of internal data definitions and
      groupings. The monolithic approach has the advantages of single-purpose
      development including speed at the expense of reusability.</t>

    <t>The component-based approach captures device-centric features (e.g.
      the definition of a VRF, routing protocols, or packet filtering) in a
      vendor-independent manner. The components are designed for reuse across
      many service modules. The set of components required for a specific
      service is then composed into the higher-level service. The component-based
      approach has the advantages of modular development including a higher
      degree of reusability at the expense of initial speed.</t>

    <t>As an example, an L2VPN service can be built on many different types of
      transport network technologies, including e.g. MPLS or carrier ethernet.
      A component-based approach would allow for reuse of e.g. UNI-interface
      definitions independent of the underlying transport network (e.g. MEF
      UNI interface or MPLS interface). The monolithic approach would assume
      a specific set of transport technologies and interface definitions.</t>

    </section>

   <section anchor="networkelement" title="Network Element YANG Modules">
    <t>Network Element YANG Modules describe the characteristics of a network
      device as defined by the vendor of that device. The modules are commonly
      structured around features of the device, e.g. interface configuration
      <xref target='RFC7223'/>, OSPF configuration
      <xref target='I-D.ietf-ospf-yang'/>, and firewall rules definitions
      <xref target='I-D.ietf-netmod-acl-model'/>.</t>

    <t>The module provides a coherent data model representation of the software
      environment consisting of the operating  system and applications running
      on the device. The decomposition, ordering, and execution of changes to
      the operating system and application configuration is the task of the
      agent that implements the module.</t>

   </section>
 </section>

 <section title="Second Dimension: Module Types">
    <t>This document suggests classifying YANG module types as standard
      YANG modules, vendor-specific YANG modules and extensions, or
      user-specific YANG modules and extensions</t>

    <t>The suggested classification applies to both Network Element YANG
      Modules and Network Service YANG Modules.</t>

    <t>It is to be expected that real-world implementations of both Network
      Service YANG Modules and Network Element YANG Modules will include a
      mix of all three types of modules.</t>

    <t><xref target="moduletypes"/> illustrates the relationship between the
    three types of modules.</t>

    <figure title="YANG Module Types" anchor="moduletypes">
      <artwork align="center" type="ascii-art">
+--------------+
|     User     |
|   Extensions |
+------+-------+
    Augments
+------+-------+  +--------------+  +--------------+
|   Vendor     |  |     User     |  |     User     |
|  Extensions  |  |  Extensions  |  |  Extensions  |
+------+-------+  +------+-------+  +------+-------+
    Augments          Augments          Augments
+------+-----------------+-------+  +------+-------+  +--------------+
|            Standard            |  |    Vendor    |  |    User      |
|            Modules             |  |    Modules   |  |   Modules    |
+--------------------------------+  +--------------+  +--------------+
      </artwork>
    </figure>

    <section title="Standard YANG Modules">
      <t>Standard YANG Modules are published by standards-defining organizations
        (SDOs). While there is no formal definition of what construes an SDO,
        a common feature is that they publish specifications along specific
        processes with content that reflects some sort of membership
        consensus. The specifications are developed for wide use among the
        membership or for audiences beyond that.</t>

      <t>The lifecycle of these modules is driven by the editing cycle of the
        specification and not tied to a specific implementation.</t>

      <t>Examples of SDOs in the networking industry are the IETF, the IEEE 
        and the MEF.</t>
    </section>

    <section title="Vendor-specific YANG Modules and Extensions">
      <t>Vendor-specific YANG Modules are developed by organizations with the
        intent to support a specific set of implementations under control of
        that organization. For example vendors of virtual or physical equipment,
        industry consortia, and opensource projects. The intent of these modules
        range from providing openly published YANG modules that may eventually
        be contributed back to, or adopted by, an SDO, to strictly internal YANG
        modules not intended for external consumption.</t>

      <t>The lifecycle of these modules are generally aligned with the release
        cycle of the product or open source software project deliverables.</t>

      <t>It is worth noting that there is an increasing amount of interaction
        between open source projects and SDOs in the networking industry. This
        includes open source projects implementing published standards as well
        as open source projects  contributing content to SDO processes.</t>

      <t>Vendors also develop Vendor-specific Extensions to standard modules using
        YANG constructs for extending data definitions of previously published
        modules. This is done using the ‘augment’ statement that allows locally
        defined data trees to be augmented into locations in externally defined
        data trees.</t>

      <t>Vendors use this to extend standard modules to cover the
        full scope of features in implementations, which commonly is broader
        than that covered by the standard module.</t>
    </section>

    <section title="User-specific YANG Modules and Extensions">
      <t>User-specific YANG Modules are developed by organizations that operate
        YANG-based infrastructure including devices and orchestrators. For example,
        network administrators in enterprises, or at service providers. The
        intent of these modules is to express the specific needs for a certain
        implementation, above and beyond what is provided by vendors.
      </t>

      <t>This module type obviously requires the infrastructure to support the
        introduction of user-provided modules and extensions. This would include
        ability to describe the service-to-network decomposition in
        orchestrators and the module to configuration decomposition in devices.
      </t>

      <t>The lifecycles of these modules are generally aligned with the change
        cadence of the infrastructure.</t>
    </section>
</section>

<section anchor="catalog" title="Adding The Classification Type to YANG Module Catalogs">
   <t>The suggested classification in this document would be an useful
    information in a catalog of YANG modules. Such a catalog allows for
    easy lookup and reusability of YANG modules. Practically, the YANG
    module classification type would be an additional leaf to a YANG
    module specified in <xref target='I-D.openconfig-netmod-model-catalog'/>:</t> 

        <figure>
    <artwork align="center"><![CDATA[
         leaf module-class{
           type enum {
                service
                device
                notApplicable
           }
           description
              "Categorization of the YANG module based on 
               draft-ietf-netmod-yang-model-classification.";
         }
]]></artwork>
    </figure>

   <t>Note: this leaf should actually be moved to <xref target='I-D.openconfig-netmod-model-catalog'/>.
      Note2: since a YANG module can belong to both service and device, the ENUM is not appropriate.
      An extensible list of module type is more appropriate.</t>

   <t>Indeed, without inspecting the YANG module itself, it's difficult to determine 
    whether its type is a network service or a network element. The YANG module name
    might provide some useful information but is not a definitive answer.</t>
</section>
    
<section anchor="security" title="Security Considerations">
    <t>This document doesn't have any Security Considerations.</t>
</section>

<section anchor="iana" title="IANA Considerations">
    <t>This document has no IANA actions.</t>
</section>

<section anchor="ack" title="Acknowledgements">
    <t>Thanks to David Ball and David Hansford for feedback and suggestions.</t>
</section>

<section anchor ="changes" title="Change log [RFC Editor: Please remove]">
    <t>version 00: Renamed and small fixes based on WG feedback.</t>
    <t>version 01: Language fixes, collapsing of vendor data models and extensions,
      and the introduction of user data models and extensions.</t>
    <t>version 02: Updated the YANG Module Catalog section, terminology alignment 
      (YANG data model versus YANG module), explain better the distinction between 
      the Network Element and Service YANG data models even if sometimes there are 
      grey areas, editorial pass. Changed the use of the term 'model' to 'module'
      to be better aligned with RFC6020.</t>
</section>
  </middle>

  <back>
    <references title="Normative References">
        <?rfc include='reference.RFC.6020'?>
        <?rfc include='reference.RFC.6241'?>
        <?rfc include='reference.RFC.7950'?>
        <?rfc include='reference.RFC.7223'?>
    </references>
    <references title="Informative References">
       <?rfc include='reference.I-D.ietf-netmod-acl-model'?>
       <?rfc include='reference.I-D.ietf-ospf-yang'?>
       <?rfc include='reference.I-D.openconfig-netmod-model-catalog'?>
      <reference anchor="Writable-MIB-Module-IESG-Statement"
        target="https://www.ietf.org/iesg/statement/writable-mib-module.html">
        <front>
          <title>Writable MIB Module IESG Statement</title>
          <author/>
          <date/>
        </front>
      </reference>
      <reference anchor="YANG-Data-Model-for-L3VPN-service-delivery"
        target="https://tools.ietf.org/id/draft-l3vpn-service-yang">
        <front>
          <title>YANG Data Model for L3VPN service delivery</title>
          <author/>
          <date/>
        </front>
      </reference>
    </references>
  </back>
</rfc>
