<?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-ma-netmod-immutable-flag-05"
     ipr="trust200902">
  <front>
    <title abbrev="Immutable Flag">YANG Extension and Metadata Annotation for
    Immutable Flag</title>

    <author fullname="Qiufang Ma" initials="Q." 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="Balazs Lengyel" initials="B." surname="Lengyel">
      <organization abbrev="Ericsson">Ericsson</organization>

      <address>
        <email>balazs.lengyel@ericsson.com</email>
      </address>
    </author>

    <author fullname="Hongwei Li" initials="H." surname="Li">
      <organization>HPE</organization>

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

    <date year="2023"/>

    <area>ops</area>

    <workgroup>NETMOD</workgroup>

    <keyword>immutable read-only NETMOD</keyword>

    <abstract>
      <t>This document defines a way to formally document as a YANG extension
      or YANG metadata an existing model handling behavior: modification
      restrictions on data declared as configuration.</t>

      <t>This document defines a YANG extension named "immutable" to indicate
      that specific "config true" data nodes are not allowed to be
      created/deleted/updated. To indicate that specific entries of a
      list/leaf-list node or instances inside list entries cannot be
      updated/deleted after initialization, a metadata annotation with the
      same name is also defined. Any data node or instance marked as immutable
      is read-only to the clients of YANG-driven management protocols, such as
      NETCONF, RESTCONF and other management operations (e.g., SNMP and CLI
      requests).</t>
    </abstract>
  </front>

  <middle>
    <section anchor="Introduction" title="Introduction">
      <t>This document defines a way to formally document as a YANG extension
      or YANG metadata an existing model handling behavior that is already
      allowed in YANG and which has been used by multiple standard
      organizations and vendors. It is the aim to create one single standard
      solution for documenting modification restrictions on data declared as
      configuration, instead of the multiple existing vendor and organization
      specific solutions. See <xref target="Existing_implementations"/>for
      existing implementations.</t>

      <t>YANG <xref target="RFC7950"/> is a data modeling language used to
      model both state and configuration data, based on the "config"
      statement. However there exists data that cannot be modified by the
      client(it is immutable), but still needs to be declared as "config true"
      to: <list style="symbols">
          <t>allow configuration of data nodes under immutable lists or
          containers;</t>

          <t>place "when", "must" and "leafref" constraints between
          configuration and immutable schema nodes.</t>

          <t>ensure the existence of specific list entries that are provided
          and needed by the system, while additional list entries can be
          created, modified or deleted;</t>
        </list> Clients believe that "config true" nodes are modifiable even
      though the server is allowed to reject such a modification at any time.
      If the server knows that it will reject the modification, it should
      document this towards the clients in a machine readable way.</t>

      <t>To address this issue, this document defines a YANG extension named
      "immutable" to indicate that specific "config true" data nodes are not
      allowed to be created/deleted/updated. To indicate that specific entries
      of a list/leaf-list node or instances inside list entries cannot be
      updated/deleted after initialization, a metadata annotation <xref
      target="RFC7952"/> with the same name is also defined. Any data node or
      instance marked as immutable is read-only to the clients of YANG-driven
      management protocols, such as NETCONF, RESTCONF and other management
      operations (e.g., SNMP and CLI requests). Marking instance data nodes as
      immutable (as opposed to marking schema-nodes) is useful when only some
      instances of a list or leaf-list shall be marked as read-only.</t>

      <t>Immutability is an existing model handling practice. While in some
      cases it is needed, it also has disadvantages, therefore it SHOULD be
      avoided wherever possible.</t>

      <t>The following is a list of already implemented and potential use
      cases. <list style="format UC%d">
          <t>Modeling of server capabilities</t>

          <t>HW based autoconfiguration</t>

          <t>Predefined Access control Rules</t>

          <t>Declaring System defined configuration unchangeable</t>

          <t>Immutable BGP AS number and peer type</t>

          <t>Modeling existing data handling behavior in other standard
          organizations</t>
        </list> <xref target="detailed_use_cases"/> describes the use cases in
      detail.</t>

      <section anchor="terminology" title="Terminology">
        <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>

        <t>The following terms are defined in <xref target="RFC6241"/> and
        <xref target="RFC8341"/> and are not redefined here:<list
            style="symbols">
            <t>configuration data</t>

            <t>access operation</t>

            <t>write access</t>
          </list></t>

        <t>The following terms are defined in this document:<list
            style="hanging">
            <t hangText="immutable: ">A schema or instance node property
            indicating that the configuration data is not allowed to be
            created/deleted/updated.<vspace blankLines="1"/></t>
          </list></t>
      </section>

      <section title="Applicability">
        <t>The "immutable" concept defined in this document only indicates
        write access restrictions to writable datastores. A particular data
        node or instance MUST have the same immutability in all writable
        datastores. The immutable annotation information should also be
        visible in read-only datastores (e.g., &lt;system&gt;,
        &lt;intended&gt;, &lt;operational&gt;), however this only serves as
        information about the data node itself, but has no effect on the
        handling of the read-only datastore.</t>

        <t>The immutability property of a particular data node or instance
        MUST be protocol-independent and user-independent.</t>
      </section>
    </section>

    <section title="Solution Overview">
      <t>Already some servers handle immutable configuration data and will
      reject any attempt to the "create", "delete" or "update" such data. This
      document allows the existing immutable data node or instance to be
      marked by YANG extension or metadata annotation. Requests to
      create/update/delete an immutable configuration data always return an
      error (if no corresponding "exceptions" are declared in a YANG
      extension). The error reporting is performed immediately at an
      &lt;edit-config&gt; operation time, regardless what the target
      configuration datastore is. For an example of an "invalid-value" error
      response, see <xref target="error-update"/>.</t>

      <t>However, the following operations SHOULD be allowed for immutable
      nodes: <list style="symbols">
          <t>Use a create, update, delete/remove operation on an immutable
          node if the effective change is null. E.g., if a leaf has a current
          value of "5" it should be allowed to replace it with a value of
          "5";</t>

          <t>Create an immutable data node with a same value that already
          exists in the &lt;system&gt; datastore.;</t>
        </list></t>

      <t>Note that even if a particular data node is immutable without the
      exception for "delete", it still can be deleted if its parent node is
      deleted, e.g., /if:interfaces/if:interface/if:type leaf is immutable,
      but the deletion to the /if:interfaces/if:interface list entry is
      allowed; if a particular data node is immutable without the exception
      for "create", it means the client can never create the instance of it,
      regardless the handling of its parent node; it may be created by the
      system or have a default value when its parent is created.</t>

      <t>In some cases adding the immutable property is allowed but does not
      have any additional semantic meaning. For example, a key leaf is given a
      value when a list entry is created, and cannot be modified and deleted
      unless the list entry is deleted. A mandatory leaf MUST exist and cannot
      be deleted if the ancestor node exists in the data tree.</t>
    </section>

    <section title="&quot;Immutable&quot; YANG Extension">
      <section title="Definition">
        <t>The "immutable" YANG extension can be a substatement to a "config
        true" leaf, leaf-list, container, list, anydata or anyxml statement.
        It has no effect if used as a substatment to a "config false" node,
        but can be allowed anyway. When present, it indicates that data nodes
        based on the parent statement are not allowed to be added, removed or
        updated except according to the exceptions argument. Any such write
        attempt will be rejected by the server.</t>

        <t>The "immutable" YANG extension defines an argument statement named
        "exceptions" which gives a list of operations that users are permitted
        to invoke for the specified node.</t>

        <t>The following values are supported for the "exceptions"
        argument:<list style="symbols">
            <t>create: allow users to create instances of the data node;</t>

            <t>update: allow users to modify instances of the data node;</t>

            <t>delete: allow users to delete instances of the data node.</t>
          </list></t>

        <t>If more than one value is used, a space-separated string for the
        "exceptions" argument is used. For example, if a particular data node
        can be created and modified, but cannot be deleted, the following
        "immutable" YANG extension with "create" and "update" exceptions
        should be defined in a substatement to that data node:<figure>
            <artwork>immutable "create update";</artwork>
          </figure>Providing an empty string for the "exceptions" argument is
        equivalent to a single extension without an argument followed.
        Providing all 3 values can be used to override immutability inherited
        from its ancestor node. For data nodes with no write access
        restriction inherited from its ancestor node (see <xref
        target="inheritance_extension"/>), providing all 3 values has the same
        effect as not using this extension at all, but can be used anyway.</t>

        <t>Note that leaf-list instances can be created and deleted, but not
        modified. Any exception for "update" operation to leaf-list data nodes
        SHALL be ignored.</t>
      </section>

      <section anchor="inheritance_extension"
               title="Inheritance of Immutable YANG Extension">
        <t>Immutability specified by the use of the 'immutable' extension
        statement (including any exception argument) is inherited by all child
        and descendant nodes of a container or a list. It is possible to
        override thhe inherited immutability property by placing another
        immuable extension statement on a specific child/descendant node. For
        example, given the following list definition: <figure>
            <artwork>
