<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-tt-netmod-yang-config-templates-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="template">YANG Configuration Templates</title>
    <seriesInfo name="Internet-Draft" value="draft-tt-netmod-yang-config-templates-02"/>
    <author fullname="Robert Wills" role="editor">
      <organization>Cisco</organization>
      <address>
        <postal>
          <country>United Kingdom</country>
        </postal>
        <email>rowills@cisco.com</email>
      </address>
    </author>
    <author fullname="Qiufang Ma" role="editor">
      <organization>Huawei</organization>
      <address>
        <postal>
          <street>101 Software Avenue, Yuhua District</street>
          <city>Jiangsu</city>
          <code>210012</code>
          <country>China</country>
        </postal>
        <email>maqiufang1@huawei.com</email>
      </address>
    </author>
    <author fullname="Deepak Rajaram" role="editor">
      <organization>Nokia</organization>
      <address>
        <postal>
          <country>India</country>
        </postal>
        <email>deepak.rajaram@nokia.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <area>Operations and Management</area>
    <workgroup>Network Modeling</workgroup>
    <keyword>YANG</keyword>
    <keyword>template</keyword>
    <keyword>NMDA</keyword>
    <abstract>
      <?line 58?>

<t>NETCONF and RESTCONF protocols provide programmatic interfaces for
   accessing configuration data modeled by YANG.  This document defines
   the use of a YANG-based configuration template mechanism whereby
   configuration data can be defined in one or more templates and
   applied repeatedly.  This avoids the redundant definition of
   identical configuration and ensures the consistency of it, thus
   allowing devices to be managed more conveniently and efficiently.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Network Modeling Working Group mailing list (netmod@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/netmod/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/QiufangMa/template-mechanism"/>.</t>
    </note>
  </front>
  <middle>
    <?line 68?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document considers the case of a datastore that contains
   multiple subtrees with similar or identical nodes within them, such
   that the datastore contains repetitive data with limited variation.
   If a client has to repeatedly configure the same nodes for each
   subtree, this can become complex, error-prone, and masks the intent
   of the client.</t>
      <t>This document proposes a solution to improve this, called
   "Configuration Templates", that results in a smaller running
   datastore even when the configuration in &lt;running&gt; is large.</t>
      <t>A Configuration Template is a fragment of configuration that the
   device is instructed to replicate multiple times to generate copies
   of the configuration.  This allows repetitive subtrees of
   configuration to be written only once, in the template.  When needed,
   individual instantiations of a template can override the values of
   nodes, or add new instance-specific nodes.</t>
      <t>NMDA <xref target="RFC8342"/> allows the configuration templates to be defined in
   &lt;running&gt; and expanded in &lt;intended&gt;, but it does not specify details
   about how configuration templates could be created and applied.</t>
      <t>This document defines the use of configuration templates in the
   context of YANG-driven network management protocols such as NETCONF
   <xref target="RFC6241"/> and RESTCONF <xref target="RFC8040"/>.  Configuration templates can be
   used with any YANG data model, this document doesn't make any
   assumption on the YANG data model design, i.e. it does not rely on a
   shared profile/group being defined in the YANG data model.</t>
      <section anchor="editorial-note-to-be-removed-by-rfc-editor">
        <name>Editorial Note (To be removed by RFC Editor)</name>
        <t>Note to the RFC Editor: This section is to be removed prior to publication.</t>
        <t>This document contains placeholder values that need to be replaced with finalized
values at the time of publication.  This note summarizes all of the
substitutions that are needed.  No other RFC Editor instructions are specified
elsewhere in this document.</t>
        <t>Please apply the following replacements:</t>
        <ul spacing="normal">
          <li>
            <t>XXXX --&gt; the assigned RFC number for this draft</t>
          </li>
          <li>
            <t>2025-05-28 --&gt; the actual date of the publication of this document</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>The meanings of the symbols in tree diagrams are defined in
<xref target="RFC8340"/>.</t>
      <t>This document uses the YANG terminology defined in <xref section="3" sectionFormat="of" target="RFC7950"/>.</t>
      <t>Besides, this document defines the following terminology:</t>
      <dl>
        <dt>Configuration Template:</dt>
        <dd>
          <t>A chunk of reusable configuration data that
    could be applied to the configuration repeatedly, in order to
    simplify the delivery of network configuration and ensure the
    consistency of it.  A configuration template may also be called
    "template" or "YANG template" throughout this document.</t>
        </dd>
      </dl>
    </section>
    <section anchor="requirements">
      <name>Requirements</name>
      <t>This section describes the requirements that the Configuration
  Templates solution must satisfy.  These requirements were all
  discussed in the Interim Meetings, and a rough consensus was reached
  on each of them by the participants in the meetings.  A general theme
  of the Configuration Templates work is to come up with a "Minimal
  Viable Product" that is useful but not over-complicated.  More
  advanced features could be considered as extensions in later drafts.</t>
      <section anchor="defining-and-managing-templates">
        <name>Defining and Managing Templates</name>
        <t>Templates can be used with any YANG module.  They contain nodes of
  configuration data, and are stored persistently in the running
  datastore of the device.</t>
        <t>A client can view and manipulate a template, including the
  configuration inside it, by manipulating it in the &lt;running&gt;
  datastore.  In this sense, a template and its contents behaves like
  any other subtree of configuration.</t>
      </section>
      <section anchor="template-inherits">
        <name>Applying Templates</name>
        <t>A template can be applied to zero or more nodes in the &lt;running&gt;
  datastore.  Each node can have zero or more templates applied to it,
  and the order they are applied is specified by the client.  The order
  is important when determining the final intended configuration -- see
  the next section.</t>
        <t>Templates can be applied at multiple points in the hierachy.  The
  next section states the requirements when a node applies a template
  and it has an ancestor that also applies a template.</t>
        <t>When viewing the &lt;running&gt; datastore, there is a mechanism to see
  which templates have been applied to each node, and in which order.</t>
      </section>
      <section anchor="producing-the-intended-datastore">
        <name>Producing the Intended Datastore</name>
        <t>The device's &lt;intended&gt; datastore is the result of combining all the
applications of templates together with non-template config.  This is
called "expanding out" the templates.</t>
        <t>The intended configuration inside a subtree is the result of taking
the relevant contents of every template applied to the subtree's root
node and its ancestors, and combining it with the (non-template) data
nodes inside the subtree.</t>
        <t>A node inside a subtree may be present in multiple templates that
have been applied, and/or it may be present as non-template config
inside the subtree.  The requirements for combining the templates and
the non-template config together are as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The value of a node in the &lt;intended&gt; configuration is determined
by using precedence to decide where to take the value from.</t>
          </li>
          <li>
            <t>Non-template config always has the highest precedence.</t>
          </li>
          <li>
            <t>When templates are applied to multiple ancestors, the innermost
ancestor takes precedence.</t>
          </li>
          <li>
            <t>When multiple templates are applied to a particular node, the
order of application (as indicated by the client when applying the
templates) determines the precedence within that node.</t>
          </li>
        </ul>
        <t>Whenever the contents of a template is updated in &lt;running&gt;, the
result of expanding out the template appears in &lt;intended&gt; and takes
effect on the device.</t>
      </section>
      <section anchor="pattern-matching-in-templates">
        <name>Pattern Matching in Templates</name>
        <t>The configuration inside a template definition can contain values for
list keys that are simple regular expressions, using a limited subset
of regular expression syntax.  This controls which list entries that
particular subtree of the template takes effect for when the template
is applied.</t>
        <t>An example of this would be to have a template that is applied to a
top-level "interfaces" container, but the template only takes effect
for certain interface names that match the regular expression.</t>
      </section>
      <section anchor="off-box-template-expansion">
        <name>Off-box Template Expansion</name>
        <t>If the client knows the contents of the &lt;running&gt; datastore (non-
template config, template definitions and template applications), it
must be possible for the client to calculate the result of template
expansion.</t>
        <t>In other words, the outcome of template expansion depends solely on
the &lt;running&gt; datastore and not the state of the device.</t>
      </section>
    </section>
    <section anchor="configuration-template-solution">
      <name>Configuration Template Solution</name>
      <section anchor="define-templates">
        <name>Defining Templates</name>
        <t>A configuration template must first be defined before it can be applied (see <xref target="inheriting-temp"/>). The creation,
modification, and deletion of configuration templates is achieved by network
management operations via NETCONF or RESTCONF protocols. The contents of the configuration
template must be an instantiated chunk of data starting from any level node in the hierarchies of any YANG data model.</t>
        <t>(Editor's note: more work may be needed here to ensure the template
is a valid subtree of config from a schema perspective.  This may
mean we need a way of saying where the root of the template is in the
schema, for example with a set of "outer" nodes with
operation="none").</t>
        <t>The YANG data model of configuration templates is defined in <xref target="template-yang"/>.</t>
        <section anchor="regex">
          <name>Templates with Regular Expressions</name>
          <t>Simple regular expressions can be used to restrict which list entries
a template takes effect for.</t>
          <t>(Editor's note: more work is needed here to define the exact
 semantics of this.  Also, the regular expressions will be very simple
 (again, this needs to be defined), and therefore it may be better to
 call them 'globs' or 'patterns')</t>
          <t>For example, Figure 1 provides an interface configuration template
 that sets "type" as ethernetCsmacd and "mtu" as 1500 for interfaces
 named with the prefix "eth":</t>
          <figure anchor="regex-example">
            <name>Example of An Interface template</name>
            <artwork align="center"><![CDATA[
<templates xmlns="urn:ietf:params:xml:ns:yang:ietf-config-template">
  <template>
    <id>ethernet-interface</id>
    <content>
      <interfaces xmlns="urn:example:interface">
        <interface>
          <name>^eth.*</name>
          <type>ethernetCsmacd</type>
          <mtu>1500</mtu>
        </interface>
      </interfaces>
    </content>
  </template>
</templates>
]]></artwork>
          </figure>
        </section>
      </section>
      <section anchor="inheriting-temp">
        <name>Applying Templates</name>
        <t>For each configuration node in the &lt;running&gt; datastore, one or more
templates can be applied.  This causes configuration from the
templates to be combined with child configuration in the &lt;running&gt;
datastore to produce a final set of &lt;intended&gt; configuration that
will be used by the device.</t>
        <section anchor="the-apply-templates-metadata">
          <name>The "apply-templates" Metadata</name>
          <t>Template application is indicated using the "apply-templates"
metadata.  The value of this is a list of space-separated template
identifiers.  If the template is applied to a node in the data tree,
the metadata object is added to that specific node.</t>
          <t>The encoding of "apply-templates" metadata object follows the way defined
in <xref section="5" sectionFormat="of" target="RFC7952"/>.</t>
          <t>For example, the following interface configuration may be provided
with the container node "interfaces" applying the template defined in
<xref target="regex-example"/>:</t>
          <artwork><![CDATA[
    <interfaces xmlns="urn:example:interface"
      xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-config-template"
      ct:apply-templates="ethernet-interface">
      <interface>
        <name>loopback0</name>
      </interface>
      <interface>
        <name>eth0</name>
      </interface>
      <interface>
        <name>eth1</name>
      </interface>
    </interfaces>
]]></artwork>
          <t>And the above interface configuration renders the following expanded configuration:</t>
          <artwork><![CDATA[
    <interfaces xmlns="urn:example:interface">
      <interface>
        <name>loopback0</name>
      </interface>
      <interface>
        <name>eth0</name>
        <type>ethernetCsmacd</type>
        <mtu>1500</mtu>
      </interface>
      <interface>
        <name>eth1</name>
        <type>ethernetCsmacd</type>
        <mtu>1500</mtu>
      </interface>
    </interfaces>
]]></artwork>
        </section>
        <section anchor="creating-editing-and-deleting-the-apply-templates-metadata">
          <name>Creating, editing and deleting the "apply-templates" metadata</name>
          <t>The apply-templates metadata can be modified by the client by
specifying it as an attribute in an &lt;edit-config&gt; request.  There are
three cases:</t>
          <ul spacing="normal">
            <li>
              <t>The apply-templates attribute is specified and the value is non-
empty (i.e. a list of templates to apply to the node).  The apply-
templates metadata is changed to match the value in the request.</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>Editor's Note: What if a specific node has some templates applied, and another &lt;edit-config&gt; provides another set of values of apply-template? It is a merge or full replace? Should this whole solution be combined with NETCONF "operation" attribute?</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>The apply-templates attribute is specified and the value is the
empty string.  The apply-templates metadata is removed and thus no
templates are applied to the node.</t>
            </li>
            <li>
              <t>The apply-templates attribute not specified.  The apply-templates
metadata currently present on the node (if any) is unchanged.</t>
            </li>
          </ul>
          <t>For example, this request creates a single loopback0 interface and
applies template t1 to the interfaces container:</t>
          <artwork><![CDATA[
    <edit-config>
      ...
      <config>
        <interfaces xmlns="urn:example:interface"
                    ct:apply-templates="t1">
          <interface>
            <name>loopback0</name>
          </interface>
        </interfaces>
      </config>
    </edit-config>
]]></artwork>
          <t>This request also applies template t2 to the interfaces container:</t>
          <artwork><![CDATA[
    <edit-config>
      ...
      <config>
        <interfaces xmlns="urn:example:interface"
                    ct:apply-templates="t1 t2" />
      </config>
    </edit-config>
]]></artwork>
          <t>After this request, &lt;running&gt; is as follows:</t>
          <artwork><![CDATA[
    <interfaces xmlns="urn:example:interface"
                ct:apply-templates="t1 t1">
      <interface>
        <name>loopback0</name>
      </interface>
    </interfaces>
]]></artwork>
          <t>This request adds a new interface list entry, and leaves the applied
templates unchanged:</t>
          <artwork><![CDATA[
    <edit-config>
      ...
      <config>
        <interfaces xmlns="urn:example:interface">
          <interface>
            <name>eth0</name>
          </interface>
        </interfaces>
      </config>
    </edit-config>
]]></artwork>
          <t>After this request, &lt;running&gt; is as follows:</t>
          <artwork><![CDATA[
    <interfaces xmlns="urn:example:interface"
                ct:apply-templates="t1 t1">
      <interface>
        <name>loopback0</name>
      </interface>
      <interface>
        <name>eth0</name>
      </interface>
    </interfaces>
]]></artwork>
          <t>Finally, this request deletes all the templates, and leaves the list
entries unchanged:</t>
          <artwork><![CDATA[
    <edit-config>
      ...
      <config>
        <interfaces xmlns="urn:example:interface"
                    ct:apply-templates="" />
        </interfaces>
      </config>
    </edit-config>
]]></artwork>
          <t>After this request, &lt;running&gt; is as follows:</t>
          <artwork><![CDATA[
    <interfaces xmlns="urn:example:interface">
      <interface>
        <name>loopback0</name>
      </interface>
      <interface>
        <name>eth0</name>
      </interface>
    </interfaces>
]]></artwork>
        </section>
      </section>
      <section anchor="overriding-temp">
        <name>Overriding Templates</name>
        <t>The client may want to to override some configuration in a template
 when it is applied to a particular node in &lt;running&gt;.  The client can
 achieve this by providing the desired value at the corresponding
 level when applying the template.  Configuration explicitly provided
 by the client always takes precedence over the same node defined in
 template.</t>
        <t>A template node can be overriden by having its value changed, but it
 can't be deleted.</t>
        <t>As an example of overriding a node in a template, a client may
 configure physically present interfaces "eth0" and "eth1" inheriting
 the template defined in Figure 1, but the "mtu" value of "eth1" needs
 to be 9122:</t>
        <artwork><![CDATA[
    <interfaces xmlns="urn:example:interface"
      xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-config-template"
      ct:apply-templates="ethernet-interface">
      <interface>
        <name>loopback0</name>
      </interface>
      <interface>
        <name>eth0</name>
      </interface>
      <interface>
        <name>eth1</name>
        <mtu>9122</mtu>
      </interface>
    </interfaces>
]]></artwork>
        <t>And the above interface configuration renders the following expanded
 configuration:</t>
        <artwork><![CDATA[
    <interfaces xmlns="urn:example:interface">
      <interface>
        <name>loopback0</name>
      </interface>
      <interface>
        <name>eth0</name>
        <type>ethernetCsmacd</type>
        <mtu>1500</mtu>
      </interface>
      <interface>
        <name>eth1</name>
        <type>ethernetCsmacd</type>
        <mtu>9122</mtu>
      </interface>
    </interfaces>
]]></artwork>
      </section>
      <section anchor="expand-templates">
        <name>Expanding Templates</name>
        <t>When a configuration template is applied to a node in the data tree,
it acts as if the configuration defined in the template is merged
with the configuration provided explicitly at the corresponding level
in the data tree, with the explicitly provided configuration taking
precedence.</t>
        <t>the process of expanding templates to derive &lt;intended&gt; is deterministic and depends solely on the contents of &lt;running&gt;.
The process rules are as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The value of a node in the &lt;intended&gt; configuration is determined
by using precedence to decide where to take the value from.</t>
          </li>
          <li>
            <t>Non-template config always has the highest precedence.</t>
          </li>
          <li>
            <t>When templates are applied to multiple ancestors, the innermost
ancestor takes precedence.</t>
          </li>
          <li>
            <t>When multiple templates are applied to a particular node, the
order of application (as indicated by the client when applying the
templates) determines the precedence within that node.</t>
          </li>
        </ul>
        <t>If a client has knowledge of the complete contents of &lt;running&gt;,
it can calculate the exact result of template expansion, independent of the server's operational state.</t>
        <t>Whenever the contents of a template is updated in &lt;running&gt;, the
result of expanding out the template appears in &lt;intended&gt; and takes
effect on the device.</t>
      </section>
      <section anchor="deletion-of-templates">
        <name>Deletion of Templates</name>
        <t>After a template has been applied to a node in the data tree,
the template configuration itself <bcp14>MAY</bcp14> be allowed to be deleted
while the expanded configuration still remains in the intended datastore.</t>
      </section>
      <section anchor="validity-of-templates">
        <name>Validity of Templates</name>
        <t>The contents of the template alone is not always sufficient to
enforce the constraints of the data model.  Some constraints may
depend on configuration outside of the templates to satisfy, e.g., a
list may contain a mandatory leaf node which is not defined in the
template but explicitly provided by the client.  However, servers
<bcp14>SHOULD</bcp14> parse the template and enforce the constraints if it is
possible during the processing of template creation, e.g., servers
may validate type constraints for the leaf, including those defined
in the type's "range", "length", and "pattern" properties. Implementations
may also consider using mechanism defined in <xref target="I-D.ietf-netmod-yang-anydata-validation"/> to validate anydata.</t>
        <ul empty="true">
          <li>
            <t>Editor's Note: Should the validity of template configuration be mandatory or optional?</t>
          </li>
        </ul>
        <t>That said, if a template is applied in the configuration data tree,
the results of the template configuration merging with configuration
explicitly provided by the client <bcp14>MUST</bcp14> always be valid, as defined in
<xref section="8.1" sectionFormat="of" target="RFC7950"/>.</t>
      </section>
    </section>
    <section anchor="interact-NMDA">
      <name>Interaction with NMDA datastores</name>
      <t>Some implementations may have predefined configuration templates for the convenience
of clients, which are present in &lt;system&gt; (if implemented, see <xref target="I-D.ietf-netmod-system-config"/>).
In addition, clients can always define their own templates in &lt;running&gt;.
However, configuration template data defined by "ietf-config-template" YANG data model
should not be visible in &lt;operational&gt; until being inherited by a node in the data tree.</t>
      <t>If a node in the data tree applies a configuration template, the configuration
template does not expand in &lt;running&gt;. A read of &lt;running&gt; returns what is
sent by the client with the "apply-templates" metadata attached to the specific node.
A configuration template which is inherited or overridden by the node instance <bcp14>MUST</bcp14> be expanded in &lt;intended&gt;.</t>
    </section>
    <section anchor="interact-non-NMDA">
      <name>Interaction with Non-NMDA datastores</name>
      <t>TBC</t>
    </section>
    <section anchor="template-yang">
      <name>The "ietf-config-template" YANG Module</name>
      <section anchor="data-model-overview">
        <name>Data Model Overview</name>
        <t>The following tree diagram <xref target="RFC8340"/> illustrates the "ietf-config-template" module:</t>
        <artwork><![CDATA[
module: ietf-config-template
  +--rw templates
     +--rw template* [id]
        +--rw id               string
        +--rw description?     string
        +--rw content?         <anydata>
        +--ro last-modified?   yang:timestamp
]]></artwork>
        <ul empty="true">
          <li>
            <t>Editor's Note: Should we use the RFC7952 metadata annotation for the 'apply-templates' metadata here?</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>Editor's Note: the current definition of template configuration
      uses anydata, but this may not be able to be validated at template
      definition time because anydata is opaque.</t>
          </li>
        </ul>
      </section>
      <section anchor="yang-module">
        <name>YANG Module</name>
        <sourcecode markers="true" name="ietf-template@2025-05-28.yang"><![CDATA[
module ietf-config-template {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-config-template";
  prefix ct;

  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types";
  }

  organization
    "IETF NETMOD (Network Modeling) Working Group";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
     WG List:  <mailto:netmod@ietf.org>
     Author: Qiufang Ma
             <mailto:maqiufang1@huawei.com>";
             
  description
    "This module defines a template list with a RPC to expand
     the template.

     Copyright (c) 2025 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 Revised
     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 XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC
     itself for full legal notices.

     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.";

   revision 2025-05-28 {
     description
       "Initial revision.";
     reference
       "RFC XXXX: YANG Templates";
   }

   container templates {
     description
       "Specifies the template parameters.";
     list template {
       key id;
       description
         "The list of templates managed on this device.";
       leaf id {
         type string;
         description
           "The identifier of the template that uniquely identifies a
            template.";
       }
       leaf description {
         type string;
         description
           "A textual description of the template.";
       }
       anydata content {
         description
           "inline template content.";
       }
       leaf last-modified {
         type yang:timestamp;
         config false;
         description
           "Timestamp when the template is modified last time.";
       }
     }
   }
}

]]></sourcecode>
      </section>
    </section>
    <section anchor="operational-consideration">
      <name>Operational Considerations</name>
      <t>Implementations <bcp14>MAY</bcp14> restrict the applications of configuration templates to some specific nodes in the YANG data tree. Restrictions should be applied consistently across all client operations. Any attempts to apply a template to a restricted node will be rejected. Implementations are recommended to expose the list of configuration nodes that do not support template application, any mechanisms to achieve this are outside the scope of this document.</t>
      <t>Configuration templates are designed to remain unexpanded in &lt;running&gt;. This ensures storage efficiency and preserves the client's control over &lt;running&gt;, i.e., reads of &lt;running&gt; returns the client-submitted configuration with the "apply-templates" metadata attached to target nodes. Any configuration template that is applied in the data tree <bcp14>MUST</bcp14> be expanded in &lt;intended&gt;, which holds a merged result of template expansion and configuration explicitly provided by clients.</t>
      <t>Implementations <bcp14>MAY</bcp14> differ in whether the configuration templates themselves appear in &lt;intended&gt;, independent of whether the templates are applied. Implementations <bcp14>MAY</bcp14> also support conditional visibility, where templates appear in &lt;intended&gt; only when they are applied by at least one node via the "apply-templates" annotation. Regardless of the approach chosen, implementations <bcp14>MUST</bcp14> ensure the behavior is consistent and deterministic, and <bcp14>SHOULD</bcp14> be documented to allow clients to rely on predictable operational behaviors.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="the-ietf-xml-registry">
        <name>The "IETF XML" Registry</name>
        <t>This document registers the following URI in the "IETF XML Registry" <xref target="RFC3688"/>.</t>
        <artwork><![CDATA[
        URI: urn:ietf:params:xml:ns:yang:ietf-config-template
        Registrant Contact: The IESG.
        XML: N/A, the requested URI is an XML namespace.
]]></artwork>
      </section>
      <section anchor="the-yang-module-names-registry">
        <name>The "YANG Module Names" Registry</name>
        <t>This document registers the following YANG module in the "YANG Module Names"
   registry <xref target="RFC6020"/>.</t>
        <artwork><![CDATA[
        name:               ietf-config-template
        namespace:          urn:ietf:params:xml:ns:yang:ietf-config-template
        prefix:             ct
        maintained by IANA? N
        reference:          RFC XXXX
]]></artwork>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC6241">
          <front>
            <title>Network Configuration Protocol (NETCONF)</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns"/>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <author fullname="A. Bierman" initials="A." role="editor" surname="Bierman"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices. It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages. The NETCONF protocol operations are realized as remote procedure calls (RPCs). This document obsoletes RFC 4741. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6241"/>
          <seriesInfo name="DOI" value="10.17487/RFC6241"/>
        </reference>
        <reference anchor="RFC8040">
          <front>
            <title>RESTCONF Protocol</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes an HTTP-based protocol that provides a programmatic interface for accessing data defined in YANG, using the datastore concepts defined in the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8040"/>
          <seriesInfo name="DOI" value="10.17487/RFC8040"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC7950">
          <front>
            <title>The YANG 1.1 Data Modeling Language</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols. This document describes the syntax and semantics of version 1.1 of the YANG language. YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification. There are a small number of backward incompatibilities from YANG version 1. This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7950"/>
          <seriesInfo name="DOI" value="10.17487/RFC7950"/>
        </reference>
        <reference anchor="RFC3688">
          <front>
            <title>The IETF XML Registry</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <date month="January" year="2004"/>
            <abstract>
              <t>This document describes an IANA maintained registry for IETF standards which use Extensible Markup Language (XML) related items such as Namespaces, Document Type Declarations (DTDs), Schemas, and Resource Description Framework (RDF) Schemas.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="81"/>
          <seriesInfo name="RFC" value="3688"/>
          <seriesInfo name="DOI" value="10.17487/RFC3688"/>
        </reference>
        <reference anchor="RFC6020">
          <front>
            <title>YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="October" year="2010"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration and state data manipulated by the Network Configuration Protocol (NETCONF), NETCONF remote procedure calls, and NETCONF notifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6020"/>
          <seriesInfo name="DOI" value="10.17487/RFC6020"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC8342">
          <front>
            <title>Network Management Datastore Architecture (NMDA)</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." surname="Schoenwaelder"/>
            <author fullname="P. Shafer" initials="P." surname="Shafer"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="R. Wilton" initials="R." surname="Wilton"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>Datastores are a fundamental concept binding the data models written in the YANG data modeling language to network management protocols such as the Network Configuration Protocol (NETCONF) and RESTCONF. This document defines an architectural framework for datastores based on the experience gained with the initial simpler model, addressing requirements that were not well supported in the initial model. This document updates RFC 7950.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8342"/>
          <seriesInfo name="DOI" value="10.17487/RFC8342"/>
        </reference>
        <reference anchor="RFC8340">
          <front>
            <title>YANG Tree Diagrams</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="L. Berger" initials="L." role="editor" surname="Berger"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>This document captures the current syntax used in YANG module tree diagrams. The purpose of this document is to provide a single location for this definition. This syntax may be updated from time to time based on the evolution of the YANG language.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="215"/>
          <seriesInfo name="RFC" value="8340"/>
          <seriesInfo name="DOI" value="10.17487/RFC8340"/>
        </reference>
        <reference anchor="RFC7952">
          <front>
            <title>Defining and Using Metadata with YANG</title>
            <author fullname="L. Lhotka" initials="L." surname="Lhotka"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document defines a YANG extension that allows for defining metadata annotations in YANG modules. The document also specifies XML and JSON encoding of annotations and other rules for annotating instances of YANG data nodes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7952"/>
          <seriesInfo name="DOI" value="10.17487/RFC7952"/>
        </reference>
        <reference anchor="I-D.ietf-netmod-yang-anydata-validation">
          <front>
            <title>Validating anydata in YANG Library context</title>
            <author fullname="Ahmed Elhassany" initials="A." surname="Elhassany">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <date day="2" month="December" year="2025"/>
            <abstract>
              <t>   This document describes a method to use YANG RFC 8525 and standard
   YANG validation rules in RFC 7950 to validate YANG data nodes that
   are children of an "anydata" data node.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netmod-yang-anydata-validation-00"/>
        </reference>
        <reference anchor="I-D.ietf-netmod-system-config">
          <front>
            <title>System-defined Configuration</title>
            <author fullname="Qiufang Ma" initials="Q." surname="Ma">
              <organization>Huawei</organization>
            </author>
            <author fullname="Qin Wu" initials="Q." surname="Wu">
              <organization>Huawei</organization>
            </author>
            <author fullname="Chong Feng" initials="C." surname="Feng">
         </author>
            <date day="28" month="January" year="2026"/>
            <abstract>
              <t>   The Network Management Datastore Architecture (NMDA) in RFC 8342
   defines several configuration datastores holding configuration.  The
   contents of these configuration datastores are controlled by clients.
   This document introduces the concept of system configuration
   datastore holding configuration controlled by the system on which a
   server is running.  The system configuration can be referenced (e.g.,
   leafref) by configuration explicitly created by clients.

   This document updates RFC 8342.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netmod-system-config-20"/>
        </reference>
      </references>
    </references>
    <?line 746?>

