<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.19 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-rajaram-netmod-yang-cfg-template-framework-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="yang-config-template-framework">Populating a list of YANG data nodes using templates</title>
    <seriesInfo name="Internet-Draft" value="draft-rajaram-netmod-yang-cfg-template-framework-00"/>
    <author fullname="Robert Peschi">
      <organization>Nokia</organization>
      <address>
        <postal>
          <city>Antwerp</city>
        </postal>
        <email>robert.peschi@nokia.com</email>
      </address>
    </author>
    <author fullname="Shiya Ashraf">
      <organization>Nokia</organization>
      <address>
        <postal>
          <city>Antwerp</city>
        </postal>
        <email>shiya.ashraf@nokia.com</email>
      </address>
    </author>
    <author fullname="Deepak Rajaram">
      <organization>Nokia</organization>
      <address>
        <postal>
          <city>Chennai</city>
        </postal>
        <email>deepak.rajaram@nokia.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="21"/>
    <area>ops</area>
    <workgroup>netmod</workgroup>
    <keyword>templates</keyword>
    <keyword>profiles</keyword>
    <keyword>YANG scalability</keyword>
    <abstract>
      <?line 66?>

<t>This document presents a modeling technique for configuring large scale devices in a compact way, when the device contains many similar data node patterns. A device here refers to any such entity that acts as a netconf server. This is realized by instructing the device to locally generate repetitive patterns of data nodes from a master copy called 'template' that is configured in the device. This approach is both convenient and efficient, as it minimizes the size of the running data store and reduces network provisioning time. It leverages existing YANG specification features and can be implemented with standard, off-the-shelf tools.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-rajaram-netmod-yang-cfg-template-framework/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        netmod Working Group mailing list (<eref target="mailto:netmod@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/netmod/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/netmod/"/>.
      </t>
    </note>
  </front>
  <middle>
    <?line 70?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This draft considers the case of a device that contains a functional entity, characterized by a well-defined data nodes pattern, that is massively replicated and where each replication instance needs individual configuration with only limited variation.</t>
      <t>Having a device manager that repetitively configures each data node for every functional instance can become complex and prone to errors. This approach may lead to issues, such as extended configuration times, increased memory usage on the device, and inefficient YANG validation processes due to the large size of the running data store. These challenges only intensify as the system scales.</t>
      <t>This draft proposes a technique to improve this, which is based on 'YANG templates' that results in a smaller running data store even when the device is very large.</t>
      <t>A 'YANG template' is the configuration of a functional entity that the device is instructed to replicate multiple times to generate copies of the entity. The technique that we address in this draft allows to generate copies with the same data node values as in the template with the possibility, though, to overrule some of these values on an individual copy basis.</t>
      <t>The general template technique detailed in this draft does not suffer from the drawbacks mentioned earlier where the device manager is explicitly configuring all device data nodes.</t>
      <t>This method is not aimed at becoming a standard itself. It is a YANG modeling technique that can be considered, where appropriate, by any implementor or standardization organization, when designing a YANG module for a specific purpose. For the sake of completeness, note that other IETF documents do mention already the use of YANG template concept for specific applications, for instance <eref target="https://datatracker.ietf.org/doc/draft-ietf-ccamp-optical-impairment-topology-yang/">draft-ietf-ccamp-optical-impairment-topology-yang</eref> and <eref target="https://datatracker.ietf.org/doc/html/rfc8795#section-5.9">RFC8795</eref>. However, they don't provide full context about the method. This draft can help clarifying and formalizing in a generic framework how to define and use YANG templates.</t>
      <t>The next sections will elaborate on some of the constructs to apply the template technique and highlight how to mitigate some potential issues. More specifically,</t>
      <ul spacing="normal">
        <li>
          <t>How to define the template of a functional entity, how to instruct the device to replicate it (including per instance variations) and</t>
        </li>
        <li>
          <t>How the replication process takes place when expanding the template into functional entity instances configuration data nodes.</t>
        </li>
      </ul>
    </section>
    <section anchor="template-technique-framework">
      <name>Template technique framework</name>
      <section anchor="provisioning-the-running-data-store">
        <name>Provisioning the running data store</name>
        <t>This section outlines how the device's running data store is utilized to implement the template technique.</t>
        <t>In the YANG model of the device, many functional instances can be organized in a list. Since a template represents the typical configuration pattern of a functional instance, it is often necessary to choose between multiple templates for replication. 
For Example: 
the device may host various types of functional instances, each with its own specific data structure. Say, one template might define data nodes for a 'function-1' type, while another template could define data nodes for a 'function-2' type.
For a given type of functional instance, different sets of values for the data nodes may be required. Say, a 'function-1' type might have templates for 'function-1-bronze-grade', 'function-1-silver-grade', and 'function-1-gold-grade' variants. As a result, multiple templates can also be organized into a list within the device's YANG model.</t>
        <t>Assume for example, that list-a and list-b data nodes need to be configured in the device. Traditionally, the tree structure will be as below:</t>
        <t>root</t>
        <artwork><![CDATA[
 +--(...)                     // out of scope
 +--rw data-nodes-pattern     // container for functional instances
    +--rw instance* [name]    // the list of functional instances 
       +--rw name             string-ascii64
       +--rw description?     string-ascii128
       +--rw data
          +--rw list-a [name] //e.g. a list of interfaces
          |  +--rw name
          |  +--rw parm-x
          |  +--rw parm-y
          +--rw list-b [name] //e.g. a list of hardware components
             +--rw name
             +--rw parm-t
             +--rw parm-u
]]></artwork>
        <t>In contrast, the YANG tree of a device using the template technique would appear as below:</t>
        <t>root</t>
        <artwork><![CDATA[
 +--(...)                     // out of scope
 +--rw data-nodes-pattern     // container for functional instances
    +--rw template* [name]    // the list of templates
    |  +--rw name             string-ascii64
    |  +--rw description?     string-ascii128
    |  +--rw data
    |     +--rw list-a [name] //e.g. a list of interfaces
    |     |  +--rw name
    |     |  +--rw parm-x 
    |     |  +--rw parm-y
    |     +--rw list-b [name] //e.g. a list of hardware components
    |        +--rw name
    |        +--rw parm-t
    |        +--rw parm-u
    +--rw instance* [name]    // the list of functional instances 
       +--rw name             string-ascii64
       +--rw description?     string-ascii128
       +--rw template?        -> /data-nodes-pattern/template/name
       +--rw data
       +--rw list-a [name] //e.g. a list of interfaces
       |  +--rw name
       |  +--rw parm-x  //overrule if present,or take it from template
       |  +--rw parm-y  //overrule if present,or take it from template
       +--rw list-b [name] //e.g. a list of hardware components
          +--rw name
          +--rw parm-t  //overrule if present,or take it from template
          +--rw parm-u  //overrule if present,or take it from template
]]></artwork>
        <t>Each entry in the template list encompasses the generic configuration data nodes that are needed for all the functional entities to be addressed by this template, as contained in the data container, in this example, data nodes of list-a and list-b. In practice, naturally, the more data nodes that can be replicated the more efficient the template technique will be.</t>
        <t>Each entry in the instance list represents a copy to be made of the data nodes pattern defined by the leaf-ref template, to create a functional entity instance. The data container contains all the data nodes needed to customize each copy of the template, by overruling one or the other data node value originating from the template (eg: parm-x, parm-y, parm-t, parm-u), or possibly to add to the copy one or the other data nodes not provided by the template.</t>
        <t>Although it is recommended that the same data nodes are defined in the data container of template and the data container of instance, only a limited number of such data nodes should be configured in the instance. This reflects the assumption that functional instances should have only limited variations from their template model.</t>
        <t>It should be noted that in a good application of the template technique, only few templates would suffice to generate a very large number of functional instances; in other words, the instance list would be much larger, typically by order of magnitudes, than the template list.</t>
        <t>A simple configuration example in the running data store of the device can be found at <xref target="a1device-running-data-store-using-the-template-mechanism">Appendix A.1</xref></t>
      </section>
      <section anchor="device-expanding-the-running-data-store">
        <name>Device expanding the running data store</name>
        <t>Once the configuration is applied to the device, the device will dynamically create each instance as specified.
The process for generating data nodes for a particular instance follows these steps:</t>
        <t>-A copy of the template's data nodes is made, serving as the foundation for the instance's configuration.</t>
        <t>-If any of these data nodes are also configured in the running data store for this instance, they will override the template values.</t>
        <t>If an instance data node is configured in the running data store but not provided by the template, it will be added to the generated instance configuration.</t>
        <t>The resulting instance expansion corresponding to the example in appendix A.1 is provided in <xref target="a2data-generated-by-the-template-mechanism">Appendix A.2</xref></t>
      </section>
      <section anchor="mandatories-and-defaults">
        <name>Mandatories and Defaults</name>
        <t>While conceptually, the idea of templates improves the re-usability and consistency factor, there are certain nuances, that need to be addressed while handling data nodes with defaults and mandatories.</t>
        <t>If certain replicable data patterns contain default or mandatory values, and are used as-is both in the template and in the instance,</t>
        <t>-There is a possibility of silent and unintentional overwriting the configured value of the node in the template with the default value in the instance due to the merge operation.</t>
        <t>-Mandatory data nodes must be unconditionally configured in the instance although they are already configured in the template, reducing the efficiency of the template mechanism.</t>
        <t>Hence, while the same data nodes are used in the templates and instances, it is imperative that instance data nodes are without default and mandatory statements.</t>
        <t>there may be different implementation to solve this, one such way that uses the existing YANG constructs is provided in <xref target="b-using-existing-yang-constructs-in-template-and-instance-yang-definition">Appendix B</xref>.</t>
      </section>
    </section>
    <section anchor="benefits-of-templates-in-yang-design">
      <name>Benefits of Templates in YANG Design</name>
      <ol spacing="normal" type="1"><li>
          <t>Reusability:
Templates encourage reusability by allowing common structures to be defined once and reused multiple times. This reduces duplication and simplifies model management.</t>
        </li>
        <li>
          <t>Consistency:
By using templates, similar configurations are defined and applied uniformly, leading to more consistent data modeling and network configuration management.</t>
        </li>
        <li>
          <t>Simplified Maintenance:
When a template is modified, all places where it is used will automatically reflect those changes, reducing the effort required to maintain and update the model.</t>
        </li>
        <li>
          <t>Modularity:
Templates promote a modular approach to YANG model design. By splitting the model into reusable parts, it becomes easier to scale and extend.</t>
        </li>
      </ol>
    </section>
    <section anchor="conclusion">
      <name>Conclusion</name>
      <t>Using templates in YANG allows to efficiently configure large amounts of similar data nodes while keeping the running data store size small. This is beneficial in term of device memory footprint, ease of configuration, configuration time and potentially YANG validation processing in the device. This draft explains some practicalities of the template method, including how to ensure that mandatory and default statements do not jeopardize the effectiveness of the method.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
    <section anchor="appendix">
      <name>Appendix</name>
      <section anchor="a-example-of-applying-the-template-method">
        <name>A. Example of applying the template method.</name>
        <section anchor="a1device-running-data-store-using-the-template-mechanism">
          <name>A.1.Device running data store using the template mechanism</name>
          <t>In this example, one template template-1 is configured, and three instances are configured, to be derived from template-1 and with limited overruling of the template values.</t>
          <artwork><![CDATA[
 <config>
 <data-nodes-pattern>
 <template>
  <name>template-1</name>
  <description>A typical configuration</description>
  <data>
    <list-a>
      <name>templ-1-list-a-entry-1</name>
      <parm-x>1</parm-x>
      <parm-y>30</parm-y>
    </list-a>
    <list-a>
      <name>templ-1-list-a-entry-2</name>
      <parm-x>3</parm-x>
      <parm-y>30</parm-y>
    </list-a>
     <list-a>
      <name>templ-1-list-a-entry-3</name>
      <parm-x>3</parm-x>
      <parm-y>50</parm-y>
    </list-a>
    <list-b>
      <name>templ-1-list-b-entry-1</name>
      <parm-t>2</parm-t>
      <parm-u>40</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-2</name>
      <parm-t>4</parm-t>
      <parm-u>60</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-3</name>
      <parm-t>4</parm-t>
      <parm-u>80</parm-u>
    </list-b>
  </data>
</template>

<instance>                         // a first instance
  <name>instance-1</name>
  <template>template-1</template>  //config is derived from template-1
  <data>
    <list-a>
      <name>templ-1-list-a-entry-2</name> // inherited from template
      <parm-y>33</parm-y>      //overrule template value 30 with 33
    </list-a>
  </data>
</instance>

<instance>                         // a second instance
  <name>instance-2</name>
  <template>template-1</template> //config is derived from template-1
  <data>                   // nothing from template to be overruled
  </data>
</instance>

<instance>                        // a third instance
  <name>instance-3</name>
  <template>template-1</template> //config is derived from template-1
  <data>
    <list-a>
      <name>templ-1-list-a-entry-3</name> //inherited from template
      <parm-y>55</parm-y>      //overrule template value 50 with 55
    </list-a>
    <list-b>
      <name>templ-1-list-b-entry-3</name> //inherited from template
      <parm-u>88</parm-u>       //overrule template value 80 with 88
    </list-b>
  </data>
</instance>
 </data-nodes-pattern>
 </config>
]]></artwork>
        </section>
        <section anchor="a2data-generated-by-the-template-mechanism">
          <name>A2:Data generated by the template mechanism</name>
          <t>The running data store example in section A.1 leads the device to generate the following data used to control the instances (without the aid of the template mechanism, this data would need to explicitly come from the running data store, instead of being locally expanded):</t>
          <t>generated through instance-1 merged with template-1 expansion</t>
          <artwork><![CDATA[
  <data>
    <list-a>
      <name>templ-1-list-a-entry-1</name>
      <parm-x>1</parm-x>
      <parm-y>30</parm-y>
    </list-a>
    <list-a>
      <name>templ-1-list-a-entry-2</name>
      <parm-x>3</parm-x>       
      <parm-y>33</parm-y>     //deviate from template value
    </list-a>
     <list-a>
      <name>templ-1-list-a-entry-3</name>
      <parm-x>3</parm-x>
      <parm-y>50</parm-y>
    </list-a>
    <list-b>
      <name>templ-1-list-b-entry-1</name>
      <parm-t>2</parm-t>
      <parm-u>40</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-2</name>
      <parm-t>4</parm-t>
      <parm-u>60</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-3</name>
      <parm-t>4</parm-t>
      <parm-u>80</parm-u>
    </list-b>
  </data>
]]></artwork>
          <t>(generated through instance-2 merged with template-1 expansion)</t>
          <artwork><![CDATA[
  <data>
    <list-a>
      <name>templ-1-list-a-entry-1</name>
      <parm-x>1</parm-x>
      <parm-y>30</parm-y>
    </list-a>
    <list-a>
      <name>templ-1-list-a-entry-2</name>
      <parm-x>3</parm-x>       
      <parm-y>30</parm-y>
    </list-a>
     <list-a>
      <name>templ-1-list-a-entry-3</name>
      <parm-x>3</parm-x>
      <parm-y>50</parm-y>
    </list-a>
    <list-b>
      <name>templ-1-list-b-entry-1</name>
      <parm-t>2</parm-t>
      <parm-u>40</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-2</name>
      <parm-t>4</parm-t>
      <parm-u>60</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-3</name>
      <parm-t>4</parm-t>
      <parm-u>80</parm-u>
    </list-b>
  </data>
]]></artwork>
          <t>(generated through instance-3 merged with template-1 expansion)</t>
          <artwork><![CDATA[
  <data>
    <list-a>
      <name>templ-1-list-a-entry-1</name>
      <parm-x>1</parm-x>
      <parm-y>30</parm-y>
    </list-a>
    <list-a>
      <name>templ-1-list-a-entry-2</name>
      <parm-x>3</parm-x>       
      <parm-y>30</parm-y>
    </list-a>
     <list-a>
      <name>templ-1-list-a-entry-3</name>
      <parm-x>3</parm-x>
      <parm-y>55</parm-y>     //deviate from template value
    </list-a>
    <list-b>
      <name>templ-1-list-b-entry-1</name>
      <parm-t>2</parm-t>
      <parm-u>40</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-2</name>
      <parm-t>4</parm-t>
      <parm-u>60</parm-u>
    </list-b>
    <list-b>
      <name>templ-1-list-b-entry-3</name>
      <parm-t>4</parm-t>
      <parm-u>88</parm-u>     //deviate from template value
    </list-b>
  </data>
]]></artwork>
        </section>
      </section>
      <section anchor="b-using-existing-yang-constructs-in-template-and-instance-yang-definition">
        <name>B: Using existing YANG constructs in template and instance YANG definition</name>
        <t>This appendix illustrates the use of groupings in the YANG definition of template and instances and more specifically it shows how easily mandatory and default statements can be introduced in the template definition by refining the grouping uses statement.</t>
        <section anchor="the-grouping-construct">
          <name>The grouping construct</name>
          <t>By defining common structures using grouping, one avoids repeating code, ensures consistency and makes future changes easier since modifications only need to happen in one place.</t>
          <t>Example:</t>
          <artwork><![CDATA[
 grouping interface-config {
          leaf parm-a {
             type string;
          }
          leaf parm-b {
             type boolean;
          }
          leaf parm-c {
             type unint32;
          }
        }
]]></artwork>
          <t>This 'interface-config' grouping defines a common structure that can be reused across different YANG modules or different parts of the same module.</t>
        </section>
        <section anchor="the-uses-construct">
          <name>The uses construct</name>
          <t>The 'uses' statement applies a previously defined grouping where needed in the model (e.g. it copies the data nodes of the grouping at the place of the 'uses' statement.</t>
          <t>As an example, the data nodes defined in the grouping above can be used in the template and in the instance definition:</t>
          <artwork><![CDATA[
 container data-nodes-pattern {
 list template {
  key "name";
  leaf name {
    type string;
  }
  container data {
    list interface {
      key "interface-name";
      leaf name {
        type string;
      }
      uses interface-config;
    } 
   } 
  }
list instance {
  key "name";
  leaf name {
    type string;
  }
  container data {
    list interface {
      key "interface-name";
      leaf name {
        type string;
      }
      uses interface-config;
    }
   }
  }
 }
]]></artwork>
        </section>
        <section anchor="the-refine-construct-to-control-default-and-mandatory-statements">
          <name>The refine construct to control default and mandatory statements</name>
          <t>As explained in section 2.3, with the template method, some data nodes may need a default or mandatory statement when used for the template definition but should have no mandatory neither default statements when used for the instance definition.</t>
          <t>The refine statement available in existing YANG version easily allows to control mandatory and default statements when used along with the uses statement.</t>
          <t>Assume in our example that it is desired that parm-b has a default statement and parm-c has a mandatory statement when they are used for the template definition.</t>
          <t>Then the YANG becomes:</t>
          <artwork><![CDATA[
 container data-nodes-pattern {
 list template {
  key "name";
  leaf name {
    type string;
  }
  container data {
    list interface {
      key "interface-name";
      uses interface-config {
        refine parm-b {
          default "true"
        }
        refine parm-c {
          mandatory true
        }
      }
    }
  }
}
list instance {
  key "name";
  leaf name {
    type string;
  }
  container data {
    list interface {
      key "interface-name";
      uses interface-config;
    }
   }
  }
 }
]]></artwork>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <?line 527?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