list application {
  im:immutable "create delete";
  key name;
  leaf name {
    type string;
  }
  leaf protocol {
    im:immutable;
    type enumeration {
      enum tcp;
      enum udp;
    }
  }
  leaf port-number {
    im:immutable "create update delete";
    type int16;
  }
}
          </artwork>
          </figure> application list entries are allowed to be created and
        deleted, but cannot be modified; "protocol" cannot be changed in any
        way while "port-number" can be created, modified or deleted. Using the
        immutable statement with exception argument we can make immutability
        stricter (for the protocol child node) or less restrictive (for the
        port-number child node).</t>
      </section>
    </section>

    <section title="&quot;Immutable&quot; Metadata Annotation">
      <section title="Definition">
        <t>The "immutable" flag SHALL be used to indicate the immutability of
        a particular instantiated data node. It can only be used for
        list/leaf-list entries. The "immutable" flag is of type boolean.</t>

        <t>Note that "immutable" metadata annotation is used to annotate
        instances of a list/leaf-list rather than schema nodes. A list may
        have multiple entries/instances in the data tree, "immutable" can
        annotate some of the instances as read-only, while others are
        read-write.</t>

        <t>Any list/leaf-list instance annotated with immutable="true" by the
        server is read-only to clients and cannot be updated/deleted. If a
        list entry is annotated with immutable="true", the whole instance is
        read-only and any contained descendant configuration is not allowed to
        be created, updated and deleted. Descendant nodes SHALL NOT carry the
        immutable annotation.</t>

        <t>When the client retrieves data from a particular datastore,
        immutable data node instances MUST be annotated with immutable="true"
        by the server. If the "immutable" metadata annotation for a
        list/leaf-list entry is not specified, the default "immutable" value
        is false. Explicitly annotating instances as immutable="false" has the
        same effect as not specifying this value.</t>
      </section>
    </section>

    <section title="Interaction between Immutable YANG Extension and Metadata Annotation">
      <t>When a client reads data from a datastore, if a data node is
      specified as immutable using the extension statement, the corresponding
      data node instances generally SHALL NOT be marked with the immutable
      annotation. However, if the immutable extension statement has exceptions
      defined, the server MAY decide that for a particular list entriy or
      leaf-list instance strict immutability shall apply without exceptions.
      In this case the server SHALL mark the relevant data node instances with
      the immutable annotation. The immutable annotation overrides any
      exceptions specified for the immutabile statement inlcuding any
      exception on any descendant nodes.</t>
    </section>

    <section title="Interaction between Immutable Flag and NACM">
      <t>If a data node or some list or leaf-list entries are immutable the
      server MUST reject any operation that attempts to create, delete or
      update them, however the "exceptions" argument, if present, SHALL be
      taken into account. Rejecting an operation due to immutability SHALL be
      done indepent of any access control settings.</t>
    </section>

    <section title="YANG Module">
      <figure>
        <artwork> &lt;CODE BEGINS&gt; file="ietf-immutable@2022-12-14.yang"
