<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml.resource.org. -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
     There has to be one entity for each item to be referenced.
     An alternate method (rfc include) is described in the references. -->
<!ENTITY RFC2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC6241 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6241.xml">
<!ENTITY RFC7950 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7950.xml">
<!ENTITY RFC7149 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7149.xml">
<!ENTITY RFC7426 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7426.xml">
<!ENTITY RFC8299 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8299.xml">
<!ENTITY RFC8309 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8309.xml">
<!ENTITY RFC8340 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8340.xml">
<!ENTITY RFC8453 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8453.xml">
<!ENTITY RFC8174 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC8345 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8345.xml">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs),
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="4"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc category="std" docName="draft-ietf-netmod-system-config-05"
     ipr="trust200902" submissionType="IETF" updates="8342,6241,8526,8040">
  <front>
    <title abbrev="System-defined Configuration">System-defined
    Configuration</title>

    <author fullname="Qiufang Ma" initials="Q." role="editor" surname="Ma">
      <organization>Huawei</organization>

      <address>
        <postal>
          <street>101 Software Avenue, Yuhua District</street>

          <city>Nanjing</city>

          <region>Jiangsu</region>

          <code>210012</code>

          <country>China</country>
        </postal>

        <email>maqiufang1@huawei.com</email>
      </address>
    </author>

    <author fullname="Qin Wu" initials="Q." surname="Wu">
      <organization>Huawei</organization>

      <address>
        <postal>
          <street>101 Software Avenue, Yuhua District</street>

          <city>Nanjing</city>

          <region>Jiangsu</region>

          <code>210012</code>

          <country>China</country>
        </postal>

        <email>bill.wu@huawei.com</email>
      </address>
    </author>

    <author fullname="Feng Chong" initials="C." surname="Feng">
      <organization/>

      <address>
        <email>fengchongllly@gmail.com</email>
      </address>
    </author>

    <date year="2024"/>

    <area>ops</area>

    <workgroup>NETMOD</workgroup>

    <keyword>system config</keyword>

    <abstract>
      <t>This document defines how a management client and server handle
      YANG-modeled configuration data that is defined by the server itself.
      The system-defined configuration can be referenced (e.g. leafref) by
      configuration explicitly created by a client.</t>

      <t>The Network Management Datastore Architecture (NMDA) defined in RFC
      8342 is updated with a read-only conventional configuration datastore
      called "system" to hold system-defined configuration.</t>

      <t>As an alternative to clients explicitly copying referenced
      system-defined configuration into the target configuration datastore
      (e.g., &lt;running&gt;) so that the datastore is valid, a
      "resolve-system" parameter is defined to allow the server acting as a
      "system client" to copy referenced system nodes automatically. This
      solution enables clients manipulating the target configuration datastore
      (e.g., &lt;running&gt;) to reference nodes defined in &lt;system&gt;,
      override system-provided values, and configure descendant nodes of
      system-defined configuration.</t>

      <t>This document updates RFC 8342, RFC 6241, RFC 8526 and RFC 8040.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="Introduction" title="Introduction">
      <t>The Network Management Datastore Architecture (NMDA) <xref
      target="RFC8342"/> defines system configuration as the configuration
      that is supplied by the device itself and appears in &lt;operational&gt;
      when it is in use (Figure 2 in <xref target="RFC8342"/>).</t>

      <t>However, there is a desire to enable a server to better structure and
      expose the system configuration. NETCONF/RESTCONF clients can benefit
      from a standard mechanism to retrieve what system configuration is
      available on a server.</t>

      <t>Some servers allow the NETCONF/RESTCONF client to reference a
      system-defined node which isn't present in the target datastore (e.g.,
      &lt;running&gt;). The absence of the system configuration in the
      datastore can render the datastore invalid from the perspective of a
      client or offline tools (e.g., missing leafref targets). This document
      describes several approaches to bring the datastore to a valid state and
      satisfy referential integrity constraints.</t>

      <t>Some servers allow the descendant nodes of system-defined
      configuration to be configured or modified. For example, the system
      configuration may contain an almost empty physical interface, while the
      client needs to be able to add, modify, or remove a number of descendant
      nodes. Some descendant nodes may not be modifiable (e.g., the interface
      "type" set by the system).</t>

      <t>This document updates the Network Management Datastore Architecture
      (NMDA) defined in RFC 8342 with a read-only conventional configuration
      datastore called "system" to hold system-defined configuration.</t>

      <t>As an alternative to clients explicitly copying referenced
      system-defined configuration into the target configuration datastore
      (e.g., &lt;running&gt;) so that the datastore is valid, a
      "resolve-system" parameter is defined to allow the server acting as a
      "system client" to copy referenced system nodes automatically. This
      solution enables clients manipulating the target configuration datastore
      (e.g., &lt;running&gt;) to reference nodes defined in &lt;system&gt;,
      override system-provided values, and configure descendant nodes of
      system-defined configuration.</t>

      <t>If a system-defined node is referenced, it refers to one of the
      following cases throughout this document:<list style="symbols">
          <t>It is present in a leafref "path" statement and referred as the
          leafref value</t>

          <t>It is used as an "instance-identifier" type value</t>

          <t>It is present in an XPath expression of "when" or "must"
          constraints</t>

          <t>It is defined to satisfy the "mandatory" constraints</t>

          <t>It is defined to exactly satisfy the "min-element"
          constraints</t>
        </list></t>

      <t>Conformance to this document requires the NMDA servers to implement
      the "ietf-system-datastore" YANG module (<xref
      target="system-datastore"/>).</t>

      <section anchor="terminology" title="Terminology">
        <t>This document assumes that the reader is familiar with the contents
        of <xref target="RFC6241"/>, <xref target="RFC7950"/>, <xref
        target="RFC8342"/>, <xref target="RFC8407"/>, and <xref
        target="RFC8525"/> and uses terminologies from those documents.</t>

        <t>The following terms are defined in this document:<list
            style="hanging">
            <t hangText="System configuration: ">Configuration that is
            provided by the system itself. System configuration is present in
            the system configuration datastore (regardless of whether it is
            applied or referenced) and appears in &lt;intended&gt; unless
            explicitly overridden. System configuration that is considered
            active appears in &lt;operational&gt; with origin="system". It is
            a different and separate concept from factory default
            configuration defined in RFC 8808 (which represents a preset
            initial configuration that is used to initialize the configuration
            of a server).<vspace blankLines="1"/></t>

            <t hangText="System configuration datastore: ">A configuration
            datastore holding configuration provided by the system itself.
            This datastore is referred to as "&lt;system&gt;".</t>
          </list>This document redefines the term "conventional configuration
        datastore" in Section 3 of <xref target="RFC8342"/> to add "system" to
        the list of conventional configuration datastores:<list
            style="hanging">
            <t hangText="Conventional configuration datastore: ">One of the
            following set of configuration datastores: &lt;running&gt;,
            &lt;startup&gt;, &lt;candidate&gt;, &lt;system&gt;, and
            &lt;intended&gt;. These datastores share a common datastore
            schema, and protocol operations allow copying data between these
            datastores. The term "conventional" is chosen as a generic
            umbrella term for these datastores. <vspace blankLines="1"/></t>
          </list></t>
      </section>

      <section title="Requirements Language">
        <t>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 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only
        when, they appear in all capitals, as shown here.</t>
      </section>

      <section title="Updates to RFC 8342">
        <t>This document updates RFC 8342 to define a configuration datastore
        called "system" to hold system configuration (<xref
        target="system-ds-def"/>), it also redefines the term "conventional
        configuration datastore" from <xref target="RFC8342"/> to add "system"
        to the list of conventional configuration datastores.</t>

        <t>Configuration in &lt;running&gt; is merged into &lt;system&gt; to
        create the contents of &lt;intended&gt; after the configuration
        transformations to &lt;running&gt; (e.g., template expansion, removal
        of inactive configuration defined in <xref target="RFC8342"/>) have
        been performed. This document updates the definition of "intended"
        origin metadata annotation identity to allow a subset of configuration
        provided by &lt;intended&gt; to use "system" as origin value as it
        flows into &lt;operational&gt;. Applied system configuration appears
        in &lt;operational&gt; with origin value being reported as "system"
        (<xref target="conceptual-model"/>).</t>
      </section>

      <section title="Updates to RFC 6241 and RFC 8526">
        <t>This document augments &lt;edit-config&gt; and &lt;edit-data&gt;
        RPC operations defined in <xref target="RFC6241"/> and <xref
        target="RFC8526"/> respectively, with a new additional input parameter
        "resolve-system" to allow the server to copy referenced system nodes
        into target datastore automatically without the client doing so
        explicitly. The &lt;copy-config&gt; RPC operation defined in <xref
        target="RFC6241"/> is also augmented to support "resolve-system"
        parameter (<xref target="resolve-system"/>).</t>

        <t>This document defines a NETCONF protocol capability to indicate
        support for this parameter. NETCONF server that supports
        "resolve-system" parameter MUST advertise the following capability
        identifier:<figure>
            <artwork>urn:ietf:params:netconf:capability:resolve-system:1.0</artwork>
          </figure></t>
      </section>

      <section title="Updates to RFC 8040">
        <t>This document extends Sections 4.8 and 9.1.1 of <xref
        target="RFC8040"/> to add a new query parameter "resolve-system" and
        corresponding query parameter capability URI.</t>

        <section title="Query Parameter">
          <t>The "resolve-system" parameter controls whether to allow a server
          to copy any referenced system-defined configuration automatically
          without the client doing so explicitly. This parameter is only
          allowed with no values carried. If this parameter has any unexpected
          value, then a "400 Bad Request" status-line is returned.<figure
              title="RESTCONF &quot;resolve-system&quot; Query Parameter">
              <artwork>+----------------+---------+-----------------------------------------+