<section anchor="requirement-implementation-status">
      <name>Requirement Implementation Status</name>
      <t>Note to the RFC Editor: Please remove this section before publication.</t>
      <t>This appendix aims to track which of identified requirements have been addressed in the current version, and, where applicable, how they are fulfilled by the proposed mechanism.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Requirement</th>
            <th align="left">Fulfilled</th>
            <th align="left">Requirement Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">R1: Allowed Multiple templates to be applied at a single node</td>
            <td align="left">Y</td>
            <td align="left">see <xref target="inheriting-temp"/></td>
          </tr>
          <tr>
            <td align="left">R2: Templates must work with any YANG module</td>
            <td align="left">Y</td>
            <td align="left">see <xref target="define-templates"/></td>
          </tr>
          <tr>
            <td align="left">R3: Templates must be validated when defined</td>
            <td align="left">N</td>
            <td align="left">Needs further discussion, see Editor's note from <xref target="define-templates"/></td>
          </tr>
          <tr>
            <td align="left">R4: Local-config overrides template-config</td>
            <td align="left">Y</td>
            <td align="left">see <xref target="overriding-temp"/></td>
          </tr>
          <tr>
            <td align="left">R5: Living template: modified template data gets expanded for all consumers</td>
            <td align="left">Y</td>
            <td align="left">see <xref target="expand-templates"/></td>
          </tr>
          <tr>
            <td align="left">R6: Support basic programmatic elements in templates</td>
            <td align="left">N</td>
            <td align="left">Seems to add some complexity</td>
          </tr>
          <tr>
            <td align="left">R7: Allow a server to constrain which nodes can be templates consumer</td>
            <td align="left">Y</td>
            <td align="left">See <xref target="operational-consideration"/></td>
          </tr>
          <tr>
            <td align="left">R8: Configuration with both expanded and unexpanded templates is able to be returned</td>
            <td align="left">Y</td>
            <td align="left">see <xref target="interact-NMDA"/> and <xref target="operational-consideration"/></td>
          </tr>
          <tr>
            <td align="left">R9: &lt;running&gt; contains the unexpanded template</td>
            <td align="left">Y</td>
            <td align="left">see <xref target="interact-NMDA"/>, also stated explicitly in <xref target="operational-consideration"/></td>
          </tr>
          <tr>
            <td align="left">R10: &lt;intended&gt; contains the expanded template</td>
            <td align="left">Y</td>
            <td align="left">see <xref target="interact-NMDA"/>, also stated explicitly in <xref target="operational-consideration"/></td>
          </tr>
          <tr>
            <td align="left">R11: Enables off-box template expansion of &lt;running&gt;</td>
            <td align="left">Y</td>
            <td align="left">see <xref target="expand-templates"/></td>
          </tr>
          <tr>
            <td align="left">R12: Support limited regex in templates</td>
            <td align="left">Y</td>
            <td align="left">But needs more work, see <xref target="regex"/></td>
          </tr>
          <tr>
            <td align="left">R13: Have a precedence rule when multiple templates are applied at a single node</td>
            <td align="left">Y</td>
            <td align="left">See <xref target="expand-templates"/></td>
          </tr>
          <tr>
            <td align="left">R14: The innermost template takes precedence when templates are applied at multiple ancestor nodes</td>
            <td align="left">Y</td>
            <td align="left">See <xref target="expand-templates"/></td>
          </tr>
          <tr>
            <td align="left">R15: Enable non-NMDA servers to return the expanded data</td>
            <td align="left">N</td>
            <td align="left">have a dedicated section (<xref target="interact-non-NMDA"/>) for this, but empty now</td>
          </tr>
          <tr>
            <td align="left">Not discussed: R16: exclude templates applied at ancestor nodes</td>
            <td align="left">N</td>
            <td align="left">Seems to add some complexity, needs further discussion</td>
          </tr>
          <tr>
            <td align="left">Not discussed: R17: Annotations to determine which template a node was applied from</td>
            <td align="left">N</td>
            <td align="left">Needs further discussion</td>
          </tr>
        </tbody>
      </table>
      <!--