//RFC Ed.: replace XXXX with RFC number and remove this note
  module ietf-immutable {
    yang-version 1.1;
    namespace "urn:ietf:params:xml:ns:yang:ietf-immutable";
    prefix im;

    import ietf-yang-metadata {
      prefix md;
    }
         
    organization
      "IETF Network Modeling (NETMOD) Working Group";
           
    contact
      "WG Web: &lt;https://datatracker.ietf.org/wg/netmod/&gt;
           
       WG List: &lt;mailto:netmod@ietf.org&gt;
          
       Author: Qiufang Ma
               &lt;mailto:maqiufang1@huawei.com&gt;

       Author: Qin Wu
               &lt;mailto:bill.wu@huawei.com&gt;

       Author: Balazs Lengyel
               &lt;mailto:balazs.lengyel@ericsson.com&gt;

       Author: Hongwei Li
               &lt;mailto:flycoolman@gmail.com&gt;";
         
    description
      "This module defines a metadata annotation named 'immutable'
       to indicate the immutability of a particular instantiated 
       data node. Any instantiated data node marked with 
       immutable='true' by the server is read-only to the clients
       of YANG-driven management protocols, such as NETCONF, 
       RESTCONF as well as SNMP and CLI requests.
       
       The module defines the immutable extension that indicates 
       that data nodes based on the parent data-definition 
       statement cannot be created, removed, or updated 
       except according to the 'exceptions' argument.

       Copyright (c) 2022 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 2022-12-14 {
      description
        "Initial revision.";
      // RFC Ed.: replace XXXX and remove this comment
      reference
        "RFC XXXX: YANG Extension and Metadata Annotation for 
         Immutable Flag";
    }  
      
    extension immutable {
      argument exceptions;
      description
        "The 'immutable' extension as a substatement to a data 
         definition statement indicates that data nodes based on 
         the parent statement MUST NOT be added, removed or  
         updated by management protocols, such as NETCONF,  
         RESTCONF or other management operations (e.g., SNMP  
         and CLI requests) except when indicated by the  
         exceptions argument.
        
         Immutable data MAY be marked as config true to allow 
         'leafref', 'when' or 'must' constraints to be based 
         on it.
  
         The statement MUST only be a substatement of the leaf, 
         leaf-list, container, list, anydata, anyxml statements.
         Zero or one immutable statement per parent statement 
         is allowed. 
         No substatements are allowed.
  
         The argument is a list of space-separated operations that 
         are permitted to be used for the specified node, while 
         other operations are forbidden by the immutable extension.
         - create: allows users to create instances of the data node
         - update: allows users to modify instances of the data node
         - delete: allows users to delete instances of the data node

         To disallow all user write access, omit the argument;

         To allow only create and delete user access, provide 
         the string 'create delete' for the 'exceptions' parameter.

         Equivalent YANG definition for this extension:
          
         leaf immutable {
           type bits {
             bit create;
             bit update;
             bit delete;
           }
           default '';
         }
         
         Immutability specified by the use of the 'immutable' extension 
         statement (including any exception argument) is inherited by all 
         child and descendant nodes of a container or a list. It is possible 
         to override the inherited immutability property by placing another 
         immutable extension statement on a specific child/descendant node.  
        
         Adding immutable or removing values from the 
         exceptions argument of an existing immutable statement 
         are non-backwards compatible changes. 
         Other changes to immutable are backwards compatible.";
    }    

    md:annotation immutable {
      type boolean;
      description
        "The 'immutable' annotation indicates the immutability of an 
         instantiated data node. Any data node instance marked as 
         'immutable=true' is read-only to clients and cannot be 
         updated through NETCONF, RESTCONF or CLI. It applies to the
         list and leaf-list entries. If a list entry is annotated 
         with immutable='true', the whole instance is read-only and 
         including any contained descendant data nodes. 
         The default is 'immutable=false' if not specified for an instance.";
    }
  }
 &lt;CODE ENDS&gt;</artwork>
      </figure>
    </section>

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

        <figure>
          <artwork>URI: urn:ietf:params:xml:ns:yang:ietf-immutable 
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 one module name in the 'YANG Module Names'
        registry, defined in <xref target="RFC6020"/>.</t>

        <figure>
          <artwork>name: ietf-immutable 