| Name           | Methods | Description                             |
+----------------+---------+-----------------------------------------+
|resolve-system  | POST,   | resolve any references not resolved by  |
|                | PUT     | the client and copy referenced          |
|                | PATCH   | system configuration into &lt;running&gt;     |
|                |         | automatically. This parameter can be    |
|                |         | given in any order.                     |
+----------------+---------+-----------------------------------------+</artwork>
            </figure></t>
        </section>

        <section title="Query Parameter URI">
          <t>To enable a RESTCONF client to discover if the "resolve-system"
          query parameter is supported by the server, the following capability
          URI is defined, which is advertised by the server if supported,
          using the "ietf-restconf-monitoring" module defined in RFC
          8040:<figure>
              <artwork>urn:ietf:params:restconf:capability:resolve-system:1.0</artwork>
            </figure></t>
        </section>
      </section>
    </section>

    <section anchor="categories" title="Kinds of System Configuration">
      <t>There are three types of system configurations defined in this
      document: immediately-active system configuration, conditionally-active
      system configuration, and inactive-until-referenced system
      configuration.</t>

      <t>Active system configuration refers to system configuration that is
      currently in use. As per definition of the operational state datastore
      in <xref target="RFC8342"/>, if system configuration is inactive, it
      does not appear in &lt;operational&gt;. However, system configuration is
      present in &lt;system&gt; once it is generated, regardless of whether it
      is active or not.</t>

      <section title="Immediately-Active">
        <t>Immediately-active refers to system configuration which is
        generated in &lt;system&gt; and applied immediately when the device is
        powered on (e.g., a loopback interface), irrespective of physical
        resource present or not, a special functionality enabled or not.</t>
      </section>

      <section title="Conditionally-Active">
        <t>System configuration which is generated in &lt;system&gt; and
        applied based on specific conditions being met in a system, e.g., if a
        physical resource is present (e.g., insert interface card), the system
        will automatically detect it and load associated configuration; when
        the physical resource is not present (remove interface card), the
        system configuration will be automatically cleared. Another example is
        when a special functionality is enabled, e.g., when a QoS feature is
        enabled, related QoS policies are automatically created by the
        system.</t>
      </section>

      <section title="Inactive-Until-Referenced">
        <t>There are some system configuration predefined (e.g., application
        ids, anti-x signatures, trust anchor certs, etc.) as a convenience for
        the clients, which must be referenced to be active. The clients can
        also define their own configurations for their unique requirements.
        Inactive-until-referenced system configuration is generated in
        &lt;system&gt; immediately when the device is powered on, but it is
        not active until being referenced.</t>
      </section>
    </section>

    <section anchor="system-ds-def"
             title="The System Configuration Datastore (&lt;system&gt;)">
      <t>NMDA servers compliant with this document MUST implement a system
      configuration datastore, and they SHOULD also implement
      &lt;intended&gt;.</t>

      <t>Following guidelines for defining datastores in the appendix A of
      [RFC8342], this document introduces a new datastore resource named
      'system' that represents the system configuration.</t>

      <t><list style="symbols">
          <t>Name: "system"</t>

          <t>YANG modules: all</t>

          <t>YANG nodes: all "config true" data nodes up to the root of the
          tree, generated by the system</t>

          <t>Management operations: The content of the datastore is set by the
          server in an implementation dependent manner. The content can not be
          changed by management operations via protocols such as NETCONF,
          RESTCONF, but may change itself by license change, device upgrade
          and/or system-controlled resources change. The datastore can be read
          using the standard network management protocols such as NETCONF and
          RESCTCONF.</t>

          <t>Origin: This document does not define any new origin identity
          when it interacts with &lt;intended&gt; and flows into
          &lt;operational&gt;. The "system" origin Metadata Annotation <xref
          target="RFC7952"/> is used to indicate the origin of a data item is
          system, which is achieved by updating the definition of "intended"
          origin metadata annotation in <xref target="RFC8342"/>. <vspace
          blankLines="1"/></t>

          <t>Protocols: YANG-driven management protocols, such as NETCONF and
          RESTCONF.</t>

          <t>Defining YANG module: "ietf-system-datastore".</t>
        </list></t>

      <t>The datastore's content is defined by the server and read-only to
      clients. Upon the content is created or changed, it will be merged into
      &lt;intended&gt;. Unlike &lt;factory-default&gt; <xref
      target="RFC8808"/>, it MAY change dynamically, e.g., depending on
      factors like license change, device upgrade or system-controlled
      resources change (e.g., HW available). The system configuration
      datastore doesn't persist across reboots; &lt;factory-reset&gt; RPC
      operation defined in <xref target="RFC8808"/> can reset it to its
      factory default configuration without including configuration generated
      due to the system update or client-enabled functionality.</t>

      <t>The system datastore is defined as a conventional configuration
      datastore and shares a common datastore schema with other conventional
      datastores.</t>
    </section>

    <section title="Static Characteristics of &lt;system&gt;">
      <section title="Read-only to Clients">
        <t>The system datastore is read-only (i.e., edits towards
        &lt;system&gt; directly MUST be denied), though the client may be
        allowed to override the value of a system-initialized node (see <xref
        target="modifying"/>).</t>
      </section>

      <section title="May Change via Software Upgrades or Resource Changes">
        <t>System configuration may change dynamically, e.g., depending on
        factors like license change, device upgrade, or system-controlled
        resources (e.g., HW available) change. In some implementations, when a
        QoS feature is enabled, QoS-related policies are created by the
        system. The updates of system configuration may be obtained through
        YANG notifications (e.g., on-change notification) <xref
        target="RFC6470"/><xref target="RFC8639"/><xref
        target="RFC8641"/>.</t>

        <t>If system configuration changes (e.g., due to device upgrade),
        &lt;running&gt; MAY become invalid. The server behaviors of migrating
        updated system data into &lt;running&gt; is beyond the scope of this
        document. That said, the following gives a list of examples of server
        implementations that might be possible:<list style="symbols">
            <t>Servers migrate system configuration update into
            &lt;running&gt; with the clients' awareness to keep
            &lt;running&gt; valid</t>

            <t>Servers don't migrate any system configuration update into
            &lt;running&gt; and clients are responsible to correct the
            configuration in &lt;running&gt; if it becomes invalid</t>

            <t>Servers rejects the operation to change system configuration
            (e.g., device upgrade fails) and needs the client to correct the
            configuration in &lt;running&gt; as a prerequisite to ensure
            validity</t>
          </list></t>
      </section>

      <section title="No Impact to &lt;operational&gt;">
        <t>This work intends to have no impact to &lt;operational&gt;. System
        configuration appears in &lt;operational&gt; with origin value being
        reported as "system" if not configured or overridden explicitly in
        &lt;running&gt;. This document enables a subset of those system
        generated nodes to be defined like configuration, i.e., made visible
        to clients in order for being referenced or configurable prior to
        present in &lt;operational&gt;. "Config false" nodes are out of scope,
        hence existing "config false" nodes are not impacted by this work.</t>
      </section>
    </section>

    <section title="Dynamic Behaviors">
      <section anchor="conceptual-model"
               title="Conceptual Model of Datastores">
        <t>This document introduces a datastore named "system" which is used
        to hold all three types of system configurations defined in <xref
        target="categories"/>.</t>

        <t>When the device is powered on, immediately-active system
        configuration is generated in &lt;system&gt; and active immediately,
        but inactive-until-referenced system configuration only becomes active
        if referenced by client-defined configuration. However,
        conditionally-active system configuration will only be created and
        active when specific conditions on system resources are met.</t>

        <t>All above three types of system configurations appear in
        &lt;system&gt;. Clients MAY reference nodes defined in &lt;system&gt;,
        override system-provided values, and configure descendant nodes of
        system-defined configuration, by copying or writing intended
        configurations into the target configuration datastore (e.g.,
        &lt;running&gt;).</t>

        <t>To ensure the validity of &lt;intended&gt;, configuration in
        &lt;running&gt; is merged into &lt;system&gt; to become
        &lt;intended&gt;, in which process, configuration appearing in
        &lt;running&gt; takes precedence over the same node in &lt;system&gt;;
        additional nodes to a list entry or new list/leaf-list entries
        appearing in &lt;running&gt; extends the list entry or the whole
        list/leaf-list defined in &lt;system&gt; if the server allows the
        list/leaf-list to be updated. If &lt;running&gt; includes
        configuration that requires further transformation (e.g., template
        expansion, removal of inactive configuration defined in <xref
        target="RFC8342"/>) before it can be applied, configuration
        transformations MUST be performed before &lt;running&gt; is merged
        into &lt;system&gt;. If a server implements &lt;intended&gt;,
        &lt;system&gt; MUST be merged into &lt;intended&gt;.</t>

        <t>As a result, Figure 2 in Section 5 of RFC 8342 is updated with the
        below conceptual model of datastores which incorporates the system
        configuration datastore.<figure
            title="Architectural Model of Datastores">
            <artwork>             +-------------+                 +-----------+
             | &lt;candidate&gt; |                 | &lt;startup&gt; |
             |  (ct, rw)   |&lt;---+       +---&gt;| (ct, rw)  |
             +-------------+    |       |    +-----------+
                    |           |       |           |
      +-----------+ |         +-----------+         |
      | &lt;system&gt;  | +--------&gt;| &lt;running&gt; |&lt;--------+
      | (ct, ro)  |           | (ct, rw)  |
      +-----+-----+           +----+------+
            |                      | // configuration transformations,
            +--------+             | // e.g., removal of nodes marked
                     |             | // as "inactive", expansion of
                     |&lt;------------+ // templates
                     |
                     V
               +------------+
               | &lt;intended&gt; | // subject to validation
               | (ct, ro)   |
               +------------+
                       |
                       |      // changes applied, subject to
                       |      // local factors, e.g., missing
                       |      // resources, delays
   dynamic             |
   configuration       |   +-------- learned configuration
   datastores -----+   |   +-------- default configuration
                   |   |   |
                   v   v   v
               +---------------+
               | &lt;operational&gt; | &lt;-- system state
               | (ct + cf, ro) |
               +---------------+

  ct = config true; cf = config false
  rw = read-write; ro = read-only
  boxes denote named datastores</artwork>
          </figure></t>

        <t>The "intended" identity of origin value defined in RFC 8342 to
        represent the origin of configuration provided by &lt;intended&gt;,
        this document updates its definition as origin source of configuration
        explicitly provided by &lt;running&gt;, and allows a subset of
        configuration in &lt;intended&gt; that flows from &lt;system&gt; yet
        is not configured or overridden explicitly in &lt;running&gt; to use
        "system" as its origin value. Configuration copied from &lt;system&gt;
        into &lt;running&gt; has its origin value reported as "intended" when
        it flows into &lt;operational&gt;.</t>

        <t>Configuration in &lt;system&gt; is non-deletable to clients, even
        though a client may delete a copied system node from &lt;running&gt;.
        If system initializes a value for a particular leaf which is
        overridden by the client with a different value in &lt;running&gt;,
        the client may delete it in &lt;running&gt;, in which case
        system-initialized value defined in &lt;system&gt; may still be in use
        and appear in &lt;operational&gt;.</t>

        <t>Any deletable system-provided configuration that is populated as
        part of &lt;running&gt; by the system at boot up, without being part
        of the contents of a &lt;startup&gt; datastore, must be defined in
        &lt;factory-default&gt; <xref target="RFC8808"/>, which is used to
        initialize &lt;running&gt; when the device is first-time powered on or
        reset to its factory default condition.</t>
      </section>

      <section title="Explicit Declaration of System Configuration">
        <t>It is possible for a client to explicitly declare system
        configuration nodes in the target datastore (e.g., &lt;running&gt;)
        with the same values as in &lt;system&gt;, by configuring a node
        (list/leaf-list entry, leaf, etc.) in the target datastore (e.g.,
        &lt;running&gt;) that matches the same node and value in
        &lt;system&gt;.</t>

        <t>The explicit configuration of system-defined nodes in the target
        datastore (e.g., &lt;running&gt;) can be useful, for example, when the
        client does not want a "system client" to have a role or not support
        the "resolve-system" parameter but needs the datastore to be
        referentially complete. The client can explicitly declare (i.e.,
        configure in the datastore like &lt;running&gt;) the list entries
        (with at least the keys) that are referenced elsewhere in
        &lt;running&gt;. The client does not necessarily need to declare all
        the contents of the list entry (i.e. the descendant nodes), only the
        parts that are required to make the datastore appear valid.</t>
      </section>

      <section anchor="resolve-system"
               title="Servers Auto-configuring Referenced System Configuration (&quot;resolve-system&quot; parameter)">
        <t>This document defines a new parameter "resolve-system" to the input
        for the &lt;edit-config&gt;, &lt;edit-data&gt;, and
        &lt;copy-config&gt; operations. Clients that are aware of the
        "resolve-system" parameter MAY use this parameter to avoid the
        requirement to provide a referentially complete configuration in
        &lt;running&gt;.</t>

        <t>The "resolve-system" parameter is optional and has no value. If it
        is present, and the server supports this capability, the server MUST
        copy referenced system nodes into the target datastore (e.g.,
        &lt;running&gt;) without the client doing the copy/paste explicitly,
        to resolve any references not resolved by the client. The server
        acting as a "system client" like any other remote clients copies the
        referenced system-defined nodes when triggered by the "resolve-system"
        parameter. Legacy clients interacting with servers that support this
        parameter don't see any changes in &lt;edit-
        config&gt;/&lt;edit-data&gt; and &lt;copy-config&gt; behaviors.</t>

        <t>The server's copy referenced nodes from &lt;system&gt; to the
        target datastore MUST be enforced at the end of the
        &lt;edit-config&gt;/&lt;edit-data&gt; or &lt;copy-config&gt;
        operations during the validation processing, regardless of which
        target datastore it is.</t>

        <t>The server may automatically configure the list entries (with at
        least the keys) in the target datastore (e.g., &lt;running&gt;) that
        are referenced elsewhere by the clients. Similarly, not all the
        contents of the list entry (i.e., the descendant nodes) are
        necessarily copied by the server - only the parts that are required to
        make configuration valid.</t>

        <t>There is no distinction between the configuration in the target
        datastore (e.g., &lt;running&gt;) automatically configured by the
        server and the one explicitly declared by the client, e.g., a read
        back of the datastore (i.e., &lt;get&gt;, &lt;get-config&gt; or
        &lt;get-data&gt; operation) returns automatically configured
        nodes.</t>

        <t>Note that even an auto-configured node is allowed to be deleted
        from the target datastore by the client, the system may automatically
        configure the deleted node again to make configuration valid, when a
        "resolve-system" parameter is carried. It is also possible that the
        operation request (e.g., &lt;edit-config&gt;) may not succeed due to
        incomplete referential integrity.</t>

        <t>Support for the "resolve-system" parameter is OPTIONAL. Servers not
        supporting NMDA <xref target="RFC8342"/> MAY also implement this
        parameter without implementing the system configuration datastore,
        which would only eliminate the ability to expose the system
        configuration via protocol operations. If a server implements
        &lt;system&gt;, referenced system configuration is copied from
        &lt;system&gt; into the target datastore (e.g., &lt;running&gt;) when
        the "resolve-system" parameter is used; otherwise it is an
        implementation decision where to copy referenced system configuration
        into the target datastore (e.g., &lt;running&gt;).</t>

        <t>If the "resolve-system" parameter is not given by the client, the
        server should not modify &lt;running&gt; in any way otherwise not
        specified by the client. Not using capitalized "SHOULD NOT" in the
        previous sentence is intentional. The intention is to bring awareness
        to the general need to not surprise clients with unexpected changes.
        It is desirable for clients to always opt into using mechanisms having
        server-side changes. This document enables a client to opt into this
        behavior using the "resolve-system" parameter. An example of this type
        of opt-in behavior can also be found in RFC 7317, which enables a
        client to opt into its behavior using a "$0$" prefix (see
        ianach:crypt-hash type defined in <xref target="RFC7317"/>).</t>

        <t>Implementation specifics are beyond the scope of this document,
        however, due to the extra complexity brought by the "resolve-system"
        parameter, clients should be aware that it would cost a reasonable
        amount of time for the server to resolve reference, retrieve and copy
        the referenced system configuration from &lt;system&gt;, which could
        take multiple rounds since some errors may depend on the resolution of
        previous ones.</t>
      </section>

      <section anchor="modifying"
               title="Modifying (Overriding) System Configuration">
        <t>In some cases, a server may allow some parts of system
        configuration to be modified. Modification of system configuration is
        achieved by the client writing configuration to &lt;running&gt; that
        overrides the system configuration. Configurations defined in
        &lt;running&gt; take precedence over system configuration nodes in
        &lt;system&gt; if the server allows the nodes to be modified.</t>

        <t>For instance, descendant nodes in a system-defined list entry may
        be modifiable or not, even if some system configuration has been
        copied into &lt;running&gt; earlier. If a system node is
        non-modifiable, then writing a different value for that node MUST
        return an error. The immutability of system configuration is defined
        in <xref target="I-D.ma-netmod-immutable-flag"/>.</t>

        <t>A server may also allow a client to add data nodes to a list entry
        in &lt;system&gt; by writing those additional nodes in
        &lt;running&gt;. Those additional data nodes may not exist in
        &lt;system&gt; (i.e., an *addition* rather than an override).</t>
      </section>

      <section title="Examples">
        <t>This section presents some sample data models and corresponding
        contents of various datastores with different dynamical behaviors
        above. The XML snippets are used only for examples.</t>

        <section anchor="automatical"
                 title="Server Configuring of &lt;running&gt; Automatically">
          <t>In this subsection, the following fictional module is used:</t>

          <t><figure>
              <artwork><![CDATA[
module example-application {
  yang-version 1.1;
  namespace "urn:example:application";
  prefix "app";
           
  import ietf-inet-types {
    prefix "inet";
  }
  container applications {
    list application {
      key "name";
      leaf name {
        type string;
      }
      leaf protocol {
        type enumeration {
          enum tcp;
          enum udp;
        }
      }
      leaf destination-port {
        type inet:port-number;
      }
    }
  }
}  
              ]]></artwork>
            </figure></t>

          <t>The server may predefine some applications as a convenience for
          the clients. These predefined configurations are active only after
          being referenced by other configurations, which fall into the
          "inactive-until-referenced" system configuration as defined in <xref
          target="categories"/>. The system-instantiated application entries
          may be present in &lt;system&gt; as follows:</t>

          <figure>
              <artwork><![CDATA[
<applications xmlns="urn:example:application">  
  <application> 
    <name>ftp</name>  
    <protocol>tcp</protocol>  
    <destination-port>21</destination-port> 
  </application>  
  <application> 
    <name>tftp</name>  
    <protocol>udp</protocol>  
    <destination-port>69</destination-port> 
  </application>  
  <application> 
    <name>smtp</name>  
    <protocol>tcp</protocol>  
    <destination-port>25</destination-port> 
  </application> 
</applications>
              ]]></artwork>
          </figure>

          <t>The client may also define its customized applications. Suppose
          the configuration of applications is present in &lt;running&gt; as
          follows:<figure>
              <artwork><![CDATA[
<applications xmlns="urn:example:application">  
  <application> 
    <name>my-app-1</name>  
    <protocol>tcp</protocol>  
    <destination-port>2345</destination-port> 
  </application>  
  <application> 
    <name>my-app-2</name>  
    <protocol>udp</protocol>  
    <destination-port>69</destination-port> 
  </application> 
</applications>
              ]]></artwork>
            </figure></t>

          <t>A fictional ACL YANG module is used as follows, which defines a
          leafref for the leaf-list "application" data node to refer to an
          existing application name.<figure>
              <artwork><![CDATA[
module example-acl {
  yang-version 1.1;
  namespace "urn:example:acl";
  prefix "acl";

  import example-application {
    prefix "app";
  }

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

  container acl {
    list acl_rule {
      key "name";
      leaf name {
        type string;
      }
      container matches {
        choice l3 {
          container ipv4 {
            leaf source_address {
              type inet:ipv4-prefix;
            }
            leaf dest_address {
              type inet:ipv4-prefix;
            }
          }
        }
        choice applications {
          leaf-list application {
            type leafref {
            path "/app:applications/app:application/app:name";
            }
          }
        }
      }
      leaf packet_action {
        type enumeration {
          enum forward;
          enum drop;
          enum redirect;
        }
      }
    }
  }
}

              ]]></artwork>
            </figure></t>

          <t>If a client configures an ACL rule referencing system provided
          applications which are not present in &lt;running&gt;, take NETCONF
          protocol for example, the client may issue an &lt;edit-config&gt;
          operation with the parameter "resolve-system" as follows:<figure>
              <artwork><![CDATA[
<rpc message-id="101"
     xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <edit-config>
    <target>
      <running/>
    </target>
    <config>
      <acl xmlns="urn:example:acl">
        <acl_rule>
          <name>allow_access_to_ftp_tftp</name>
          <matches>
            <ipv4>
              <source_address>198.51.100.0/24</source_address>
              <dest_address>192.0.2.0/24</dest_address>
            </ipv4>
            <application>ftp</application>
            <application>tftp</application>
            <application>my-app-1</application>
          </matches>
          <packet_action>forward</packet_action>
        </acl_rule>
      </acl>
    </config>
    <resolve-system/>
  </edit-config>
</rpc>
              ]]></artwork>
            </figure></t>

          <t>The following gives the configuration of applications in
          &lt;running&gt; which is returned in the response to a follow-up
          retrieval operation:<figure>
              <artwork><![CDATA[
<applications xmlns="urn:example:application">  
  <application> 
    <name>my-app-1</name>  
    <protocol>tcp</protocol>  
    <destination-port>2345</destination-port> 
  </application>  
  <application> 
    <name>my-app-2</name>  
    <protocol>udp</protocol>  
    <destination-port>69</destination-port> 
  </application>  
  <application> 
    <name>ftp</name> 
  </application>  
  <application> 
    <name>tftp</name> 
  </application> 
</applications>

              ]]></artwork>
            </figure></t>

          <t>And the configuration of applications is present in
          &lt;operational&gt; as follows:<figure>
              <artwork><![CDATA[
<applications xmlns="urn:example:application" 
              xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin" 
              or:origin="or:intended">
  <application>
    <name>my-app-1</name>
    <protocol>tcp</protocol>
    <destination-port>2345</destination-port>
  </application>
  <application>
    <name>my-app-2</name>
    <protocol>udp</protocol>
    <destination-port>69</destination-port>
  </application>
  <application>
    <name>ftp</name>
    <protocol or:origin="or:system">tcp</protocol>
    <destination-port or:origin="or:system">21</destination-port>
  </application>
  <application>
    <name>tftp</name>
    <protocol or:origin="or:system">udp</protocol>
    <destination-port or:origin="or:system">69</destination-port>
  </application>
</applications>
              ]]></artwork>
            </figure>Since the configuration of application "smtp" is not
          referenced by the client, and the server treats application "smtp"
          configuration as "inactive-until-referenced", it does not appear in
          &lt;operational&gt; but only in &lt;system&gt;.</t>
        </section>

        <section title="Declaring a System-defined Node in &lt;running&gt; Explicitly">
          <t>It's also possible for a client to explicitly declare the
          system-defined configurations that are referenced instead of using
          the "resolve-system" parameter. For instance, in the above example,
          the client MAY also explicitly configure the following system
          defined applications "ftp" and "tftp" only with the list key "name"
          before referencing:<figure>
              <artwork><![CDATA[
<applications xmlns="urn:example:application">  
  <application> 
    <name>ftp</name> 
  </application>  
  <application> 
    <name>tftp</name> 
  </application> 
</applications>
              ]]></artwork>
            </figure></t>

          <t>Then the client configures the following ACL rule referencing
          applications "ftp" and "tftp" as follows:<figure>
              <artwork><![CDATA[
<acl xmlns="urn:example:acl">  
  <acl_rule> 
    <name>allow_access_to_ftp_tftp</name>  
    <matches> 
      <ipv4> 
        <source_address>198.51.100.0/24</source_address>  
        <dest_address>192.0.2.0/24</dest_address> 
      </ipv4>  
      <application>ftp</application>  
      <application>tftp</application>  
      <application>my-app-1</application> 
    </matches>  
    <packet_action>forward</packet_action> 
  </acl_rule> 
</acl>
              ]]></artwork>
            </figure></t>

          <t>Once the data is written to &lt;running&gt;, it makes no
          difference whether it is explicitly declared by the client or
          automatically copied by the server. The configuration for
          applications in &lt;running&gt; and &lt;operational&gt; would be
          identical to the ones in <xref target="automatical"/>.</t>
        </section>

        <section title="Modifying a System-instantiated Leaf's Value">
          <t>This subsection uses the following fictional interface YANG
          module:<figure>
              <artwork><![CDATA[
module example-interface {
  yang-version 1.1;
  namespace "urn:example:interface";
  prefix "exif";

  import ietf-inet-types {
    prefix "inet";
  }
  
  container interfaces {
    list interface {
      key name;
      leaf name {
        type string;
      }
      leaf description {
        type string;
      }
      leaf mtu {
        type uint32;
      }
      leaf-list ip-address {
        type inet:ip-address;
      }
    }
  }
}

              ]]></artwork>
            </figure></t>

          <t>Suppose the system provides a loopback interface (named "lo0")
          with a MTU value "65536", a default IPv4 address of "127.0.0.1", and
          a default IPv6 address of "::1". The configuration of "lo0"
          interface is present in &lt;system&gt; as follows:<figure>
              <artwork><![CDATA[
<interfaces xmlns="urn:example:interface">
  <interface>
    <name>lo0</name>
    <mtu>65536</mtu>
    <ip-address>127.0.0.1</ip-address>
    <ip-address>::1</ip-address>
  </interface>
</interfaces>
              ]]></artwork>
            </figure></t>

          <t>A client modifies the value of MTU to 65535 and adds the
          following configuration into &lt;running&gt;:</t>

          <figure>
              <artwork><![CDATA[
<interfaces xmlns="urn:example:interface">
  <interface>
    <name>lo0</name>
    <mtu>65535</mtu>
  </interface>
</interfaces>
              ]]></artwork>
          </figure>

          <t>Then the configuration of interfaces is present in
          &lt;operational&gt; as follows:<figure>
              <artwork><![CDATA[
<interfaces xmlns="urn:example:interface" 
            xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin" 
            or:origin="or:intended">
  <interface>
    <name>lo0</name>
    <mtu>65535</mtu>
    <ip-address or:origin="or:system">127.0.0.1</ip-address>
    <ip-address or:origin="or:system">::1</ip-address>
  </interface>
</interfaces>
              ]]></artwork>
            </figure></t>
        </section>

        <section title="Configuring Descendant Nodes of a System-defined Node">
          <t>In the above example, image the client further configures the
          description node of a "lo0" interface in &lt;running&gt; as
          follows:</t>

          <figure>
              <artwork><![CDATA[
<interfaces xmlns="urn:example:interface">  
  <interface> 
    <name>lo0</name>  
    <description>loopback</description> 
  </interface> 
</interfaces>
              ]]></artwork>
          </figure>

          <t>The configuration of interface "lo0" is present in
          &lt;operational&gt; as follows:<figure>
              <artwork><![CDATA[
<interfaces xmlns="urn:example:interface" 
            xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin" 
            or:origin="or:intended">
  <interface>
    <name>lo0</name>
    <description>loopback</description>
    <mtu>65535</mtu>
    <ip-address or:origin="or:system">127.0.0.1</ip-address>
    <ip-address or:origin="or:system">::1</ip-address>
  </interface>
</interfaces>
              ]]></artwork>
            </figure></t>
        </section>
      </section>
    </section>

    <section anchor="system-datastore"
             title="The &quot;ietf-system-datastore&quot; Module">
      <section title="Data Model Overview">
        <t>This YANG module defines a new YANG identity named "system" that
        uses the "ds:datastore" identity defined in [RFC8342]. A client can
        discover the system configuration datastore support on the server by
        reading the YANG library information from the operational state
        datastore. Note that no new origin identity is defined in this
        document, the "or:system" origin Metadata Annotation <xref
        target="RFC7952"/> is used to indicate the origin of a data item is
        system. Support for the "origin" annotation is identified with the
        feature "origin" defined in <xref target="RFC8526"/>.</t>

        <t>The following diagram illustrates the relationship amongst the
        "identity" statements defined in the "ietf-system-datastore" and
        "ietf-datastores" YANG modules: <figure>
            <artwork>Identities:
    +--- datastore
    |  +--- conventional
    |  |  +--- running
    |  |  +--- candidate
    |  |  +--- startup
    |  |  +--- system
    |  |  +--- intended
    |  +--- dynamic
    |  +--- operational</artwork>
          </figure>The diagram above uses syntax that is similar to but not
        defined in <xref target="RFC8340"/>.</t>
      </section>

      <section title="Example Usage">
        <t>This section gives an example of data retrieval from
        &lt;system&gt;. The fictional YANG module used following are from
        Appendix C.2 of [RFC8342].</t>

        <figure>
          <artwork>container bgp {
  leaf local-as {
    type uint32;
  }
  leaf peer-as {
    type uint32;
  }
  list peer {
    key name;
    leaf name {
      type inet:ip-address;
    }
    leaf local-as {
      type uint32;
      description
        "... Defaults to ../local-as.";
    }
    leaf peer-as {
      type uint32;
      description
        "... Defaults to ../peer-as.";
    }
    leaf local-port {
      type inet:port;
    }
    leaf remote-port {
      type inet:port;
      default 179;
    }
    leaf state {
      config false;
      type enumeration {
        enum init;
        enum established;
        enum closing;
      }
    }
  }
}</artwork>
        </figure>

        <t>All the messages are presented in a protocol-independent manner.
        JSON is used to not imply a preferred encoding in this document.</t>

        <t>Suppose the following BGP peer configuration is added to
        &lt;running&gt;:</t>

        <figure>
          <artwork>{
    "bgp": {
        "local-as": "64501", 
        "peer-as": "64502", 
        "peer": {
            "name": "2001:db8::2:3",
            "local-as": "64501",
            "peer-as": "64502"
        }
    }
}</artwork>
        </figure>

        <t>The local port and remote port are used when the BGP peer
        connection is established. Since both are not supplied explicitly in
        &lt;running&gt; and &lt;intended&gt;, the default value for
        "bgp/peer/remote-port" is used, and there is no default statement for
        "bgp/peer/local-port", the system will select a value for it. So the
        contents of &lt;system&gt; are shown as follows:</t>

        <figure>
          <artwork>{
    "bgp": {
        "peer": {
            "name": "2001:db8::2:3",
            "local-port": "60794"
        }
    }
}</artwork>
        </figure>
      </section>

      <section title="YANG Module">
        <figure>
          <preamble>&lt;CODE BEGINS&gt; file
          "ietf-system-datastore@2024-02-21.yang"</preamble>

              <artwork><![CDATA[
module ietf-system-datastore {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-system-datastore";
  prefix sysds;

  import ietf-datastores {
    prefix ds;
    reference
      "RFC 8342: Network Management Datastore Architecture(NMDA)";
  }

  organization
    "IETF NETDOD (Network Modeling) Working Group";
  contact
    "WG Web:   https://datatracker.ietf.org/wg/netmod/
     WG List:  NETMOD WG list <mailto:netmod@ietf.org>
     
     Author: Qiufang Ma
             <mailto:maqiufang1@huawei.com>
     Author: Qin Wu
             <mailto:bill.wu@huawei.com>
     Author: Chong Feng
             <mailto:fengchonglly@gmail.com>";
  description
    "This module defines a new YANG identity that uses the
     ds:datastore identity defined in [RFC8342].

     Copyright (c) 2024 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 HHHH
     (https://www.rfc-editor.org/info/rfcHHHH); 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 2024-02-21 {
    description
      "Initial version.";
    reference
      "RFC XXXX: System-defined Configuration";
  }

  identity system {
    base ds:conventional;
    description
      "This read-only datastore contains the configuration
       provided by the system itself.";
  }
}
]]></artwork>

          <postamble>&lt;CODE ENDS&gt;</postamble>
        </figure>
      </section>
    </section>

    <section title="The &quot;ietf-netconf-resolve-system&quot; Module">
      <t>This YANG module is optional to implement.</t>

      <section title="Data Model Overview">
        <t>This YANG module augments NETCONF &lt;edit-config&gt;,
        &lt;edit-data&gt; and &lt;copy-config&gt; operations with a new
        parameter "resolve-system" in the input parameters. If the
        "resolve-system" parameter is present, the server will copy the
        referenced system configuration into target datastore automatically. A
        NETCONF client can discover the "resolve-system" parameter support on
        the server by checking the server's capabilities included in the
        &lt;hello&gt; message.</t>

        <t>The following tree diagram [RFC8340] illustrates the
        "ietf-netconf-resolve-system" module:</t>

        <figure>
          <artwork>module: ietf-netconf-resolve-system
  augment /nc:edit-config/nc:input:
    +---w resolve-system?   empty
  augment /nc:copy-config/nc:input:
    +---w resolve-system?   empty
  augment /ncds:edit-data/ncds:input:
    +---w resolve-system?   empty</artwork>
        </figure>

        <t>The following tree diagram [RFC8340] illustrates "edit-config",
        "copy-config" and "edit-data" rpcs defined in "ietf-netconf" and
        "ietf-netconf-nmda" respectively, augmented by
        "ietf-netconf-resolve-system" YANG module:</t>

        <figure>
          <artwork>  rpcs:
    +---x edit-config
    |  +---w input
    |     +---w target
    |     |  +---w (config-target)
    |     |     +--:(candidate)
    |     |     |  +---w candidate?   empty {candidate}?
    |     |     +--:(running)
    |     |        +---w running?     empty {writable-running}?
    |     +---w default-operation?   enumeration
    |     +---w test-option?         enumeration {validate}?
    |     +---w error-option?        enumeration
    |     +---w (edit-content)
    |     |   +--:(config)
    |     |   |  +---w config?        &lt;anyxml&gt;
    |     |   +--:(url)
    |     |     +---w url?           inet:uri {url}?
    |     +---w resolve-system?      empty
    +---x copy-config
    |  +---w input
    |     +---w target
    |     |  +---w (config-target)
    |     |     +--:(candidate)
    |     |     |  +---w candidate?   empty {candidate}?
    |     |     +--:(running)
    |     |     |  +---w running?     empty {writable-running}?
    |     |     +--:(startup)
    |     |     |  +---w startup?     empty {startup}?
    |     |     +--:(url)
    |     |        +---w url?         inet:uri {url}?
    |     +---w source
    |     |  +---w (config-source)
    |     |     +--:(candidate)
    |     |     |  +---w candidate?   empty {candidate}?
    |     |     +--:(running)
    |     |     |  +---w running?     empty
    |     |     +--:(startup)
    |     |     |  +---w startup?     empty {startup}?
    |     |     +--:(url)
    |     |     |  +---w url?         inet:uri {url}?
    |     |     +--:(config)
    |     |        +---w config?      &lt;anyxml&gt;
    |     +---w resolve-system?       empty
    +---x edit-data
       +---w input
          +---w datastore            ds:datastore-ref
          +---w default-operation?   enumeration
          +---w (edit-content)
          |  +--:(config)
          |  |  +---w config?        &lt;anydata&gt;
          |  +--:(url)
          |     +---w url?           inet:uri {nc:url}?
          +---w resolve-system?      empty</artwork>
        </figure>
      </section>

      <section title="Example Usage">
        <t>Please refer to <xref target="automatical"/> for example usage of
        the "resolve-system" parameter.</t>
      </section>

      <section title="YANG Module">
        <figure>
          <preamble>&lt;CODE BEGINS&gt; file
          "ietf-netconf-resolve-system@2024-02-21.yang"</preamble>

              <artwork><![CDATA[
module ietf-netconf-resolve-system {
  yang-version 1.1;
  namespace
    "urn:ietf:params:xml:ns:yang:ietf-netconf-resolve-system";
  prefix ncrs;

  import ietf-netconf {
    prefix nc;
    reference
      "RFC 6241: Network Configuration Protocol (NETCONF)";
  }
  import ietf-netconf-nmda {
    prefix ncds;
    reference
      "RFC 8526: NETCONF Extensions to Support the Network
       Management Datastore Architecture";
  }

  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>
     Author: Qin Wu
             <mailto:bill.wu@huawei.com>
     Author: Chong Feng
             <mailto:fengchonglly@gmail.com>";
  description
    "This module defines an extension to the NETCONF protocol
     that allows the NETCONF client to control whether the server
     is allowed to copy referenced system configuration
     automatically without the client doing so explicitly.

      Copyright (c) 2024 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 HHHH
      (https://www.rfc-editor.org/info/rfcHHHH); 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 2024-02-21 {
    description
      "Initial version.";
    reference
      "RFC XXXX: System-defined Configuration";
  }

  grouping resolve-system-grouping {
    description
      "Define the resolve-system parameter grouping.";
    leaf resolve-system {
      type empty;
      description
        "When present, the server is allowed to automatically
         configure referenced system configuration into the
         target configuration datastore.";
    }
  }

  augment "/nc:edit-config/nc:input" {
    description
      "Allows the server to automatically configure
       referenced system configuration to make configuration
       valid.";
    uses resolve-system-grouping;
  }

  augment "/nc:copy-config/nc:input" {
    description
      "Allows the server to automatically configure
       referenced system configuration to make configuration
       valid.";
    uses resolve-system-grouping;
  }

  augment "/ncds:edit-data/ncds:input" {
    description
      "Allows the server to automatically configure
       referenced system configuration to make configuration
       valid.";
    uses resolve-system-grouping;
  }
}

]]></artwork>

          <postamble>&lt;CODE ENDS&gt;</postamble>
        </figure>
      </section>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <section title="The &quot;IETF XML&quot; Registry">
        <t>This document registers two XML namespace URNs in the 'IETF XML
        registry', following the format defined in <xref
        target="RFC3688"/>.</t>

        <figure>
          <artwork>   URI: urn:ietf:params:xml:ns:yang:ietf-system-datastore
   Registrant Contact: The IESG.
   XML: N/A, the requested URIs are XML namespaces.

   URI: urn:ietf:params:xml:ns:yang:ietf-netconf-resolve-system
   Registrant Contact: The IESG.
   XML: N/A, the requested URIs are XML namespaces.</artwork>
        </figure>
      </section>

      <section title="The &quot;YANG Module Names&quot; Registry">
        <t>This document registers two module names in the 'YANG Module Names'
        registry, defined in <xref target="RFC6020"/>.</t>

        <figure>
          <artwork>      name: ietf-system-datastore
      prefix: sys
      namespace: urn:ietf:params:xml:ns:yang:ietf-system-datatstore
      maintained by IANA: N
      RFC: XXXX // RFC Ed.: replace XXXX and remove this comment


      name: ietf-netconf-resolve-system
      prefix: ncrs
      namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-resolve-system
      maintained by IANA: N
      RFC: XXXX // RFC Ed.: replace XXXX and remove this comment</artwork>
        </figure>
      </section>

      <section title="NETCONF Capability URN Registry">
        <t>This document registers the following capability identifier URN in
        the 'Network Configuration Protocol (NETCONF) Capability URNs'
        registry:<figure>
            <artwork>urn:ietf:params:netconf:capability:resolve-system:1.0</artwork>
          </figure></t>
      </section>

      <section title="RESTCONF Capability URN Registry">
        <t>This document registers a capability in the 'RESTCONF Capability
        URNs' registry [RFC8040]:<figure>
            <artwork>Index            Capability Identifier
