<?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 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wilton-netconf-yp-observability-01" 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-01"/>
    <author fullname="Robert Wilton">
      <organization>Cisco Systems</organization>
      <address>
        <email>rwilton@cisco.com</email>
      </address>
    </author>
    <date year="2025" month="January" day="09"/>
    <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 65?>

<t><strong>This version of the document is aimed to be a base reference point to compare against to see how YANG Push Lite compares to the two core RFCs <xref target="RFC8639"/> &amp; <xref target="RFC8641"/> that it is based on.  The next draft revision would serve as a better starting point to see the proposed protocol &amp; data model for YANG Push Lite.</strong></t>
      <t>YANG Push Lite is a simplified specification of YANG Push, specifically optimized for observability of operational data.</t>
      <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 73?>

<section anchor="document-status">
      <name>Document Status</name>
      <t><strong>PLEASE READ - This version of the document is aimed to be a base reference point () to compare against to see how YANG Push Lite compares to the two core RFCs <xref target="RFC8639"/> &amp; <xref target="RFC8641"/> that it is based on.  The next draft revision would serve as a better starting point to see the proposed protocol &amp; data model for YANG Push Lite.</strong></t>
      <t>Based on the feedback received during the IETF 121 NETCONF session, this document has currently been written as a self-contained lightweight replacement for <xref target="RFC8639"/> and <xref target="RFC8641"/>, defining a separate configuration data model.  It leverages <xref target="I-D.draft-netana-netconf-notif-envelope"/> as the envelope for the generated notifications with a new update message format.</t>
    </section>
    <section anchor="acknowledgement-to-the-authors-of-rfc-8639-and-rfc-8641">
      <name>Acknowledgement to the authors of RFC 8639 and RFC 8641</name>
      <t>This document is intended to be a lightweight alternative for <xref target="RFC8639"/> and <xref target="RFC8641"/>, but it intentionally reuses substantial part of the design and data model of those RFCs.</t>
      <t>For ease of reference, this document, at least initially, sources most of the text and basis for the YANG model directly from those RFCs, rather than creating a separate document that would contain numerous references.</t>
      <t>Hence, the authors of this draft would like to thank and acknowledge the very significant previous work by the authors and of those RFCs, i.e., Eric Voit, Alex Clemm, Alberto Gonzalez Prieto, Einar Nilsen-Nygaard, Ambika Prasad Tripathy, and also all those who contributed to the underlying work upon which this document is heavily based.</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-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 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>
      <section anchor="introduction-text-from-subscribed-notifications-rfc-8639">
        <name>Introduction text from Subscribed Notifications (RFC 8639)</name>
        <t>This document defines a YANG data model and associated mechanisms
enabling subscriber-specific subscriptions to a publisher's event
streams.  This effectively enables a "subscribe, then publish"
capability where the customized information needs and access
permissions of each target receiver are understood by the publisher
before subscribed event records are marshaled and pushed.  The
receiver then gets a continuous, customized feed of
publisher-generated information.</t>
        <t>While the functionality defined in this document is transport
agnostic, transports like the Network Configuration Protocol
(NETCONF) [RFC6241] or RESTCONF [RFC8040] can be used to configure or
dynamically signal subscriptions.  Bindings for subscribed event
record delivery for NETCONF and RESTCONF are defined in [RFC8640] and
[RESTCONF-Notif], respectively.</t>
        <t>The YANG data model defined in this document conforms to the Network
Management Datastore Architecture defined in <xref target="RFC8342"/>.</t>
        <section anchor="motivation">
          <name>Motivation</name>
          <t>Various limitations to subscriptions as described in [RFC5277] were
alleviated to some extent by the requirements provided in [RFC7923].
Resolving any remaining issues is the primary motivation for this
work.  Key capabilities supported by this document include:</t>
          <ul spacing="normal">
            <li>
              <t>multiple subscriptions on a single transport session</t>
            </li>
            <li>
              <t>support for dynamic and configured subscriptions</t>
            </li>
            <li>
              <t>modification of an existing subscription in progress</t>
            </li>
            <li>
              <t>per-subscription operational counters</t>
            </li>
            <li>
              <t>negotiation of subscription parameters (through the use of hints
returned as part of declined subscription requests)</t>
            </li>
            <li>
              <t>subscription state change notifications (e.g., publisher-driven
suspension, parameter modification)</t>
            </li>
            <li>
              <t>independence from transport</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="introduction-text-from-yang-push-rfc-8641">
        <name>Introduction text from YANG Push (RFC 8641)</name>
        <t>Traditional approaches for providing visibility into managed entities
from a remote system have been built on polling.  With polling, data
is periodically requested and retrieved by a client from a server to
stay up to date.  However, there are issues associated with polling-
based management:</t>
        <ul spacing="normal">
          <li>
            <t>Polling incurs significant latency.  This latency prohibits many
    types of applications.</t>
          </li>
          <li>
            <t>Polling cycles may be missed, and requests may be delayed or get
    lost -- often when the network is under stress and the need for
    the data is the greatest.</t>
          </li>
          <li>
            <t>Polling requests may undergo slight fluctuations, resulting in
    intervals of different lengths.  The resulting data is difficult
    to calibrate and compare.</t>
          </li>
          <li>
            <t>For applications that monitor for changes, many remote polling
    cycles place unwanted and ultimately wasteful load on the network,
    devices, and applications, particularly when changes occur only
    infrequently.</t>
          </li>
        </ul>
        <t>A more effective alternative to polling is for an application to
receive automatic and continuous updates from a targeted subset of a
datastore.  Accordingly, there is a need for a service that
(1) allows applications to subscribe to updates from a datastore and
(2) enables the server (also referred to as the "publisher") to push
and, in effect, stream those updates.  The requirements for such a
service have been documented in [RFC7923].</t>
        <t>This document defines a corresponding solution that is built on
top of <xref target="RFC8639"/>.  Supplementing that work are YANG data model
augmentations, extended RPCs, and new datastore-specific update
notifications.  Transport options provided in <xref target="RFC8639"/> will work
seamlessly with this solution.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<section anchor="definitions-taken-from-subscribed-notifications-rfc-8639">
        <name>Definitions taken from Subscribed Notifications (RFC 8639)</name>
        <ul spacing="normal">
          <li>
            <t>Client: Defined in <xref target="RFC8342"/>.</t>
          </li>
          <li>
            <t>Configuration: Defined in <xref target="RFC8342"/>.</t>
          </li>
          <li>
            <t>Configuration datastore: Defined in <xref target="RFC8342"/>.</t>
          </li>
          <li>
            <t>Configured subscription: A subscription installed via
configuration into a configuration datastore.</t>
          </li>
          <li>
            <t>Dynamic subscription: A subscription created dynamically by a
subscriber via a Remote Procedure Call (RPC).</t>
          </li>
          <li>
            <t>Event: 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>Event occurrence time: A timestamp matching the time an
originating process identified as when an event happened.</t>
          </li>
          <li>
            <t>Event record: A set of information detailing an event.</t>
          </li>
          <li>
            <t>Event stream: A continuous, chronologically ordered set of events
aggregated under some context.</t>
          </li>
          <li>
            <t>Event stream filter: 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>Notification message: Information intended for a receiver
indicating that one or more events have occurred.</t>
          </li>
          <li>
            <t>Publisher: An entity responsible for streaming notification
messages per the terms of a subscription.</t>
          </li>
          <li>
            <t>Receiver: 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>Subscriber: 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>
          <li>
            <t>Subscription: A contract with a publisher, stipulating the
information that one or more receivers wish to have pushed from
the publisher without the need for further solicitation.</t>
          </li>
        </ul>
        <t>All YANG tree diagrams used in this document follow the notation
defined in <xref target="RFC8340"/>.</t>
      </section>
      <section anchor="definitions-taken-from-yang-push-rfc-8641">
        <name>Definitions taken from YANG Push (RFC 8641)</name>
        <t>This document uses the terminology defined in [RFC7950], <xref target="RFC8341"/>,
<xref target="RFC8342"/>, and <xref target="RFC8639"/>.  In addition, this document defines the
following terms:</t>
        <ul spacing="normal">
          <li>
            <t>Datastore node: 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>Datastore node update: 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>Datastore subscription: A subscription to a stream of datastore
  node updates.</t>
          </li>
          <li>
            <t>Datastore subtree: A datastore node and all its descendant
  datastore nodes.</t>
          </li>
          <li>
            <t>On-change subscription: A datastore subscription with updates that
  are triggered when changes in subscribed datastore nodes are
  detected.</t>
          </li>
          <li>
            <t>Periodic subscription: A datastore subscription with updates that
  are triggered periodically according to some time interval.</t>
          </li>
          <li>
            <t>Selection filter: Evaluation and/or selection criteria that may be
  applied against a targeted set of objects.</t>
          </li>
          <li>
            <t>Update record: 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>Update trigger: A mechanism that determines when an update record
  needs to be generated.</t>
          </li>
          <li>
            <t>YANG-Push: The subscription and push mechanism for datastore
  updates that is specified in this document.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="subscribed-notifications-solution-overview-all-from-rfc-8639">
      <name>Subscribed Notifications Solution Overview (all from RFC 8639)</name>
      <t>This document describes a transport-agnostic mechanism for
subscribing to and receiving content from an event stream in a
publisher.  This mechanism operates through the use of a
subscription.</t>
      <t>Two types of subscriptions are supported:</t>
      <ol spacing="normal" type="1"><li>
          <t>Dynamic subscriptions, where a subscriber initiates a
 subscription negotiation with a publisher via an RPC.  If the
 publisher is able to serve this request, it accepts it and then
 starts pushing notification messages back to the subscriber.  If
 the publisher is not able to serve it as requested, then an error
 response is returned.  This response <bcp14>MAY</bcp14> include hints for
 subscription parameters that, had they been present, may have
 enabled the dynamic subscription request to be accepted.</t>
        </li>
        <li>
          <t>Configured subscriptions, which allow the management of
 subscriptions via a configuration so that a publisher can send
 notification messages to a receiver.  Support for configured
 subscriptions is optional, with its availability advertised via a
 YANG feature.</t>
        </li>
      </ol>
      <t>Additional characteristics differentiating configured from dynamic
subscriptions include the following:</t>
      <ul spacing="normal">
        <li>
          <t>The lifetime of a dynamic subscription is bound by the transport
session used to establish it.  For connection-oriented stateful
transports like NETCONF, the loss of the transport session will
result in the immediate termination of any associated dynamic
subscriptions.  For connectionless or stateless transports like
HTTP, a lack of receipt acknowledgment of a sequential set of
notification messages and/or keep-alives can be used to trigger a
termination of a dynamic subscription.  Contrast this to the
lifetime of a configured subscription.  This lifetime is driven by
relevant configuration being present in the publisher's applied
configuration.  Being tied to configuration operations implies
that (1) configured subscriptions can be configured to persist
across reboots and (2) a configured subscription can persist even
when its publisher is fully disconnected from any network.</t>
        </li>
        <li>
          <t>Configured subscriptions can be modified by any configuration
client with write permission on the configuration of the
subscription.  Dynamic subscriptions can only be modified via an
RPC request made by the original subscriber or by a change to
configuration data referenced by the subscription.</t>
        </li>
      </ul>
      <t>Note that there is no mixing and matching of dynamic and configured
operations on a single subscription.  Specifically, a configured
subscription cannot be modified or deleted using RPCs defined in this
document.  Similarly, a dynamic subscription cannot be directly
modified or deleted by configuration operations.  It is, however,
possible to perform a configuration operation that indirectly impacts
a dynamic subscription.  By changing the value of a preconfigured
filter referenced by an existing dynamic subscription, the selected
event records passed to a receiver might change.</t>
      <t>Also note that transport-specific specifications based on this
specification <bcp14>MUST</bcp14> detail the lifecycle of dynamic subscriptions as
well as the lifecycle of configured subscriptions (if supported).</t>
      <t>A publisher <bcp14>MAY</bcp14> terminate a dynamic subscription at any time.
Similarly, it <bcp14>MAY</bcp14> decide to temporarily suspend the sending of
notification messages for any dynamic subscription, or for one or
more receivers of a configured subscription.  Such termination or
suspension is driven by internal considerations of the publisher.</t>
      <section anchor="relationship-to-rfc-5277">
        <name>Relationship to RFC 5277</name>
        <t>This document is intended to provide a superset of the subscription
capabilities initially defined in [RFC5277].  It is important to
understand what has been reused and what has been replaced,
especially when extending an existing implementation that is based on
[RFC5277].  Key relationships between these two documents include the
following:</t>
        <ul spacing="normal">
          <li>
            <t>This document defines a transport-independent capability;
[RFC5277] is specific to NETCONF.</t>
          </li>
          <li>
            <t>For the new operations, the data model defined in this document is
used instead of the data model defined in Section 3.4 of
[RFC5277].</t>
          </li>
          <li>
            <t>The RPC operations in this document replace the operation
&lt;create-subscription&gt; as defined in [RFC5277], Section 4.</t>
          </li>
          <li>
            <t>The &lt;notification&gt; message of [RFC5277], Section 4 is used.</t>
          </li>
          <li>
            <t>The included contents of the "NETCONF" event stream are identical
between this document and [RFC5277].</t>
          </li>
          <li>
            <t>A publisher <bcp14>MAY</bcp14> implement both the Notification Management Schema
and RPCs defined in [RFC5277] and this document concurrently.</t>
          </li>
          <li>
            <t>Unlike [RFC5277], this document enables a single transport session
to intermix notification messages and RPCs for different
subscriptions.</t>
          </li>
          <li>
            <t>A subscription "stop-time" can be specified as part of a
notification replay.  This supports a capability analogous to the
&lt;stopTime&gt; parameter of [RFC5277].  However, in this
specification, a "stop-time" parameter can also be applied without
replay.</t>
          </li>
        </ul>
      </section>
      <section anchor="solution">
        <name>Solution</name>
        <t>Per the overview provided in Section 1.3, this section details the
overall context, state machines, and subsystems that may be assembled
to allow the subscription of events from a publisher.</t>
        <section anchor="event-streams">
          <name>Event Streams</name>
          <t>An event stream is a named entity on a publisher; this entity exposes
a continuously updating set of YANG-defined event records.  An event
record is an instantiation of a "notification" YANG statement.  If
the "notification" is defined as a child to a data node, the
instantiation includes the hierarchy of nodes that identifies the
data node in the datastore (see Section 7.16.2 of [RFC7950]).  Each
event stream is available for subscription.  Identifying a) how event
streams are defined (other than the NETCONF stream), b) how event
records are defined/generated, and c) how event records are assigned
to event streams is out of scope for this document.</t>
          <t>There is only one reserved event stream name in this document:
"NETCONF".  The "NETCONF" event stream contains all NETCONF event
record information supported by the publisher, except where an event
record has explicitly been excluded from the stream.  Beyond the
"NETCONF" stream, implementations <bcp14>MAY</bcp14> define additional event
streams.</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(s) 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.</t>
          <t>If no access control permissions are in place for event records on an
event stream, then a receiver <bcp14>MUST</bcp14> be allowed access to all the event
records.  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.</t>
          <t>Event records <bcp14>MUST NOT</bcp14> be delivered to a receiver in a different
order than the order in which they were placed on an event stream.</t>
        </section>
        <section anchor="event-stream-filters">
          <name>Event Stream Filters</name>
          <t>This document defines an extensible filtering mechanism.  The filter
itself is a boolean test that is placed on the content of an event
record.  A "false" filtering result causes the event record to be
excluded from delivery to a receiver.  A filter never results in
information being stripped from an event record prior to that event
record being encapsulated in a notification message.  The two
optional event stream filtering syntaxes supported are [XPATH] and
subtree [RFC6241].</t>
          <t>If no event stream filter is provided in a subscription, all event
records on an event stream are to be sent.</t>
        </section>
        <section anchor="qos">
          <name>QoS</name>
          <t>This document provides for several Quality of Service (QoS)
parameters.  These parameters indicate the treatment of a
subscription relative to other traffic between publisher and
receiver.  Included are:</t>
          <ul spacing="normal">
            <li>
              <t>A "dscp" marking to differentiate prioritization of notification
messages during network transit.</t>
            </li>
            <li>
              <t>A "weighting" so that bandwidth proportional to this weighting can
be allocated to this subscription relative to other subscriptions.</t>
            </li>
            <li>
              <t>A "dependency" upon another subscription.</t>
            </li>
          </ul>
          <t>If the publisher supports the "dscp" feature, then a subscription
with a "dscp" leaf <bcp14>MUST</bcp14> result in a corresponding Differentiated
Services Code Point (DSCP) marking [RFC2474] being placed in the IP
header of any resulting notification messages and subscription state
change notifications.  A publisher <bcp14>MUST</bcp14> respect the DSCP markings for
subscription traffic egressing that publisher.</t>
          <t>Different DSCP code points require different transport connections.
As a result, where TCP is used, a publisher that supports the "dscp"
feature must ensure that a subscription's notification messages are
returned in a single TCP transport session where all traffic shares
the subscription's "dscp" leaf value.  If this cannot be guaranteed,
any "establish-subscription" RPC request <bcp14>SHOULD</bcp14> be rejected with a
"dscp-unavailable" error.</t>
          <t>For the "weighting" parameter, when concurrently dequeuing
notification messages from multiple subscriptions to a receiver, the
publisher <bcp14>MUST</bcp14> allocate bandwidth to each subscription proportional
to the weights assigned to those subscriptions.  "Weighting" is an
optional capability of the publisher; support for it is identified
via the "qos" feature.</t>
          <t>If a subscription has the "dependency" parameter set, then any
buffered notification messages containing event records selected by
the parent subscription <bcp14>MUST</bcp14> be dequeued prior to the notification
messages of the dependent subscription.  If notification messages
have dependencies on each other, the notification message queued the
longest <bcp14>MUST</bcp14> go first.  If a "dependency" included in an RPC
references a subscription that does not exist or is no longer
accessible to that subscriber, that "dependency" <bcp14>MUST</bcp14> be silently
removed.  "Dependency" is an optional capability of the publisher;
support for it is identified via the "qos" feature.</t>
          <t>"Dependency" and "weighting" parameters will only be respected and
enforced between subscriptions that share the same "dscp" leaf value.</t>
          <t>There are additional types of publisher capacity overload that this
specification does not address, as they are out of scope.  For
example, the prioritization of which subscriptions have precedence
when the publisher CPU is overloaded is not discussed.  As a result,
implementation choices will need to be made to address such
considerations.</t>
        </section>
        <section anchor="configured-subscriptions">
          <name>Configured Subscriptions</name>
          <t>A configured subscription is a subscription installed via
configuration.  Configured subscriptions may be modified by any
configuration client with the proper permissions.  Subscriptions can
be modified or terminated via configuration at any point during their
lifetime.  Multiple configured subscriptions <bcp14>MUST</bcp14> be supportable over
a single transport session.</t>
          <t>Configured subscriptions have several characteristics distinguishing
them from dynamic subscriptions:</t>
          <ul spacing="normal">
            <li>
              <t>persistence across publisher reboots,</t>
            </li>
            <li>
              <t>persistence even when transport is unavailable, and</t>
            </li>
            <li>
              <t>an ability to send notification messages to more than one
receiver.  (Note that receivers are unaware of the existence of
any other receivers.)</t>
            </li>
          </ul>
          <t>On the publisher, support for configured subscriptions is optional
and advertised using the "configured" feature.  On a receiver of a
configured subscription, support for dynamic subscriptions is
optional.  However, if replaying missed event records is required for
a configured subscription, support for dynamic subscription is highly
recommended.  In this case, a separate dynamic subscription can be
established to retransmit the missing event records.</t>
          <t>In addition to the subscription parameters available to dynamic
subscriptions as described in Section 2.4.2, the following additional
parameters are also available to configured subscriptions:</t>
          <ul spacing="normal">
            <li>
              <t>A "transport", which identifies the transport protocol to use to
connect with all subscription receivers.</t>
            </li>
            <li>
              <t>One or more receivers, each intended as the destination for event
records.  Note that each individual receiver is identifiable by
its "name".</t>
            </li>
            <li>
              <t>Optional parameters to identify where traffic should egress a
publisher:  </t>
              <ul spacing="normal">
                <li>
                  <t>A "source-interface", which identifies the egress interface to
  use from the publisher.  Publisher support for this parameter
  is optional and advertised using the "interface-designation"
  feature.</t>
                </li>
                <li>
                  <t>A "source-address" address, which identifies the IP address to
  stamp on notification messages destined for the receiver.</t>
                </li>
                <li>
                  <t>A "source-vrf", which identifies the Virtual Routing and
  Forwarding (VRF) instance on which to reach receivers.  This
  VRF is a network instance as defined in [RFC8529].  Publisher
  support for VRFs is optional and advertised using the
  "supports-vrf" feature.</t>
                </li>
              </ul>
              <t>
If none of the above parameters are set, notification messages
<bcp14>MUST</bcp14> egress the publisher's default interface.</t>
            </li>
          </ul>
          <t>A tree diagram that includes these parameters is provided in
Figure 20 in Section 3.3.  These parameters are described in the YANG
module in Section 4.</t>
          <section anchor="configured-subscription-state-machine">
            <name>Configured Subscription State Machine</name>
            <t>Below is the state machine for a configured subscription on the
