<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wilton-netconf-yang-push-2-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="YANG-Push v2">YANG Datastore Telemetry (YANG Push version 2)</title>
    <seriesInfo name="Internet-Draft" value="draft-wilton-netconf-yang-push-2-00"/>
    <author fullname="Robert Wilton" role="editor">
      <organization>Cisco Systems</organization>
      <address>
        <email>rwilton@cisco.com</email>
      </address>
    </author>
    <author fullname="Holger Keller">
      <organization>Deuetsche Telekom</organization>
      <address>
        <email>Holger.Keller@telekom.de</email>
      </address>
    </author>
    <author fullname="Benoit Claise">
      <organization>Everything OPS</organization>
      <address>
        <email>benoit@everything-ops.net</email>
      </address>
    </author>
    <author fullname="Ebben Aries">
      <organization>Juniper</organization>
      <address>
        <email>exa@juniper.net</email>
      </address>
    </author>
    <author fullname="James Cumming">
      <organization>Nokia</organization>
      <address>
        <email>james.cumming@nokia.com</email>
      </address>
    </author>
    <author fullname="Thomas Graf">
      <organization>Swisscom</organization>
      <address>
        <email>Thomas.Graf@swisscom.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <area>Operations and Management</area>
    <workgroup>Network Configuration</workgroup>
    <keyword>YANG Push</keyword>
    <keyword>Observability</keyword>
    <keyword>Network Telemetry</keyword>
    <keyword>Operational Data</keyword>
    <abstract>
      <?line 129?>

<t>YANG Push version 2 is a YANG datastore telemetry solution, as an alternative lightweight specification to the Subscribed Notifications and YANG Push solution, specifically optimized for the efficient observability of operational data.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://rgwilton.github.io/draft-yp-observability/draft-wilton-netconf-yp-observability.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-wilton-netconf-yang-push-2/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Network Configuration Working Group mailing list (<eref target="mailto:netconf@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/netconf/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/netconf/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/rgwilton/draft-yp-observability"/>.</t>
    </note>
  </front>
  <middle>
    <?line 133?>

<section anchor="document-status">
      <name>Document Status</name>
      <t><em>RFC Editor: If present, please remove this section before publication.</em>
        <em>RFC Editor: Please replace 'RFC XXXX' with the RFC number for this RFC.</em></t>
      <t>Based on the feedback received during the IETF 121 NETCONF session, this document has currently been written as a self-contained lightweight protocol and document replacement for <xref target="RFC8639"/> and <xref target="RFC8641"/>, defining a separate configuration data model.</t>
      <t><strong>The comparison between YANG Push and YANG Push v2 is now in <xref target="DifferencesFromYangPush"/>.</strong></t>
      <t><strong>Open issues are either now being tracked inline in the text or in <xref target="OpenIssuesTracker"/> for the higher level issues.</strong></t>
    </section>
    <section anchor="conventions">
      <name>Conventions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>All <em>YANG tree diagrams</em> used in this document follow the notation
defined in <xref target="RFC8340"/>.</t>
    </section>
    <section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="I-D.ietf-nmop-yang-message-broker-integration"/> describes an architecture for how YANG datastore telemetry, e.g., <xref target="RFC8641"/>, can be integrated effectively with message brokers, e.g., <xref target="Kafka"/>, that forms part of a wider architecture for a <em>Network Anomaly Detection Framework</em>, specified in <xref target="I-D.ietf-nmop-network-anomaly-architecture"/>.</t>
      <t>This document specifies "YANG Push v2", an lightweight alternative to Subscribed Notifications <xref target="RFC8639"/> and YANG Push <xref target="RFC8641"/>. YANG Push v2 is a separate YANG datastore telemetry solution, which can be implemented independently or, if desired, alongside <xref target="RFC8639"/> and <xref target="RFC8641"/>.</t>
      <t>At a high level, YANG Push v2 is designed to solve a similar set of requirements as YANG Push, and it reuses a significant subset of the ideas and base solution from YANG Push.  YANG Push v2 defines a separate data model to allow concurrent implementation of both protocols and to facilitate more significant changes in behavior, but many of the data nodes are taken from YANG Push and have the same, or very similar definitions.</t>
      <t>The following sections give the background for the solution, and highlight the key ways that this specification differs from the specifications that it is derived from.</t>
      <section anchor="background-and-motivation-for-yang-push-v2">
        <name>Background and Motivation for YANG Push v2</name>
        <t>A push based telemetry solution, as described both in this document and also the YANG Push solution described by <xref target="RFC8639"/> and <xref target="RFC8641"/>, is beneficial because it allows operational data to be exported by publishers more immediately and efficiently compared to legacy poll based mechanisms, such as SNMP <xref target="RFC3411"/>.  Some further background information on the general motivations for push based telemetry, which equally apply here, can be found in the <em>Motivation</em> (section 1.1) of <xref target="RFC8639"/> and the Introduction (section 1) of <xref target="RFC8641"/>.  The remainder of this section is focused on the reasons why a new lightweight version of YANG Push has been specified, and what problems is aims to solve.</t>
        <t>Early implementation efforts of the <xref target="I-D.ietf-nmop-yang-message-broker-integration"/> architecture hit issues with using either of the two common YANG datastore telemetry solutions that have been specified, i.e., <xref target="gNMI"/> or YANG Push <xref target="RFC8641"/>.</t>
        <t>gNMI is specified by the OpenConfig Industry Consortium.  It is more widely implemented, but operators report that some inter-operability issues between device implementations cause problems.  Many of the OpenConfig protocols and data models are also expected to evolve more rapidly than IETF protocols and models - that are expected to have a more gradual pace of evolution once an RFC has been published.</t>
        <t>YANG Push <xref target="RFC8641"/> was standardized by the IETF in 2019, but market adoption has been rather slow.  During 2023/2024, when vendors started implementing, or considering implementing, YANG Push, it was seen that some design choices for how particular features have been specified in the solution make it expensive and difficult to write performant implementations, particularly when considering the complexities and distributed nature of operational data.  In addition, some design choices of how the data is encoded (e.g., YANG Patch <xref target="RFC8072"/>) make more sense when considering changes in configuration data but less sense when the goal is to export a subset of the operational data off the device in an efficient fashion for both devices (publishers) and clients (receivers).</t>
        <t>Hence, during 2024, the vendors and operators working towards YANG telemetry solutions agreed to a plan to implement a subset of <xref target="RFC8639"/> and <xref target="RFC8641"/>, including common agreements of features that are not needed and would not be implemented, and deviations from the standards for some aspects of encoding YANG data.  In addition, the implementation efforts identified the minimal subset of functionality needed to support the initial telemetry use cases, and areas of potential improvement and optimization to the overall YANG Push telemetry solution (which has been written up as a set of small internet drafts that augment or extend the base YANG Push solution).</t>
        <t>Out of this work, consensus was building to specify a cut down version of Subscribed Notifications <xref target="RFC8639"/> and YANG Push <xref target="RFC8641"/> that is both more focussed on the operational telemetry use case and is also easier to implement, achieved by relaxing some of the constraints on consistency on the device, and removing, or simplifying some of the operational features.  This has resulted in this specification, YANG Push v2.</t>
        <t>The implementation efforts also gave rise to potential improvements to the protocol and encoding of notification messages.</t>
      </section>
      <section anchor="OperationalModellingComplexities">
        <name>Complexities in Modelling the Operational State Datastore</name>
        <t>The YANG abstraction of a single datastore of related consistent data works very well for configuration that has a strong requirement to be self consistent, and that is always updated, and validated, in a transactional way.  But for producers of telemetry data, the YANG abstraction of a single operational datastore is not really possible for devices managing a non-trivial quantity of operational data.</t>
        <t>Some systems may store their operational data in a single logical database, yet it is less likely that the operational data can always be updated in a transactional way, and often for memory efficiency reasons such a database does not store individual leaves, but instead semi-consistent records of data at a container or list entry level.</t>
        <t>For other systems, the operational information may be distributed across multiple internal nodes (e.g., linecards), and potentially many different process daemons within those distributed nodes.  Such systems generally do not, and cannot, exhibit full consistency <xref target="Consistency"/> of the operational data (which would require transactional semantics across all daemons and internal nodes), only offering an eventually consistent <xref target="EventualConsistency"/> view of the data instead.</t>
        <t>In practice, many network devices will manage their operational data as a combination of some data being stored in a central operational datastore, and other, higher scale, and potentially more frequently changing data (e.g., statistics or FIB information) being stored elsewhere in a more memory efficient and performant way.</t>
      </section>
      <section anchor="complexities-for-consumers-of-yang-push-data">
        <name>Complexities for Consumers of YANG Push Data</name>
        <t>For the consumer of the telemetry data, there is a requirement to associate a schema with the instance-data that will be provided by a subscription.  One approach is to fetch and build the entire schema for the device, e.g., by fetching YANG library, and then use the subscription XPath to select the relevant subtree of the schema that applies only to the subscription.  The problem with this approach is that if the schema ever changes, e.g., after a software update, then it is reasonably likely of some changes occurring with the global device schema even if there are no changes to the schema subtree under the subscription path.  Hence, it would be helpful to identify and version the schema associated with a particular subscription path, and also to encoded the instance data relatively to the subscription path rather than as an absolute path from the root of the operational datastore.</t>
        <t><strong>TODO More needs to be added here, e.g., encoding, on-change considerations.  Splitting subscriptions up.</strong></t>
        <t>This document proposes a new opt-in YANG-Push encoding format to use instead of the "push-update" and "push-change-update" notifications defined in <xref target="RFC8641"/>.</t>
        <ol spacing="normal" type="1"><li>
            <t>To allow the device to split a subscription into smaller child subscriptions for more efficient independent and concurrent processing.  I.e., reusing the ideas from <xref target="I-D.ietf-netconf-distributed-notif"/>.  However, all child subscriptions are still encoded from the same subscription point.</t>
          </li>
        </ol>
        <section anchor="combined-periodic-and-on-change-subscription">
          <name>Combined periodic and on-change subscription</name>
          <t>Sometimes it is helpful to have a single subscription that covers both periodic and on-change notifications.</t>
          <t>There are two ways in which this may be useful:</t>
          <ol spacing="normal" type="1"><li>
              <t>For generally slow changing data (e.g., a device's physical inventory), then on-change notifications may be most appropriate.  However, in case there is any lost notification that isn't always detected, for any reason, then it may also be helpful to have a slow cadence periodic backup notification of the data (e.g., once every 24 hours), to ensure that the management systems should always eventually converge on the current state in the network.</t>
            </li>
            <li>
              <t>For data that is generally polled on a periodic basis (e.g., once every 10 minutes) and put into a time series database, then it may be helpful for some data trees to also get more immediate notifications that the data has changed.  Hence, a combined periodic and on-change subscription, would facilitate more frequent notifications of changes of the state, to reduce the need of having to always wait for the next periodic event.</t>
            </li>
          </ol>
          <t>Hence, this document allows a single subscription to be configured as both periodic and on-change.</t>
        </section>
      </section>
      <section anchor="DraftRelationships">
        <name>Relationships to existing RFCs and Internet Drafts</name>
        <t>This document, specifying YANG Push v2, is intended to be a lightweight alternative for <xref target="RFC8639"/> and <xref target="RFC8641"/>, but that also incorporates various extensions since those RFCs were written.  Often substantial parts of those documents and models have been incorporated almost verbatim, but modified to fit the YANG Push v2 functionality and module structure.</t>
        <t>Hence, the authors of this draft would like to sincerely thank and acknowledge the very significant effort put into those RFCs and drafts by authors, contributors and reviewers.  In particular, We would like to thank the listed authors of these documents: Eric Voit, Alex Clemm, Alberto Gonzalez Prieto, Einar Nilsen-Nygaard, Ambika Prasad Tripathy, Balazs Lengyel, Alexander Clemm, Benoit Claise, Qin Wu, Qiufang Ma, Alex Huang Feng, Thomas Graf, Pierre Francois.</t>
        <section anchor="rfc-8639-and-rfc-8641">
          <name>RFC 8639 and RFC 8641</name>
          <t>This document is primarily intended to be a lightweight alternative for <xref target="RFC8639"/> and <xref target="RFC8641"/>, but it intentionally reuses substantial parts of the design and data model of those RFCs.</t>
          <t>YANG Push v2 is defined using a separate module namespace, and hence can be implemented independently or, if desired, alongside <xref target="RFC8639"/> and <xref target="RFC8641"/>, and the various extensions to YANG Push.</t>
          <t>A more complete description of the main differences in YANG Push v2 compares to <xref target="RFC8639"/> and <xref target="RFC8641"/> is given in <xref target="DifferencesFromYangPush"/>.</t>
        </section>
        <section anchor="i-ddraft-ietf-netconf-notif-envelope-and-rfc-5277">
          <name><xref target="I-D.draft-ietf-netconf-notif-envelope"/> and RFC 5277</name>
          <t>All of the notifications defined in this specification, i.e., both the datastore update message and subscription lifecycle update notifications (<xref target="LifecycleNotifications"/>) depend upon and use the notification envelope format defined in <xref target="I-D.draft-ietf-netconf-notif-envelope"/>.</t>
          <t>As such, this specification does not make any use of the notification format defined in <xref target="RFC5277"/>, but this does not prevent implementations using <xref target="RFC5277"/> format notifications for other YANG notifications, e.g., for the "NETCONF" event stream defined in <xref target="RFC5277"/>.</t>
        </section>
        <section anchor="rfc-9196-and-i-ddraft-netana-netconf-yp-transport-capabilities">
          <name>RFC 9196 and <xref target="I-D.draft-netana-netconf-yp-transport-capabilities"/></name>
          <t>This document uses the capabilities concepts defined in <xref target="RFC9196"/>.</t>
          <t>In particular, it augments into the ietf-system-capabilities YANG module, but defines an equivalent alternative capability structure for the ietf-notification-capabilities YANG module, which defines the capabilities for YANG Push <xref target="RFC8641"/>.</t>
          <t>The generic transport capabilities defined in <xref target="I-D.draft-netana-netconf-yp-transport-capabilities"/> have been incorporated into the ietf-yang-push-2 YANG module, to augment YANG Push v2 transport capabilities and to use the different identities.</t>
        </section>
        <section anchor="i-ddraft-ietf-netconf-https-notif-and-i-ddraft-ietf-netconf-udp-notif">
          <name><xref target="I-D.draft-ietf-netconf-https-notif"/> and <xref target="I-D.draft-ietf-netconf-udp-notif"/></name>
          <t>The ietf-yang-push-2 YANG module has subsumed and extended the <em>receivers</em> data model defined in the ietf-subscribed-notif-receivers YANG module defined in <xref target="I-D.draft-ietf-netconf-https-notif"/>.</t>
          <t>The overall YANG Push v2 solution anticipates and requires new bis versions of both of these transports documents that augment into the <em>receivers/receiver/transport-type</em> choice statement, and also augment the transport identity defined in the ietf-yang-push-2 data model.</t>
        </section>
        <section anchor="i-ddraft-ietf-netconf-distributed-notif">
          <name><xref target="I-D.draft-ietf-netconf-distributed-notif"/></name>
          <t>This document reuses the work from <xref target="I-D.draft-ietf-netconf-distributed-notif"/>, but with some changes to work with the YANG Push v2 data models.  This is described in <xref target="distributed-notifications"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="overview">
      <name>YANG Push v2 Overview</name>
      <t>This document specifies a lightweight telemetry solution that provides a subscription service for updates to the state and changes in state from a chosen datastore.</t>
      <t>Subscriptions specify when notification messages (also referred to as <em>updates</em>) should be sent, what data to include in the update records, and where those notifications should be sent.</t>
      <t>A YANG Push v2 subscription comprises:</t>
      <ul spacing="normal">
        <li>
          <t>a target datastore for the subscription, where the monitored subscription data is logically sourced from.</t>
        </li>
        <li>
          <t>a set of selection filters to choose which datastore nodes from the target datastore the subscription is monitoring or sampling, as described in <xref target="pathsAndFilters"/>.</t>
        </li>
        <li>
          <t>a choice of how update event notifications for the datastore's data nodes are triggered.  I.e., either periodic sampling of the current state, on-change event-driven, or both.  These are described in <xref target="UpdateTriggers"/>.</t>
        </li>
        <li>
          <t>a choice of encoding of the messages, e.g., JSON, or CBOR.</t>
        </li>
        <li>
          <t>a receiver to which datastore updates and subscription notifications are sent, as described in <xref target="receivers"/>;  </t>
          <ul spacing="normal">
            <li>
              <t>for configured subscriptions, the receivers parameters are configured, and specify transport, receiver, and encoding parameters.</t>
            </li>
            <li>
              <t>for dynamic subscriptions, the receiver uses the same transport session on which the dynamic subscription has been created.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>If a subscription is valid and acceptable to the publisher, and if a suitable connection can be made to the receiver associated with a subscription, then the publisher will enact the subscription, periodically sampling or monitoring changes to the chosen datastore's data nodes that match the selection filter.  Push updates are subsequently sent by the publisher to the receiver, as per the terms of the subscription.</t>
      <t>Subscriptions may be set up in two ways: either through configuration - or YANG RPCs to create and manage dynamic subscriptions.  These two mechanisms are described in <xref target="ConfiguredAndDynamic"/>.</t>
      <t>Changes to the state of subscription are notified to receivers as subscription lifecycle notifications.  These are described in <xref target="LifecycleNotifications"/>.</t>
      <t>Security access control mechanisms, e.g., NACM {RFC8341}} can be used to ensure the receivers only get access to the information for which they are allowed.  This is further described in <xref target="security"/>.</t>
      <t>While the functionality defined in this document is transport agnostic, transports like the Network Configuration Protocol (NETCONF) <xref target="RFC6241"/> or RESTCONF <xref target="RFC8040"/> can be used to configure or dynamically signal subscriptions.  In the case of configured subscription, the transport used for carrying the subscription notifications is entirely independent from the protocol used to configure the subscription, and other transports, e.g., <xref target="I-D.draft-ietf-netconf-udp-notif"/> defines a simple UDP based transport for Push notifications. Transport considerations are described in <xref target="transports"/>. <strong>TODO the reference to draft-ietf-netconf-udp-notif isn't right, it wouldn't be that draft, but a -bis version of it.  James is querying whether we need this at all</strong></t>
      <t><strong>TODO Introduce capabilities and operational monitoring</strong></t>
      <t>This document defines a YANG data model, that includes RPCs and notifications, for configuring and managing subscriptions and associated configuration, and to define the format of a <em>update</em> notification message.  The YANG model is defined in <xref target="yang-push-2-yang-module"/> and associated tree view in <xref target="yang-push-2-tree"/>.  The YANG data model defined in this document conforms to the Network Management Datastore Architecture defined in <xref target="RFC8342"/>.</t>
    </section>
    <section anchor="terminology">
      <name>Definitions</name>
      <t>This document reuses the terminology defined in <xref target="RFC7950"/>, <xref target="RFC8341"/>, <xref target="RFC8342"/>, <xref target="RFC8639"/> and <xref target="RFC8641"/>.</t>
      <t>The following terms are taken from <xref target="RFC8342"/>:</t>
      <ul spacing="normal">
        <li>
          <t><em>Datastore</em>: A conceptual place to store and access information.  A datastore might be implemented, for example, using files, a database, flash memory locations, or combinations thereof.  A datastore maps to an instantiated YANG data tree.</t>
        </li>
        <li>
          <t><em>Client</em>: An entity that can access YANG-defined data on a server, over some network management protocol.</t>
        </li>
        <li>
          <t><em>Configuration</em>: Data that is required to get a device from its initial default state into a desired operational state.  This data is modeled in YANG using "config true" nodes.  Configuration can originate from different sources.</t>
        </li>
        <li>
          <t><em>Configuration datastore</em>: A datastore holding configuration.</t>
        </li>
      </ul>
      <t>The following terms are taken from <xref target="RFC8639"/>:</t>
      <ul spacing="normal">
        <li>
          <t><em>Configured subscription</em>: A subscription installed via configuration into a configuration datastore.</t>
        </li>
        <li>
          <t><em>Dynamic subscription</em>: A subscription created dynamically by a subscriber via a Remote Procedure Call (RPC).</t>
        </li>
        <li>
          <t><em>Event</em>: An occurrence of something that may be of interest.  Examples include a configuration change, a fault, a change in status, crossing a threshold, or an external input to the system.</t>
        </li>
        <li>
          <t><em>Event occurrence time</em>: A timestamp matching the time an originating process identified as when an event happened.</t>
        </li>
        <li>
          <t><em>Event record</em>: A set of information detailing an event.</t>
        </li>
        <li>
          <t><em>Event stream</em>: A continuous, chronologically ordered set of events aggregated under some context.</t>
        </li>
        <li>
          <t><em>Event stream filter</em>: Evaluation criteria that may be applied against event records in an event stream.  Event records pass the filter when specified criteria are met.</t>
        </li>
        <li>
          <t><em>Notification message</em>: Information intended for a receiver indicating that one or more events have occurred.</t>
        </li>
        <li>
          <t><em>Publisher</em>: An entity responsible for streaming notification messages per the terms of a subscription.</t>
        </li>
        <li>
          <t><em>Receiver</em>: A target to which a publisher pushes subscribed event records.  For dynamic subscriptions, the receiver and subscriber are the same entity.</t>
        </li>
        <li>
          <t><em>Subscriber</em>: A client able to request and negotiate a contract for the generation and push of event records from a publisher.  For dynamic subscriptions, the receiver and subscriber are the same entity.</t>
        </li>
      </ul>
      <t>The following terms are taken from <xref target="RFC8641"/>:</t>
      <ul spacing="normal">
        <li>
          <t><em>Datastore node</em>: A node in the instantiated YANG data tree associated with a datastore.  In this document, datastore nodes are often also simply referred to as "objects".</t>
        </li>
        <li>
          <t><em>Datastore node update</em>: A data item containing the current value of a datastore node at the time the datastore node update was created, as well as the path to the datastore node.</t>
        </li>
        <li>
          <t><em>Datastore subscription</em>: A subscription to a stream of datastore node updates.</t>
        </li>
        <li>
          <t><em>Datastore subtree</em>: A datastore node and all its descendant datastore nodes.</t>
        </li>
        <li>
          <t><em>On-change subscription</em>: A datastore subscription with updates that are triggered when changes in subscribed datastore nodes are detected.</t>
        </li>
        <li>
          <t><em>Periodic subscription</em>: A datastore subscription with updates that are triggered periodically according to some time interval.</t>
        </li>
        <li>
          <t><em>Selection filter</em>: Evaluation and/or selection criteria that may be applied against a targeted set of objects.</t>
        </li>
        <li>
          <t><em>Update record</em>: A representation of one or more datastore node updates.  In addition, an update record may contain which type of update led to the datastore node update (e.g., whether the datastore node was added, changed, or deleted).  Also included in the update record may be other metadata, such as a subscription id of the subscription for which the update record was generated.  In this document, update records are often also simply referred to as "updates".</t>
        </li>
        <li>
          <t><em>Update trigger</em>: A mechanism that determines when an update record needs to be generated.</t>
        </li>
        <li>
          <t><em>YANG-Push</em>: The subscription and push mechanism for datastore updates that is specified in <xref target="RFC8641"/>.</t>
        </li>
      </ul>
      <t>This document introduces the following terms:</t>
      <ul spacing="normal">
        <li>
          <t><em>Subscription</em>: A registration with a publisher, stipulating the information the receiver wishes to have pushed from the publisher without the need for further solicitation.</t>
        </li>
        <li>
          <t><em>Subscription Identifier</em>: A numerical identifier for a configured or dynamic subscription.  Also referred to as the subscription-id.</t>
        </li>
        <li>
          <t><em>YANG-Push-Lite</em>: The light weight subscription and push mechanism for datastore updates that is specified in this document. <strong>Add comment</strong></t>
        </li>
      </ul>
      <t>This document also uses the terminology from <xref target="I-D.ietf-netconf-distributed-notif"/> in <xref target="distributed-notifications"/> and the related examples in <xref target="distrib-notif-example"/>.</t>
    </section>
    <section anchor="pathsAndFilters">
      <name>Subscription paths and selection filters</name>
      <t>A key part of a subscription is to select which data nodes should be monitored, and so a subscription must specify both the selection filters and the datastore against which these selection filters will be applied.  This information is used to choose, and subsequently push, <em>update</em> notifications from the publisher's datastore(s) to the subscription's receiver.</t>
      <t>Filters can either be defined inline within a configured subscription (<xref target="SubscriptionYangTree"/>), a dynamic subscription's <em>establish-subscription</em> RPC (<xref target="EstablishSubscriptionYangTree"/>), or as part of the <em>datastore-telemetry/filters</em> container (<xref target="FilterContainerYangTree"/>) which can then be referenced from a configured or dynamic subscription.</t>
      <t>The following selection filter types are included in the YANG Push v2 data model and may be applied against a datastore:</t>
      <ul spacing="normal">
        <li>
          <t><em>YPaths</em>: A list of basic YANG path selection filters that defines a path to a subtree of data nodes in the data tree, with some simple constraints on keys. See <xref target="YPaths"/>.</t>
        </li>
        <li>
          <t><em>subtree</em>: A subtree selection filter identifies one or more datastore subtrees.  When specified, <em>update</em> records will only include the datastore nodes of selected datastore subtree(s).  The syntax and semantics correspond to those specified in <xref target="RFC6241"/>, Section 6.</t>
        </li>
        <li>
          <t><em>XPaths</em>: A list of <em>XPath</em> (<xref target="XPATH"/>) selection filter expressions.  When specified, updates will only come from the selected datastore nodes that match the node set associated with the XPath expression.</t>
        </li>
      </ul>
      <t>These filters are used as selectors that define which data nodes fall within the scope of a subscription.  A publisher <bcp14>MUST</bcp14> support YPath filters, and <bcp14>MAY</bcp14> also support subtree or XPath filters.</t>
      <t>For both YPath and XPath based filters, each filter may define a list of path expressions.  Each of these filter path expressions <bcp14>MAY</bcp14> be processed by the publisher independently, and if two or more filter path expressions end up selecting overlapping data nodes then the publisher <bcp14>MAY</bcp14> notify duplicate values for those data nodes, but the encoded data that is returned <bcp14>MUST</bcp14> always be syntactically valid, i.e., as per section 5.3 of <xref target="RFC8342"/>.</t>
      <section anchor="YPaths">
        <name><em>YPath</em> definition</name>
        <t>A <em>YPath</em> represents a simple path into a YANG schema tree, where some of the list key values may be constrained.</t>
        <t>It is encoded in the similar format to the YANG JSON encoding for instance-identifier, section 6.11 of <xref target="RFC7951"/>, except with more flexibility on the keys, in that keys may be left-out or be bound to a regular expression filter.</t>
        <t>The rules for constructing a YPath are:</t>
        <ul spacing="normal">
          <li>
            <t>A YPath is a sequence of data tree path segment separated by a '/' character.  If the path starts with a '/' then it is absolute path from the root of the schema, otherwise it is a relative path, where the context of the relative path must be declared.</t>
          </li>
          <li>
            <t>Constraints on key values may be specified within a single pair of '[' ']' brackets, where:  </t>
            <ul spacing="normal">
              <li>
                <t>keys may be given in any order, and may be omitted, in which case they match any value.  Key matches are separated by a comma (,) with optional space character either side.</t>
              </li>
              <li>
                <t>key match is given by <em>&lt;key&gt;=&lt;value&gt;</em>, with optional space characters either side of the equals (=), and value is specified as:      </t>
                <ul spacing="normal">
                  <li>
                    <t>'&lt;value&gt;', for an exact match of the key's value.  Single quote characters (') must be escaped with a backslash (\).</t>
                  </li>
                  <li>
                    <t>r'&lt;reg-expr&gt;', for a regex match of the key value using <xref target="RFC9485"/>, and where the regular-expression is a full match of the string, i.e, it implicit anchors to the start and end of the value.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
        <t>Some examples of YPaths:</t>
        <ul spacing="normal">
          <li>
            <t><em>/ietf-interfaces:interfaces/interface[name='eth0']/ietf-ip:ipv6/ip</em> - which identifies is 'ipv6/ip' data node in the ietf-ip module for the 'eth0' interface.</t>
          </li>
          <li>
            <t><em>/ietf-interfaces:interfaces/interface[name=r'eth.*']/ietf-ip:ipv6/ip</em> - which identifies all interfaces with a name that start with "eth".</t>
          </li>
          <li>
            <t><em>/example:multi-keys-list[first-key='foo', second-key=r'bar.*']</em> - which identifies all entries in the 'multi-keys-list, where the first-key matches foo, and the second-key starts with bar.</t>
          </li>
          <li>
            <t><em>/ietf-interfaces:interfaces/interface</em> - which identifies the <em>interface</em> list data node in the ietf-interfaces module for all interfaces.  I.e., the interface list 'name' key is unrestricted.</t>
          </li>
          <li>
            <t><em>/ietf-interfaces:interfaces/interface[]</em> - alternative form of the previous YPath.</t>
          </li>
        </ul>
      </section>
      <section anchor="the-filters-container">
        <name>The "filters" Container</name>
        <t>The "filters" container maintains a list of all datastore subscription filters that persist outside the lifecycle of a single subscription.  This enables predefined filters that may be referenced by more than one configured or dynamic subscription.</t>
        <t>Below is a tree diagram for the "filters" container.  All objects contained in this tree are described in the YANG module in <xref target="ietf-yang-push-2-yang"/>.</t>
        <figure anchor="FilterContainerYangTree">
          <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-config
  +--rw datastore-telemetry!
     +--rw filters
        +--rw filter* [name]
           +--rw name             string
           +--rw (filter)
              +--:(path)
              |  +--rw path       ypath
              +--:(subtree)
              |  +--rw subtree    <anydata>
              +--:(xpath)
                 +--rw xpath      yang:xpath1.0 {yp2:xpath}?

  augment /yp2:subscription-started/yp2:target:
    +-- filter-ref?   filter-ref
  augment /yp2:subscription-modified/yp2:target:
    +-- filter-ref?   filter-ref
]]></sourcecode>
        </figure>
      </section>
      <section anchor="decomposing-subscription-filters">
        <name>Decomposing Subscription Filters</name>
        <t>In order to address the issues described in <xref target="OperationalModellingComplexities"/>, YANG Push v2 allows for publishers to send subtrees of data nodes in separate <em>update</em> notifications, rather than requiring that the subscription data be returned as a single datastore <em>update</em> notification covering all data nodes matched by the subscription filter.  This better facilitates publishers that internally group some of their operational data fields together into larger structures for efficiency, and avoids publishers or receivers having to consume potentially very large notification messages.  For example, each entry in the <em>/ietf-interfaces:interface/interface</em> list could be represented as an object of data internally within the publisher.  In essence, a client specified subscription filter can be decomposed by a publisher into more specific non-overlapping filters that are then used to return the data.</t>
        <t>In particular:</t>
        <ol spacing="normal" type="1"><li>
            <t>A Publisher <bcp14>MAY</bcp14> decompose a client specified subscription filter path into a set of non-overlapping subscription filter paths that collectively cover the same data.  The publisher is allowed to return data for each of these decomposed subscription filter paths in separate <em>update</em> notification messages, each with separate, perhaps more precise, <em>observation-time</em> timestamps, but all using the same notification <em>event-time</em>.</t>
          </li>
          <li>
            <t>A Publisher <bcp14>MAY</bcp14> split large lists into multiple separate update messages, each with separate <em>observation-time</em> timestamps, but all using the same notification <em>event-time</em>.  E.g., if a device has 10,000 entries in a list, it may return them in a single response, or it may split them into multiple smaller messages, perhaps for 500 interfaces at a time.</t>
          </li>
        </ol>
        <!--
1. A Publisher is allowed to generate on-change notifications at an *object* level, which hence may contain other associated fields that may not have changed state, rather than restricting the on-change notifications strictly to only those specific fields that have changed state.  E.g., if a subscribers registers on the path */ietf-interfaces:interfaces/interface\[name = \*\]/oper-status*, and if interface *eth1* had a change in the *oper-status* leaf state, then rather than just publishing the updated *oper-status* leaf, the publisher may instead publish all the data associated with that interface entry object, i.e., everything under */ietf-interfaces:interface/interface\[name = eth1\]*.  **TODO Does it have to be the entire subtree that is published?  Do we need to add a capability annotation to indicate the object publication paths?**
-->