prefix: im 
namespace: urn:ietf:params:xml:ns:yang:ietf-immutable 
RFC: XXXX 
// RFC Ed.: replace XXXX and remove this comment</artwork>
        </figure>
      </section>
    </section>

    <section anchor="security" title="Security Considerations">
      <t>The YANG module specified in this document defines a YANG extension
      and a metadata Annotation. These can be used to further restrict write
      access but cannot be used to extend access rights.</t>

      <t>This document does not define any protocol-accessible data nodes.</t>

      <t>Since immutable information is tied to applied configuration values,
      it is only accessible to clients that have the permissions to read the
      applied configuration values.</t>

      <t>The security considerations for the Defining and Using Metadata with
      YANG (see Section 9 of [RFC7952]) apply to the metadata annotation
      defined in this document.</t>
    </section>

    <section anchor="Acknowledgements" numbered="no" title="Acknowledgements">
      <t>Thanks to Kent Watsen, Andy Bierman, Robert Wilton, Jan Lindblad,
      Reshad Rahman, Anthony Somerset, Lou Berger, Joe Clarke, Scott Mansfield
      for reviewing, and providing important input to, this document.</t>
    </section>
  </middle>

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

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

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

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

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

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

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

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

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

      <reference anchor="TS32.156">
        <front>
          <title>Telecommunication management; Fixed Mobile Convergence (FMC)
          Model repertoire,
          &lt;https://www.3gpp.org/ftp/Specs/archive/32_series/32.156/32156-h10.zip&gt;</title>

          <author>
            <organization>3GPP</organization>
          </author>

          <date month="" year=""/>
        </front>
      </reference>

      <reference anchor="TS28.623">
        <front>
          <title>Telecommunication management; Generic Network Resource Model
          (NRM) Integration Reference Point (IRP); Solution Set (SS)
          definitions,
          &lt;https://www.3gpp.org/ftp/Specs/archive/28_series/28.623/28623-i02.zip&gt;</title>

          <author>
            <organization>3GPP</organization>
          </author>

          <date month="" year=""/>
        </front>
      </reference>

      <reference anchor="TR-531">
        <front>
          <title>UML to YANG Mapping Guidelines,
          &lt;https://wiki.opennetworking.org/download/attachments/376340494/Draft_TR-531_UML-YANG_Mapping_Gdls_v1.1.03.docx?version=5&amp;modificationDate=1675432243513&amp;api=v2&gt;</title>

          <author>
            <organization>ONF</organization>
          </author>

          <date month="2" year="2023"/>
        </front>
      </reference>
    </references>

    <section anchor="detailed_use_cases" title="Detailed Use Cases">
      <section title="UC1 - Modeling of server capabilities">
        <t>System capabilities might be represented as system-defined data
        nodes in the model. Configurable data nodes might need constraints
        specified as "when", "must" or "path" statements to ensure that
        configuration is set according to the system's capabilities. E.g.,
        <list style="symbols">
            <t>A timer can support the values 1,5,8 seconds. This is defined
            in the leaf-list 'supported-timer-values'.</t>

            <t>When the configurable 'interface-timer' leaf is set, it should
            be ensured that one of the supported values is used. The natural
            solution would be to make the 'interface-timer' a leaf-ref
            pointing at the 'supported-timer-values'.</t>
          </list> However, this is not possible as 'supported-timer-values'
        must be read-only thus config=false while 'interface-timer' must be
        writable thus config=true. According to the rules of YANG it is not
        allowed to put a constraint between config true and false schema
        nodes.</t>

        <t>The solution is that the supported-timer-values data node in the
        YANG Model shall be defined as "config true" and shall also be marked
        with the "immutable" extension making it unchangable. After this the
        'interface-timer' shall be defined as a leaf-ref pointing at the
        'supported-timer-values'.</t>
      </section>

      <section title="UC2 - HW based autoconfiguration - Interface Example">
        <t>This section shows how to use immutable YANG extension to mark some
        data node as immutable.</t>

        <t>When an interface is physically present, the system will create an
        interface entry automatically with valid name and type values in
        &lt;system&gt; (if exists, see <xref
        target="I-D.ietf-netmod-system-config"/>). The system-generated data
        is dependent on and must represent the HW present, and as a
        consequence must not be changed by the client. The data is modelled as
        "config true" and should be marked as immutable.</t>

        <t>Seemingly an alternative would be to model the list and these
        leaves as "config false", but that does not work because: <list
            style="symbols">
            <t>The list cannot be marked as "config false", because it needs
            to contain configurable child nodes, e.g., ip-address or
            enabled;</t>

            <t>The key leaf (name) cannot be marked as "config false" as the
            list itself is config true;</t>

            <t>The type cannot be marked "config false", because we MAY need
            to reference the type to make different configuration nodes
            conditionally available.</t>
          </list>The immutability of the data is the same for all interface
        instances, thus following fragment of a fictional interface module
        including an "immutable" YANG extension can be used:<figure>
            <artwork>     container interfaces {
       list interface {
         key "name";
         leaf name {
           type string;
         }
         leaf type {
           im:immutable "create delete";
           type identityref {
             base ianaift:iana-interface-type;
           }
           mandatory true;
         }
         leaf mtu {
           type uint16;
         }
         leaf-list ip-address {
           type inet:ip-address;
         } 
       }
     }</artwork>
          </figure></t>

        <t>Note that the "name" leaf is defined as a list key which can never
        been modified for a particular list entry, there is no need to mark
        "name" as immutable.</t>

        <section anchor="error-update"
                 title="Error Response to Client Updating the Value of an Interface Type">
          <t>This section shows an example of an error response due to the
          client modifying an immutable configuration.</t>

          <t>Assume the system creates an interface entry named "eth0" given
          that an inerface is inserted into the device. If a client tries to
          change the type of an interface to a value that doesn't match the
          real type of the interface used by the system, the request will be
          rejected by the server: <figure>
              <artwork>&lt;rpc message-id="101"
     xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" 
     xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;  
  &lt;edit-config&gt; 
    &lt;target&gt; 
      &lt;running/&gt; 
    &lt;/target&gt;  
    &lt;config&gt; 
      &lt;interface xc:operation="merge"
            xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type"&gt; 
        &lt;name&gt;eth0&lt;/name&gt;  
        &lt;type&gt;ianaift:tunnel&lt;/type&gt; 
      &lt;/interface&gt; 
    &lt;/config&gt; 
  &lt;/edit-config&gt; 