publisher.  This state machine describes the three states ("valid",
"invalid", and "concluded") as well as the transitions between these
states.  Start and end states are depicted to reflect configured
subscription creation and deletion events.  The creation or
modification of a configured subscription initiates an evaluation by
the publisher to determine if the subscription is in the
"valid" state or the "invalid" state.  The publisher uses its own
criteria in making this determination.  If in the "valid" state, the
subscription becomes operational.  See (1) in the diagram below.</t>
            <artwork><![CDATA[
 .........
 : start :-.
 :.......: |
      create  .---modify-----.----------------------------------.
           |  |              |                                  |
           V  V          .-------.         .......         .---------.
  .----[evaluate]--no--->|invalid|-delete->: end :<-delete-|concluded|
  |                      '-------'         :.....:         '---------'
  |-[evaluate]--no-(2).      ^                ^                 ^
  |        ^          |      |                |                 |
 yes       |          '->unsupportable      delete           stop-time
  |      modify         (subscription-   (subscription-   (subscription-
  |        |             terminated*)     terminated*)      concluded*)
  |        |                 |                |                 |
 (1)       |                (3)              (4)               (5)
  |   .---------------------------------------------------------------.
  '-->|                         valid                                 |
      '---------------------------------------------------------------'


 Legend:
   Dotted boxes: subscription added or removed via configuration
   Dashed boxes: states for a subscription
   [evaluate]: decision point on whether the subscription
               is supportable
   (*): resulting subscription state change notification

     Figure 8: Publisher's State Machine for a Configured Subscription
]]></artwork>
            <t>A subscription in the "valid" state may move to the "invalid" state
in one of two ways.  First, it may be modified in a way that fails a
re-evaluation.  See (2) in the diagram.  Second, the publisher might
determine that the subscription is no longer supportable.  This could
be because of an unexpected but sustained increase in an event
stream's event records, degraded CPU capacity, a more complex
referenced filter, or other subscriptions that have usurped
resources.  See (3) in the diagram.  No matter the case, a
"subscription-terminated" notification is sent to any receivers in
the "active" or "suspended" state.  A subscription in the
"valid" state may also transition to the "concluded" state via (5) if
a configured stop time has been reached.  In this case, a
"subscription-concluded" notification is sent to any receivers in the
"active" or "suspended" state.  Finally, a subscription may be
deleted by configuration (4).</t>
            <t>When a subscription is in the "valid" state, a publisher will attempt
to connect with all receivers of a configured subscription and
deliver notification messages.  Below is the state machine for each
receiver of a configured subscription.  This receiver state machine
is fully contained in the state machine of the configured
subscription and is only relevant when the configured subscription is
in the "valid" state.</t>
            <artwork><![CDATA[
     .-----------------------------------------------------------------.
     |                         valid                                   |
     |   .----------.                           .------------.         |
     |   | receiver |---timeout---------------->|  receiver  |         |
     |   |connecting|<----------------reset--(c)|disconnected|         |
     |   |          |<-transport                '------------'         |
     |   '----------'  loss,reset------------------------------.       |
     |      (a)          |                                     |       |
     |  subscription-   (b)                                   (b)      |
     |  started*    .--------.                             .---------. |
     |       '----->|        |(d)-insufficient CPU,------->|         | |
     |              |receiver|    buffer overflow          |receiver | |
     | subscription-| active |                             |suspended| |
     |   modified*  |        |<----CPU, b/w sufficient,-(e)|         | |
     |        '---->'--------'     subscription-modified*  '---------' |
     '-----------------------------------------------------------------'

     Legend:
       Dashed boxes that include the word "receiver" show the possible
       states for an individual receiver of a valid configured
       subscription.

      * indicates a subscription state change notification

      Figure 9: Receiver State Machine for a Configured Subscription
                              on a Publisher
]]></artwork>
            <t>When a configured subscription first moves to the "valid" state, the
"state" leaf of each receiver is initialized to the "connecting"
state.  If transport connectivity is not available to any receivers
and there are any notification messages to deliver, a transport
session is established (e.g., per [RFC8071]).  Individual receivers
are moved to the "active" state when a "subscription-started"
subscription state change notification is successfully passed to that
receiver (a).  Event records are only sent to active receivers.
Receivers of a configured subscription remain active on the publisher
if both (1) transport connectivity to the receiver is active and
(2) event records are not being dropped due to a publisher's sending
capacity being reached.  In addition, a configured subscription's
receiver <bcp14>MUST</bcp14> be moved to the "connecting" state if the receiver is
reset via the "reset" action (b), (c).  For more on the "reset"
action, see Section 2.5.5.  If transport connectivity cannot be
achieved while in the "connecting" state, the receiver <bcp14>MAY</bcp14> be moved
to the "disconnected" state.</t>
            <t>A configured subscription's receiver <bcp14>MUST</bcp14> be moved to the "suspended"
state if there is transport connectivity between the publisher and
receiver but (1) delivery of notification messages is failing due to
a publisher's buffer capacity being reached or (2) notification
messages cannot be generated for that receiver due to insufficient
CPU (d).  This is indicated to the receiver by the "subscription-
suspended" subscription state change notification.</t>
            <t>A configured subscription's receiver <bcp14>MUST</bcp14> be returned to the "active"
state from the "suspended" state when notification messages can be
generated, bandwidth is sufficient to handle the notification
messages, and a receiver has successfully been sent a "subscription-
resumed" or "subscription-modified" subscription state change
notification (e).  The choice as to which of these two subscription
state change notifications is sent is determined by whether the
subscription was modified during the period of suspension.</t>
            <t>Modification of a configured subscription is possible at any time.  A
"subscription-modified" subscription state change notification will
be sent to all active receivers, immediately followed by notification
messages conforming to the new parameters.  Suspended receivers will
also be informed of the modification.  However, this notification
will await the end of the suspension for that receiver (e).</t>
            <t>The mechanisms described above are mirrored in the RPCs and
notifications defined in this document.  It should be noted that
these RPCs and notifications have been designed to be extensible and
allow subscriptions into targets other than event streams.  For
instance, the YANG module defined in Section 5 of <xref target="RFC8641"/> augments
"/sn:modify-subscription/sn:input/sn:target".</t>
          </section>
          <section anchor="creating-a-configured-subscription">
            <name>Creating a Configured Subscription</name>
            <t>Configured subscriptions are established using configuration
operations against the top-level "subscriptions" subtree.</t>
            <t>Because there is no explicit association with an existing transport
session, configuration operations <bcp14>MUST</bcp14> include additional parameters
beyond those of dynamic subscriptions.  These parameters identify
each receiver, how to connect with that receiver, and possibly
whether the notification messages need to come from a specific egress
interface on the publisher.  Receiver-specific transport connectivity
parameters <bcp14>MUST</bcp14> be configured via transport-specific augmentations to
this specification.  See Section 2.5.7 for details.</t>
            <t>After a subscription is successfully established, the publisher
immediately sends a "subscription-started" subscription state change
notification to each 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.  In this
case, when there is something to transport for an active
subscription, transport-specific "call home" operations [RFC8071]
will be used to establish the connection.  When transport
connectivity is available, notification messages may then be pushed.</t>
            <t>With active configured subscriptions, it is allowable to buffer event
records even after a "subscription-started" has been sent.  However,
if events are lost (rather than just delayed) due to replay buffer
capacity being reached, a new "subscription-started" must be sent.
This new "subscription-started" indicates an event record
discontinuity.</t>
            <t>To see an example of subscription creation using configuration
operations over NETCONF, see Appendix A.</t>
          </section>
          <section anchor="modifying-a-configured-subscription">
            <name>Modifying a Configured Subscription</name>
            <t>Configured subscriptions can be modified using configuration
operations against the top-level "subscriptions" subtree.</t>
            <t>If the modification involves adding receivers, added receivers are
placed in the "connecting" state.  If a receiver is removed, the
subscription state change notification "subscription-terminated" is
sent to that receiver if that receiver is active or suspended.</t>
            <t>If the modification involves changing the policies for the
subscription, the publisher sends to currently active receivers a
"subscription-modified" notification.  For any suspended receivers, a
"subscription-modified" notification will be delayed until the
receiver's subscription has been resumed.  (Note: In this case, the
"subscription-modified" notification informs the receiver that the
subscription has been resumed, so no additional "subscription-
resumed" need be sent.  Also note that if multiple modifications have
occurred during the suspension, only the "subscription-modified"
notification describing the latest one need be sent to the receiver.)</t>
          </section>
          <section anchor="deleting-a-configured-subscription">
            <name>Deleting a Configured Subscription</name>
            <t>Subscriptions can be deleted through configuration against the
top-level "subscriptions" subtree.</t>
            <t>Immediately after a subscription is successfully deleted, the
publisher sends to all receivers of that subscription a subscription
state change notification stating that the subscription has ended
(i.e., "subscription-terminated").</t>
          </section>
          <section anchor="resetting-a-configured-subscriptions-receiver">
            <name>Resetting a Configured Subscription's Receiver</name>
            <t>It is possible that a configured subscription to a receiver needs to
be reset.  This is accomplished via the "reset" action in the YANG
module at "/subscriptions/subscription/receivers/receiver/reset".
This action may be useful in cases where a publisher has timed out
trying to reach a receiver.  When such a reset occurs, a transport
session will be initiated if necessary, and a new "subscription-
started" notification will be sent.  This action does not have any
effect on transport connectivity if the needed connectivity already
exists.</t>
          </section>
          <section anchor="replay-for-a-configured-subscription">
            <name>Replay for a Configured Subscription</name>
            <t>It is possible to do replay on a configured subscription.  This is
supported via the configuration of the "configured-replay" object on
the subscription.  The setting of this object enables the streaming
of the buffered event records for the subscribed event stream.  All
buffered event records that have been retained since the last
publisher restart will be sent to each configured receiver.</t>
            <t>Replay of event records created since restart is useful.  It allows
event records generated before transport connectivity establishment
to be passed to a receiver.  Setting the restart time as the earliest
configured replay time precludes the possibility of resending event
records that were logged prior to publisher restart.  It also ensures
that the same records will be sent to each configured receiver,
regardless of the speed of transport connectivity establishment to
each receiver.  Finally, by establishing restart as the earliest
potential time for event records to be included in notification
messages, a well-understood timeframe for replay is defined.</t>
            <t>As a result, when any configured subscription's receivers become
active, buffered event records will be sent immediately after the
"subscription-started" notification.  If the publisher knows the last
event record sent to a receiver and the publisher has not rebooted,
the next event record on the event stream that meets filtering
criteria will be the leading event record sent.  Otherwise, the
leading event record will be the first event record meeting filtering
criteria subsequent to the latest of three different times: the
"replay-log-creation-time", the "replay-log-aged-time", or the most
recent publisher boot time.  The "replay-log-creation-time" and
"replay-log-aged-time" are discussed in Section 2.4.2.1.  The most
recent publisher boot time ensures that duplicate event records are
not replayed from a previous time the publisher was booted.</t>
            <t>It is quite possible that a receiver might want to retrieve event
records from an event stream prior to the latest boot.  If such
records exist where there is a configured replay, the publisher <bcp14>MUST</bcp14>
send the time of the event record immediately preceding the
"replay-start-time" in the "replay-previous-event-time" leaf.
Through the existence of the "replay-previous-event-time", the
receiver will know that earlier events prior to reboot exist.  In
addition, if the subscriber was previously receiving event records
with the same subscription "id", the receiver can determine if there
was a time gap where records generated on the publisher were not
successfully received.  And with this information, the receiver may
choose to dynamically subscribe to retrieve any event records placed
in the event stream before the most recent boot time.</t>
            <t>All other replay functionality remains the same as with dynamic
subscriptions as described in Section 2.4.2.1.</t>
          </section>
          <section anchor="transport-connectivity-for-a-configured-subscription">
            <name>Transport Connectivity for a Configured Subscription</name>
            <t>This specification is transport independent.  However, supporting a
configured subscription will often require the establishment of
transport connectivity.  And the parameters used for this transport
connectivity establishment are transport specific.  As a result, the
YANG module defined in Section 4 is not able to directly define and
expose these transport parameters.</t>
            <t>It is necessary for an implementation to support the connection
establishment process.  To support this function, the YANG data model
defined in this document includes a node where transport-specific
parameters for a particular receiver may be augmented.  This node is
"/subscriptions/subscription/receivers/receiver".  By augmenting
transport parameters from this node, system developers are able to
incorporate the YANG objects necessary to support the transport
connectivity establishment process.</t>
            <t>The result of this is the following requirement.  A publisher
supporting the feature "configured" <bcp14>MUST</bcp14> also support at least one
YANG data model that augments transport connectivity parameters on
"/subscriptions/subscription/receivers/receiver".  For an example of
such an augmentation, see Appendix A.</t>
          </section>
        </section>
        <section anchor="dynamic-subscriptions">
          <name>Dynamic Subscriptions</name>
          <t>Dynamic subscriptions are managed via protocol operations (in the
form of RPCs, per [RFC7950], Section 7.14) made against targets
located in the publisher.  These RPCs have been designed extensibly
so that they may be augmented for subscription targets beyond event
streams.  For examples of such augmentations, see the RPC
augmentations in the YANG data model provided in <xref target="RFC8641"/>.</t>
          <section anchor="dynamic-subscription-state-machine">
            <name>Dynamic Subscription State Machine</name>
            <t>Below is the publisher's state machine for a dynamic subscription.
Each state is shown in its own box.  It is important to note that
such a subscription doesn't exist at the publisher until an
"establish-subscription" RPC is accepted.  The mere request by a
subscriber to establish a subscription is not sufficient for that
subscription to be externally visible.  Start and end states are
depicted to reflect subscription creation and deletion events.</t>
            <artwork><![CDATA[
                  .........
                  : start :
                  :.......:
                      |
              establish-subscription
                      |
                      |   .-------modify-subscription--------.
                      v   v                                  |
                .-----------.                          .-----------.
      .--------. | receiver  |--insufficient CPU, b/w-->| receiver  |
  modify-       '|  active   |                          | suspended |
  subscription   |           |<----CPU, b/w sufficient--|           |
      ---------->'-----------'                          '-----------'
                      |                                      |
            delete/kill-subscription                     delete/kill-
                      |                                 subscription
                      v                                      |
                  .........                                  |
                  :  end  :<---------------------------------'
                  :.......:

  Figure 1: Publisher's State Machine for a Dynamic Subscription
]]></artwork>
            <t>Of interest in this state machine are the following:</t>
            <t>o  Successful "establish-subscription" or "modify-subscription" RPCs
  move the subscription to the "active" state.</t>
            <t>o  Failed "modify-subscription" RPCs will leave the subscription in
  its previous state, with no visible change to any streaming
  updates.</t>
            <t>o  A "delete-subscription" or "kill-subscription" RPC will end the
  subscription, as will reaching a "stop-time".</t>
            <t>o  A publisher may choose to suspend a subscription when there is not
  sufficient CPU or bandwidth available to service the subscription.
  This is announced to the subscriber via the "subscription-
  suspended" subscription state change notification.</t>
            <t>o  A suspended subscription may be modified by the subscriber (for
  example, in an attempt to use fewer resources).  Successful
  modification returns the subscription to the "active" state.</t>
            <t>o  Even without a "modify-subscription" request, a publisher may
  return a subscription to the "active" state when sufficient
  resources are again available.  This is announced to the
  subscriber via the "subscription-resumed" subscription state
  change notification.</t>
          </section>
          <section anchor="establishing-a-dynamic-subscription">
            <name>Establishing a Dynamic Subscription</name>
            <t>The "establish-subscription" RPC allows a subscriber to request the
creation of a subscription.</t>
            <t>The input parameters of the operation are:</t>
            <t>o  A "stream" name, which identifies the targeted event stream
  against which the subscription is applied.</t>
            <t>o  An event stream filter, which may reduce the set of event records
  pushed.</t>
            <t>o  If the transport used by the RPC supports multiple encodings, an
  optional "encoding" for the event records pushed.  If no
  "encoding" is included, the encoding of the RPC <bcp14>MUST</bcp14> be used.</t>
            <t>o  An optional "stop-time" for the subscription.  If no "stop-time"
  is present, notification messages will continue to be sent until
  the subscription is terminated.</t>
            <t>o  An optional "replay-start-time" for the subscription.  The
  "replay-start-time" <bcp14>MUST</bcp14> be in the past and indicates that the
  subscription is requesting a replay of previously generated
  information from the event stream.  For more on replay, see
  Section 2.4.2.1.  If there is no "replay-start-time", the
  subscription starts immediately.</t>
            <t>If the publisher can satisfy the "establish-subscription" request, it
replies with an identifier for the subscription and then immediately
starts streaming notification messages.</t>
            <t>Below is a tree diagram for "establish-subscription".  All objects
contained in this tree are described in the YANG module in Section 4.</t>
            <artwork><![CDATA[
    +---x establish-subscription
      +---w input
      |  +---w (target)
      |  |  +--:(stream)
      |  |     +---w (stream-filter)?
      |  |     |  +--:(by-reference)
      |  |     |  |  +---w stream-filter-name
      |  |     |  |          stream-filter-ref
      |  |     |  +--:(within-subscription)
      |  |     |     +---w (filter-spec)?
      |  |     |        +--:(stream-subtree-filter)
      |  |     |        |  +---w stream-subtree-filter?   <anydata>
      |  |     |        |          {subtree}?
      |  |     |        +--:(stream-xpath-filter)
      |  |     |           +---w stream-xpath-filter?
      |  |     |                   yang:xpath1.0 {xpath}?
      |  |     +---w stream                               stream-ref
      |  |     +---w replay-start-time?
      |  |             yang:date-and-time {replay}?
      |  +---w stop-time?
      |  |       yang:date-and-time
      |  +---w dscp?                                      inet:dscp
      |  |       {dscp}?
      |  +---w weighting?                                 uint8
      |  |       {qos}?
      |  +---w dependency?
      |  |       subscription-id {qos}?
      |  +---w encoding?                                  encoding
      +--ro output
          +--ro id                            subscription-id
          +--ro replay-start-time-revision?   yang:date-and-time
                  {replay}?

        Figure 2: "establish-subscription" RPC Tree Diagram
]]></artwork>
            <t>A publisher <bcp14>MAY</bcp14> reject the "establish-subscription" RPC for many
reasons, as described in Section 2.4.6.  The contents of the
resulting RPC error response <bcp14>MAY</bcp14> include details on input parameters
that, if considered in a subsequent "establish-subscription" RPC, may
result in successful subscription establishment.  Any such hints <bcp14>MUST</bcp14>
be transported in a yang-data "establish-subscription-stream-error-
info" container included in the RPC error response.</t>
            <t>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 Section 4.</t>
            <artwork><![CDATA[
    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
]]></artwork>
            <section anchor="requesting-a-replay-of-event-records">
              <name>Requesting a Replay of Event Records</name>
              <t>Replay provides the ability to establish a subscription that is also
capable of passing event records generated in the recent past.  In
other words, as the subscription initializes itself, it sends any
event records in the target event stream that meet the filter
criteria that have an event time that is after the "replay-start-
time" and also have an event time before the "stop-time" should this
"stop-time" exist.  The end of these historical event records is
identified via a "replay-completed" subscription state change
notification.  Any event records generated since the subscription
establishment may then follow.  For a particular subscription, all
event records will be delivered in the order in which they are placed
in the event stream.</t>
              <t>Replay is an optional feature that is dependent on an event stream
supporting some form of logging.  This document puts no restrictions
on the size or form of the log, where it resides in the publisher, or
when event record entries in the log are purged.</t>
              <t>The inclusion of a "replay-start-time" in an "establish-subscription"
RPC indicates a replay request.  If the "replay-start-time" contains
a value that is earlier than what a publisher's retained history
supports, then if the subscription is accepted, the actual
publisher's revised start time <bcp14>MUST</bcp14> be set in the returned
"replay-start-time-revision" object.</t>
              <t>A "stop-time" parameter may be included in a replay subscription.
For a replay subscription, the "stop-time" <bcp14>MAY</bcp14> be earlier than the
current time but <bcp14>MUST</bcp14> be later than the "replay-start-time".</t>
              <t>If the given "replay-start-time" is later than the time marked in any
event records retained in the replay buffer, then the publisher <bcp14>MUST</bcp14>
send a "replay-completed" notification immediately after a successful
"establish-subscription" RPC response.</t>
              <t>If an event stream supports replay, the "replay-support" leaf is
present in the "/streams/stream" list entry for the event stream.  An
event stream that does support replay is not expected to have an
unlimited supply of saved notifications available to accommodate any
given replay request.  To assess the timeframe available for replay,
subscribers can read the leafs "replay-log-creation-time" and
"replay-log-aged-time".  See Figure 18 for the YANG tree and
Section 4 for the YANG module describing these elements.  The actual
size of the replay log at any given time is a publisher-specific
matter.  Control parameters for the replay log are outside the scope
of this document.</t>
            </section>
          </section>
          <section anchor="modifying-a-dynamic-subscription">
            <name>Modifying a Dynamic Subscription</name>
            <t>The "modify-subscription" operation permits changing the terms of an
