<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wilton-netconf-yp-observability-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="YANG-Push Observability">YANG-Push Operational Data Observability Enhancements</title>
    <seriesInfo name="Internet-Draft" value="draft-wilton-netconf-yp-observability-00"/>
    <author fullname="Robert Wilton">
      <organization>Cisco Systems</organization>
      <address>
        <email>rwilton@cisco.com</email>
      </address>
    </author>
    <date year="2024" month="October" day="21"/>
    <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 58?>

<t>This early draft proposes some enhancements to YANG-Push to optimize its behavior for operational data telemetry.  It also lists some additional issues that could potentially be discussed if there is further interest in this work, in particular whether we should be attempting extensions to YANG-Push (as this document is currently framed) or instead should attempt to define a new 'YANG-Push lite'.</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-yp-observability/"/>.
      </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 62?>

<section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="I-D.ietf-nmop-yang-message-broker-integration"/> describes an architecture for how YANG-Push <xref target="RFC8641"/> can be integrated effectively with message brokers, e.g., <xref target="Kafka"/>, that is part of a wider architecture for a <strong>Network Anomaly Detection Framework</strong>, specified in <xref target="I-D.ietf-nmop-network-anomaly-architecture"/>.</t>
      <t>YANG-Push is a key part of these architectures, but through experience of implementing YANG-Push specifically for the use cases described in the above architecture documents, it became clear that there are aspects of YANG-Push that are not optimal for these use cases for neither producer or consumer, particular as they relate to operational data.</t>
      <t>For the consumer of the telemetry data, there is a requirement to associate a schema with the provided data.  It is much more helpful for the schema to be associated with the individual messages rather than at the root of the operational datastore.  As such, it is helpful for the encoded instance data to be rooted at the subscription path rather than at the schema root of the operational datastore.</t>
      <section anchor="complexities-in-modelling-the-operational-state-datastore">
        <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 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="Eventual_Consistency"/> 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>
    <section anchor="yang-push-enhancements">
      <name>YANG-Push enhancements</name>
      <t>To address the needs described in the introduction and architecture documents, this document defines some minor extensions to YANG-Push that are designed to make YANG-Push work better both for producers and consumers of YANG telemetry data.</t>
      <t>Currently, it:</t>
      <ul spacing="normal">
        <li>
          <t>defines a new YANG-Push encoding format that can be used for both on-change and periodic subscriptions that reports the data from the subscription filter point.</t>
        </li>
        <li>
          <t>defines a combined periodic and on-change subscription that reports events both on a periodical cadence and also if changes to the data have occurred.</t>
        </li>
      </ul>
      <t>These are detailed in the following sections:</t>
      <section anchor="new-encoding-format">
        <name>New encoding format</name>
        <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>
        <t>There are a few reasons for specifying a new encoding format:</t>
        <ol spacing="normal" type="1"><li>
            <t>To use the same encoding format for both periodic and on-change messages, allowing the same messages to be easily received and stored in a time-series database, making use of the same message schema when traversing message buses, such as Apache Kafka.</t>
          </li>
          <li>
            <t>To allow the schema of the notifications to be rooted to the subscription point rather than always being to the root of the operational datastore schema.  This allows messages to be slightly less indented, and makes it easier to convert from a YANG schema to an equivalent message bus schema, where each message is defined with its own schema, rather than a single datastore schema.</t>
          </li>
          <li>
            <t>To move away from the somewhat verbose YANG Patch format <xref target="RFC8072"/>, that is not really a great fit for encoding changes of operational data.  Many systems cannot necessarily distinguish between create versus update events (particularly for new subscriptions or after recovering from internal failures within the system), and hence cannot faithfully implement the full YANG Patch semantics defined in <xref target="RFC8641"/>.</t>
          </li>
          <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>
        <t>The practical differences in the encodings may be better illustrated via the examples in <xref target="Examples"/>.</t>
      </section>
      <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 (perhaps with dampening).</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 would 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, potentially with some dampening, 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 introduces the fairly intuitive "periodic-and-on-change" update trigger that creates a combined periodic and on-change subscription, and allows the same parameters to be configured.  For some use cases, e.g., where a time-series database is being updated, the new encoding format proposed previously may be most useful.</t>
      </section>
      <section anchor="open-issues-other-potential-enhancementschanges">
        <name>Open Issues &amp; Other Potential Enhancements/Changes</name>
        <t>This section lists some other potential issues and enhancements that should be considered as part of this work.  If there is working group interest in progressing this work, then the issues in this section could potentially be better managed as github issues.</t>
        <ol spacing="normal" type="1"><li>
            <t>Should we consider a version of the JSON encoding that excludes module prefixes (either everywhere, or perhaps only include the top module prefix).  The reasoning for considering this is to potentially better align the JSON data with how the schema data may be modeled in other data systems, e.g., Kafka.  Obviously, this requires that there be no duplicate data node names in different module namespaces, but most sane device schemas would avoid this anyway.</t>
          </li>
          <li>
            <t>Do we make use of the new notification-envelope format <xref target="I-D.netana-netconf-notif-envelope"/> as the mandatory and only required notification format for these new forms of subscriptions.  I.e., reducing complexity by removing unnecessary flexibility and options?</t>
          </li>
          <li>
            <t>Document how sub-subscriptions can be used to split a higher level subscription into multiple smaller more efficient subscriptions for the device (that can be handled concurrently).</t>
          </li>
          <li>
            <t>The document's current focus is on configured subscriptions, aligned to the proposed initial deployment requirements, but the solution should probably be extended to support dynamic subscriptions, presuming that it is not hard to do so.</t>
          </li>
          <li>
            <t>Some of the YANG-Push behavior is more complex and expensive to implement (e.g., the <bcp14>SHOULD</bcp14> requirement to suggest suitable alternative subscription parameters if a subscription is rejected, subscription dependencies).  Should this document update RFC 8639 or RFC 8641 to indicate that those requirements do not apply to these new extended subscriptions?  The goal of this work should be to specify the minimal required functionality to meet the requirements.</t>
          </li>
          <li>
            <t>What document format should this work take?  The currently proposed approach is to add extra extensions to YANG-Push to cover the required functionality.  An alternative approach could be to write a RFC 8641-bis, or a 'YANG-Push lite'.</t>
          </li>
          <li>
            <t>Currently the encoding and transport parameters are per subscription, but it may make more sense for these to be per receiver definition.  I.e., if you want to use different transports and encodings to the same receiver this should still be possible, but would require a second receiver to be defined with the same destination IP address, but a different name.  Currently, the newly proposed encoding format is configured per subscription (mirroring equivalent transport and encoding configuration), but alternatively it could be configured per receiver.</t>
          </li>
          <li>
            <t>We should consider how a subscription could support multiple subscription paths.  The potential tricky aspect of this to consider the subscription bind point.  Related to this is whether XPath 1.0 is the best way of specifying these bind points, or whether it should something closer to the NACM node-instance-identifier <xref target="RFC6536"/>, but perhaps using something closer to the JSON style encoding of instance identifier <xref target="RFC7951"/>, section 6.11; or JSON PATH <xref target="RFC9535"/>.</t>
          </li>
          <li>
            <t>What level of subscription filtering do we need and want to support?  For example, I doubt that anyone allows for full XPath filtering of operational data subscriptions because they are likely to be very computationally expensive to implement.  Is there an easier way of expressing the filter requirements rather than using subtree filtering.  Note, this could be added in a future release.</t>
          </li>
        </ol>
        <!--