# Usage Examples {#appendix-network}

This section provides some examples to show the use of templates.
JSON encodings are used to not imply a preference in this document.
The fictional data model used throughout this section is shown as follows:

~~~~
module example-network-systime {
  yang-version 1.1;
  namespace "urn:example:network-system-time";
  prefix "ex-nesyst";

  import ietf-inet-types {
    prefix "inet";
  }
  
  list network-device {
    key device-id;
    leaf device-id {
      type string;
    }
    container ntp {
      leaf enabled {
        type boolean;
        mandatory true;
      }
      list server {
        ordered-by user;
        key name;
        leaf name {
          type string;
        }
        leaf-list alias {
          type string;
        }
        leaf address {
          type inet:host;
          mandatory true;
        }
        leaf port {
          type inet:port-number;
          default 123;
        }
      }
    }
  }
}
~~~~

## Creating Templates {#template-creation}

The NTP configuration on multiple network devices may be consistent. To create a
template for NTP configuration, the following template configuration might be sent to a SDN controller:

~~~~
{
    "ietf-templates:templates": {
        "template": [
            {
                "id": "template-ntp",
                "content": {
                    "network-device": [
                        {
                            "ntp": {
                                "enabled": "true",
                                "server": [
                                    {
                                        "name": "ntp-server-1",
                                        "alias": [
                                            "primary"
                                        ],
                                        "address": "ntp.example-1.com"
                                    },
                                    {
                                        "name": "ntp-server-2",
                                        "alias": [
                                            "secondary"
                                        ],
                                        "address": "ntp.example-2.com"
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        ]
    }
}
~~~~

## Applying Templates

The operator may create another template with an additional NTP server instance
when inheriting the template created in {{template-creation}}. The configuration
is shown as follows:

~~~~
{
    "ietf-templates:templates": {
        "template": [
            {
                "id": "template-ntp2",
                "content": {
                    "network-device": [
                        {
                            "@": {
                                "ietf-template:stmt-extend": "template-ntp"
                            },
                            "ntp": {
                                "server": [
                                    {
                                        "name": "ntp-server-3",
                                        "alias": [
                                            "secondary"
                                        ],
                                        "address": "ntp.example-3.com"
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        ]
    }
}
~~~~

The configuration of template "template-ntp2" renders the following expanded configuration:

~~~~
{
    "ietf-templates:templates": {
        "template": [
            {
                "id": "template-ntp2",
                "content": {
                    "network-device": [
                        {
                            "ntp": {
                                "enabled": "true",
                                "server": [
                                    {
                                        "name": "ntp-server-1",
                                        "alias": [
                                            "primary"
                                        ],
                                        "address": "ntp.example-1.com",
                                        "prefer": true
                                    },
                                    {
                                        "name": "ntp-server-2",
                                        "alias": [
                                            "secondary"
                                        ],
                                        "address": "ntp.example-2.com"
                                    },
                                    {
                                        "name": "ntp-server-3",
                                        "alias": [
                                            "secondary"
                                        ],
                                        "address": "ntp.example-3.com"
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        ]
    }
}
~~~~

the following shows the network-level ntp configuration
using "template-ntp" and "template-ntp2" that may be sent to a SDN controller:

~~~~
{
    "example-network-systime:network-device": [
        {
            "@": {
                "ietf-template:stmt-extend": "template-ntp"
            },
            "device-id": "ne-0"
        },
        {
            "@": {
                "ietf-template:stmt-extend": "template-ntp"
            },
            "device-id": "ne-1"
        },
        {
            "@": {
                "ietf-template:stmt-extend": "template-ntp2"
            },
            "device-id": "ne-2"
        },
        {
            "@": {
                "ietf-template:stmt-extend": "template-ntp2"
            },
            "device-id": "ne-3"
        }
    ]
}
~~~~

And it renders the following expanded configuration:

~~~~
{
    "example-network-systime:network-device": [
        {
            "device-id": "ne-0",
            "ntp": {
                "enabled": "true",
                "server": [
                    {
                        "name": "ntp-server-1",
                        "alias": [
                            "primary"
                        ],
                        "address": "ntp.example-1.com"
                    },
                    {
                        "name": "ntp-server-2",
                        "alias": [
                            "secondary"
                        ],
                        "address": "ntp.example-2.com"
                    }
                ]
            }
        },
        {
            "device-id": "ne-1",
            "ntp": {
                "enabled": "true",
                "server": [
                    {
                        "name": "ntp-server-1",
                        "alias": [
                            "primary"
                        ],
                        "address": "ntp.example-1.com"
                    },
                    {
                        "name": "ntp-server-2",
                        "alias": [
                            "secondary"
                        ],
                        "address": "ntp.example-2.com"
                    }
                ]
            }
        },
        {
            "device-id": "ne-2",
            "ntp": {
                "enabled": "true",
                "server": [
                    {
                        "name": "ntp-server-1",
                        "alias": [
                            "primary"
                        ],
                        "address": "ntp.example-1.com"
                    },
                    {
                        "name": "ntp-server-2",
                        "alias": [
                            "secondary"
                        ],
                        "address": "ntp.example-2.com"
                    },
                    {
                        "name": "ntp-server-3",
                        "alias": [
                            "secondary"
                        ],
                        "address": "ntp.example-3.com"
                    }
                ]
            }
        },
        {
            "device-id": "ne-3",
            "ntp": {
                "enabled": "true",
                "server": [
                    {
                        "name": "ntp-server-1",
                        "alias": [
                            "primary"
                        ],
                        "address": "ntp.example-1.com"
                    },
                    {
                        "name": "ntp-server-2",
                        "alias": [
                            "secondary"
                        ],
                        "address": "ntp.example-2.com"
                    },
                    {
                        "name": "ntp-server-3",
                        "alias": [
                            "secondary"
                        ],
                        "address": "ntp.example-3.com"
                    }
                ]
            }
        }
    ]
}
~~~~

## Overriding Templates

The client may override the template created in {{template-creation}} to specify
the NTP server named "ntp-server-2" as the perferred one for device "ne-4":

~~~~
{
    "example-network-systime:network-device": [
        {
            "@": {
                "ietf-template:stmt-extend": "template-ntp"
            },
            "device-id": "ne-4",
            "server": [
                {
                    "name": "ntp-server-1",
                    "alias": [
                        "primary",
                        "secondary"
                    ],
                    "@alias": [
                        {
                            "ietf-template:operation-tag": "delete"
                        }
                    ],
                    "address": "ntp.example-1.com"
                },
                {
                    "@": {
                        "ietf-template:operation-tag": "position-first"
                    },
                    "name": "ntp-server-2",
                    "alias": [
                        "primary",
                        "secondary"
                    ],
                    "@alias": [
                        null,
                        {
                            "ietf-template:operation-tag": "delete"
                        }
                    ],
                    "address": "ntp.example-2.com"
                }
            ]
        }
    ]
}
~~~~

It is equivalent to the configuration as follows:

~~~~
{
    "example-network-systime:network-device": [
        {
            "device-id": "ne-4",
            "ntp": {
                "enabled": "true",
                "server": [
                    {
                        "name": "ntp-server-2",
                        "alias": [
                            "primary"
                        ],
                        "address": "ntp.example-2.com"
                    },
                    {
                        "name": "ntp-server-1",
                        "alias": [
                            "secondary"
                        ],
                        "address": "ntp.example-1.com"
                    }
                ]
            }
        }
    ]
}
~~~~
-->

</section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author would like to thank Lou Berger, Jason Sterne, Kent Watsen, and Robert
Wilton for comments and contributions made during interim meetings.</t>
      <t>The author would like to acknowledge the following drafts and
presenters for kick-starting discussions on Yang Templates:</t>
      <ul spacing="normal">
        <li>
          <t>draft-ma-netmod-yang-config-template-00</t>
        </li>
        <li>
          <t>draft-rajaram-netmod-yang-cfg-template-framework-00</t>
        </li>
        <li>
          <t>draft-wills-netmod-yang-templates-00</t>
        </li>
        <li>
          <t>Jan Lindblad</t>
        </li>
      </ul>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact fullname="Qin Wu">
        <organization>Huawei</organization>
        <address>
          <postal>
            <street>101 Software Avenue, Yuhua District</street>
            <city>Jiangsu</city>
            <code>210012</code>
            <country>China</country>
          </postal>
          <email>bill.wu@huawei.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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
6r1nTO/fANNXvvXjxjeGx/d/0p3Nf6/560cR3I7Q7jauY/nMrg92nMPKdxG0
0gSmKWnkSIctccXv/QLpK0rX1DAGfNPXxlBa5cnyTW9+Z02rLS4nprmqU2K2
wcZ6j8K5j9jfp3T+4nqy2UPFtKyW1Zi+OKWrbDZT5WYeur6ueK+C/+6/rUC6
++8okDqs7mUXW9z3Vp3l/oPkwwfr7fo/v6L1doN5OFwxku+ov86QD1bfNaH6
+Vbf+8D0B3Wmfk/qzFdMaLKysjIyXnr6V6uWfctXGX3jjO9GtjSgfLHG+gZh
i4Ho43SD3vFpdsDufFs7s8U3IxtAJArR493mdefVXxWkvfcB0v7NYNr/DcJ0
14GJfvvRcsYBfw/cz7Dgfj4ddymttZ8hA+oaBtNVBtKwGripAXRNMX+1gbNB
iL9F+GlAHd5s35sMi+vu+xrq7C12vsEw6CoRX4FcXoNRuxLnA2kOrfGBNH9V
0mwj4gNpNmt8IM3rk+a72Pkm9+jX3fkG9+aXYMo2Ij4wZbPGB6b8wJTvkilb
ns1AH91O01zbKfdG2TAqe+KvxqDogpNu4+8d82lOSSu8lS7msBxd2eQqCSnm
QWFxb/Q7DxHca0u7DRJrKOp+fUl1DZq1EmoDTV5B0gPkPPri6tWvSAv4h2BL
XMdVeIYY4AZxw3w2ECMbwtWNpG2PvBk4r825z6v2uMpLyleP6QtJbyT7biLb
f/OUktVpOrzw74COBnSXP3cjuduymr+sBq+QnIephE+79wsHiwzefQiqI8l+
M3bbu7Bffgm77Ze2Xt6FvfrLWC+bLNa3tV7G4wd4H+0gMi1fuV/KmylXiOr4
8xH1BBhJFSf3pZFvHE+TV3JFLcxeqSd5rb7Ei8LFjvomLOkqG/af3lF/Rk57
GVal6dzxPIe5q+Al9u3hXlV8Lb0qzTVi28oGS0Fj28aSau+TpVpq+kqycrIB
qjBq2tj64ea4COe8VCDt/zAkjWC8SiLgavNVzE09e4nFqt+Hrn3HzZFpqvEy
9LpMtq4Yjnd3nXeL8B94M9EfMHfenmM/DxIn3ji84F96o2wNg3nxmzBTT5Is
nqVhHPw/D4QbD7idAAA=

-->

</rfc>