<t>To ensure that clients can reasonably process data returned via decomposed filters then:</t>
        <ol spacing="normal" type="1"><li>
            <t><em>update</em> notifications <bcp14>MUST</bcp14> indicate the precise subtree of data that the update message is updating or replacing, i.e., so a receiver can infer that data nodes no longer being notified by the publisher have been deleted:  </t>
            <ul spacing="normal">
              <li>
                <t>if we support splitting list entries in multiple updates, then something like a <em>more_data</em> flag is needed to indicate that the given update message is not complete.</t>
              </li>
            </ul>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="events">
      <name>Datastore Event Streams</name>
      <t>In YANG Push v2, a subscription, based on the selected filters, will generate a ordered stream of datastore <em>update</em> records that is referred to as an event stream.  Each subscription logically has a different event stream of update records, even if multiple subscriptions use the same filters to select datastore nodes.</t>
      <t>As YANG-defined event records are created by a system, they may be assigned to one or more streams.  The event record is distributed to a subscription's receiver where (1) a subscription includes the identified stream and (2) subscription filtering does not exclude the event record from that receiver.</t>
      <t>Access control permissions may be used to silently exclude event records from an event stream for which the receiver has no read access.  See <xref target="RFC8341"/>, Section 3.4.6 for an example of how this might be accomplished.  Note that per Section 2.7 of this document, subscription state change notifications are never filtered out. <strong>TODO, filtering and NACM filtering should be dependent on whether it is a configured or dynamic subscription.</strong></t>
      <t>If subscriber permissions change during the lifecycle of a subscription and event stream access is no longer permitted, then the subscription <bcp14>MUST</bcp14> be terminated. <strong>TODO, check this</strong></t>
      <t>Event records <bcp14>SHALL</bcp14> be sent to a receiver in the order in which they were generated.  I.e., the publisher <bcp14>MUST</bcp14> not reorder the events when enqueuing notifications on the transport session, but there is no guarantee of delivery order.</t>
      <t>Event records <bcp14>MUST NOT</bcp14> be sent before a <em>subscription-started</em> notification (<xref target="SubscriptionStartedNotification"/>) or after a <em>subscription-terminated</em> notification (<xref target="SubscriptionTerminatedNotification"/>).</t>
      <section anchor="FullNotificationExample">
        <name>Notification Envelope</name>
        <t>All notifications in the event stream <bcp14>MUST</bcp14> be encoded using <xref target="I-D.draft-ietf-netconf-notif-envelope"/> to wrap the notification message, and <bcp14>MUST</bcp14> include the <em>event-time</em>, <em>hostname</em>, and <em>sequence-number</em> leafs in all messages.  The <em>publisher-id</em> <bcp14>MAY</bcp14> be excluded in it matches the default value (0), otherwise it <bcp14>MUST</bcp14> be included.</t>
        <t>The following example illustrates a fully encoded <em>update</em> notification that includes the notification envelope and additional meta-data fields.  The <em>update</em> notification, i.e., as defined via the <em>notification</em> statement in the yang-push-lite YANG module, is carried in the <em>contents</em> anydata data node.</t>
        <t>The <em>event-time</em> field is used to correlate separate <em>update</em> messages that collectively represent individual parts of the same update (e.g., where the source data is being obtained from multiple producers).</t>
        <figure>
          <name>Example of update notification including notification envelope</name>
          <sourcecode type="json"><![CDATA[
{
  "ietf-yp-notification:envelope": {
    "event-time": "2024-10-10T08:00:05.22Z",
    "hostname": "example-router",
    "sequence-number": 3219,
    "contents": {
      "ietf-yang-push-2:update": {
        "id": 1011,
        "path-prefix": "/ietf-interfaces:interfaces",
        "snapshot-type": "periodic",
        "observation-time": "2024-10-10T08:00:05.11Z",
        "updates": [
          {
            "target-path": "interface",
            "replace-by": {
              "interface": [
                {
                  "name": "eth0",
                  "type": "iana-if-type:ethernetCsmacd",
                  "enabled": true,
                  "oper-status": "up",
                  "admin-status": "up"
                },
                {
                  "name": "eth1",
                  "type": "iana-if-type:ethernetCsmacd",
                  "enabled": true,
                  "oper-status": "up",
                  "admin-status": "up"
                }
              ]
            }
          }
        ]
      }
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="EventRecords">
        <name>Event Records</name>
        <t>A single <em>update</em> record is used for all datastore notifications.  It is used to report the current state of a set of data nodes at a given target path for either periodic, on-change, or resync notifications, and also for on-change notifications to indicate that the data node at the given target path has been deleted.</t>
        <t>The schema for this notifications is given in the following tree diagram:</t>
        <figure>
          <name>'update' notification</name>
          <sourcecode type="yangtree"><![CDATA[
    +---n update
    |  +--ro id?                 subscription-id
    |  +--ro path-prefix?        string
    |  +--ro snapshot-type       enumeration
    |  +--ro observation-time?   yang:date-and-time
    |  +--ro updates* [target-path]
    |  |  +--ro target-path          string
    |  |  +--ro (data)?
    |  |     +--:(merge)
    |  |     |  +--ro merge?         <anydata>
    |  |     +--:(replaced-by)
    |  |     |  +--ro replaced-by?   <anydata>
    |  |     +--:(deleted)
    |  |        +--ro deleted?       empty
    |  +--ro complete?           boolean
]]></sourcecode>
        </figure>
        <t>The normative definitions for the notifications fields are given in the YANG module in <xref target="ietf-yang-push-2-yang"/>.  The fields can be informatively summarized as:</t>
        <ul spacing="normal">
          <li>
            <t><em>id</em> - identifies the subscription the notification relates to.</t>
          </li>
          <li>
            <t><em>path-prefix</em> - identifies the absolute instance-data path to which all target-paths are data are encoded relative to.</t>
          </li>
          <li>
            <t><em>snapshot-type</em> - this indicates what type of event causes the update message to be sent.  I.e., a periodic collection, an on-change event, or a resync collection.</t>
          </li>
          <li>
            <t><em>observation-time</em> - the time that the data was sampled, or when the on-change event occurred that caused the message to be published.</t>
          </li>
          <li>
            <t><em>target-path</em> - identifies the data node that is being acted on by the <em>merge</em>, <em>replace-by</em>, or <em>deleted</em> data.</t>
          </li>
          <li>
            <t><em>data</em> - A choice representing the action taken and the updated data, which is one of the following:  </t>
            <ul spacing="normal">
              <li>
                <t><em>merge</em> - identifies the data node that the receiver should merge with their current view of that data node.  I.e., all descendant data nodes reporting values should replace those held by the receiver, but the absence of a decendent data node does not imply that it no longer exists and hence should be deleted.</t>
              </li>
              <li>
                <t><em>replaced-by</em> - identifies the data node that replaces the copy of that data node in the receiver's state.  Any descendent data nodes not present in the update no longer exist and hence should be implicitly deleted in the receiver's current state.</t>
              </li>
              <li>
                <t><em>deleted</em> - indicates that the data node no longer exists and should be deleted in the receivers state.  This field <em><bcp14>MUST NOT</bcp14></em> be sent in an <em>on-change</em> update message.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><em>complete</em> - if present, this flag indicates whether the notification is complete or whether more messages as part of the same update will follow.  The default value for the flag depends on the <em>snapshot-type</em>.  For <em>on-change</em> events, the messages are assumed to be completed until the <em>complete</em> leaf is set to <tt>false</tt>.  For other type of events (e.g., periodic), the messages are assumed to be incomplete unless the <em>complete</em> leaf is set to <tt>true</tt>.  Setting this flag to <tt>true</tt> is semantically equivalent to the server sending a separate <em>update-complete</em> notification.</t>
          </li>
        </ul>
        <t>As per the structure of the <em>update</em> notification, a single notification <bcp14>MAY</bcp14> provide updates for multiple target-paths.</t>
      </section>
      <section anchor="UpdateTriggers">
        <name>Types of subscription event monitoring</name>
        <t>Subscription can either be based on sampling the requested data on a periodic cadence or being notified when the requested data changes.  In addition, this specification allows for subscriptions that both notify on-change and also with a periodic cadence, which can help ensure that the system eventually converges on the right state, even if on-change notification were somehow lost or mis-processed anywhere in the data processing pipeline.</t>
        <t>The schema for the update-trigger container is given in the following tree diagram:</t>
        <figure>
          <name>'update-trigger' container</name>
          <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-config
  +--rw datastore-telemetry!
     +--rw subscriptions
        +--rw subscription* [id]
           +--rw update-trigger
              +--rw periodic!
              |  +--rw period         centiseconds
              |  +--rw anchor-time?   yang:date-and-time
              +--rw on-change! {on-change}?
                 +--rw sync-on-start?   boolean

  augment /yp2:subscription-started/yp2:target:
    +-- filter-ref?   filter-ref
  augment /yp2:subscription-modified/yp2:target:
    +-- filter-ref?   filter-ref
]]></sourcecode>
        </figure>
        <t>The normative definitions for the update-trigger fields are given in the <em>ietf-yang-push-2</em> YANG module in <xref target="ietf-yang-push-2-yang"/>.  They are also described in the following sections.</t>
      </section>
      <section anchor="periodic-events">
        <name>Periodic events</name>
        <t>In a periodic subscription, the data included as part of an update record corresponds to data that could have been read using a retrieval operation.  Only the state that exists in the system at the time that it is being read is reported, periodic updates never explicitly indicate whether any data-nodes or list entries have been deleted.  Instead, receivers must infer deletions by the absence of data during a particular collection event.</t>
        <t>Where possible, publishers <bcp14>SHOULD</bcp14> use the <em>replaced-by</em> data node to represent the new data since it provides clients with simple explicit semantics.  Publishers <bcp14>MAY</bcp14> use the <em>merge</em> data node when they cannot determine whether the data being published in the update is complete.</t>
        <t>For periodic subscriptions, triggered updates will occur at the boundaries of a specified time interval.  These boundaries can be calculated from the periodic parameters:</t>
        <ul spacing="normal">
          <li>
            <t>a <em>period</em> that defines the duration between push updates.</t>
          </li>
          <li>
            <t>an <em>anchor-time</em>; update intervals fall on the points in time that are a multiple of a <em>period</em> from an <em>anchor-time</em>.  If an <em>anchor-time</em> is not provided, then the publisher chooses a suitable anchor-time, e.g., perhaps the time that the subscription was first instantiated by the publisher.</t>
          </li>
        </ul>
        <t>The anchor time and period are particularly useful, in fact required, for when the collected telemetry data is being stored in a time-series database and the subscription is setup to ensure that each collection is placed in a separate time-interval bucket.</t>
        <t>Periodic update notifications are expected, but not required, to use a single <em>target-path</em> per <em>update</em> notification.</t>
      </section>
      <section anchor="on-change-events">
        <name>On-Change events</name>
        <t>In an on-change subscription, <em>update</em> records indicate updated values or when a monitored data node or list node has been deleted.  An <em>update</em> record is sent whenever a change in the subscribed information is detected. In the case that data nodes have been changed then the <em>update</em> record <bcp14>SHOULD</bcp14> only report the state that has changed (included any required list keys), but <bcp14>MAY</bcp14> include additional unchanged data nodes if the publisher is unable to optimize the on-change update message.</t>
        <t>Each entry in the <em>updates</em> list identifies a data node (i.e., list entry, container, leaf or leaf-list), via the <em>target-path</em> that either has changes is state or has been deleted.</t>
        <t>A delete of a specific individual data node or subtree may be notified in two different ways:</t>
        <ul spacing="normal">
          <li>
            <t>if the data that is being deleted is below the <em>target-path</em> then the delete is implicit by the publisher returning the current data node subtree with the delete data nodes missing.  I.e., the receiver must implicitly infer deletion.</t>
          </li>
          <li>
            <t>if the data node is being deleted at the target path.  E.g., if an interface is deleted then an entire list entry related to that interface may be removed.  In this case, the <em>target path</em> identifies the list entry that is being deleted, but the data returned is just an empty object <tt>{}</tt>, which replaces all the existing data for that object in the receiver. <strong>TODO, is this better as a delete flag, or separate delete list?</strong></t>
          </li>
        </ul>
        <t>On-change subscriptions also support the following additional parameters:</t>
        <ul spacing="normal">
          <li>
            <t><em>sync-on-start</em> defines whether or not a complete snapshot of all subscribed data is sent at the start of a subscription.  Such early synchronization establishes the frame of reference for subsequent updates.  For each data node covered by an on-change with sync-on-start subscription, then an <em>sync-on-start</em> <em>update</em> notification containing the current state <bcp14>MUST</bcp14> be sent before any on-change <em>update</em> notifications for those same data nodes.  However, <em>sync-on-start</em> and <em>on-change</em> <em>update</em> notifications may be interleaved for different data-nodes under the subscription.  Unsolicited <em>sync-on-start update</em> notifications <bcp14>MUST NOT</bcp14> be sent, they <bcp14>MUST</bcp14> only be sent after a subscription has started.</t>
          </li>
        </ul>
        <section anchor="OnChangeConsiderations">
          <name>On-Change Notifiable Datastore Nodes</name>
          <t>Publishers are not required to support on-change notifications for all data nodes, and they may not be able to generate on-change updates for some data nodes.  Possible reasons for this include:</t>
          <ul spacing="normal">
            <li>
              <t>the value of the datastore node changes frequently (e.g., the in-octets counter as defined in <xref target="RFC8343"/>),</t>
            </li>
            <li>
              <t>small object changes that are frequent and meaningless (e.g., a temperature gauge changing 0.1 degrees),</t>
            </li>
            <li>
              <t>or no implementation is available to generate a notification when the source variable for a particular data node has changed.</t>
            </li>
          </ul>
          <t>In addition, publishers are not required to notify every change or value for an on-change monitored data node.  Instead, publishers <bcp14>MAY</bcp14> limit the rate at which changes are reported for a given data node, i.e., effectively deciding the interval at which an underlying value is sampled.  If a data node changes value and then reverts back to the original value within a sample interval then the publisher <bcp14>MAY</bcp14> not detect the change and it would go unreported.  However, if the data node changes to a new value after it has been sampled, then the change and latest state <bcp14>MUST</bcp14> be reported to the receiver.  In addition, if a client was to query the value (e.g., through a NETCONF get-data RPC) then they <bcp14>MUST</bcp14> see the same observed value as would be notified.</t>
          <t>To give an example, if the interface link state reported by hardware is changing state hundreds of times per second, then it would be entirely reasonable to limit those interface state changes to a much lower cadence, e.g., perhaps every 100 milliseconds.  In the particular case of interfaces, there may also be data model specific forms of more advanced dampening that are more appropriate, e.g., that notify interface down events immediately, but rate limit how quickly the interface is allowed to transition to up state, which overall acts as a limit on the rate at which the interface state may change, and hence also act as a limit on the rate at which on-change notifications could be generated.</t>
          <t>The information about what nodes support on-change notifications is reported using capabilities operational data model.  This is further described in <xref target="ConformanceAndCapabilities"/>.</t>
        </section>
        <section anchor="on-change-considerations">
          <name>On-Change Considerations</name>
          <t>On-change subscriptions allow receivers to receive updates whenever changes to targeted objects occur.  As such, on-change subscriptions are particularly effective for data that changes infrequently but for which applications need to be quickly notified, with minimal delay, whenever a change does occur.</t>
          <t>On-change subscriptions tend to be more difficult to implement than periodic subscriptions.  Accordingly, on-change subscriptions may not be supported by all implementations or for every object.</t>
          <t>Whether or not to accept or reject on-change subscription requests when the scope of the subscription contains objects for which on-change is not supported is up to the publisher implementation.  A publisher <bcp14>MAY</bcp14> accept an on-change subscription even when the scope of the subscription contains objects for which on-change is not supported.  In that case, updates are sent only for those objects within the scope of the subscription that do support on-change updates, whereas other objects are excluded from update records, even if their values change.  In order for a subscriber to determine whether objects support on-change subscriptions, objects are marked accordingly on a publisher.  Accordingly, when subscribing, it is the responsibility of the subscriber to ensure that it is aware of which objects support on-change and which do not.  For more on how objects are so marked, see Section 3.10. <strong>TODO Is this paragraph and the one below still the right choice for YANG Push v2?</strong></t>
          <t>Alternatively, a publisher <bcp14>MAY</bcp14> decide to simply reject an on-change subscription if the scope of the subscription contains objects for which on-change is not supported.  In the case of a configured subscription, the publisher <bcp14>MAY</bcp14> keep the subscription in <em>inactive</em> state.</t>
        </section>
      </section>
      <section anchor="combined-periodic-and-on-change-subscriptions">
        <name>Combined periodic and on-change subscriptions</name>
        <t>A single subscription may created to generate notifications both when changes occur and on a periodic cadence.  Such subscriptions are equivalent to having separate periodic and on-change subscriptions on the same path, except that they share the same subscription-id and filter paths.</t>
      </section>
      <section anchor="streaming-update-examples">
        <name>Streaming Update Examples</name>
        <t><xref target="PeriodicExample"/> provides an example of a notification message for a subscription tracking the operational status of interface (per <xref target="RFC8343"/>).  This notification message is encoded using JSON <xref target="RFC7951"/>.</t>
        <figure anchor="PeriodicExample">
          <name>Example periodic update message</name>
          <sourcecode type="JSON" name="periodic-update-msg.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "path-prefix": "/ietf-interfaces:interfaces/interface",
    "snapshot-type": "periodic",
    "observation-time": "2024-10-10T08:00:05.11Z",
    "updates": [
      {
        "target-path": "",
        "merge": {
          "interface": [
            {
              "name": "eth0",
              "type": "iana-if-type:ethernetCsmacd",
              "enabled": true,
              "ietf-interfaces:oper-status": "up",
              "ietf-interfaces:admin-status": "up"
            },
            {
              "name": "eth1",
              "type": "iana-if-type:ethernetCsmacd",
              "enabled": true,
              "ietf-interfaces:oper-status": "up",
              "ietf-interfaces:admin-status": "up"
            }
          ]
        }
      }
    ],
    "complete": false
  }
}
]]></sourcecode>
        </figure>
        <t><xref target="OnChangeExample"/> provides an example of an on-change notification message for
the same subscription.</t>
        <figure anchor="OnChangeExample">
          <name>Example on-change update message</name>
          <sourcecode type="JSON" name="on-change-multi-update.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "path-prefix": "/ietf-interfaces:interfaces",
    "snapshot-type": "on-change-update",
    "observation-time": "2025-10-10T08:16:06.11Z",
    "updates": [
      {
        "target-path": "interface[name='eth0']",
        "replaced-by": {
          "name": "eth0",
          "type": "iana-if-type:ethernetCsmacd",
          "enabled": false,
          "ietf-interfaces:oper-status": "down"
        }
      },
      {
        "target-path": "interface[name='eth1']",
        "replaced-by": {
          "name": "eth1",
          "type": "iana-if-type:ethernetCsmacd",
          "enabled": false,
          "ietf-interfaces:oper-status": "down"
        }
      }
    ]
  }
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="ReceiversEtAl">
      <name>Receivers, Transports, and Encodings</name>
      <section anchor="receivers">
        <name>Receivers</name>
        <t>Every subscription is associated with a receiver, which identifies the destination host, transport and encoding settings, where all notifications for a subscription are sent.</t>
        <t>For configured subscriptions there is no explicit association with an existing transport session, and hence the properties associated with the receiver are explicitly configured, as described in <xref target="ConfiguredReceivers"/>.</t>
        <t>For dynamic subscriptions, the receiver, and most associated properties are implicit from the session on which the dynamic subscription was initiated, as described in <xref target="DynamicSubscriptionReceivers"/>.</t>
        <section anchor="ConfiguredReceivers">
          <name>Receivers for Configured Subscriptions</name>
          <t>For configured subscriptions, receivers are configured independently from the subscriptions and then referenced from the subscription configuration.</t>
          <!--All subscription notifications, including lifecycle notifications ({{LifecycleNotifications}}).-->

<t>Below is a tree diagram for <em>datastore-telemetry/receivers</em> container. All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <t>These parameters identify how to connect to each receiver.  For each subscription, the publisher uses the referenced receiver configuration to establish transport connectivity to the receiver.</t>
          <figure anchor="ReceiversYangTree">
            <name>datastore-telemetry/receivers container</name>
            <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-config
  +--rw datastore-telemetry!
     +--rw receivers
        +--rw receiver* [name]
           +--rw name                      string
           +--rw encoding                  yp2:encoding
           +--rw dscp?                     inet:dscp
           +---x reset
           +--rw (notification-message-origin)?
           |  +--:(interface-originated)
           |  |  +--rw source-interface?   if:interface-ref
           |  |          {interface-designation}?
           |  +--:(address-originated)
           |     +--rw source-vrf?         leafref {supports-vrf}?
           |     +--rw source-address?     inet:ip-address-no-zone
           +--rw (transport-type)

  augment /yp2:subscription-started/yp2:target:
    +-- filter-ref?   filter-ref
  augment /yp2:subscription-modified/yp2:target:
    +-- filter-ref?   filter-ref
]]></sourcecode>
          </figure>
          <t>Each configured receiver has the following associated properties:</t>
          <ul spacing="normal">
            <li>
              <t>a <em>name</em> to identify and reference the receiver in the subscription configuration.</t>
            </li>
            <li>
              <t>a <em>transport</em>, which identifies the transport protocol to use for all connections to the receiver.  </t>
              <ul spacing="normal">
                <li>
                  <t>any transport-specific related parameters, some of which may be mandatory, others optional to specify, e.g., DSCP.  There are likely to be various data nodes related to establishing appropriate security and encryption.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>an <em>encoding</em> to encode all YANG notification messages to the receiver, i.e., see <xref target="Encodings"/>.</t>
            </li>
            <li>
              <t>optional parameters to identify where traffic should egress the publisher:  </t>
              <ul spacing="normal">
                <li>
                  <t>a <em>source-interface</em>, identifying the egress interface to use from the publisher, implicitly choosing the source IP address and VRF.</t>
                </li>
                <li>
                  <t>a <em>source-vrf</em>, identifying the Virtual Routing and Forwarding (VRF) instance on which to reach receivers.  This VRF is a network instance as defined in <xref target="RFC8529"/>.  Publisher support for VRFs is optional and advertised using the <em>supports-vrf</em> feature.</t>
                </li>
                <li>
                  <t>a <em>source-address</em> address, identifying the IP address to source notification messages from.</t>
                </li>
              </ul>
              <t>
If none of the above parameters are set, the publisher <bcp14>MAY</bcp14> choose which interface(s) and address(es) to source subscription notifications from.</t>
            </li>
          </ul>
          <t>This specification is transport independent, e.g., see <xref target="transports"/>, and thus the YANG module defined in <xref target="yang-push-2-yang-module"/> cannot directly define and expose these transport parameters.  Instead, receiver-specific transport connectivity parameters <bcp14>MUST</bcp14> be configured via transport-specific augmentations to the YANG choice node <em>/datastore-telemetry/receivers/receiver/transport-type</em>.</t>
          <t>A publisher supporting configured subscriptions clearly must support at least one YANG data model that augments transport connectivity parameters onto <em>/datastore-telemetry/receivers/receiver/transport-type</em>.  For an example of a similar such augmentation (but for YANG Push), see <xref target="I-D.draft-ietf-netconf-udp-notif"/>. <strong>TODO, this reference and text will need to be updated to a UDP-notif bis document, that augments the new YANG Push v2 receiver path.</strong></t>
        </section>
        <section anchor="DynamicSubscriptionReceivers">
          <name>Receivers for Dynamic Subscriptions</name>
          <t>For dynamic subscriptions, each subscription has a single receiver that is implicit from the host that initiated the <em>establish-subscription</em> RPC, reusing the same transport session for all the subscription notifications.</t>
          <t>Hence most receiver parameters for a dynamic subscription, e.g., related to the transport, are implicitly determined and cannot be explicitly controlled.</t>
          <t>Dynamic subscriptions <bcp14>MUST</bcp14> specify an encoding (see <xref target="Encodings"/>) and <bcp14>MAY</bcp14> specify DSCP Marking (see <xref target="DSCP"/>) for the telemetry notifications in the <em>establish-subscription</em> RPC (see <xref target="EstablishSubscriptionYangTree"/>).</t>
        </section>
        <section anchor="ReceiverStates">
          <name>Receiver Session States and State Machine</name>
          <t>Each subscription will need to establish a subscription to the specified receiver.  Multiple subscriptions may share one or more transport sessions to the same receiver.</t>
          <t>A receiver in YANG Push v2 can be in one of the following states:</t>
          <ul spacing="normal">
            <li>
              <t><strong>Configured</strong>: The receiver has been configured on the publisher, but the receiver is not referenced by any valid subscriptions and hence there is no attempt to establish a connection to the receiver.</t>
            </li>
            <li>
              <t><strong>Connecting</strong>: The receiver has at least one associated subscription and the publisher is attempting to establish a transport session and complete any required security exchanges, but this process has not yet succeeded.</t>
            </li>
            <li>
              <t><strong>Active</strong>: The receiver has at least one associated subscription, a transport session has been established (if required), security exchanges have successfully completed, and the publisher is able to send notifications to the receiver.</t>
            </li>
          </ul>
          <t>The state transitions for a receiver are illustrated below:</t>
          <figure anchor="ReceiverStateDiagram">
            <name>Receiver Session State Diagram</name>
            <artwork align="left"><![CDATA[
                    .-------------------.
                    |                   |
                    |    Configured     |
                    |                   |
                    '-------------------'
                            |  ^
  Receiver is referenced by |  |  No configured subscriptions
  1 or more subscriptions   |  |  reference the receiver
                            v  |
                    .-------------------.
                    |                   |
                    |    Connecting     |
                    |                   |
                    '-------------------'
                            |  ^
  Transport and/or security |  |  Transport or security session
  has been established.     |  |  has been lost or failed.
                            v  |
                    .-------------------.
                    |                   |
                    |      Active       |
                    |                   |
                    '-------------------'
]]></artwork>
          </figure>
          <t>This state model allows implementations and operators to clearly distinguish between receivers that are simply configured, those that are in the process of connecting, and those that are actively being used.</t>
          <t>If the configuration has changed such that there were previously connections to a receiver, but that receiver is no longer referenced by valid subscriptions, then the publisher <bcp14>MUST</bcp14> close any associated transport sessions to the receiver, but <bcp14>MAY</bcp14> delay the closing for a short period of time (no more than 15 minutes) to potentially allow existing transport session to be reused by new subscriptions.</t>
        </section>
      </section>
      <section anchor="transports">
        <name>Transports</name>
        <t>This document describes a transport-agnostic mechanism for subscribing to YANG datastore telemetry.  Hence, separate specifications are required to define transports that support YANG Push v2.  The requirements for these transport specifications are documented in the following section:</t>
        <section anchor="requirements-for-yang-push-v2-transport-specifications">
          <name>Requirements for YANG Push v2 Transport Specifications</name>
          <t>This section provides requirements for any transport specifications supporting the YANG Push v2 solution presented in this document.</t>
          <t>The transport specification <bcp14>MUST</bcp14> provide YANG modules, to be implemented by publishers implementing the YANG Push configuration model in <xref target="config-subs-data-model"/>, that:</t>
          <ul spacing="normal">
            <li>
              <t>augments the <em>datastore-telemetry/receivers/transport-type</em> choice statement with a container that both identifies the transport and contains all transport specific parameters.</t>
            </li>
            <li>
              <t>augments <em>/sysc:system-capabilities/transport/transport-capabilities/</em> container with any transport specific capabilities or options (conditional on a YANG <em>when</em> statement).  Note, encodings for a given transport are advertised directly via the ietf-yang-push-2-capabilities YANG Model <xref target="yang-push-2-yang-capabilities-module"/>.</t>
            </li>
          </ul>
          <t>Using a secure transport is <bcp14>RECOMMENDED</bcp14>.  Thus, any transport specification <bcp14>MUST</bcp14> provide a mechanism to ensure secure communication between the publisher and receiver in a hostile environment, e.g., through the use of transport layer encryption.  Transport specifications <bcp14>MAY</bcp14> also specify a mechanism for unencrypted communications, which can be used when transport layer security is not required, e.g., if the transport session is being secured via another mechanism, or when operating within a controlled environment or test lab.</t>
          <t>Any transport specification <bcp14>SHOULD</bcp14> support mutual receiver and publisher authentication at the transport layer.</t>
          <t>The transport selected by the subscriber to reach the publisher <bcp14>SHOULD</bcp14> be able to support multiple "establish-subscription" requests made in the same transport session.</t>
          <t>The transport specification <bcp14>MUST</bcp14> specifying how multiple subscriptions referencing the same receiver are to be handled at the transport layer.  The transport specification <bcp14>MAY</bcp14> require separate transport sessions per subscription to a given receiver, or it <bcp14>MAY</bcp14> allow multiple subscriptions to the same receiver to be multiplexed over a shared transport session.</t>
          <t>A specification for a transport built upon this document can choose whether to use the same logical channel for the RPCs and the event records.  However, the <em>update</em> records and the subscription state change notifications <bcp14>MUST</bcp14> be sent on the same transport session.</t>
          <t>The transport specification <bcp14>MAY</bcp14> specify a keepalive mechanism to keep the transport session alive.  There is no YANG Push v2 protocol or application level keepalive mechanism.</t>
          <t><strong>TODO, do we need to mention anything about transport session timeouts, e.g., which would cause a subscription to be terminated.  What about buffering?  Is that a transport consideration?</strong></t>
          <t>Additional transport requirements may be dictated by the choice of transport used with a subscription.</t>
          <section anchor="DSCP">
            <name>DSCP Marking</name>
            <t>YANG Push v2 supports <em>dscp</em> marking to differentiate prioritization of notification messages during network transit.</t>
            <t>A receiver with a <em>dscp</em> leaf results in a corresponding Differentiated Services Code Point (DSCP) marking <xref target="RFC2474"/>} being placed in the IP header of any resulting <em>update</em> notification messages and subscription state change notifications.  A publisher <bcp14>MUST</bcp14> respect the DSCP markings for subscription traffic egressing that publisher.</t>
            <t>The transport specification <bcp14>MUST</bcp14> specify if there are any particular quality-of-service or class-of-service considerations related to handling DSCP settings associated with the subscription.</t>
          </section>
        </section>
      </section>
      <section anchor="Encodings">
        <name>Encodings</name>
        <t>The <em>update</em> notification (<xref target="EventRecords"/>) and subscription lifecycle notifications (<xref target="LifecycleNotifications"/>) can be encoded in any format that has a definition for encoding YANG data.  For a given subscription, all notification messages are encoded using the same encoding.</t>
        <t>Some IETF standards for YANG encodings known at the time of publication are:</t>
        <ul spacing="normal">
          <li>
            <t>JSON, defined in <xref target="RFC7951"/></t>
          </li>
          <li>
            <t>CBOR, defined in <xref target="RFC9254"/>, and <xref target="RFC9595"/> for using compressed schema identifiers (YANG SIDs)</t>
          </li>
          <li>
            <t>XML, defined in <xref target="RFC7950"/></t>
          </li>
        </ul>
        <t>To maximize interoperability, all implementations are <bcp14>RECOMMENDED</bcp14> to support both JSON and CBOR encodings (using regular YANG identifiers).  Constrained platforms may not be able to support JSON and hence may choose to only support CBOR encoding.  JSON encoding may not be supported in the scenario that another encoding becomes the defacto standard (e.g., as JSON has largely replaced XML as the defacto choice for text based encoding).  Support for the XML encoding and/or CBOR encoding using YANG SIDs is <bcp14>OPTIONAL</bcp14>.</t>
        <t>Encodings are defined in the <em>ietf-yang-push-2.yang</em> as YANG identities that derive from the <em>encoding</em> base identity.  Additional encodings can be defined by defining and implementing new identities that derive from the <em>encoding</em> base identity, and also advertising those identities as part of the ietf-yang-push-2-capabilities YANG module's transport capabilities <xref target="yang-push-2-yang-capabilities-module"/>.</t>
      </section>
    </section>
    <section anchor="ConfiguredAndDynamic">
      <name>Setting up and Managing Subscriptions</name>
      <t>Subscriptions can be set up and managed in two ways:</t>
      <ol spacing="normal" type="1"><li>
          <t>Configured Subscriptions - a subscription created and principally controlled by configuration.</t>
        </li>
        <li>
          <t>Dynamic Subscriptions - a subscription created and principally controlled via YANG RPCs from a telemetry receiver.</t>
        </li>
      </ol>
      <t>Conformant implementations <bcp14>MUST</bcp14> implement at least one of the two mechanisms above for establishing and maintaining subscriptions, but they <bcp14>MAY</bcp14> choose to only implement a single mechanism.</t>
      <t>The core behavior for both configured and dynamic subscription is the same, with the key differentiation being how they are provisioned, and how the transport is setup.  This next section describes the functionality that is common to both types of subscription, followed by the sections that describe the specifics and differences between the two ways of managing subscriptions.</t>
      <section anchor="CommonSubscriptionParameters">
        <name>Common Subscription Parameters</name>
        <t>All subscriptions require the following state to be instantiated:</t>
        <ul spacing="normal">
          <li>
            <t>an <em>id</em> to identify the subscription.</t>
          </li>
          <li>
            <t>the <em>target</em> for the subscription, comprising:
            </t>
            <ul spacing="normal">
              <li>
                <t>the target datastore, as per <xref target="RFC8342"/></t>
              </li>
              <li>
                <t>a set of selection filters to choose which datastore nodes the subscription is monitoring or sampling, as described in <xref target="pathsAndFilters"/>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>the <em>update-trigger</em> to indicate when <em>update</em> notifications are generated:
            </t>
            <ul spacing="normal">
              <li>
                <t><em>periodic</em>, for the publisher to send updated copies of the state on a periodic basis</t>
              </li>
              <li>
                <t><em>on-change</em>, for the publisher to send state updates when the internal state changes, i.e., event driven.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>receiver, transport, and encoding parameters, as per <xref target="receivers"/>.  How these are provided differs for configured vs dynamic subscriptions and is further explained in the sections below.</t>
          </li>
        </ul>
        <t>Subscription ids <bcp14>MUST</bcp14> be unique across all configured and dynamic subscriptions.  Configured subscription take precedence over dynamic subscription, so:</t>
        <ul spacing="normal">
          <li>
            <t>attempts to create a dynamic subscription with a subscription id that conflicts with any other subscription id (configured or dynamic) <bcp14>MUST</bcp14> fail,</t>
          </li>
          <li>
            <t>configuring a subscription, assuming it passes configuration validation, replaces any dynamic subscriptions with the same subscription id.  Thus, causing the dynamic subscription to be immediately terminated (see <xref target="TerminatingSubscriptions"/>).</t>
          </li>
          <li>
            <t>subscription ids starting with <tt>dyn-</tt> are reserved for the publisher to use for automatically allocate subscription ids for dynamic subscriptions when the client has choosen not to provide one in the <em>establish-subscription</em> RPC.</t>
          </li>
        </ul>
        <section anchor="subscription-states">
          <name>Subscription States</name>
          <t>YANG Push v2 has a small set of simple states for a subscription on a publisher.  These states are intended to help clients easily determine the health and status of a subscription.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Invalid</strong>: a subscription that is invalid for any reason.  E.g., the subscription references an invalid filter expression for the current device schema.  Normally, invalid configurations should be rejected by the system, whether due to subscription configuration or <em>establish-subscription</em> RPC, and hence this state should rarely be seen.</t>
            </li>
            <li>
              <t><strong>Inactive</strong>: a valid subscription, but one that is not active because it has no associated receiver.  This state is unlikely to be seen for dynamic subscriptions.</t>
            </li>
            <li>
              <t><strong>Connecting</strong>: a subscription that is valid, and has appropriate receiver configuration, but the publisher has not managed to successfully connect to the receiver yet, and hence has not sent a <em>subscription-started</em> notification.  Transport security failures would be in this state.</t>
            </li>
            <li>
              <t><strong>Active</strong>: a valid subscription, connected to the receiver, that has sent a <em>subscription-stated</em> notification and is generating <em>update</em> notifications, as per the terms of the subscription update policy.</t>
            </li>
            <li>
              <t><strong>Terminated</strong>: represents a subscription that has finished.  Subscriptions would only be expected to transiently be in this state and hence it would not normally be reported.  Terminated dynamic subscriptions, or unconfigured subscriptions, should quickly be removed from the operational state of the device.  Terminated</t>
            </li>
          </ul>
          <t>Below is a state diagram illustrating the states, and the likely changes between states.  However, this is not a formal state machine and publishers can move between arbitrary states based on changes to subscription properties, the system, connectivity to receivers, or resource constraints on the system.  New subscriptions should choose an appropriate starting state, e.g., either Inactive or Invalid.</t>
          <figure>
            <name>Publisher's States for a Subscription</name>
            <artwork><![CDATA[
                  .-------------------.         .-------------------.
                  |                   |         |                   |
                  |    Inactive       | <------>|     Invalid       |
                  |                   |         |                   |
                  '-------------------'         '-------------------'
                            ^
                            |
                            v
                  .-------------------.
                  |                   |
                  |    Connecting     |
                  |                   |
                  '-------------------'
                            ^
                            |
                            v
                  .-------------------.
                  |                   |
                  |    Active         |
                  |                   |
                  '-------------------'


                  .-------------------.
                  |                   |
                  |    Terminated     |
                  |                   |
                  '-------------------'
]]></artwork>
          </figure>
        </section>
        <section anchor="CreatingSubscriptions">
          <name>Creating Subscriptions</name>
          <t>After a subscription is successfully established, the publisher immediately sends a <em>subscription-started</em> subscription state change notification to the receiver.  It is quite possible that upon configuration, reboot, or even steady-state operations, a transport session may not be currently available to the receiver.</t>
          <t>With active configured subscriptions, it is allowable to buffer event records even after a <em>subscription-started</em> has been sent.  However, if events are lost (rather than just delayed) due to buffer capacity being reached, a <em>subscription-terminated</em> notification <bcp14>MUST</bcp14> be sent, followed by a new <em>subscription-started</em> notification. These notifications indicate an event record discontinuity has occurred. <strong>TODO, do we always want this behaviour or is it transport specific?</strong></t>
        </section>
        <section anchor="ModifyingSubscriptions">
          <name>Modifying Subscriptions</name>
          <t>The parameters associated with a subscription <bcp14>MAY</bcp14> be modified by client <em>modify-subscription</em> RPC or through configuration.</t>
          <t>If the subscription is in <em>Active</em> state, and hence a <em>subscription-started</em> notification has been enqueued to the receiver, then any subscription parameter changes are handled as per the following sub-sections.  If the subscription is not yet in <em>Active</em> state then any transport changes associated with the receiver must be made, but otherwise the new parameters would be notified in the <em>subscription-started</em> notification.</t>
          <section anchor="ChangesNeedingTermination">
            <name>Modifications requiring subscription-terminated notification</name>
            <t>Changes to any of following parameters <bcp14>MUST</bcp14> terminate the subscription, as per <xref target="TerminatingSubscriptions"/>, before recreating it, clearing and reinitializing any associated statistics, as per <xref target="CreatingSubscriptions"/>:</t>
            <ol spacing="normal" type="1"><li>
                <t>the subcription <em>id</em></t>
              </li>
              <li>
                <t>the <em>encoding</em></t>
              </li>
              <li>
                <t>any <em>receiver</em> settings that change the encoding, transport, transport security, or receiver destination address/port</t>
              </li>
              <li>
                <t>the update-trigger to enable <em>sync-on-start</em>.</t>
              </li>
              <li>
                <t>if the <em>sync-in-start option</em> is enabled, then any changes to the subscription-filter (inline or referenced) or YANG schema (<em>schema-id</em>) associated with the subscription. <em>TODO, Why?  Should a subscription-modifies message resend the sync-on-start data anyway?</em></t>
              </li>
            </ol>
            <t>The <em>subscription-terminated</em> notification <bcp14>MUST</bcp14> be sent using the old <em>encoding</em> and <em>receiver</em> settings before the subscription parameters were changed.  The <em>subscription-started</em> notification <bcp14>MUST</bcp14> be sent using the updated subscription parameters.</t>
          </section>
          <section anchor="ChangesNeedingModifiedNotif">
            <name>Modifications allowing subscription-modified notification</name>
            <t>If changes to a subscription only include changes to the following parameters then they <bcp14>SHOULD</bcp14> be handled via a <em>subscription-modified</em> notification, but <bcp14>MAY</bcp14> be handled as described above. This applies for changes to:</t>
            <ol spacing="normal" type="1"><li>
                <t>the subscription target <em>filter</em> (inline, referring to a different named filter, or changing the referenced filter).</t>
              </li>
              <li>
                <t>the YANG schema (<em>schema-id</em>) associated with subscription target filter,</t>
              </li>
              <li>
                <t>the <em>update-trigger</em>, unless <em>sync-on-start</em> is enabled.</t>
              </li>
              <li>
                <t>the <em>description</em> field,</t>
              </li>
              <li>
                <t>any other fields that are included in a <em>subscription-started</em> notification message, unless the definition of those fields explicitly specifies different