-----------------------------------------------------------------------
:resolve-system  urn:ietf:params:restconf:capability:resolve-system:1.0</artwork>
          </figure></t>
      </section>
    </section>

    <section anchor="scecurity" title="Security Considerations">
      <section title="Regarding the &quot;ietf-system-datastore&quot; YANG Module">
        <t>The YANG module defined in this document extends the base
        operations for NETCONF <xref target="RFC6241"/> and RESTCONF <xref
        target="RFC8040"/>. The lowest NETCONF layer is the secure transport
        layer, and the mandatory-to-implement secure transport is Secure Shell
        (SSH) <xref target="RFC6242"/>. The lowest RESTCONF layer is HTTPS,
        and the mandatory-to-implement secure transport is TLS <xref
        target="RFC8446"/>.</t>

        <t>The Network Configuration Access Control Model (NACM) <xref
        target="RFC8341"/> provides the means to restrict access for
        particular NETCONF users to a preconfigured subset of all available
        NETCONF protocol operations and content.</t>
      </section>

      <section title="Regarding the &quot;ietf-netconf-resolve-system&quot; YANG Module">
        <t>The YANG module defined in this document extends the base
        operations for NETCONF <xref target="RFC6241"/> and <xref
        target="RFC8526"/>. The lowest NETCONF layer is the secure transport
        layer, and the mandatory-to-implement secure transport is Secure Shell
        (SSH) <xref target="RFC6242"/>. The lowest RESTCONF layer is HTTPS,
        and the mandatory-to-implement secure transport is TLS <xref
        target="RFC8446"/>.</t>

        <t>The Network Configuration Access Control Model (NACM) <xref
        target="RFC8341"/> provides the means to restrict access for
        particular NETCONF users to a preconfigured subset of all available
        NETCONF protocol operations and content.</t>

        <t>The security considerations for the base NETCONF protocol
        operations (see Section 9 of <xref target="RFC6241"/> apply to the new
        extended RPC operations defined in this document.</t>
      </section>
    </section>

    <section title="Contributors">
      <figure>
        <artwork>      Kent Watsen
      Watsen Networks

      Email: kent+ietf@watsen.net

      Jan Lindblad
      Cisco Systems

      Email: jlindbla@cisco.com

      Chongfeng Xie
      China Telecom
      Beijing
      China

      Email: xiechf@chinatelecom.cn

      Jason Sterne
      Nokia

      Email: jason.sterne@nokia.com</artwork>
      </figure>
    </section>

    <section anchor="Acknowledgements" numbered="no" title="Acknowledgements">
      <t>The authors would like to thank for following for discussions and
      providing input to this document (ordered by first name): Alex Clemm,
      Andy Bierman, Balazs Lengyel, Juergen Schoenwaelder, Martin Bjorklund,
      Mohamed Boucadair, Robert Wilton and Timothy Carey.</t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include="reference.RFC.2119.xml"?>

      <?rfc include="reference.RFC.6241.xml"?>

      <?rfc include="reference.RFC.6470.xml"?>

      <?rfc include="reference.RFC.7950.xml"?>

      <?rfc include="reference.RFC.8040.xml"?>

      <?rfc include="reference.RFC.8341.xml"?>

      <?rfc include="reference.RFC.8342.xml"?>

      <?rfc include="reference.RFC.8526.xml"?>

      <?rfc include="reference.RFC.8639.xml"?>

      <?rfc include="reference.RFC.8641.xml"?>
    </references>

    <references title="Informative References">
      <?rfc include="reference.RFC.3688.xml"?>

      <?rfc include="reference.RFC.6020.xml"?>

      <?rfc include="reference.RFC.6242.xml"?>

      <?rfc include="reference.RFC.7317.xml"?>

      <?rfc include="reference.RFC.7952.xml"?>

      <?rfc include="reference.RFC.8174.xml"?>

      <?rfc include="reference.RFC.8340.xml"?>

      <?rfc include="reference.RFC.8407.xml"?>

      <?rfc include="reference.RFC.8446.xml"?>

      <?rfc include="reference.RFC.8525.xml"?>

      <?rfc include="reference.RFC.8808.xml"?>

      <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D.ma-netmod-immutable-flag.xml"
                  xmlns:xi="http://www.w3.org/2001/XInclude"/>
    </references>

    <section title="Key Use Cases">
      <t>Following provides three use cases related to system-defined
      configuration lifecycle management. The simple interface data model
      defined in Appendix C.3 of <xref target="RFC8342"/> is used. For each
      use case, corresponding sample configuration in &lt;running&gt;,
      &lt;system&gt;, &lt;intended&gt; and &lt;operational&gt; are shown. The
      XML snippets are used only for examples.</t>

      <section title="Device Powers On">
        <t>&lt;running&gt;:</t>

        <figure>
          <artwork>No configuration for interfaces appears in &lt;running&gt;;</artwork>
        </figure>

        <t>&lt;system&gt;:</t>

        <figure>
          <artwork>&lt;interfaces&gt; 
  &lt;interface&gt; 
    &lt;name&gt;lo0&lt;/name&gt;  
    &lt;ip-address&gt;127.0.0.1&lt;/ip-address&gt;  
    &lt;ip-address&gt;::1&lt;/ip-address&gt; 
  &lt;/interface&gt; 
&lt;/interfaces&gt;</artwork>
        </figure>

        <t>&lt;intended&gt;:</t>

        <figure>
          <artwork>&lt;interfaces&gt; 
  &lt;interface&gt; 
    &lt;name&gt;lo0&lt;/name&gt;  
    &lt;ip-address&gt;127.0.0.1&lt;/ip-address&gt;  
    &lt;ip-address&gt;::1&lt;/ip-address&gt; 
  &lt;/interface&gt; 
&lt;/interfaces&gt;</artwork>
        </figure>

        <t>&lt;operational&gt;:</t>

        <figure>
          <artwork>&lt;interfaces xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin"
            or:origin="or:system"&gt;
  &lt;interface&gt;
    &lt;name&gt;lo0&lt;/name&gt;
    &lt;ip-address&gt;127.0.0.1&lt;/ip-address&gt;
    &lt;ip-address&gt;::1&lt;/ip-address&gt;
  &lt;/interface&gt;
&lt;/interfaces&gt;  </artwork>
        </figure>
      </section>

      <section title="Client Commits Configuration">
        <t>If a client creates an interface "et-0/0/0" but the interface does
        not physically exist at this point:</t>

        <t>&lt;running&gt;:</t>

        <figure>
          <artwork>&lt;interfaces&gt; 
  &lt;interface&gt; 
    &lt;name&gt;et-0/0/0&lt;/name&gt;  
    &lt;description&gt;Test interface&lt;/description&gt; 
  &lt;/interface&gt; 
&lt;/interfaces&gt;</artwork>
        </figure>

        <t>&lt;system&gt;:</t>

        <figure>
          <artwork>&lt;interfaces&gt; 
  &lt;interface&gt; 
    &lt;name&gt;lo0&lt;/name&gt;  
    &lt;ip-address&gt;127.0.0.1&lt;/ip-address&gt;  
    &lt;ip-address&gt;::1&lt;/ip-address&gt; 
  &lt;/interface&gt; 
&lt;/interfaces&gt;</artwork>
        </figure>

        <t>&lt;intended&gt;:</t>

        <figure>
          <artwork>&lt;interfaces&gt; 
  &lt;interface&gt; 
    &lt;name&gt;lo0&lt;/name&gt;  
    &lt;ip-address&gt;127.0.0.1&lt;/ip-address&gt;  
    &lt;ip-address&gt;::1&lt;/ip-address&gt; 
  &lt;/interface&gt;  
  &lt;interface&gt; 
    &lt;name&gt;et-0/0/0&lt;/name&gt;  
    &lt;description&gt;Test interface&lt;/description&gt; 
  &lt;/interface&gt; 
&lt;/interfaces&gt;</artwork>
        </figure>

        <t>&lt;operational&gt;:</t>

        <figure>
          <artwork>&lt;interfaces xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin"
            or:origin="or:intended"&gt;
  &lt;interface or:origin="or:system"&gt;
    &lt;name&gt;lo0&lt;/name&gt;
    &lt;ip-address&gt;127.0.0.1&lt;/ip-address&gt;
    &lt;ip-address&gt;::1&lt;/ip-address&gt;
  &lt;/interface&gt;
&lt;/interfaces&gt;              </artwork>
        </figure>
      </section>

      <section title="Operator Installs Card into a Chassis">
        <t>&lt;running&gt;:</t>

        <figure>
          <artwork>&lt;interfaces&gt; 
  &lt;interface&gt; 
    &lt;name&gt;et-0/0/0&lt;/name&gt;  
    &lt;description&gt;Test interface&lt;/description&gt; 
  &lt;/interface&gt; 
&lt;/interfaces&gt;</artwork>
        </figure>

        <t>&lt;system&gt;:</t>

        <figure>
          <artwork>&lt;interfaces&gt; 
  &lt;interface&gt; 
    &lt;name&gt;lo0&lt;/name&gt;  
    &lt;ip-address&gt;127.0.0.1&lt;/ip-address&gt;  
    &lt;ip-address&gt;::1&lt;/ip-address&gt; 
  &lt;/interface&gt;  
  &lt;interface&gt; 
    &lt;name&gt;et-0/0/0&lt;/name&gt;  
    &lt;mtu&gt;1500&lt;/mtu&gt; 
  &lt;/interface&gt; 
&lt;/interfaces&gt;</artwork>
        </figure>

        <t>&lt;intended&gt;:</t>

        <figure>
          <artwork>&lt;interfaces&gt; 
  &lt;interface&gt; 
    &lt;name&gt;lo0&lt;/name&gt;  
    &lt;ip-address&gt;127.0.0.1&lt;/ip-address&gt;  
    &lt;ip-address&gt;::1&lt;/ip-address&gt; 
  &lt;/interface&gt;  
  &lt;interface&gt; 
    &lt;name&gt;et-0/0/0&lt;/name&gt;  
    &lt;description&gt;Test interface&lt;/description&gt;  
    &lt;mtu&gt;1500&lt;/mtu&gt; 
  &lt;/interface&gt; 
&lt;/interfaces&gt;</artwork>
        </figure>

        <t>&lt;operational&gt;:</t>

        <figure>
          <artwork>&lt;interfaces xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin"
            or:origin="or:intended"&gt;
  &lt;interface or:origin="or:system"&gt;
    &lt;name&gt;lo0&lt;/name&gt;
    &lt;ip-address&gt;127.0.0.1&lt;/ip-address&gt;
    &lt;ip-address&gt;::1&lt;/ip-address&gt;
  &lt;/interface&gt;
  &lt;interface&gt;
    &lt;name&gt;et-0/0/0&lt;/name&gt;
    &lt;description&gt;Test interface&lt;/description&gt;
    &lt;mtu or:origin="or:system"&gt;1500&lt;/mtu&gt;
  &lt;/interface&gt;
&lt;/interfaces&gt;            </artwork>
        </figure>
      </section>
    </section>

    <section title="Changes between Revisions">
      <t>v04 - v05<list style="symbols">
          <t>Explicitly state that system configuration copied from
          &lt;system&gt; into &lt;running&gt; have its origin value being
          reported as "intended" and update the examples accordingly to
          reflect it</t>

          <t>Update the definition of "intended" origin identity in 8342 to
          allow a subset of configuration in &lt;intended&gt; to use "system"
          as origin value</t>

          <t>State server behaviors of migrating updated system data into
          &lt;running&gt; is beyond the scope of this document, and give a
          couple of implementation examples</t>

          <t>Remove the related statement which mandates referenced system
          configuration must be copied into &lt;running&gt;</t>

          <t>Refine usage examples (e.g., fix validation errors, remove
          redundancy)</t>
        </list></t>

      <t>v03 - v04<list style="symbols">
          <t>Add some implementation consideration for "resolve-system"
          parameter</t>

          <t>Define a NETCONF capability identifier for "resolve-system"
          parameter so that the client can discover if it is supported by the
          server.</t>

          <t>state servers may upgrade copied system configuration in
          &lt;running&gt; as well during device upgrade or licensing
          change.</t>
        </list></t>

      <t>v02 - v03<list style="symbols">
          <t>remove the merge mechanism related comments, as discussed in
          https://github.com/netconf-wg/netconf-next/issues/19</t>

          <t>Editorial changes</t>
        </list></t>

      <t>v01 - v02<list style="symbols">
          <t>Define referenced system configuration</t>

          <t>better clarify "resolve-system" parameter</t>

          <t>update Figure 2 in NMDA RFC</t>

          <t>Editorial changes</t>
        </list></t>

      <t>v00 - v01<list style="symbols">
          <t>Clarify why client's explicit copy is not preferred but cannot be
          avoided if resolve-system parameter is not defined</t>

          <t>Clarify active system configuration</t>

          <t>Update the timing when the server's auto copy should be enforced
          if a resolve-system parameter is used</t>

          <t>Editorial changes</t>
        </list></t>
    </section>
  </back>
</rfc>