existing dynamic subscription.  Dynamic subscriptions can be modified
any number of times.  Dynamic subscriptions can only be modified via
this RPC using a transport session connecting to the subscriber.  If
the publisher accepts the requested modifications, it acknowledges
success to the subscriber, then immediately starts sending event
records based on the new terms.</t>
            <t>Subscriptions created by configuration cannot be modified via this
RPC.  However, configuration may be used to modify objects referenced
by the subscription (such as a referenced filter).</t>
            <t>Below is a tree diagram for "modify-subscription".  All objects
contained in this tree are described in the YANG module in Section 4.</t>
            <artwork><![CDATA[
    +---x modify-subscription
      +---w input
          +---w id
          |       subscription-id
          +---w (target)
          |  +--:(stream)
          |     +---w (stream-filter)?
          |        +--:(by-reference)
          |        |  +---w stream-filter-name
          |        |          stream-filter-ref
          |        +--:(within-subscription)
          |           +---w (filter-spec)?
          |              +--:(stream-subtree-filter)
          |              |  +---w stream-subtree-filter?   <anydata>
          |              |          {subtree}?
          |              +--:(stream-xpath-filter)
          |                 +---w stream-xpath-filter?
          |                         yang:xpath1.0 {xpath}?
          +---w stop-time?
                  yang:date-and-time

          Figure 4: "modify-subscription" RPC Tree Diagram
]]></artwork>
            <t>If the publisher accepts the requested modifications on a currently
suspended subscription, the subscription will immediately be resumed
(i.e., the modified subscription is returned to the "active" state).
The publisher <bcp14>MAY</bcp14> immediately suspend this newly modified
subscription through the "subscription-suspended" notification before
any event records are sent.</t>
            <t>If the publisher rejects the RPC request, the subscription remains as
it was prior to the request.  That is, the request has no impact
whatsoever.  Rejection of the RPC for any reason is indicated via an
RPC error as described in Section 2.4.6.  The contents of such a
rejected RPC <bcp14>MAY</bcp14> include hints on inputs that (if considered) may
result in a successfully modified subscription.  These hints <bcp14>MUST</bcp14> be
transported in a yang-data "modify-subscription-stream-error-info"
container inserted into the RPC error response.</t>
            <t>Below is a tree diagram for "modify-subscription-stream-error-info"
RPC yang-data.  All objects contained in this tree are described in
the YANG module in Section 4.</t>
            <artwork><![CDATA[
    yang-data modify-subscription-stream-error-info
      +--ro modify-subscription-stream-error-info
        +--ro reason?                identityref
        +--ro filter-failure-hint?   string

          Figure 5: "modify-subscription-stream-error-info"
                    RPC yang-data Tree Diagram
]]></artwork>
          </section>
          <section anchor="deleting-a-dynamic-subscription">
            <name>Deleting a Dynamic Subscription</name>
            <t>The "delete-subscription" operation permits canceling an existing
subscription.  If the publisher accepts the request and the publisher
has indicated success, the publisher <bcp14>MUST NOT</bcp14> send any more
notification messages for this subscription.</t>
            <t>Below is a tree diagram for "delete-subscription".  All objects
contained in this tree are described in the YANG module in Section 4.</t>
            <artwork><![CDATA[
    +---x delete-subscription
      +---w input
          +---w id     subscription-id

          Figure 6: "delete-subscription" RPC Tree Diagram
]]></artwork>
            <t>Dynamic subscriptions can only be deleted via this RPC using a
transport session connecting to the subscriber.  Configured
subscriptions cannot be deleted using RPCs.</t>
          </section>
          <section anchor="killing-a-dynamic-subscription">
            <name>Killing a Dynamic Subscription</name>
            <t>The "kill-subscription" operation permits an operator to end a
dynamic subscription that is not associated with the transport
session used for the RPC.  A publisher <bcp14>MUST</bcp14> terminate any dynamic
subscription identified by the "id" parameter in the RPC request, if
such a subscription exists.</t>
            <t>Configured subscriptions cannot be killed using this RPC.  Instead,
configured subscriptions are deleted as part of regular configuration
operations.  Publishers <bcp14>MUST</bcp14> reject any RPC attempt to kill a
configured subscription.</t>
            <t>Below is a tree diagram for "kill-subscription".  All objects
contained in this tree are described in the YANG module in Section 4.</t>
            <artwork><![CDATA[
    +---x kill-subscription
      +---w input
          +---w id     subscription-id

          Figure 7: "kill-subscription" RPC Tree Diagram
]]></artwork>
          </section>
          <section anchor="rpc-failures">
            <name>RPC Failures</name>
            <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 [RFC6241]) or RESTCONF
(Section 7.1 of [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
  replay-unsupported

  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
[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 anchor="event-record-delivery">
          <name>Event Record Delivery</name>
          <t>Whether dynamic or configured, once a subscription has been set up,
the publisher streams event records via notification messages per the
terms of the subscription.  For dynamic subscriptions, notification
messages are sent over the session used to establish the
subscription.  For configured subscriptions, notification messages
are sent over the connections specified by the transport and each
receiver of a configured subscription.</t>
          <t>A notification message is sent to a receiver when an event record is
not blocked by either the specified filter criteria or receiver
permissions.  This notification message <bcp14>MUST</bcp14> include an &lt;eventTime&gt;
object, as shown in [RFC5277], Section 4.  This &lt;eventTime&gt; <bcp14>MUST</bcp14> be
at the top level of a YANG structured event record.</t>
          <t>The following example of XML [W3C.REC-xml-20081126], adapted from
Section 4.2.10 of [RFC7950], illustrates a compliant message:</t>
          <artwork><![CDATA[
  <notification
          xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
      <eventTime>2007-09-01T10:00:00Z</eventTime>
      <link-failure xmlns="https://acme.example.com/system">
          <if-name>so-1/2/3.0</if-name>
          <if-admin-status>up</if-admin-status>
          <if-oper-status>down</if-oper-status>
      </link-failure>
  </notification>

            Figure 10: Subscribed Notification Message
]]></artwork>
          <t>[RFC5277], Section 2.2.1 states that a notification message is to be
sent to a subscriber that initiated a &lt;create-subscription&gt;.  With
this document, this statement from [RFC5277] should be more broadly
interpreted to mean that notification messages can also be sent to a
subscriber that initiated an "establish-subscription" or to a
configured receiver that has been sent a "subscription-started".</t>
          <t>When a dynamic subscription has been started or modified with
"establish-subscription" or "modify-subscription", respectively,
event records matching the newly applied filter criteria <bcp14>MUST NOT</bcp14> be
sent until after the RPC reply has been sent.</t>
          <t>When a configured subscription has been started or modified, event
records matching the newly applied filter criteria <bcp14>MUST NOT</bcp14> be sent
until after the "subscription-started" or "subscription-modified"
notification has been sent, respectively.</t>
        </section>
        <section anchor="subscription-state-change-notifications">
          <name>Subscription State Change Notifications</name>
          <t>In addition to sending event records to receivers, a publisher <bcp14>MUST</bcp14>
also send subscription state change notifications when events related
to subscription management have occurred.</t>
          <t>Subscription state change notifications are unlike other
notifications in that they are never included in any event stream.
Instead, they are inserted (as defined in this section) into the
sequence of notification messages sent to a particular receiver.
Subscription state change notifications cannot be dropped or filtered
out, they cannot be stored in replay buffers, and they are delivered
only to impacted receivers of a subscription.  The identification of
subscription state change notifications is easy to separate from
other notification messages through the use of the YANG extension
"subscription-state-notif".  This extension tags a notification as a
subscription state change notification.</t>
          <t>The complete set of subscription state change notifications is
described in the following subsections.</t>
          <section anchor="subscription-started">
            <name>"subscription-started"</name>
            <t>This notification indicates that a configured subscription has
started, and event records may be sent.  Included in this
subscription state change notification are all the parameters of the
subscription, except for (1) transport connection information for one
or more receivers and (2) origin information indicating where
notification messages will egress the publisher.  Note that if a
referenced filter from the "filters" container has been used in the
subscription, the notification still provides the contents of that
referenced filter under the "within-subscription" subtree.</t>
            <t>Note that for dynamic subscriptions, no "subscription-started"
notifications are ever sent.</t>
            <t>Below is a tree diagram for "subscription-started".  All objects
contained in this tree are described in the YANG module in Section 4.</t>
            <artwork><![CDATA[
    +---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}?
      +--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}?

    Figure 11: "subscription-started" Notification Tree Diagram
]]></artwork>
          </section>
          <section anchor="subscription-modified">
            <name>"subscription-modified"</name>
            <t>This notification indicates that a subscription has been modified by
configuration operations.  It is delivered directly after the last
event records processed using the previous subscription parameters,
and before any event records processed after the modification.</t>
            <t>Below is a tree diagram for "subscription-modified".  All objects
contained in this tree are described in the YANG module in Section 4.</t>
            <artwork><![CDATA[
    +---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}?
      +--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}?

    Figure 12: "subscription-modified" Notification Tree Diagram
]]></artwork>
            <t>A publisher most often sends this notification directly after the
modification of any configuration parameters impacting a configured
subscription.  But it may also be sent at two other times:</t>
            <ol spacing="normal" type="1"><li>
                <t>If a configured subscription has been modified during the
 suspension of a receiver, the notification will be delayed until
 the receiver's suspension is lifted.  In this situation, the
 notification indicates that the subscription has been both
 modified and resumed.</t>
              </li>
              <li>
                <t>A "subscription-modified" subscription state change notification
 <bcp14>MUST</bcp14> be sent if the contents of the filter identified by the
 subscription's "stream-filter-ref" leaf have changed.  This state
 change notification is to be sent for a filter change impacting
 any active receivers of a configured or dynamic subscription.</t>
              </li>
            </ol>
          </section>
          <section anchor="subscription-terminated">
            <name>"subscription-terminated"</name>
            <t>This notification indicates that no further event records for this
subscription should be expected from the publisher.  A publisher may
terminate the sending of event records to a receiver for the
following reasons:</t>
            <ol spacing="normal" type="1"><li>
                <t>Configuration that removes a configured subscription, or a
 "kill-subscription" RPC that ends a dynamic subscription.  These
 are identified via the reason "no-such-subscription".</t>
              </li>
              <li>
                <t>A referenced filter is no longer accessible.  This reason is
 identified by the "filter-unavailable" identity.</t>
              </li>
              <li>
                <t>The event stream referenced by a subscription is no longer
 accessible by the receiver.  This reason is identified by the
 "stream-unavailable" identity.</t>
              </li>
              <li>
                <t>A suspended subscription has exceeded some timeout.  This reason
 is identified by the "suspension-timeout" identity.</t>
              </li>
            </ol>
            <t>Each reason listed above derives from the "subscription-terminated-
reason" base identity specified in the YANG data model in this
document.</t>
            <t>Below is a tree diagram for "subscription-terminated".  All objects
contained in this tree are described in the YANG module in Section 4.</t>
            <artwork><![CDATA[
    +---n subscription-terminated
      +--ro id        subscription-id
      +--ro reason    identityref

  Figure 13: "subscription-terminated" Notification Tree Diagram
]]></artwork>
            <t>Note: This subscription state change notification <bcp14>MUST</bcp14> be sent to a
dynamic subscription's receiver when the subscription ends
unexpectedly.  This might happen when a "kill-subscription" RPC is
successful or when some other event, not including reaching the
subscription's "stop-time", results in a publisher choosing to end
the subscription.</t>
          </section>
          <section anchor="subscription-suspended">
            <name>"subscription-suspended"</name>
            <t>This notification indicates that a publisher has suspended the
sending of event records to a receiver and also indicates the
possible loss of events.  Suspension happens when capacity
constraints stop a publisher from serving a valid subscription.  The
two conditions where this is possible are:</t>
            <ol spacing="normal" type="1"><li>
                <t>"insufficient-resources", when a publisher is unable to produce
 the requested event stream of notification messages, and</t>
              </li>
              <li>
                <t>"unsupportable-volume", when the bandwidth needed to get
 generated notification messages to a receiver exceeds a
 threshold.</t>
              </li>
            </ol>
            <t>These conditions are encoded in the "reason" object.  No further
notifications will be sent until the subscription resumes or is
terminated.</t>
            <t>Below is a tree diagram for "subscription-suspended".  All objects
contained in this tree are described in the YANG module in Section 4.</t>
            <artwork><![CDATA[
    +---n subscription-suspended
      +--ro id        subscription-id
      +--ro reason    identityref

    Figure 14: "subscription-suspended" Notification Tree Diagram
]]></artwork>
          </section>
          <section anchor="subscription-resumed">
            <name>"subscription-resumed"</name>
            <t>This notification indicates that a previously suspended subscription
has been resumed under the unmodified terms previously in place.
Subscribed event records generated after the issuance of this
subscription state change notification may now be sent.</t>
            <t>Below is a tree diagram for "subscription-resumed".  All objects
contained in this tree are described in the YANG module in Section 4.</t>
            <artwork><![CDATA[
    +---n subscription-resumed
      +--ro id    subscription-id

    Figure 15: "subscription-resumed" Notification Tree Diagram
]]></artwork>
          </section>
          <section anchor="subscription-completed">
            <name>"subscription-completed"</name>
            <t>This notification indicates that a subscription that includes a
"stop-time" has successfully finished passing event records upon
reaching that time.</t>
            <t>Below is a tree diagram for "subscription-completed".  All objects
contained in this tree are described in the YANG module in Section 4.</t>
            <artwork><![CDATA[
    +---n subscription-completed {configured}?
      +--ro id    subscription-id

    Figure 16: "subscription-completed" Notification Tree Diagram
]]></artwork>
          </section>
          <section anchor="replay-completed">
            <name>"replay-completed"</name>
            <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 "stop-time" or (2) the subscription's start time.</t>
            <t>If a subscription does not contain a "stop-time" or has a "stop-time"
that has not been reached, then after the "replay-completed"
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 "replay-completed".  All objects
contained in this tree are described in the YANG module in Section 4.</t>
            <artwork><![CDATA[
    +---n replay-completed {replay}?
      +--ro id    subscription-id

      Figure 17: "replay-completed" Notification Tree Diagram
]]></artwork>
          </section>
        </section>
        <section anchor="subscription-monitoring">
          <name>Subscription Monitoring</name>
          <t>In the operational state datastore, the "subscriptions" container
maintains the state of all dynamic subscriptions as well as all
configured subscriptions.  Using datastore retrieval operations
<xref target="RFC8641"/> or subscribing to the "subscriptions" container
(Section 3.3) allows the state of subscriptions and their
connectivity to receivers to be monitored.</t>
          <t>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</t>
          <t>into being via configuration.  This leaf also indicates whether the
current state of that subscription is "valid", "invalid", or
"concluded".</t>
          <t>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).</t>
          <t>Dynamic subscriptions are removed from the operational state
datastore once they expire (reaching "stop-time") or when they are
terminated.  While many subscription objects are shown as
configurable, dynamic subscriptions are only included in the
operational state datastore and as a result are not configurable.</t>
        </section>
        <section anchor="support-for-the-ietf-subscribed-notifications-yang-module">
          <name>Support for the "ietf-subscribed-notifications" YANG Module</name>
          <t>Publishers supporting this document <bcp14>MUST</bcp14> indicate support of the YANG
module "ietf-subscribed-notifications" in the YANG library of the
publisher.  In addition, if supported, the optional features
"encode-xml", "encode-json", "configured", "supports-vrf", "qos",
"xpath", "subtree", "interface-designation", "dscp", and "replay"
<bcp14>MUST</bcp14> be indicated.</t>
        </section>
      </section>
    </section>
    <section anchor="yang-push-solution-overview-all-from-rfc-8641">
      <name>YANG Push Solution Overview (all from RFC 8641)</name>
      <t>This document specifies a solution that provides a subscription
service for updates from a datastore.  This solution supports dynamic
as well as configured subscriptions to updates of datastore nodes.
Subscriptions specify when notification messages (also referred to as
"push updates") should be sent and what data to include in update
records.  Datastore node updates are subsequently pushed from the
publisher to the receiver per the terms of the subscription.</t>
      <section anchor="subscription-model">
        <name>Subscription Model</name>
        <t>YANG-Push subscriptions are defined using a YANG data model.  This
model enhances the subscription model defined in <xref target="RFC8639"/> with
capabilities that allow subscribers to subscribe to datastore node
updates -- specifically, to specify the update triggers defining when
to generate update records as well as what to include in an update
record.  Key enhancements include:</t>
        <ul spacing="normal">
          <li>
            <t>The specification of selection filters that identify targeted YANG
datastore nodes and/or datastore subtrees for which updates are to
be pushed.</t>
          </li>
          <li>
            <t>The specification of update policies that contain conditions that
trigger the generation and pushing of new update records.  There
are two types of subscriptions, distinguished by how updates are
triggered:  </t>
            <ul spacing="normal">
              <li>
                <t>For periodic subscriptions, the update trigger is specified by
  two parameters that define when updates are to be pushed.
  These parameters are (1) the period interval with which to
  report updates and (2) an "anchor-time", i.e., a reference
  point in time that can be used to calculate at which points in
  time periodic updates need to be assembled and sent.</t>
              </li>
              <li>
                <t>For on-change subscriptions, an update trigger occurs whenever
 a change in the subscribed information is detected.  The
 following additional parameters are included:      </t>
                <ul spacing="normal">
                  <li>
                    <t>"dampening-period": In an on-change subscription, detected
   object changes should be sent as quickly as possible.
   However, it may be undesirable to send a rapid series of
   object changes.  Such behavior has the potential to exhaust
   resources in the publisher or receiver.  In order to protect
   against this type of scenario, a dampening period <bcp14>MAY</bcp14> be
   used to specify the interval that has to pass before
   successive update records for the same subscription are
   generated for a receiver.  The dampening period collectively
   applies to the set of all datastore nodes selected by a
   single subscription.  This means that when there is a change
   to one or more subscribed objects, an update record
   containing those objects is created immediately (when no
   dampening period is in effect) or at the end of a dampening
   period (when a dampening period is in fact in effect).  If
   multiple changes to a single object occur during a dampening
   period, only the value that is in effect at the time when
   the update record is created is included.  The dampening
   period goes into effect every time the assembly of an update
   record is completed.</t>
                  </li>
                  <li>
                    <t>"change-type": This parameter can be used to reduce the
   types of datastore changes for which updates are sent (e.g.,
   you might only send an update when an object is created or
   deleted, but not when an object value changes).</t>
                  </li>
                  <li>
                    <t>"sync-on-start": This parameter defines whether or not a
   complete "push-update" (Section 3.7) of all subscribed data
   will be sent at the beginning of a subscription.  Such early
   synchronization establishes the frame of reference for
   subsequent updates.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>An encoding (using anydata) for the contents of periodic and
on-change push updates.</t>
          </li>
        </ul>
        <section anchor="negotiation-of-subscription-policies">
          <name>Negotiation of Subscription Policies</name>
          <t>A dynamic subscription request <bcp14>SHOULD</bcp14> be declined if a publisher
determines that it may be unable to provide update records meeting
the terms of an "establish-subscription" or "modify-subscription" RPC
request.  In this case, a subscriber may quickly follow up with a new
RPC request using different parameters.</t>
          <t>Random guessing of different parameters by a subscriber is to be
discouraged.  Therefore, in order to minimize the number of
subscription iterations between subscriber and publisher, a dynamic
subscription supports a simple negotiation between subscribers and
publishers for subscription parameters.  This negotiation is in the
form of supplemental information that should be inserted into error
responses to a failed RPC request.  This returned error response
information, when considered, should increase the likelihood of
success for subsequent RPC requests.  Such hints include suggested
periodic time intervals, acceptable dampening periods, and size
estimates for the number of objects that would be returned from a
proposed selection filter.  However, there are no guarantees that
subsequent requests that consider these hints will be accepted.</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.</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> suspend the subscription.</t>
          <t>To avoid flooding receivers with repeated updates for subscriptions
containing fast-changing objects or objects with oscillating values,
an on-change subscription allows for the definition of a dampening
period.  Once an update record for a given object is generated, no
other updates for this particular subscription will be created until
the end of the dampening period.  Values sent at the end of the
dampening period are the values that are current at the end of the
dampening period of all changed objects.  Changed objects include
those objects that were deleted or newly created during that
dampening period.  If an object has returned to its original value
(or even has been created and then deleted) during the dampening
period, that value (and not the interim change) will still be sent.
This will indicate that churn is occurring on that object.</t>
          <t>On-change subscriptions can be refined to let users subscribe only to
certain types of changes.  For example, a subscriber might only want
object creations and deletions, but not modifications of object
values.</t>
          <t>Putting it all together, the conceptual process for creating an
update record as part of an on-change subscription is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Just before a change, or at the start of a dampening period,
 evaluate any filtering and any access control rules to ensure
 that a receiver is authorized to view all subscribed datastore
 nodes (filtering out any nodes for which this is not the case).
 The result is a set "A" of datastore nodes and subtrees.</t>
            </li>
            <li>
              <t>Just after a change, or at the end of a dampening period,
 evaluate any filtering and any (possibly new) access control
 rules.  The result is a set "B" of datastore nodes and subtrees.</t>
            </li>
            <li>
              <t>Construct an update record, which takes the form of a YANG Patch
 record [RFC8072] for going from A to B.</t>
            </li>
            <li>
              <t>If there were any changes made between A and B that canceled each
 other out, insert into the YANG Patch record the last change
 made, even if the new value is no different from the original
 value (since changes that were made in the interim were canceled
 out).  If the changes involve creating a new datastore node and
 then deleting it, the YANG Patch record will indicate the
 deletion of the datastore node.  Similarly, if the changes
 involve deleting a new datastore node and then recreating it,
 the YANG Patch record will indicate the creation of the
 datastore node.</t>
            </li>
            <li>
              <t>If the resulting YANG Patch record is non-empty, send it to the
 receiver.</t>
            </li>
          </ol>
          <t>Note: In cases where a subscriber wants to have separate dampening