&lt;/rpc&gt;

&lt;rpc-reply message-id="101"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;  
  &lt;rpc-error&gt; 
    &lt;error-type&gt;application&lt;/error-type&gt;  
    &lt;error-tag&gt;invalid-value&lt;/error-tag&gt;  
    &lt;error-severity&gt;error&lt;/error-severity&gt;  
    &lt;error-path xmlns:t="http://example.com/schema/1.2/config"&gt;
      /interfaces/interface[name="eth0"]/type
    &lt;/error-path&gt;  
    &lt;error-message xml:lang="en"&gt;
      Invalid type for interface eth0
    &lt;/error-message&gt; 
  &lt;/rpc-error&gt; 
&lt;/rpc-reply&gt;</artwork>
            </figure></t>
        </section>
      </section>

      <section title="UC3 - Predefined Access control Rules">
        <t>Setting up detailed rules for access control is a complex task.
        (see <xref target="RFC8341"/>) A vendor may provide an initial,
        predefined set of groups and related access control rules so that the
        customer can use access control out-of-the-box. The customer may
        continue using these predefined rules or may add his own groups and
        rules. The predefined groups shall not be removed or altered
        guaranteeing that access control remains usable and basic functions
        e.g., a system-security-administrator are always available.</t>

        <t>The system needs to protect the predefined groups and rules,
        however, the list "groups" or the list "rule-list" cannot be marked as
        config=false or with the "immutable" extension in the YANG model
        because that would prevent the customer adding new entries. Still it
        would be good to notify the client in a machine readable way that the
        predefined entries cannot be modified. When the client retrieves
        access control data the immutable="true" metadata annotation should be
        used to indicate to the client that the predefined groups and rules
        cannot be modified.</t>
      </section>

      <section title="UC4 - Declaring System defined configuration unchangeable">
        <t>As stated in <xref target="I-D.ietf-netmod-system-config"/> the
        device itself might supply some configuration. As defined in that
        document in section "5.4. Modifying (overriding) System Configuration"
        the server may allow some parts of system configuration to be modified
        while other parts of the system configuration are non-modifiable. The
        immutable extension or metadata annotation can be used to define which
        parts are non-modifiable and to inform the client about this fact.</t>
      </section>

      <section title="UC5 - Immutable BGP AS number and peer type">
        <t>An autonomous system (AS) number is assigned and used primarily
        with BGP to uniquely identify each network system. Changing AS
        attribute will cause it to delete all the current routing entries and
        learning new ones, during which process it might lead to traffic
        disruption. It is usually not allowed to modify the AS attribute once
        it is configured unless all BGP configurations are removed.</t>

        <t>Another example is the type attribute of BGP neighbors. The peer
        type of the BGP neighbor is closely related to the network topology:
        external BGP (EBGP) peer type relationships are established between
        BGP routers running in different ASs; while internal BGP (IBGP) peer
        type relationships are established between BGP routers running in the
        same AS. Thus BGP peer type cannot be changed to the value which does
        not match the actual one. Since there are EBGP/IBGP-specific
        configurations which need to reference the "peer-type" node (e.g., in
        "when" statement) and be conditionally available, it can only be
        modelled as "config true" but immutable.</t>

        <t>Following is the fragment of a simplified BGP module with the
        /bgp/as and /bgp/neighbor/peer-type defined as immutable:<figure>
            <artwork>container bgp {
  leaf as {
    im:immutable "create delete";
    type inet:as-number;
    mandatory true;
    description
      "Local autonomous system number of the router.";
  }
  list neighbor {
    key "remote-address";
    leaf remote-address {
      type inet:ip-address;
      description
        "The remote IP address of this entry's BGP peer.";
    }
    leaf peer-type {
      im:immutable "create delete";
      type enumeration {
        enum ebgp {
         description
           "External (EBGP) peer.";
        }
        enum ibgp {
          description
            "Internal (IBGP) peer.";
        }
      }
      mandatory true;
      description
        "Specify the type of peering session associated with this 
         neighbor. The value can be IBGP or EBGP.";
    }
    leaf ebgp-max-hop {
      when "../peer-type='ebgp'";
      type uint32 {
        range "1..255";
      }
      description
        "The maximum number of hops when establishing an EBGP peer
         relationship with a peer on an indirectly-connected network.
         By default, an EBGP connection can be set up only on a
         directly-connected physical link.";
    }
  }
}</artwork>
          </figure></t>
      </section>

      <section title="UC6 - Modeling existing data handling behavior in other standard organizations">
        <t>A number of standard organizations and industry groups (ITU-T,
        3GPP, ORAN) already use concepts similar to immutability. These
        modeling concepts sometimes go back to more than 10 years and cannot
        be and will not be changed irrespective of the YANG RFCs. Some of
        these organizations are introducing YANG modelling. Without a formal
        YANG statement to define data nodes immutable the property is only
        defined in plain Englist text in the description statement. The
        immutable extension and/or metadata annotation can be used to define
        these existing model properties in a machine-readable way.</t>
      </section>
    </section>

    <section anchor="Existing_implementations"
             title="Existing implementations">
      <t>There are already a number of full or partial implementations of
      immutability. <list>
          <t>3GPP TS 32.156 <xref target="TS32.156"/> and 28.623 <xref
          target="TS28.623"/>: Requirements and a partial solution</t>

          <t>ITU-T using ONF TR-531<xref target="TR-531"/> concept on
          information model level but no YANG representation.</t>

          <t>Ericsson: requirements and solution</t>

          <t>YumaPro: requirements and solution</t>

          <t>Nokia: partial requirements and solution</t>

          <t>Huawei: partial requirements and solution</t>

          <t>Cisco using the concept at least in some YANG modules</t>

          <t>Junos OS provides a hidden and immutable configuration group
          called junos-defaults</t>
        </list></t>
    </section>

    <section title="Changes between revisions">
      <t>Note to RFC Editor (To be removed by RFC Editor)</t>

      <t>v04 - v05<list style="symbols">
          <t>Emphasized that the proposal tries to formally document existing
          allowed behavior</t>

          <t>Reword the abstract and introduction sections;</t>

          <t>Restructure the document;</t>

          <t>Simplified the interface example in Appendix;</t>

          <t>Add immutable BGP AS number and peer-type configuration
          example.</t>

          <t>Added temporary section in Annex B about list of existing
          non-standard solutions</t>

          <t>Clarified inheritance of immutability</t>

          <t>Clarified that this draft is not dependent on the existence of
          the &lt;system&gt; datastore.</t>
        </list></t>

      <t>v03 - v04<list style="symbols">
          <t>Clarify how immutable flag interacts with NACM mechanism.</t>
        </list></t>

      <t>v02 - v03<list style="symbols">
          <t>rephrase and avoid using "server MUST reject" statement, and try
          to clarify that this documents aims to provide visibility into
          existing immutable behavior;</t>

          <t>Add a new section to discuss the inheritance of immutability;</t>

          <t>Clarify that deletion to an immutable node in &lt;running&gt;
          which is instantiated in &lt;system&gt; and copied into
          &lt;running&gt; should always be allowed;</t>

          <t>Clarify that write access restriction due to general YANG rules
          has no need to be marked as immutable.</t>

          <t>Add an new section named "Acknowledgements";</t>

          <t>editoral changes.</t>
        </list></t>

      <t>v01 - v02<list style="symbols">
          <t>clarify the relation between the creation/deletion of the
          immutable data node with its parent data node;</t>

          <t>Add a "TODO" comment about the inheritance of the immutable
          property;</t>

          <t>Define that the server should reject write attempt to the
          immutable data node at an &lt;edit-config&gt; operation time, rather
          than waiting until a &lt;commit&gt; or &lt;validate&gt; operation
          takes place;</t>
        </list></t>

      <t>v00 - v01 <list style="symbols">
          <t>Added immutable extension</t>

          <t>Added new use-cases for immutable extension and annotation</t>

          <t>Added requirement that an update that means no effective change
          should always be allowed</t>

          <t>Added clarification that immutable is only applied to read-write
          datastore</t>

          <t>Narrowed the applied scope of metadata annotation to
          list/leaf-list instances</t>
        </list></t>
    </section>

    <section title="Open Issues tracking">
      <t><list style="symbols">
          <t>Can we do better about the "immutable" terminology?</t>

          <t>Is a Boolean type for immutable metadata annotation
          sufficient?</t>

          <t>Can immutable data be removed due to a when or choice
          statement?</t>
        </list></t>
    </section>
  </back>
</rfc>
