< draft-ietf-netconf-yang-push-09.txt   draft-ietf-netconf-yang-push-10.txt >
NETCONF A. Clemm NETCONF A. Clemm
Internet-Draft Huawei Internet-Draft Huawei
Intended status: Standards Track E. Voit Intended status: Standards Track E. Voit
Expires: March 23, 2018 Cisco Systems Expires: April 5, 2018 Cisco Systems
A. Gonzalez Prieto A. Gonzalez Prieto
VMware VMware
A. Tripathy A. Tripathy
E. Nilsen-Nygaard E. Nilsen-Nygaard
Cisco Systems Cisco Systems
A. Bierman A. Bierman
YumaWorks YumaWorks
B. Lengyel B. Lengyel
Ericsson Ericsson
September 19, 2017 October 2, 2017
Subscribing to YANG datastore push updates Subscribing to YANG datastore push updates
draft-ietf-netconf-yang-push-09 draft-ietf-netconf-yang-push-10
Abstract Abstract
Providing rapid visibility into changes made on YANG configuration Providing rapid visibility into changes made on YANG configuration
and operational objects enables new capabilities such as remote and operational objects enables new capabilities such as remote
mirroring of configuration and operational state. Via the mechanism mirroring of configuration and operational state. Via the mechanism
described in this document, subscriber applications may request a described in this document, subscriber applications may request a
continuous, customized stream of updates from a YANG datastore. continuous, customized stream of updates from a YANG datastore.
Status of This Memo Status of This Memo
skipping to change at page 1, line 44 skipping to change at page 1, line 44
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on March 23, 2018. This Internet-Draft will expire on April 5, 2018.
Copyright Notice Copyright Notice
Copyright (c) 2017 IETF Trust and the persons identified as the Copyright (c) 2017 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of (https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
skipping to change at page 2, line 51 skipping to change at page 2, line 51
3.5. Data Encodings . . . . . . . . . . . . . . . . . . . . . 8 3.5. Data Encodings . . . . . . . . . . . . . . . . . . . . . 8
3.6. Datastore Selection Filters . . . . . . . . . . . . . . . 8 3.6. Datastore Selection Filters . . . . . . . . . . . . . . . 8
3.7. Streaming Updates . . . . . . . . . . . . . . . . . . . . 10 3.7. Streaming Updates . . . . . . . . . . . . . . . . . . . . 10
3.8. Subscription Management . . . . . . . . . . . . . . . . . 13 3.8. Subscription Management . . . . . . . . . . . . . . . . . 13
3.9. Receiver Authorization . . . . . . . . . . . . . . . . . 14 3.9. Receiver Authorization . . . . . . . . . . . . . . . . . 14
3.10. On-change Notifiable YANG objects . . . . . . . . . . . . 16 3.10. On-change Notifiable YANG objects . . . . . . . . . . . . 16
3.11. Other Considerations . . . . . . . . . . . . . . . . . . 17 3.11. Other Considerations . . . . . . . . . . . . . . . . . . 17
4. A YANG data model for management of datastore push 4. A YANG data model for management of datastore push
subscriptions . . . . . . . . . . . . . . . . . . . . . . . . 18 subscriptions . . . . . . . . . . . . . . . . . . . . . . . . 18
4.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 18 4.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2. Subscription configuration . . . . . . . . . . . . . . . 24 4.2. Subscription configuration . . . . . . . . . . . . . . . 25
4.3. YANG Notifications . . . . . . . . . . . . . . . . . . . 26 4.3. YANG Notifications . . . . . . . . . . . . . . . . . . . 27
4.4. YANG RPCs . . . . . . . . . . . . . . . . . . . . . . . . 27 4.4. YANG RPCs . . . . . . . . . . . . . . . . . . . . . . . . 28
5. YANG module . . . . . . . . . . . . . . . . . . . . . . . . . 31 5. YANG module . . . . . . . . . . . . . . . . . . . . . . . . . 33
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 47 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 48
7. Security Considerations . . . . . . . . . . . . . . . . . . . 47 7. Security Considerations . . . . . . . . . . . . . . . . . . . 48
8. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 47 8. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 49
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 47 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 49
9.1. Normative References . . . . . . . . . . . . . . . . . . 47 9.1. Normative References . . . . . . . . . . . . . . . . . . 49
9.2. Informative References . . . . . . . . . . . . . . . . . 49 9.2. Informative References . . . . . . . . . . . . . . . . . 50
Appendix A. Changes between revisions . . . . . . . . . . . . . 49 Appendix A. Changes between revisions . . . . . . . . . . . . . 50
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 51 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 53
1. Introduction 1. Introduction
Traditional approaches to remote visibility have been built on Traditional approaches to remote visibility have been built on
polling. With polling, data is periodically requested and retrieved polling. With polling, data is periodically requested and retrieved
by a client from a server to stay up-to-date. However, there are by a client from a server to stay up-to-date. However, there are
issues associated with polling-based management: issues associated with polling-based management:
o Polling incurs significant latency. This latency prohibits many o Polling incurs significant latency. This latency prohibits many
application types. application types.
skipping to change at page 14, line 9 skipping to change at page 14, line 9
subscription parameters MAY be returned that would likely have subscription parameters MAY be returned that would likely have
resulted in acceptance of the subscription request. The subscriber resulted in acceptance of the subscription request. The subscriber
may consider these as part of future subscription attempts. may consider these as part of future subscription attempts.
For instance, for the following request: For instance, for the following request:
<netconf:rpc message-id="101" <netconf:rpc message-id="101"
xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0"> xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
<establish-subscription <establish-subscription
xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push:1.0"> xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push:1.0">
<datastore>push-update</datastore> <datastore>
<filter netconf:type="xpath" <source>operational</source>
<subtree-filter netconf:type="xpath"
xmlns:ex="http://example.com/sample-data/1.0" xmlns:ex="http://example.com/sample-data/1.0"
select="/ex:foo"/> select="/ex:foo"/>
</datastore>
<period>500</period> <period>500</period>
<encoding>encode-xml</encoding> <encoding>encode-xml</encoding>
</establish-subscription> </establish-subscription>
</netconf:rpc> </netconf:rpc>
Figure 5: Establish-Subscription example Figure 5: Establish-Subscription example
the publisher might return: the publisher might return:
<rpc-reply message-id="101" <rpc-reply message-id="101"
skipping to change at page 18, line 19 skipping to change at page 18, line 19
The YANG data model for datastore push subscriptions is depicted in The YANG data model for datastore push subscriptions is depicted in
the following figure. Following YANG tree convention in the the following figure. Following YANG tree convention in the
depiction, brackets enclose list keys, "rw" means configuration, "ro" depiction, brackets enclose list keys, "rw" means configuration, "ro"
operational state data, "?" designates optional nodes, "*" designates operational state data, "?" designates optional nodes, "*" designates
nodes that can have multiple instances. Parentheses with a name in nodes that can have multiple instances. Parentheses with a name in
the middle enclose choice and case nodes. New YANG objects defined the middle enclose choice and case nodes. New YANG objects defined
here (i.e., beyond those from [subscribe]) are identified with "yp". here (i.e., beyond those from [subscribe]) are identified with "yp".
module: ietf-subscribed-notifications module: ietf-subscribed-notifications
+--ro streams +--ro streams
| +--ro stream* [stream] | +--ro stream* [name]
| +--ro stream stream | +--ro name stream
| +--ro description string | +--ro description string
| +--ro replay-support? empty | +--ro replay-support? empty {replay}?
| +--ro replay-log-creation-time? yang:date-and-time | +--ro replay-log-creation-time? yang:date-and-time {replay}?
| +--ro replay-log-aged-time? yang:date-and-time | +--ro replay-log-aged-time? yang:date-and-time {replay}?
+--rw filters +--rw filters
| +--rw filter* [identifier] | +--rw event-filter* [identifier]
| +--rw identifier filter-id | | +--rw identifier filter-id
| +--rw (filter-type)? | | +--rw (filter-spec)?
| +--:(event-filter) | | +--:(subtree-filter)
| | +--rw event-filter-type event-filter-type | | | +--rw subtree-filter?
| | +--rw event-filter-contents | | +--:(xpath-filter)
| +--:(yp:datastore) | | +--rw xpath-filter? yang:xpath1.0
| +--rw yp:selection-filter-type selection-filter-type | +--rw yp:selection-filter* [identifier]
| +--rw yp:selection-filter | +--rw yp:identifier sn:filter-id
| +--rw (yp:filter-spec)?
| +--:(yp:subtree-filter)
| | +--rw yp:subtree-filter?
| +--:(yp:xpath-filter)
| +--rw yp:xpath-filter? yang:xpath1.0
+--rw subscription-config {configured-subscriptions}? +--rw subscription-config {configured-subscriptions}?
| +--rw subscription* [identifier] | +--rw subscription* [identifier]
| +--rw identifier subscription-id | +--rw identifier subscription-id
| +--rw encoding? encoding | +--rw encoding? encoding
| +--rw (target) | +--rw (target)
| | +--:(stream) | | +--:(stream)
| | | +--rw (event-filter)? | | | +--rw (event-filter)?
| | | | +--:(by-reference) | | | | +--:(by-reference)
| | | | | +--rw filter-ref filter-ref | | | | | +--rw event-filter-ref event-filter-ref
| | | | +--:(within-subscription) | | | | +--:(within-subscription)
| | | | +--rw event-filter-type event-filter-type | | | | +--rw (filter-spec)?
| | | | +--rw event-filter-contents | | | | +--:(subtree-filter)
| | | +--rw stream stream | | | | | +--rw subtree-filter?
| | | | +--:(xpath-filter)
| | | | +--rw xpath-filter? yang:xpath1.0
| | | +--rw stream stream
| | | +--rw replay-start-time? yang:date-and-time {replay}? | | | +--rw replay-start-time? yang:date-and-time {replay}?
| | +--:(yp:datastore) | | +--:(yp:datastore)
| | +--rw yp:datastore identityref | | +--rw yp:source identityref
| | +--rw (yp:selected-content)? | | +--rw (yp:selected-content)?
| | +--:(yp:by-reference) | | +--:(yp:by-reference)
| | | +--rw yp:filter-ref sn:filter-ref | | | +--rw yp:selection-filter-ref selection-filter-ref
| | +--:(yp:within-subscription) | | +--:(yp:within-subscription)
| | +--rw yp:selection-filter-type | | +--rw (yp:filter-spec)?
| | | selection-filter-type | | +--:(yp:subtree-filter)
| | +--rw yp:selection-filter | | | +--rw yp:subtree-filter?
| +--rw stop-time? yang:date-and-time | | +--:(yp:xpath-filter)
| | +--rw yp:xpath-filter? yang:xpath1.0
| +--rw stop-time? yang:date-and-time
| +--rw receivers | +--rw receivers
| | +--rw receiver* [address port] | | +--rw receiver* [address port]
| | +--rw address inet:host | | +--rw address inet:host
| | +--rw port inet:port-number | | +--rw port inet:port-number
| | +--rw protocol? transport-protocol | | +--rw protocol? transport-protocol
| +--rw (notification-origin)? | +--rw (notification-origin)?
| | +--:(interface-originated) | | +--:(interface-originated)
| | | +--rw source-interface? if:interface-ref | | | +--rw source-interface? if:interface-ref
| | +--:(address-originated) | | +--:(address-originated)
| | +--rw source-vrf? string | | +--rw source-vrf? string
| | +--rw source-address inet:ip-address-no-zone | | +--rw source-address? inet:ip-address-no-zone
| +--rw (yp:update-trigger)? | +--rw (yp:update-trigger)?
| | +--:(yp:periodic) | | +--:(yp:periodic)
| | | +--rw yp:period yang:timeticks | | | +--rw yp:period yang:timeticks
| | | +--rw yp:anchor-time? yang:date-and-time | | | +--rw yp:anchor-time? yang:date-and-time
| | +--:(yp:on-change) {on-change}? | | +--:(yp:on-change) {on-change}?
| | +--rw yp:dampening-period yang:timeticks | | +--rw yp:dampening-period yang:timeticks
| | +--rw yp:no-synch-on-start? empty | | +--rw yp:no-synch-on-start? empty
| | +--rw yp:excluded-change* change-type | | +--rw yp:excluded-change* change-type
| +--rw yp:dscp? inet:dscp | +--rw yp:dscp? inet:dscp
| +--rw yp:weighting? uint8 | +--rw yp:weighting? uint8
| +--rw yp:dependency? sn:subscription-id | +--rw yp:dependency? sn:subscription-id
+--ro subscriptions +--ro subscriptions
+--ro subscription* [identifier] +--ro subscription* [identifier]
+--ro identifier subscription-id +--ro identifier subscription-id
+--ro configured-subscription? +--ro configured-subscription?
| empty {configured-subscriptions}? | empty {configured-subscriptions}?
+--ro encoding? encoding +--ro encoding? encoding
+--ro (target) +--ro (target)
| +--:(stream) | +--:(stream)
| | +--ro (event-filter)? | | +--ro (event-filter)?
| | | +--:(by-reference) | | | +--:(by-reference)
| | | | +--ro filter-ref filter-ref | | | | +--ro event-filter-ref event-filter-ref
| | | +--:(within-subscription) | | | +--:(within-subscription)
| | | +--ro event-filter-type event-filter-type | | | +--ro (filter-spec)?
| | | +--ro event-filter-contents | | | +--:(subtree-filter)
| | +--ro stream stream | | | | +--ro subtree-filter?
| | | +--:(xpath-filter)
| | | +--ro xpath-filter? yang:xpath1.0
| | +--ro stream stream
| | +--ro replay-start-time? yang:date-and-time {replay}? | | +--ro replay-start-time? yang:date-and-time {replay}?
| +--:(yp:datastore) | +--:(yp:datastore)
| +--ro yp:datastore identityref | +--ro yp:source identityref
| +--ro (yp:selected-content)? | +--ro (yp:selected-content)?
| +--:(yp:by-reference) | +--:(yp:by-reference)
| | +--ro yp:filter-ref sn:filter-ref | | +--ro yp:selection-filter-ref selection-filter-ref
| +--:(yp:within-subscription) | +--:(yp:within-subscription)
| +--ro yp:selection-filter-type | +--ro (yp:filter-spec)?
| selection-filter-type | +--:(yp:subtree-filter)
| +--ro yp:selection-filter | | +--ro yp:subtree-filter?
+--ro stop-time? yang:date-and-time | +--:(yp:xpath-filter)
| +--ro yp:xpath-filter? yang:xpath1.0
+--ro stop-time? yang:date-and-time
+--ro (notification-origin)? +--ro (notification-origin)?
| +--:(interface-originated) | +--:(interface-originated)
| | +--ro source-interface? if:interface-ref | | +--ro source-interface? if:interface-ref
| +--:(address-originated) | +--:(address-originated)
| +--ro source-vrf? string | +--ro source-vrf? string
| +--ro source-address inet:ip-address-no-zone | +--ro source-address? inet:ip-address-no-zone
+--ro receivers +--ro receivers
| +--ro receiver* [address port] | +--ro receiver* [address port]
| +--ro address inet:host | +--ro address inet:host
| +--ro port inet:port-number | +--ro port inet:port-number
| +--ro protocol? transport-protocol | +--ro protocol? transport-protocol
| +--ro pushed-notifications? yang:counter64 | +--ro pushed-notifications? yang:counter64
| +--ro excluded-notifications? yang:counter64 | +--ro excluded-notifications? yang:counter64
| +--ro status subscription-status | +--ro status subscription-status
+--ro (yp:update-trigger)? +--ro (yp:update-trigger)?
| +--:(yp:periodic) | +--:(yp:periodic)
| | +--ro yp:period yang:timeticks | | +--ro yp:period yang:timeticks
| | +--ro yp:anchor-time? yang:date-and-time | | +--ro yp:anchor-time? yang:date-and-time
| +--:(yp:on-change) {on-change}? | +--:(yp:on-change) {on-change}?
| +--ro yp:dampening-period yang:timeticks | +--ro yp:dampening-period yang:timeticks
| +--ro yp:no-synch-on-start? empty | +--ro yp:no-synch-on-start? empty
| +--ro yp:excluded-change* change-type | +--ro yp:excluded-change* change-type
+--ro yp:dscp? inet:dscp +--ro yp:dscp? inet:dscp
+--ro yp:weighting? uint8 +--ro yp:weighting? uint8
+--ro yp:dependency? sn:subscription-id +--ro yp:dependency? sn:subscription-id
rpcs: rpcs:
+---x establish-subscription +---x establish-subscription
| +---w input | +---w input
| | +---w encoding? encoding | | +---w encoding? encoding
| | +---w (target) | | +---w (target)
| | | +--:(stream) | | | +--:(stream)
| | | | +---w (event-filter)? | | | | +---w (event-filter)?
| | | | | +--:(by-reference) | | | | | +--:(by-reference)
| | | | | | +---w filter-ref filter-ref | | | | | | +---w event-filter-ref event-filter-ref
| | | | | +--:(within-subscription) | | | | | +--:(within-subscription)
| | | | | +---w event-filter-type event-filter-type | | | | | +---w (filter-spec)?
| | | | | +---w event-filter-contents | | | | | +--:(subtree-filter)
| | | | +---w stream stream | | | | | | +---w subtree-filter?
| | | | +---w replay-start-time? yang:date-and-time {replay}? | | | | | +--:(xpath-filter)
| | | | | +---w xpath-filter? yang:xpath1.0
| | | | +---w stream stream
| | | | +---w replay-start-time? yang:date-and-time {replay}?
| | | +--:(yp:datastore) | | | +--:(yp:datastore)
| | | +---w yp:datastore identityref | | | +---w yp:source identityref
| | | +---w (yp:selected-content)? | | | +---w (yp:selected-content)?
| | | +--:(yp:by-reference) | | | +--:(yp:by-reference)
| | | | +---w yp:filter-ref sn:filter-ref | | | | +---w yp:selection-filter-ref selection-filter-ref
| | | +--:(yp:within-subscription) | | | +--:(yp:within-subscription)
| | | +---w yp:selection-filter-type | | | +---w (yp:filter-spec)?
| | | | selection-filter-type | | | +--:(yp:subtree-filter)
| | | +---w yp:selection-filter | | | | +---w yp:subtree-filter?
| | +---w stop-time? yang:date-and-time | | | +--:(yp:xpath-filter)
| | | +---w yp:xpath-filter? yang:xpath1.0
| | +---w stop-time? yang:date-and-time
| | +---w (yp:update-trigger)? | | +---w (yp:update-trigger)?
| | | +--:(yp:periodic) | | | +--:(yp:periodic)
| | | | +---w yp:period yang:timeticks | | | | +---w yp:period yang:timeticks
| | | | +---w yp:anchor-time? yang:date-and-time | | | | +---w yp:anchor-time? yang:date-and-time
| | | +--:(yp:on-change) {on-change}? | | | +--:(yp:on-change) {on-change}?
| | | +---w yp:dampening-period yang:timeticks | | | +---w yp:dampening-period yang:timeticks
| | | +---w yp:no-synch-on-start? empty | | | +---w yp:no-synch-on-start? empty
| | | +---w yp:excluded-change* change-type | | | +---w yp:excluded-change* change-type
| | +---w yp:dscp? inet:dscp | | +---w yp:dscp? inet:dscp
| | +---w yp:weighting? uint8 | | +---w yp:weighting? uint8
| | +---w yp:dependency? sn:subscription-id | | +---w yp:dependency? sn:subscription-id
| +--ro output | +--ro output
| +--ro subscription-result subscription-result | +--ro subscription-result subscription-result
| +--ro (result)? | +--ro (result)?
| +--:(no-success) | +--:(no-success)
| | +--ro filter-failure? string | | +--ro filter-failure? string
| | +--ro replay-start-time-hint? yang:date-and-time | | +--ro replay-start-time-hint? yang:date-and-time
| | +--ro yp:period-hint? yang:timeticks | | +--ro yp:period-hint? yang:timeticks
| | +--ro yp:error-path? string | | +--ro yp:error-path? string
| | +--ro yp:object-count-estimate? uint32 | | +--ro yp:object-count-estimate? uint32
| | +--ro yp:object-count-limit? uint32 | | +--ro yp:object-count-limit? uint32
| | +--ro yp:kilobytes-estimate? uint32 | | +--ro yp:kilobytes-estimate? uint32
| | +--ro yp:kilobytes-limit? uint32 | | +--ro yp:kilobytes-limit? uint32
| +--:(success) | +--:(success)
| +--ro identifier subscription-id | +--ro identifier subscription-id
+---x modify-subscription +---x modify-subscription
| +---w input | +---w input
| | +---w identifier? subscription-id | | +---w identifier? subscription-id
| | +---w (target) | | +---w (target)
| | | +--:(stream) | | | +--:(stream)
| | | +---w (event-filter)? | | | | +---w (event-filter)?
| | | +--:(by-reference) | | | | +--:(by-reference)
| | | | +---w filter-ref filter-ref | | | | | +---w event-filter-ref event-filter-ref
| | | +--:(within-subscription) | | | | +--:(within-subscription)
| | | +---w event-filter-type event-filter-type | | | | +---w (filter-spec)?
| | | +---w event-filter-contents | | | | +--:(subtree-filter)
| | +---w stop-time? yang:date-and-time | | | | | +---w subtree-filter?
| | | | +--:(xpath-filter)
| | | | +---w xpath-filter? yang:xpath1.0
| | | +--:(yp:datastore)
| | | +---w (yp:selected-content)?
| | | +--:(yp:by-reference)
| | | | +---w yp:selection-filter-ref selection-filter-ref
| | | +--:(yp:within-subscription)
| | | +---w (yp:filter-spec)?
| | | +--:(yp:subtree-filter)
| | | | +---w yp:subtree-filter?
| | | +--:(yp:xpath-filter)
| | | +---w yp:xpath-filter? yang:xpath1.0
| | +---w stop-time? yang:date-and-time
| | +---w (yp:update-trigger)? | | +---w (yp:update-trigger)?
| | +--:(yp:periodic) | | +--:(yp:periodic)
| | | +---w yp:period yang:timeticks | | | +---w yp:period yang:timeticks
| | | +---w yp:anchor-time? yang:date-and-time | | | +---w yp:anchor-time? yang:date-and-time
| | +--:(yp:on-change) {on-change}? | | +--:(yp:on-change) {on-change}?
| | +---w yp:dampening-period yang:timeticks | | +---w yp:dampening-period yang:timeticks
| +--ro output | +--ro output
| +--ro subscription-result subscription-result | +--ro subscription-result subscription-result
| +--ro (result)? | +--ro (result)?
| +--:(no-success) | +--:(no-success)
| +--ro filter-failure? string | +--ro filter-failure? string
| +--ro yp:period-hint? yang:timeticks | +--ro yp:period-hint? yang:timeticks
| +--ro yp:error-path? string | +--ro yp:error-path? string
| +--ro yp:object-count-estimate? uint32 | +--ro yp:object-count-estimate? uint32
| +--ro yp:object-count-limit? uint32 | +--ro yp:object-count-limit? uint32
| +--ro yp:kilobytes-estimate? uint32 | +--ro yp:kilobytes-estimate? uint32
skipping to change at page 22, line 35 skipping to change at page 23, line 20
| +---w identifier subscription-id | +---w identifier subscription-id
+--ro output +--ro output
+--ro subscription-result subscription-result +--ro subscription-result subscription-result
notifications: notifications:
+---n replay-completed +---n replay-completed
| +--ro identifier subscription-id | +--ro identifier subscription-id
+---n subscription-completed +---n subscription-completed
| +--ro identifier subscription-id | +--ro identifier subscription-id
+---n subscription-started +---n subscription-started
| +--ro identifier subscription-id | +--ro identifier subscription-id
| +--ro encoding? encoding | +--ro encoding? encoding
| +--ro (target) | +--ro (target)
| | +--:(stream) | | +--:(stream)
| | | +--ro (event-filter)? | | | +--ro (event-filter)?
| | | | +--:(by-reference) | | | | +--:(by-reference)
| | | | | +--ro filter-ref filter-ref | | | | | +--ro event-filter-ref event-filter-ref
| | | | +--:(within-subscription) | | | | +--:(within-subscription)
| | | | +--ro event-filter-type event-filter-type | | | | +--ro (filter-spec)?
| | | | +--ro event-filter-contents | | | | +--:(subtree-filter)
| | | +--ro stream stream | | | | | +--ro subtree-filter?
| | | | +--:(xpath-filter)
| | | | +--ro xpath-filter? yang:xpath1.0
| | | +--ro stream stream
| | | +--ro replay-start-time? yang:date-and-time {replay}? | | | +--ro replay-start-time? yang:date-and-time {replay}?
| | +--:(yp:datastore) | | +--:(yp:datastore)
| | +--ro yp:datastore identityref | | +--ro yp:source identityref
| | +--ro (yp:selected-content)? | | +--ro (yp:selected-content)?
| | +--:(yp:by-reference) | | +--:(yp:by-reference)
| | | +--ro yp:filter-ref sn:filter-ref | | | +--ro yp:selection-filter-ref selection-filter-ref
| | +--:(yp:within-subscription) | | +--:(yp:within-subscription)
| | +--ro yp:selection-filter-type selection-filter-type | | +--ro (yp:filter-spec)?
| | +--ro yp:selection-filter | | +--:(yp:subtree-filter)
| +--ro stop-time? yang:date-and-time | | | +--ro yp:subtree-filter?
| | +--:(yp:xpath-filter)
| | +--ro yp:xpath-filter? yang:xpath1.0
| +--ro stop-time? yang:date-and-time
| +--ro (yp:update-trigger)? | +--ro (yp:update-trigger)?
| | +--:(yp:periodic) | | +--:(yp:periodic)
| | | +--ro yp:period yang:timeticks | | | +--ro yp:period yang:timeticks
| | | +--ro yp:anchor-time? yang:date-and-time | | | +--ro yp:anchor-time? yang:date-and-time
| | +--:(yp:on-change) {on-change}? | | +--:(yp:on-change) {on-change}?
| | +--ro yp:dampening-period yang:timeticks | | +--ro yp:dampening-period yang:timeticks
| | +--ro yp:no-synch-on-start? empty | | +--ro yp:no-synch-on-start? empty
| | +--ro yp:excluded-change* change-type | | +--ro yp:excluded-change* change-type
| +--ro yp:dscp? inet:dscp | +--ro yp:dscp? inet:dscp
| +--ro yp:weighting? uint8 | +--ro yp:weighting? uint8
| +--ro yp:dependency? sn:subscription-id | +--ro yp:dependency? sn:subscription-id
+---n subscription-resumed +---n subscription-resumed
| +--ro identifier subscription-id | +--ro identifier subscription-id
+---n subscription-modified +---n subscription-modified
| +--ro identifier subscription-id | +--ro identifier subscription-id
| +--ro encoding? encoding | +--ro encoding? encoding
| +--ro (target) | +--ro (target)
| | +--:(stream) | | +--:(stream)
| | | +--ro (event-filter)? | | | +--ro (event-filter)?
| | | | +--:(by-reference) | | | | +--:(by-reference)
| | | | | +--ro filter-ref filter-ref | | | | | +--ro event-filter-ref event-filter-ref
| | | | +--:(within-subscription) | | | | +--:(within-subscription)
| | | | +--ro event-filter-type event-filter-type | | | | +--ro (filter-spec)?
| | | | +--ro event-filter-contents | | | | +--:(subtree-filter)
| | | +--ro stream stream | | | | | +--ro subtree-filter?
| | | | +--:(xpath-filter)
| | | | +--ro xpath-filter? yang:xpath1.0
| | | +--ro stream stream
| | | +--ro replay-start-time? yang:date-and-time {replay}? | | | +--ro replay-start-time? yang:date-and-time {replay}?
| | +--:(yp:datastore) | | +--:(yp:datastore)
| | +--ro yp:datastore identityref | | +--ro yp:source identityref
| | +--ro (yp:selected-content)? | | +--ro (yp:selected-content)?
| | +--:(yp:by-reference) | | +--:(yp:by-reference)
| | | +--ro yp:filter-ref sn:filter-ref | | | +--ro yp:selection-filter-ref selection-filter-ref
| | +--:(yp:within-subscription) | | +--:(yp:within-subscription)
| | +--ro yp:selection-filter-type selection-filter-type | | +--ro (yp:filter-spec)?
| | +--ro yp:selection-filter | | +--:(yp:subtree-filter)
| +--ro stop-time? yang:date-and-time | | | +--ro yp:subtree-filter?
| | +--:(yp:xpath-filter)
| | +--ro yp:xpath-filter? yang:xpath1.0
| +--ro stop-time? yang:date-and-time
| +--ro (yp:update-trigger)? | +--ro (yp:update-trigger)?
| | +--:(yp:periodic) | | +--:(yp:periodic)
| | | +--ro yp:period yang:timeticks | | | +--ro yp:period yang:timeticks
| | | +--ro yp:anchor-time? yang:date-and-time | | | +--ro yp:anchor-time? yang:date-and-time
| | +--:(yp:on-change) {on-change}? | | +--:(yp:on-change) {on-change}?
| | +--ro yp:dampening-period yang:timeticks | | +--ro yp:dampening-period yang:timeticks
| | +--ro yp:no-synch-on-start? empty | | +--ro yp:no-synch-on-start? empty
| | +--ro yp:excluded-change* change-type | | +--ro yp:excluded-change* change-type
| +--ro yp:dscp? inet:dscp | +--ro yp:dscp? inet:dscp
| +--ro yp:weighting? uint8 | +--ro yp:weighting? uint8
| +--ro yp:dependency? sn:subscription-id | +--ro yp:dependency? sn:subscription-id
+---n subscription-terminated +---n subscription-terminated
| +--ro identifier subscription-id | +--ro identifier subscription-id
| +--ro error-id subscription-errors | +--ro error-id subscription-errors
| +--ro filter-failure? string | +--ro filter-failure? string
+---n subscription-suspended +---n subscription-suspended
+--ro identifier subscription-id +--ro identifier subscription-id
+--ro error-id subscription-errors +--ro error-id subscription-errors
+--ro filter-failure? string +--ro filter-failure? string
module: ietf-yang-push module: ietf-yang-push
rpcs: rpcs:
+---x resynch-subscription {on-change}? +---x resynch-subscription {on-change}?
+---w input +---w input
| +---w identifier sn:subscription-id | +---w identifier sn:subscription-id
+--ro output +--ro output
+--ro subscription-result sn:subscription-result +--ro subscription-result sn:subscription-result
notifications: notifications:
+---n push-update +---n push-update
| +--ro subscription-id sn:subscription-id | +--ro subscription-id? sn:subscription-id
| +--ro time-of-update? yang:date-and-time | +--ro time-of-update? yang:date-and-time
| +--ro updates-not-sent? empty | +--ro updates-not-sent? empty
| +--ro datastore-contents? | +--ro datastore-contents?
+---n push-change-update {on-change}? +---n push-change-update {on-change}?
+--ro subscription-id sn:subscription-id +--ro subscription-id? sn:subscription-id
+--ro time-of-update? yang:date-and-time +--ro time-of-update? yang:date-and-time
+--ro updates-not-sent? empty +--ro updates-not-sent? empty
+--ro datastore-changes? +--ro datastore-changes?
Figure 9: Model structure Figure 9: Model structure
Selected components of the model are summarized below. Selected components of the model are summarized below.
4.2. Subscription configuration 4.2. Subscription configuration
skipping to change at page 27, line 19 skipping to change at page 28, line 19
4.4.1. Establish-subscription RPC 4.4.1. Establish-subscription RPC
The subscriber sends an establish-subscription RPC with the The subscriber sends an establish-subscription RPC with the
parameters in section 3.1. An example might look like: parameters in section 3.1. An example might look like:
<netconf:rpc message-id="101" <netconf:rpc message-id="101"
xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0"> xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
<establish-subscription <establish-subscription
xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push:1.0"> xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push:1.0">
<filter netconf:type="xpath" <datastore>
<source>operational</source>
<selection-filter netconf:type="xpath"
xmlns:ex="http://example.com/sample-data/1.0" xmlns:ex="http://example.com/sample-data/1.0"
select="/ex:foo"/> select="/ex:foo"/>
</datastore>
<period>500</period> <period>500</period>
<encoding>encode-xml</encoding> <encoding>encode-xml</encoding>
</establish-subscription> </establish-subscription>
</netconf:rpc> </netconf:rpc>
Figure 10: Establish-subscription RPC Figure 10: Establish-subscription RPC
The publisher MUST respond explicitly positively (i.e., subscription The publisher MUST respond explicitly positively (i.e., subscription
accepted) or negatively (i.e., subscription rejected) to the request. accepted) or negatively (i.e., subscription rejected) to the request.
Positive responses include the subscription-id of the accepted Positive responses include the subscription-id of the accepted
skipping to change at page 28, line 36 skipping to change at page 29, line 38
subscription parameters would have been accepted for the request. subscription parameters would have been accepted for the request.
However, there are no guarantee that subsequent requests using this However, there are no guarantee that subsequent requests using this
info will in fact be accepted. info will in fact be accepted.
For example, for the following request: For example, for the following request:
<netconf:rpc message-id="101" <netconf:rpc message-id="101"
xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0"> xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
<establish-subscription <establish-subscription
xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push:1.0"> xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push:1.0">
<datastore>running</datastore> <datastore>
<filter netconf:type="xpath" <source>running</source>
<selection-filter netconf:type="xpath"
xmlns:ex="http://example.com/sample-data/1.0" xmlns:ex="http://example.com/sample-data/1.0"
select="/ex:foo"/> select="/ex:foo"/>
</datastore>
<dampening-period>10</dampening-period> <dampening-period>10</dampening-period>
<encoding>encode-xml</encoding> <encoding>encode-xml</encoding>
</establish-subscription> </establish-subscription>
</netconf:rpc> </netconf:rpc>
Figure 13: Establish-subscription request example 2 Figure 13: Establish-subscription request example 2
a publisher that cannot serve on-change updates but periodic updates a publisher that cannot serve on-change updates but periodic updates
might return the following: might return the following:
skipping to change at page 29, line 28 skipping to change at page 30, line 31
The subscriber MAY invoke the modify-subscription RPC for a The subscriber MAY invoke the modify-subscription RPC for a
subscription it previously established. The subscriber will include subscription it previously established. The subscriber will include
newly desired values in the modify-subscription RPC. Parameters not newly desired values in the modify-subscription RPC. Parameters not
included MUST remain unmodified. Below is an example where a included MUST remain unmodified. Below is an example where a
subscriber attempts to modify the period of a subscription. subscriber attempts to modify the period of a subscription.
<netconf:rpc message-id="102" <netconf:rpc message-id="102"
xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0"> xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
<modify-subscription <modify-subscription
xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push:1.0"> xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push:1.0">
<datastore>running</datastore> <datastore>
<selection-filter netconf:type="xpath"
xmlns:ex="http://example.com/sample-data/1.0"
select="/ex:bar"/>
</datastore>
<subscription-id> <subscription-id>
1011 1011
</subscription-id> </subscription-id>
<period>250</period> <period>250</period>
</modify-subscription> </modify-subscription>
</netconf:rpc> </netconf:rpc>
Figure 15: Modify subscription request Figure 15: Modify subscription request
The publisher MUST respond explicitly positively or negatively to the The publisher MUST respond explicitly positively or negatively to the
skipping to change at page 31, line 40 skipping to change at page 33, line 11
publisher in order to detect the specific YANG library changes. The publisher in order to detect the specific YANG library changes. The
"ietf-netconf-notifications" module defined in [RFC6470] contains a "ietf-netconf-notifications" module defined in [RFC6470] contains a
"netconf-capability-change" notification that can identify specific "netconf-capability-change" notification that can identify specific
module changes. For example, the module URI capability of a newly module changes. For example, the module URI capability of a newly
loaded module will be listed in the "added-capability" leaf-list, and loaded module will be listed in the "added-capability" leaf-list, and
the module URI capability of an removed module will be listed in the the module URI capability of an removed module will be listed in the
"deleted-capability" leaf-list. "deleted-capability" leaf-list.
5. YANG module 5. YANG module
<CODE BEGINS>; file "ietf-yang-push@2017-09-19.yang" <CODE BEGINS>; file "ietf-yang-push.yang"
module ietf-yang-push { module ietf-yang-push {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-yang-push"; namespace "urn:ietf:params:xml:ns:yang:ietf-yang-push";
prefix yp; prefix yp;
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
} }
import ietf-yang-types { import ietf-yang-types {
prefix yang; prefix yang;
skipping to change at page 32, line 41 skipping to change at page 34, line 12
Editor: Andy Bierman Editor: Andy Bierman
<mailto:andy@yumaworks.com> <mailto:andy@yumaworks.com>
Editor: Balazs Lengyel Editor: Balazs Lengyel
<mailto:balazs.lengyel@ericsson.com>"; <mailto:balazs.lengyel@ericsson.com>";
description description
"This module contains conceptual YANG specifications "This module contains conceptual YANG specifications
for YANG push."; for YANG push.";
revision 2017-09-19 { revision 2017-10-02 {
description description
"Initial revision."; "Initial revision.";
reference reference
"YANG Datastore Push, draft-ietf-netconf-yang-push-09"; "YANG Datastore Push, draft-ietf-netconf-yang-push-09";
} }
/* /*
* EXTENSIONS * EXTENSIONS
*/ */
extension notifiable-on-change { extension notifiable-on-change {
argument "value"; argument "value";
description description
"Indicates whether changes to the data node are reportable in "Indicates whether changes to the data node are reportable in
on-change subscriptions. on-change subscriptions.
The statement MUST only be a substatement of the leaf, leaf-list, The statement MUST only be a substatement of the leaf, leaf-list,
container, list, anyxml, anydata statements. Zero or One container, list, anyxml, anydata statements. Zero or One
notifiable-on-change statement is allowed per parent statement. notifiable-on-change statement is allowed per parent statement.
NO substatements are allowed. NO substatements are allowed.
skipping to change at page 35, line 8 skipping to change at page 36, line 24
/* Datastore identities */ /* Datastore identities */
identity custom-datastore { identity custom-datastore {
base ds:datastore; base ds:datastore;
description description
"A datastore with boundaries not defined within "A datastore with boundaries not defined within
draft-ietf-netmod-revised-datastores"; draft-ietf-netmod-revised-datastores";
} }
/* Selection filter identities */
identity selection-filter {
description
"Evaluation criteria encoded in a syntax which allows the
selection of nodes from a target. If the filter is applied
against a datastore for periodic extracts, the resulting node-set
result is passed along. If the filter is applied against a
datastore looking for changes, deltas from the last update in the
form of a patch result are passed along. An empty node set is a
valid result of this filter type.";
}
identity subtree-selection-filter {
base selection-filter;
description
"An RFC-6241 based selection-filter which may be used to select
nodes within a datastore.";
reference "RFC-6241, #5.1";
}
identity xpath-selection-filter {
base selection-filter;
description
"A selection-filter which may be applied to a datastore which
follows the syntax specified in yang:xpath1.0. Nodes that
evaluate to true are included in the selection.";
reference "XPATH: http://www.w3.org/TR/1999/REC-xpath-19991116";
}
/* /*
* TYPE DEFINITIONS * TYPE DEFINITIONS
*/ */
typedef change-type { typedef change-type {
type enumeration { type enumeration {
enum "create" { enum "create" {
description description
"Create a new data resource if it does not already exist. If "Create a new data resource if it does not already exist. If
it already exists, replace."; it already exists, replace.";
skipping to change at page 36, line 33 skipping to change at page 37, line 23
} }
} }
description description
"Specifies different types of datastore changes."; "Specifies different types of datastore changes.";
reference reference
"RFC 8072 section 2.5, with a delta that it is ok to receive "RFC 8072 section 2.5, with a delta that it is ok to receive
ability create on an existing node, or receive a delete on a ability create on an existing node, or receive a delete on a
missing node."; missing node.";
} }
typedef selection-filter-type { typedef selection-filter-ref {
type identityref { type leafref {
base selection-filter; path "/sn:filters/yp:selection-filter/yp:identifier";
} }
description description
"Specifies a known type of selection filter."; "This type is used to reference a selection filter.";
} }
/* /*
* GROUP DEFINITIONS * GROUP DEFINITIONS
*/ */
grouping datastore-criteria { grouping datastore-criteria {
description description
"A grouping to define criteria for which selected objects from "A grouping to define criteria for which selected objects from
a targeted datastore should be included in push updates."; a targeted datastore should be included in push updates.";
leaf datastore { leaf source {
type identityref { type identityref {
base ds:datastore; base ds:datastore;
} }
mandatory true; mandatory true;
description description
"Specifies a system-provided datastore against which a selection "Datastore from which to retrieve data.";
filter will be applied";
} }
uses selection-filter-objects; uses selection-filter-objects;
} }
grouping selection-filter-elements { grouping selection-filter-types {
description description
"This grouping defines a selector for objects from a "This grouping defines a selector for objects from a
datastore."; datastore.";
leaf selection-filter-type { choice filter-spec {
type selection-filter-type;
mandatory true;
description
"A filter needs to be a known and understood syntax if it is
to be interpretable by a device.";
}
anyxml selection-filter {
mandatory true;
description description
"Datastore evaluation criteria encoded in a syntax of a "The content filter specification for this request.";
supported type of selection filter."; anydata subtree-filter {
description
"This parameter identifies the portions of the
target datastore to retrieve.";
reference "RFC 6241, Section 6.";
}
leaf xpath-filter {
type yang:xpath1.0;
description
"This parameter contains an XPath expression identifying the
portions of the target datastore to retrieve.";
reference "http://www.w3.org/TR/1999/REC-xpath-19991116";
}
} }
} }
grouping selection-filter-objects { grouping selection-filter-objects {
description description
"This grouping defines a selector for objects from a "This grouping defines a selector for objects from a
datastore."; datastore.";
choice selected-content { choice selected-content {
description description
"The source of the selection filter applied to the subscription. "The source of the selection filter applied to the subscription.
This will come either referenced from a global list, or be This will come either referenced from a global list, or be
provided within the subscription itself."; provided within the subscription itself.";
case by-reference { case by-reference {
description description
"Incorporate a filter that has been configured separately."; "Incorporate a filter that has been configured separately.";
leaf filter-ref { leaf selection-filter-ref {
type sn:filter-ref; type selection-filter-ref;
mandatory true; mandatory true;
description description
"References an existing selection filter which is to be "References an existing selection filter which is to be
applied to the subscription."; applied to the subscription.";
} }
} }
case within-subscription { case within-subscription {
description description
"Local definition allows a filter to have the same lifecycle "Local definition allows a filter to have the same lifecycle
as the subscription."; as the subscription.";
uses selection-filter-elements; uses selection-filter-types;
} }
} }
} }
grouping update-policy-modifiable { grouping update-policy-modifiable {
description description
"This grouping describes the datastore specific subscription "This grouping describes the datastore specific subscription
conditions that can be changed during the lifetime of the conditions that can be changed during the lifetime of the
subscription."; subscription.";
choice update-trigger { choice update-trigger {
description description
skipping to change at page 43, line 12 skipping to change at page 44, line 4
"sn:result/sn:no-success" { "sn:result/sn:no-success" {
description description
"This augmentation adds datastore specific error info "This augmentation adds datastore specific error info
and hints to RPC output."; and hints to RPC output.";
uses update-error-hints; uses update-error-hints;
} }
augment "/sn:modify-subscription/sn:input" { augment "/sn:modify-subscription/sn:input" {
description description
"This augmentation adds additional subscription parameters "This augmentation adds additional subscription parameters
specific to datastore updates."; specific to datastore updates.";
uses update-policy-modifiable; uses update-policy-modifiable;
} }
augment "/sn:modify-subscription/sn:input/sn:target" {
description
"This augmentation adds the datastore as a valid parameter object
for the subscription to RPC input. This provides a target for
the filter.";
case datastore {
uses selection-filter-objects;
}
}
augment "/sn:modify-subscription/sn:output/"+ augment "/sn:modify-subscription/sn:output/"+
"sn:result/sn:no-success" { "sn:result/sn:no-success" {
description description
"This augmentation adds push datastore error info and hints to "This augmentation adds push datastore error info and hints to
RPC output."; RPC output.";
uses update-error-hints; uses update-error-hints;
} }
notification push-update { notification push-update {
description description
skipping to change at page 45, line 23 skipping to change at page 46, line 24
augment "/sn:subscription-started" { augment "/sn:subscription-started" {
description description
"This augmentation adds many yang datastore specific objects to "This augmentation adds many yang datastore specific objects to
the notification that a subscription has started."; the notification that a subscription has started.";
uses update-policy; uses update-policy;
uses update-qos; uses update-qos;
} }
augment "/sn:subscription-started/sn:target" { augment "/sn:subscription-started/sn:target" {
description description
"This augmentation allows the datastore to be included as part "This augmentation allows the datastore to be included as part
of the notification that a subscription has started."; of the notification that a subscription has started.";
case datastore { case datastore {
uses datastore-criteria; uses datastore-criteria;
} }
} }
augment "/sn:filters/sn:filter/sn:filter-type" { augment "/sn:filters" {
description description
"This augmentation allows the datastore to be included as part "This augmentation allows the datastore to be included as part
of the selection filtering criteria for a subscription."; of the selection filtering criteria for a subscription.";
case datastore { list selection-filter {
uses selection-filter-elements; key "identifier";
description
"A list of pre-positioned filters that can be applied
to datastore subscriptions.";
leaf identifier {
type sn:filter-id;
description
"An identifier to differentiate between selection filters.";
}
uses selection-filter-types;
} }
} }
augment "/sn:subscription-modified" { augment "/sn:subscription-modified" {
description description
"This augmentation adds many yang datastore specific objects to "This augmentation adds many yang datastore specific objects to
the notification that a subscription has been modified."; the notification that a subscription has been modified.";
uses update-policy; uses update-policy;
uses update-qos; uses update-qos;
} }
augment "/sn:subscription-modified/sn:target" { augment "/sn:subscription-modified/sn:target" {
description description
"This augmentation allows the datastore to be included as part "This augmentation allows the datastore to be included as part
of the notification that a subscription has been modified."; of the notification that a subscription has been modified.";
case datastore { case datastore {
uses datastore-criteria; uses datastore-criteria;
} }
} }
augment "/sn:subscription-config/sn:subscription" { augment "/sn:subscription-config/sn:subscription" {
skipping to change at page 49, line 38 skipping to change at page 50, line 48
<https://www.rfc-editor.org/info/rfc7923>. <https://www.rfc-editor.org/info/rfc7923>.
[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF [RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF
Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017, Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017,
<https://www.rfc-editor.org/info/rfc8040>. <https://www.rfc-editor.org/info/rfc8040>.
Appendix A. Changes between revisions Appendix A. Changes between revisions
(To be removed by RFC editor prior to publication) (To be removed by RFC editor prior to publication)
v09 - v10
o Returned to the explicit filter subtyping of v00-v05
o identityref to ds:datastore made explicit
o Returned ability to modify a selection filter via RPC.
v08 - v09 v08 - v09
o Minor tweaks cleaning up text, removing appendicies, and making o Minor tweaks cleaning up text, removing appendicies, and making
reference to revised-datastores. reference to revised-datastores.
o Subscription-id optional in push updates, except when encoded in o Subscription-id optional in push updates, except when encoded in
RFC5277, Section 4 one-way notification. RFC5277, Section 4 one-way notification.
o Finished adding the text descibing the resynch subscription RPC. o Finished adding the text descibing the resynch subscription RPC.
 End of changes. 88 change blocks. 
215 lines changed or deleted 276 lines changed or added

This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/