behavior.</t>
              </li>
            </ol>
          </section>
          <section anchor="modifications-requiring-no-lifecycle-notification">
            <name>Modifications requiring no lifecycle notification</name>
            <t>Changes to any of the following subscription parameters do not need to be notified to the client:</t>
            <ol spacing="normal" type="1"><li>
                <t><em>dscp</em> settings.</t>
              </li>
              <li>
                <t><em>source-address</em>, <em>source-interface</em>, <em>source-vrf</em>, or the source port.</t>
              </li>
              <li>
                <t>any other settings not reported in the <em>subscription-started</em> notification message.</t>
              </li>
            </ol>
          </section>
        </section>
        <section anchor="TerminatingSubscriptions">
          <name>Terminating Subscriptions</name>
          <t>Subscriptions <bcp14>MUST</bcp14> be terminated by the publisher due to any of the following circumstances:</t>
          <ol spacing="normal" type="1"><li>
              <t>The subscription has been unconfigured.</t>
            </li>
            <li>
              <t>Some subscription, receiver, transport or encoding configuration has been removed, e.g., receiver configuration, such that there is no longer the sufficient minimum information to maintain the subscription.</t>
            </li>
            <li>
              <t>A dynamic subscription has been terminated via a <em>delete-subscription</em> or <em>kill-subscription</em> YANG RPC.</t>
            </li>
            <li>
              <t>Transport connectivity to the receiver has been lost, either due to network issues, or a failure in the security session state.</t>
            </li>
            <li>
              <t>The publisher does not have sufficient resources to honor the terms of the subscription, i.e., it is generating too many <em>update</em> notifications, or attempting to send too much data.</t>
            </li>
            <li>
              <t>The subscription parameters have changed in such a way, i.e., as defined in <xref target="ChangesNeedingTermination"/>, that needs the subscription to be reset by terminating and recreating it.</t>
            </li>
            <li>
              <t>The <em>reset</em> RPC is invoked on a configured subscription, or on the referenced receiver associated with a configured subscription.</t>
            </li>
          </ol>
          <t>In addition, from a receiver's perspective, if transport connectivity is lost, then that is equivalent to terminating the subscription via a <em>subscription-terminated</em> notification.</t>
          <t>If possible, the publisher <bcp14>MUST</bcp14> try and close the subscription gracefully by generating a <em>subscription-terminated</em> notification to the receiver before closing any sessions to any receivers that have no remaining subscriptions.  Publishers <bcp14>MAY</bcp14> complete their current collection if one is in progress before generating the <em>subscription-terminated</em> notification.  Obviously, if transport connectivity to a receiver has been lost then neither of these two actions is possible.</t>
          <t>The publisher <bcp14>MUST NOT</bcp14> generate any further events, e.g., <em>update</em> notifications, related to the subscription after the <em>subscription-terminated</em> notification has been generated.  In addition, receivers <bcp14>SHOULD</bcp14> ignore any messages received outside of an active subscription, i.e., either before a <em>subscription-started</em> notification or after a <em>subscription-terminated</em> notification.</t>
          <t>If the publisher accepts the request, which it <bcp14>MUST</bcp14>, if the subscription-id matches a dynamic subscription established in the same transport session, then it should stop the subscription and send a <em>subscription-terminated</em> notification.</t>
        </section>
      </section>
      <section anchor="LifecycleNotifications">
        <name>Subscription Lifecycle Notifications</name>
        <t>In addition to sending event records to receivers, a publisher also sends subscription lifecycle state change notifications when lifecycle events related to subscription management occur.</t>
        <t>Subscription state change notifications are generated per subscription, and are injected into the steam of <em>update</em> messages for that that subscription.  These notifications <bcp14>MUST NOT</bcp14> be dropped or filtered.</t>
        <t>Future extensions, or implementations <bcp14>MAY</bcp14> augment additional fields into the notification structures.  Receivers <bcp14>MUST</bcp14> silently ignore unexpected fields.</t>
        <t>The complete set of subscription state change notifications is described in the following subsections:</t>
        <section anchor="SubscriptionStartedNotification">
          <name>"subscription-started"</name>
          <t>The subscription started notification is sent to a receiver to indicate that a subscription is active and they may start to receive <em>update</em> records from the publisher.</t>
          <t>The <em>subscription-started</em> notification is sent for any of these reasons:</t>
          <ol spacing="normal" type="1"><li>
              <t>A new subscription (configured or dynamic) has been started.</t>
            </li>
            <li>
              <t>The properties of a configured subscription has been changed, i.e., as specified in <xref target="ChangesNeedingTermination"/>, that requires a <em>subscription-terminated</em> notification to be sent followed by a <em>subscription-started</em> notification, presuming that the new subscription parameters are valid.</t>
            </li>
            <li>
              <t>A configured subscription previously failed, and was terminated.  After the publisher has successfully re-established a connection to the receiver and is ready to send datastore event records again.</t>
            </li>
          </ol>
          <t>Below is the tree diagram for the <em>subscription-started</em> notification.  All data nodes contained in this tree diagram are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure>
            <name>subscription-started Notification Tree Diagram</name>
            <sourcecode type="yangtree"><![CDATA[
    +---n subscription-started
    |  +--ro id                    subscription-id
    |  +--ro description?          string
    |  +--ro target
    |  |  +--ro datastore?                 identityref
    |  |  +--ro (filter)
    |  |  |  +--:(path)
    |  |  |  |  +--ro path                 ypath
    |  |  |  +--:(subtree)
    |  |  |  |  +--ro subtree              <anydata>
    |  |  |  +--:(xpath)
    |  |  |     +--ro xpath                yang:xpath1.0 {yp2:xpath}?
    |  |  +--ro schema-id?                 string
    |  |  +--ro yang-library-content-id?
    |  |          -> /yanglib:yang-library/content-id
    |  +--ro update-trigger
    |  |  +--ro periodic!
    |  |  |  +--ro period         centiseconds
    |  |  |  +--ro anchor-time?   yang:date-and-time
    |  |  +--ro on-change! {on-change}?
    |  |     +--ro sync-on-start?   boolean
    |  +--ro message-publishers
    |     +--ro publisher-id*   uint32
]]></sourcecode>
          </figure>
        </section>
        <section anchor="SubscriptionModifiedNotification">
          <name>"subscription-modified"</name>
          <t>The <em>subscription-modified</em> notification is sent to a receiver to indicate that some parameters associated with an active subscription have changed, as per <xref target="ChangesNeedingModifiedNotif"/>.</t>
          <t>Below is the tree diagram for the <em>subscription-modified</em> notification.  Other than the notification name and the <em>reason</em> leaf, the parameters for a <em>subscription-modified</em> notification are the same as for the <em>subscription-started</em> notification.  Robust receivers are expected to handle <em>subscription-started</em> and <em>subscription-modified</em> notifications equivalently.</t>
          <t>All data nodes contained in this tree diagram are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure>
            <name>subscription-modified Notification Tree Diagram</name>
            <sourcecode type="yangtree"><![CDATA[
    +---n subscription-modified
    |  +--ro id                    subscription-id
    |  +--ro description?          string
    |  +--ro target
    |  |  +--ro datastore?                 identityref
    |  |  +--ro (filter)
    |  |  |  +--:(path)
    |  |  |  |  +--ro path                 ypath
    |  |  |  +--:(subtree)
    |  |  |  |  +--ro subtree              <anydata>
    |  |  |  +--:(xpath)
    |  |  |     +--ro xpath                yang:xpath1.0 {yp2:xpath}?
    |  |  +--ro schema-id?                 string
    |  |  +--ro yang-library-content-id?
    |  |          -> /yanglib:yang-library/content-id
    |  +--ro update-trigger
    |  |  +--ro periodic!
    |  |  |  +--ro period         centiseconds
    |  |  |  +--ro anchor-time?   yang:date-and-time
    |  |  +--ro on-change! {on-change}?
    |  |     +--ro sync-on-start?   boolean
    |  +--ro message-publishers
    |  |  +--ro publisher-id*   uint32
    |  +--ro reason                subscription-change
]]></sourcecode>
          </figure>
        </section>
        <section anchor="SubscriptionTerminatedNotification">
          <name>"subscription-terminated"</name>
          <t>For a receiver, this notification indicates that no further event records for an active subscription should be expected from the publisher unless and until a new <em>subscription-started</em> notification is received.</t>
          <t>A <em>subscription-terminated</em> notification <bcp14>SHOULD</bcp14> only be sent by a publisher to a receiver if a <em>subscription-started</em> notification was previously sent.</t>
          <t>The subscription terminated notification may be sent to a receiver for any of these reasons:</t>
          <ol spacing="normal" type="1"><li>
              <t>A subscription has been stopped, either due to the change/removal of some configuration, or an RPC has been invoked to delete or kill a dynamic subscription.</t>
            </li>
            <li>
              <t>The properties of a subscription have been changed, i.e., as specified in <xref target="ChangesNeedingTermination"/>, that requires a <em>subscription-terminated</em> notification to be sent followed by a <em>subscription-started</em> notification, presuming that the new subscription parameters are valid.</t>
            </li>
            <li>
              <t>A subscription has failed for any reason, e.g.,:  </t>
              <ul spacing="normal">
                <li>
                  <t>The publisher is no longer able to honor the subscription, due to resource constraints, or the filter is no longer valid.</t>
                </li>
                <li>
                  <t>Any transport level buffer to the receiver has become full, and the hence the publisher is dropping <em>update</em> notifications.</t>
                </li>
              </ul>
            </li>
          </ol>
          <t>Below is a tree diagram for "subscription-terminated".  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure>
            <name>subscription-terminated Notification Tree Diagram</name>
            <sourcecode type="yangtree"><![CDATA[
    +---n subscription-terminated
    |  +--ro id        subscription-id
    |  +--ro reason    identityref
    +---n update
    |  +--ro id?                 subscription-id
    |  +--ro path-prefix?        string
    |  +--ro snapshot-type       enumeration
    |  +--ro observation-time?   yang:date-and-time
]]></sourcecode>
          </figure>
          <t><strong>TODO Augmenting extra fields is better for clients?</strong>  The <em>reason</em> data node identityref indicates why a subscription has been terminated, and could be extended with further reasons in future.  I suggest that we change this to an enum with an optional description field.**</t>
        </section>
        <section anchor="update-completed">
          <name>"update-completed"</name>
          <t><strong>TODO, this description needs to be updated</strong>.</t>
          <t>This notification indicates that all of the event records prior to the current time have been passed to a receiver.  It is sent before any notification messages containing an event record with a timestamp later than (1) the subscription's start time.</t>
          <t>After the <em>update-complete</em> notification has been sent, additional event records will be sent in sequence as they arise naturally on the publisher.</t>
          <t>Below is a tree diagram for <em>update-complete</em>.  All objects contained in this tree are described in the YANG module in Section 4.</t>
          <figure>
            <name>update-complete Notification Tree Diagram</name>
            <sourcecode type="yangtree"><![CDATA[
    +---n update-complete
       +--ro id?   subscription-id
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="configured-subscriptions">
        <name>Configured Subscriptions</name>
        <t>Configured subscriptions allow the management of subscriptions via configuration so that a publisher can send notification messages to a receiver.</t>
        <t>This document specifies the ietf-yang-push-2-config YANG module <xref target="yang-push-2-config-yang-module"/> that defines an configuration model for configuring subscriptions.  Support for this YANG module is <bcp14>OPTIONAL</bcp14> and is advertised using the normal YANG mechanisms, e.g., <xref target="RFC8525"/>. <strong>TODO, do we also advertise support via capabilities, i.e., <eref target="https://github.com/rgwilton/draft-yp-observability/issues/16">issue 16</eref></strong></t>
        <t>In addition to the common subscription parameters described in <xref target="CommonSubscriptionParameters"/>, a configured subscription also includes:</t>
        <ul spacing="normal">
          <li>
            <t>the receiver for the subscription, as described in <xref target="receivers"/>.  The referenced receiver specifies all transport, receiver, and encoding parameters.</t>
          </li>
        </ul>
        <t>Configured subscriptions have several characteristics distinguishing them from dynamic subscriptions, such as:</t>
        <ul spacing="normal">
          <li>
            <t>configured subscriptions are created, modified or deleted, by any configuration client with write permission on the subscription configuration.</t>
          </li>
          <li>
            <t>configured subscription may reference a filter rather than define it inline as part of the subscription.  Even for a referenced filter, the <em>subscription-started</em> and <em>subscription-modified</em> notifications always include the filter specification inline in the notification.</t>
          </li>
          <li>
            <t>The lifetime of a configured subscription is tied to the configuration.  I.e., if a valid and complete configuration exists for a subscription, then the publisher <bcp14>MUST</bcp14> attempt to connect to the receiver and honor the requirements of the subscription.  In particular:  </t>
            <ul spacing="normal">
              <li>
                <t>If the configuration is altered or removed then the subscription will similarly be altered or removed.</t>
              </li>
              <li>
                <t>If the device reboots, then the configured subscription will obviously end, but once the subscription configuration has been processed after boot up, then the subscription will be recreated again, assuming the subscription configuration is still valid.</t>
              </li>
              <li>
                <t>If the publisher detects that transport connectivity to the receiver is broken, then any subscriptions using that transport are terminated, but the publisher <bcp14>MUST</bcp14> periodically attempt to re-establish connection to the receiver and re-activate any configured subscriptions to that receiver.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>The lifetime of any transport session(s) to receiver(s) are also tied to the subscription configuration, but in a way that depends on the behavior of the Yang Push 2 transport specificiation, i.e.,  </t>
            <ul spacing="normal">
              <li>
                <t>For YANG Push transports that specify a separate transport session for each subscription to the same receiver then a new transport session is established whenever a valid subscription is configured and the transport session <bcp14>MUST</bcp14> be closed if the subscription configuration is removed or changed such that the subscription is no longer valid.</t>
              </li>
              <li>
                <t>For YANG Push transports that specify a shared transport session for all subscriptions to the same receiver then a new transport session is established for the first valid configured subscription.  Note, if there are no active subscriptions for a given receiver then any transport session(s) associated with that receiver <bcp14>MUST</bcp14> be closed, but that <bcp14>MAY</bcp14> be after a short delay.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Other than the <em>reset</em> YANG Action, described in <xref target="reset"/>, there are no YANG RPCs to dynamically create, modify, or delete a configured subscription, any alterations <bcp14>MUST</bcp14> be done via changes to the configuration.</t>
          </li>
        </ul>
        <section anchor="creating-a-configured-subscription">
          <name>Creating a Configured Subscription</name>
          <t>Configured subscriptions are those created via changes to the publisher's configuration, e.g., using the YANG module defined in <xref target="config-subs-data-model"/>, or an equivalent configuration mechanism, such as a command-line interface, or alternative YANG configuration model.</t>
          <t>After the configuration change has been accepted by the system, then the subscription is updated, as per <xref target="CreatingSubscriptions"/>.</t>
          <t><strong>TODO, to see an example of subscription creation using configuration operations over NETCONF, see Appendix A.</strong></t>
        </section>
        <section anchor="modifying-a-configured-subscription">
          <name>Modifying a Configured Subscription</name>
          <t>Configured subscriptions can be modified due to configuration changes in the subscription configuration or referenced configuration, i.e., filters or receivers.  After the configuration change has been accepted by the system, then the subscription is updated, as per <xref target="ModifyingSubscriptions"/>.</t>
        </section>
        <section anchor="deleting-a-configured-subscription">
          <name>Deleting a Configured Subscription</name>
          <t>Configured subscriptions can be deleted via configuration.  After the configuration change has been accepted by the system the subscription is terminated, as per <xref target="TerminatingSubscriptions"/>.</t>
        </section>
        <section anchor="reset">
          <name>Resetting a Configured Subscription</name>
          <t>Configured subscriptions are generally expected to self-monitor and automatically reconnect to the receiver if they experience network or transport issues.  However, the data model also defines explicit YANG <em>actions</em> to either: (i) reset a single subscription, or (ii) reset all subscriptions and the transports(s) associated with a specific configured receiver instance.</t>
          <t>These reset actions primarily act at the subscription application layer, but may be useful if a receiver or collector determines that a configured subscription is not behaving correctly, and wishes to force a reset of the subscription without modifying the configuration associated with the subscription or forcing a configuration change on the publisher device.</t>
          <t>The reset action on a subscription is handled equivalently to removing and re-adding the subscription configuration.  I.e., the subscription <bcp14>MUST</bcp14> be terminated, as per <xref target="TerminatingSubscriptions"/> before being recreated, as per <xref target="CreatingSubscriptions"/>.  The reset action also resets (terminated and re-establishes) any subscription specific transport session that is not shared with any other subscriptions.  Any counters associated with the subscription are also re-initialized in a manner that is consistent with a client unconfiguring and then reconfiguring the subscription.</t>
          <t>The reset action on a receiver is handled equivalently to removing and re-adding the receiver configuration for the receiver that has been reset.  Specifically, every subscription referencing the receiver <bcp14>MUST</bcp14> be terminated, as per <xref target="TerminatingSubscriptions"/> before being recreated, as per <xref target="CreatingSubscriptions"/>.  Any transport sessions tied to the subscriptions referencing the reset receiver <bcp14>MUST</bcp14> also be terminated and re-established.  Any counters associated with the receiver are also re-initialized in a manner that is consistent with a client unconfiguring and then reconfiguring the receiver configuration.</t>
        </section>
      </section>
      <section anchor="DynamicSubscriptions">
        <name>Dynamic Subscriptions</name>
        <t>Dynamic subscriptions are where a subscriber initiates a subscription negotiation with a publisher via a YANG RPC <xref target="RFC7950"/>.</t>
        <t>Support for dynamic subscriptions is <bcp14>OPTIONAL</bcp14>, with its availability advertised via the <em>dynamic</em> YANG feature in the ietf-yang-push-2 YANG module <xref target="yang-push-2-yang-module"/>, and also via the capabilities module <xref target="yang-push-2-yang-capabilities-module"/>.</t>
        <t>Dynamic subscription differ from configured subscription in the following ways:</t>
        <ul spacing="normal">
          <li>
            <t>Dynamic subscription reuse the same transport session on which the <em>establish-subscription</em> RPC was received to send back any notifications, and so the transport and receiver do not need to be specified and each dynamic subscription can always only have a single receiver.</t>
          </li>
          <li>
            <t>The publisher <bcp14>MUST</bcp14> reply to the <em>establish-subscription</em> RPC before sending the <em>subscription-started</em> or any <em>update</em> notifications for this subscription.</t>
          </li>
          <li>
            <t>The lifetime of a dynamic subscription is bound by the transport session used to establish it.  If the transport session fails then the dynamic subscription <bcp14>MUST</bcp14> be terminated.</t>
          </li>
          <li>
            <t>Dynamic subscriptions can either be terminated by the client that established the subscription sending a <em>delete-subscription</em> YANG RPC on the same transport session, or any client with sufficient access permissions invoking the <em>kill-subscription</em> YANG RPC.</t>
          </li>
          <li>
            <t>A publisher <bcp14>MAY</bcp14> terminate a dynamic subscription at any time, i.e., due to internal constraints of the publisher.</t>
          </li>
          <li>
            <t>If a dynamic subscription is terminated for any reason, then the client is responsible for re-establishing the subscription if it is still required.</t>
          </li>
          <li>
            <t>If the publisher cannot honor the terms of a dynamic subscription then the subscription <bcp14>MUST</bcp14> be terminated. <strong>TODO, is this a <bcp14>SHOULD</bcp14> or <bcp14>MUST</bcp14>, do we want some leeway for temporary issues? E.g., allow some buffering. Also, this effectively applies to config subscriptions as well and hence should move.</strong></t>
          </li>
        </ul>
        <section anchor="EstablishDynamic">
          <name>Establishing a Dynamic Subscription</name>
          <t>The <em>establish-subscription</em> RPC allows a subscriber to request the creation of a subscription.</t>
          <t>In addition to the common subscription parameters described in <xref target="CommonSubscriptionParameters"/>, the <em>establish-subscription</em> YANG RPC:</t>
          <ul spacing="normal">
            <li>
              <t>includes the <em>encoding</em> to be used for all YANG Push v2 notifications</t>
            </li>
            <li>
              <t>optionally includes DSCP settings to use for the transport.</t>
            </li>
          </ul>
          <t>The DSCP code point settings for all subscription using the same transport session <bcp14>MUST</bcp14> be the same.  Attempts to invoke <em>establish-subscription</em> with a different DSCP code point <bcp14>MUST</bcp14> be rejected.</t>
          <t>If the publisher can satisfy the <em>establish-subscription</em> request, it replies with a numeric identifier for the subscription and then immediately starts streaming notification messages.</t>
          <t>A dynamic subscription request <bcp14>MUST</bcp14> be declined if a publisher determines that it may be unable to provide update records meeting the terms of an <em>establish-subscription</em> RPC request.</t>
          <t>Below is a tree diagram for <em>establish-subscription</em> YANG RPC.  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure anchor="EstablishSubscriptionYangTree">
            <name>establish-subscription YANG RPC</name>
            <sourcecode type="yangtree"><![CDATA[
    +---x establish-subscription {dynamic}?
    |  +---w input
    |  |  +---w id?               subscription-id
    |  |  +---w description?      string
    |  |  +---w target
    |  |  |  +---w datastore?       identityref
    |  |  |  +---w (filter)
    |  |  |     +--:(path)
    |  |  |     |  +---w path       ypath
    |  |  |     +--:(subtree)
    |  |  |     |  +---w subtree    <anydata>
    |  |  |     +--:(xpath)
    |  |  |        +---w xpath      yang:xpath1.0 {yp2:xpath}?
    |  |  +---w update-trigger
    |  |  |  +---w periodic!
    |  |  |  |  +---w period         centiseconds
    |  |  |  |  +---w anchor-time?   yang:date-and-time
    |  |  |  +---w on-change! {on-change}?
    |  |  |     +---w sync-on-start?   boolean
    |  |  +---w encoding          encoding
    |  |  +---w dscp?             inet:dscp
    |  +--ro output
    |     +--ro id    subscription-id
]]></sourcecode>
          </figure>
          <t>A publisher <bcp14>MAY</bcp14> reject the "establish-subscription" RPC for many reasons, as described in <strong>TODO</strong> (Section 2.4.6)?</t>
          <!--
TODO - Decide the simplest mechanism for returning RPC errors.

Below is a tree diagram for "establish-subscription-stream-error-info" RPC yang-data.  All objects contained in this tree are described in the YANG module in {{yang-push-2-yang-module}}.

~~~~
    yang-data establish-subscription-stream-error-info
      +- -ro establish-subscription-stream-error-info
        +- -ro reason?                   identityref
        +- -ro filter-failure-hint?      string

        Figure 3: "establish-subscription-stream-error-info"
                    RPC yang-data Tree Diagram
~~~~
{: align="left" title="\"establish-subscription-stream-error-info\" Tree Diagram"}
-->

</section>
        <section anchor="ModifyDynamic">
          <name>Modifying a Dynamic Subscription</name>
          <t>The <em>modify-subscription</em> RPC allows a subscriber to request the modification of parameters associated with a dynamic subscription. It uses the same parameters as the <em>establish-subscription</em> RPC defined in <xref target="EstablishDynamic"/>, except that the <em>id</em> leaf is mandatory.</t>
          <t>If the modification to the subscription is accepted by the publisher then it is processed as per <xref target="ModifyingSubscriptions"/>, otherwise an error is returned to the <em>modify-subscription</em> RPC and the subscription is left unmodified.</t>
          <t>The publisher <bcp14>MUST</bcp14> reply to the <em>modify-subscription</em> RPC before sending any subscription lifecycle notifications, i.e., a pair of <em>subscription-terminated</em>/<em>subscription-started</em> notifications, or a<em>subscription-modified</em> notification.</t>
          <t>Below is a tree diagram for the <em>modify-subscription</em> YANG RPC.  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure anchor="ModifySubscriptionYangTree">
            <name>modify-subscription YANG RPC</name>
            <sourcecode type="yangtree"><![CDATA[
    +---x modify-subscription {dynamic}?
    |  +---w input
    |     +---w id                subscription-id
    |     +---w description?      string
    |     +---w target
    |     |  +---w datastore?       identityref
    |     |  +---w (filter)
    |     |     +--:(path)
    |     |     |  +---w path       ypath
    |     |     +--:(subtree)
    |     |     |  +---w subtree    <anydata>
    |     |     +--:(xpath)
    |     |        +---w xpath      yang:xpath1.0 {yp2:xpath}?
    |     +---w update-trigger
    |     |  +---w periodic!
    |     |  |  +---w period         centiseconds
    |     |  |  +---w anchor-time?   yang:date-and-time
    |     |  +---w on-change! {on-change}?
    |     |     +---w sync-on-start?   boolean
    |     +---w dscp?             inet:dscp
]]></sourcecode>
          </figure>
          <t>A publisher <bcp14>MAY</bcp14> reject the "modify-subscription" RPC for various reasons, as described in <strong>TODO</strong>.</t>
        </section>
        <section anchor="deleting-a-dynamic-subscription">
          <name>Deleting a Dynamic Subscription</name>
          <t>The <em>delete-subscription</em> operation permits canceling an existing dynamic subscription that was established on the same transport session connecting to the subscriber.</t>
          <t>The publisher responds to the request in the following way:</t>
          <ul spacing="normal">
            <li>
              <t>If the identifier matches a <em>dynamic</em> subscription created on the same transport session then it <bcp14>MUST</bcp14> terminate the subscription, as per <xref target="TerminatingSubscriptions"/>.  </t>
              <t>
The publisher <bcp14>MAY</bcp14> reply back to the client before the subscription has been terminated, i.e., it may act asynchronously with respect to the delete request, however, the publisher <bcp14>MUST</bcp14> allow the client to create a new subscription using the same subscription id immediately after either the RPC operation completes or the <em>subscription-terminated</em> notification (<xref target="SubscriptionTerminatedNotification"/>) has been transmitted.</t>
            </li>
            <li>
              <t>Otherwise, the request is failed with an "unknown subscription" error message.</t>
            </li>
          </ul>
          <t>Below is the tree diagram for the <em>delete-subscription</em> RPC.  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure anchor="DeleteSubscriptionYangTree">
            <name>delete-subscription YANG RPC</name>
            <sourcecode type="yangtree"><![CDATA[
    +---x delete-subscription {dynamic}?
    |  +---w input
    |     +---w id    subscription-id
]]></sourcecode>
          </figure>
        </section>
        <section anchor="killing-a-dynamic-subscription">
          <name>Killing a Dynamic Subscription</name>
          <t>The <em>kill-subscription</em> RPC operation permits a client, that has the required access permissions, to forcibly terminate any arbitrary dynamic subscription, identified by subscription id, including those not associated with the transport session used for the <em>kill-subscription</em> RPC.  The subscription is terminated as per <xref target="TerminatingSubscriptions"/>.</t>
          <t>The publisher <bcp14>MAY</bcp14> reply back to the client before the subscription has been terminated, i.e., it may act asynchronously with respect to the delete request, however, the publisher <bcp14>MUST</bcp14> allow the client to create a new subscription using the same subscription id immediately after the <em>subscription-terminated</em> notification (<xref target="SubscriptionTerminatedNotification"/>) has been transmitted.</t>
          <t>Below is the tree diagram for the <em>kill-subscription</em> RPC.  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.</t>
          <figure anchor="KillSubscriptionYangTree">
            <name>kill-subscription YANG RPC</name>
            <sourcecode type="yangtree"><![CDATA[
    +---x kill-subscription {dynamic}?
       +---w input
          +---w id    subscription-id
]]></sourcecode>
          </figure>
        </section>
        <section anchor="rpc-failures">
          <name>RPC Failures</name>
          <t><strong>TODO, we should see if we can simplify how errors are reported.</strong></t>
          <t>Whenever an RPC is unsuccessful, the publisher returns relevant
information as part of the RPC error response.  Transport-level error
processing <bcp14>MUST</bcp14> be done before the RPC error processing described in
this section.  In all cases, RPC error information returned by the
publisher will use existing transport-layer RPC structures, such as
those seen with NETCONF (Appendix A of <xref target="RFC6241"/>) or RESTCONF
(Section 7.1 of <xref target="RFC8040"/>).  These structures <bcp14>MUST</bcp14> be able to encode
subscription-specific errors identified below and defined in this
document's YANG data model.</t>
          <t>As a result of this variety, how subscription errors are encoded in
an RPC error response is transport dependent.  Valid errors that can
occur for each RPC are as follows:</t>
          <artwork><![CDATA[
  establish-subscription         modify-subscription
  ----------------------         ----------------------
  dscp-unavailable               filter-unsupported
  encoding-unsupported           insufficient-resources
  filter-unsupported             no-such-subscription
  insufficient-resources

  delete-subscription            kill-subscription
  ----------------------         ----------------------
  no-such-subscription           no-such-subscription
]]></artwork>
          <t>To see a NETCONF-based example of an error response from the list
above, see the "no-such-subscription" error response illustrated in
<xref target="RFC8640"/>, Figure 10.</t>
          <t>There is one final set of transport-independent RPC error elements
included in the YANG data model defined in this document: three
yang-data structures that enable the publisher to provide to the
receiver any error information that does not fit into existing
transport-layer RPC structures.  These structures are:</t>
          <ol spacing="normal" type="1"><li>
              <t>"establish-subscription-stream-error-info": This <bcp14>MUST</bcp14> be returned
 with the leaf "reason" populated if an RPC error reason has not
 been placed elsewhere in the transport portion of a failed
 "establish-subscription" RPC response.  This <bcp14>MUST</bcp14> be sent if
 hints on how to overcome the RPC error are included.</t>
            </li>
            <li>
              <t>"modify-subscription-stream-error-info": This <bcp14>MUST</bcp14> be returned
 with the leaf "reason" populated if an RPC error reason has not
 been placed elsewhere in the transport portion of a failed
 "modify-subscription" RPC response.  This <bcp14>MUST</bcp14> be sent if hints
 on how to overcome the RPC error are included.</t>
            </li>
            <li>
              <t>"delete-subscription-error-info": This <bcp14>MUST</bcp14> be returned with the
 leaf "reason" populated if an RPC error reason has not been
 placed elsewhere in the transport portion of a failed
 "delete-subscription" or "kill-subscription" RPC response.</t>
            </li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="robustness-reliability-and-subscription-monitoring">
      <name>Robustness, Reliability, and Subscription Monitoring</name>
      <section anchor="robustness-and-reliability">
        <name>Robustness and Reliability</name>
        <t>It is important for clients to have confidence that the telemetry data that they receive is correct and complete.  The design of YANG Push v2 achieves this in several ways:</t>
        <ul spacing="normal">
          <li>
            <t>the <em>complete</em> flag in the <em>update</em> notification, or the equivalent <em>update-complete</em> notification, are used to signal when all data for a periodic collection event has been enqueued by the publisher.  This allows clients to delete stale information and monitor the performance and behavior of the publisher.</t>
          </li>
          <li>
            <t>publishers use buffers when enqueuing traffic on to a transport to a receiver, but if that buffer becomes full then the transport specification indicates whether update messages should be dropped, or the subscription should be terminated.  In that case that a dynamic subscription is terminated, the client may attempt to re-created the subscription.  For configured subscriptions that have been terminated, the publisher should attempt to periodically recreate the subscription or reconnect the receiver.</t>
          </li>
          <li>
            <t>the <em>notification envelope</em> structure, <xref target="FullNotificationExample"/>, used for all YANG Push notifications contains a monotonically increasing <em>sequence-number</em> field that allows for lost messages in an end-to-end data pipeline spanning multiple transport hops to be detected, allowing appropriate mitigation steps to be taken.  For example, see figure 1 in <xref target="I-D.ietf-nmop-network-anomaly-architecture"/>.</t>
          </li>
          <li>
            <t>the protocol relies on transport protocols that are either reliable, e.g., TCP or HTTP, or unreliable transports that employ mechanisms for clients to detect when losses at the transport layer have occurred, e.g., the <em>message id</em> in <xref target="I-D.draft-ietf-netconf-udp-notif"/> (<strong>TODO fix reference to bis version, once that becomes available</strong>).</t>
          </li>
          <li>
            <t>finally, if a publisher is not able to honor the expectation for a subscription for any reason, then the publisher always has the option to terminate the subscription.  It can then subsequently refuse to handle new subscriptions if it does not have sufficient resources to handle the subscription.</t>
          </li>
        </ul>
      </section>
      <section anchor="subscription-monitoring">
        <name>Subscription Monitoring</name>
        <t>In the operational state datastore, the <em>datastore-telemetry</em> container maintains operational state for all configured and dynamic subscriptions.</t>
        <t>Both configured and dynamic subscriptions are represented in the list <em>ietf-yang-push-2-config:datastore-telemetry/subscriptions/subscription</em>.  Dynamic subscriptions are only present in the list when they are active, and are removed as soon as they are terminated.  Whereas, configured subscriptions are always present in the list when they are configured, regardless of whether they are active.</t>
        <t>The operational state is important for monitoring the health of subscriptions, receivers, and the overall telemetry subsystem.</t>
        <t>This includes:</t>
        <t><strong>TODO, update the YANG model with more useful operational data, and mostly this section should briefly summarize and refer to the YANG model.  We should also consider what indications to include from filters that cause a larger amount of internal work but don't generate a large number of transmitted notifications.</strong></t>
        <ul spacing="normal">
          <li>
            <t>per subscription status and counters</t>
          </li>
          <li>
            <t>per receiver status and counters</t>
          </li>
          <li>
            <t>maybe some indication of the overall load on the telemetry subsystem, but we need to consider how useful that actually is, and whether just monitoring the device CPU load and general performance would be a better indication.</t>
          </li>
        </ul>
        <!-- TODO - Consider incorporating some aspects of this text.
Each subscription in the operational state datastore is represented as a list element.  Included in this list are event counters for each receiver, the state of each receiver, and the subscription parameters currently in effect.  The appearance of the leaf "configured-subscription-state" indicates that a particular subscription came into being via configuration.  This leaf also indicates whether the current state of that subscription is "valid", "invalid", or "concluded".

To understand the flow of event records in a subscription, there are two counters available for each receiver.  The first counter is "sent-event-records", which shows the number of events identified for sending to a receiver.  The second counter is "excluded-event-records", which shows the number of event records not sent to a receiver.  "excluded-event-records" shows the combined results of both access control and per-subscription filtering.  For configured subscriptions, counters are reset whenever the subscription's state is evaluated as "valid" (see (1) in Figure 8).

// Taken from another section.
In addition, the YANG Push v2 operational data gives an indication of the overall telemetry load on the device and hence gives an indication to whether a particular telemetry request is likely to be accepted, and honored.
-->

</section>
      <section anchor="publisher-capacity">
        <name>Publisher Capacity</name>
        <t>A publisher <bcp14>SHOULD</bcp14> reject a request for a subscription if it is unlikely that the publisher will be able to fulfill the terms of that subscription request.</t>
        <t>Whether or not a subscription can be supported will be determined by a combination of several factors, such as the subscription update trigger (on-change or periodic), the period in which to report changes (one-second periods will consume more resources than one-hour periods), the amount of data in the datastore subtree that is being subscribed to, the number and combination of other subscriptions that are concurrently being serviced, and the overall load from other services running on the publisher.</t>
        <t>It is entirely possible that a subscription may be reasonable at the time that it is created, but other changes to configuration or operational data or load in the system means that the subscription can no longer be honored.</t>
        <t>TODO - Do we allow servers to reduce the period of the subscription to allow it to be kept active?  E.g., with a subscription modification notification?  E.g., see <eref target="https://github.com/rgwilton/draft-yp-observability/issues/41">issue 41</eref></t>
      </section>
    </section>
    <section anchor="ConformanceAndCapabilities">
      <name>Conformance and Capabilities</name>
      <t>The normative text in this document already indicates which parts of the specification must or should be implemented for a compliant YANG Push v2 implementation via the use of <xref target="RFC2119"/> language.  It also sets out some additional related requirements, e.g., on transports <xref target="transports"/>, that add in additional functionality.</t>
      <t>Some parts of this specification are optional to implement.  Some of these optional parts can be identified through the use of YANG Library <xref target="RFC8525"/> specifying the list of implemented YANG modules and YANG features.  But, the broader approach adopted by this specification is via extending the ietf-system-capabilities YANG module specified in <xref target="RFC9196"/> to make capability information available as standard YANG described operational data.</t>
      <section anchor="capabilities">
        <name>Capabilities</name>
        <t>Publishers <bcp14>SHOULD</bcp14> implement the ietf-system-capabilities YANG module, defined in <xref target="RFC9196"/>, and the ietf-yang-push-2-capabilities YANG module, defined in <xref target="yang-push-2-yang-capabilities-module"/>) that augments ietf-system-capabilities.</t>
        <t>The ietf-yang-push-2-capabilities module contains capabilities to indicate what types of subscriptions and transports may be configured, along with acceptable subscription parameter for given subtrees.</t>
        <t>The schema tree for the ietf-system-capabilities augmented by ietf-yang-push-2-capabilities is given below.</t>
        <figure>
          <name>YANG tree for ietf-system-capabilities with ietf-yl-lite-capabilities augmentations.</name>
          <sourcecode type="yangtree"><![CDATA[
module: ietf-system-capabilities
  +--ro system-capabilities
     +--ro datastore-capabilities* [datastore]
     |  +--ro datastore
     |  |       -> /yanglib:yang-library/datastore/name
     |  +--ro per-node-capabilities* []
     |     +--ro (node-selection)?
     |     |  +--:(node-selector)
     |     |     +--ro node-selector?
     |     |             nacm:node-instance-identifier
     |     +--ro notc:subscription-capabilities
     |     |  +--ro notc:max-nodes-per-update?               uint32
     |     |  +--ro notc:periodic-notifications-supported?
     |     |  |       notification-support
     |     |  +--ro (notc:update-period)?
     |     |  |  +--:(notc:minimum-update-period)
     |     |  |  |  +--ro notc:minimum-update-period?        uint32
     |     |  |  +--:(notc:supported-update-period)
     |     |  |     +--ro notc:supported-update-period*      uint32
     |     |  +--ro notc:on-change-supported?
     |     |  |       notification-support {yp:on-change}?
     |     |  +--ro notc:minimum-dampening-period?           uint32
     |     |  |       {yp:on-change}?
     |     |  +--ro notc:supported-excluded-change-type*     union
     |     |          {yp:on-change}?
     |     +--ro yp2ca:datastore-telemetry
     |        +--ro yp2ca:periodic-notifications-supported?
     |        |       notification-support
     |        +--ro (yp2ca:update-period)?
     |        |  +--:(yp2ca:minimum-update-period)
     |        |  |  +--ro yp2ca:minimum-update-period?        uint32
     |        |  +--:(yp2ca:supported-update-period)
     |        |     +--ro yp2ca:supported-update-period*      uint32
     |        +--ro yp2ca:on-change-supported?
     |                notification-support
     +--ro notc:subscription-capabilities
     |  +--ro notc:max-nodes-per-update?               uint32
     |  +--ro notc:periodic-notifications-supported?
     |  |       notification-support
     |  +--ro (notc:update-period)?
     |  |  +--:(notc:minimum-update-period)
     |  |  |  +--ro notc:minimum-update-period?        uint32
     |  |  +--:(notc:supported-update-period)
     |  |     +--ro notc:supported-update-period*      uint32
     |  +--ro notc:on-change-supported?
     |  |       notification-support {yp:on-change}?
     |  +--ro notc:minimum-dampening-period?           uint32
     |  |       {yp:on-change}?
     |  +--ro notc:supported-excluded-change-type*     union
     |  |       {yp:on-change}?
     |  +--ro inotenv:notification-metadata
     |     +--ro inotenv:notification-envelope?   boolean
     |     +--ro inotenv:metadata
     |        +--ro inotenv:hostname-sequence-number?   boolean
     +--ro yp2ca:datastore-telemetry
     |  +--ro yp2ca:periodic-notifications-supported?
     |  |       notification-support
     |  +--ro (yp2ca:update-period)?
     |  |  +--:(yp2ca:minimum-update-period)
     |  |  |  +--ro yp2ca:minimum-update-period?        uint32
     |  |  +--:(yp2ca:supported-update-period)
     |  |     +--ro yp2ca:supported-update-period*      uint32
     |  +--ro yp2ca:on-change-supported?
     |  |       notification-support
     |  +--ro yp2ca:transport
     |     +--ro yp2ca:transport-capability* [transport-protocol]
     |        +--ro yp2ca:transport-protocol    identityref
     |        +--ro yp2ca:security-protocol?    identityref
     |        +--ro yp2ca:encoding-format*      identityref
     +--ro yp2ca:distributed-notifications-supported?   boolean
]]></sourcecode>
        </figure>
        <t><strong>TODO, do we need additional capabilities, as per <eref target="https://github.com/rgwilton/draft-yp-observability/issues/18">Issue 18</eref></strong></t>
      </section>
      <section anchor="subscription-content-versioning">
        <name>Subscription Content Versioning</name>
        <t>Many receivers will want to know what the schema is associated with a subscription and whether that schema has changed, e.g., due to a changing in software on the publisher.</t>
        <t>Various mechanisms are available to help receivers or collectors learn or monitor the schema associated with a subscription:</t>
        <ol spacing="normal" type="1"><li>
            <t>The device schema is available in the YANG library module ietf-yang-library.yang as defined in <xref target="RFC8525"/>.  YANG library also provides a simple "yang-library-change" notification that informs the subscriber that the library has changed, or alternatively, the publisher may support an on-change telemetry subscription to</t>
          </li>
        </ol>
        <t>Content Schema Identification</t>
        <t>YANG Module Synchronization</t>
        <t>To make subscription requests, the subscriber needs to know the YANG datastore schemas used by the publisher.  These schemas are available in the YANG library module ietf-yang-library.yang as defined in <xref target="RFC8525"/>.  The receiver is expected to know the YANG library information before starting a subscription.</t>
        <t>The set of modules, revisions, features, and deviations can change at runtime (if supported by the publisher implementation).  For this purpose, the YANG library provides a simple "yang-library-change" notification that informs the subscriber that the library has changed.  In this case, a subscription may need to be updated to take the updates into account.  The receiver may also need to be informed of module changes in order to process updates regarding datastore</t>
        <t><strong>TODO, this section should be updated so that a subscription is restarted if the schema that it is using changes, and to incorporate ideas to fingerprint the subscription schema in the subscription-started notification.</strong></t>
      </section>
    </section>
    <section anchor="distributed-notifications">
      <name>Distributed Notifications - Multiple Publishing Processes</name>
      <t>Distributed notifications is the concept of allowing subscriptions to be served from multiple different agent publisher processes on the same device.  As a simple example, an implementation could choose to have separate publishing processes for each linecard in a network device, so that data that is local to that linecard can be published directly from the linecard, perhaps directly from the linecard data interfaces, without been sent to a Management Processor card that could act a bottleneck.</t>
      <t>The YANG Push 2 specification supports distributed notifications as described in <xref target="I-D.ietf-netconf-distributed-notif"/>, and using the terminology defined therewithin, but with some differences due to the different YANG data models, which are described below.</t>
      <t>It is <bcp14>OPTIONAL</bcp14> for YANG Push 2 publishers to support multiple publisher agents since they always have the option of handling all subscriptions from a single publisher process on each server.  Receivers and consumers of YANG Push 2 subscription data <bcp14>MUST</bcp14> accommodate servers that publish their data from multiple Message Publishing processes, e.g., they may need to correlate the update-complete notification across multiple publishing processes.</t>
      <t>Publishers serving a subscription <bcp14>MUST</bcp14> only send the data for a given YANG data node from a single Message Publisher process.  Publishers <bcp14>MAY</bcp14> change which Message Publisher process is sending the data for a given YANG data node over time, e.g., to load-balance work.</t>
      <t>The differences for supporting <xref target="I-D.ietf-netconf-distributed-notif"/> with YANG Push 2 are:</t>
      <ul spacing="normal">
        <li>
          <t>the publisher-id leaf, that identities the Message Publisher ID of the publishing process, is augmented in the envelope notification <xref target="I-D.draft-ietf-netconf-notif-envelope"/> rather than the <em>push-update</em> and <em>push-change-update</em> messages.  This means that all messages sent by any Message Publishers (e.g., including Subscription Lifecyle Notifications) will indicate which Message Publisher sent the message.</t>
        </li>
        <li>
          <t>the publisher-id leaf has a default value of 0.  The publisher-id of 0 is reserved for the Publisher Parent process and <bcp14>MUST NOT</bcp14> be allocated to any Publisher Agent processes, since that allows for the publisher-id leaf to be omitted from notification messages sent from the Publisher Parent.</t>
        </li>
        <li>
          <t>the <em>subscription-started</em> and <em>subscription-modified</em> notifications have a <em>message-publishers/publisher-id</em> leaf-list that identifies all Message Publishers that will send messages as part of the subscription.  This leaf-list defaults to a single entry of 0, so <bcp14>MAY</bcp14> be ommitted if there is only a single Message Publisher and it has an publisher-id of 0.  </t>
          <ul spacing="normal">
            <li>
              <t>As per <xref target="I-D.ietf-netconf-distributed-notif"/>, the list of Message Publishers serving an active subscription can change during the lifetime of the subscription and the Publisher Parent <bcp14>MUST</bcp14> send a <em>subscription-modified</em> notification of any change in publisher-ids.</t>
            </li>
            <li>
              <t>Yang Push 2 does not return the list of publisher-ids as part of the establish-subscription response output because the dynamic subscription will receive a <em>subscription-started</em> notification instead, which also provides a more robust mechanism consistent with configured subscriptions.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>the <em>subscriptions/subscription</em> has a <em>message-publishers/publisher-id</em> leaf-list to report the current list of Message Publishers associated with a subscription.</t>
        </li>
        <li>
          <t>A capability flag is used to indicate whether the server might use distributed notifications.</t>
        </li>
        <li>
          <t>the <em>update-complete</em> notifications, or the equivalent <em>complete</em> leaf as part of an <em>update</em> notification are generated per Message Publisher process, and are scoped as such.  I.e., this may require clients to count and correlate update complete indications across Message Publishers for a given subscription.</t>
        </li>
      </ul>
    </section>
    <section anchor="ietf-yang-push-2-yang">
      <name>Core YANG Push v2 YANG Data Model</name>
      <section anchor="yang-push-2-tree">
        <name>ietf-yang-push-2 YANG tree</name>
        <t>This section shows the full tree output for ietf-yang-push-2 YANG module.</t>
        <t>Note, this output does not include support for any transport configuration, and for any implementation that supports configured subscriptions using this YANG module then at least one transport would expect to be configurable.</t>
        <figure>
          <name>YANG tree for YANG Push v2 Module Tree Output</name>
          <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2

  rpcs:
    +---x establish-subscription {dynamic}?
    |  +---w input
    |  |  +---w id?               subscription-id
    |  |  +---w description?      string
    |  |  +---w target
    |  |  |  +---w datastore?       identityref
    |  |  |  +---w (filter)
    |  |  |     +--:(path)
    |  |  |     |  +---w path       ypath
    |  |  |     +--:(subtree)
    |  |  |     |  +---w subtree    <anydata>
    |  |  |     +--:(xpath)
    |  |  |        +---w xpath      yang:xpath1.0 {yp2:xpath}?
    |  |  +---w update-trigger
    |  |  |  +---w periodic!
    |  |  |  |  +---w period         centiseconds
    |  |  |  |  +---w anchor-time?   yang:date-and-time
    |  |  |  +---w on-change! {on-change}?
    |  |  |     +---w sync-on-start?   boolean
    |  |  +---w encoding          encoding
    |  |  +---w dscp?             inet:dscp
    |  +--ro output
    |     +--ro id    subscription-id
    +---x modify-subscription {dynamic}?
    |  +---w input
    |     +---w id                subscription-id
    |     +---w description?      string
    |     +---w target
    |     |  +---w datastore?       identityref
    |     |  +---w (filter)
    |     |     +--:(path)
    |     |     |  +---w path       ypath
    |     |     +--:(subtree)
    |     |     |  +---w subtree    <anydata>
    |     |     +--:(xpath)
    |     |        +---w xpath      yang:xpath1.0 {yp2:xpath}?
    |     +---w update-trigger
    |     |  +---w periodic!
    |     |  |  +---w period         centiseconds
    |     |  |  +---w anchor-time?   yang:date-and-time
    |     |  +---w on-change! {on-change}?
    |     |     +---w sync-on-start?   boolean
    |     +---w dscp?             inet:dscp
    +---x delete-subscription {dynamic}?
    |  +---w input
    |     +---w id    subscription-id
    +---x kill-subscription {dynamic}?
       +---w input
          +---w id    subscription-id

  notifications:
    +---n subscription-started
    |  +--ro id                    subscription-id
    |  +--ro description?          string
    |  +--ro target
    |  |  +--ro datastore?                 identityref
    |  |  +--ro (filter)
    |  |  |  +--:(path)
    |  |  |  |  +--ro path                 ypath
    |  |  |  +--:(subtree)
    |  |  |  |  +--ro subtree              <anydata>
    |  |  |  +--:(xpath)
    |  |  |     +--ro xpath                yang:xpath1.0 {yp2:xpath}?
    |  |  +--ro schema-id?                 string
    |  |  +--ro yang-library-content-id?
    |  |          -> /yanglib:yang-library/content-id
    |  +--ro update-trigger
    |  |  +--ro periodic!
    |  |  |  +--ro period         centiseconds
    |  |  |  +--ro anchor-time?   yang:date-and-time
    |  |  +--ro on-change! {on-change}?
    |  |     +--ro sync-on-start?   boolean
    |  +--ro message-publishers
    |     +--ro publisher-id*   uint32
    +---n subscription-modified
    |  +--ro id                    subscription-id
    |  +--ro description?          string
    |  +--ro target
    |  |  +--ro datastore?                 identityref
    |  |  +--ro (filter)
    |  |  |  +--:(path)
    |  |  |  |  +--ro path                 ypath
    |  |  |  +--:(subtree)
    |  |  |  |  +--ro subtree              <anydata>
    |  |  |  +--:(xpath)
    |  |  |     +--ro xpath                yang:xpath1.0 {yp2:xpath}?
    |  |  +--ro schema-id?                 string
    |  |  +--ro yang-library-content-id?
    |  |          -> /yanglib:yang-library/content-id
    |  +--ro update-trigger
    |  |  +--ro periodic!
    |  |  |  +--ro period         centiseconds
    |  |  |  +--ro anchor-time?   yang:date-and-time
    |  |  +--ro on-change! {on-change}?
    |  |     +--ro sync-on-start?   boolean
    |  +--ro message-publishers
    |  |  +--ro publisher-id*   uint32
    |  +--ro reason                subscription-change
    +---n subscription-terminated
    |  +--ro id        subscription-id
    |  +--ro reason    identityref
    +---n update
    |  +--ro id?                 subscription-id
    |  +--ro path-prefix?        string
    |  +--ro snapshot-type       enumeration
    |  +--ro observation-time?   yang:date-and-time
    |  +--ro updates* [target-path]
    |  |  +--ro target-path          string
    |  |  +--ro (data)?
    |  |     +--:(merge)
    |  |     |  +--ro merge?         <anydata>
    |  |     +--:(replaced-by)
    |  |     |  +--ro replaced-by?   <anydata>
    |  |     +--:(deleted)
    |  |        +--ro deleted?       empty
    |  +--ro complete?           boolean
    +---n update-complete
       +--ro id?   subscription-id
]]></sourcecode>
        </figure>
      </section>
      <section anchor="yang-push-2-yang-module">
        <name>ietf-yang-push-2 YANG Model</name>
        <t>This module imports typedefs from <xref target="RFC6991"/>, <xref target="RFC8343"/>, <xref target="RFC8341"/>, <xref target="RFC8529"/>, and <xref target="RFC8342"/>.  It references <xref target="RFC6241"/>, <xref target="XPATH"/> ("XML Path Language (XPath) Version 1.0"), <xref target="RFC7049"/>, <xref target="RFC8259"/>, <xref target="RFC7950"/>, <xref target="RFC7951"/>, and <xref target="RFC7540"/>.</t>
        <t>This YANG module imports typedefs from <xref target="RFC6991"/>, identities from