periods for different objects, the subscriber has the option to
create multiple subscriptions with different selection filters.</t>
        </section>
        <section anchor="reliability-considerations">
          <name>Reliability Considerations</name>
          <t>A subscription to updates from a datastore is intended to obviate the
need for polling.  However, in order to do so, it is critical that
subscribers can rely on the subscription and have confidence that
they will indeed receive the subscribed updates without having to
worry about updates being silently dropped.  In other words, a
subscription constitutes a promise on the side of the publisher to
provide the receivers with updates per the terms of the subscription.</t>
          <t>Now, there are many reasons why a publisher may at some point no
longer be able to fulfill the terms of the subscription, even if the
subscription had been initiated in good faith.  For example, the
volume of datastore nodes may be larger than anticipated, the
interval may prove too short to send full updates in rapid
succession, or an internal problem may prevent objects from being
collected.  For this reason, the solution defined in this document
(1) mandates that a publisher notify receivers immediately and
reliably whenever it encounters a situation in which it is unable to
keep the terms of the subscription and (2) provides the publisher
with the option to suspend the subscription in such a case.  This
includes indicating the fact that an update is incomplete as part of
a "push-update" or "push-change-update" notification, as well as
emitting a "subscription-suspended" notification as applicable.  This
is described further in Section 3.11.1.</t>
          <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.  In such cases, it is preferable to have a
subscriber request a less resource-intensive subscription than to
deal with frequently degraded behavior.</t>
          <t>The solution builds on <xref target="RFC8639"/>.  As defined therein, any loss of an
underlying transport connection will be detected and result in
subscription termination (in the case of dynamic subscriptions) or
suspension (in the case of configured subscriptions), ensuring that
situations where the loss of update notifications would go unnoticed
will not occur.</t>
        </section>
        <section anchor="data-encodings">
          <name>Data Encodings</name>
          <section anchor="periodic-subscriptions">
            <name>Periodic Subscriptions</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.</t>
          </section>
          <section anchor="on-change-subscriptions">
            <name>On-Change Subscriptions</name>
            <t>In an on-change subscription, update records need to indicate not
only values of changed datastore nodes but also the types of changes
that occurred since the last update.  Therefore, encoding rules for
data in on-change updates will generally follow YANG Patch operations
as specified in [RFC8072].  The YANG Patch operations will describe
what needs to be applied to the earlier state reported by the
preceding update in order to result in the now-current state.  Note
that objects referred to in an update are not limited to</t>
            <t>configuration data but can include any objects (including operational
data), whereas [RFC8072] patches apply only to configuration data in
configuration datastores.</t>
            <t>A publisher indicates the type of change to a datastore node using
the different YANG Patch operations: the "create" operation is used
for newly created objects (except entries in a user-ordered list),
the "delete" operation is used for deleted objects (including in
user-ordered lists), the "replace" operation is used when only the
object value changes, the "insert" operation is used when a new entry
is inserted in a list, and the "move" operation is used when an
existing entry in a user-ordered list is moved.</t>
            <t>However, a patch must be able to do more than just describe the delta
from the previous state to the current state.  As per Section 3.3, it
must also be able to identify whether transient changes have occurred
on an object during a dampening period.  To support this, it is valid
to encode a YANG Patch operation so that its application would result
in no change between the previous state and the current state.  This
indicates that some churn has occurred on the object.  An example of
this would be a patch that indicates a "create" operation for a
datastore node where the receiver believes one already exists or a
"replace" operation that replaces a previous value with the same
value.  Note that this means that the "create" and "delete" errors as
described in [RFC8072], Section 2.5 are not errors in the case of
YANG-Push (i.e., they are considered valid operations for YANG-Push).</t>
          </section>
        </section>
        <section anchor="defining-the-selection-with-a-datastore">
          <name>Defining the Selection with a Datastore</name>
          <t>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 data from
the publisher's datastore to the receivers.</t>
          <t>Only a single selection filter can be applied to a subscription at a
time.  An RPC request proposing a new selection filter replaces any
existing filter.  The following selection filter types are included
in the YANG-Push data model and may be applied against a datastore:</t>
          <ul spacing="normal">
            <li>
              <t>subtree: A subtree selection filter identifies one or more
datastore subtrees.  When specified, update records will only come
from the datastore nodes of selected datastore subtree(s).  The
syntax and semantics correspond to those specified in [RFC6241],
Section 6.</t>
            </li>
            <li>
              <t>xpath: An "xpath" selection filter is an XPath expression that
returns a node set.  (XPath is a query language for selecting
nodes in an XML document; see [XPATH] for details.)  When
specified, updates will only come from the selected datastore
nodes.</t>
            </li>
          </ul>
          <t>These filters are intended to be used as selectors that define which
objects are within the scope of a subscription.  A publisher <bcp14>MUST</bcp14>
support at least one type of selection filter.</t>
          <t>XPath itself provides powerful filtering constructs, and care must be
used in filter definition.  Consider an XPath filter that only passes
a datastore node when an interface is up.  It is up to the receiver
to understand the implications of the presence or absence of objects
in each update.</t>
          <t>When the set of selection-filtering criteria is applied for a
periodic subscription, these criteria are applied whenever a periodic
update record is constructed, and only datastore nodes that pass the
filter and to which a receiver has access are provided to that
receiver.  If the same filtering criteria are applied to an on-change
subscription, only the subset of those datastore nodes supporting
on-change is provided.  A datastore node that doesn't support
on-change is never sent as part of an on-change subscription's
"push-update" or "push-change-update" (Section 3.7).</t>
        </section>
        <section anchor="streaming-updates">
          <name>Streaming Updates</name>
          <t>Contrary to traditional data retrieval requests, datastore
subscription enables an unbounded series of update records to be
streamed over time.  Two generic YANG notifications for update
records have been defined for this scenario: "push-update" and
"push-change-update".</t>
          <t>A "push-update" notification defines a complete, filtered update of
the datastore per the terms of a subscription.  This type of YANG
notification is used for continuous updates of periodic
subscriptions.  A "push-update" notification can also be used for the
on-change subscriptions in two cases.  First, it <bcp14>MUST</bcp14> be used as the
initial "push-update" if there is a need to synchronize the receiver
at the start of a new subscription.  Second, it <bcp14>MAY</bcp14> be sent if the
publisher later chooses to resync an on-change subscription.  The
"push-update" update record contains an instantiated datastore
subtree with all of the subscribed contents.  The content of the
update record is equivalent to the contents that would be obtained
had the same data been explicitly retrieved using a datastore
retrieval operation using the same transport with the same filters
applied.</t>
          <t>A "push-change-update" notification is the most common type of update
for on-change subscriptions.  The update record in this case contains
the set of changes that datastore nodes have undergone since the last
notification message.  In other words, this indicates which datastore
nodes have been created, have been deleted, or have had changes to
their values.  In cases where multiple changes have occurred over the
course of a dampening period and the object has not been deleted, the
object's most current value is reported.  (In other words, for each
object, only one change is reported, not its entire history.  Doing
so would defeat the purpose of the dampening period.)</t>
          <t>"push-update" and "push-change-update" are encoded and placed in
notification messages and are ultimately queued for egress over the
specified transport.</t>
          <t>Figure 1 provides an example of a notification message for a
subscription tracking the operational status of a single Ethernet
interface (per <xref target="RFC8343"/>).  This notification message is encoded XML
<em>W3C.REC-xml-20081126</em> over the Network Configuration Protocol
(NETCONF) as per <em>RFC8640</em>.</t>
          <artwork><![CDATA[
<notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<eventTime>2017-10-25T08:00:11.22Z</eventTime>
<push-update xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push">
  <id>1011</id>
  <datastore-contents>
    <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
      <interface>
        <name>eth0</name>
        <oper-status>up</oper-status>
      </interface>
    </interfaces>
  </datastore-contents>
</push-update>
</notification>

                      Figure 1: Push Example
]]></artwork>
          <t>Figure 2 provides an example of an on-change notification message for
the same subscription.</t>
          <artwork><![CDATA[
<notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<eventTime>2017-10-25T08:22:33.44Z</eventTime>
<push-change-update
    xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push">
  <id>89</id>
  <datastore-changes>
    <yang-patch>
      <patch-id>0</patch-id>
      <edit>
        <edit-id>edit1</edit-id>
        <operation>replace</operation>
        <target>/ietf-interfaces:interfaces</target>
        <value>
          <interfaces
              xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
            <interface>
              <name>eth0</name>
              <oper-status>down</oper-status>
            </interface>
          </interfaces>
        </value>
      </edit>
    </yang-patch>
  </datastore-changes>
</push-change-update>
</notification>

    Figure 2: Push Example for an On-Change Notification Message
]]></artwork>
          <t>Of note in the above example is the "patch-id" with a value of "0".
Per [RFC8072], the "patch-id" is an arbitrary string.  With
YANG-Push, the publisher <bcp14>SHOULD</bcp14> put into the "patch-id" a counter
starting at "0" that increments with every "push-change-update"
generated for a subscription.  If used as a counter, this counter
<bcp14>MUST</bcp14> be reset to "0" any time a resynchronization occurs (i.e., with
the sending of a "push-update").  Also, if used as a counter, the
counter <bcp14>MUST</bcp14> be reset to "0" after passing a maximum value of
"4294967295" (i.e., the maximum value that can be represented using
the uint32 data type).  Such a mechanism allows easy identification
of lost or out-of-sequence update records.</t>
        </section>
        <section anchor="subscription-management">
          <name>Subscription Management</name>
          <t>The RPCs defined in <xref target="RFC8639"/> have been enhanced to support datastore
subscription negotiation.  Also, new error codes have been added that
are able to indicate why a datastore subscription attempt has failed,
along with new yang-data that <bcp14>MAY</bcp14> be used to include details on input
parameters that might result in a successful subsequent RPC
invocation.</t>
          <t>The establishment or modification of a datastore subscription can be
rejected for multiple reasons, including a subtree request that is
too large or the inability of the publisher to push update records as
frequently as requested.  In such cases, no subscription is
established.  Instead, a subscription result that includes the reason
for the failure is returned as part of the RPC response.  As part of
this response, a set of alternative subscription parameters <bcp14>MAY</bcp14> be
returned that would likely have resulted in acceptance of the
subscription request.  The subscriber may consider including such
parameters in future subscription attempts.</t>
          <t>In the case of a rejected request for establishment of a datastore
subscription, if there are hints, the hints <bcp14>SHOULD</bcp14> be transported in
a yang-data "establish-subscription-datastore-error-info" container
inserted into the RPC error response, in lieu of the "establish-
subscription-stream-error-info" that is inserted in the case of a
stream subscription.</t>
          <t>Figure 3 shows a tree diagram for "establish-subscription-datastore-
error-info".  All tree diagrams used in this document follow the
notation defined in <xref target="RFC8340"/>.</t>
          <artwork><![CDATA[
          yang-data establish-subscription-datastore-error-info
            +--ro establish-subscription-datastore-error-info
               +--ro reason?                identityref
               +--ro period-hint?           centiseconds
               +--ro filter-failure-hint?   string
               +--ro object-count-estimate? uint32
               +--ro object-count-limit?    uint32
               +--ro kilobytes-estimate?    uint32
               +--ro kilobytes-limit?       uint32

   Figure 3: "establish-subscription-datastore-error-info" Tree Diagram
]]></artwork>
          <t>Similarly, in the case of a rejected request for modification of a
   datastore subscription, if there are hints, the hints <bcp14>SHOULD</bcp14> be
   transported in a yang-data "modify-subscription-datastore-error-info"
   container inserted into the RPC error response, in lieu of the
   "modify-subscription-stream-error-info" that is inserted in the case
   of a stream subscription.</t>
          <t>Figure 4 shows a tree diagram for "modify-subscription-datastore-
   error-info".</t>
          <artwork><![CDATA[
          yang-data modify-subscription-datastore-error-info
            +--ro modify-subscription-datastore-error-info
               +--ro reason?                identityref
               +--ro period-hint?           centiseconds
               +--ro filter-failure-hint?   string
               +--ro object-count-estimate? uint32
               +--ro object-count-limit?    uint32
               +--ro kilobytes-estimate?    uint32
               +--ro kilobytes-limit?       uint32

     Figure 4: "modify-subscription-datastore-error-info" Tree Diagram
]]></artwork>
        </section>
        <section anchor="receiver-authorization">
          <name>Receiver Authorization</name>
          <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>
          <artwork><![CDATA[
                      +-----------------+      +--------------------+
  push-update or -->  | datastore node  |  yes | add datastore node |
 push-change-update   | access allowed? | ---> | to update record   |
                      +-----------------+      +--------------------+

              Figure 5: Access Control for Push Updates
]]></artwork>
          <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.  By the same
token, changes to objects that are filtered <bcp14>MUST NOT</bcp14> affect any
dampening intervals.</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="on-change-notifiable-datastore-nodes">
          <name>On-Change Notifiable Datastore Nodes</name>
          <t>In some cases, a publisher supporting on-change notifications may not
be able to push on-change updates for some object types.  Reasons for
this might be that the value of the datastore node changes frequently
(e.g., the in-octets counter as defined in <xref target="RFC8343"/>), small object
changes are frequent and meaningless (e.g., a temperature gauge
changing 0.1 degrees), or the implementation is not capable of
on-change notification for a particular object.</t>
          <t>In those cases, it will be important for client applications to have
a way to identify for which objects on-change notifications are
supported and for which ones they are not supported.  Otherwise,
client applications will have no way of knowing whether they can
indeed rely on their on-change subscription to provide them with the
change updates that they are interested in.  In other words, if
implementations do not provide a solution and do not support
comprehensive on-change notifiability, clients of those
implementations will have no way of knowing what their on-change
subscription actually covers.</t>
          <t>Implementations are therefore strongly advised to provide a solution
to this problem.  One solution might involve making discoverable to
clients which objects are on-change notifiable, specified using
another YANG data model.  Such a solution is specified in
<strong>Yang-Push-Notif-Cap</strong>.  Until this solution is standardized,
implementations <bcp14>SHOULD</bcp14> provide their own solution.</t>
        </section>
        <section anchor="other-considerations">
          <name>Other Considerations</name>
          <section anchor="robustness-and-reliability">
            <name>Robustness and Reliability</name>
            <t>It is important that updates as discussed in this document, and
on-change updates in particular, do not get lost.  If the loss of an
update is unavoidable, it is critical that the receiver be notified
accordingly.</t>
            <t>Update records for a single subscription <bcp14>MUST NOT</bcp14> be resequenced
prior to transport.</t>
            <t>It is conceivable that, under certain circumstances, a publisher will
recognize that it is unable to include in an update record the full
set of objects desired per the terms of a subscription.  In this
case, the publisher <bcp14>MUST</bcp14> act as follows:</t>
            <ul spacing="normal">
              <li>
                <t>The publisher <bcp14>MUST</bcp14> set the "incomplete-update" flag on any update
    record that is known to be missing information.</t>
              </li>
              <li>
                <t>The publisher <bcp14>MAY</bcp14> choose to suspend the subscription as per
    <xref target="RFC8639"/>.  If the publisher does not create an update record at
    all, it <bcp14>MUST</bcp14> suspend the subscription.</t>
              </li>
              <li>
                <t>When resuming an on-change subscription, the publisher <bcp14>SHOULD</bcp14>
    generate a complete patch from the previous update record.  If
    this is not possible and the "sync-on-start" option is set to
    "true" for the subscription, then the full datastore contents <bcp14>MAY</bcp14>
    be sent via a "push-update" instead (effectively replacing the
    previous contents).  If neither scenario above is possible, then
    an "incomplete-update" flag <bcp14>MUST</bcp14> be included on the next
    "push-change-update".</t>
              </li>
            </ul>
            <t>Note: It is perfectly acceptable to have a series of "push-change-
update" notifications (and even "push-update" notifications) serially
queued at the transport layer awaiting transmission.  It is not
required for the publisher to merge pending update records sent at
the same time.</t>
            <t>On the receiver side, what action to take when a record with an
"incomplete-update" flag is received depends on the application.  It
could simply choose to wait and do nothing.  It could choose to
resync, actively retrieving all subscribed information.  It could
also choose to tear down the subscription and start a new one,
perhaps with a smaller scope that contains fewer objects.</t>
          </section>
          <section anchor="publisher-capacity">
            <name>Publisher Capacity</name>
            <t>It is far preferable to decline a subscription request than to accept
such a request when it cannot be met.</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, and the number and combination of other subscriptions
that are concurrently being serviced.</t>
          </section>
        </section>
      </section>
      <section anchor="subscription-state-change-notifications-1">
        <name>Subscription State Change Notifications</name>
      </section>
    </section>
    <section anchor="yang-data-model-tree-diagrams-from-rfc-8639">
      <name>YANG Data Model Tree Diagrams (from RFC 8639)</name>
      <t>This section contains tree diagrams for nodes defined in Section 4.
For tree diagrams of subscription state change notifications, see
Section 2.7.  For the tree diagrams for the RPCs, see Section 2.4.</t>
      <section anchor="the-streams-container">
        <name>The "streams" Container</name>
        <t>A publisher maintains a list of available event streams as
operational data.  This list contains both standardized and
vendor-specific event streams.  This enables subscribers to discover
what streams a publisher supports.</t>
        <t>Below is a tree diagram for the "streams" container.  All objects
contained in this tree are described in the YANG module in Section 4.</t>
        <artwork><![CDATA[
  +--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}?

            Figure 18: "streams" Container Tree Diagram
]]></artwork>
      </section>
      <section anchor="the-filters-container">
        <name>The "filters" Container</name>
        <t>The "filters" container maintains a list of all subscription filters
that persist outside the lifecycle of a single subscription.  This
enables predefined filters that may be referenced by more than one
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 Section 4.</t>
        <artwork><![CDATA[
  +--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}?

            Figure 19: "filters" Container Tree Diagram
]]></artwork>
      </section>
      <section anchor="the-subscriptions-container">
        <name>The "subscriptions" Container</name>
        <t>The "subscriptions" container maintains a list of all subscriptions
on a publisher, both configured and dynamic.  It can be used to
retrieve information about the subscriptions that a publisher is
serving.</t>
        <t>Below is a tree diagram for the "subscriptions" container.  All
objects contained in this tree are described in the YANG module in
Section 4.</t>
        <artwork><![CDATA[
  +--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}?
        +--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

          Figure 20: "subscriptions" Container Tree Diagram
]]></artwork>
      </section>
    </section>
    <section anchor="a-yang-data-model-for-management-of-datastore-push-subscriptions-from-rfc-8641">
      <name>A YANG Data Model for Management of Datastore Push Subscriptions (from RFC 8641)</name>
      <section anchor="overview">
        <name>Overview</name>
        <t>The YANG data model for datastore push subscriptions is depicted in
Figures 6 through 9.  The tree diagram that is used follows the
notation defined in <xref target="RFC8340"/>.  New schema objects defined here
(i.e., beyond those from <xref target="RFC8639"/>) are identified with "yp".  For
the reader's convenience, in order to compact the tree
representation, some nodes that are defined in the ietf-subscribed-
notifications YANG module <xref target="RFC8639"/> and therefore are not essential
to the understanding of the data model defined here have been
removed.  This is indicated by "..." in the diagram where applicable.</t>
        <t>Because the tree diagram is quite large, its depiction is broken up
