| < 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/ | ||||