<xref target="RFC8342"/>, and the "sx:structure" extension from <xref target="RFC8791"/>. It also references <xref target="RFC6241"/>, <xref target="XPATH"/>, and <xref target="RFC7950"/>.</t>
        <figure>
          <name>YANG module ietf-yang-push-2</name>
          <sourcecode type="yang" markers="true" name="ietf-yang-push-2.yang#0.1.0"><![CDATA[
module ietf-yang-push-2 {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-yang-push-2";
  prefix yp2;

  import ietf-inet-types {
    prefix inet;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-netconf-acm {
    prefix nacm;
    reference
      "RFC 8341: Network Configuration Access Control Model";
  }
  import ietf-yang-structure-ext {
    prefix sx;
    reference
      "RFC 8525: YANG Data Structure Extensions";
  }
  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-datastores {
    prefix ds;
    reference
      "RFC 8342: Network Management Datastore Architecture (NMDA)";
  }
  import ietf-yang-library {
    prefix yanglib;
    reference
      "RFC 8525: YANG Library";
  }
  import ietf-yp-notification {
    prefix iypn;
    reference
     "draft-ietf-netconf-notif-envelope: Extensible YANG Model for
      YANG-Push Notifications

      TODO: RFC Editor please replace with latest draft/RFC version
     at publication time.";
  }

  organization
    "IETF NETCONF (Network Configuration) Working Group";
  contact
    "WG Web:  <https:/datatracker.ietf.org/wg/netconf/>
     WG List: <mailto:netconf@ietf.org>

     Author:  Robert Wilton
              <mailto:rwilton@cisco.com>";
  description
    "This module contains YANG specifications for YANG-Push
     version 2, a simplified version of the YANG-Push [RFC 8641]
     protocol.

     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.

     Copyright (c) 2025 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.";

  revision 2025-08-03 {
    description
      "Initial revision.";
    reference
      "XXXX: YANG Datastore Telemetry (YANG Push version 2)";
  }

  /*
   * FEATURES
   */

  feature dynamic {
    description
      "This feature indicates that dynamic establishment of
       subscriptions is
       supported.";
  }

  feature on-change {
    description
      "This feature indicates that on-change triggered subscriptions
       are supported.";
  }

  feature subtree {
    description
      "This feature indicates support for YANG subtree filtering.";
    reference
      "RFC 6241: Network Configuration Protocol (NETCONF),
                 Section 6";
  }

  feature xpath {
    description
      "This feature indicates support for XPath filtering.";
    reference
      "XML Path Language (XPath) Version 1.0
       (https://www.w3.org/TR/1999/REC-xpath-19991116)";
  }

  /*
   * IDENTITIES
   */
  /* Identities for RPC and notification errors */

  identity delete-subscription-error {
    description
      "Base identity for the problem found while attempting to
       fulfill either a 'delete-subscription' RPC request or a
       'kill-subscription' RPC request.";
  }

  identity establish-subscription-error {
    description
      "Base identity for the problem found while attempting to
       fulfill an 'establish-subscription' RPC request.";
  }

  identity subscription-terminated-reason {
    description
      "Base identity for the problem condition communicated to a
       receiver as part of a 'subscription-terminated'
       notification.";
  }

  identity dscp-unavailable {
    base establish-subscription-error;
    description
      "The publisher is unable to mark notification messages with
       prioritization information in a way that will be respected
       during network transit.";
  }

  identity encoding-unsupported {
    base establish-subscription-error;
    description
      "Unable to encode notification messages in the desired
       format.";
  }

  identity filter-unavailable {
    base subscription-terminated-reason;
    description
      "Referenced filter does not exist.  This means a receiver is
       referencing a filter that doesn't exist or to which it
       does not have access permissions.";
  }

  identity filter-unsupported {
    base establish-subscription-error;
    description
      "Cannot parse syntax in the filter.  This failure can be from
       a syntax error or a syntax too complex to be processed by the
       publisher.";
  }

  identity insufficient-resources {
    base establish-subscription-error;
    description
      "The publisher does not have sufficient resources to support
       the requested subscription.  An example might be that
       allocated CPU is too limited to generate the desired set of
       notification messages.";
  }

  identity no-such-subscription {
    base delete-subscription-error;
    base subscription-terminated-reason;
    description
      "Referenced subscription doesn't exist.  This may be as a
       result of a nonexistent subscription ID, an ID that belongs to
       another subscriber, or an ID for a configured subscription.";
  }

  identity stream-unavailable {
    base subscription-terminated-reason;
    description
      "Not a subscribable event stream.  This means the referenced
       event stream is not available for subscription by the
       receiver.";
  }

  identity suspension-timeout {
    base subscription-terminated-reason;
    description
      "Termination of a previously suspended subscription.  The
       publisher has eliminated the subscription, as it exceeded a
       time limit for suspension.";
  }

  identity unsupportable-volume {
    base subscription-terminated-reason;
    description
      "The publisher does not have the network bandwidth needed to
       get the volume of generated information intended for a
       receiver.";
  }

  identity conflicting-identifier {
    base subscription-terminated-reason;
    description
      "The subscription identifier conflicts with another
       subscription.

       This can prevent a dynamic subscription from being
       established, or cause a dynamic subscription to be terminated
       if a configured subscription with the same id is created.";

    // TODO - Should there be separate error codes for creating a
    // subscription vs terminating an existing one?
  }


  /* Identities for encodings */

  identity configurable-encoding {
    description
      "If a transport identity derives from this identity, it means
       that it supports configurable encodings.  An example of a
       configurable encoding might be a new identity such as
       'encode-cbor'.  Such an identity could use
       'configurable-encoding' as its base.  This would allow a
       dynamic subscription encoded in JSON (RFC 8259) to request
       that notification messages be encoded via the Concise Binary
       Object Representation (CBOR) (RFC 7049).  Further details for
       any specific configurable encoding would be explored in a
       transport document based on this specification.
       
       TODO - Clear up this text or use YANG-CBOR reference";
    reference
      "RFC 8259: The JavaScript Object Notation (JSON) Data
                 Interchange Format
       RFC 7049: Concise Binary Object Representation (CBOR)";
  }

  identity encoding {
    description
      "Base identity to represent data encodings.";
  }

  identity json {
    base encoding;
    description
      "Encode data using JSON as described in RFC 7951.";
    reference
      "RFC 7951: JSON Encoding of Data Modeled with YANG";
  }

  identity xml {
    base encoding;
    description
      "Encode data using XML as described in RFC 7950.";
    reference
      "RFC 7950: The YANG 1.1 Data Modeling Language";
  }

  identity cbor {
    base encoding;
    description
      "Encode data using CBOR as described in RFC 9245,
       without using YANG SIDs";
    reference
      "RFC 9245: Encoding of Data Modeled with YANG in the
       Concise Binary Object Representation (CBOR).";
  }

  identity cbor-sids {
    base encoding;
    description
      "Encode data using JSON as described in RFC 7951, using YANG
       SIDs.";
    reference
      "RFC 9245: Encoding of Data Modeled with YANG in the
       Concise Binary Object Representation (CBOR).

       RFC 9595: YANG Schema Item iDentifier (YANG SID).";
  }

  /* Identities for transports */

  identity transport {
    description
      "An identity that represents the underlying mechanism for
       passing notification messages.";
  }


  /*
   * TYPEDEFs
   */

  typedef ypath {
    type string {
      length "1..max";
    }
    description
      "A type for YANG instance data paths.";
  }

  typedef encoding {
    type identityref {
      base encoding;
    }
    description
      "Specifies a data encoding, e.g., for a data subscription.";
  }

  typedef subscription-id {
   type string {
      length "1..64";
      pattern '[A-Za-z0-9._-]+';
    }
    description
      "A used friendly string identifier for a subscription.";
  }

  typedef transport {
    type identityref {
      base transport;
    }
    description
      "Specifies the transport used to send notification messages
       to a receiver.";
  }

// TODO - Consider changes to list keys or reordering of
//        user-ordered lists.

  typedef centiseconds {
    type uint32;
    description
      "A period of time, measured in units of 0.01 seconds.";
  }

  typedef subscription-type {
    type enumeration {
      enum configured {
        description
          "A subscription that is created and managed via
           configuration.";
      }
      enum dynamic {
        description
          "A subscription that is created and managed via RPC
           primitives.";
      }
    }
    description
      "Indicate the type of subscription.";
  }

  typedef subscription-status {
    type enumeration {
      enum invalid {
        description
          "The subscription as a whole is unsupportable with its
          current parameters.";
      }
      enum inactive {
        description
          "The subscription is supportable with its current
          parameters, but it is not currently connected to a
          receiver";
      }
      enum active {
        description
          "The subscription is actively running, and is connected
           to at least one receiver.

           A subscription-started notification must have been sent
           for a subscription to be in this state, and the receiver
           will receive update notifications, as per the
           update-trigger selection.";
      }
    }
    description
      "Indicates the status of a subscription";
  }

  typedef subscription-change {
    type enumeration {
      enum new-subscription {
        description
          "This is a new subscription.";
      }
      enum deleted {
        description
          "The subscription has been unconfigured or deleted via
           a delete-subscription RPC";
      }
      enum killed {
        description
          "A dynamic subscription has been killed via a
           kill-subscription RPC";
      }
      enum receiver-added {
        description
          "A new receiver has been added to a configured
           subscription, and has connected successfully.";
      }
      enum receiver-removed {
        description
          "A receiver has been removed from a configured
           subscription, or has become disconnected.";
      }
      enum config-changed {
        description
          "The subscription configuration has been changed,
           requiring the subscription to be restarted.";
      }
    }

    description
      "Indicates the reason why a subscription has changed.";
  }

  /*
   * GROUPINGS
   */

  grouping dscp {
    description
      "This grouping describes QoS information concerning a
       subscription.  This information is passed to lower layers
       for transport prioritization and treatment.";
    leaf dscp {
      type inet:dscp;
      default "0";
      description
        "The desired network transport priority level.  This is the
         priority set on notification messages encapsulating the
         results of the subscription.  This transport priority is
         shared for all receivers of a given subscription.";
    }
  }

  grouping publishers {
    description
      "Grouping describes the list of publisher-ids";
    leaf-list publisher-id {
      type uint32;
      default 0;
      config false;
      description
        "Identifies the software process which publishes notification
        messages (e.g., processor 1 on line card 1). This field
        is used to notify the receiver which publisher processes
        are going to publish. The identifiers are locally unique to
        the Network Node.";
    }
  }

  grouping filter-choice {
    description
      "This grouping defines the types of selectors for objects
       from a datastore.";
    choice filter {
      mandatory true;
      description
        "The content filter specification for this request.";

      leaf path {
        type ypath;
        mandatory true;
        description
          "A basic path filter that allows wildcard, regex, or
           fixed value for list keys.  Each format is TODO";
      }
      anydata subtree {
        //if-feature "yp2:subtree";
        mandatory true;
        description
          "This parameter identifies the portions of the
           target datastore to retrieve.";
        reference
          "RFC 6241: Network Configuration Protocol (NETCONF),
                     Section 6";
      }
      leaf xpath {
        if-feature "yp2:xpath";
        type yang:xpath1.0;
        mandatory true;
        description
          "This parameter contains an XPath expression identifying
           the portions of the target datastore to retrieve.

           If the expression returns a node set, all nodes in the
           node set are selected by the filter.  Otherwise, if the
           expression does not return a node set, the filter
           doesn't select any nodes.

           The expression is evaluated in the following XPath
           context:

           o  The set of namespace declarations is the set of prefix
              and namespace pairs for all YANG modules implemented
              by the server, where the prefix is the YANG module
              name and the namespace is as defined by the
              'namespace' statement in the YANG module.

              If the leaf is encoded in XML, all namespace
              declarations in scope on the 'stream-xpath-filter'
              leaf element are added to the set of namespace
              declarations.  If a prefix found in the XML is
              already present in the set of namespace declarations,
              the namespace in the XML is used.

           o  The set of variable bindings is empty.

           o  The function library is comprised of the core
              function library and the XPath functions defined in
              Section 10 in RFC 7950.

           o  The context node is the root node of the target
              datastore.";
        reference
          "XML Path Language (XPath) Version 1.0
           (https://www.w3.org/TR/1999/REC-xpath-19991116)
           RFC 7950: The YANG 1.1 Data Modeling Language,
                     Section 10";
      }
    }
  }

  grouping update-policy {
    description
      "This grouping describes the susbcription update policy";

    container update-trigger {
      description
        "This container describes all conditions under which
         subscription update messages are generated";

      container periodic {
        presence "indicates a periodic subscription";
        description
          "The publisher is requested to periodically notify the
            receiver regarding the current values of the datastore
            as defined by the selection filter.";
        leaf period {
          type centiseconds;
          mandatory true;
          description
            "Duration of time that should occur between periodic
              push updates, in units of 0.01 seconds.";
        }
        leaf anchor-time {
          type yang:date-and-time;
          description
            "Designates a timestamp before or after which a series
              of periodic push updates are determined.  The next
              update will take place at a point in time that is a
              multiple of a period from the 'anchor-time'.
              For example, for an 'anchor-time' that is set for the
              top of a particular minute and a period interval of a
              minute, updates will be sent at the top of every
              minute that this subscription is active.";
        }
      }
      container on-change {
        if-feature "on-change";
        presence "indicates an on-change subscription";
        description
          "The publisher is requested to notify the receiver
            regarding changes in values in the datastore subset as
            defined by a selection filter.";

        leaf sync-on-start {
          type boolean;
          default "true";
          description
            "When this object is set to 'false', (1) it restricts an
             on-change subscription from sending 'push-update'
             notifications and (2) pushing a full selection per the
             terms of the selection filter MUST NOT be done for
             this subscription.  Only updates about changes
             (i.e., only 'push-change-update' notifications)
             are sent.  When set to 'true' (the default behavior),
             in order to facilitate a receiver's synchronization,
             a full update is sent, via a 'push-update' notification,
             when the subscription starts.  After that,
             'push-change-update' notifications are exclusively sent,
             unless the publisher chooses to resync the subscription
             via a new 'push-update' notification.";
        }
      }
    }
  }

  grouping subscription-id {
    description
      "This grouping describes the subscription identifier.";

    leaf id {
      type subscription-id;
      mandatory true;
      description
        "The unique identifier for the subscription.";
    }
  }

  grouping client-subscription-id {
    description
      "This grouping describes a subscription identifier that
       cannot start with 'dyn-', which is reserved for dynamically
       created subscriptions.";

    leaf id {
      type subscription-id {
        pattern "dyn-.*" {
          modifier "invert-match";
        }
      }
      description
        "A identifier for the subscription, that MUST be unique
        across all configured and dynamic subscriptions.

        MUST NOT start with 'dyn-' which is reserved for
        dynamic subscriptions created by the publisher.";
    }
  }

  grouping subscription-schema {
    description
      "This grouping describes schema information related to a
       subscription.";

    leaf schema-id {
      type string;
      description
        "Indicates the version of the YANG schema used for this
        subscription.  The schema-id MUST change if the schema
        associated with the subscription changes.  The schema-id
        MAY change if the device schema changes, even if the 
        change does not affect the subscription.";
    }

    leaf yang-library-content-id {
      type leafref {
        path "/yanglib:yang-library/yanglib:content-id";
      }
      description
        "Contains the YANG library content identifier.";
    }
  }

  grouping subscription-common {
    description
      "Common settings that are shared between dynamic and
       configured subscriptions.";

    leaf description {
      type string {
        length "1..1000";
      }
      description
        "Open text allowing a configuring entity to embed the
         originator or other specifics of this subscription.";
    }

    container target {
      description
        "Identifies the source of information against which a
         subscription is being applied as well as specifics on the
         subset of information desired from that source.";
      leaf datastore {
        type identityref {
          base ds:datastore;
        }
        default "ds:operational";
        description
          "Datastore from which to retrieve data, defaults to
           operational";
      }

      uses filter-choice;
    }

    uses update-policy;
  }


  /*
   * RPCs
   */

  rpc establish-subscription {
    if-feature "dynamic";
    description
      "This RPC allows a subscriber to create (and possibly
       negotiate) a subscription on its own behalf.  If successful,
       the subscription remains in effect for the duration of the
       subscriber's association with the publisher or until the
       subscription is terminated.  If an error occurs or the
       publisher cannot meet the terms of a subscription, an RPC
       error is returned, and the subscription is not created.
       In that case, the RPC reply's 'error-info' MAY include
       suggested parameter settings that would have a higher
       likelihood of succeeding in a subsequent
       'establish-subscription' request.";
    input {
      uses client-subscription-id {
        refine id {
          description
            "A optional identifier for a dynamic
             subscription, that must be unique across all
             configured and dynamic subscriptions.

             MUST NOT start with 'dyn-'.

             If not provided, the publisher MUST generate a unique
             identifier for the subscription, with an identifier
             that starts with 'dyn-', which is returned to the
             client in the RPC reply.";
        }
      }
      uses subscription-common;

      leaf encoding {
        type encoding;
        mandatory true;
        description
          "The encoding to use for the subscription notifications.";
      }

      uses dscp;

    }
    output {
      leaf id {
        type subscription-id;
        mandatory true;
        description
          "Identifier used for this subscription.";
      }
    }
  }

  rpc modify-subscription {
    if-feature "dynamic";
    description
      "This RPC allows a subscriber to modify a dynamic
       subscription's parameters.  If successful, the changed
       subscription parameters remain in effect for the duration of
       the subscription, until the subscription is again modified, or
       until the subscription is terminated.  In the case of an error
       or an inability to meet the modified parameters, the
       subscription is not modified and the original subscription
       parameters remain in effect.";
    input {
      uses subscription-id;
      uses subscription-common;

      uses dscp;

    }
    //output {
      // leaf id {
      //   type subscription-id;
      //   mandatory true;
      //   description
      //     "Identifier used for this subscription.";
      // }
    //}
  }

  sx:structure establish-subscription-stream-error-info {
    container establish-subscription-stream-error-info {
      description
        "If any 'establish-subscription' RPC parameters are
         unsupportable against the event stream, a subscription
         is not created and the RPC error response MUST indicate the
         reason why the subscription failed to be created.  This
         yang-data MAY be inserted as structured data in a
         subscription's RPC error response to indicate the reason for
         the failure.  This yang-data MUST be inserted if hints are
         to be provided back to the subscriber.";
      leaf reason {
        type identityref {
          base establish-subscription-error;
        }
        description
          "Indicates the reason why the subscription has failed to
           be created to a targeted event stream.";
      }
      leaf filter-failure-hint {
        type string;
        description
          "Information describing where and/or why a provided
           filter was unsupportable for a subscription.  The
           syntax and semantics of this hint are
           implementation specific.";
      }
    }
  }

  rpc delete-subscription {
    if-feature "dynamic";
    description
      "This RPC allows a subscriber to delete a subscription that
       was previously created by that same subscriber using the
       'establish-subscription' RPC.

       Only subscriptions that were created using
       'establish-subscription' from the same origin as this RPC
       can be deleted via this RPC. // TODO - Why same origin?

       If an error occurs, the server replies with an 'rpc-error'
       where the 'error-info' field MAY contain a
       'delete-subscription-error-info' structure.";
    input {
      leaf id {
        type subscription-id;
        mandatory true;
        description
          "The name of the dynamic subscription to be deleted.";
      }
    }
  }

  rpc kill-subscription {
    if-feature "dynamic";
    nacm:default-deny-all;
    description
      "This RPC allows an operator to delete a dynamic subscription
       without restrictions on the originating subscriber or
       underlying transport session.

       Only dynamic subscriptions, i.e., those that were created
       using 'establish-subscription', may be deleted via this RPC.

       If an error occurs, the server replies with an 'rpc-error'
       where the 'error-info' field MAY contain a
       'delete-subscription-error-info' structure.";
    input {
      leaf id {
        type subscription-id;
        mandatory true;
        description
          "The name of the dynamic subscription to be deleted.";
      }
    }
  }

  sx:structure delete-subscription-error-info {
    container delete-subscription-error-info {
      description
        "If a 'delete-subscription' RPC or a 'kill-subscription' RPC
         fails, the subscription is not deleted and the RPC error
         response MUST indicate the reason for this failure.  This
         yang-data MAY be inserted as structured data in a
         subscription's RPC error response to indicate the reason
         for the failure.";
      leaf reason {
        type identityref {
          base delete-subscription-error;
        }
        mandatory true;
        description
          "Indicates the reason why the subscription has failed to be
           deleted.";
      }
    }
  }

  /*
   * NOTIFICATIONS
   */

  grouping subscription-update-common {
    description
      "Data nodes common to both subscription-started and
       subscription-modified notifications.";

    uses subscription-id;
    uses subscription-common {
      augment "target" {
        description
          "Augments fields to identify the target schema.";
        uses subscription-schema;
      }
    }
    container message-publishers {
      description
        "Holds the publisher-ids for all processes currently
         associated with the subscription";
        uses yp2:publishers;
    }
  }

  notification subscription-started {
    description
      "This notification indicates that a subscription has started
       and notifications will now be sent.";
       uses subscription-update-common;
  }

  notification subscription-modified {
    description
      "This notification indicates that subscription paramaters have
       changed.";
    uses subscription-update-common;

    leaf reason {
      type subscription-change;
      mandatory true;
      description
        "Gives a hint for the message recipient as to why the
         notification has been sent.";
    }
  }

  notification subscription-terminated {
    description
      "This notification indicates that a subscription has been
       terminated.";
    uses subscription-id;
    leaf reason {
      type identityref {
        base subscription-terminated-reason;
      }
      mandatory true;
      description
        "Identifies the condition that resulted in the
         termination.";
    }
  }

  notification update {
    description
      "This notification contains a push update that in turn
       contains data subscribed to via a subscription.  In the case
       of a periodic subscription, this notification is sent for
       periodic updates.  It can also be used for synchronization
       updates of an on-change subscription.  This notification
       shall only be sent to receivers of a subscription.";
    leaf id {
      type subscription-id;
      description
        "The identifier of the subscription that is the source of
         this notification.";
    }

    leaf path-prefix {
      type string;
      description
        "Specifies the common prefix that all other paths and data
         are encoded relative to.

         TODO - This should be a JSONified instance data path.";
    }

    leaf snapshot-type {
      type enumeration {
        enum "periodic" {
          description
            "The update message is due to a periodic update.";
        }
        enum "on-change-update" {
          description
            "The update message is due to an on-change update.  This
             means that one or more fields have changed under the
             snapshot path.

             TODO - Split this into a on-change-delete msg?";
        }
        enum "on-change-delete" {
          description
            "The update message is due to an on-change event where
             the data node at the target path has been delete.";
        }
        enum "resync" {
          description
            "This indicates that the update is to resynchronize the
             state, e.g., after a subscription started notification.

             Ideally, the resync message SHOULD be the first
             notification sent when a subscription has started, but
             it is not gauranteed or required to be the first
             (e.g., if an on-change event occurs).

             These messages can be used to ensure that all state
             has been sent to the client, and can be used to purge
             stale data.

             TODO - In the distributed notification case, need a
             notification to indicate that all child subscriptions
             have been sent.";
        }
      }
      mandatory true;
      description
        "This indicates the type of notification message that is
         being sent.";
    }

    leaf observation-time {
      type yang:date-and-time;
      description
        "The time that the update was observed by the publisher.";
    }

    list updates {
      key "target-path";
      description
        "This list contains the updated data.  It constitutes a
         snapshot at the time of update of the set of data that has
         been subscribed to.  The snapshot corresponds to the same
         snapshot that would be returned in a corresponding 'get'
         operation with the same selection filter parameters
         applied.";

      leaf target-path {
        type string;
        description
          "The target path of the data that is being replaced, i.e.,
           updated or deleted.  The path is given relative to the
           path-prefix.";
      }

      choice data {
        description
          "This choice indicates the type of update that is being
           performed at the target path.";
        anydata merge {
          description
            "This contains the updated data that is to be merged with
            the existing data at the target path.  It constitutes a
            snapshot at the time of update of the set of data that
            has been subscribed to.  The snapshot corresponds to the
            same snapshot that would be returned in a corresponding
            'get' operation with the same selection filter parameters
            applied.

            The snapshot is encoded relative to the combined path
            defined by the common path-prefix and target-path";
        }
        anydata replaced-by {
          description
            "This contains the updated data that is to replace all
            existing data at the target path.   It constitutes a
            snapshot at the time of update of the set of data that
            has been subscribed to.  The snapshot corresponds to the
            same snapshot that would be returned in a corresponding
            'get' operation with the same selection filter parameters
            applied.

            The snapshot is encoded relative to the combined path
            defined by the common path-prefix and target-path";
        }
        leaf deleted {
          type empty;
          description
            "This indicates that the data at the target path has been
             deleted.";
        }
      }
    }

    leaf complete {
      type boolean;
      default "false";
      description
        "This flag indicates that this is the last
         notification in a series of notifications that together
         constitute a complete snapshot of the subscribed data at
         the event-time.

         The 'update-complete' notification MAY be used as an
         alternative to setting this flag, and is semantically
         equivalent.";
    }
  }

  notification update-complete {
    description
      "This notification indicates the end of a periodic collection
       or resync event for an on-change subscription, and can be used
       to indicate that the receiver has a complete snapshot of the
       subscribed data at the event-time, and hence the client MAY
       use this as a signal that it can purge stale state
       information.

       Alternatively, the 'complete' flag in the update
       notification MAY be used instead of sending this notification
       as a separate message, and both are semantically equivalent.";
    leaf id {
      type subscription-id;
      description
        "The name of the subscription that is the source of
          this notification.";
    }
  }

  sx:augment-structure "/iypn:envelope" {
    leaf publisher-id {
      type uint32;
      default 0;
      description
        "Identifies the software process which publishes notification
         messages (e.g., processor 1 on line card 1). This field
         is used to notify the receiver which publisher process
         published which message. The identifier is locally unique to
         the Network Node.";
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="config-subs-data-model">
      <name>Configured Subscription YANG Data Model</name>
      <t>This document specifies the ietf-yang-push-2-config YANG module <xref target="yang-push-2-config-yang-module"/> that defines an NMDA <xref target="RFC8342"/> compatible YANG data model for configuring subscriptions.  Support for this YANG module is <bcp14>OPTIONAL</bcp14> and is advertised using the normal mechanisms, e.g., <xref target="RFC8525"/>.</t>
      <t>Below is a tree diagram for the "subscriptions" container.  All objects contained in this tree are described in the YANG module in <xref target="yang-push-2-yang-module"/>.  In the operational datastore <xref target="RFC8342"/>, the "subscription" list contains entries both for configured and dynamic subscriptions.</t>
      <figure anchor="SubscriptionYangTree">
        <name>subscriptions container Tree Diagram</name>
        <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-config
  +--rw datastore-telemetry!
     +--rw subscriptions
        +--rw subscription* [id]
           +--rw id                                  subscription-id
           +--rw description?                        string
           +--rw target
           |  +--rw datastore?          identityref
           |  +--rw (filter)
           |     +--:(path)
           |     |  +--rw path          ypath
           |     +--:(subtree)
           |     |  +--rw subtree       <anydata>
           |     +--:(xpath)
           |     |  +--rw xpath         yang:xpath1.0 {yp2:xpath}?
           |     +--:(by-reference)
           |        +--rw filter-ref    filter-ref
           +--rw update-trigger
           |  +--rw periodic!
           |  |  +--rw period         centiseconds
           |  |  +--rw anchor-time?   yang:date-and-time
           |  +--rw on-change! {on-change}?
           |     +--rw sync-on-start?   boolean
           +--rw receiver
           |       -> /datastore-telemetry/receivers/receiver/name
           +--ro status?
           |       yp2:subscription-status
           +--ro type?
           |       yp2:subscription-type
           +--ro encoding?                           yp2:encoding
           +--ro message-publishers
           |  +--ro publisher-id*   uint32
           +--ro last-sequence-number?
           |       yang:zero-based-counter64
           +--ro last-notification-time?
           |       yang:date-and-time
           +--ro last-periodic-collection-time?
           |       yang:date-and-time
           +--ro last-on-change-notification-time?
           |       yang:date-and-time
           +--ro statistics
           |  +--ro started-notifications?
           |  |       yang:zero-based-counter64
           |  +--ro terminated-notifications?
           |  |       yang:zero-based-counter64
           |  +--ro update-notifications?
           |  |       yang:zero-based-counter64
           |  +--ro periodic-collections?
           |  |       yang:zero-based-counter64
           |  +--ro excluded-events?
           |  |       yang:zero-based-counter64
           |  +--ro receiver-disconnects?
           |          yang:zero-based-counter64
           +---x reset

  augment /yp2:subscription-started/yp2:target:
    +-- filter-ref?   filter-ref
  augment /yp2:subscription-modified/yp2:target:
    +-- filter-ref?   filter-ref
]]></sourcecode>
      </figure>
      <t>An overview of the behavior for configured subscriptions is specified in <xref target="configured-subscriptions"/>, with further details specified in the ietf-yang-push-2-config YANG module.</t>
      <section anchor="yang-push-2-config-tree">
        <name>ietf-yang-push-2-config YANG tree</name>
        <t>This section shows the full tree output for ietf-yang-push-2-config YANG module.</t>
        <t>Note, this output does not include support for any transport configuration, and for any implementation that supports configured subscriptions using this YANG module then at least one transport would expect to be configurable.</t>
        <figure>
          <name>YANG tree for YANG Push v2 Config Module Tree Output</name>
          <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-config
  +--rw datastore-telemetry!
     +--rw filters
     |  +--rw filter* [name]
     |     +--rw name             string
     |     +--rw (filter)
     |        +--:(path)
     |        |  +--rw path       ypath
     |        +--:(subtree)
     |        |  +--rw subtree    <anydata>
     |        +--:(xpath)
     |           +--rw xpath      yang:xpath1.0 {yp2:xpath}?
     +--rw subscriptions
     |  +--rw subscription* [id]
     |     +--rw id                                  subscription-id
     |     +--rw description?                        string
     |     +--rw target
     |     |  +--rw datastore?          identityref
     |     |  +--rw (filter)
     |     |     +--:(path)
     |     |     |  +--rw path          ypath
     |     |     +--:(subtree)
     |     |     |  +--rw subtree       <anydata>
     |     |     +--:(xpath)
     |     |     |  +--rw xpath         yang:xpath1.0 {yp2:xpath}?
     |     |     +--:(by-reference)
     |     |        +--rw filter-ref    filter-ref
     |     +--rw update-trigger
     |     |  +--rw periodic!
     |     |  |  +--rw period         centiseconds
     |     |  |  +--rw anchor-time?   yang:date-and-time
     |     |  +--rw on-change! {on-change}?
     |     |     +--rw sync-on-start?   boolean
     |     +--rw receiver
     |     |       -> /datastore-telemetry/receivers/receiver/name
     |     +--ro status?
     |     |       yp2:subscription-status
     |     +--ro type?
     |     |       yp2:subscription-type
     |     +--ro encoding?                           yp2:encoding
     |     +--ro message-publishers
     |     |  +--ro publisher-id*   uint32
     |     +--ro last-sequence-number?
     |     |       yang:zero-based-counter64
     |     +--ro last-notification-time?
     |     |       yang:date-and-time
     |     +--ro last-periodic-collection-time?
     |     |       yang:date-and-time
     |     +--ro last-on-change-notification-time?
     |     |       yang:date-and-time
     |     +--ro statistics
     |     |  +--ro started-notifications?
     |     |  |       yang:zero-based-counter64
     |     |  +--ro terminated-notifications?
     |     |  |       yang:zero-based-counter64
     |     |  +--ro update-notifications?
     |     |  |       yang:zero-based-counter64
     |     |  +--ro periodic-collections?
     |     |  |       yang:zero-based-counter64
     |     |  +--ro excluded-events?
     |     |  |       yang:zero-based-counter64
     |     |  +--ro receiver-disconnects?
     |     |          yang:zero-based-counter64
     |     +---x reset
     +--rw receivers
        +--rw receiver* [name]
           +--rw name                      string
           +--rw encoding                  yp2:encoding
           +--rw dscp?                     inet:dscp
           +---x reset
           +--rw (notification-message-origin)?
           |  +--:(interface-originated)
           |  |  +--rw source-interface?   if:interface-ref
           |  |          {interface-designation}?
           |  +--:(address-originated)
           |     +--rw source-vrf?         leafref {supports-vrf}?
           |     +--rw source-address?     inet:ip-address-no-zone
           +--rw (transport-type)

  augment /yp2:subscription-started/yp2:target:
    +-- filter-ref?   filter-ref
  augment /yp2:subscription-modified/yp2:target:
    +-- filter-ref?   filter-ref
]]></sourcecode>
        </figure>
      </section>
      <section anchor="yang-push-2-config-yang-module">
        <name>ietf-yang-push-2-config YANG Model</name>
        <t>This module has import dependencies on <xref target="RFC6991"/>, <xref target="RFC8343"/>, and <xref target="RFC8529"/>, and ietf-yang-push-lite.yang (this RFC).  In addition, this YANG module references <xref target="BCP14"/> (<xref target="RFC2119"/> <xref target="RFC8174"/>), and <xref target="RFC8529"/>.</t>
        <figure>
          <name>YANG module ietf-yang-push-2-config</name>
          <sourcecode type="yang" markers="true" name="ietf-yang-push-2-config.yang#0.1.0"><![CDATA[
module ietf-yang-push-2-config {
  yang-version 1.1;
  namespace
    "urn:ietf:params:xml:ns:yang:ietf-yang-push-2-config";
  prefix yp2co;

  import ietf-inet-types {
    prefix inet;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-interfaces {
    prefix if;
    reference
      "RFC 8343: A YANG Data Model for Interface Management";
  }
  import ietf-network-instance {
    prefix ni;
    reference
      "RFC 8529: YANG Data Model for Network Instances";
  }
  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-yang-push-2 {
    prefix yp2;
    reference
      "RFC XXXX: YANG Datastore Telemetry (YANG Push version 2)";
  }

  organization
    "IETF NETCONF (Network Configuration) Working Group";
  contact
    "WG Web:  <https:/datatracker.ietf.org/wg/netconf/>
     WG List: <mailto:netconf@ietf.org>

     Author:  Robert Wilton
              <mailto:rwilton@cisco.com>";
  description
    "This module contains YANG specifications for YANG-Push version 2
     configuration and operational state model.

     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.

     Copyright (c) 2025 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.";

  revision 2025-08-03 {
    description
      "Initial revision.";
    reference
      "XXX: YANG Datastore Telemetry (YANG Push version 2)";
  }

  /*
   * FEATURES
   */

  feature interface-designation {
    description
      "This feature indicates that a publisher supports sourcing all
       receiver interactions for a configured subscription from a
       single designated egress interface.";
  }

  feature supports-vrf {
    description
      "This feature indicates that a publisher supports VRF
       configuration for configured subscriptions.  VRF support for
       dynamic subscriptions does not require this feature.";
    reference
      "RFC 8529: YANG Data Model for Network Instances,
                 Section 6";
  }

  /*
   * TYPEDEFs
   */

  typedef filter-ref {
    type leafref {
      path "/datastore-telemetry/filters/filter/name";
    }
    description
      "This type is used to reference a selection filter.";
  }

  /*
   * GROUPINGS
   */
  grouping filter-ref {
    description
      "This grouping is used to reference a selection filter.";
    leaf filter-ref {
      type filter-ref;
      mandatory true;
      description
        "References an existing selection filter that is to be
        applied to the subscription.";
    }
  }

  /*
   * DATA NODES
   */

  container datastore-telemetry {
    presence "Enables datastore telemetry";
    description
    "YANG Push v2 Datastore Telemetry Configuration and State.";
    container filters {
      description
        "Contains a list of configurable filters that can be applied
         to subscriptions.  This facilitates the reuse of complex
         filters once defined.";

      list filter {
        key "name";
        description
          "A list of preconfigured filters that can be applied
          to datastore subscriptions.";
        leaf name {
          type string {
            length "1..64";
            pattern '[A-Za-z0-9._-]+';
          }
          description
            "A unique name to identify the selection filters.";
        }
        uses yp2:filter-choice;
      }
    }
    container subscriptions {
      description
        "Contains the list of currently active subscriptions, i.e.,
        subscriptions that are currently in effect, used for
        subscription management and monitoring purposes.  This
        includes subscriptions that have been set up via
        RPC primitives as well as subscriptions that have been
        established via configuration.";
      list subscription {
        key "id";
        description
          "The identity and specific parameters of a subscription.
          Subscriptions in this list can be created using a control
          channel or RPC or can be established through configuration.

          If the 'kill-subscription' RPC or configuration operations
          are used to delete a subscription, a
          'subscription-terminated' message is sent to any active or
          suspended receivers.";

        uses yp2:client-subscription-id;
        uses yp2:subscription-common;

        leaf receiver {
          type leafref {
            path "/datastore-telemetry/receivers/receiver/name";
          }
          mandatory true;
          description
            "Identifies the receiver for a subscription.";
        }

        // leaf status {
        //   type enumeration {
        //     enum disconnected {
        //       description
        //         "This subscription does not have an active session
        //           with the receiver, and it is not trying to
        //           connect.

        //         E.g., this state may be reported if the
        //         subscription is not valid, or has not been started
        //         yet.";
        //     }
        //     enum connecting {
        //       description
        //         "The publisher is trying to establish a session
        //           with the receiver for this subscription.

        //           For a session less transport, this state may be
        //           used to indicate that there is no route to the
        //           receiver.

        //           A receiver in connecting state may indicate that
        //           the transport or associated security session
        //           could not be established, and the publisher is
        //         periodically trying to establish the connection.";
        //     }
        //     enum active {
        //       description
        //         "The publisher has successfully connected (if over
        //           a session based transport) to the receiver for
        //           this subscription, and the publisher is able to
        //           send notifications to the receiver.";
        //     }
        //   }
        //   config false;
        //   description
        //     "Specifies the connection status of the receiver for
        //       this subscription.";
        // }

        leaf status {
          type yp2:subscription-status;
          config false;
          description
            "The presence of this leaf indicates that the
             subscription originated from configuration, not through
             a control channel or RPC.  The value indicates the state
             of the subscription as established by the publisher.";
        }

        leaf type {
          type yp2:subscription-type;
          default "configured";
          config false;
          description
            "Whether the subscription is configured or dynamic.";
        }

        leaf encoding {
          type yp2:encoding;
          config false;
          description
            "The type of encoding for notification messages.";
        }

        container message-publishers {
          config false;
          description
            "Holds the publisher-ids for all processes
             currently associated with the subscription";
            uses yp2:publishers;
        }

        leaf last-sequence-number {
          type yang:zero-based-counter64;
          config false;
          description
            "The envelope sequence number for the last notification
             sent for this subscription.

             The sequence number is initialized to zero when the
             subscription first becomes active and the first
             subscription-started notification is sent.";
        }

        leaf last-notification-time {
          type yang:date-and-time;
          config false;
          description
            "The notification envelope event-time timestamp of the
             last notification sent for this subscription.

             The timestamp is initialized to the time when the
             subscription first becomes active and the first
             subscription-started notification is sent.";
        }

        leaf last-periodic-collection-time {
          type yang:date-and-time;
          config false;
          description
            "The event-time timestamp of the last completed periodic
             collection or resynchronization collection for this
             subscription, and used as the event-time in the
             notification header.

             The timestamp is initialized to the time when the
             subscription first becomes active and the first
             subscription-started notification is sent.";
        }

        leaf last-on-change-notification-time {
          type yang:date-and-time;
          config false;
          description
            "The notification envelope event-time timestamp of the
             last on-change notification sent for this subscription.

             The timestamp is initialized to the time when the
             subscription first becomes active and the first
             subscription-started notification is sent.";
        }

        container statistics {
          config false;
          description
            "Statistics related to the number of messages generated
             for this subscription.";

          leaf started-notifications {
            type yang:zero-based-counter64;
            config false;
            description
              "The number of subscription-started notifications
               sent for this subscription since the subscription
               list entry was created and the configuration
               was applied by the publisher.";
          }

          leaf terminated-notifications {
            type yang:zero-based-counter64;
            config false;
            description
              "The number of subscription-terminated notifications
               sent for this subscription since the subscription
               list entry was created and the configuration
               was applied by the publisher.";
          }

          leaf update-notifications {
            type yang:zero-based-counter64;
            config false;
            description
              "The number of update records generated for the
               subscription, to be queued to one of more active
               receivers.

               The count is re-initialized to 0 when the
               subscription first becomes active and the
               subscription-started notification is sent.

               The count is incremented even if the update
               record has been generated, but is not queued to
               any receiver.";
          }

          leaf periodic-collections {
            type yang:zero-based-counter64;
            config false;
            description
              "The number of periodic collections completed for
               the subscription.

               The count is re-initialized to 0 when the
               subscription first becomes active and the
               subscription-started notification is sent.

               The count is incremented even if the update
               record has been generated, but is not queued to
               any receiver.";
          }

          leaf excluded-events {
            type yang:zero-based-counter64;
            config false;
            description
              "The number of event records explicitly removed via
              either an event stream filter or an access control
              filter so that they are not passed to a receiver.
              This count is set to zero each time
              'sent-event-records' is initialized.";
          }

          leaf receiver-disconnects {
            type yang:zero-based-counter64;
            config false;
            description
              "The number of times that the receiver has been
                disconnected since the subscription
                receiver entry was created and the configuration
                was applied by the publisher";
          }
        }

        action reset {
          description
            "Reset the subscription.

             This action will cause a new subscription-started
             message to be sent for the subscription";
        }
      }
    }
    container receivers {
      description
        "A container for all instances of configured receivers.";

      list receiver {
        key "name";

        leaf name {
          type string {
            length "1..64";
            pattern '[A-Za-z0-9._-]+';
          }
          description
            "An arbitrary but unique name for this receiver
            instance.";
        }

        leaf encoding {
  /*        when 'not(../transport) or derived-from(../transport,
          "yp2:configurable-encoding")';*/
          type yp2:encoding;
          mandatory true;
          description
            "The type of encoding for notification messages.  For a
             dynamic subscription, if not included as part of an
             'establish-subscription' RPC, the encoding will be
             populated with the encoding used by that RPC.  For a
             configured subscription, if not explicitly configured,
             the encoding will be the default encoding for an
             underlying transport.";
        }

        uses yp2:dscp;

        action reset {
          description
            "Resets all configured subscriptions that reference
             this receiver.

             This action is similar to invoking the 'reset' action
             on all subscriptions that reference this receiver
             configuration.";
        }

        choice notification-message-origin {
          description
            "Identifies the egress interface on the publisher
            from which notification messages are to be sent.";
          case interface-originated {
            description
              "When notification messages are to egress a specific,
              designated interface on the publisher.";
            leaf source-interface {
              if-feature "interface-designation";
              type if:interface-ref;
              description
                "References the interface for notification
                 messages.";
            }
          }
          case address-originated {
            description
              "When notification messages are to depart from a
              publisher using a specific originating address and/or
              routing context information.";
            leaf source-vrf {
              if-feature "supports-vrf";
              type leafref {
                path
                  '/ni:network-instances/ni:network-instance/' 
                  + 'ni:name';
              }
              description
                "VRF from which notification messages should egress a
                publisher.";
            }
            leaf source-address {
              type inet:ip-address-no-zone;
              description
                "The source address for the notification messages.
                If a source VRF exists but this object doesn't, a
                publisher's default address for that VRF must
                be used.";
            }
          }
        }

        choice transport-type {
          mandatory true;
          description
            "Choice of different types of transports used to
             send notifications.  The 'case' statements must
             be augmented in by other modules.";
        }

        description
          "A list of all receiver instances.";
      }
    }
  }

  augment "/yp2:subscription-started/yp2:target" {

    description
      "Allow a subscription-started notification to include a
       referenced named filter";
    uses filter-ref {
      refine "filter-ref" {
        mandatory false;
      }
    }
  }

  augment "/yp2:subscription-modified/yp2:target" {

    description
      "Allow a subscription-modified notification to include a
       referenced named filter";
    uses filter-ref {
      refine "filter-ref" {
        mandatory false;
      }
    }
  }

  augment "/datastore-telemetry/subscriptions/subscription/"
        + "target/filter" {

    description
      "Augment the subscription filter to allow
       referencing a filter configured separately.";

    case by-reference {
      description
        "Incorporates a filter that has been configured
         separately.";
      uses filter-ref;
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="capabilities-yang-data-model">
      <name>Capabilities YANG Data Model</name>
      <section anchor="yang-push-2-capabilities-tree">
        <name>ietf-yang-push-2-capabilities YANG tree</name>
        <t>This section shows the tree output for ietf-yang-push-2-capabilities YANG module, which augments the ietf-system-capabilities YANG module <xref target="RFC9196"/>.</t>
        <figure>
          <name>YANG tree for YANG Push v2 Capabilities Module Tree Output</name>
          <sourcecode type="yangtree"><![CDATA[
module: ietf-yang-push-2-capabilities

  augment /sysc:system-capabilities:
    +--ro datastore-telemetry
    |  +--ro periodic-notifications-supported?   notification-support
    |  +--ro (update-period)?
    |  |  +--:(minimum-update-period)
    |  |  |  +--ro minimum-update-period?        uint32
    |  |  +--:(supported-update-period)
    |  |     +--ro supported-update-period*      uint32
    |  +--ro on-change-supported?                notification-support
    |  +--ro transport
    |     +--ro transport-capability* [transport-protocol]
    |        +--ro transport-protocol    identityref
    |        +--ro security-protocol?    identityref
    |        +--ro encoding-format*      identityref
    +--ro distributed-notifications-supported?   boolean
  augment /sysc:system-capabilities/sysc:datastore-capabilities
            /sysc:per-node-capabilities:
    +--ro datastore-telemetry
       +--ro periodic-notifications-supported?   notification-support
       +--ro (update-period)?
       |  +--:(minimum-update-period)
       |  |  +--ro minimum-update-period?        uint32
       |  +--:(supported-update-period)
       |     +--ro supported-update-period*      uint32
       +--ro on-change-supported?                notification-support
]]></sourcecode>
        </figure>
      </section>
      <section anchor="yang-push-2-yang-capabilities-module">
        <name>ietf-yang-push-2-capabilities YANG Model</name>
        <t>This module imports typedefs from the yang-push-lite YANG module.</t>
        <t>This module augments the ietf-system-capabilities YANG module <xref target="RFC9196"/>.</t>
        <figure>
          <name>YANG module ietf-yang-push-2-capabilities</name>
          <sourcecode type="yang" markers="true" name="ietf-yang-push-2-capabilities.yang#0.1.0"><![CDATA[
module ietf-yang-push-2-capabilities {
  yang-version 1.1;
  namespace
    "urn:ietf:params:xml:ns:yang:ietf-yang-push-2-capabilities";
  prefix yp2ca;

  import ietf-system-capabilities {
    prefix sysc;
    reference
      "RFC 9196: YANG Modules Describing Capabilities for Systems
       and Datastore Update Notifications";
  }
  import ietf-yang-push-2 {
    prefix yp2;
    reference
      "RFC XXX: YANG Datastore Telemetry (YANG Push version 2)";
  }

  organization
    "IETF NETCONF (Network Configuration) Working Group";
  contact
    "WG Web:  <https:/datatracker.ietf.org/wg/netconf/>
     WG List: <mailto:netconf@ietf.org>

     Author:  Robert Wilton
              <mailto:rwilton@cisco.com>";
  description
    "This module contains YANG specifications for YANG-Push lite.

     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.

     Copyright (c) 2025 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.";

  revision 2024-11-11 {
    description
      "Initial revision.";
    reference
      "XXX: YANG Datastore Telemetry (YANG Push version 2)";
  }

  /*
   * IDENTITIES
   */

  identity security-protocol {
    description
      "Identity for security protocols.";
  }

  identity tls12 {
    base security-protocol;
    description
      "Indicates TLS Protocol Version 1.2. TLS 1.2 is obsolete,
       and thus it is NOT RECOMMENDED to enable this feature.";
    reference
      "RFC 5246: The Transport Layer Security (TLS) Protocol
                 Version 1.2";
  }

  identity tls13 {
    base security-protocol;
    description
      "Indicates TLS Protocol Version 1.3.";
    reference
      "RFC 8446: The Transport Layer Security (TLS)
                 Protocol Version 1.3";
  }

  identity dtls12 {
    base security-protocol;
    description
      "Indicates DTLS Protocol Version 1.2. TLS 1.2 is obsolete,
       and thus it is NOT RECOMMENDED to enable this feature.";
    reference
      "RFC 6347: The Datagram Transport Layer Security (TLS) Protocol
                 Version 1.2";
  }

  identity dtls13 {
    base security-protocol;
    description
      "Indicates DTLS Protocol Version 1.3.";
    reference
      "RFC 9147: The Datagram Transport Layer Security (TLS)
                 Protocol Version 1.3";
  }

  identity ssh {
    base security-protocol;
    description
      "Indicates SSH.";
  }


  grouping yp2-capabilities {
    description
      "Capabilities related to YANG Push Lite subscriptions
       and notifications";
    container datastore-telemetry {
      description
        "Capabilities related to YANG Push List subscriptions
         and notifications";
      typedef notification-support {
        type bits {
          bit config-changes {
            description
              "The publisher is capable of sending
               notifications for 'config true' nodes for the
               relevant scope and subscription type.";
          }
          bit state-changes {
            description
              "The publisher is capable of sending
               notifications for 'config false' nodes for the
               relevant scope and subscription type.";
          }
        }
        description
          "Type for defining whether 'on-change' or
           'periodic' notifications are supported for all data nodes,
           'config false' data nodes, 'config true' data nodes, or
           no data nodes.

           The bits config-changes or state-changes have no effect
           when they are set for a datastore or for a set of nodes
           that does not contain nodes with the indicated config
           value.  In those cases, the effect is the same as if no
           support was declared.  One example of this is indicating
           support for state-changes for a candidate datastore that
           has no effect.";
      }

      leaf periodic-notifications-supported {
        type notification-support;
        description
          "Specifies whether the publisher is capable of
           sending 'periodic' notifications for the selected
           data nodes, including any subtrees that may exist
           below them.";
        reference
          "RFC 8641: Subscription to YANG Notifications for
           Datastore Updates, 'periodic' subscription concept";
      }
      choice update-period {
        description
          "Supported update period value or values for
           'periodic' subscriptions.";
        leaf minimum-update-period {
          type uint32;
          units "centiseconds";
          description
            "Indicates the minimal update period that is
             supported for a 'periodic' subscription.

             A subscription request to the selected data nodes with
             a smaller period than what this leaf specifies is
             likely to result in a 'period-unsupported' error.";
        }
        leaf-list supported-update-period {
          type uint32;
          units "centiseconds";
          description
            "Supported update period values for a 'periodic'
             subscription.

             A subscription request to the selected data nodes with a
             period not included in the leaf-list will result in a
             'period-unsupported' error.";
        }
      }
      leaf on-change-supported {
        type notification-support;
        description
          "Specifies whether the publisher is capable of
           sending 'on-change' notifications for the selected
           data nodes and the subtree below them.";
      }
    }
  }

  grouping yp2-transport-capabilities {
    description
      "Capabilities related to transports supporting Yang Push Lite";
    container transport {
      description
        "Specifies capabilities related to YANG-Push transports.";
      list transport-capability {
        key "transport-protocol";
        description
          "Indicates a list of capabilities related to notification
                  transport.";
        leaf transport-protocol {
          type identityref {
            base yp2:transport;
          }
          description
            "Indicates supported transport protocol for YANG-Push.";
        }
        leaf security-protocol {
          type identityref {
            base security-protocol;
          }
          description
            "Indicates transport security protocol.";
        }
        leaf-list encoding-format {
          type identityref {
            base yp2:encoding;
          }
          description
            "Indicates supported encoding formats.";
        }
      }
    }
  }

  // YANG Push Lite Capabilities
  augment "/sysc:system-capabilities" {
    description
      "Adds system level capabilities for YANG Push Lite";
    uses yp2-capabilities;

    leaf distributed-notifications-supported {
      type boolean;
      description
        "Indicates whether the server supports distributed
          notifications and may source message from different
          Message Publishers.";
    }
  }

  augment "/sysc:system-capabilities/yp2ca:datastore-telemetry" {
    description
      "Adds system level Yang Push Lite transport capabilities";
    uses yp2-transport-capabilities;
  }

  augment "/sysc:system-capabilities/sysc:datastore-capabilities"
        + "/sysc:per-node-capabilities" {
    description
      "Add datastore and node-level capabilities";
    uses yp2-capabilities;
  }
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>With configured subscriptions, one or more publishers could be used to overwhelm a receiver.  To counter this, notification messages <bcp14>SHOULD NOT</bcp14> be sent to any receiver that does not support this specification.  Receivers that do not want notification messages need only terminate or refuse any transport sessions from the publisher.</t>
      <t>When a receiver of a configured subscription gets a new "subscription-started" message for a known subscription where it is already consuming events, it may indicate that an attacker has done something that has momentarily disrupted receiver connectivity. <strong>TODO - Do we still want this paragraph?</strong>.</t>
      <t>For dynamic subscriptions, implementations need to protect against malicious or buggy subscribers that may send a large number of "establish-subscription" requests and thereby use up system resources.  To cover this possibility, operators <bcp14>SHOULD</bcp14> monitor for such cases and, if discovered, take remedial action to limit the resources used, such as suspending or terminating a subset of the subscriptions or, if the underlying transport is session based, terminating the underlying transport session.</t>
      <t>Using DNS names for configured subscription's receiver "name" lookups can cause situations where the name resolves differently than expected on the publisher, so the recipient would be different than expected.</t>
      <section anchor="use-of-yang-push-v2-with-nacm">
        <name>Use of YANG Push v2 with NACM</name>
        <t><strong>TODO, do we even need this section?</strong></t>
        <t>This specification <bcp14>MAY</bcp14> be used with access control tools, such as NACM <xref target="RFC8341"/>.  Please refer to that specification for normative guidance of how NACM applies.</t>
        <t>For informative purposes, please note that NACM can be used:</t>
        <ul spacing="normal">
          <li>
            <t>NACM can be used to control access to the data nodes and RPCs defined in the YANG modules defined in this document.</t>
          </li>
          <li>
            <t>NACM can be used to control access to the data included in the YANG <em>update</em> notifications.</t>
          </li>
        </ul>
      </section>
      <section anchor="receiver-authorization">
        <name>Receiver Authorization</name>
        <t><strong>TODO Relax when access control must be checked.</strong></t>
        <t><strong>TODO Consider if this is the best place in the document, but this text needs to be updated regardless.</strong></t>
        <t>A receiver of subscription data <bcp14>MUST</bcp14> only be sent updates for which it has proper authorization.  A publisher <bcp14>MUST</bcp14> ensure that no unauthorized data is included in push updates.  To do so, it needs to apply all corresponding checks applicable at the time of a specific pushed update and, if necessary, silently remove any unauthorized data from datastore subtrees.  This enables YANG data that is pushed based on subscriptions to be authorized in a way that is equivalent to a regular data retrieval ("get") operation.</t>
        <t>Each "push-update" and "push-change-update" <bcp14>MUST</bcp14> have access control applied, as depicted in Figure 5.  This includes validating that read access is permitted for any new objects selected since the last notification message was sent to a particular receiver.  A publisher <bcp14>MUST</bcp14> silently omit data nodes from the results that the client is not authorized to see.  To accomplish this, implementations <bcp14>SHOULD</bcp14> apply the conceptual authorization model of <xref target="RFC8341"/>, specifically Section 3.2.4, extended to apply analogously to data nodes included in notifications, not just &lt;rpc-reply&gt; messages sent in response to
&lt;get&gt; and &lt;get-config&gt; requests.</t>
        <figure>
          <name>Access Control for Push Updates</name>
          <artwork align="left"><![CDATA[
                     +-----------------+      +--------------------+
  push-update or --> | datastore node  |  yes | add datastore node |
 push-change-update  | access allowed? | ---> | to update record   |
                     +-----------------+      +--------------------+
]]></artwork>
        </figure>
        <t>A publisher <bcp14>MUST</bcp14> allow for the possibility that a subscription's selection filter references nonexistent data or data that a receiver is not allowed to access.  Such support permits a receiver the ability to monitor the entire lifecycle of some datastore tree without needing to explicitly enumerate every individual datastore node.  If, after access control has been applied, there are no objects remaining in an update record, then the effect varies given if the subscription is a periodic or on-change subscription.  For a periodic subscription, an empty "push-update" notification <bcp14>MUST</bcp14> be sent, so that clients do not get confused into thinking that an update was lost.  For an on-change subscription, a "push-update" notification <bcp14>MUST NOT</bcp14> be sent, so that clients remain unaware of changes made to nodes they don't have read-access for.</t>
        <t>A publisher <bcp14>MAY</bcp14> choose to reject an "establish-subscription" request that selects nonexistent data or data that a receiver is not allowed to access.  The error identity "unchanging-selection" <bcp14>SHOULD</bcp14> be returned as the reason for the rejection.  In addition, a publisher <bcp14>MAY</bcp14> choose to terminate a dynamic subscription or suspend a configured receiver when the authorization privileges of a receiver change or the access controls for subscribed objects change.  In that case, the publisher <bcp14>SHOULD</bcp14> include the error identity "unchanging-selection" as the reason when sending the "subscription-terminated" or "subscription-suspended" notification, respectively.  Such a capability enables the publisher to avoid having to support
continuous and total filtering of a subscription's content for every update record.  It also reduces the possibility of leakage of access-controlled objects.</t>
        <t>If read access into previously accessible nodes has been lost due to a receiver permissions change, this <bcp14>SHOULD</bcp14> be reported as a patch "delete" operation for on-change subscriptions.  If not capable of handling such receiver permission changes with such a "delete", publisher implementations <bcp14>MUST</bcp14> force dynamic subscription re-establishment or configured subscription reinitialization so that appropriate filtering is installed.</t>
      </section>
      <section anchor="yang-module-security-considerations">
        <name>YANG Module Security Considerations</name>
        <t>This section is modeled after the template described in Section 3.7.1 of <xref target="I-D.draft-ietf-netmod-rfc8407bis"/>.</t>
        <t>The "ietf-yang-push-2" YANG module defines a data model that is designed to be accessed via YANG-based management protocols, such as NETCONF <xref target="RFC6241"/> and RESTCONF <xref target="RFC8040"/>. These protocols have to use a secure transport layer (e.g., SSH <xref target="RFC4252"/>, TLS <xref target="RFC8446"/>, and QUIC <xref target="RFC9000"/>) and have to use mutual authentication.</t>
        <t>The Network Configuration Access Control Model (NACM) <xref target="RFC8341"/> provides the means to restrict access for particular NETCONF or RESTCONF users to a pre-configured subset of all available NETCONF or RESTCONF protocol operations and content.</t>
        <t>There are a number of data nodes defined in this YANG module that are writable/creatable/deletable (i.e., "config true", which is the default).  All writable data nodes are likely to be reasonably sensitive or vulnerable in some network environments.  Write operations (e.g., edit-config) and delete operations to these data nodes without proper protection or authentication can have a negative effect on network operations.  The following subtrees and data nodes have particular sensitivities/vulnerabilities:</t>
        <ul spacing="normal">
          <li>
            <t>There are no particularly sensitive writable data nodes.</t>
          </li>
        </ul>
        <t>Some of the readable data nodes in this YANG module may be considered sensitive or vulnerable in some network environments.  It is thus important to control read access (e.g., via get, get-config, or notification) to these data nodes. Specifically, the following subtrees and data nodes have particular sensitivities/vulnerabilities:</t>
        <ul spacing="normal">
          <li>
            <t>There are no particularly sensitive readable data nodes.</t>
          </li>
        </ul>
        <t>Some of the RPC or action operations in this YANG module may be considered sensitive or vulnerable in some network environments. It is thus important to control access to these operations. Specifically, the following operations have particular sensitivities/vulnerabilities:</t>
        <ul spacing="normal">
          <li>
            <t>kill-subscription - this RPC operation allows the caller to kill any dynamic subscription, even those created via other users, or other transport sessions.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="namespace-uri-registrations">
        <name>Namespace URI registrations</name>
        <t>This document registers the following namespace URI in the "IETF XML Registry" <xref target="RFC3688"/>:</t>
        <table>
          <name>Namespace URI registrations</name>
          <thead>
            <tr>
              <th align="left">URI</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2</td>
            </tr>
            <tr>
              <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2-config</td>
            </tr>
            <tr>
              <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2-capabilities</td>
            </tr>
          </tbody>
        </table>
        <t>For all registrations:</t>
        <ul spacing="normal">
          <li>
            <t>Registrant Contact: The IESG.</t>
          </li>
          <li>
            <t>XML: N/A; the requested URI is an XML namespace.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="yang-module-name-registrations">
      <name>YANG Module Name registrations</name>
      <t>This document registers the following YANG modules in the "YANG Module Names" registry <xref target="RFC6020"/>:</t>
      <table>
        <name>YANG Module Name Registrations</name>
        <thead>
          <tr>
            <th align="left">Name</th>
            <th align="left">Namespace</th>
            <th align="left">Prefix</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">ietf-yang-push-2</td>
            <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2</td>
            <td align="left">ypl</td>
          </tr>
          <tr>
            <td align="left">ietf-yang-push-2-config</td>
            <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2-config</td>
            <td align="left">yplco</td>
          </tr>
          <tr>
            <td align="left">ietf-yang-push-2-capabilities</td>
            <td align="left">urn:ietf:params:xml:ns:yang:ietf-yang-push-2-capabilities</td>
            <td align="left">yplca</td>
          </tr>
        </tbody>
      </table>
      <t>For all registration the reference is "RFC XXXX".</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This initial draft is early work is based on discussions with various folk, particularly Thomas Graf, Holger Keller, Dan Voyer, Nils Warnke, and Alex Huang Feng; but also wider conversations that include: Benoit Claise, Pierre Francois, Paolo Lucente, Jean Quilbeuf, among others.</t>
      <t>In addition, as described in the introduction, the authors would like to acknowledge that this work builds on work of others, such as, Subscribed Notifications, YANG Push, and various extensions to that work.</t>
    </section>
    <section numbered="false" anchor="contributors">
      <name>Contributors</name>
      <t>The following individuals have actively contributed to this draft and the YANG Push Solution.</t>
      <ul spacing="normal">
        <li>
          <t>Dan Voyer</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.draft-ietf-netconf-notif-envelope">
          <front>
            <title>Extensible YANG Model for YANG-Push Notifications</title>
            <author fullname="Alex Huang Feng" initials="A. H." surname="Feng">
              <organization>INSA-Lyon</organization>
            </author>
            <author fullname="Pierre Francois" initials="P." surname="Francois">
              <organization>INSA-Lyon</organization>
            </author>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Benoît Claise" initials="B." surname="Claise">
              <organization>Everything OPS</organization>
            </author>
            <date day="6" month="February" year="2026"/>
            <abstract>
              <t>   This document defines a new extensible Notification structure,
   defined in YANG, for use in YANG-Push Notification messages, both for
   NETCONF and RESTCONF, enabling any YANG-compatible encodings such as
   XML, JSON, or CBOR.  Additionally, it defines two essential
   extensions to this structure, the support of a hostname and a
   sequence number and the support of a timestamp characterizing the
   moment when the data was observed.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-notif-envelope-04"/>
        </reference>
        <reference anchor="RFC2474">
          <front>
            <title>Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers</title>
            <author fullname="K. Nichols" initials="K." surname="Nichols"/>
            <author fullname="S. Blake" initials="S." surname="Blake"/>
            <author fullname="F. Baker" initials="F." surname="Baker"/>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="December" year="1998"/>
            <abstract>
              <t>This document defines the IP header field, called the DS (for differentiated services) field. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2474"/>
          <seriesInfo name="DOI" value="10.17487/RFC2474"/>
        </reference>
        <reference anchor="RFC6241">
          <front>
            <title>Network Configuration Protocol (NETCONF)</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns"/>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <author fullname="A. Bierman" initials="A." role="editor" surname="Bierman"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices. It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages. The NETCONF protocol operations are realized as remote procedure calls (RPCs). This document obsoletes RFC 4741. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6241"/>
          <seriesInfo name="DOI" value="10.17487/RFC6241"/>
        </reference>
        <reference anchor="RFC6991">
          <front>
            <title>Common YANG Data Types</title>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document introduces a collection of common data types to be used with the YANG data modeling language. This document obsoletes RFC 6021.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6991"/>
          <seriesInfo name="DOI" value="10.17487/RFC6991"/>
        </reference>
        <reference anchor="RFC7950">
          <front>
            <title>The YANG 1.1 Data Modeling Language</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols. This document describes the syntax and semantics of version 1.1 of the YANG language. YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification. There are a small number of backward incompatibilities from YANG version 1. This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7950"/>
          <seriesInfo name="DOI" value="10.17487/RFC7950"/>
        </reference>
        <reference anchor="RFC7951">
          <front>
            <title>JSON Encoding of Data Modeled with YANG</title>
            <author fullname="L. Lhotka" initials="L." surname="Lhotka"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document defines encoding rules for representing configuration data, state data, parameters of Remote Procedure Call (RPC) operations or actions, and notifications defined using YANG as JavaScript Object Notation (JSON) text.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7951"/>
          <seriesInfo name="DOI" value="10.17487/RFC7951"/>
        </reference>
        <reference anchor="RFC8340">
          <front>
            <title>YANG Tree Diagrams</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="L. Berger" initials="L." role="editor" surname="Berger"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>This document captures the current syntax used in YANG module tree diagrams. The purpose of this document is to provide a single location for this definition. This syntax may be updated from time to time based on the evolution of the YANG language.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="215"/>
          <seriesInfo name="RFC" value="8340"/>
          <seriesInfo name="DOI" value="10.17487/RFC8340"/>
        </reference>
        <reference anchor="RFC8341">
          <front>
            <title>Network Configuration Access Control Model</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>The standardization of network configuration interfaces for use with the Network Configuration Protocol (NETCONF) or the RESTCONF protocol requires a structured and secure operating environment that promotes human usability and multi-vendor interoperability. There is a need for standard mechanisms to restrict NETCONF or RESTCONF protocol access for particular users to a preconfigured subset of all available NETCONF or RESTCONF protocol operations and content. This document defines such an access control model.</t>
              <t>This document obsoletes RFC 6536.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="91"/>
          <seriesInfo name="RFC" value="8341"/>
          <seriesInfo name="DOI" value="10.17487/RFC8341"/>
        </reference>
        <reference anchor="RFC8342">
          <front>
            <title>Network Management Datastore Architecture (NMDA)</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." surname="Schoenwaelder"/>
            <author fullname="P. Shafer" initials="P." surname="Shafer"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="R. Wilton" initials="R." surname="Wilton"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>Datastores are a fundamental concept binding the data models written in the YANG data modeling language to network management protocols such as the Network Configuration Protocol (NETCONF) and RESTCONF. This document defines an architectural framework for datastores based on the experience gained with the initial simpler model, addressing requirements that were not well supported in the initial model. This document updates RFC 7950.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8342"/>
          <seriesInfo name="DOI" value="10.17487/RFC8342"/>
        </reference>
        <reference anchor="RFC8525">
          <front>
            <title>YANG Library</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." surname="Schoenwaelder"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="R. Wilton" initials="R." surname="Wilton"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>This document describes a YANG library that provides information about the YANG modules, datastores, and datastore schemas used by a network management server. Simple caching mechanisms are provided to allow clients to minimize retrieval of this information. This version of the YANG library supports the Network Management Datastore Architecture (NMDA) by listing all datastores supported by a network management server and the schema that is used by each of these datastores.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8525"/>
          <seriesInfo name="DOI" value="10.17487/RFC8525"/>
        </reference>
        <reference anchor="RFC8529">
          <front>
            <title>YANG Data Model for Network Instances</title>
            <author fullname="L. Berger" initials="L." surname="Berger"/>
            <author fullname="C. Hopps" initials="C." surname="Hopps"/>
            <author fullname="A. Lindem" initials="A." surname="Lindem"/>
            <author fullname="D. Bogdanovic" initials="D." surname="Bogdanovic"/>
            <author fullname="X. Liu" initials="X." surname="Liu"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>This document defines a network instance module. This module can be used to manage the virtual resource partitioning that may be present on a network device. Examples of common industry terms for virtual resource partitioning are VPN Routing and Forwarding (VRF) instances and Virtual Switch Instances (VSIs).</t>
              <t>The YANG data model in this document conforms to the Network Management Datastore Architecture (NMDA) defined in RFC 8342.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8529"/>
          <seriesInfo name="DOI" value="10.17487/RFC8529"/>
        </reference>
        <reference anchor="RFC8791">
          <front>
            <title>YANG Data Structure Extensions</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Björklund" initials="M." surname="Björklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>This document describes YANG mechanisms for defining abstract data structures with YANG.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8791"/>
          <seriesInfo name="DOI" value="10.17487/RFC8791"/>
        </reference>
        <reference anchor="RFC9196">
          <front>
            <title>YANG Modules Describing Capabilities for Systems and Datastore Update Notifications</title>
            <author fullname="B. Lengyel" initials="B." surname="Lengyel"/>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="B. Claise" initials="B." surname="Claise"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document defines two YANG modules, "ietf-system-capabilities" and "ietf-notification-capabilities".</t>
              <t>The module "ietf-system-capabilities" provides a placeholder structure that can be used to discover YANG-related system capabilities for servers. The module can be used to report capability information from the server at runtime or at implementation time by making use of the YANG instance data file format.</t>
              <t>The module "ietf-notification-capabilities" augments "ietf-system-capabilities" to specify capabilities related to "Subscription to YANG Notifications for Datastore Updates" (RFC 8641).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9196"/>
          <seriesInfo name="DOI" value="10.17487/RFC9196"/>
        </reference>
        <reference anchor="RFC9254">
          <front>
            <title>Encoding of Data Modeled with YANG in the Concise Binary Object Representation (CBOR)</title>
            <author fullname="M. Veillette" initials="M." role="editor" surname="Veillette"/>
            <author fullname="I. Petrov" initials="I." role="editor" surname="Petrov"/>
            <author fullname="A. Pelov" initials="A." surname="Pelov"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <date month="July" year="2022"/>
            <abstract>
              <t>YANG (RFC 7950) is a data modeling language used to model configuration data, state data, parameters and results of Remote Procedure Call (RPC) operations or actions, and notifications.</t>
              <t>This document defines encoding rules for YANG in the Concise Binary Object Representation (CBOR) (RFC 8949).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9254"/>
          <seriesInfo name="DOI" value="10.17487/RFC9254"/>
        </reference>
        <reference anchor="RFC9595">
          <front>
            <title>YANG Schema Item iDentifier (YANG SID)</title>
            <author fullname="M. Veillette" initials="M." role="editor" surname="Veillette"/>
            <author fullname="A. Pelov" initials="A." role="editor" surname="Pelov"/>
            <author fullname="I. Petrov" initials="I." role="editor" surname="Petrov"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <date month="July" year="2024"/>
            <abstract>
              <t>YANG Schema Item iDentifiers (YANG SIDs) are globally unique 63-bit unsigned integers used to identify YANG items. SIDs provide a more compact method for identifying those YANG items that can be used efficiently, notably in constrained environments (RFC 7228). This document defines the semantics, registration processes, and assignment processes for YANG SIDs for IETF-managed YANG modules. To enable the implementation of these processes, this document also defines a file format used to persist and publish assigned YANG SIDs.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9595"/>
          <seriesInfo name="DOI" value="10.17487/RFC9595"/>
        </reference>
        <reference anchor="RFC9485">
          <front>
            <title>I-Regexp: An Interoperable Regular Expression Format</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="T. Bray" initials="T." surname="Bray"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document specifies I-Regexp, a flavor of regular expression that is limited in scope with the goal of interoperation across many different regular expression libraries.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9485"/>
          <seriesInfo name="DOI" value="10.17487/RFC9485"/>
        </reference>
        <reference anchor="RFC9911">
          <front>
            <title>Common YANG Data Types</title>
            <author fullname="J. Schönwälder" initials="J." role="editor" surname="Schönwälder"/>
            <date month="December" year="2025"/>
            <abstract>
              <t>This document defines a collection of common data types to be used with the YANG data modeling language. It includes several new type definitions and obsoletes RFC 6991.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9911"/>
          <seriesInfo name="DOI" value="10.17487/RFC9911"/>
        </reference>
        <reference anchor="BCP14">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC3411">
          <front>
            <title>An Architecture for Describing Simple Network Management Protocol (SNMP) Management Frameworks</title>
            <author fullname="D. Harrington" initials="D." surname="Harrington"/>
            <author fullname="R. Presuhn" initials="R." surname="Presuhn"/>
            <author fullname="B. Wijnen" initials="B." surname="Wijnen"/>
            <date month="December" year="2002"/>
            <abstract>
              <t>This document describes an architecture for describing Simple Network Management Protocol (SNMP) Management Frameworks. The architecture is designed to be modular to allow the evolution of the SNMP protocol standards over time. The major portions of the architecture are an SNMP engine containing a Message Processing Subsystem, a Security Subsystem and an Access Control Subsystem, and possibly multiple SNMP applications which provide specific functional processing of management data. This document obsoletes RFC 2571. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="62"/>
          <seriesInfo name="RFC" value="3411"/>
          <seriesInfo name="DOI" value="10.17487/RFC3411"/>
        </reference>
        <reference anchor="RFC3688">
          <front>
            <title>The IETF XML Registry</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <date month="January" year="2004"/>
            <abstract>
              <t>This document describes an IANA maintained registry for IETF standards which use Extensible Markup Language (XML) related items such as Namespaces, Document Type Declarations (DTDs), Schemas, and Resource Description Framework (RDF) Schemas.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="81"/>
          <seriesInfo name="RFC" value="3688"/>
          <seriesInfo name="DOI" value="10.17487/RFC3688"/>
        </reference>
        <reference anchor="RFC4252">
          <front>
            <title>The Secure Shell (SSH) Authentication Protocol</title>
            <author fullname="T. Ylonen" initials="T." surname="Ylonen"/>
            <author fullname="C. Lonvick" initials="C." role="editor" surname="Lonvick"/>
            <date month="January" year="2006"/>
            <abstract>
              <t>The Secure Shell Protocol (SSH) is a protocol for secure remote login and other secure network services over an insecure network. This document describes the SSH authentication protocol framework and public key, password, and host-based client authentication methods. Additional authentication methods are described in separate documents. The SSH authentication protocol runs on top of the SSH transport layer protocol and provides a single authenticated tunnel for the SSH connection protocol. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4252"/>
          <seriesInfo name="DOI" value="10.17487/RFC4252"/>
        </reference>
        <reference anchor="RFC5277">
          <front>
            <title>NETCONF Event Notifications</title>
            <author fullname="S. Chisholm" initials="S." surname="Chisholm"/>
            <author fullname="H. Trevino" initials="H." surname="Trevino"/>
            <date month="July" year="2008"/>
            <abstract>
              <t>This document defines mechanisms that provide an asynchronous message notification delivery service for the Network Configuration protocol (NETCONF). This is an optional capability built on top of the base NETCONF definition. This document defines the capabilities and operations necessary to support this service. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5277"/>
          <seriesInfo name="DOI" value="10.17487/RFC5277"/>
        </reference>
        <reference anchor="RFC6020">
          <front>
            <title>YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="October" year="2010"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration and state data manipulated by the Network Configuration Protocol (NETCONF), NETCONF remote procedure calls, and NETCONF notifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6020"/>
          <seriesInfo name="DOI" value="10.17487/RFC6020"/>
        </reference>
        <reference anchor="RFC7049">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="October" year="2013"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7049"/>
          <seriesInfo name="DOI" value="10.17487/RFC7049"/>
        </reference>
        <reference anchor="RFC7540">
          <front>
            <title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
            <author fullname="M. Belshe" initials="M." surname="Belshe"/>
            <author fullname="R. Peon" initials="R." surname="Peon"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection. It also introduces unsolicited push of representations from servers to clients.</t>
              <t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax. HTTP's existing semantics remain unchanged.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7540"/>
          <seriesInfo name="DOI" value="10.17487/RFC7540"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC8343">
          <front>
            <title>A YANG Data Model for Interface Management</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>This document defines a YANG data model for the management of network interfaces. It is expected that interface-type-specific data models augment the generic interfaces data model defined in this document. The data model includes definitions for configuration and system state (status information and counters for the collection of statistics).</t>
              <t>The YANG data model in this document conforms to the Network Management Datastore Architecture (NMDA) defined in RFC 8342.</t>
              <t>This document obsoletes RFC 7223.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8343"/>
          <seriesInfo name="DOI" value="10.17487/RFC8343"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8040">
          <front>
            <title>RESTCONF Protocol</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes an HTTP-based protocol that provides a programmatic interface for accessing data defined in YANG, using the datastore concepts defined in the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8040"/>
          <seriesInfo name="DOI" value="10.17487/RFC8040"/>
        </reference>
        <reference anchor="RFC8072">
          <front>
            <title>YANG Patch Media Type</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="February" year="2017"/>
            <abstract>
              <t>This document describes a method for applying patches to configuration datastores using data defined with the YANG data modeling language.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8072"/>
          <seriesInfo name="DOI" value="10.17487/RFC8072"/>
        </reference>
        <reference anchor="RFC8639">
          <front>
            <title>Subscription to YANG Notifications</title>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="A. Gonzalez Prieto" initials="A." surname="Gonzalez Prieto"/>
            <author fullname="E. Nilsen-Nygaard" initials="E." surname="Nilsen-Nygaard"/>
            <author fullname="A. Tripathy" initials="A." surname="Tripathy"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document defines a YANG data model and associated mechanisms enabling subscriber-specific subscriptions to a publisher's event streams. Applying these elements allows a subscriber to request and receive a continuous, customized feed of publisher-generated information.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8639"/>
          <seriesInfo name="DOI" value="10.17487/RFC8639"/>
        </reference>
        <reference anchor="RFC8640">
          <front>
            <title>Dynamic Subscription to YANG Events and Datastores over NETCONF</title>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="A. Gonzalez Prieto" initials="A." surname="Gonzalez Prieto"/>
            <author fullname="E. Nilsen-Nygaard" initials="E." surname="Nilsen-Nygaard"/>
            <author fullname="A. Tripathy" initials="A." surname="Tripathy"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document provides a Network Configuration Protocol (NETCONF) binding to the dynamic subscription capability of both subscribed notifications and YANG-Push.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8640"/>
          <seriesInfo name="DOI" value="10.17487/RFC8640"/>
        </reference>
        <reference anchor="RFC8641">
          <front>
            <title>Subscription to YANG Notifications for Datastore Updates</title>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document describes a mechanism that allows subscriber applications to request a continuous and customized stream of updates from a YANG datastore. Providing such visibility into updates enables new capabilities based on the remote mirroring and monitoring of configuration and operational state.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8641"/>
          <seriesInfo name="DOI" value="10.17487/RFC8641"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="I-D.draft-ietf-netmod-rfc8407bis">
          <front>
            <title>Guidelines for Authors and Reviewers of Documents Containing YANG Data Models</title>
            <author fullname="Andy Bierman" initials="A." surname="Bierman">
              <organization>YumaWorks</organization>
            </author>
            <author fullname="Mohamed Boucadair" initials="M." surname="Boucadair">
              <organization>Orange</organization>
            </author>
            <author fullname="Qin Wu" initials="Q." surname="Wu">
              <organization>Huawei</organization>
            </author>
            <date day="5" month="June" year="2025"/>
            <abstract>
              <t>   This document provides guidelines for authors and reviewers of
   specifications containing YANG data models, including IANA-maintained
   modules.  Recommendations and procedures are defined, which are
   intended to increase interoperability and usability of Network
   Configuration Protocol (NETCONF) and RESTCONF Protocol
   implementations that utilize YANG modules.  This document obsoletes
   RFC 8407.

   Also, this document updates RFC 8126 by providing additional
   guidelines for writing the IANA considerations for RFCs that specify
   IANA-maintained modules.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netmod-rfc8407bis-28"/>
        </reference>
        <reference anchor="I-D.ietf-nmop-network-anomaly-architecture">
          <front>
            <title>A Framework for a Network Anomaly Detection Architecture</title>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Wanting Du" initials="W." surname="Du">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Pierre Francois" initials="P." surname="Francois">
              <organization>INSA-Lyon</organization>
            </author>
            <author fullname="Alex Huang Feng" initials="A. H." surname="Feng">
              <organization>INSA-Lyon</organization>
            </author>
            <date day="18" month="January" year="2026"/>
            <abstract>
              <t>   This document describes the motivation and architecture of a Network
   Anomaly Detection Framework and the relationship to other documents
   describing network Symptom semantics and network incident lifecycle.

   The described architecture for detecting IP network service
   interruption is designed to be generic applicable and extensible.
   Different applications are described and examples are referenced with
   open-source running code.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-nmop-network-anomaly-architecture-07"/>
        </reference>
        <reference anchor="I-D.ietf-nmop-yang-message-broker-integration">
          <front>
            <title>An Architecture for YANG-Push to Message Broker Integration</title>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Ahmed Elhassany" initials="A." surname="Elhassany">
              <organization>Swisscom</organization>
            </author>
            <date day="28" month="February" year="2026"/>
            <abstract>
              <t>   This document describes the motivation and architecture of a native
   YANG-Push notifications and YANG Schema integration into a Message
   Broker and YANG Schema Registry.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-nmop-yang-message-broker-integration-11"/>
        </reference>
        <reference anchor="I-D.draft-ietf-netconf-udp-notif">
          <front>
            <title>UDP-based Transport for Configured Subscriptions</title>
            <author fullname="Alex Huang Feng" initials="A. H." surname="Feng">
              <organization>INSA-Lyon</organization>
            </author>
            <author fullname="Pierre Francois" initials="P." surname="Francois">
              <organization>INSA-Lyon</organization>
            </author>
            <author fullname="Tianran Zhou" initials="T." surname="Zhou">
              <organization>Huawei</organization>
            </author>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Paolo Lucente" initials="P." surname="Lucente">
              <organization>NTT</organization>
            </author>
            <date day="28" month="January" year="2026"/>
            <abstract>
              <t>   This document describes a UDP-based transport for YANG notifications
   to collect data from network nodes within a controlled environment.
   A shim header is defined to facilitate the data streaming directly
   from a publishing process on a network device to telemetry receivers.
   Such a design enables higher frequency updates and less performance
   overhead on publisher and receiver processes compared to already
   established notification mechanisms.  A YANG data model is also
   defined for management of the described UDP-based transport.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-udp-notif-25"/>
        </reference>
        <reference anchor="I-D.draft-netana-netconf-yp-transport-capabilities">
          <front>
            <title>YANG Notification Transport Capabilities</title>
            <author fullname="Qin Wu" initials="Q." surname="Wu">
              <organization>Huawei</organization>
            </author>
            <author fullname="Qiufang Ma" initials="Q." surname="Ma">
              <organization>Huawei</organization>
            </author>
            <author fullname="Alex Huang Feng" initials="A. H." surname="Feng">
              <organization>INSA-Lyon</organization>
            </author>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <date day="17" month="January" year="2025"/>
            <abstract>
              <t>   This document specifies a YANG module for YANG notifications
   transport capabilities which augments "ietf-system-capabilities" YANG
   module defined in [RFC9196].  The module provides transport,
   encoding, and encryption system capabilities for transport-specific
   notification.  This YANG module can be used by the client to learn
   capability information from the server at runtime or at
   implementation time, by making use of the YANG instance data file
   format.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-netana-netconf-yp-transport-capabilities-01"/>
        </reference>
        <reference anchor="I-D.draft-ietf-netconf-https-notif">
          <front>
            <title>An HTTPS-based Transport for YANG Notifications</title>
            <author fullname="Mahesh Jethanandani" initials="M." surname="Jethanandani">
              <organization>Kloud Services</organization>
            </author>
            <author fullname="Kent Watsen" initials="K." surname="Watsen">
              <organization>Watsen Networks</organization>
            </author>
            <date day="1" month="February" year="2024"/>
            <abstract>
              <t>   This document defines a protocol for sending asynchronous event
   notifications similar to notifications defined in RFC 5277, but over
   HTTPS.  YANG modules for configuring publishers are also defined.
   Examples are provided illustrating how to configure various
   publishers.

   This document requires that the publisher is a "server" (e.g., a
   NETCONF or RESTCONF server), but does not assume that the receiver is
   a server.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-https-notif-15"/>
        </reference>
        <reference anchor="I-D.draft-ietf-netconf-distributed-notif">
          <front>
            <title>Subscription to Notifications in a Distributed Architecture</title>
            <author fullname="Tianran Zhou" initials="T." surname="Zhou">
              <organization>Huawei</organization>
            </author>
            <author fullname="Guangying Zheng" initials="G." surname="Zheng">
              <organization>Huawei</organization>
            </author>
            <author fullname="Eric Voit" initials="E." surname="Voit">
              <organization>Cisco Systems</organization>
            </author>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Pierre Francois" initials="P." surname="Francois">
              <organization>INSA-Lyon</organization>
            </author>
            <date day="28" month="February" year="2026"/>
            <abstract>
              <t>   This document describes extensions to the YANG notifications
   subscription to allow metrics being published directly from
   processors on line cards to target receivers, while subscription is
   still maintained at the route processor in a distributed forwarding
   system of a network node.


              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-distributed-notif-18"/>
        </reference>
        <reference anchor="Kafka" target="https://kafka.apache.org/">
          <front>
            <title>Apache Kafka</title>
            <author initials="" surname="Apache.org" fullname="Apache.org">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="Consistency" target="https://en.wikipedia.org/wiki/Consistency_(database_systems)">
          <front>
            <title>Consistency (database systems)</title>
            <author initials="" surname="Wikipedia" fullname="Wikipedia">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="EventualConsistency" target="https://www.techopedia.com/definition/29165/eventual-consistency">
          <front>
            <title>Eventual Consistency</title>
            <author initials="M." surname="Rouse" fullname="Margaret Rouse">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="XPATH" target="https://www.w3.org/TR/1999/REC-xpath-19991116/">
          <front>
            <title>XML Path Language (XPath) Version 1.0</title>
            <author initials="" surname="W3C" fullname="W3C">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="gNMI" target="https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md">
          <front>
            <title>gRPC Network Management Interface (gNMI)</title>
            <author initials="" surname="OpenConfig" fullname="OpenConfig">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="I-D.ietf-netconf-distributed-notif">
          <front>
            <title>Subscription to Notifications in a Distributed Architecture</title>
            <author fullname="Tianran Zhou" initials="T." surname="Zhou">
              <organization>Huawei</organization>
            </author>
            <author fullname="Guangying Zheng" initials="G." surname="Zheng">
              <organization>Huawei</organization>
            </author>
            <author fullname="Eric Voit" initials="E." surname="Voit">
              <organization>Cisco Systems</organization>
            </author>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Pierre Francois" initials="P." surname="Francois">
              <organization>INSA-Lyon</organization>
            </author>
            <date day="28" month="February" year="2026"/>
            <abstract>
              <t>   This document describes extensions to the YANG notifications
   subscription to allow metrics being published directly from
   processors on line cards to target receivers, while subscription is
   still maintained at the route processor in a distributed forwarding
   system of a network node.


              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-distributed-notif-18"/>
        </reference>
        <reference anchor="I-D.tgraf-netconf-notif-sequencing">
          <front>
            <title>Support of Hostname and Sequencing in YANG Notifications</title>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Jean Quilbeuf" initials="J." surname="Quilbeuf">
              <organization>Huawei</organization>
            </author>
            <author fullname="Alex Huang Feng" initials="A. H." surname="Feng">
              <organization>INSA-Lyon</organization>
            </author>
            <date day="29" month="June" year="2024"/>
            <abstract>
              <t>   This document specifies a new YANG module that augments the NETCONF
   Event Notification header to support the hostname and sequence number
   to identify from which network node and at which time the message was
   published.  This allows the collector to recognize loss, delay and
   reordering between the publisher and the downstream system storing
   the messages.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-tgraf-netconf-notif-sequencing-06"/>
        </reference>
        <reference anchor="I-D.tgraf-netconf-yang-push-observation-time">
          <front>
            <title>Support of Observation Timestamp in YANG-Push Notifications</title>
            <author fullname="Thomas Graf" initials="T." surname="Graf">
              <organization>Swisscom</organization>
            </author>
            <author fullname="Benoît Claise" initials="B." surname="Claise">
              <organization>Huawei</organization>
            </author>
            <author fullname="Alex Huang Feng" initials="A. H." surname="Feng">
              <organization>INSA-Lyon</organization>
            </author>
            <date day="14" month="December" year="2024"/>
            <abstract>
              <t>   This document extends YANG-Push Notifications with the YANG objects
   observation timestamp and point-in-time for streaming update YANG-
   Push notifications.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-tgraf-netconf-yang-push-observation-time-03"/>
        </reference>
      </references>
    </references>
    <?line 4077?>

<section anchor="DifferencesFromYangPush">
      <name>Functional changes between YANG Push v2 and YANG Push</name>
      <t>This non-normative section highlights the significant functional changes where the YANG Push v2 implementation differs from YANG Push.  However, the main body of this document, from <xref target="overview"/> onwards, provides the normative definition of the YANG Push v2 specification, except for any text or sections that explicitly indicate that they are informative rather being normative.</t>
      <t><em>Note to reviewers: If you notice mistakes in this section during development of the document and solution then please point them out to the authors and the working group.</em> <strong>(RFC editor, please remove this paragraph prior to publication)</strong></t>
      <section anchor="removed-functionality">
        <name>Removed Functionality</name>
        <t>This section lists functionality specified in <xref target="RFC8639"/> and YANG Push which is not specified in YANG Push v2.</t>
        <ul spacing="normal">
          <li>
            <t>Negotiation and hints of failed subscriptions.</t>
          </li>
          <li>
            <t>The RPC to modify an existing dynamic subscription, instead the subscription must be terminated and re-established.</t>
          </li>
          <li>
            <t>The ability to suspend and resume a dynamic subscription.  Instead a dynamic subscription is terminated if the device cannot reliably fulfill the subscription or a receiver is too slow causing the subscription to be back pressured.</t>
          </li>
          <li>
            <t>Specifying a subscription stop time, and the corresponding subscription-completed notification have been removed.</t>
          </li>
          <li>
            <t>Replaying of buffered event records are not supported, for both configured and dynamic subscriptions.  The nearest equivalent is requesting a sync-on-start replay when the subscription transport session comes up which will reply the current state.</t>
          </li>
          <li>
            <t>QoS weighting and dependency between subscriptions has been removed due to the complexity of implementation.</t>
          </li>
          <li>
            <t>Support for reporting subscription error hints has been removed.  The device <bcp14>SHOULD</bcp14> reject subscriptions that are likely to overload the device, but more onus is placed on the operator configuring the subscriptions or setting up the dynamic subscriptions to ensure that subscriptions are reasonable, as they would be expected to do for any other configuration.</t>
          </li>
          <li>
            <t>The "subscription-state-notif" extension has been removed.</t>
          </li>
          <li>
            <t>The YANG Patch format <xref target="RFC8072"/> is no longer used for on-change subscriptions.</t>
          </li>
          <li>
            <t>Support for multiple receivers for a configured subscription.</t>
          </li>
        </ul>
      </section>
      <section anchor="changed-functionality">
        <name>Changed Functionality</name>
        <t>This section documents behavior that exists in both YANG Push and YANG Push v2, but the behavior differs between the two:</t>
        <ul spacing="normal">
          <li>
            <t>All YANG Push v2 notifications messages use <xref target="I-D.draft-ietf-netconf-notif-envelope"/> rather than <xref target="RFC5277"/> used by YANG Push <xref target="RFC8641"/>.</t>
          </li>
          <li>
            <t>There is a lot more alignment in data model, behavior, and state machined in YANG Push v2, aiming to minimize differences.</t>
          </li>
          <li>
            <t>Changes to handling receivers:  </t>
            <ul spacing="normal">
              <li>
                <t>Receivers are always configured separately from the subscription and are referenced.</t>
              </li>
              <li>
                <t>Transport and Encoding parameters are configured as part of a receiver definition, and are used by all subscriptions directed towards a given receiver.</t>
              </li>
              <li>
                <t>Encoding is now a mandatory parameter under a receiver and dynamic subscription (rather than specifying a default).</t>
              </li>
              <li>
                <t>Invoking the <em>reset</em> RPC operation on a receiver requires and forces a reset of any transport sessions associated with that receiver.  Previously, the sessions would not be reset if they were used by other subscriptions.</t>
              </li>
              <li>
                <t>YANG Push v2 only supports a single receiver per subscription.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Periodic and on-change message uses a common <em>update</em> notification message format, allowing for the messages to be processed by clients in a similar fashion and to support combined periodic and on-change subscriptions.</t>
          </li>
          <li>
            <t>Changes related to the configuration model:  </t>
            <ul spacing="normal">
              <li>
                <t>Subscriptions are identified by a string identifier rather than a numeric identifier.  The prefix 'dyn-' is reserved for publisher allocated dyanmic subscription ids.  Clients may provide the id to be used for dynamic subscriptions.  There is changed handling for conflicting subscription-ids between configured and dynamic.</t>
              </li>
              <li>
                <t>Purpose has been renamed to Description (since it is a more generic term), limited to 1k characters, but also available for dynamic subscriptions.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>On-change dampening:  </t>
            <ul spacing="normal">
              <li>
                <t>Client configurable on-change dampening has been removed.</t>
              </li>
              <li>
                <t>However, YANG Push v2 allows a publisher to limit the rate at which a data node is sampled for on-change notifications.  See <xref target="OnChangeConsiderations"/> for further details.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Dynamic subscriptions are no longer mandatory to implement, either or both of Configured and Dynamic Subscriptions may be implemented in YANG Push v2.</t>
          </li>
          <li>
            <t>The solution focuses solely on datastore subscriptions that each have their own event stream.  Filters cannot be applied to the event stream, only to the set of datastore data nodes that are monitored by the subscription.</t>
          </li>
          <li>
            <t>The lifecycle events of when a subscription-started or subscription-terminated may be sent differs from <xref target="RFC8639"/>/<xref target="RFC8641"/>:  </t>
            <ul spacing="normal">
              <li>
                <t>Subscription-started notifications are also sent for dynamic subscriptions.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Some of the requirements on transport have been relaxed.</t>
          </li>
          <li>
            <t>The encoding identities have been extended with CBOR encodings, and the "encoding-" prefix has been removed (so that there is a better on the wire representation).</t>
          </li>
          <li>
            <t>YANG Push v2 allows for a publisher to provide an eventually consistent distributed view of the operational datastore, rather than a fully consistent datastore where on-change updates are sent as logic diffs to that datastore.</t>
          </li>
        </ul>
      </section>
      <section anchor="added-functionality">
        <name>Added Functionality</name>
        <ul spacing="normal">
          <li>
            <t>Device capabilities are reported via XXX and additional models that augment that data model.</t>
          </li>
          <li>
            <t>A new <em>update</em> message:  </t>
            <ul spacing="normal">
              <li>
                <t>Covers both on-change and periodic events.</t>
              </li>
              <li>
                <t>Allows multiple updates to be sent in a single message (e.g., for on-change).</t>
              </li>
              <li>
                <t>Allows for a common path prefix to be specified, with any paths and encoded YANG data to be encoded relative to the common path prefix.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>An <em>update-complete</em> notification has been defined to inform collectors when a subscription's periodic collection cycle is complete.</t>
          </li>
          <li>
            <t>Support for {I-D.ietf-netconf-distributed-notif}} has been added to the base YANG Push v2 specification, as described in <xref target="distributed-notifications"/>.</t>
          </li>
          <li>
            <t>TODO - More operational data on the subscription load and performance.</t>
          </li>
          <li>
            <t>All YANG Push v2 configuration is under a new <em>datastore-telemetry</em> presence container</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="subscription-errors-from-rfc-8641">
      <name>Subscription Errors (from RFC 8641)</name>
      <section anchor="rpc-failures-1">
        <name>RPC Failures</name>
        <t>Rejection of an RPC for any reason is indicated via an RPC error
response from the publisher.  Valid RPC errors returned include both
(1) existing transport-layer RPC error codes, such as those seen with
NETCONF in <xref target="RFC6241"/> and (2) subscription-specific errors, such as
those defined in the YANG data model.  As a result, how subscription
errors are encoded in an RPC error response is transport dependent.</t>
        <t>References to specific identities in the ietf-subscribed-
notifications YANG module <xref target="RFC8639"/> or the ietf-yang-push YANG module
may be returned as part of the error responses resulting from failed
attempts at datastore subscription.  For errors defined as part of
the ietf-subscribed-notifications YANG module, please refer to
<xref target="RFC8639"/>.  The errors defined in this document, grouped per RPC, are
as follows:</t>
        <artwork><![CDATA[
      establish-subscription          modify-subscription
      ---------------------------     ---------------------
       cant-exclude                    period-unsupported
       datastore-not-subscribable      update-too-big
       on-change-unsupported           sync-too-big
       on-change-sync-unsupported      unchanging-selection
       period-unsupported
       update-too-big                 resync-subscription
       sync-too-big                   ----------------------------
       unchanging-selection            no-such-subscription-resync
                                       sync-too-big
]]></artwork>
        <t>There is one final set of transport-independent RPC error elements
included in the YANG data model.  These are the four yang-data
structures for failed datastore subscriptions:</t>
        <ol spacing="normal" type="1"><li>
            <t>yang-data "establish-subscription-error-datastore": This <bcp14>MUST</bcp14> be
returned if information identifying the reason for an RPC error
has not been placed elsewhere in the transport portion of a
failed "establish-subscription" RPC response.  This <bcp14>MUST</bcp14> be sent
if hints are included.</t>
          </li>
          <li>
            <t>yang-data "modify-subscription-error-datastore": This <bcp14>MUST</bcp14> be
returned if information identifying the reason for an RPC error
has not been placed elsewhere in the transport portion of a
failed "modify-subscription" RPC response.  This <bcp14>MUST</bcp14> be sent if
hints are included.</t>
          </li>
          <li>
            <t>yang-data "sn:delete-subscription-error": This <bcp14>MUST</bcp14> be returned
if information identifying the reason for an RPC error has not
been placed elsewhere in the transport portion of a failed
"delete-subscription" or "kill-subscription" RPC response.</t>
          </li>
          <li>
            <t>yang-data "resync-subscription-error": This <bcp14>MUST</bcp14> be returned if
information identifying the reason for an RPC error has not been
placed elsewhere in the transport portion of a failed
"resync-subscription" RPC response.</t>
          </li>
        </ol>
      </section>
      <section anchor="failure-notifications">
        <name>Failure Notifications</name>
        <t>A subscription may be unexpectedly terminated or suspended
independently of any RPC or configuration operation.  In such cases,
indications of such a failure <bcp14>MUST</bcp14> be provided.  To accomplish this,
a number of errors can be returned as part of the corresponding
subscription state change notification.  For this purpose, the
following error identities are introduced in this document, in
addition to those that were already defined in <xref target="RFC8639"/>:</t>
        <artwork><![CDATA[
  subscription-terminated        subscription-suspended
  ---------------------------    ----------------------
  datastore-not-subscribable     period-unsupported
  unchanging-selection           update-too-big
                                  synchronization-size
]]></artwork>
      </section>
    </section>
    <section anchor="Examples">
      <name>Examples</name>
      <t>Notes on examples:</t>
      <ul spacing="normal">
        <li>
          <t>To allow for programmatic validation, most notification examples in this section exclude the mandatory notification envelope and associated metadata defined in <xref target="I-D.draft-ietf-netconf-notif-envelope"/>.  Only the full notification example in <xref target="FullNotificationExample"/> includes the notification header.</t>
        </li>
        <li>
          <t>These notification message examples are given using a JSON encoding, but could be encoded using XML or CBOR.</t>
        </li>
        <li>
          <t>Some additional meta data fields, e.g., like those defined in <xref target="I-D.tgraf-netconf-notif-sequencing"/> would also likely be included, but have also been excluded to allow for slightly more concise examples.</t>
        </li>
        <li>
          <t>The examples include the <xref target="I-D.tgraf-netconf-yang-push-observation-time"/> field for the existing YANG-Push Notification format, and the proposed equivalent "observation-time" leaf for the new update notification format.</t>
        </li>
        <li>
          <t>All these examples are created by hand, may contain errors, and may not parse correctly.</t>
        </li>
      </ul>
      <section anchor="example-of-periodic-update-messages">
        <name>Example of periodic update messages</name>
        <t>In this example, a subscription is for <em>/ietf-interfaces:interfaces/interface</em>.  However, for efficiency reasons, the publisher is internally returning the data from two different data providers.</t>
        <t>Of note:</t>
        <ul spacing="normal">
          <li>
            <t>The first periodic message is published for the entries in the <em>/ietf-interfaces:interface/interfaces</em> list, but doesn't contain the data in the <em>statistics</em> child container.</t>
          </li>
          <li>
            <t>the <em>path-prefix</em> is to the subscription subtree, since the device will never return data outside of the subscription subtree.</t>
          </li>
          <li>
            <t>the <em>target-path</em> is elided because the data is returned at the subscription point. **TODO, or should it actually be to the element above? **</t>
          </li>
        </ul>
        <figure>
          <name>Example periodic update for interfaces list</name>
          <sourcecode type="JSON" name="periodic-update.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "path-prefix": "/ietf-interfaces:interfaces/interface",
    "snapshot-type": "periodic",
    "observation-time": "2024-10-10T08:00:05.11Z",
    "updates": [
      {
        "target-path": "",
        "merge": {
          "interface": [
            {
              "name": "eth0",
              "type": "iana-if-type:ethernetCsmacd",
              "enabled": true,
              "ietf-interfaces:oper-status": "up",
              "ietf-interfaces:admin-status": "up"
            },
            {
              "name": "eth1",
              "type": "iana-if-type:ethernetCsmacd",
              "enabled": true,
              "ietf-interfaces:oper-status": "up",
              "ietf-interfaces:admin-status": "up"
            }
          ]
        }
      }
    ],
    "complete": false
  }
}
]]></sourcecode>
        </figure>
        <t>For the second notification related to the same subscription:</t>
        <ul spacing="normal">
          <li>
            <t>the second periodic message is published for only the statistics associated with the interfaces.</t>
          </li>
          <li>
            <t>as above, the <em>path-prefix</em> is still to the subscription subtree.</t>
          </li>
          <li>
            <t>the second notification uses a separate observation-time, but would use the same event-time in the notification header so that the two messages can be correlated to the same periodic collection event.</t>
          </li>
          <li>
            <t>the second periodic message has set the <em>complete</em> flag to indicate that it is the last notification as part of the periodic collection.  A separate <em>update-complete</em> notification could have been sent instead.</t>
          </li>
        </ul>
        <figure>
          <name>Example periodic update for interface statistics</name>
          <sourcecode type="JSON" name="periodic-update-stats.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "path-prefix": "/ietf-interfaces:interfaces/interface",
    "snapshot-type": "periodic",
    "observation-time": "2024-10-10T08:00:05.21Z",
    "updates": [
      {
        "target-path": "",
        "merge": {
          "ietf-interfaces:interface": [
            {
              "name": "eth0",
              "statistics": {
                "in-octets": 123456,
                "out-octets": 654321
              }
            },
            {
              "name": "eth1",
              "statistics": {
                "in-octets": 789012,
                "out-octets": 210987
              }
            }
          ]
        }
      }
    ]
  }
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="example-of-an-on-change-update-notification-using-the-new-style-update-message">
        <name>Example of an on-change-update notification using the new style update message</name>
        <t>If the subscription is for on-change notifications, or periodic-and-on-change-notifications, then, if the interface state changed (specifically if the 'state' leaf of the interface changed state), and if the device was capable of generating on-change notifications, then you may see the following message.  A few points of notes here:</t>
        <ul spacing="normal">
          <li>
            <t>The on-change notification contains <strong>all</strong> of the state at the "target-path"  </t>
            <ul spacing="normal">
              <li>
                <t>Not present in the below example, but if the notification excluded some state under an interfaces list entry (e.g., the line-state leaf) then this would logically represent the implicit deletion of that field under the given list entry.</t>
              </li>
              <li>
                <t>In this example it is restricted to a single interface. It could also publish an on-change notification for all interfaces, by indicating a target-path without any keys specified.  TODO - Can it represent notifications for a subset of interfaces?</t>
              </li>
            </ul>
          </li>
          <li>
            <t>The schema of the change message is exactly the same as for the equivalent periodic message.  It doesn't use the YANG Patch format <xref target="RFC8072"/> for on-change messages.</t>
          </li>
          <li>
            <t>The "observation time" leaf represents when the system first observed the on-change event occurring.</t>
          </li>
          <li>
            <t>The on-change event doesn't differentiate the type of change to operational state.  The on-change-update snapshot type is used to indicate the creation of a new entry or some update to some existing state.  Basically, the message can be thought of as the state existing with some current value.</t>
          </li>
        </ul>
        <figure>
          <name>Example YANG Push v2 on-change update message</name>
          <sourcecode type="JSON" markers="true" name="on-change-msg.json"><![CDATA[
{
  "ietf-yp-notification:envelope": {
    "event-time": "2024-09-27T14:16:30.973Z",
    "hostname": "example-router",
    "sequence-number": 454,
    "contents": {
      "ietf-yp-ext:update": {
        "id": 1,
        "subscription-path":
          "Cisco-IOS-XR-pfi-im-cmd-oper:interfaces",
        "target-path":
          "Cisco-IOS-XR-pfi-im-cmd-oper:interfaces/interfaces/
          interface[interface=GigabitEthernet0/0/0/0]",
        "snapshot-type": "on-change-update"
        "observation-time": "2024-09-27T14:16:30.973Z",
        "datastore-snapshot": {
          "interfaces": {
            "interface": [
              {
                "interface-name": "GigabitEthernet0/0/0/0",
                "interface": "GigabitEthernet0/0/0/0",
                "state": "im-state-up",
                "line-state": "im-state-up"
              }
            ]
          }
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="example-of-an-on-change-delete-notification-using-the-new-style-update-message">
        <name>Example of an on-change-delete notification using the new style update message</name>
        <section anchor="update-message-with-single-deleted-data-node">
          <name>Update message with single deleted data node</name>
          <t>If the interface was deleted, and if the system was capable of reporting on-change events for the delete event, then an on-change delete message would be encoded as per the following message.</t>
          <t>Of note:</t>
          <ul spacing="normal">
            <li>
              <t>The ietf-yp-notification:envelope has been elided</t>
            </li>
            <li>
              <t>The deleted data is identified by the target node in the <em>updates/target-path</em> element.</t>
            </li>
            <li>
              <t>The observation time represents the time at which the delete event occurred, e.g., perhaps when the system processed a configuration change.</t>
            </li>
          </ul>
          <figure>
            <name>Example YANG Push v2 on-change delete message</name>
            <sourcecode type="JSON" name="on-change-delete-msg.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "snapshot-type": "on-change-delete",
    "observation-time": "2025-10-10T08:16:15.11Z",
    "updates": [
      {
        "target-path": "/ietf-interfaces:interfaces/interface[name='eth0']",
        "deleted": [null]
      }
    ]
  }
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="update-message-with-multiple-on-change-deletes">
          <name>Update message with multiple on-change deletes</name>
          <t>This follow example illustrates how a single update notification message can contain multiple on-change delete events for different data nodes.  In this example, two separate interfaces are being deleted.</t>
          <t>Of note:</t>
          <ul spacing="normal">
            <li>
              <t>The ietf-yp-notification:envelope has been elided</t>
            </li>
            <li>
              <t><em>prefix-path</em> is used to shorten the target-paths, the full paths can be constructed concatenating the <em>prefix-path</em> with each <em>target-path</em> in the <em>updates</em> list.</t>
            </li>
            <li>
              <t>all delete events share a common observation-time of when the delete events occurred.  If it is necessary to identify separate observation times then the publisher would send separate messages.</t>
            </li>
            <li>
              <t>data node subtrees that are deleted (list entries in this case) are identified by separate entries in the <em>updates</em> list.</t>
            </li>
          </ul>
          <figure>
            <name>Example YANG Push v2 on-change delete message</name>
            <sourcecode type="JSON" name="on-change-multi-delete-msg.json"><![CDATA[
{
  "ietf-yang-push-2:update": {
    "id": "interfaces",
    "path-prefix": "/ietf-interfaces:interfaces",
    "snapshot-type": "on-change-delete",
    "observation-time": "2025-10-10T08:16:16.11Z",
    "updates": [
      {
        "target-path": "interface[name='eth0']"
      },
      {
        "target-path": "interface[name='eth1']"
      }
    ]
  }
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="netconf-dynamic-subscription-rpc-examples">
        <name>NETCONF Dynamic Subscription RPC examples</name>
        <t>The examples in this section illustrate NETCONF RPCs for establishing and deleting dynamic subscriptions using YANG Push v2.  The examples include one successfully establishing a subscription, and a second to illustrate how errors are returned if a request to establish the subscription fails.  Examples of the <em>update</em> and subscription lifecycle notifications have been given in the previous section.</t>
        <section anchor="successful-periodic-subscription">
          <name>Successful periodic subscription</name>
          <t>The subscriber sends an "establish-subscription" RPC with the parameters listed in <xref target="EstablishDynamic"/>  An example might look like:</t>
          <figure>
            <name>Example establish-subscription RPC for interface statistics</name>
            <sourcecode type="XML" name="netconf-establish-sub-if-stats.xml"><![CDATA[
<netconf:rpc 
message-id="101" xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
  <establish-subscription xmlns="urn:ietf:params:xml:ns:yang:ietf-yp-lite">
    <name>if-stats-sub</name>
    <description>Subscribe to interface statistics</description>
    <target>
      <datastore xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
        ds:operational
      </datastore>
      <path>/ietf-interfaces:interfaces/interface/statistics</path>
    </target>
    <update-trigger>
      <periodic>
        <period>3000</period>
      </periodic>
    </update-trigger>
    <encoding>json</encoding>
  </establish-subscription>
</netconf:rpc>
]]></sourcecode>
          </figure>
          <t>If a publisher is happy to accept the subscription, then it returns a positive response that includes the "id" of the accepted subscription.  For example,</t>
          <figure>
            <name>Example establish-subscription RPC successful reply</name>
            <sourcecode type="XML" name="establish-subscription-reply.xml"><![CDATA[
<rpc-reply 
message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <id xmlns="urn:ietf:params:xml:ns:yang:ietf-yp-lite">52</id>
</rpc-reply>
]]></sourcecode>
          </figure>
          <t>Once established, the publisher would send a <em>subscription-started</em> notification message followed by <em>update</em> notification messages at the requested periodic cadence.</t>
        </section>
        <section anchor="failed-periodic-subscription">
          <name>Failed periodic subscription</name>
          <t>A subscription can be rejected for multiple reasons, including the
lack of authorization to establish a subscription, no capacity to
serve the subscription at the publisher, or the inability of the
publisher to select datastore content at the requested cadence.</t>
          <t>If a request is rejected because the publisher is not able to serve
it, the publisher <bcp14>SHOULD</bcp14> include in the returned error hints that
help a subscriber understand what subscription parameters might have
been accepted for the request.  These hints would be included in the
yang-data structure "establish-subscription-error-datastore".
However, even with these hints, there are no guarantees that
subsequent requests will in fact be accepted.</t>
          <t>The specific parameters to be returned as part of the RPC error
response depend on the specific transport that is used to manage the
subscription.  For NETCONF, those parameters are defined in
<xref target="RFC8640"/>.  For example, for the following NETCONF request:</t>
          <artwork><![CDATA[
  <rpc message-id="101"
      xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
    <establish-subscription
        xmlns=
          "urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications"
        xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push">
      <yp:datastore
          xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
        ds:operational
      </yp:datastore>
      <yp:datastore-xpath-filter
          xmlns:ex="https://example.com/sample-data/1.0">
        /ex:foo
      </yp:datastore-xpath-filter>
      <yp:on-change>
      </yp:on-change>
    </establish-subscription>
  </rpc>

      Figure 12: "establish-subscription" Request: Example 2
]]></artwork>
          <t>A publisher that cannot serve on-change updates but can serve
periodic updates might return the following NETCONF response:</t>
          <artwork><![CDATA[
 <rpc-reply message-id="101"
   xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
   xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications">
   <rpc-error>
     <error-type>application</error-type>
     <error-tag>operation-failed</error-tag>
     <error-severity>error</error-severity>
     <error-path>/yp:periodic/yp:period</error-path>
     <error-info>
       <yp:establish-subscription-error-datastore>
         <yp:reason>yp:on-change-unsupported</yp:reason>
       </yp:establish-subscription-error-datastore>
     </error-info>
   </rpc-error>
 </rpc-reply>

       Figure 13: "establish-subscription" Error Response: Example 2
]]></artwork>
        </section>
        <section anchor="delete-subscription-rpc">
          <name>"delete-subscription" RPC</name>
          <t>To stop receiving updates from a subscription and effectively delete
a subscription that had previously been established using an
"establish-subscription" RPC, a subscriber can send a
"delete-subscription" RPC, which takes as its only input the
subscription's "id".  This RPC is unmodified from <xref target="RFC8639"/>.</t>
        </section>
      </section>
      <section anchor="distrib-notif-example">
        <name>Distributed Notifications Subscription</name>
        <t>This simple example illustrates how messages may look like when using
distributed notifications, as described in <xref target="distributed-notifications"/>.  This example is for a very simple periodic subscription to the ietf-interfaces YANG data model.</t>
        <t>The first message is a subscription started message that indicates that there
are 2 additional <em>Publisher Agents</em> with publisher-ids of 4 and 7, e.g., perhaps representing a device with two linecards inserted into slots 4 and 7, each with
their owner separate Message Publisher process.  This message has a publisher-id of 0 because it is sent by the Publisher Parent, which, because this field has the default value, could have been elided from the message.</t>
        <figure>
          <name>Example distributed notification subscription started message</name>
          <sourcecode type="JSON" name="distributed-subscription-started.json"><![CDATA[
{
  "ietf-yp-notification:envelope": {
    "event-time": "2025-10-10T08:00:05.22Z",
    "hostname": "example-router",
    "sequence-number": 23,
    "ietf-yang-push-2:publisher-id": 0
    "contents": {
      "ietf-yang-push-2:subscription-started": {
        "id": "interfaces",
        "target": {
          "datastore": "ietf-datastores:operational",
          "path": "/ietf-interfaces:interfaces"
        },
        "update-trigger": {
          "periodic": {
            "period": 3000,
            "anchor-time": "2025-01-01T00:00:00.00Z"
          }
        },
        "message-publishers": {
          "publisher-id" = [0, 4, 7]
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>The second message is an example of a periodic update message sent from one of the Publisher Agents on the linecard.  In this case the message is sent from the publisher agent on linecard 4, and it has set the <em>complete</em> leaf to indicate that the message represents all data for that periodic collection from that publisher.</t>
        <figure>
          <name>Example distributed notification update message</name>
          <sourcecode type="JSON" name="full-distributed-notification.json"><![CDATA[
{
  "ietf-yp-notification:envelope": {
    "event-time": "2025-10-10T08:00:05.22Z",
    "hostname": "example-router",
    "sequence-number": 18,
    "ietf-yang-push-2:publisher-id": 4
    "contents": {
      "ietf-yang-push-2:update": {
        "id": 1011,
        "snapshot-type": "periodic",
        "observation-time": "2025-10-10T08:00:05.11Z",
        "updates": [
          {
            "target-path": "ietf-interfaces:interfaces/interface",
            "merge": {
              "ietf-interfaces:interfaces": {
                "ietf-interfaces:interface": [
                  {
                    "name": "eth4/0",
                    "type": "iana-if-type:ethernetCsmacd",
                    "enabled": true,
                    "ietf-interfaces:oper-status": "up",
                    "ietf-interfaces:admin-status": "up"
                  },
                  {
                    "name": "eth4/1",
                    "type": "iana-if-type:ethernetCsmacd",
                    "enabled": true,
                    "ietf-interfaces:oper-status": "down",
                    "ietf-interfaces:admin-status": "up"
                  }
                ]
              }
            }
          }
        ],
        complete = true
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>Not shown here, but because there were 3 publisher-ids listed in the subscription-started message means that each Message Publisher must send at least one message for each periodic subscription returning any data associated with the subscription from that Message Publisher and also indicating that the periodic collection is complete by either setting <tt>complete = true</tt> or sending an <em>update-complete</em> notification.</t>
      </section>
    </section>
    <section anchor="OpenIssuesTracker">
      <name>Summary of Open Issues &amp; Potential Enhancements</name>
      <t>This temporary section lists open issues and enhancements that require further discussion by the authors, or the WG.  Once adopted, it is anticipated that tracking the open issues would move to github.</t>
      <t>The issues are ordered/grouped by the sections in the current document.  I.e., to make it easier to review/update sections of the document.</t>
      <section anchor="issues-related-to-general-ietf-process">
        <name>Issues related to general IETF process</name>
        <ol spacing="normal" type="1"><li>
            <t>If this work progresses we will need simple bis versions of the transports document so that they augment into the new data model paths.  Drafts that would need to be updated as documented in  <xref target="DraftRelationships"/>.  <eref target="https://github.com/rgwilton/draft-yp-observability/issues/27">Issue 27</eref></t>
          </li>
          <li>
            <t>Do we need to fold in any text from RFC 8640? and RESTCONF? <eref target="https://github.com/rgwilton/draft-yp-observability/issues/26">Issue 26</eref></t>
          </li>
        </ol>
      </section>
      <section anchor="issue-related-to-terminologydefinitions">
        <name>Issue related to Terminology/Definitions</name>
        <ol spacing="normal" type="1"><li>
            <t>Should we use the object terminology? Tracked as editorial, in <eref target="https://github.com/rgwilton/draft-yp-observability/issues/15">Issue 15</eref></t>
          </li>
        </ol>
      </section>
      <section anchor="issues-related-to-yang-push-v2-overview">
        <name>Issues related to YANG Push v2 Overview</name>
        <t>None currently.</t>
      </section>
      <section anchor="issues-related-to-subscription-paths-and-selection-filters">
        <name>Issues related to Subscription Paths and Selection Filters</name>
        <ol spacing="normal" type="1"><li>
            <t>This draft introduces a new simple yang path (ypath) format that is like a JSON instance data path, that all implementations <bcp14>MUST</bcp14> support.  <eref target="https://github.com/rgwilton/draft-yp-observability/issues/29">Issue 29</eref></t>
          </li>
          <li>
            <t>Advertising subscription schema: <eref target="https://github.com/rgwilton/draft-yp-observability/issues/11">Issue 11</eref></t>
          </li>
        </ol>
      </section>
      <section anchor="issues-related-to-datastore-event-streams-message-format">
        <name>Issues related to Datastore Event Streams &amp; message format</name>
        <ol spacing="normal" type="1"><li>
            <t>Agree format and usage of <em>update</em> notification. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/32">Issue 32</eref></t>
          </li>
        </ol>
      </section>
      <section anchor="issues-related-to-receivers-transports-encodings">
        <name>Issues related to Receivers, Transports, &amp; Encodings</name>
        <section anchor="issues-related-to-transports">
          <name>Issues related to Transports:</name>
          <ol spacing="normal" type="1"><li>
              <t>James: We also need to add some text into security section.
              </t>
              <ul spacing="normal">
                <li>
                  <t>Rob: Is this transport specific, or related to application layer authorization?</t>
                </li>
              </ul>
            </li>
            <li>
              <t>What is the rules/restrictions for subscription receiver instances vs transport sessions?  E.g., is this entirely down to the transport to define.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="issues-related-to-setting-up-managing-subscriptions">
        <name>Issues related to Setting up &amp; Managing Subscriptions</name>
        <section anchor="issues-related-to-the-configuration-model">
          <name>Issues related to the configuration model:</name>
          <ol spacing="normal" type="1"><li>
              <t>YP Lite is somewhat different (separate namespace, separate receivers, no event filters, some config has moved to a separate receivers list).  See the data model and <xref target="DifferencesFromYangPush"/>.  Note some of these apply or impact dynamic subscriptions as well. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/30">Issue 30</eref></t>
            </li>
          </ol>
        </section>
        <section anchor="issues-related-to-dynamic-subscriptions">
          <name>Issues related to dynamic subscriptions:</name>
          <ol spacing="normal" type="1"><li>
              <t>Do we want to change how RPC errors are reported?  E.g., change the RPC ok response to indicate whether the subscription was successfully created or not, or included extra error information.  Note NETCONF and RESTCONF already define how errors are encoded in XML and JSON (for RESTCONF only), is it possible to unify this so we don't need large extra separate documents.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="issues-related-to-subscription-lifecycle">
        <name>Issues related to Subscription Lifecycle</name>
        <ol spacing="normal" type="1"><li>
            <t>Should subscription-started notification include a fingerprint of the schema that is covered by the subscription that would guaranteed to change if the subscription changes? <eref target="https://github.com/rgwilton/draft-yp-observability/issues/11">Issue 11</eref></t>
          </li>
          <li>
            <t>If a subscription references a filter, then should that be included inline in the subscription started notification (as per the RFC 8641 text), or should it indicate that it is a referenced filter? <eref target="https://github.com/rgwilton/draft-yp-observability/issues/20">Issue 20</eref></t>
          </li>
          <li>
            <t>Is a publisher allowed to arbitrarily send a sync-on-start resync, e.g., if it detects data loss, or should it always just terminate and reinitialize the subscription? <eref target="https://github.com/rgwilton/draft-yp-observability/issues/22">Issue 22</eref></t>
          </li>
          <li>
            <t>Should we have a YANG Action to reset a receiver or a subscription?  E.g., discussed in <xref target="reset"/>. <eref target="https://github.com/rgwilton/draft-yp-observability/issues/24">Issue 24</eref></t>
          </li>
          <li>
            <t>Should we support configurable subscription-level keepalives? <eref target="https://github.com/rgwilton/draft-yp-observability/issues/14">Issue 14</eref></t>
          </li>
        </ol>
      </section>
      <section anchor="issues-related-to-performance-reliability-subscription-monitoring">
        <name>Issues related to Performance, Reliability &amp; Subscription Monitoring</name>
        <section anchor="issuesquestions-related-to-operational-data">
          <name>Issues/questions related to operational data:</name>
          <ol spacing="normal" type="1"><li>
              <t>Should we define some additional operational data to help operators check that the telemetry infrastructure is performing correctly, to get an approximation of the load, etc.
              </t>
              <ul spacing="normal">
                <li>
                  <t>Rob: probably, but lower priority.</t>
                </li>
                <li>
                  <t>Tracked by <eref target="https://github.com/rgwilton/draft-yp-observability/issues/31">Issue 31</eref></t>
                </li>
              </ul>
            </li>
            <li>
              <t>Should dynamic subscriptions use the same receivers structure as for configured subscriptions, or should they be inline in the configured subscription?  Also tracked by <eref target="https://github.com/rgwilton/draft-yp-observability/issues/31">Issue 31</eref></t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="issues-related-to-conformance-and-capabilities">
        <name>Issues related to Conformance and Capabilities</name>
        <ol spacing="normal" type="1"><li>
            <t>Do we advertise that conformance via capabilities and/or YANG features (both for configured and dynamic subscriptions)?</t>
          </li>
          <li>
            <t>For on-change, should a subscription be rejected (or not brought up) if there are no on-change notifiable nodes?</t>
          </li>
          <li>
            <t>Further work and discussion is required for advertising capabilities for filter paths.  E.g., listing all of the paths that support on-change could be a very long list.  Related, does the draft need to advertise at what points a publisher would decompose a higher subscription into more specific subscriptions.</t>
          </li>
        </ol>
        <t>All tracked via <eref target="https://github.com/rgwilton/draft-yp-observability/issues/18">Issue 18</eref></t>
      </section>
      <section anchor="issues-related-to-the-yang-modules">
        <name>Issues related to the YANG Modules</name>
        <t>None open.</t>
      </section>
      <section anchor="issues-related-to-the-security-considerations-nacm-filtering">
        <name>Issues related to the Security Considerations (&amp; NACM filtering)</name>
        <ol spacing="normal" type="1"><li>
            <t>Need to consider how NACM applies to YANG Push v2, which may differ for dynamic vs configured subscription, but generally we want the permissions to be checked when the subscription is created rather than each time a path is accessed.</t>
          </li>
          <li>
            <t>Where should this be in the document (current it in the security considerations section)</t>
          </li>
          <li>
            <t>Do we want to retain the the current text in <xref target="events"/> introduction related to terminating a subscription if permissions change?</t>
          </li>
          <li>
            <t>Also note, text was removed from the transport section related to RPC authorization, and which should be moved to an application (rather than transport) layer security mechanism.</t>
          </li>
        </ol>
        <t>All tracked via <eref target="https://github.com/rgwilton/draft-yp-observability/issues/33">Issue 33</eref></t>
      </section>
      <section anchor="issues-related-to-the-iana">
        <name>Issues related to the IANA</name>
        <t>None open.</t>
      </section>
      <section anchor="issues-related-to-the-appendixes">
        <name>Issues related to the Appendixes</name>
        <section anchor="examples-related-issuesquestions">
          <name>Examples related issues/questions:</name>
          <ol spacing="normal" type="1"><li>
              <t>Not a question, but a note that many examples need to be updated to reflect the data models currently in the draft.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="summary-of-closedresolved-issues">
        <name>Summary of closed/resolved issues</name>
        <t>This appendix is only intended while the authors/WG are working on the document, and should be deleted prior to WG LC.</t>
        <ol spacing="normal" type="1"><li>
            <t>Rename subscription-terminated to subscription-stopped (Change rejected 21 Feb 25, unnecessary renaming.)</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> use envelope, hostname and sequence-number (and event-time) (Decided 21 Feb 25)</t>
          </li>
          <li>
            <t>Don't mandate configured or dynamic subscriptions, allow implementations to implement one or both of them. (Decided 21 Feb 25)</t>
          </li>
          <li>
            <t>Dynamic subscriptions require the encoding to be specified. (Decided 21 Feb 25)</t>
          </li>
          <li>
            <t>DSCP settings are only specified under the receiver (for configured subscriptions) (Decided 21 Feb 25)</t>
          </li>
          <li>
            <t>Config and dynamic subscriptions should be aligned as much as possible.</t>
          </li>
          <li>
            <t>If subscription parameters change then force subscription down and up again, <eref target="https://github.com/rgwilton/draft-yp-observability/issues/14">issue 14</eref></t>
          </li>
          <li>
            <t>No RPC to modify a dynamic subscription, use delete-subscription then create-subscription.</t>
          </li>
          <li>
            <t>Lifecycle messages are sent per subscription rather than per receiver, and we only support a single receiver per subscription.</t>
          </li>
          <li>
            <t>Encoding is set per subscription, and we don't allow different per-receiver encodings for a subscription with more than one receiver.  <eref target="https://github.com/rgwilton/draft-yp-observability/issues/17">issue 17</eref></t>
          </li>
          <li>
            <t>We have a updated-completed flag/notification to allow deleted data to be implicitly detected.  Something similar may be added to gNMI.  <eref target="https://github.com/rgwilton/draft-yp-observability/issues/12">issue 12</eref></t>
          </li>
          <li>
            <t>We use a string identifier to uniquely identify a subscription rather than a numeric id.  Reserve 'dyn-' for server allocated dynamic subscription ids.  Agreed config/dynamic conflict policy.  Restricted names for fitler-id and receiver name.  Don't use a union type (could be added in future). (Dec 8th)</t>
          </li>
          <li>
            <t>Draft renamed from Yang Push Lite to Yang Push 2. (Dec 8th)</t>
          </li>
          <li>
            <t>ietf-yp2-config no longer augments dynamic subscriptions with a reference to a configured filter <eref target="https://github.com/rgwilton/draft-yp-observability/issues/19">issue 19</eref></t>
          </li>
          <li>
            <t>Publisher <bcp14>MUST NOT</bcp14> send more notifications after a subscription terminated message <eref target="https://github.com/rgwilton/draft-yp-observability/issues/13">Issue 13</eref>.</t>
          </li>
          <li>
            <t>on-change notifications <bcp14>SHOULD</bcp14> send a minimal update but <bcp14>MAY</bcp14> send additional unchanged fields.</t>
          </li>
        </ol>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y9+3obx5Uv+j+eokP9IRIbIEVZvog7iULrMtaMZWlL9DjZ
tvekATTIjoBupLshima0n+U8y3mys65Vq6qrQcqOM5PvjL58Dgh0173Wff3W
dDoddWW3Kk6yvT+dfvMv2ZO8y9uuborsrFgV66JrrrJ9+uXVtr3I3hVNW9ZV
dv9gb5TPZk3xTl6c8s/390bzvCvO6+bqJGu7xWi0qOdVvob2F02+7KaX5aqr
q2lVdPO6Wk6v8up8uoFXp/en9+6N2u1sXbbYQ3e1gXeePz17Nqq261nRnIwW
0PDJCF5ri6rdtidZ12yLEQzgk1HeFDkM5OWmaPIO3m6zvFpkL/IqP4c5VN3e
6LJu3p439XYDj31TdPhn9hhGUJ5v+ZW90dviCr5enIyybJq5KdNfL2dt0bzL
Z+Wq7K7oG23DrRI/pwPIV7SSo3dFtS2wxRv6zjKe8N538GNZnWf/gs/j9+u8
XMH3smB/KItueVg35/hT3swv4KeLrtu0J0dH+CR+Vb4rDvWxI/ziaNbUl21x
JG0c4bvnZXexncHbzTlvyRHvz9VmWtvJ4rMrWPi2Mz3pO4fcymFZD7x9lN70
6KnDi2692huN8m13UcNGZ1PoNMuW29WKj87rGg5Al31HzdBvMLW8Kn+i1TvJ
HpftvM7eXLVdsW7p94KXreGe/zDHBw7n9Zp+bGo878WihHPe7+yrenVeNNm/
FatV0SQ6e1Jsi66dX/ANeSttSof88iG//IeOHzhcFP1uviyquuyyx6u8bItE
N0/hql11F3gWXr56Y/uY0Zt/KNwD03rTHsLi9jt5OoOHs9OmLNpEF/+6rcqN
zFHaLt7nf/gLf51u8V/hv232eLteQ8eJNr+p35a5bfEv+MLhnF/4Q4U/80bE
LZ9d1Ou8hYOfLxPtvrkEujAPF5vfOMQ3/tDK79T2qKqbNbz4jq7e8+mTQz6H
eCvcKazqrlxOi+pdsao39ODrZ4/vP/j8gXz87P6DY/348KF+/Pzhp/f8R/32
i08e3PMfzbf39eOn9z/1Hx/qx89duw+PH36mH+9/qmN4+OlDfe3hgy/cx4fH
9NqXj18dPzihYR8fP6QGjz9/MBqV1dLOH76HMWlHn3z2xRfy8cH9T3V8n97/
/HOd7L37bob3HuhQP//Uz/D+pw/9DD/Rjw8e6AS+uOefvfe5W4LPPnGvfeYf
+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
WVv236ztv1nbr8ba/nYDawuaYTrZ2z17/Xist+eIzvv+kSzRqxoxU/ThpRFb
fBZAckskf8gPhe2J8beqQxOmV3O5qEaK6fm8J29Z6CnF6u1Fkr2Fw7O6fYgf
a0BslSRoo1vqkmLk1IwQYvukSwZJfkYKKJe3tF6i4md0wtYDhoZul4HoKwGd
SsghN9kB0po62hw35JQMnG7kgaazeURuS8S3XLJkE7kreW/R0ePaVHcPwcqS
XQgeQlfhgMl02NDQF5D+/2pe6O0eGxOiTEZxGpxwcPo0cn4GnmQNC/a+ztDy
KQchlRTjAgkk0itoV0fNAwhxJBkvTiKA005ghMDJ0Njhc41MBVs7FTKUDueV
He4uPDpIHsV28atXGr2VWOfHNSTY7RTmPAOKRS/uixcubjohcOzqxFQ2d2+m
5MWgnrk8V1TbtcTHhw/HNc0HJIFb801DTndyTo7jzk7ZiE7+jvdwfp0JnVLd
OqG2krb8aDzO1OvNipFTD+y6G3Z5eXHVJ2696IuJ4CI7BilZ06REKqcVIo/n
bUk+AnTcQdMgpmmxpMvCh5uW4rmllXfqqKtCZ6R/njJVh2J5QkRAVwxkz2M8
MvqmeVdiCWzVqvFYy7ftkiEw0VyiLUIZglANHWcSNzHBpXm2QGgEi5AtumwO
ZuHiZ6yuIq6qrhu57uzuDsP/JeoA+wQav95k6IwShXn/+KBHQu+26gGANw41
8cVG2elSDjljObXBOHLCJaEKRsqSMAgE3ZhSjrBjqB2MIa+wYCClo9YRwPIN
JLI3zL8faXwjNusHOwhh1LumM1kqFdOlXeQgam43GWCEnsEq397WHwQ/odd0
ABdEomlpLay7chk9hSEjYfhYq3Bxhvthimyv2E5QINRcgLjegI+ExMEMFIYO
NixkZAIoHxZEFLgkDDgiqIQUHL1Fd0mFhoRIdGUbHhoPMqeejWS5TM69llcd
vJYGU2hpzk9t+T3N2THgbQ68jzfEAKqpzPk9haNlx5/9uH/RdZv25OjoHAjE
dnYIJ+yoOYfL2dXVEZcAvNpMhaExHOIRx7IdHX92gPQ18rR37FFFeKjB8NEQ
xmgnVhSiPw56p2jWEofLlcMCmSyN9dTHUQpRfs4GQrj8yQsw/m1A5QCg0OGO
i8WRfJiRxnDODeiZRcNZHbZSi5yQNSuYAxn4HEjHKzFYxhIpnCDJTXwSFbpS
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
7+MCm8MeC30EpU5TUoeDkYcXSYQtj8QWD0/b18IcKTQJCshBKEkpoDXYm4Oa
KAlfi06/jIBCIeHY+kqWyfALL9UGSMjIP5GiwGlcM2ZZIjKIIuCTVENPtDOx
F/MVm6eXgSQaGzJKbwSpNKJYq9FIyQYNV1sXhQNq8USs2n0BZVw3RarddAP+
c4N632fp8WXXshc+VwUfh1lWm22UWYXf9iJzB+Jy3Rv9ZK5U6hA82Mvl8k3E
6VzpJC73fDqPKxtO5bLzNilTiRwubaRNpnHZdlqfyTWQv6VtDaRwZdqSyeK6
be4WvDWYLeVnmk6Yin53Gz2cM+Xe+Ji0KffSzZlTfzOLcVPylGvWRXC5f/pN
/4i28014rOFedif4dRQRvu3MpcjCSPihQFCJ/Ry4fkod9jIvHFhWi8EBFBmK
sPWRlMrcgCjEQPN7RMCQPK29BNn2o+dYDBuPs32Nir1/+ODws4NHo9FvfzOd
jiggHZQF0OgkSopLcAG1dt4/ETxBQafQZey4aJq6uTELIj30KfORKbUxRXBB
ngyROymc/Q+jpyO9fNTzACntj3ik1zjDY/KRb7n3eNf6GRF9OmheYhI4FYzC
KYilXUh+3QvPyC6RfXLyETuRrK8R7E4QzrwzKPqHW3f7w14cJD2d/r7vMB2Q
vfmRSPAehJq/hdS9NlCtVDB9F/Z9MucM0wK2rVYQzeOU/ZttGoEDv6dcgGxe
vEd/o4+CoVKrmDNPNUqxrjfw1SsvTgZzSgU7Ec5Q6MM06YiCJYa4cz4w7iYX
7cSAzaPdAfeblVqkJd5CvGOzqoTpAaET4ZyBUKiO8DQGXmhBGuwjMh/1XCNp
dF4Xqw0CbF5SyNdgqt/RLZL4BLvzVnAKu8nu8Gz/qwisicHdTlrNvLQa06gB
aTW7rbSapaVVO5TbSKv2+VhatR1F0mr/5SFpNWwkllb77eySVsO23qdHlP0s
aTXbLa0GM42l1eyjpdXojVtLq3YYN0ir0bRuklaz24igkSCZuhZGimQq+3NE
yETDXn58lzcYKH2zCIkAXnHITYojCwNOwzpruBSbdDsySM+LlabEveeMiiHj
I+Yb5mH85E7zsgs8Zixkw0lmDg3PLxvbWhetD3BhkSDlyjkx9lRjU/Hond7B
1Q8mu3HYym7/HoVMKP414o50PpA5klsowIQfLB+RzCF1MNVop6H4FrwYF01d
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

-->

</rfc>