into four figures.  Figure 6 depicts the augmentations that are
introduced in YANG module ietf-yang-push to the subscription
configuration specified in YANG module ietf-subscribed-notifications.</t>
        <artwork><![CDATA[
  module: ietf-subscribed-notifications
    ...
    +--rw filters
    |  ...
    |  +--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 (target)
          |  +--:(stream)
          |  |   ...
          |  +--:(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 (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

      Figure 6: Data Model Structure: Subscription Configuration
]]></artwork>
        <t>Figure 7 depicts the augmentations of YANG module ietf-yang-push made
to RPCs specified in YANG module ietf-subscribed-notifications
<xref target="RFC8639"/>.  Specifically, these augmentations concern the "establish-
subscription" and "modify-subscription" RPCs, which are augmented
with parameters that are needed to specify datastore push
subscriptions.</t>
        <artwork><![CDATA[
  rpcs:
    +---x establish-subscription
    |  +---w input
    |  |  ...
    |  |  +---w (target)
    |  |  |  +--:(stream)
    |  |  |  |  ...
    |  |  |  +--:(yp:datastore)
    |  |  |     +---w yp:datastore                   identityref
    |  |  |     +---w (yp:selection-filter)?
    |  |  |        +--:(yp:by-reference)
    |  |  |        |  +---w yp:selection-filter-ref
    |  |  |        |          selection-filter-ref
    |  |  |        +--:(yp:within-subscription)
    |  |  |           +---w (yp:filter-spec)?
    |  |  |              +--:(yp:datastore-subtree-filter)
    |  |  |              |  +---w yp:datastore-subtree-filter?
    |  |  |              |          <anydata> {sn:subtree}?
    |  |  |              +--:(yp:datastore-xpath-filter)
    |  |  |                 +---w yp:datastore-xpath-filter?
    |  |  |                         yang:xpath1.0 {sn:xpath}?
    |  |  | ...
    |  |  +---w (yp:update-trigger)
    |  |     +--:(yp:periodic)
    |  |     |  +---w yp:periodic!
    |  |     |     +---w yp:period         centiseconds
    |  |     |     +---w yp:anchor-time?   yang:date-and-time
    |  |     +--:(yp:on-change) {on-change}?
    |  |        +---w yp:on-change!
    |  |           +---w yp:dampening-period?   centiseconds
    |  |           +---w yp:sync-on-start?      boolean
    |  |           +---w yp:excluded-change*    change-type
    |  +--ro output
    |     +--ro id                            subscription-id
    |     +--ro replay-start-time-revision?   yang:date-and-time
    |             {replay}?
    +---x modify-subscription
    |  +---w input
    |     ...
    |     +---w (target)
    |     |  ...
    |     |  +--:(yp:datastore)
    |     |     +---w yp:datastore                   identityref
    |     |     +---w (yp:selection-filter)?
    |     |        +--:(yp:by-reference)
    |     |        |  +---w yp:selection-filter-ref
    |     |        |          selection-filter-ref
    |     |        +--:(yp:within-subscription)
    |     |           +---w (yp:filter-spec)?
    |     |              +--:(yp:datastore-subtree-filter)
    |     |              |  +---w yp:datastore-subtree-filter?
    |     |              |          <anydata> {sn:subtree}?
    |     |              +--:(yp:datastore-xpath-filter)
    |     |                 +---w yp:datastore-xpath-filter?
    |     |                         yang:xpath1.0 {sn:xpath}?
    |     | ...
    |     +---w (yp:update-trigger)
    |        +--:(yp:periodic)
    |        |  +---w yp:periodic!
    |        |     +---w yp:period         centiseconds
    |        |     +---w yp:anchor-time?   yang:date-and-time
    |        +--:(yp:on-change) {on-change}?
    |           +---w yp:on-change!
    |              +---w yp:dampening-period?   centiseconds
    +---x delete-subscription
    |  ...
    +---x kill-subscription
      ...

  yang-data (for placement into RPC error responses)
    ...

                Figure 7: Data Model Structure: RPCs
]]></artwork>
        <t>Figure 8 depicts augmentations of YANG module ietf-yang-push to the
notifications that are specified in YANG module ietf-subscribed-
notifications.  The augmentations allow the inclusion of subscription
configuration parameters that are specific to datastore push
subscriptions as part of "subscription-started" and "subscription-
modified" notifications.</t>
        <artwork><![CDATA[
     notifications:
       +---n replay-completed {replay}?
       |  ...
       +---n subscription-completed
       |  ...
       +---n subscription-started {configured}?
       |  |  ...
       |  +--ro (target)
       |  |  ...
       |  |  +--:(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 (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
       +---n subscription-resumed
       |  ...
       +---n subscription-modified
       |  ...
       |  +--ro (target)
       |  |  |  ...
       |  |  +--:(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 (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
       +---n subscription-terminated
       |  ...
       +---n subscription-suspended
          ...

               Figure 8: Data Model Structure: Notifications
]]></artwork>
        <t>Finally, Figure 9 depicts the parts of YANG module ietf-yang-push
that are newly introduced in this document (i.e., that are not simply
augmentations of another YANG module).</t>
        <artwork><![CDATA[
module: ietf-yang-push

  rpcs:
    +---x resync-subscription {on-change}?
      +---w input
          +---w id    sn:subscription-id

  yang-data (for placement into RPC error responses):
    +-- resync-subscription-error
    |  +--ro reason?                   identityref
    |  +--ro period-hint?              centiseconds
    |  +--ro filter-failure-hint?      string
    |  +--ro object-count-estimate?    uint32
    |  +--ro object-count-limit?       uint32
    |  +--ro kilobytes-estimate?       uint32
    |  +--ro kilobytes-limit?          uint32
    +-- establish-subscription-error-datastore
    |  +--ro reason?                   identityref
    |  +--ro period-hint?              centiseconds
    |  +--ro filter-failure-hint?      string
    |  +--ro object-count-estimate?    uint32
    |  +--ro object-count-limit?       uint32
    |  +--ro kilobytes-estimate?       uint32
    |  +--ro kilobytes-limit?          uint32
    +-- modify-subscription-error-datastore
      +--ro reason?                   identityref
      +--ro period-hint?              centiseconds
      +--ro filter-failure-hint?      string
      +--ro object-count-estimate?    uint32
      +--ro object-count-limit?       uint32
      +--ro kilobytes-estimate?       uint32
      +--ro kilobytes-limit?          uint32
    notifications:
      +---n push-update
      |  +--ro id?                   sn:subscription-id
      |  +--ro datastore-contents?   <anydata>
      |  +--ro incomplete-update?    empty
      +---n push-change-update {on-change}?
          +--ro id?                   sn:subscription-id
          +--ro datastore-changes
          |  +--ro yang-patch
          |     +--ro patch-id    string
          |     +--ro comment?    string
          |     +--ro edit* [edit-id]
          |        +--ro edit-id      string
          |        +--ro operation    enumeration
          |        +--ro target       target-resource-offset
          |        +--ro point?       target-resource-offset
          |        +--ro where?       enumeration
          |        +--ro value?       <anydata>
          +--ro incomplete-update?    empty

      Figure 9: Data Model Structure: Non-augmentation Portions
]]></artwork>
        <t>Selected components of the data model are summarized below.</t>
      </section>
      <section anchor="subscription-configuration">
        <name>Subscription Configuration</name>
        <t>Both configured and dynamic subscriptions are represented in the list
"subscription".  New parameters extending the basic subscription data
model in <xref target="RFC8639"/> include:</t>
        <ul spacing="normal">
          <li>
            <t>The targeted datastore from which the selection is being made.
The potential datastores include those from <xref target="RFC8342"/>.  A platform
may also choose to support a custom datastore.</t>
          </li>
          <li>
            <t>A selection filter identifying YANG nodes of interest in a
datastore.  Filter contents are specified via a reference to an
existing filter or via an in-line definition for only that
subscription.  Referenced filters allow an implementation to avoid
evaluating filter acceptability during a dynamic subscription
request.  The "case" statement differentiates the options.</t>
          </li>
          <li>
            <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 "period" that defines the duration between push updates.</t>
              </li>
              <li>
                <t>an "anchor-time"; update intervals fall on the points in time
 that are a multiple of a "period" from an "anchor-time".  If an
 "anchor-time" is not provided, then the "anchor-time" <bcp14>MUST</bcp14> be
 set with the creation time of the initial update record.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>For on-change subscriptions, assuming that any dampening period
has completed, triggering occurs whenever a change in the
subscribed information is detected.  On-change subscriptions have
more-complex semantics that are guided by their own set of
parameters:  </t>
            <ul spacing="normal">
              <li>
                <t>a "dampening-period" that specifies the interval that must pass
  before a successive update for the subscription is sent.  If no
  dampening period is in effect, the update is sent immediately.
  If a subsequent change is detected, another update is only sent
  once the dampening period has passed for this subscription.</t>
              </li>
              <li>
                <t>an "excluded-change" that allows the restriction of the types
  of changes for which updates should be sent (e.g., only add to
  an update record on object creation).</t>
              </li>
              <li>
                <t>a "sync-on-start" that specifies whether a complete update with
  all the subscribed data is to be sent at the beginning of a
  subscription.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="yang-notifications">
        <name>YANG Notifications</name>
        <section anchor="state-change-notifications">
          <name>State Change Notifications</name>
          <t>Subscription state notifications and mechanisms are reused from
<xref target="RFC8639"/>.  Notifications "subscription-started" and "subscription-
modified" have been augmented to include the datastore-specific
objects.</t>
        </section>
        <section anchor="notifications-for-subscribed-content">
          <name>Notifications for Subscribed Content</name>
          <t>Along with the subscribed content, there are other objects that might
be part of a "push-update" or "push-change-update" notification.</t>
          <ul spacing="normal">
            <li>
              <t>An "id" (that identifies the subscription).  This object <bcp14>MUST</bcp14> be
transported along with the subscribed contents.  It allows a
receiver to determine which subscription resulted in a particular
update record.</t>
            </li>
            <li>
              <t>An "incomplete-update" leaf.  This leaf indicates that not all
changes that have occurred since the last update are actually
included with this update.  In other words, the publisher has
failed to fulfill its full subscription obligations.  (For
example, a datastore was unable to provide the full set of
datastore nodes to a publisher process.)  To facilitate the
resynchronization of on-change subscriptions, a publisher <bcp14>MAY</bcp14>
subsequently send a "push-update" containing a full selection
snapshot of subscribed data.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="yang-rpcs">
        <name>YANG RPCs</name>
        <t>YANG-Push subscriptions are established, modified, and deleted using
RPCs augmented from <xref target="RFC8639"/>.</t>
        <section anchor="establish-subscription-rpc">
          <name>"establish-subscription" RPC</name>
          <t>The subscriber sends an "establish-subscription" RPC with the
parameters listed in Section 3.1.  An example might look like:</t>
          <artwork><![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-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:periodic>
       <yp:period>500</yp:period>
     </yp:periodic>
   </establish-subscription>
 </netconf:rpc>

                  Figure 10: "establish-subscription" RPC
]]></artwork>
          <t>A positive response includes the "id" of the accepted subscription.
In that case, a publisher may respond as follows:</t>
          <artwork><![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-subscribed-notifications">
       52
    </id>
 </rpc-reply>

         Figure 11: "establish-subscription" Positive RPC Response
]]></artwork>
          <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
[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:dampening-period>100</yp:dampening-period>
      </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="modify-subscription-rpc">
          <name>"modify-subscription" RPC</name>
          <t>The subscriber <bcp14>MAY</bcp14> invoke the "modify-subscription" RPC for a
subscription it previously established.  The subscriber will include
newly desired values in the "modify-subscription" RPC.  Parameters
not included <bcp14>MUST</bcp14> remain unmodified.  Figure 14 provides an example
where a subscriber attempts to modify the period and datastore XPath
filter of a subscription using NETCONF.</t>
          <artwork><![CDATA[
  <rpc message-id="102"
      xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
    <modify-subscription
        xmlns=
          "urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications"
        xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push">
      <id>1011</id>
      <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:bar
      </yp:datastore-xpath-filter>
      <yp:periodic>
        <yp:period>250</yp:period>
      </yp:periodic>
    </modify-subscription>
  </rpc>

              Figure 14: "modify-subscription" Request
]]></artwork>
          <t>The publisher <bcp14>MUST</bcp14> respond to the subscription modification request.
If the request is rejected, the existing subscription is left
unchanged, and the publisher <bcp14>MUST</bcp14> send an RPC error response.  This
response might have hints encapsulated in the yang-data structure
"modify-subscription-error-datastore".  A subscription <bcp14>MAY</bcp14> be
modified multiple times.</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 specified in
[RFC8640].</t>
          <t>A configured subscription cannot be modified using a
"modify-subscription" RPC.  Instead, the configuration needs to be
edited as needed.</t>
        </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 anchor="resync-subscription-rpc">
          <name>"resync-subscription" RPC</name>
          <t>This RPC is supported only for on-change subscriptions previously
established using an "establish-subscription" RPC.  For example:</t>
          <artwork><![CDATA[
  <rpc message-id="103"
        xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
    <resync-subscription
        xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push">
      <id>1011</id>
    </resync-subscription>
  </rpc>

                  Figure 15: "resync-subscription"
]]></artwork>
          <t>On receipt, a publisher must either (1) accept the request and
quickly follow with a "push-update" or (2) send an appropriate error
in an RPC error response.  In its error response, the publisher <bcp14>MAY</bcp14>
include, in the yang-data structure "resync-subscription-error",
supplemental information about the reasons for the error.</t>
        </section>
        <section anchor="yang-module-synchronization">
          <name>YANG Module Synchronization</name>
          <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
[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
nodes from changed modules correctly.</t>
        </section>
      </section>
    </section>
    <section anchor="yang-model">
      <name>YANG Model</name>
      <t>RFC 8639: This module imports typedefs from [RFC6991], <xref target="RFC8343"/>, <xref target="RFC8341"/>,
[RFC8529], and [RFC8040].  It references [RFC6241], [XPATH] ("XML
Path Language (XPath) Version 1.0"), [RFC7049], [RFC8259], [RFC7950],
[RFC7951], and [RFC7540].</t>
      <t>RFC 8641: This YANG module imports typedefs from [RFC6991], identities from
<xref target="RFC8342"/>, the "yang-data" extension from [RFC8040], and the
"yang-patch" grouping from [RFC8072].  In addition, it imports and
augments many definitions from <xref target="RFC8639"/>.  It also references
[RFC6241], [XPATH] ("XML Path Language (XPath) Version 1.0"), and
[RFC7950].</t>
      <figure>
        <name>YANG module ietf-subscribed-notifications</name>
        <sourcecode type="yang" markers="true" name="ietf-subscribed-notifications@2019-09-09.yang"><![CDATA[
module ietf-subscribed-notifications {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications";
  prefix sn;

  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-netconf-acm {
    prefix nacm;
    reference
      "RFC 8341: Network Configuration Access Control Model";
  }
  import ietf-network-instance {
    prefix ni;
    reference
      "RFC 8529: YANG Data Model for Network Instances";
  }
  import ietf-restconf {
    prefix rc;
    reference
      "RFC 8040: RESTCONF Protocol";
  }
  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types";
  }

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

     Author:  Alexander Clemm
              <mailto:ludwig@clemm.org>

     Author:  Eric Voit
              <mailto:evoit@cisco.com>

     Author:  Alberto Gonzalez Prieto
              <mailto:alberto.gonzalez@microsoft.com>

     Author:  Einar Nilsen-Nygaard
              <mailto:einarnn@cisco.com>

     Author:  Ambika Prasad Tripathy
              <mailto:ambtripa@cisco.com>";
  description
    "This module defines a YANG data model for subscribing to event
     records and receiving matching content in notification messages.

     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) 2019 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 8639; see the
     RFC itself for full legal notices.";

  revision 2019-09-09 {
    description
      "Initial version.";
    reference
      "RFC 8639: A YANG Data Model for Subscriptions to
                 Event Notifications";
  }

  /*
   * FEATURES
   */

  feature configured {
    description
      "This feature indicates that configuration of subscriptions is
       supported.";
  }

  feature dscp {
    description
      "This feature indicates that a publisher supports the ability
       to set the Differentiated Services Code Point (DSCP) value in
       outgoing packets.";
  }

  feature encode-json {
    description
      "This feature indicates that JSON encoding of notification
       messages is supported.";
  }

  feature encode-xml {
    description
      "This feature indicates that XML encoding of notification
       messages is supported.";
  }

  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 qos {
    description
      "This feature indicates that a publisher supports absolute
       dependencies of one subscription's traffic over another
       as well as weighted bandwidth sharing between subscriptions.
       Both of these are Quality of Service (QoS) features that allow
       differentiated treatment of notification messages between a
       publisher and a specific receiver.";
  }

  feature replay {
    description
      "This feature indicates that historical event record replay is
       supported.  With replay, it is possible for past event records
       to be streamed in chronological order.";
  }

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

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

  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)";
  }

  /*
   * EXTENSIONS
   */

  extension subscription-state-notification {
    description
      "This statement applies only to notifications.  It indicates
       that the notification is a subscription state change
       notification.  Therefore, it does not participate in a regular
       event stream and does not need to be specifically subscribed
       to in order to be received.  This statement can only occur as
       a substatement of the YANG 'notification' statement.  This
       statement is not for use outside of this YANG module.";
  }

  /*
   * 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 modify-subscription-error {
    description
      "Base identity for the problem found while attempting to
       fulfill a 'modify-subscription' RPC request.";
  }

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

  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;
    if-feature "dscp";
    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;
    base modify-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;
    base modify-subscription-error;
    base subscription-suspended-reason;
    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 modify-subscription-error;
    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 replay-unsupported {
    base establish-subscription-error;
    if-feature "replay";
    description
      "Replay cannot be performed for this subscription.  This means
       the publisher will not provide the requested historic
       information from the event stream via replay to this
       receiver.";
  }

  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-suspended-reason;
    description
      "The publisher does not have the network bandwidth needed to
       get the volume of generated information intended for a
       receiver.";
  }

  /* 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.";
    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 encode-xml {
    base encoding;
    if-feature "encode-xml";
    description
      "Encode data using XML as described in RFC 7950.";
    reference
      "RFC 7950: The YANG 1.1 Data Modeling Language";
  }

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

  /* Identities for transports */

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

  /*
   * TYPEDEFs
   */

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

  typedef stream-filter-ref {
    type leafref {
      path "/sn:filters/sn:stream-filter/sn:name";
    }
    description
      "This type is used to reference an event stream filter.";
  }

  typedef stream-ref {
    type leafref {
      path "/sn:streams/sn:stream/sn:name";
    }
    description
      "This type is used to reference a system-provided
       event stream.";
  }

  typedef subscription-id {
    type uint32;
    description
      "A type for subscription identifiers.";
  }

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

  /*
   * GROUPINGS
   */

  grouping stream-filter-elements {
    description
      "This grouping defines the base for filters applied to event
       streams.";
    choice filter-spec {
      description
        "The content filter specification for this request.";
      anydata stream-subtree-filter {
        if-feature "subtree";
        description
          "Event stream evaluation criteria encoded in the syntax of
           a subtree filter as defined in RFC 6241, Section 6.

           The subtree filter is applied to the representation of
           individual, delineated event records as contained in the
           event stream.

           If the subtree filter returns a non-empty node set, the
           filter matches the event record, and the event record is
           included in the notification message sent to the
           receivers.";
        reference
          "RFC 6241: Network Configuration Protocol (NETCONF),
                     Section 6";
      }
      leaf stream-xpath-filter {
        if-feature "xpath";
        type yang:xpath1.0;
        description
          "Event stream evaluation criteria encoded in the syntax of
           an XPath 1.0 expression.

           The XPath expression is evaluated on the representation of
           individual, delineated event records as contained in
           the event stream.

           The result of the XPath expression is converted to a
           boolean value using the standard XPath 1.0 rules.  If the
           boolean value is 'true', the filter matches the event
           record, and the event record is included in the
           notification message sent to the receivers.

           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.";
        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-qos {
    description
      "This grouping describes QoS information concerning a
       subscription.  This information is passed to lower layers
       for transport prioritization and treatment.";
    leaf dscp {
      if-feature "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.";
    }
    leaf weighting {
      if-feature "qos";
      type uint8 {
        range "0 .. 255";
      }
      description
        "Relative weighting for a subscription.  Larger weights get
         more resources.  Allows an underlying transport layer to
         perform informed load-balance allocations between various
         subscriptions.";
      reference
        "RFC 7540: Hypertext Transfer Protocol Version 2 (HTTP/2),
                   Section 5.3.2";
    }
    leaf dependency {
      if-feature "qos";
      type subscription-id;
      description
        "Provides the 'subscription-id' of a parent subscription.
         The parent subscription has absolute precedence should
         that parent have push updates ready to egress the publisher.
         In other words, there should be no streaming of objects from
         the current subscription if the parent has something ready
         to push.

         If a dependency is asserted via configuration or via an RPC
         but the referenced 'subscription-id' does not exist, the
         dependency is silently discarded.  If a referenced
         subscription is deleted, this dependency is removed.";
      reference
        "RFC 7540: Hypertext Transfer Protocol Version 2 (HTTP/2),
                   Section 5.3.1";
    }
  }

  grouping subscription-policy-modifiable {
    description
      "This grouping describes all objects that may be changed
       in a subscription.";
    choice target {
      mandatory true;
      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.";
      case stream {
        choice stream-filter {
          description
            "An event stream filter can be applied to a subscription.
             That filter will either come referenced from a global
             list or be provided in the subscription itself.";
          case by-reference {
            description
              "Apply a filter that has been configured separately.";
            leaf stream-filter-name {
              type stream-filter-ref;
              mandatory true;
              description
                "References an existing event stream filter that is
                 to be applied to an event stream for the
                 subscription.";
            }
          }
          case within-subscription {
            description
              "A local definition allows a filter to have the same
               lifecycle as the subscription.";
            uses stream-filter-elements;
          }
        }
      }
    }
    leaf stop-time {
      type yang:date-and-time;
      description
        "Identifies a time after which notification messages for a
         subscription should not be sent.  If 'stop-time' is not
         present, the notification messages will continue until the
         subscription is terminated.  If 'replay-start-time' exists,
         'stop-time' must be for a subsequent time.  If
         'replay-start-time' doesn't exist, 'stop-time', when
         established, must be for a future time.";
    }
  }

  grouping subscription-policy-dynamic {
    description
      "This grouping describes the only information concerning a
       subscription that can be passed over the RPCs defined in this
       data model.";
    uses subscription-policy-modifiable {
      augment "target/stream" {
        description
          "Adds additional objects that can be modified by an RPC.";
        leaf stream {
          type stream-ref {
            require-instance false;
          }
          mandatory true;
          description
            "Indicates the event stream to be considered for
             this subscription.";
        }
        leaf replay-start-time {
          if-feature "replay";
          type yang:date-and-time;
          config false;
          description
            "Used to trigger the 'replay' feature for a dynamic
             subscription, where event records that are selected
             need to be at or after the specified starting time.  If
             'replay-start-time' is not present, this is not a replay
             subscription and event record push should start
             immediately.  It is never valid to specify start times
             that are later than or equal to the current time.";
        }
      }
    }
    uses update-qos;
  }

  grouping subscription-policy {
    description
      "This grouping describes the full set of policy information
       concerning both dynamic and configured subscriptions, with the
       exclusion of both receivers and networking information
       specific to the publisher, such as what interface should be
       used to transmit notification messages.";
    uses subscription-policy-dynamic;
    leaf transport {
      if-feature "configured";
      type transport;
      description
        "For a configured subscription, this leaf specifies the
         transport used to deliver messages destined for all
         receivers of that subscription.";
    }
    leaf encoding {
      when 'not(../transport) or derived-from(../transport,
      "sn:configurable-encoding")';
      type encoding;
      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.";
    }
    leaf purpose {
      if-feature "configured";
      type string;
      description
        "Open text allowing a configuring entity to embed the
         originator or other specifics of this subscription.";
    }
  }

  /*
   * RPCs
   */

  rpc establish-subscription {
    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 subscription-policy-dynamic;
      leaf encoding {
        type encoding;
        description
          "The type of encoding for the subscribed data.  If not
           included as part of the RPC, the encoding MUST be set by
           the publisher to be the encoding used by this RPC.";
      }
    }
    output {
      leaf id {
        type subscription-id;
        mandatory true;
        description
          "Identifier used for this subscription.";
      }
      leaf replay-start-time-revision {
        if-feature "replay";
        type yang:date-and-time;
        description
          "If a replay has been requested, this object represents
           the earliest time covered by the event buffer for the
           requested event stream.  The value of this object is the
           'replay-log-aged-time' if it exists.  Otherwise, it is
           the 'replay-log-creation-time'.  All buffered event
           records after this time will be replayed to a receiver.
           This object will only be sent if the starting time has
           been revised to be later than the time requested by the
           subscriber.";
      }
    }
  }

  rc:yang-data 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 modify-subscription {
    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.  In that case, the RPC error MAY
       include 'error-info' suggested parameter hints that would have
       a high likelihood of succeeding in a subsequent
       'modify-subscription' request.  A successful
       'modify-subscription' will return a suspended subscription to
       the 'active' state.";
    input {
      leaf id {
        type subscription-id;
        mandatory true;
        description
          "Identifier to use for this subscription.";
      }
      uses subscription-policy-modifiable;
    }
  }

  rc:yang-data modify-subscription-stream-error-info {
    container modify-subscription-stream-error-info {
      description
        "This yang-data MAY be provided as part of a subscription's
         RPC error response when there is a failure of a
         'modify-subscription' RPC that has been made against an
         event stream.  This yang-data MUST be used if hints are to
         be provided back to the subscriber.";
      leaf reason {
        type identityref {
          base modify-subscription-error;
        }
        description
          "Information in a 'modify-subscription' RPC error response
           that indicates the reason why the subscription to an event
           stream has failed to be modified.";
      }
      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 {
    description
      "This RPC allows a subscriber to delete a subscription that
       was previously created by that same subscriber using the
       'establish-subscription' 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
          "Identifier of the subscription that is to be deleted.
           Only subscriptions that were created using
           'establish-subscription' from the same origin as this RPC
           can be deleted via this RPC.";
      }
    }
  }

  rpc kill-subscription {
    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.

       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
          "Identifier of the subscription that is to be deleted.
           Only subscriptions that were created using
           'establish-subscription' can be deleted via this RPC.";
      }
    }
  }

  rc:yang-data 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
   */

  notification replay-completed {
    sn:subscription-state-notification;
    if-feature "replay";
    description
      "This notification is sent to indicate that all of the replay
       notifications have been sent.";
    leaf id {
      type subscription-id;
      mandatory true;
      description
        "This references the affected subscription.";
    }
  }

  notification subscription-completed {
    sn:subscription-state-notification;
    if-feature "configured";
    description
      "This notification is sent to indicate that a subscription has
       finished passing event records, as the 'stop-time' has been
       reached.";
    leaf id {
      type subscription-id;
      mandatory true;
      description
        "This references the gracefully completed subscription.";
    }
  }

  notification subscription-modified {
    sn:subscription-state-notification;
    description
      "This notification indicates that a subscription has been
       modified.  Notification messages sent from this point on will
       conform to the modified terms of the subscription.  For
       completeness, this subscription state change notification
       includes both modified and unmodified aspects of a
       subscription.";
    leaf id {
      type subscription-id;
      mandatory true;
      description
        "This references the affected subscription.";
    }
    uses subscription-policy {
      refine "target/stream/stream-filter/within-subscription" {
        description
          "Filter applied to the subscription.  If the
           'stream-filter-name' is populated, the filter in the
           subscription came from the 'filters' container.
           Otherwise, it is populated in-line as part of the
           subscription.";
      }
    }
  }

  notification subscription-resumed {
    sn:subscription-state-notification;
    description
      "This notification indicates that a subscription that had
       previously been suspended has resumed.  Notifications will
       once again be sent.  In addition, a 'subscription-resumed'
       indicates that no modification of parameters has occurred
       since the last time event records have been sent.";
    leaf id {
      type subscription-id;
      mandatory true;
      description
        "This references the affected subscription.";
    }
  }

  notification subscription-started {
    sn:subscription-state-notification;
    if-feature "configured";
    description
      "This notification indicates that a subscription has started
       and notifications will now be sent.";
    leaf id {
      type subscription-id;
      mandatory true;
      description
        "This references the affected subscription.";
    }
    uses subscription-policy {
      refine "target/stream/replay-start-time" {
        description
          "Indicates the time that a replay is using for the
           streaming of buffered event records.  This will be
           populated with the most recent of the following:
           the event time of the previous event record sent to a
           receiver, the 'replay-log-creation-time', the
           'replay-log-aged-time', or the most recent publisher
           boot time.";
      }
      refine "target/stream/stream-filter/within-subscription" {
        description
          "Filter applied to the subscription.  If the
           'stream-filter-name' is populated, the filter in the
           subscription came from the 'filters' container.
           Otherwise, it is populated in-line as part of the
           subscription.";
      }
      augment "target/stream" {
        description
          "This augmentation adds additional parameters specific to a
           'subscription-started' notification.";
        leaf replay-previous-event-time {
          when '../replay-start-time';
          if-feature "replay";
          type yang:date-and-time;
          description
            "If there is at least one event in the replay buffer
             prior to 'replay-start-time', this gives the time of
             the event generated immediately prior to the
             'replay-start-time'.

             If a receiver previously received event records for
             this configured subscription, it can compare this time
             to the last event record previously received.  If the
             two are not the same (perhaps due to a reboot), then a
             dynamic replay can be initiated to acquire any missing
             event records.";
        }
      }
    }
  }

  notification subscription-suspended {
    sn:subscription-state-notification;
    description
      "This notification indicates that a suspension of the
       subscription by the publisher has occurred.  No further
       notifications will be sent until the subscription resumes.
       This notification shall only be sent to receivers of a
       subscription; it does not constitute a general-purpose
       notification.";
    leaf id {
      type subscription-id;
      mandatory true;
      description
        "This references the affected subscription.";
    }
    leaf reason {
      type identityref {
        base subscription-suspended-reason;
      }
      mandatory true;
      description
        "Identifies the condition that resulted in the suspension.";
    }
  }

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

  /*
   * DATA NODES
   */

  container streams {
    config false;
    description
      "Contains information on the built-in event streams provided by
       the publisher.";
    list stream {
      key "name";
      description
        "Identifies the built-in event streams that are supported by
         the publisher.";
      leaf name {
        type string;
        description
          "A handle for a system-provided event stream made up of a
           sequential set of event records, each of which is
           characterized by its own domain and semantics.";
      }
      leaf description {
        type string;
        description
          "A description of the event stream, including such
           information as the type of event records that are
           available in this event stream.";
      }
      leaf replay-support {
        if-feature "replay";
        type empty;
        description
          "Indicates that event record replay is available on this
           event stream.";
      }
      leaf replay-log-creation-time {
        when '../replay-support';
        if-feature "replay";
        type yang:date-and-time;
        mandatory true;
        description
          "The timestamp of the creation of the log used to support
           the replay function on this event stream.  This time
           might be earlier than the earliest available information
           contained in the log.  This object is updated if the log
           resets for some reason.";
      }
      leaf replay-log-aged-time {
        when '../replay-support';
        if-feature "replay";
        type yang:date-and-time;
        description
          "The timestamp associated with the last event record that
           has been aged out of the log.  This timestamp identifies
           how far back in history this replay log extends, if it
           doesn't extend back to the 'replay-log-creation-time'.
           This object MUST be present if replay is supported and any
           event records have been aged out of the log.";
      }
    }
  }
  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 stream-filter {
      key "name";
      description
        "A list of preconfigured filters that can be applied to
         subscriptions.";
      leaf name {
        type string;
        description
          "A name to differentiate between filters.";
      }
      uses stream-filter-elements;
    }
  }
  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.";
      leaf id {
        type subscription-id;
        description
          "Identifier of a subscription; unique in a given
           publisher.";
      }
      uses subscription-policy {
        refine "target/stream/stream" {
          description
            "Indicates the event stream to be considered for this
             subscription.  If an event stream has been removed
             and can no longer be referenced by an active
             subscription, send a 'subscription-terminated'
             notification with 'stream-unavailable' as the reason.
             If a configured subscription refers to a nonexistent
             event stream, move that subscription to the
             'invalid' state.";
        }
        refine "transport" {
          description
            "For a configured subscription, this leaf specifies the
             transport used to deliver messages destined for all
             receivers of that subscription.  This object is
             mandatory for subscriptions in the configuration
             datastore.  This object (1) is not mandatory for dynamic
             subscriptions in the operational state datastore and
             (2) should not be present for other types of dynamic
             subscriptions.";
        }
        augment "target/stream" {
          description
            "Enables objects to be added to a configured stream
             subscription.";
          leaf configured-replay {
            if-feature "configured";
            if-feature "replay";
            type empty;
            description
              "The presence of this leaf indicates that replay for
               the configured subscription should start at the
               earliest time in the event log or at the publisher
               boot time, whichever is later.";
          }
        }
      }
      choice notification-message-origin {
        if-feature "configured";
        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.";
          }
        }
      }
      leaf configured-subscription-state {
        if-feature "configured";
        type enumeration {
          enum valid {
            value 1;
            description
              "The subscription is supportable with its current
               parameters.";
          }
          enum invalid {
            value 2;
            description
              "The subscription as a whole is unsupportable with its
               current parameters.";
          }
          enum concluded {
            value 3;
            description
              "A subscription is inactive, as it has hit a
               stop time.  It no longer has receivers in the
               'active' or 'suspended' state, but the subscription
               has not yet been removed from configuration.";
          }
        }
        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.";
      }
      container receivers {
        description
          "Set of receivers in a subscription.";
        list receiver {
          key "name";
          min-elements 1;
          description
            "A host intended as a recipient for the notification
             messages of a subscription.  For configured
             subscriptions, transport-specific network parameters
             (or a leafref to those parameters) may be augmented to a
             specific receiver in this list.";
          leaf name {
            type string;
            description
              "Identifies a unique receiver for a subscription.";
          }
          leaf sent-event-records {
            type yang:zero-based-counter64;
            config false;
            description
              "The number of event records sent to the receiver.  The
               count is initialized when a dynamic subscription is
               established or when a configured receiver
               transitions to the 'valid' state.";
          }
          leaf excluded-event-records {
            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 state {
            type enumeration {
              enum active {
                value 1;
                description
                  "The receiver is currently being sent any
                   applicable notification messages for the
                   subscription.";
              }
              enum suspended {
                value 2;
                description
                  "The receiver state is 'suspended', so the
                   publisher is currently unable to provide
                   notification messages for the subscription.";
              }
              enum connecting {
                value 3;
                if-feature "configured";
                description
                  "A subscription has been configured, but a
                   'subscription-started' subscription state change
                   notification needs to be successfully received
                   before notification messages are sent.

                   If the 'reset' action is invoked for a receiver of
                   an active configured subscription, the state
                   must be moved to 'connecting'.";
              }
              enum disconnected {
                value 4;
                if-feature "configured";
                description
                  "A subscription has failed to send a
                   'subscription-started' state change to the
                   receiver.  Additional connection attempts are not
                   currently being made.";
              }
            }
            config false;
            mandatory true;
            description
              "Specifies the state of a subscription from the
               perspective of a particular receiver.  With this
               information, it is possible to determine whether a
               publisher is currently generating notification
               messages intended for that receiver.";
          }
          action reset {
            if-feature "configured";
            description
              "Allows the reset of this configured subscription's
               receiver to the 'connecting' state.  This enables the
               connection process to be reinitiated.";
            output {
              leaf time {
                type yang:date-and-time;
                mandatory true;
                description
                  "Time at which a publisher returned the receiver to
                   the 'connecting' state.";
              }
            }
          }
        }
      }
    }
  }
}
]]></sourcecode>
      </figure>
      <figure>
        <name>YANG module ietf-yang-push</name>
        <sourcecode type="yang" markers="true" name="ietf-yang-push@2019-09-09.yang"><![CDATA[
module ietf-yang-push {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-yang-push";
  prefix yp;

  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-datastores {
    prefix ds;
    reference
      "RFC 8342: Network Management Datastore Architecture (NMDA)";
  }
  import ietf-restconf {
    prefix rc;
    reference
      "RFC 8040: RESTCONF Protocol";
  }
  import ietf-yang-patch {
    prefix ypatch;
    reference
      "RFC 8072: YANG Patch Media Type";
  }

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

     Author:  Alexander Clemm
              <mailto:ludwig@clemm.org>

     Author:  Eric Voit
              <mailto:evoit@cisco.com>";

  description
    "This module contains YANG specifications for YANG-Push.

     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) 2019 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 2019-09-09 {
    description
      "Initial revision.";
    reference
      "RFC 8641: Subscriptions to YANG Datastores";
  }

  /*
   * FEATURES
   */

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

  /*
   * IDENTITIES
   */

  /* Error type identities for datastore subscription */

  identity resync-subscription-error {
    description
      "Problem found while attempting to fulfill a
       'resync-subscription' RPC request.";
  }

  identity cant-exclude {
    base sn:establish-subscription-error;
    description
      "Unable to remove the set of 'excluded-change' parameters.
       This means that the publisher is unable to restrict
       'push-change-update' notifications to just the change types
       requested for this subscription.";
  }

  identity datastore-not-subscribable {
    base sn:establish-subscription-error;
    base sn:subscription-terminated-reason;
    description
      "This is not a subscribable datastore.";
  }

  identity no-such-subscription-resync {
    base resync-subscription-error;
    description
      "The 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 on-change-unsupported {
    base sn:establish-subscription-error;
    description
      "On-change is not supported for any objects that are
       selectable by this filter.";
  }

  identity on-change-sync-unsupported {
    base sn:establish-subscription-error;
    description
      "Neither 'sync-on-start' nor resynchronization is supported for
       this subscription.  This error will be used for two reasons:
       (1) if an 'establish-subscription' RPC includes
       'sync-on-start' but the publisher can't support sending a
       'push-update' for this subscription for reasons other than
       'on-change-unsupported' or 'sync-too-big'
       (2) if the 'resync-subscription' RPC is invoked for either an
       existing periodic subscription or an on-change subscription
       that can't support resynchronization.";
  }

  identity period-unsupported {
    base sn:establish-subscription-error;
    base sn:modify-subscription-error;
    base sn:subscription-suspended-reason;
    description
      "The requested time period or 'dampening-period' is too short.
       This can be for both periodic and on-change subscriptions
       (with or without dampening).  Hints suggesting alternative
       periods may be returned as supplemental information.";
  }

  identity update-too-big {
    base sn:establish-subscription-error;
    base sn:modify-subscription-error;
    base sn:subscription-suspended-reason;
    description
      "Periodic or on-change push update data trees exceed a maximum
       size limit.  Hints on the estimated size of what was too big
       may be returned as supplemental information.";
  }

  identity sync-too-big {
    base sn:establish-subscription-error;
    base sn:modify-subscription-error;
    base resync-subscription-error;
    base sn:subscription-suspended-reason;
    description
      "The 'sync-on-start' or resynchronization data tree exceeds a
       maximum size limit.  Hints on the estimated size of what was
       too big may be returned as supplemental information.";
  }

  identity unchanging-selection {
    base sn:establish-subscription-error;
    base sn:modify-subscription-error;
    base sn:subscription-terminated-reason;
    description
      "The selection filter is unlikely to ever select data tree
       nodes.  This means that based on the subscriber's current
       access rights, the publisher recognizes that the selection
       filter is unlikely to ever select data tree nodes that change.
       Examples for this might be that the node or subtree doesn't
       exist, read access is not permitted for a receiver, or static
       objects that only change at reboot have been chosen.";
  }

  /*
   * TYPE DEFINITIONS
   */

  typedef change-type {
    type enumeration {
      enum create {
        description
          "A change that refers to the creation of a new
           datastore node.";
      }
      enum delete {
        description
          "A change that refers to the deletion of a
           datastore node.";
      }
      enum insert {
        description
          "A change that refers to the insertion of a new
           user-ordered datastore node.";
      }
      enum move {
        description
          "A change that refers to a reordering of the target
           datastore node.";
      }
      enum replace {
        description
          "A change that refers to a replacement of the target
           datastore node's value.";
      }
    }
    description
      "Specifies different types of datastore changes.

       This type is based on the edit operations defined for
       YANG Patch, with the difference that it is valid for a
       receiver to process an update record that performs a
       'create' operation on a datastore node the receiver believes
       exists or to process a delete on a datastore node the
       receiver believes is missing.";
    reference
      "RFC 8072: YANG Patch Media Type, Section 2.5";
  }

  typedef selection-filter-ref {
    type leafref {
      path "/sn:filters/yp:selection-filter/yp:filter-id";
    }
    description
      "This type is used to reference a selection filter.";
  }

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

  /*
   * GROUP DEFINITIONS
   */

  grouping datastore-criteria {
    description
      "A grouping to define criteria for which selected objects from
       a targeted datastore should be included in push updates.";
    leaf datastore {
      type identityref {
        base ds:datastore;
      }
      mandatory true;
      description
        "Datastore from which to retrieve data.";
    }
    uses selection-filter-objects;
  }

  grouping selection-filter-types {
    description
      "This grouping defines the types of selectors for objects
       from a datastore.";
    choice filter-spec {
      description
        "The content filter specification for this request.";
      anydata datastore-subtree-filter {
        if-feature "sn:subtree";
        description
          "This parameter identifies the portions of the
           target datastore to retrieve.";
        reference
          "RFC 6241: Network Configuration Protocol (NETCONF),
                     Section 6";
      }
      leaf datastore-xpath-filter {
        if-feature "sn:xpath";
        type yang:xpath1.0;
        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 selection-filter-objects {
    description
      "This grouping defines a selector for objects from a
       datastore.";
    choice selection-filter {
      description
        "The source of the selection filter applied to the
         subscription.  This will either (1) come referenced from a
         global list or (2) be provided in the subscription itself.";
      case by-reference {
        description
          "Incorporates a filter that has been configured
           separately.";
        leaf selection-filter-ref {
          type selection-filter-ref;
          mandatory true;
          description
            "References an existing selection filter that is to be
             applied to the subscription.";
        }
      }
      case within-subscription {
        description
          "A local definition allows a filter to have the same
           lifecycle as the subscription.";
        uses selection-filter-types;
      }
    }
  }

  grouping update-policy-modifiable {
    description
      "This grouping describes the datastore-specific subscription
       conditions that can be changed during the lifetime of the
       subscription.";
    choice update-trigger {
      description
        "Defines necessary conditions for sending an event record to
         the subscriber.";
      case periodic {
        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.";
          }
        }
      }
      case on-change {
        if-feature "on-change";
        container 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 dampening-period {
            type 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.";
          }
        }
      }
    }
  }

  grouping update-policy {
    description
      "This grouping describes the datastore-specific subscription
       conditions of a subscription.";
    uses update-policy-modifiable {
      augment "update-trigger/on-change/on-change" {
        description
          "Includes objects that are not modifiable once a
           subscription is established.";
        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 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.";
        }
      }
    }
  }

  grouping hints {
    description
      "Parameters associated with an error for a subscription
       made upon a datastore.";
    leaf period-hint {
      type centiseconds;
      description
        "Returned when the requested time period is too short.  This
         hint can assert a viable period for either a periodic push
         cadence or an on-change dampening interval.";
    }
    leaf filter-failure-hint {
      type string;
      description
        "Information describing where and/or why a provided filter
         was unsupportable for a subscription.";
    }
    leaf object-count-estimate {
      type uint32;
      description
        "If there are too many objects that could potentially be
         returned by the selection filter, this identifies the
         estimate of the number of objects that the filter would
         potentially pass.";
    }
    leaf object-count-limit {
      type uint32;
      description
        "If there are too many objects that could be returned by
         the selection filter, this identifies the upper limit of
         the publisher's ability to service this subscription.";
    }
    leaf kilobytes-estimate {
      type uint32;
      description
        "If the returned information could be beyond the capacity
         of the publisher, this would identify the estimated
         data size that could result from this selection filter.";
    }
    leaf kilobytes-limit {
      type uint32;
      description
        "If the returned information would be beyond the capacity
         of the publisher, this identifies the upper limit of the
         publisher's ability to service this subscription.";
    }
  }

  /*
   * RPCs
   */

  rpc resync-subscription {
    if-feature "on-change";
    description
      "This RPC allows a subscriber of an active on-change
       subscription to request a full push of objects.

       A successful invocation results in a 'push-update' of all
       datastore nodes that the subscriber is permitted to access.
       This RPC can only be invoked on the same session on which the
       subscription is currently active.  In the case of an error, a
       'resync-subscription-error' is sent as part of an error
       response.";
    input {
      leaf id {
        type sn:subscription-id;
        mandatory true;
        description
          "Identifier of the subscription that is to be resynced.";
      }
    }
  }

  rc:yang-data resync-subscription-error {
    container resync-subscription-error {
      description
        "If a 'resync-subscription' RPC fails, the subscription is
         not resynced 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 resync-subscription-error;
        }
        mandatory true;
        description
          "Indicates the reason why the publisher has declined a
           request for subscription resynchronization.";
      }
      uses hints;
    }
  }

  augment "/sn:establish-subscription/sn:input" {
    description
      "This augmentation adds additional subscription parameters
       that apply specifically to datastore updates to RPC input.";
    uses update-policy;
  }

  augment "/sn:establish-subscription/sn:input/sn:target" {
    description
      "This augmentation adds the datastore as a valid target
       for the subscription to RPC input.";
    case datastore {
      description
        "Information specifying the parameters of a request for a
         datastore subscription.";
      uses datastore-criteria;
    }
  }

  rc:yang-data establish-subscription-datastore-error-info {
    container establish-subscription-datastore-error-info {
      description
        "If any 'establish-subscription' RPC parameters are
         unsupportable against the datastore, 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 sn:establish-subscription-error;
        }
        description
          "Indicates the reason why the subscription has failed to
           be created to a targeted datastore.";
      }
      uses hints;
    }
  }

  augment "/sn:modify-subscription/sn:input" {
    description
      "This augmentation adds additional subscription parameters
       specific to datastore updates.";
    uses update-policy-modifiable;
  }

  augment "/sn:modify-subscription/sn:input/sn:target" {
    description
      "This augmentation adds the datastore as a valid target
       for the subscription to RPC input.";
    case datastore {
      description
        "Information specifying the parameters of a request for a
         datastore subscription.";
      uses datastore-criteria;
    }
  }

  rc:yang-data modify-subscription-datastore-error-info {
    container modify-subscription-datastore-error-info {
      description
        "This yang-data MAY be provided as part of a subscription's
         RPC error response when there is a failure of a
         'modify-subscription' RPC that has been made against a
         datastore.  This yang-data MUST be used if hints are to be
         provided back to the subscriber.";
      leaf reason {
        type identityref {
          base sn:modify-subscription-error;
        }
        description
          "Indicates the reason why the subscription has failed to
           be modified.";
      }
      uses hints;
    }
  }

  /*
   * NOTIFICATIONS
   */

  notification push-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.";
    }
    anydata datastore-contents {
      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.";
    }
    leaf incomplete-update {
      type empty;
      description
        "This is a flag that indicates that not all datastore
         nodes subscribed to are included with this update.  In
         other words, the publisher has failed to fulfill its full
         subscription obligations and, despite its best efforts, is
         providing an incomplete set of objects.";
    }
  }

  notification push-change-update {
    if-feature "on-change";
    description
      "This notification contains an on-change push update.  This
       notification shall only be sent to the 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.";
    }
    container datastore-changes {
      description
        "This contains the set of datastore changes of the target
         datastore, starting at the time of the previous update, per
         the terms of the subscription.";
      uses ypatch:yang-patch;
    }
    leaf incomplete-update {
      type empty;
      description
        "The presence of this object indicates that not all changes
         that have occurred since the last update are included with
         this update.  In other words, the publisher has failed to
         fulfill its full subscription obligations -- for example,
         in cases where it was not able to keep up with a burst of
         changes.";
    }
  }

  augment "/sn:subscription-started" {
    description
      "This augmentation adds datastore-specific objects to
       the notification that a subscription has started.";
    uses update-policy;
  }

  augment "/sn:subscription-started/sn:target" {
    description
      "This augmentation allows the datastore to be included as
       part of the notification that a subscription has started.";
    case datastore {
      uses datastore-criteria {
        refine "selection-filter/within-subscription" {
          description
            "Specifies the selection filter and where it originated
             from.  If the 'selection-filter-ref' is populated, the
             filter in the subscription came from the 'filters'
             container.  Otherwise, it is populated in-line as part
             of the subscription itself.";
        }
      }
    }
  }

  augment "/sn:subscription-modified" {
    description
      "This augmentation adds datastore-specific objects to
       the notification that a subscription has been modified.";
    uses update-policy;
  }

  augment "/sn:subscription-modified/sn:target" {
    description
      "This augmentation allows the datastore to be included as
       part of the notification that a subscription has been
       modified.";
    case datastore {
      uses datastore-criteria {
        refine "selection-filter/within-subscription" {
          description
            "Specifies the selection filter and where it originated
             from.  If the 'selection-filter-ref' is populated, the
             filter in the subscription came from the 'filters'
             container.  Otherwise, it is populated in-line as part
             of the subscription itself.";
        }
      }
    }
  }

  /*
   * DATA NODES
   */

  augment "/sn:filters" {
    description
      "This augmentation allows the datastore to be included as part
       of the selection-filtering criteria for a subscription.";
    list selection-filter {
      key "filter-id";
      description
        "A list of preconfigured filters that can be applied
         to datastore subscriptions.";
      leaf filter-id {
        type string;
        description
          "An identifier to differentiate between selection
           filters.";
      }
      uses selection-filter-types;
    }
  }

  augment "/sn:subscriptions/sn:subscription" {
    when 'yp:datastore';
    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.";
    uses update-policy;
  }

  augment "/sn:subscriptions/sn:subscription/sn:target" {
    description
      "This augmentation allows the datastore to be included as
       part of the selection-filtering criteria for a subscription.";
    case datastore {
      uses datastore-criteria;
    }
  }
}
]]></sourcecode>
      </figure>
    </section>
    <section anchor="implementation-considerations-from-rfc-8639">
      <name>Implementation Considerations (from RFC 8639)</name>
      <t>To support deployments that include both configured and dynamic