# Should the appendix contain a list of features in subscriptions notifications and YANG-Push
# that are probably not needed?
#
# E.g., is subscription modified useful (as opposed to just tearing down the subscription and starting again, which clients may handle from a robustness perspective anyway).
-->

</section>
      <section anchor="yang-extensions-data-model">
        <name>YANG Extensions Data Model</name>
        <t>This sections shows the raw YANG tree output just for the ietf-yp-ext.yang module, and the proposed YANG module.</t>
        <section anchor="yang-tree">
          <name>YANG Tree</name>
          <figure>
            <name>YANG tree for ietf-yp-ext.yang</name>
            <sourcecode type="yangtree"><![CDATA[
module: ietf-yp-ext

  augment /sn:subscription-started/yp:update-trigger:
    +--:(periodic-and-on-change) {yp:on-change}?
       +-- periodic-and-on-change!
          +-- period              yp:centiseconds
          +-- anchor-time?        yang:date-and-time
          +-- dampening-period?   yp:centiseconds
          +-- sync-on-start?      boolean
          +-- excluded-change*    yp:change-type
  augment /sn:subscription-started:
    +--ro common-notification-format?   boolean
  augment /sn:subscription-modified/yp:update-trigger:
    +--:(periodic-and-on-change) {yp:on-change}?
       +-- periodic-and-on-change!
          +-- period              yp:centiseconds
          +-- anchor-time?        yang:date-and-time
          +-- dampening-period?   yp:centiseconds
          +-- sync-on-start?      boolean
          +-- excluded-change*    yp:change-type
  augment /sn:subscription-modified:
    +--ro common-notification-format?   boolean
  augment /sn:subscriptions/sn:subscription/yp:update-trigger:
    +--:(periodic-and-on-change) {yp:on-change}?
       +--rw periodic-and-on-change!
          +--rw period              yp:centiseconds
          +--rw anchor-time?        yang:date-and-time
          +--rw dampening-period?   yp:centiseconds
          +--rw sync-on-start?      boolean
          +--rw excluded-change*    yp:change-type
  augment /sn:subscriptions/sn:subscription:
    +--rw common-notification-format?   boolean

  notifications:
    +---n update
       +--ro id?                   sn:subscription-id
       +--ro subscription-path?    yang:xpath1.0
       +--ro target-path?          string
       +--ro snapshot-type?        enumeration
       +--ro observation-time?     yang:date-and-time
       +--ro datastore-snapshot?   <anydata>
       +--ro incomplete?           empty
]]></sourcecode>
          </figure>
        </section>
        <section anchor="yang-file">
          <name>YANG file</name>
          <figure>
            <name>YANG module ietf-yp-ext</name>
            <sourcecode type="yang" markers="true" name="ietf-yp-ext@2024-10-18.yang"><![CDATA[
module ietf-yp-ext {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-yp-ext";
  prefix yp-ext;

  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types";
  }
  import ietf-subscribed-notifications {
    prefix sn;
    reference
      "RFC 8639: Subscription to YANG Notifications";
  }
  import ietf-yang-push {
    prefix yp;
    reference
      "RFC 8641: Subscription to YANG Datastores";
  }

  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 extensions.

     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) 2024 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified 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 8641; see the
     RFC itself for full legal notices.";

  revision 2024-10-18 {
    description
      "Initial revision.";
    reference
      "XXX: YANG Push Observability Extensions ";
  }

  /*
   * FEATURES
   */

  /*
   * IDENTITIES
   */

  /*
   * TYPE DEFINITIONS
   */

  /*
   * GROUP DEFINITIONS
   */

  grouping periodic-and-on-change {
    description
      "This grouping describes the datastore-specific subscription
       that represents a combined periodic and on-change subscription.";
    container periodic-and-on-change {
      presence
        "A combined periodic and on-change subscription";
      description
        "The publish notifies the receiver on the specific
          periodic, and also whenever any of the data changes.";
      leaf period {
        type yp: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.";
      }
      leaf dampening-period {
        type yp:centiseconds;
        default "0";
        description
          "Specifies the minimum interval between the assembly of
            successive update records for a single receiver of a
            subscription.  Whenever subscribed objects change and
            a dampening-period interval (which may be zero) has
            elapsed since the previous update record creation for
            a receiver, any subscribed objects and properties
            that have changed since the previous update record
            will have their current values marshalled and placed
            in a new update record.";
      }
      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.";
      }
      leaf-list excluded-change {
        type yp:change-type;
        description
          "Used to restrict which changes trigger an update.  For
           example, if a 'replace' operation is excluded, only the
           creation and deletion of objects are reported.

           TODO - Do we want this leaf?";
      }
    }
  }

  grouping common-notification-format {
    description
      "This grouping describes the common-notif-format leaf that
       controls whether the new common message format is used for periodic
       and on-change notifications.";
    leaf common-notification-format {
      type boolean;
      default "false";
      description
        "This leaf controls whether the new common message format
         is used for periodic and on-change notifications.  If set
         to 'true', the new common message format is used.  If set
         to 'false', the old message format is used.
         
         TODO - Should we support hierarchical configuration here
         (e.g., also add the leaf to the subscription container,
         or it could be added to the receiver instead)?";
    }
  }

  /*
   * RPCs
   */

  /*
   * NOTIFICATIONS
   */

  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.  It does not constitute
       a general-purpose notification that would be subscribable as
       part of the NETCONF event stream by any receiver.";
    leaf id {
      type sn:subscription-id;
      description
        "This references the subscription that drove the
         notification to be sent.";
    }

    leaf subscription-path {
      type yang:xpath1.0;
      description
        "The subscription path indicates the schema path from the root of the
         schema tree to the node, for which the updated state is being
         notified, or a notification that is has been deleted.

         TODO - Make this an instance data ref";
    }

    leaf target-path {
      type string;
    }

    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.";
        }
      }
      description
        "This indicates the type of notification message that is being sent.";
    }

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

    anydata datastore-snapshot {
      description
        "This 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.

        Used for snapshot types except for 'on-change-delete'.";
    }

    leaf incomplete {
      type empty;
      description
        "This is a flag that indicates that not all datastore
        nodes subscribed to are included with this update.  Receivers
        of this data SHOULD NOT assume that any missing data has been
        implicitly deleted.

        TODO - Do we still want this flag, or would it be
        better to notify this event out of band?";
    }
  }

  augment "/sn:subscription-started/yp:update-trigger" {
    if-feature "yp:on-change";
    description
      "Allow a subscription started notification to signal a
       combined periodic and on-change subscription.";
    case periodic-and-on-change {
      uses periodic-and-on-change;
    }
  }

  augment "/sn:subscription-started" {
    description
      "Allow a subscription started notification to signal that it
       uses the common notification format.";
    uses common-notification-format;
  }

  augment "/sn:subscription-modified/yp:update-trigger" {
    if-feature "yp:on-change";
    description
      "Allow a subscription started notification to signal a
       combined periodic and on-change subscription.";
    case periodic-and-on-change {
      uses periodic-and-on-change;
    }
  }

  augment "/sn:subscription-modified" {
    description
      "Allow a subscription modified notification to signal that it
       uses the common notification format.";
    uses common-notification-format;
  }

  /*
   * DATA NODES
   */

  augment "/sn:subscriptions/sn:subscription/yp:update-trigger" {
    when 'yp:datastore';
    if-feature "yp:on-change";
    description
      "This augmentation adds objects to a subscription that are
       specific to a datastore subscription, i.e., a subscription to
       a stream of datastore node updates.";
    case periodic-and-on-change {
      uses periodic-and-on-change;
    }
  }

  augment "/sn:subscriptions/sn:subscription" {
    uses common-notification-format;
  }
}
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO.  New YANG models will be defined that need to document their security considerations, but otherwise the security considerations in YANG-Push should be sufficient.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TODO - This document will need to register new YANG models with IANA.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This inital 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>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-nmop-network-anomaly-architecture">
          <front>
            <title>An Architecture for a Network Anomaly Detection Framework</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>
            <date day="20" month="October" year="2024"/>
            <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 generic applicable and extensible.  Different
   applications are being described and exampled with open-source
   running code.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-nmop-network-anomaly-architecture-01"/>
        </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="19" month="October" year="2024"/>
            <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-05"/>
        </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="Eventual_Consistency" 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="I-D.ietf-netconf-distributed-notif">
          <front>
            <title>Subscription to Distributed Notifications</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="18" month="October" year="2024"/>
            <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.


              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-distributed-notif-10"/>
        </reference>
        <reference anchor="I-D.netana-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>Huawei</organization>
            </author>
            <date day="18" month="October" year="2024"/>
            <abstract>
              <t>   This document defines a new extensible notification structure,
   defined in YANG, for use in YANG-Push Notification messages enabling
   any YANG compatible encodings such as XML, JSON or CBOR.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-netana-netconf-notif-envelope-00"/>
        </reference>
        <reference anchor="RFC6536">
          <front>
            <title>Network Configuration Protocol (NETCONF) Access Control Model</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="March" year="2012"/>
            <abstract>
              <t>The standardization of network configuration interfaces for use with the Network Configuration Protocol (NETCONF) 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 protocol access for particular users to a pre-configured subset of all available NETCONF protocol operations and content. This document defines such an access control model. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6536"/>
          <seriesInfo name="DOI" value="10.17487/RFC6536"/>
        </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="RFC9535">
          <front>
            <title>JSONPath: Query Expressions for JSON</title>
            <author fullname="S. Gössner" initials="S." role="editor" surname="Gössner"/>
            <author fullname="G. Normington" initials="G." role="editor" surname="Normington"/>
            <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>JSONPath defines a string syntax for selecting and extracting JSON (RFC 8259) values from within a given JSON value.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9535"/>
          <seriesInfo name="DOI" value="10.17487/RFC9535"/>
        </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="3" month="July" 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-02"/>
        </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>
      </references>
    </references>
    <?line 579?>