subscriptions, it is recommended that the subscription "id" domain be
split into static and dynamic halves.  This will eliminate the
possibility of collisions if the configured subscriptions attempt to
set a "subscription-id" that might have already been dynamically
allocated.  A best practice is to use the lower half of the "id"
object's integer space when that "id" is assigned by an external
entity (such as with a configured subscription).  This leaves the
upper half of the subscription integer space available to be
dynamically assigned by the publisher.</t>
      <t>If a subscription is unable to marshal a series of filtered event
records into transmittable notification messages, the receiver should
be suspended with the reason "unsupportable-volume".</t>
      <t>For configured subscriptions, operations are performed against the
set of receivers using the subscription "id" as a handle for that
set.  But for streaming updates, subscription state change
notifications are local to a receiver.  In the case of this
specification, receivers do not get any information from the
publisher about the existence of other receivers.  But if a network
operator wants to let the receivers correlate results, it is useful
to use the subscription "id" across the receivers to allow that
correlation.  Note that due to the possibility of different access
control permissions per receiver, each receiver may actually get a
different set of event records.</t>
      <t>For configured replay subscriptions, the receiver is protected from
duplicated events being pushed after a publisher is rebooted.
However, it is possible that a receiver might want to acquire event
records that failed to be delivered just prior to the reboot.
Delivering these event records can be accomplished by leveraging the
&lt;eventTime&gt; [RFC5277] from the last event record received prior to
the receipt of a "subscription-started" subscription state change
notification.  With this &lt;eventTime&gt; and the "replay-start-time" from
the "subscription-started" notification, an independent dynamic
subscription can be established that retrieves any event records that
may have been generated but not sent to the receiver.</t>
    </section>
    <section anchor="transport-requirements-from-rfc-8639">
      <name>Transport Requirements (from RFC 8639)</name>
      <t>This section provides requirements for any subscribed notification