<section anchor="combined-yang-tree">
      <name>Combined YANG tree</name>
      <t>This section shows the relevant subsets of the combined Subscribed Notification YANG trees that are augmented by the ietf-yp-ext.yang additions.</t>
      <figure>
        <name>YANG tree for ietf-subscribed-notifications.yang with ietf-yang-push.yang and ietf-yp-ext.yang (and a couple of others).</name>
        <sourcecode type="yangtree"><![CDATA[
module: ietf-subscribed-notifications
  +--ro streams
  |  +--ro stream* [name]
  |     +--ro name                        string
  |     +--ro description?                string
  |     +--ro replay-support?             empty {replay}?
  |     +--ro replay-log-creation-time    yang:date-and-time
  |     |       {replay}?
  |     +--ro replay-log-aged-time?       yang:date-and-time
  |             {replay}?
  +--rw filters
  |  +--rw stream-filter* [name]
  |  |  +--rw name                           string
  |  |  +--rw (filter-spec)?
  |  |     +--:(stream-subtree-filter)
  |  |     |  +--rw stream-subtree-filter?   <anydata> {subtree}?
  |  |     +--:(stream-xpath-filter)
  |  |        +--rw stream-xpath-filter?     yang:xpath1.0 {xpath}?
  |  +--rw yp:selection-filter* [filter-id]
  |     +--rw yp:filter-id                         string
  |     +--rw (yp:filter-spec)?
  |        +--:(yp:datastore-subtree-filter)
  |        |  +--rw yp:datastore-subtree-filter?   <anydata>
  |        |          {sn:subtree}?
  |        +--:(yp:datastore-xpath-filter)
  |           +--rw yp:datastore-xpath-filter?     yang:xpath1.0
  |                   {sn:xpath}?
  +--rw subscriptions
     +--rw subscription* [id]
     |  +--rw id
     |  |       subscription-id
     |  +--rw (target)
     |  |  +--:(stream)
     |  |  |  +--rw (stream-filter)?
     |  |  |  |  +--:(by-reference)
     |  |  |  |  |  +--rw stream-filter-name
     |  |  |  |  |          stream-filter-ref
     |  |  |  |  +--:(within-subscription)
     |  |  |  |     +--rw (filter-spec)?
     |  |  |  |        +--:(stream-subtree-filter)
     |  |  |  |        |  +--rw stream-subtree-filter?
     |  |  |  |        |          <anydata> {subtree}?
     |  |  |  |        +--:(stream-xpath-filter)
     |  |  |  |           +--rw stream-xpath-filter?
     |  |  |  |                   yang:xpath1.0 {xpath}?
     |  |  |  +--rw stream
     |  |  |  |       stream-ref
     |  |  |  +--ro replay-start-time?
     |  |  |  |       yang:date-and-time {replay}?
     |  |  |  +--rw configured-replay?                         empty
     |  |  |          {configured,replay}?
     |  |  +--:(yp:datastore)
     |  |     +--rw yp:datastore
     |  |     |       identityref
     |  |     +--rw (yp:selection-filter)?
     |  |        +--:(yp:by-reference)
     |  |        |  +--rw yp:selection-filter-ref
     |  |        |          selection-filter-ref
     |  |        +--:(yp:within-subscription)
     |  |           +--rw (yp:filter-spec)?
     |  |              +--:(yp:datastore-subtree-filter)
     |  |              |  +--rw yp:datastore-subtree-filter?
     |  |              |          <anydata> {sn:subtree}?
     |  |              +--:(yp:datastore-xpath-filter)
     |  |                 +--rw yp:datastore-xpath-filter?
     |  |                         yang:xpath1.0 {sn:xpath}?
     |  +--rw stop-time?
     |  |       yang:date-and-time
     |  +--rw dscp?
     |  |       inet:dscp {dscp}?
     |  +--rw weighting?                                       uint8
     |  |       {qos}?
     |  +--rw dependency?
     |  |       subscription-id {qos}?
     |  +--rw transport?
     |  |       transport {configured}?
     |  +--rw encoding?
     |  |       encoding
     |  +--rw purpose?                                         string
     |  |       {configured}?
     |  +--rw (notification-message-origin)? {configured}?
     |  |  +--:(interface-originated)
     |  |  |  +--rw source-interface?
     |  |  |          if:interface-ref {interface-designation}?
     |  |  +--:(address-originated)
     |  |     +--rw source-vrf?
     |  |     |       -> /ni:network-instances/network-instance/name
     |  |     |       {supports-vrf}?
     |  |     +--rw source-address?
     |  |             inet:ip-address-no-zone
     |  +--ro configured-subscription-state?
     |  |       enumeration {configured}?
     |  +--rw receivers
     |  |  +--rw receiver* [name]
     |  |     +--rw name                         string
     |  |     +--ro sent-event-records?
     |  |     |       yang:zero-based-counter64
     |  |     +--ro excluded-event-records?
     |  |     |       yang:zero-based-counter64
     |  |     +--ro state                        enumeration
     |  |     +---x reset {configured}?
     |  |     |  +--ro output
     |  |     |     +--ro time    yang:date-and-time
     |  |     +--rw snr:receiver-instance-ref?   leafref
     |  +--rw (yp:update-trigger)?
     |  |  +--:(yp:periodic)
     |  |  |  +--rw yp:periodic!
     |  |  |     +--rw yp:period         centiseconds
     |  |  |     +--rw yp:anchor-time?   yang:date-and-time
     |  |  +--:(yp:on-change) {on-change}?
     |  |  |  +--rw yp:on-change!
     |  |  |     +--rw yp:dampening-period?   centiseconds
     |  |  |     +--rw yp:sync-on-start?      boolean
     |  |  |     +--rw yp:excluded-change*    change-type
     |  |  +--:(yp-ext:periodic-and-on-change) {yp:on-change}?
     |  |     +--rw yp-ext:periodic-and-on-change!
     |  |        +--rw yp-ext:period              yp:centiseconds
     |  |        +--rw yp-ext:anchor-time?        yang:date-and-time
     |  |        +--rw yp-ext:dampening-period?   yp:centiseconds
     |  |        +--rw yp-ext:sync-on-start?      boolean
     |  |        +--rw yp-ext:excluded-change*    yp:change-type
     |  +--ro dn:message-publisher-ids*                        uint32
     |  +--rw yp-ext:common-notification-format?
     |          boolean
     +--rw snr:receiver-instances
        +--rw snr:receiver-instance* [name]
           +--rw snr:name                        string
           +--rw (snr:transport-type)
              +--:(hnt:https)
              |  +--rw hnt:https-receiver
              |     +--rw hnt:receiver-identity {receiver-identity}?
              |        +--rw hnt:cert-maps
              |           +--rw hnt:cert-to-name* [id]
              |              +--rw hnt:id             uint32
              |              +--rw hnt:fingerprint
              |              |       x509c2n:tls-fingerprint
              |              +--rw hnt:map-type       identityref
              |              +--rw hnt:name           string
              +--:(unt:udp-notif)
                 +--rw unt:udp-notif-receiver
                    +--rw unt:dtls! {dtls13}?
                    +--rw unt:enable-segmentation?   boolean
                    |       {segmentation}?
                    +--rw unt:max-segment-size?      uint32
                            {segmentation}?

  rpcs:
    +---x establish-subscription
    |  +---w input
    ...

  notifications:
    +---n replay-completed {replay}?
    |  ...
    +---n subscription-completed {configured}?
    |  ...
    +---n subscription-modified
    |  +--ro id
    |  |       subscription-id
    |  +--ro (target)
    |  |  +--:(stream)
    |  |  |  +--ro (stream-filter)?
    |  |  |  |  +--:(by-reference)
    |  |  |  |  |  +--ro stream-filter-name
    |  |  |  |  |          stream-filter-ref
    |  |  |  |  +--:(within-subscription)
    |  |  |  |     +--ro (filter-spec)?
    |  |  |  |        +--:(stream-subtree-filter)
    |  |  |  |        |  +--ro stream-subtree-filter?
    |  |  |  |        |          <anydata> {subtree}?
    |  |  |  |        +--:(stream-xpath-filter)
    |  |  |  |           +--ro stream-xpath-filter?
    |  |  |  |                   yang:xpath1.0 {xpath}?
    |  |  |  +--ro stream
    |  |  |  |       stream-ref
    |  |  |  +--ro replay-start-time?
    |  |  |          yang:date-and-time {replay}?
    |  |  +--:(yp:datastore)
    |  |     +--ro yp:datastore
    |  |     |       identityref
    |  |     +--ro (yp:selection-filter)?
    |  |        +--:(yp:by-reference)
    |  |        |  +--ro yp:selection-filter-ref
    |  |        |          selection-filter-ref
    |  |        +--:(yp:within-subscription)
    |  |           +--ro (yp:filter-spec)?
    |  |              +--:(yp:datastore-subtree-filter)
    |  |              |  +--ro yp:datastore-subtree-filter?
    |  |              |          <anydata> {sn:subtree}?
    |  |              +--:(yp:datastore-xpath-filter)
    |  |                 +--ro yp:datastore-xpath-filter?
    |  |                         yang:xpath1.0 {sn:xpath}?
    |  +--ro stop-time?
    |  |       yang:date-and-time
    |  +--ro dscp?
    |  |       inet:dscp {dscp}?
    |  +--ro weighting?                                       uint8
    |  |       {qos}?
    |  +--ro dependency?
    |  |       subscription-id {qos}?
    |  +--ro transport?
    |  |       transport {configured}?
    |  +--ro encoding?
    |  |       encoding
    |  +--ro purpose?                                         string
    |  |       {configured}?
    |  +--ro (yp:update-trigger)?
    |  |  +--:(yp:periodic)
    |  |  |  +--ro yp:periodic!
    |  |  |     +--ro yp:period         centiseconds
    |  |  |     +--ro yp:anchor-time?   yang:date-and-time
    |  |  +--:(yp:on-change) {on-change}?
    |  |  |  +--ro yp:on-change!
    |  |  |     +--ro yp:dampening-period?   centiseconds
    |  |  |     +--ro yp:sync-on-start?      boolean
    |  |  |     +--ro yp:excluded-change*    change-type
    |  |  +--:(yp-ext:periodic-and-on-change) {yp:on-change}?
    |  |     +--ro yp-ext:periodic-and-on-change!
    |  |        +--ro yp-ext:period              yp:centiseconds
    |  |        +--ro yp-ext:anchor-time?        yang:date-and-time
    |  |        +--ro yp-ext:dampening-period?   yp:centiseconds
    |  |        +--ro yp-ext:sync-on-start?      boolean
    |  |        +--ro yp-ext:excluded-change*    yp:change-type
    |  +--ro dn:message-publisher-ids*                        uint32
    |  +--ro yp-ext:common-notification-format?               boolean
    +---n subscription-resumed
    |  ...
    +---n subscription-started {configured}?
    |  +--ro id
    |  |       subscription-id
    |  +--ro (target)
    |  |  +--:(stream)
    |  |  |  +--ro (stream-filter)?
    |  |  |  |  +--:(by-reference)
    |  |  |  |  |  +--ro stream-filter-name
    |  |  |  |  |          stream-filter-ref
    |  |  |  |  +--:(within-subscription)
    |  |  |  |     +--ro (filter-spec)?
    |  |  |  |        +--:(stream-subtree-filter)
    |  |  |  |        |  +--ro stream-subtree-filter?
    |  |  |  |        |          <anydata> {subtree}?
    |  |  |  |        +--:(stream-xpath-filter)
    |  |  |  |           +--ro stream-xpath-filter?
    |  |  |  |                   yang:xpath1.0 {xpath}?
    |  |  |  +--ro stream
    |  |  |  |       stream-ref
    |  |  |  +--ro replay-start-time?
    |  |  |  |       yang:date-and-time {replay}?
    |  |  |  +--ro replay-previous-event-time?
    |  |  |          yang:date-and-time {replay}?
    |  |  +--:(yp:datastore)
    |  |     +--ro yp:datastore
    |  |     |       identityref
    |  |     +--ro (yp:selection-filter)?
    |  |        +--:(yp:by-reference)
    |  |        |  +--ro yp:selection-filter-ref
    |  |        |          selection-filter-ref
    |  |        +--:(yp:within-subscription)
    |  |           +--ro (yp:filter-spec)?
    |  |              +--:(yp:datastore-subtree-filter)
    |  |              |  +--ro yp:datastore-subtree-filter?
    |  |              |          <anydata> {sn:subtree}?
    |  |              +--:(yp:datastore-xpath-filter)
    |  |                 +--ro yp:datastore-xpath-filter?
    |  |                         yang:xpath1.0 {sn:xpath}?
    |  +--ro stop-time?
    |  |       yang:date-and-time
    |  +--ro dscp?
    |  |       inet:dscp {dscp}?
    |  +--ro weighting?                                       uint8
    |  |       {qos}?
    |  +--ro dependency?
    |  |       subscription-id {qos}?
    |  +--ro transport?
    |  |       transport {configured}?
    |  +--ro encoding?
    |  |       encoding
    |  +--ro purpose?                                         string
    |  |       {configured}?
    |  +--ro (yp:update-trigger)?
    |  |  +--:(yp:periodic)
    |  |  |  +--ro yp:periodic!
    |  |  |     +--ro yp:period         centiseconds
    |  |  |     +--ro yp:anchor-time?   yang:date-and-time
    |  |  +--:(yp:on-change) {on-change}?
    |  |  |  +--ro yp:on-change!
    |  |  |     +--ro yp:dampening-period?   centiseconds
    |  |  |     +--ro yp:sync-on-start?      boolean
    |  |  |     +--ro yp:excluded-change*    change-type
    |  |  +--:(yp-ext:periodic-and-on-change) {yp:on-change}?
    |  |     +--ro yp-ext:periodic-and-on-change!
    |  |        +--ro yp-ext:period              yp:centiseconds
    |  |        +--ro yp-ext:anchor-time?        yang:date-and-time
    |  |        +--ro yp-ext:dampening-period?   yp:centiseconds
    |  |        +--ro yp-ext:sync-on-start?      boolean
    |  |        +--ro yp-ext:excluded-change*    yp:change-type
    |  +--ro dn:message-publisher-ids*                        uint32
    |  +--ro yp-ext:common-notification-format?               boolean
    +---n subscription-suspended
    |  +--ro id        subscription-id
    |  +--ro reason    identityref
    +---n subscription-terminated
       +--ro id        subscription-id
       +--ro reason    identityref

module: ietf-yp-ext

  notifications:
    +---n update
       +--ro id?                   sn:subscription-id
       +--ro subscription-path?    yang:xpath1.0
       +--ro target-path?          string
       +--ro snapshot-type?        enumeration
       +--ro observation-time?     yang:date-and-time
       +--ro datastore-snapshot?   <anydata>
       +--ro incomplete?           empty
]]></sourcecode>
      </figure>
    </section>
    <section anchor="Examples">
      <name>Examples</name>
      <t>Notes on examples:</t>
      <ul spacing="normal">
        <li>
          <t>These examples have been given using a JSON encoding of the regular YANG-Push notification format, i.e., encoded using <xref target="RFC5277"/>, but it is anticipated that these notifications could be defined to exclusive use the new format proposed by <xref target="I-D.netana-netconf-notif-envelope"/>.</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-an-rfc8641-style-push-update-notification">
        <name>Example of an <xref target="RFC8641"/> style push-update notification</name>
        <t>This example illustrates a periodic update message for a subscription at "Cisco-IOS-XR-pfi-im-cmd-oper:interfaces" that is returning data from two internal data providers, one of which is returning data for "interface-summary" and the other that is returning data for "interfaces".  The device resident management agents stitches the reply together from the two data providers into a single data tree before returning it in a single message.</t>
        <t>For the periodic message to be correct, and to allow it to replace any previous periodic message published on that subscription, it must include <strong>all</strong> data below the subscription path.  This may increase the total amount of internal IPC within the device and make the timestamps less accurate, since the observation timestamp only reports when the device starts polling the data providers.  If those providers are distributed across multiple processes and linecards then it may take a bit of time to complete the periodic on-change.</t>
        <artwork><![CDATA[
{
  "ietf-notification:notification": {
    "eventTime": "2024-09-27T14:16:27.773Z",
    "ietf-yang-push:push-update": {
      "id": 1,
      "ietf-yp-observation:timestamp": "2024-09-27T14:16:27.773Z",
      "ietf-yp-observation:point-in-time": "current-accounting",
      "datastore-contents": {
        "Cisco-IOS-XR-pfi-im-cmd-oper:interfaces": {
          "interface-summary": {
            "interface-type": [
              {
                "interface-type-name": "IFT_GETHERNET",
                "interface-type-description": "GigabitEthernet",
                "interface-counts": {
                  "interface-count": 5,
                  "up-interface-count": 2,
                  "down-interface-count": 0,
                  "admin-down-interface-count": 3
                }
              }
            ],
            "interface-counts": {
              "interface-count": 8,
              "up-interface-count": 5,
              "down-interface-count": 0,
              "admin-down-interface-count": 3
            }
          },
          "interfaces": {
            "interface": [
              {
                "interface-name": "GigabitEthernet0/0/0/0",
                "interface": "GigabitEthernet0/0/0/0",
                "state": "im-state-admin-down",
                "line-state": "im-state-admin-down"
              },
              {
                "interface-name": "GigabitEthernet0/0/0/4",
                "interface": "GigabitEthernet0/0/0/4",
                "state": "im-state-admin-down",
                "line-state": "im-state-admin-down"
              },
            ]
          }
        }
      }
    }
  }
}
]]></artwork>
      </section>
      <section anchor="example-of-periodic-updates-using-the-new-style-update-message">
        <name>Example of periodic updates using the new style update message.</name>
        <t>The subscription was made on "Cisco-IOS-XR-pfi-im-cmd-oper:interfaces", but for efficiency reasons, the device has split the subscription into separate child subscriptions for the different data providers, and makes use of the new message format.</t>
        <t>Hence, this first periodic message is being published for the "Cisco-IOS-XR-pfi-im-cmd-oper:interfaces/interface-summary" container, but it is encoded rooted relative to the schema for "Cisco-IOS-XR-pfi-im-cmd-oper:interfaces".</t>
        <artwork><![CDATA[
{
  "ietf-notification:notification": {
    "eventTime": "2024-09-27T14:16:27.773Z",
    "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/interface-summary",
      "snapshot-type": "periodic"
      "observation-time": "2024-09-27T14:16:27.773Z",
      "datastore-snapshot": {
        "interface-summary" : {
          "interface-type": [
            {
              "interface-type-name": "IFT_GETHERNET",
              "interface-type-description": "GigabitEthernet",
              "interface-counts": {
                "interface-count": 5,
                "up-interface-count": 2,
                "down-interface-count": 0,
                "admin-down-interface-count": 3
              }
            }
          ],
          "interface-counts": {
            "interface-count": 8,
            "up-interface-count": 5,
            "down-interface-count": 0,
            "admin-down-interface-count": 3
          }
        }
      }
    }
  }
}
]]></artwork>
        <t>The second periodic message is being published for the "Cisco-IOS-XR-pfi-im-cmd-oper:interfaces/interfaces/interface" list, but again, it is encoded rooted relative to the schema for "Cisco-IOS-XR-pfi-im-cmd-oper:interfaces".  This message has a separate observation time that represents the more accurate time that this periodic date was read.</t>
        <artwork><![CDATA[
{
  "ietf-notification:notification": {
    "eventTime": "2024-09-27T14:16:27.973Z",
    "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[]",
      "snapshot-type": "periodic"
      "observation-time": "2024-09-27T14:16:27.973Z",
      "datastore-snapshot": {
        "interfaces": {
          "interface": [
            {
              "interface-name": "GigabitEthernet0/0/0/0",
              "interface": "GigabitEthernet0/0/0/0",
              "state": "im-state-admin-down",
              "line-state": "im-state-admin-down"
            },
            {
              "interface-name": "GigabitEthernet0/0/0/4",
              "interface": "GigabitEthernet0/0/0/4",
              "state": "im-state-admin-down",
              "line-state": "im-state-admin-down"
            },
          ]
        }
      }
    }
  }
}
]]></artwork>
        <t>Each child subscription would use the same period and anchor time as the configured subscription, possibly with a little bit of initial jitter to avoid all daemons attempting to publish the data at exactly the same time.</t>
      </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>
        <artwork><![CDATA[
{
  "ietf-notification:notification": {
    "eventTime": "2024-09-27T14:16:30.973Z",
    "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"
            }
          ]
        }
      }
    }
  }
}
]]></artwork>
      </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>
        <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.  Of note:</t>
        <ul spacing="normal">
          <li>
            <t>The on-change-delete snapshot type doesn't include a "datastore-snapshot", instead it represents a delete of the list entry at the path identified by the target-path, which is similar to a YANG Patch delete notification.</t>
          </li>
        </ul>
        <artwork><![CDATA[
{
  "ietf-notification:notification": {
    "eventTime": "2024-09-27T14:16:40.973Z",
    "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-delete"
      "observation-time": "2024-09-27T14:16:40.973Z",
    }
  }
}
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