transport supporting the solution presented in this document.</t>
      <t>The transport selected by the subscriber to reach the publisher <bcp14>MUST</bcp14>
be able to support multiple "establish-subscription" requests made in
the same transport session.</t>
      <t>For both configured and dynamic subscriptions, the publisher <bcp14>MUST</bcp14>
authenticate a receiver via some transport-level mechanism before
sending any event records that the receiver is authorized to see.  In
addition, the receiver <bcp14>MUST</bcp14> authenticate the publisher at the
transport level.  The result is mutual authentication between
the two.</t>
      <t>A secure transport is highly recommended.  Beyond this, the publisher
<bcp14>MUST</bcp14> ensure that the receiver has sufficient authorization to perform
the function it is requesting against the specific subset of content
involved.</t>
      <t>A specification for a transport built upon this document may or may
not choose to require the use of the same logical channel for the
RPCs and the event records.  However, the event records and the
subscription state change notifications <bcp14>MUST</bcp14> be sent on the same
transport session to ensure properly ordered delivery.</t>
      <t>A specification for a transport <bcp14>MUST</bcp14> identify any encodings that are
supported.  If a configured subscription's transport allows different
encodings, the specification <bcp14>MUST</bcp14> identify the default encoding.</t>
      <t>A subscriber that includes a "dscp" leaf in an "establish-
subscription" request will need to understand and consider what the
corresponding DSCP value represents in the domain of the publisher.</t>
      <t>Additional transport requirements will be dictated by the choice of
transport used with a subscription.  For an example of such
requirements, see [RFC8640].</t>
    </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.  Note, we should use the new security considerations template, which will allow this section to be considerable shorter.</t>
      <section anchor="security-considerations-from-rfc-8639">
        <name>Security Considerations from RFC 8639</name>
        <t>The YANG module specified in this document defines a schema for data
that is designed to be accessed via network management protocols such
as NETCONF [RFC6241] or RESTCONF [RFC8040].  The lowest NETCONF layer
is the secure transport layer, and the mandatory-to-implement secure
transport is Secure Shell (SSH) [RFC6242].  The lowest RESTCONF layer
is HTTPS, and the mandatory-to-implement secure transport is TLS
[RFC5246].</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 preconfigured subset of all available NETCONF or
RESTCONF protocol operations and content.</t>
        <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.  To
acquire events lost during this interval, the receiver <bcp14>SHOULD</bcp14>
retrieve any event records generated since the last event record was
received.  This can be accomplished by establishing a separate
dynamic replay subscription with the same filtering criteria with the
publisher, assuming that the publisher supports the "replay" feature.</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>The replay mechanisms described in Sections 2.4.2.1 and 2.5.6 provide
access to historical event records.  By design, the access control
model that protects these records could enable subscribers to view
data to which they were not authorized at the time of collection.</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>
        <t>An attacker that can cause the publisher to use an incorrect time can
induce message replay by setting the time in the past and can
introduce a risk of message loss by setting the time in the future.</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).  These data nodes may be considered sensitive or vulnerable
in some network environments.  Write operations (e.g., edit-config)
to these data nodes without proper protection can have a negative
effect on network operations.  These are the subtrees and data nodes
and their sensitivity/vulnerability:</t>
        <t>Container: "/filters"</t>
        <ul spacing="normal">
          <li>
            <t>"stream-subtree-filter": Updating a filter could increase the
computational complexity of all referencing subscriptions.</t>
          </li>
          <li>
            <t>"stream-xpath-filter": Updating a filter could increase the
computational complexity of all referencing subscriptions.</t>
          </li>
        </ul>
        <t>Container: "/subscriptions"</t>
        <t>The following considerations are only relevant for configuration
operations made upon configured subscriptions:</t>
        <ul spacing="normal">
          <li>
            <t>"configured-replay": Can be used to send a large number of event
records to a receiver.</t>
          </li>
          <li>
            <t>"dependency": Can be used to force important traffic to be queued
behind updates that are not as important.</t>
          </li>
          <li>
            <t>"dscp": If unvalidated, can result in the sending of traffic with
a higher-priority marking than warranted.</t>
          </li>
          <li>
            <t>"id": Can overwrite an existing subscription, perhaps one
configured by another entity.</t>
          </li>
          <li>
            <t>"name": Adding a new key entry can be used to attempt to send
traffic to an unwilling receiver.</t>
          </li>
          <li>
            <t>"replay-start-time": Can be used to push very large logs, wasting
resources.</t>
          </li>
          <li>
            <t>"source-address": The configured address might not be able to
reach a desired receiver.</t>
          </li>
          <li>
            <t>"source-interface": The configured interface might not be able to
reach a desired receiver.</t>
          </li>
          <li>
            <t>"source-vrf": Can place a subscription in a virtual network where
receivers are not entitled to view the subscribed content.</t>
          </li>
          <li>
            <t>"stop-time": Could be used to terminate content at an inopportune
time.</t>
          </li>
          <li>
            <t>"stream": Could set a subscription to an event stream that does
not contain content permitted for the targeted receivers.</t>
          </li>
          <li>
            <t>"stream-filter-name": Could be set to a filter that is not
relevant to the event stream.</t>
          </li>
          <li>
            <t>"stream-subtree-filter": A complex filter can increase the
computational resources for this subscription.</t>
          </li>
          <li>
            <t>"stream-xpath-filter": A complex filter can increase the
computational resources for this subscription.</t>
          </li>
          <li>
            <t>"weighting": Allocating a large weight can overwhelm the dequeuing
of other subscriptions.</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.  These are the subtrees and data
nodes and their sensitivity/vulnerability:</t>
        <t>Container: "/streams"</t>
        <ul spacing="normal">
          <li>
            <t>"name": If access control is not properly configured, can expose
system internals to those who should not have access to this
information.</t>
          </li>
          <li>
            <t>"replay-support": If access control is not properly configured,
can expose logs to those who should not have access.</t>
          </li>
        </ul>
        <t>Container: "/subscriptions"</t>
        <ul spacing="normal">
          <li>
            <t>"excluded-event-records": This leaf can provide information about
filtered event records.  A network operator should have the proper
permissions to know about such filtering.  However, exposing the
count of excluded events to a receiver could leak information
about the presence of access control filters that might be in
place for that receiver.</t>
          </li>
          <li>
            <t>"subscription": Different operational teams might have a desire to
set varying subsets of subscriptions.  Access control should be
designed to permit read access to just the allowed set.</t>
          </li>
        </ul>
        <t>Some of the RPC 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.  These are the
operations and their sensitivity/vulnerability:</t>
        <t>RPC: all</t>
        <ul spacing="normal">
          <li>
            <t>If a malicious or buggy subscriber sends an unexpectedly large
number of RPCs, the result might be an excessive use of system
resources on the publisher just to determine that these
subscriptions should be declined.  In such a situation,
subscription interactions <bcp14>MAY</bcp14> be terminated by terminating the
transport session.</t>
          </li>
        </ul>
        <t>RPC: "delete-subscription"</t>
        <ul spacing="normal">
          <li>
            <t>No special considerations.</t>
          </li>
        </ul>
        <t>RPC: "establish-subscription"</t>
        <ul spacing="normal">
          <li>
            <t>Subscriptions could overload a publisher's resources.  For this
reason, publishers <bcp14>MUST</bcp14> ensure that they have sufficient resources
to fulfill this request; otherwise, they <bcp14>MUST</bcp14> reject the request.</t>
          </li>
        </ul>
        <t>RPC: "kill-subscription"</t>
        <ul spacing="normal">
          <li>
            <t>The "kill-subscription" RPC <bcp14>MUST</bcp14> be secured so that only
connections with administrative rights are able to invoke
this RPC.</t>
          </li>
        </ul>
        <t>RPC: "modify-subscription"</t>
        <ul spacing="normal">
          <li>
            <t>Subscriptions could overload a publisher's resources.  For this
reason, publishers <bcp14>MUST</bcp14> ensure that they have sufficient resources
to fulfill this request; otherwise, they <bcp14>MUST</bcp14> reject the request.</t>
          </li>
        </ul>
      </section>
      <section anchor="security-considerations-from-rfc-8641">
        <name>Security Considerations from RFC 8641</name>
        <t>The YANG module specified in this document defines a schema for data
that is designed to be accessed via network management protocols such
as NETCONF [RFC6241] or RESTCONF [RFC8040].  The lowest NETCONF layer
is the secure transport layer, and the mandatory-to-implement secure
transport is Secure Shell (SSH) [RFC6242].  The lowest RESTCONF layer
is HTTPS, and the mandatory-to-implement secure transport is TLS
[RFC8446].</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 preconfigured 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).  These data nodes may be considered sensitive or vulnerable
in some network environments.  Write operations (e.g., edit-config)
to these data nodes without proper protection can have a negative
effect on network operations.  These are the subtrees and data nodes
and their sensitivity/vulnerability.  (It should be noted that the
YANG module defined in this document augments the YANG module defined
in <xref target="RFC8639"/>.  All security considerations that are listed in</t>
        <t><xref target="RFC8639"/> are also relevant for datastore subscriptions.  In the
following list, we focus on the new data nodes that are introduced in
this document.)</t>
        <ul spacing="normal">
          <li>
            <t>Subtree "selection-filter" under container "filters": This subtree
allows a subscriber to specify which objects or subtrees to
include in a datastore subscription.  An attacker could attempt to
modify the filter.  For example, the filter might be modified to
result in very few objects being filtered in order to attempt to
overwhelm the receiver.  Alternatively, the filter might be
modified to result in certain objects being excluded from updates,
in which case certain changes would go unnoticed.</t>
          </li>
          <li>
            <t>Subtree "datastore" in choice "target" in list "subscription":
Analogous to "selection filter", an attacker might attempt to
modify the objects being filtered in order to overwhelm a receiver
with a larger volume of object updates than expected or cause
certain changes to go unnoticed.</t>
          </li>
          <li>
            <t>Choice "update-trigger" in list "subscription": By modifying the
update trigger, an attacker might alter the updates that are being
sent in order to confuse a receiver, withhold certain updates to
be sent to the receiver, and/or overwhelm a receiver.  For
example, an attacker might modify the period with which updates
are reported for a periodic subscription, or it might modify the
dampening period for an on-change subscription, resulting in a
greater delay for successive updates (potentially affecting the
responsiveness of applications that depend on the updates) or in a
high volume of updates (to exhaust receiver resources).</t>
          </li>
        </ul>
        <t>The NACM provides one means to mitigate these threats on the
publisher side.  In order to address those threats as a subscriber,
the subscriber could monitor the subscription configuration for any
unexpected changes and subscribe to updates to the YANG datastore
nodes that represent its datastore subscriptions.  As this volume of
data is small, a paranoid subscriber could even revert to occasional
polling to guard against a compromised subscription against
subscription configuration updates itself.</t>
        <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.  These are the subtrees and data
nodes and their sensitivity/vulnerability:</t>
        <ul spacing="normal">
          <li>
            <t>Subtree "selection-filter" under container "filters": If access
control is not properly configured, can expose system internals to
those who should not have access to this information.</t>
          </li>
          <li>
            <t>Subtree "datastore" in choice "target" in list "subscription": If
access control is not properly configured, can expose system
internals to those who should not have access to this information.</t>
          </li>
          <li>
            <t>Choice "update-trigger" in list "subscription": If access control
is not properly configured, can expose system internals to those
who should not have access to this information.</t>
          </li>
        </ul>
        <t>Some of the RPC 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.  These are the
operations and their sensitivity/vulnerability:</t>
        <ul spacing="normal">
          <li>
            <t>RPC "resync-subscription": This RPC allows a subscriber of an
on-change subscription to request a full push of objects in the
subscription's scope.  This can result in a large volume of data.
An attacker could attempt to use this RPC to exhaust resources on
the server to generate the data and could then attempt to
overwhelm a receiver with the resulting large volume of data.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TODO - This document will need to register new YANG models with IANA.</t>
      <section anchor="iana-considerations-from-rfc-8639">
        <name>IANA Considerations from RFC 8639</name>
        <t>IANA has registered one URI in the "ns" subregistry of the "IETF XML
Registry" [RFC3688] maintained at <eref target="https://www.iana.org/assignments/xml-registry">https://www.iana.org/assignments/xml-registry</eref>.  The following registration has been made per the
format in [RFC3688]:</t>
        <t>URI: urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications
Registrant Contact: The NETCONF WG of the IETF.
XML: N/A; the requested URI is an XML namespace.</t>
        <t>IANA has registered one YANG module in the "YANG Module Names"
registry [RFC6020] maintained at <eref target="https://www.iana.org/assignments/yang-parameters">https://www.iana.org/assignments/yang-parameters</eref>.  The following registration has been made per the
format in [RFC6020]:</t>
        <t>Name: ietf-subscribed-notifications
Namespace: urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications
Prefix: sn
Reference: RFC 8639</t>
      </section>
      <section anchor="iana-considerations-from-rfc-8641">
        <name>IANA Considerations from RFC 8641</name>
        <t>This document registers the following namespace URI in the "IETF XML Registry" [RFC3688]:</t>
        <t>URI: urn:ietf:params:xml:ns:yang:ietf-yang-push</t>
        <t>Registrant Contact: The IESG.</t>
        <t>XML: N/A; the requested URI is an XML namespace.</t>
        <t>This document registers the following YANG module in the "YANG Module
   Names" registry [RFC6020]:</t>
        <t>Name: ietf-yang-push</t>
        <t>Namespace: urn:ietf:params:xml:ns:yang:ietf-yang-push</t>
        <t>Prefix: yp</t>
        <t>Reference: RFC 8641</t>
      </section>
    </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="I-D.draft-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="3" month="November" 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-01"/>
        </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="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="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="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="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="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="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="I-D.draft-ietf-netconf-http-client-server">
          <front>
            <title>YANG Groupings for HTTP Clients and HTTP Servers</title>
            <author fullname="Kent Watsen" initials="K." surname="Watsen">
              <organization>Watsen Networks</organization>
            </author>
            <date day="15" month="August" year="2024"/>
            <abstract>
              <t>   This document presents two YANG modules: the first defines a minimal
   grouping for configuring an HTTP client, and the second defines a
   minimal grouping for configuring an HTTP server.  It is intended that
   these groupings will be used to help define the configuration for
   simple HTTP-based protocols (not for complete web servers or
   browsers).  Support is provided for HTTP/1.1, HTTP/2, and HTTP/3.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-http-client-server-23"/>
        </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>
      </references>
    </references>
    <?line 5576?>

<section anchor="example-configured-transport-augmentation-from-rfc-8639">
      <name>Example Configured Transport Augmentation (from RFC 8639)</name>
      <t>This appendix provides a non-normative example of how the YANG module
defined in Section 4 may be enhanced to incorporate the configuration
parameters needed to support the transport connectivity process.
This example is not intended to be a complete transport model.  In
this example, connectivity via an imaginary transport type of "foo"
is explored.  For more on the overall objectives behind configuring
transport connectivity for a configured subscription, see
Section 2.5.7.</t>
      <t>The YANG module example defined in this appendix contains two main
elements.  First is a transport identity "foo".  This transport
identity allows a configuration agent to define "foo" as the selected
type of transport for a subscription.  Second is a YANG case
augmentation "foo", which is made to the
"/subscriptions/subscription/receivers/receiver" node of Section 4.
In this augmentation are the transport configuration parameters
"address" and "port", which are necessary to make the connection to
the receiver.</t>
      <sourcecode type="yang"><![CDATA[
module example-foo-subscribed-notifications {
  yang-version 1.1;
  namespace
    "urn:example:foo-subscribed-notifications";

  prefix fsn;

  import ietf-subscribed-notifications {
    prefix sn;
  }
  import ietf-inet-types {
    prefix inet;
  }

  description
    "Defines 'foo' as a supported type of configured transport for
    subscribed event notifications.";

  identity foo {
    base sn:transport;
    description
      "Transport type 'foo' is available for use as a configured
      subscription's transport protocol for subscribed
      notifications.";
  }

  augment
    "/sn:subscriptions/sn:subscription/sn:receivers/sn:receiver" {
    when 'derived-from(../../../transport, "fsn:foo")';
    description
      "This augmentation makes transport parameters specific to 'foo'
      available for a receiver.";
    leaf address {
      type inet:host;
      mandatory true;
      description
        "Specifies the address to use for messages destined for a
        receiver.";
    }
    leaf port {
      type inet:port-number;
      mandatory true;
      description
        "Specifies the port number to use for messages destined for a
        receiver.";
    }
  }
}

              Figure 21: Example Transport Augmentation
                  for the Fictitious Protocol "foo"
]]></sourcecode>
      <t>This example YANG module for transport "foo" will not be seen in a
real-world deployment.  For a real-world deployment supporting an
actual transport technology, a similar YANG module must be defined.</t>
    </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 [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>
  </back>
  <!-- ##markdown-source:
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
agozfAETAXI2OTAx5cHKbJVe+UCj/Bz7xdMiEhUajFoUiIyBi0glek6n54wF
PmGDFdstQhSyi+LFEkUJvDQOiSqrtCVnFZUd3IhwdHqMVqL2pst2qY1iCv6R
jcO6JMnj6PGxyb+kSDA3OCIlhOxwO76hxUo7M947I7M+CpkBGiIXCC/mvGBZ
W8xX0r3RpLvVWaJCjTnozCLj0/t2cOlPqhOwfCg2tSSvFaTssDrG1iLlpKFv
t7j6fxBT7Q8wtLdwH0ezi9gm4bwjx8vkrlDuL/BBJUCSWlA0+f7NS6FQNE3b
Mkc9hVciJFcaLosJCK2ID7m0Q6NkowQJch2sLmxYpxYzkk90vmTeA6H5mo3M
zKO+Mndux8IkWqhuSHGYffu7t+9mc/5v8d1r+vf3X//L7159//VX+O+3v3nx
29/aP4I88fY3r3/326/iv+KbL19/++3X333FL8O3RfJVmH374t9nvE6z12/e
vXr93YvfzoZCLK48W9yJ1213dHbKLiRC5a9fvvm//6/Tp8VPP/1vsE6PT0/R
8M5/fHH6+VP4A1kC90bGDv4TTU4BDg3avqAVtLWC9Aey7AZ3sEO32k1T4BGE
1XzwB1yZH86KZ+fL7enT5/IFTjj5Utcs+ZLWbPjN4GVexJGvRrqx1Uy+z1Y6
He+Lf0/+1nV3Xz77FQppxeL0i189DyQLOZoB5vUejuT9Nf5F8ZKEjDNuZahS
LFK97r7PxWN1jzcykfOseJHLySDxbFBdvqb4idS5RdJaOeLxUqPIovhKJPdb
eyEvCHr6nKqJYhgJrWrMwBFAZ9/zDQpK7rJaoUL2EknzCDjLMXVIQRbQQyP2
MDUao/rUXxrrEvEGrcnirj7BcJAfS7Qtd6rADCbHFyccgGJdwvWM/xApnKSO
jlzEc5hQ23Xs1gFNoIKzsgH2z3ckMsMdudmb7d68bizUxhn40YMUgNE39F/o
4WoLoxdLKJl4a3TfY/ftrr6oG3YobXGBQPwS81vNCgfd/jiIa3aTwvluyN2h
3bKyTjvEF7C32qyqvqw3rEtyE+5NvtHwzcRmAopQ027aCw2P2IEMh1THrVMj
qBWVFyACXhAViPRIpk1oCdZr0EuxrlEUwZCacrOXrdmBjr6ry2R/2Yq7og7Y
qZ6ahGq3Gtz0SZGsBOpoHd3r0Ab3yosYnSHWMdmXKh6tP/fqrjkD3SkupjlN
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
PmAgAsCTLCAZJzmdT5jPvrd5YTynK647sk3RHnJRo3l5lEi6vCHqCMs5yswG
XNn20FbVpd/GAsOjQaKjrCzN2RtN/jJT+x0FDU14erUeRMOa8dJHstqa8I8C
awY8WKyAFov6UKI+Hqp5d1NTjcheYslGjGAv0qrRRSwWp6FCMdqey8cJhm9v
N0/YN5v6qiZeDe9s6PbvSsRUyqpfJ1hpmMkFkhpeCrh/vP2DA/6uRcgIrTwR
8wBiWzEjYO5iKjjtD5OOmD/BinW/LFpbAA7UbfmFrSTJmiyKNlgeVYMBk98t
atAnPcLVWnFEn9ZMEHbBbHrtSZY4K8PY8BIR7ZPEbcQbI+8YlJiLmXEN8TQU
L2+Yy8gh52eehrXkQl7ffCx1+xZPx6hbKLohuM53lkaMtmfGd2uCwYGMhv0U
xXiQV5YZTpVFm/3VOQMnUl7Are9qaUDzwmGJOFoGPLWcZ176eFHJyIsJ3kMX
Il1QWfkKviY035fIHDpLsm5J3iyXGOq9qVZYg0WYy7AHvZI8QobYdEfTlM7L
LkZYY5ogLfzJIGVW8rkGMMoRQMyvE4uUsE4+FDh9MaZOrriwGtUcUBUv4nWH
1PnJt+sRB2qxBJAhex/fpYWOkePf0TQ90v2kXdp96w05E1aowUuZNVteHTFn
x0ZvtWf7vqcN2slTd1u088f1M2XSHg7iFpt21uZtRu380eI+Vu2Rlz7erD3e
iH4Gdu07Bjpm2B55pbiHZXv8Nf3catr27Wem40EbqbnRPSVX7NOz6RiZaVvE
wKt2D0Yr6cMKRhHG4zPmQ4ZEuqJnupyqjjEEmlTPeSDCI4fOzHGoQlaSj0/o
Ik0tpAmLl2iZXjBgNod472XGk5h6lKUnxhiWRLRl00EYZr5wlTASBgZLzdbb
zsyE5qccLJymuJRdqHtJPnL5X07uY2Vt7r+WTEeM5oX1Cqi6dW11LThYfxJO
7Lzva4EIYatbClpJRosmRKvmxxqS+U4KVo6c3P3OdszmWbUci2/7KLEXH2cm
YK9FuD0d8bB3lTP/IkDlbebfsYDWEUOgN/12lbQkG/Pxxt97dvrLDL/JToVf
avi91xATq+/HvHGHyfej7b25sdf45afj/PJ/ga3Xg6/cogCMxxUOFQBETtxw
JUbDAAwZrd+HrQ9zogNyinjW5VSN5YUW371+x0WAkVFgOEgYD6mx3LIs9urW
QzC2En9H2XOk+3vJnvRHLm0OCe+zs4m9vvWivlsFU6Qe1Sy8BhY+WgOLKY5h
0KXoMtoh94GhuKry/jNc9HfS+0i47JDaS0Wv5NuOKC6M1h9WOyVlFApcZrWK
lcWHqDAu+ZFYdZoixnRu0V1E6GMZpYUz6SuEM+LqR6Oi8wTGUKT1aBqNAb3c
BuUmy4/rV8WSprzh5K0hWMX5VCKpVq/kzSup1m3PIB0XZPKfwoXztVflChUH
NK4NRWTG0Nr3BJE7NYa7OMCQNv6O53/Q+d/y9H9+Nhkofvslgk98w5dbx/Ue
Kga20NQprGOoYlDOszVuWSsNBR/p50hgQmgpYjq0QHzRA0GyMZEA1Xa9Qkgy
50mLrbmHMzmEYLAVBxMh/TEMEzGi5u51P2JTBPjAOXQeUjEwrHuIjrtAIIcd
B7v2u/0SXUqYxMdGksB4t10lwdoKyFgcxSxKRSL+7PHT0x+O0TH0/ddv6alw
5JIcDbD40dNHPxyb5Bk7tcVSqy7FtaSwdRFklKbfJWyGjg4nlyVJx0Ftj590
ee5hCvZiKbPX5a6usBTcZYborN0S6jENjzZLyC0L/khy3H2G+79S3RVpijg0
8C9GxrOqXMw5dpS3z35IrKeenMxxz4AdrXFj0Xiijb00/jO8hwFUi30TTeXp
R+RMqxpKgbMamOS/9lKrSy1bWER+GGss6atpF0ie+cwmmxNLvB9bKMbkGd/J
GLv7pWs3NuC75uM5nYKq6ulbsOXVIayWTU58FqiMbptAIOoxNXc21uVsQL+b
zR6Op0RABEnNxdxl9V88YucshzIji1sj0JNG3kce4wAe3EFRt0XIo4PyBOEp
EAHE5oHbIUSNw3ETxjVpmJkkbB9xtDhyRLM6HCDSYYSxRj8WChnrumdd1tSM
25npGKvj9InTk4+IrTljD31eoILuUhPnyJk3Yy0RhK12u98osF/Go8iIIWhP
1AZlkAvgbLXpKnHmN6mYWFAUgXrh15SFRq/fz09ZpJNghyPrrGbiEGB0xP8l
JPP0vix30REN1Pf45L766v/b12/SSnnH4vHCURsfu3hPTkZ1rnusmq0Y9fvL
Vo1WjN7/K1btY9MOncWJUq5cXBkaJKiaDsmRFNmlKlW7c8BQiFGLZU4msHyR
+e2388xTJ870zA6KSum4hWArOHDmyxxJjsFgi9EyBGkmTywPomZXxtamFr3S
lyOx5+aTb5JluK1Lm0cYdhkhZgwTKOqIcccJYeD+1UkxeGVsBEmN2JiyLqB+
GWZXR+Bm55t2+Z6HVNW91ZO2obJ0UljsXRtxaAIp6LSkXYSgGRlVWnCiKf74
jEbyrr6q/vg8sDpHEYWGRIG376ePP//cIYc81S6St82KWxpUecHaCS0g3a12
E6XIhBJqFZFinITxb9/+tvjD75+8PPn+65eLH682i8ePHn1xevr4sx8Qurzc
9oIGF2MXMNvpkUr9AnoSRQoGW0P4XUTSkHXJJdxnCR1HiQn6b7r/Ywas6Azk
9PUZWRW6M/j6rOnOmqpHMjnzL5+dnjyaqdMsLtdzmMXni0dfLh6dvjt9dPYI
//ffnz2Mv+sbm7p5r1ZU7f6y77fd2cOH5fKqOpGlOoE5PWQcoJn30T2r1+S4
fN61i9OHjx8+OXn07KF+lz1Xrq5qwnzs993z/ZaeS77LnkdbhP60AnKhF/yX
OomHfhb47bOHfo2ee8U85tY/OlM7Faqm33ly/pa3LRFWRwj1MZKCYoUI2t/U
YaX8whCPrM9i5XqYClZcAt1zbEHC5//4HIGQ4eCGRFaUgkU0CIpwJAHZBuvq
AlEa3/muLVebA9dL2e4qiVK6qkoRB6crfGkhJZtDuGUO0/GKBdv2yhRZ1mO6
J0UlJmtPxErVowbC2Ag/X1Aio/iK8JafjkCbCoiY0y1L4E7V5jDPoulApuac
fokawbA3zvEdcFazqStFCGCOBTPzjY5RYmmBjTsrf94263kW5vLLBkwDCfmA
J2Bdp6uwpQ6EZJbpMotA4y3KgoPxkjPO/cHtQnA1IhnfoBnArHacNx7rIOQR
jowCRjhAU8HZWdRejP0lqxsl2PZpZThB16IzSkGBWjEgCyy6rRuUOjCQ8H3F
EIlZhbBazrBFX7PRMIlvNZ+1RmGrATm+ZZ7No3JYdUxMd8fm9gycx8NonePc
I3K9EYy7k3vP3vkipIwoBmsTqcJyt/te5hCfw9BkHnsS2yo1Bm3CFs0euEqD
es8rX7dkiCnA7m611FnZvXsWJ+k4zLpjZLwKr3opwCjpFxOFcF20wr6zQEgS
fwQeDaHm8vMIlwm1N1PZyp4t+vKiyy8uDCO75zxEuNIwYDWS3H8RhglKUVCj
NDEWqtXbNFGGNwyF0ixl/lauqdj/TBk5Zz84/P9XiVGHcPPvM1O2eW42bLPJ
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
cAQrNryzB67PWpXYAkT5hliuf9htUIjHwiqUT8KvHxXkSZe8ZzCpAvGOUlQZ
PlJCvPZM4NbHh4bihz2Qi/A5o7hWPgrgPnHPw4JRQEo3iBVs7p0bsBedo21X
KJIG/Xb1CXy4WCCLsPk+/q1H8oPPUHUe3sRAjlrlyaL6US15qBL1aXNyJs5Q
2Oov6pIQSODTT3DiFfNzjyNlu9N/+GHTp22BCsxBShrT2UrOIai6ZuE2aPLD
unEUIpVqO7hg91kdd0GWUDbNoP/a5fmouzw72Qd3WMdItk0UqyJBs0MC4NOT
WdCbkrp1PaFuhphaA2Caii5P9XBeXtRN30mmGh3LdarQcvD7YbTLHl5SEfDf
1W/Ffh8OWqpwdR5cOEOOBZYxU+2lzA+RW0hFCGdib8dTBLUDqdHANXv0m56j
AKlA7qu7nCCdx5xyEtFHyQknISdGFg8k9vUarN+tsJZUJzHhhEDIbYtu/9XP
hIfqrw0w6Dfa+RR0kyjeWVKbOrq9E2shfxvdxVw2dF3NNoui0Sv2Z4qC6gpH
ymoXcqEQQZ9NiOR4RLA6EgN6rTeWvnJ6DCxyv7Kg1AWvcXiLjx9+L5vmK4wX
+j4ulSEzACEmkYDKsbBD2TV7nZX1dERER3XPWX5kwaZk71Nie9XxdmwKZSwi
mE3pU2Hi8xtBqsuH6rPESV302SEpi7drsMbgdkaOZeZ8WUx1dqSwgFEJIkBe
P9r0at7hGg8V2fs5+zn7/9wn+3GaOznxcvn70aK8WI/YxDmr5+Xkumjeuov3
+xGsgvkFlMHfj6pyfSGmxXMn0JvEmz88fHD8ePIA/ncIaz5yu7JeuFZY6/y6
nm/AUDbUw+jnDIeIW5bpFogYhHWeYJPxX+98hXaUO2GA7QocFyO34FNoNUUN
uZ2+v15Mly2CNk1tb7i0K/DDv89vV58De62u0SseniMPLp0tebQQ/TeuRYuV
aD95/Ph4mj+pr6/d8HDyWOT9DDrCN/4cvadvPexb2+XAOz/75KPHUxOLBBcK
X24S/5Pv9z7u6I3zduiNHz16OM1fsO3iuxBR9tR7zE+a2VW1LhHNKd9/8d3T
k4Pk+wGDDeiPfXszG3r7A6j2+/rZm7MnL1889zV+k93Tdhfr2VW0jfjd4Es+
dVPERXyFzb+DfEjcSH5RBua9y2LJdeux8ej02dnz/MUzGtm+rNATbfY7yP/M
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
chI7ZaaROkvky50SzvGsMUO/FrvzUgpWB81rTUl1uoq6Ieyk/N91bHBo/eiQ
4u8ynm0SjhuWx7zF6zxh6QHJOEVxXeCLWcM0QTgYcZPlURyV0jRPIom2liip
UE6H5prlJmoF8pCW9Q2H9KDu7s0u2hmHqyERFTnZHVEU4jmJQcqIQixEupm9
1bMBUcNHEOmMsWiPTFizL6KOlc6IM0k4VczHtB1lmj/1eqIXEsFdBAfYxAUy
VyROCfT5XdHciihTUuESS01yMVvLiL0LJcuNH4G4hrne7luMe0G7AAi+qDyt
IwoFKBNKtP27Eid974Cu9KtOWWQQ305d3DynCKTo9g99ooNWNRTzqGz1UtT+
BYtowLe9oA6OZrGEogzsTxFecF/IgfzWbFVTUl3HHsF7VofSLt7qSJTMmLKC
R01g3Sguj0xkwVIyzmLIRqCEBdugGO3Eiz/kwrQ2L5J5O6YuXNYR1da25kVY
6Bc1ecpQldMal2/ZY5uExm/MTOmiAzte1MVch5ShzSiYKZ8z288EXnCsPR+p
oAmOM1LREr6/LNep57qq7+fBATqmTrDrpsRsVDoQVP5XpvrWddGdJQjYiZ/w
XoboghmpmDWNGVRVUnKWYkYkn/Icao441om2iLyBo0hyskQIEcxnxims7h1+
dAlsln+yXdjN2/vo+F/e3n94b+9nj/5nenv/Za3972mtdX3tn64Vt17Wa5X5
kultirfQkxrOfOoUipYWsKYUG/TRY7iDJ1iupSd8Rkx9kO6HL8sy35YOGCA4
GXNoX26fJAJkwbwKvWJEz4UbvJdxwMSmtsqPwTsy5hSJqoNkD5gHwcp3U2lH
5IlTOBsjMYSzzsObBgpBAuR7XQsAHp9xybIjFFzabpTWJdOpMuUr4hgu7RYi
VqnShzi1OCq7bqrjhV+CHCn5yGJfE0sr2gwv3JLKmCnw3utvuhyNGYU1aaho
j5MFasdrrO2SHEyW6+GowczKBo1YdixedUP+KpknuJpSPAXMONJYEE3I/3YJ
EX5gg5ixPdifAr/8I3w1hdmNJH2wWlIOa6SkZbA7hdO1QeJ3Yx/F2dOjsYmp
oCn3bd8Oa54KqclyCf5DTcJRREwaCghD2haPBgJ2WjbkXAShL1os96bOSj3h
JbFltnqXBpzINLcg6wv0HDVNLg1bFcuu/wBXJWM8Nr0mQLnRHaryWGBBrmq3
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
XVWPnbTV30paj/8fHaPG5NWRAwA=

-->

</rfc>
