| rfc8650xml2.original.xml | rfc8650.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="US-ASCII"?> | <?xml version='1.0' encoding='utf-8'?> | |||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
| <?rfc toc="yes"?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" | |||
| <?rfc tocompact="yes"?> | number="8650" | |||
| <?rfc tocdepth="3"?> | docName="draft-ietf-netconf-restconf-notif-15" | |||
| <?rfc tocindent="yes"?> | updates="" | |||
| <?rfc symrefs="yes"?> | obsoletes="" | |||
| <?rfc sortrefs="yes"?> | category="std" | |||
| <?rfc comments="yes"?> | consensus="true" | |||
| <?rfc inline="yes"?> | submissionType="IETF" | |||
| <?rfc compact="yes"?> | ipr="trust200902" | |||
| <?rfc subcompact="no"?> | tocInclude="true" | |||
| <rfc category="std" docName="draft-ietf-netconf-restconf-notif-15" | symRefs="true" | |||
| ipr="trust200902"> | sortRefs="true" | |||
| xml:lang="en" | ||||
| version="3"> | ||||
| <front> | <front> | |||
| <title abbrev="RESTCONF-Notif">Dynamic subscription to YANG Events and Datas tores over RESTCONF</title> | ||||
| <title abbrev="RESTCONF Transport for Event Notifications">Dynamic Subscript | ||||
| ion to YANG Events and Datastores over RESTCONF</title> | ||||
| <seriesInfo name="RFC" value="8650"/> | ||||
| <author fullname="Eric Voit" initials="E." surname="Voit"> | <author fullname="Eric Voit" initials="E." surname="Voit"> | |||
| <organization>Cisco Systems</organization> | <organization>Cisco Systems</organization> | |||
| <address> | <address> | |||
| <email>evoit@cisco.com</email> | <email>evoit@cisco.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Reshad Rahman" initials="R." surname="Rahman"> | ||||
| <author fullname="Reshad Rahman" initials="R" | ||||
| surname="Rahman"> | ||||
| <organization>Cisco Systems</organization> | <organization>Cisco Systems</organization> | |||
| <address> | <address> | |||
| <email>rrahman@cisco.com</email> | <email>rrahman@cisco.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Einar Nilsen-Nygaard" initials="E." surname="Nilsen-Nygaar | ||||
| <author fullname="Einar Nilsen-Nygaard" initials="E" | d"> | |||
| surname="Nilsen-Nygaard"> | ||||
| <organization>Cisco Systems</organization> | <organization>Cisco Systems</organization> | |||
| <address> | <address> | |||
| <email>einarnn@cisco.com</email> | <email>einarnn@cisco.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Alexander Clemm" initials="A." surname="Clemm"> | ||||
| <author fullname="Alexander Clemm" initials="A" surname="Clemm"> | <organization>Futurewei</organization> | |||
| <organization>Huawei</organization> | <address> | |||
| <address> | <email>ludwig@clemm.org</email> | |||
| <email>ludwig@clemm.org</email> | </address> | |||
| </address> | ||||
| </author> | </author> | |||
| <author fullname="Andy Bierman" initials="A." surname="Bierman"> | ||||
| <author fullname="Andy Bierman" initials="A" | ||||
| surname="Bierman"> | ||||
| <organization>YumaWorks</organization> | <organization>YumaWorks</organization> | |||
| <address> | <address> | |||
| <email>andy@yumaworks.com</email> | <email>andy@yumaworks.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date month="November" year="2019"/> | ||||
| <date day="11" month="June" year="2019"/> | ||||
| <area>Operations & Management</area> | <area>Operations & Management</area> | |||
| <workgroup>NETCONF</workgroup> | <workgroup>NETCONF</workgroup> | |||
| <keyword>Draft</keyword> | <keyword>YANG-Push</keyword> | |||
| <abstract> | <abstract> | |||
| <t>This document provides a RESTCONF binding to the dynamic subscription | <t>This document provides a RESTCONF binding to the dynamic subscription | |||
| capability of both subscribed notifications and YANG-Push.</t> | capability of both subscribed notifications and YANG-Push.</t> | |||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section title="Introduction"> | <section numbered="true" toc="default"> | |||
| <t>Mechanisms to support event subscription and push are defined in <xref | <name>Introduction</name> | |||
| target="I-D.draft-ietf-netconf-subscribed-notifications"/>. Enhancements to <xre | ||||
| f target="I-D.draft-ietf-netconf-subscribed-notifications"/> which enable YANG d | ||||
| atastore subscription and push are defined in <xref target="I-D.ietf-netconf-yan | ||||
| g-push"/>. This document provides a transport specification for dynamic subscrip | ||||
| tions over RESTCONF <xref target="RFC8040"/>. Requirements for these mechanisms | ||||
| are captured in <xref target="RFC7923"/>.</t> | ||||
| <t>The streaming of notifications encapsulating the resulting information | ||||
| push is done via the mechanism described in section 6.3 of <xref target="RFC8040 | ||||
| "/>. </t> | ||||
| <t>Mechanisms to support event subscription and YANG-Push are defined in < | ||||
| xref target="RFC8639" format="default"/>. Enhancements to <xref target="RFC8639" | ||||
| format="default"/> that enable YANG datastore subscription and YANG-Push are de | ||||
| fined in <xref target="RFC8641" format="default"/>. | ||||
| This document provides a transport specification for dynamic subscriptions over | ||||
| RESTCONF <xref target="RFC8040" format="default"/>. Requirements for these mech | ||||
| anisms are captured in <xref target="RFC7923" format="default"/>.</t> | ||||
| <t>The streaming of notifications that encapsulate the resulting informati | ||||
| on push is done via the mechanism described in <xref target="RFC8040" sectionFor | ||||
| mat="of" section="6.3" format="default"/>. </t> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <name>Terminology</name> | ||||
| <t> | ||||
| The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | ||||
| IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | ||||
| NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | ||||
| RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
| "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | ||||
| be interpreted as | ||||
| described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | ||||
| when, and only when, they appear in all capitals, as shown here. | ||||
| </t> | ||||
| <section title="Terminology"> | <t>The following terms use the definitions from <xref target="RFC8639" for | |||
| <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | mat="default"/>: dynamic subscription, event stream, notification message, publi | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | sher, receiver, subscriber, and subscription.</t> | |||
| "OPTIONAL" in this document are to be interpreted as described in BCP | <t>Other terms reused include datastore, which is defined in <xref target= | |||
| 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, the | "RFC8342" format="default"/>, and HTTP/2 stream, which maps to the definition of | |||
| y appear in all | "stream" within <xref target="RFC7540" sectionFormat="comma" section="2" format | |||
| capitals, as shown here.</t> | ="default"/>.</t> | |||
| <t>The following terms use the definitions from <xref target="I-D.draft-ie | ||||
| tf-netconf-subscribed-notifications"/>: dynamic subscription, event stream, noti | ||||
| fication message, publisher, receiver, subscriber, and subscription.</t> | ||||
| <t>Other terms reused include datastore, which is defined in <xref target= | ||||
| "RFC8342"/>, and HTTP2 stream which maps to the definition of "stream" within <x | ||||
| ref target="RFC7540"/>, Section 2.</t> | ||||
| <t>[ note to the RFC Editor - please replace XXXX within this document wit | ||||
| h the number of this document ]</t> | ||||
| </section> | </section> | |||
| <section anchor="dyn-subs" numbered="true" toc="default"> | ||||
| <name>Dynamic Subscriptions</name> | ||||
| <t>This section provides specifics on how to establish and maintain dynami | ||||
| c subscriptions over RESTCONF <xref target="RFC8040" format="default"/>. Subscri | ||||
| bing to event streams is accomplished in this way via RPCs defined within <xref | ||||
| target="RFC8639" sectionFormat="comma" section="2.4" format="default"/>. The RPC | ||||
| s are done via RESTCONF POSTs. YANG datastore subscription is accomplished via a | ||||
| ugmentations to <xref target="RFC8639" format="default"/> as described within <x | ||||
| ref target="RFC8641" sectionFormat="comma" section="4.4" format="default"/>.</t> | ||||
| <section anchor="dyn-subs" title="Dynamic Subscriptions"> | <t>As described in <xref target="RFC8040" sectionFormat="of" | |||
| section="6.3" format="default"/>, a GET needs to be performed on a | ||||
| <t>This section provides specifics on how to establish and maintain dynami | specific URI on the publisher. Subscribers cannot predetermine the URI | |||
| c subscriptions over RESTCONF <xref target="RFC8040"/>. Subscribing to event str | against which a subscription might exist on a publisher, as the URI will | |||
| eams is accomplished in this way via RPCs defined within <xref target="I-D.draft | only exist after the "establish-subscription" RPC has been | |||
| -ietf-netconf-subscribed-notifications"/> Section 2.4. The RPCs are done via RES | accepted. Therefore, the POST for the "establish-subscription" RPC | |||
| TCONF POSTs. YANG datastore subscription is accomplished via augmentations to <x | replaces the GET request for the "location" leaf that is used in <xref | |||
| ref target="I-D.draft-ietf-netconf-subscribed-notifications"/> as described with | target="RFC8040" format="default"/> to obtain the URI. The subscription | |||
| in <xref target="I-D.ietf-netconf-yang-push"/> Section 4.4.</t> | URI will be determined and sent as part of the response to the | |||
| "establish-subscription" RPC, and a subsequent GET to this URI will be | ||||
| <t>As described in <xref target="RFC8040"/> Section 6.3, a GET needs to be | done in order to start the flow of notification messages back to the | |||
| made against a specific URI on the publisher. Subscribers cannot pre-determine | subscriber. As specified in <xref target="RFC8639" sectionFormat="of" | |||
| the URI against which a subscription might exist on a publisher, as the URI will | section="2.4.1" format="default"/>, a subscription does not move to the ac | |||
| only exist after the "establish-subscription" RPC has been accepted. Therefore, | tive state | |||
| the POST for the "establish-subscription" RPC replaces the GET request for the | until the GET is received.</t> | |||
| "location" leaf which is used in <xref target="RFC8040"/> to obtain the URI. The | <section numbered="true" toc="default"> | |||
| subscription URI will be determined and sent as part of the response to the "es | <name>Transport Connectivity</name> | |||
| tablish-subscription" RPC, and a subsequent GET to this URI will be done in orde | <t>For a dynamic subscription, when a RESTCONF session doesn't already e | |||
| r to start the flow of notification messages back to the subscriber. A subscrip | xist, a new RESTCONF session is initiated from the subscriber.</t> | |||
| tion does not move to the active state as per Section 2.4.1. of <xref target="I- | <t>As stated in <xref target="RFC8040" sectionFormat="of" section="2.1" | |||
| D.draft-ietf-netconf-subscribed-notifications"/> until the GET is received. </t> | format="default"/>, a subscriber <bcp14>MUST</bcp14> establish the HTTP session | |||
| over TLS <xref target="RFC8446" format="default"/> in order to secure the conten | ||||
| <section title="Transport Connectivity"> | t in transit.</t> | |||
| <t>For a dynamic subscription, where a RESTCONF session doesn't already | ||||
| exist, a new RESTCONF session is initiated from the subscriber.</t> | ||||
| <t>As stated in Section 2.1 of <xref target="RFC8040"/>, a subscriber MU | ||||
| ST establish the HTTP session over TLS <xref target="RFC8446"/> in order to secu | ||||
| re the content in transit.</t> | ||||
| <t>Without the involvement of additional protocols, HTTP sessions by the | <t>Without the involvement of additional protocols, HTTP sessions by | |||
| mselves do not allow for a quick recognition of when the communication path has | themselves do not support quick recognition of the loss of the | |||
| been lost with the publisher. Where quick recognition of the loss of a publishe | communication path to the publisher. Where quick recognition of the loss of a | |||
| r is required, a subscriber SHOULD use a TLS heartbeat <xref target="RFC6520"/>, | publisher is required, a subscriber <bcp14>SHOULD</bcp14> use a TLS heartbeat < | |||
| just from subscriber to publisher, to track HTTP session continuity.</t> | xref target="RFC6520" format="default"/>, just from subscriber to publisher, to | |||
| <t>Loss of the heartbeat MUST result in any subscription related TCP ses | track HTTP session continuity.</t> | |||
| sions between those endpoints being torn down. A subscriber can then attempt to | ||||
| re-establish the dynamic subscription by using the procedure described in <xref | ||||
| target="SSE"/>.</t> | ||||
| <t>Loss of the heartbeat <bcp14>MUST</bcp14> result in the teardown | ||||
| of any subscription-related TCP sessions between those endpoints. | ||||
| A subscriber can then attempt to re-establish the dynamic subscription by using | ||||
| the procedure described in <xref target="SSE" format="default"/>.</t> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Discovery"> | <name>Discovery</name> | |||
| <t>Subscribers can learn which event streams a RESTCONF server supports | ||||
| <t>Subscribers can learn what event streams a RESTCONF server supports b | by querying the "streams" container of ietf-subscribed-notifications.yang in <xr | |||
| y querying the "streams" container of ietf-subscribed-notification.yang in <xref | ef target="RFC8639" format="default"/>. Support for the "streams" container of i | |||
| target="I-D.draft-ietf-netconf-subscribed-notifications"/>. Support for the "st | etf-restconf-monitoring.yang in <xref target="RFC8040" format="default"/> is not | |||
| reams" container of ietf-restconf-monitoring.yang in <xref target="RFC8040"/> is | required. In the case when the RESTCONF binding specified by this document is u | |||
| not required. In the case when the RESTCONF binding specified by this document | sed to convey the "streams" container from ietf-restconf-monitoring.yang (i.e., | |||
| is used to convey the "streams" container from ietf-restconf-monitoring.yang (i. | that feature is supported), any event streams contained therein are also expecte | |||
| e., that feature is supported), any event streams contained therein are also exp | d to be present in the "streams" container of ietf-restconf-monitoring.yang.</t> | |||
| ected to be present in the "streams" container of ietf-restconf-monitoring.yang. | <t>Subscribers can learn which datastores a RESTCONF server supports by | |||
| </t> | following <xref target="RFC8527" sectionFormat="of" section="2" format="default" | |||
| <t>Subscribers can learn what datastores a RESTCONF server supports by f | />. </t> | |||
| ollowing Section 2 of <xref target="I-D.draft-ietf-netconf-nmda-restconf"/>. </t | ||||
| > | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <name>RESTCONF RPCs and HTTP Status Codes</name> | ||||
| <t>Specific HTTP response codes as defined in <xref target="RFC7231" sec | ||||
| tionFormat="of" section="6" format="default"/> will indicate the result of RESTC | ||||
| ONF RPC requests with the publisher. An HTTP status code of 200 is the proper r | ||||
| esponse to any successful RPC defined within <xref target="RFC8639" format="defa | ||||
| ult"/> or <xref target="RFC8641" format="default"/>.</t> | ||||
| <t>If a publisher fails to serve the RPC request for one of the reasons | ||||
| indicated in <xref target="RFC8639" sectionFormat="of" section="2.4.6" format="d | ||||
| efault"/> or <xref target="RFC8641" sectionFormat="of" section="A" format="defau | ||||
| lt"/>, this will be indicated by an appropriate error code, as shown below, tran | ||||
| sported in the HTTP response.</t> | ||||
| <section title="RESTCONF RPCs and HTTP Status Codes"> | <t>When an HTTP error code is returned, the RPC reply <bcp14>MUST</bcp14 | |||
| > include | ||||
| <t>Specific HTTP responses codes as defined in <xref target="RFC7231"/> | an <rpc-error> element per <xref target="RFC8040" sectionFormat="of" secti | |||
| section 6 will indicate the result of RESTCONF RPC requests with the publisher. | on="7.1" format="default"/> | |||
| An HTTP status code of 200 is the proper response to any successful RPC defined | with the following parameter values: | |||
| within <xref target="I-D.draft-ietf-netconf-subscribed-notifications"/> or <xre | </t> | |||
| f target="I-D.ietf-netconf-yang-push"/>.</t> | <ul spacing="normal"> | |||
| <li>an "error-type" node of "application".</li> | ||||
| <t>If a publisher fails to serve the RPC request for one of the reasons | <li>an "error-tag" node whose value is a string that corresponds | |||
| indicated in <xref target="I-D.draft-ietf-netconf-subscribed-notifications"/> Se | to an identity associated with the error. This "error-tag" will | |||
| ction 2.4.6 or <xref target="I-D.ietf-netconf-yang-push"/> Appendix A, this will | come from one of two places and will correspond to the error | |||
| be indicated by an appropriate error code, as shown below, transported in the H | identities either within | |||
| TTP response.</t> | <xref target="RFC8639" sectionFormat="of" section="2.4.6" format="def | |||
| ault"/> | ||||
| <t>When an HTTP error code is returned, the RPC reply MUST include an "r | for general subscription errors (<xref target="gen-sub-errors" format | |||
| pc-error" element per <xref target="RFC8040"/> Section 7.1 with the following pa | ="default"/>) | |||
| rameter values: | or within <xref target="RFC8641" sectionFormat="of" section="A.1" for | |||
| <list style="symbols"> | mat="default"/> | |||
| <t>an "error-type" node of "application".</t> | for subscription errors specific to YANG datastores (<xref | |||
| <t>an "error-tag" node with the value being a string that corresponds to a | target="datastore-specific-errors" format="default"/>).</li> | |||
| n identity associated with the error. This "error-tag" will come from one of tw | <li>an "error-app-tag" node whose value is a string that corresponds t | |||
| o places. Either it will correspond to the error identities within <xref target | o an | |||
| ="I-D.draft-ietf-netconf-subscribed-notifications"/> section 2.4.6 for general s | identity associated with the error, as defined in | |||
| ubscription errors:</t> | <xref target="RFC8639" sectionFormat="of" section="2.4.6" format="def | |||
| </list></t> | ault"/> | |||
| for general subscriptions or | ||||
| <figure align="left"> | <xref target="RFC8641" sectionFormat="of" section="A.1" format="defau | |||
| <artwork><![CDATA[ | lt"/> | |||
| error identity uses error-tag HTTP Code | for subscription errors specific to YANG datastores. The tag to use d | |||
| ---------------------- -------------- --------- | epends on the RPC for which the | |||
| dscp-unavailable invalid-value 400 | error occurred. Viable errors for different RPCs are found in <xref | |||
| encoding-unsupported invalid-value 400 | target="rpc-errors" format="default"/>.</li> | |||
| filter-unsupported invalid-value 400 | </ul> | |||
| insufficient-resources resource-denied 409 | ||||
| no-such-subscription invalid-value 404 | ||||
| replay-unsupported operation-not-supported 501 | ||||
| ]]></artwork> | ||||
| </figure> | ||||
| <t><list style="none"> | ||||
| <t>Or this "error-tag" will correspond to the error identities within <xr | ||||
| ef target="I-D.ietf-netconf-yang-push"/> Appendix A.1 for subscription errors sp | ||||
| ecific to YANG datastores:</t> | ||||
| </list></t> | ||||
| <figure align="left"> | ||||
| <artwork><![CDATA[ | ||||
| error identity uses error-tag HTTP Code | ||||
| ---------------------- -------------- --------- | ||||
| cant-exclude operation-not-supported 501 | ||||
| datastore-not-subscribable invalid-value 400 | ||||
| no-such-subscription-resync invalid-value 404 | ||||
| on-change-unsupported operation-not-supported 501 | ||||
| on-change-sync-unsupported operation-not-supported 501 | ||||
| period-unsupported invalid-value 400 | ||||
| update-too-big too-big 400 | ||||
| sync-too-big too-big 400 | ||||
| unchanging-selection operation-failed 500 | ||||
| ]]></artwork> | ||||
| </figure> | ||||
| <t><list style="symbols"> | ||||
| <t>an "error-app-tag" node with the value being a string that correspo | ||||
| nds to an identity associated with the error, as defined in <xref target="I-D.dr | ||||
| aft-ietf-netconf-subscribed-notifications"/> section 2.4.6 for general subscript | ||||
| ions, and <xref target="I-D.ietf-netconf-yang-push"/> Appendix A.1, for datastor | ||||
| e subscriptions. The tag to use depends on the RPC for which the error occurred. | ||||
| Viable errors for different RPCs are as follows:</t> | ||||
| </list></t> | ||||
| <figure align="left"> | ||||
| <artwork><![CDATA[ | ||||
| RPC select an identity with a base | ||||
| ---------------------- ------------------------------ | ||||
| establish-subscription establish-subscription-error | ||||
| modify-subscription modify-subscription-error | ||||
| delete-subscription delete-subscription-error | ||||
| kill-subscription delete-subscription-error | ||||
| resync-subscription resync-subscription-error | ||||
| ]]></artwork> | ||||
| </figure> | ||||
| <table anchor="gen-sub-errors"> | ||||
| <name>General Subscription Error Identities and Associated "error-tag" Us | ||||
| e</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Error identity</th> | ||||
| <th>Uses "error-tag"</th> | ||||
| <th>HTTP code</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>dscp-unavailable</td> | ||||
| <td>invalid-value</td> | ||||
| <td>400</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>encoding-unsupported</td> | ||||
| <td>invalid-value</td> | ||||
| <td>400</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>filter-unsupported</td> | ||||
| <td>invalid-value</td> | ||||
| <td>400</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>insufficient-resources</td> | ||||
| <td>resource-denied</td> | ||||
| <td>409</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>no-such-subscription</td> | ||||
| <td>invalid-value</td> | ||||
| <td>404</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>replay-unsupported</td> | ||||
| <td>operation-not-supported</td> | ||||
| <td>501</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <table anchor="datastore-specific-errors"> | ||||
| <name>Datastore-Specific Error Identities and Associated "error-tag" Use< | ||||
| /name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Error identity</th> | ||||
| <th>Uses "error-tag"</th> | ||||
| <th>HTTP code</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>cant-include</td> | ||||
| <td>operation-not-supported</td> | ||||
| <td>501</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>datastore-not-subscribable</td> | ||||
| <td>invalid-value</td> | ||||
| <td>400</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>no-such-subscription-resync</td> | ||||
| <td>invalid-value</td> | ||||
| <td>404</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>on-change-unsupported</td> | ||||
| <td>operation-not-supported</td> | ||||
| <td>501</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>on-change-sync-unsupported</td> | ||||
| <td>operation-not-supported</td> | ||||
| <td>501</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>period-unsupported</td> | ||||
| <td>invalid-value</td> | ||||
| <td>400</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>update-too-big</td> | ||||
| <td>too-big</td> | ||||
| <td>400</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>sync-too-big</td> | ||||
| <td>too-big</td> | ||||
| <td>400</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>unchanging-selection</td> | ||||
| <td>operation-failed</td> | ||||
| <td>500</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <table anchor="rpc-errors"> | ||||
| <name>RPC Errors and Associated Error Identities</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>RPC</th> | ||||
| <th>Select an identity with a base</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>establish-subscription</td> | ||||
| <td>establish-subscription-error</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>modify-subscription</td> | ||||
| <td>modify-subscription-error</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>delete-subscription</td> | ||||
| <td>delete-subscription-error</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>kill-subscription</td> | ||||
| <td>delete-subscription-error</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>resync-subscription</td> | ||||
| <td>resync-subscription-error</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>Each error identity will be inserted as the "error-app-tag" using JSO N encoding following the form <modulename>:<identityname>. An examp le of such a valid encoding would be "ietf-subscribed-notifications:no-such-subs cription".</t> | <t>Each error identity will be inserted as the "error-app-tag" using JSO N encoding following the form <modulename>:<identityname>. An examp le of such a valid encoding would be "ietf-subscribed-notifications:no-such-subs cription".</t> | |||
| <t>In the case of error responses to an "establish-subscription" or | ||||
| "modify-subscription" request, there is the option to include an | ||||
| "error-info" node. This node may contain hints for parameter settings | ||||
| that might lead to successful RPC requests in the future. Tables <xref ta | ||||
| rget="error-info-estab-sub" format="counter"/> and <xref target="error-info-mod- | ||||
| sub" format="counter"/> show the yang-data structures that may be returned.</t> | ||||
| <t>In case of error responses to an "establish-subscription" or "modify- | <table anchor="error-info-estab-sub"> | |||
| subscription" request there is the option of including an "error-info" node. Th | <name>Optional "error-info" Node Hints for an "establish-subscription" Re | |||
| is node may contain hints for parameter settings that might lead to successful R | quest</name> | |||
| PC requests in the future. Following are the yang-data structures which may be | <thead> | |||
| returned:</t> | <tr> | |||
| <th>Target:</th> | ||||
| <figure align="left"> | <th>Return hints in yang-data structure</th> | |||
| <artwork><![CDATA[ | </tr> | |||
| establish-subscription returns hints in yang-data structure | </thead> | |||
| ---------------------- ------------------------------------ | <tbody> | |||
| target: event stream establish-subscription-stream-error-info | <tr> | |||
| target: datastore establish-subscription-datastore-error-info | <td>event stream</td> | |||
| <td>establish-subscription-stream-error-info</td> | ||||
| modify-subscription returns hints in yang-data structure | </tr> | |||
| ---------------------- ------------------------------------ | <tr> | |||
| target: event stream modify-subscription-stream-error-info | <td>datastore</td> | |||
| target: datastore modify-subscription-datastore-error-info | <td>establish-subscription-datastore-error-info</td> | |||
| </tr> | ||||
| The yang-data included within "error-info" SHOULD NOT include the | </tbody> | |||
| </table> | ||||
| <table anchor="error-info-mod-sub"> | ||||
| <name>Optional "error-info" Node Hints for an "modify-subscription" Requ | ||||
| est</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Target:</th> | ||||
| <th>Returns hints in yang-data structure</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>event stream</td> | ||||
| <td>modify-subscription-stream-error-info</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>datastore</td> | ||||
| <td>modify-subscription-datastore-error-info</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>The yang-data included within "error-info" <bcp14>SHOULD NOT</bcp14> in | ||||
| clude the | ||||
| optional leaf "reason", as such a leaf would be redundant | optional leaf "reason", as such a leaf would be redundant | |||
| with information that is already placed within the | with information that is already placed within the | |||
| "error-app-tag". | "error-app-tag". | |||
| </t> | ||||
| In case of an rpc error as a result of a "delete-subscription", a | <t>In case of an <rpc-error> as a result of a "delete-subscription", a | |||
| "kill-subscription", or a "resync-subscription" request, no | "kill-subscription", or a "resync-subscription" request, no | |||
| "error-info" needs to be included, as the "subscription-id" is | "error-info" needs to be included, as the "subscription-id" is | |||
| the only RPC input parameter and no hints regarding this RPC input | the only RPC input parameter, and no hints regarding this RPC input | |||
| parameters need to be provided. | parameters need to be provided. | |||
| ]]></artwork> | </t> | |||
| </figure> | <t>Note that "error-path" <xref target="RFC8040" format="default"/> does | |||
| not need to be included with the <rpc-error> element, as subscription err | ||||
| <t>Note that "error-path" <xref target="RFC8040"/> does not need to be i | ors are generally associated with the choice of RPC input parameters. </t> | |||
| ncluded with the "rpc-error" element, as subscription errors are generally assoc | ||||
| iated with the choice of RPC input parameters. </t> | ||||
| </section> | </section> | |||
| <section anchor="SSE" numbered="true" toc="default"> | ||||
| <section anchor="SSE" title="Call Flow for Server-Sent Events"> | <name>Call Flow for Server-Sent Events</name> | |||
| <t>The call flow for Server-Sent Events (SSE) is defined in <xref target | <t>The call flow for Server-Sent Events (SSE) is defined in <xref | |||
| ="dyn-sse"/>. The logical connections denoted by (a) and (b) can be a TCP conne | target="dyn-sse" format="default"/>. The logical connections denoted | |||
| ction or an HTTP2 stream (if HTTP2 is used, multiple HTTP2 streams can be carrie | by (a) and (b) can be a TCP connection or an HTTP/2 stream (if HTTP/2 | |||
| d in one TCP connection). Requests to <xref target="I-D.draft-ietf-netconf-subsc | is used, multiple HTTP/2 streams can be carried in one TCP | |||
| ribed-notifications"/> or <xref target="I-D.ietf-netconf-yang-push"/> augmented | connection). Requests to RPCs as defined in <xref target="RFC8639" | |||
| RPCs are sent on a connection indicated by (a). A successful "establish-subscri | format="default"/> or <xref target="RFC8641" format="default"/> are | |||
| ption" will result in an RPC response returned with both a subscription identifi | sent on a connection indicated by (a). A successful | |||
| er which uniquely identifies a subscription, as well as a URI which uniquely ide | "establish-subscription" will result in an RPC response returned with | |||
| ntifies the location of subscription on the publisher (b). This URI is defined v | both a subscription identifier that uniquely identifies a | |||
| ia the "uri" leaf the Data Model in <xref target="YANG-module"/>. </t> | subscription, as well as a URI that uniquely identifies the location | |||
| of subscription on the publisher (b). This URI is defined via the | ||||
| <t>An HTTP GET is then sent on a separate logical connection (b) to the | "uri" leaf in the data model in <xref target="YANG-module" | |||
| URI on the publisher. This signals the publisher to initiate the flow of notifi | format="default"/>. </t> | |||
| cation messages which are sent in SSE <xref target="W3C-20150203"/> as a respons | <t>An HTTP GET is then sent on a separate logical connection (b) to the | |||
| e to the GET. There cannot be two or more simultaneous GET requests on a subscri | URI on the publisher. This signals the publisher to initiate the flow of notifi | |||
| ption URI: any GET request received while there is a current GET request on the | cation messages that are sent in SSE <xref target="W3C-20150203" format="default | |||
| same URI MUST be rejected with HTTP error code 409.</t> | "/> as a response to the GET. There cannot be two or more simultaneous GET reque | |||
| sts on a subscription URI: any GET request received while there is a current GET | ||||
| <t>As described in <xref target="RFC8040"/> Section 6.4, RESTCONF server | request on the same URI <bcp14>MUST</bcp14> be rejected with HTTP error code 40 | |||
| s SHOULD NOT send the "event" or "id" fields in the SSE event notifications.</t> | 9.</t> | |||
| <t>As described in <xref target="RFC8040" sectionFormat="of" section="6. | ||||
| <figure title="Dynamic with server-sent events" | 4" format="default"/>, RESTCONF servers <bcp14>SHOULD NOT</bcp14> send the "even | |||
| anchor="dyn-sse" | t" or "id" fields in the SSE event notifications.</t> | |||
| align="center"> | <figure anchor="dyn-sse"> | |||
| <artwork height="29" xml:space="preserve"><![CDATA[ | <name>Dynamic Subscriptions with Server-Sent Events</name> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| +--------------+ +--------------+ | +--------------+ +--------------+ | |||
| | Subscriber | | Publisher | | | Subscriber | | Publisher | | |||
| | | | | | | | | | | |||
| | Logical | | Logical | | | Logical | | Logical | | |||
| | Connection | | Connection | | | Connection | | Connection | | |||
| | (a) (b) | | (a) (b) | | | (a) (b) | | (a) (b) | | |||
| +--------------+ +--------------+ | +--------------+ +--------------+ | |||
| | RESTCONF POST (RPC:establish-subscription) | | | RESTCONF POST (RPC:establish-subscription) | | |||
| |--------------------------------------------->| | |--------------------------------------------->| | |||
| | HTTP 200 OK (ID,URI)| | | HTTP 200 OK (ID,URI)| | |||
| skipping to change at line 258 ¶ | skipping to change at line 388 ¶ | |||
| | | SSE (notif-message)| | | | SSE (notif-message)| | |||
| | |<---------------------------------------------| | | |<---------------------------------------------| | |||
| | RESTCONF POST (RPC:delete-subscription) | | | | RESTCONF POST (RPC:delete-subscription) | | | |||
| |--------------------------------------------->| | | |--------------------------------------------->| | | |||
| | | HTTP 200 OK| | | | | HTTP 200 OK| | | |||
| |<---------------------------------------------| | | |<---------------------------------------------| | | |||
| | | | | | | | | | | |||
| | | | | | | | | | | |||
| (a) (b) (a) (b) ]]></artwork> | (a) (b) (a) (b) ]]></artwork> | |||
| </figure> | </figure> | |||
| <t>Additional requirements for dynamic subscriptions over SSE include:</ t> | <t>Additional requirements for dynamic subscriptions over SSE include:</ t> | |||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>All subscription state notifications from a publisher MUST be retur | ||||
| ned in a separate SSE message used by the subscription to which the state change | ||||
| refers.</t> | ||||
| <t>Subscription RPCs MUST NOT use the connection currently providing n | ||||
| otification messages for that subscription.</t> | ||||
| <t>In addition to an RPC response for a "modify-subscription" RPC trav | ||||
| eling over (a), a "subscription-modified" state change notification MUST be sent | ||||
| within (b). This allows the receiver to know exactly when, within the stream o | ||||
| f events, the new terms of the subscription have been applied to the notificatio | ||||
| n messages. See arrow (c).</t> | ||||
| <t>In addition to any required access permissions (e.g., NACM), RPCs m | ||||
| odify-subscription, resync-subscription and | ||||
| delete-subscription SHOULD only be allowed by the same RESTCONF username <xref t | ||||
| arget="RFC8040"/> which invoked establish-subscription. Such a restriction gener | ||||
| ally serves to preserve users' privacy, but exceptions might be made for adminis | ||||
| trators that may need to modify or delete other users' subscriptions.</t> | ||||
| <t>The kill-subscription RPC can be invoked by any RESTCONF username w | ||||
| ith the required administrative permissions.</t> | ||||
| </list></t> | ||||
| <t>A publisher MUST terminate a subscription in the following cases:</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Receipt of a "delete-subscription" or a "kill-subscription" RPC for | ||||
| that subscription.</t> | ||||
| <t>Loss of TLS heartbeat</t> | ||||
| </list></t> | ||||
| <t>A publisher MAY terminate a subscription at any time as stated in <xr | ||||
| ef target="I-D.draft-ietf-netconf-subscribed-notifications"/> Section 1.3 </t> | ||||
| </section> | ||||
| </section> | ||||
| <section title="QoS Treatment"> | ||||
| <t>Qos treatment for event streams is described in <xref target="I-D.draft | ||||
| -ietf-netconf-subscribed-notifications"/> Section 2.3. In addition, if HTTP2 is | ||||
| used, the publisher MUST:</t> | ||||
| <t><list style="symbols"> | <li> | |||
| <t>take the "weighting" leaf node in <xref target="I-D.draft-ietf-netcon | A publisher <bcp14>MUST</bcp14> return all subscription state notifications | |||
| f-subscribed-notifications"/>, and copy it into the HTTP2 stream weight, <xref t | in a separate SSE message used by the subscription to | |||
| arget="RFC7540"/> section 5.3, and </t> | which the state change refers. | |||
| </li> | ||||
| <t>take any existing subscription "dependency", as specified by the "dep | <li>Subscription RPCs <bcp14>MUST NOT</bcp14> use the connection curre | |||
| endency" leaf node in <xref target="I-D.draft-ietf-netconf-subscribed-notificati | ntly providing notification messages for that subscription.</li> | |||
| ons"/>, and use the HTTP2 stream for the parent subscription as the HTTP2 strea | <li>In addition to an RPC response for a "modify-subscription" RPC tra | |||
| m dependency, <xref target="RFC7540"/> section 5.3.1, of the dependent subscript | veling over (a), a "subscription-modified" state change notification <bcp14>MUST | |||
| ion.</t> | </bcp14> be sent within (b). This allows the receiver to know exactly when, wit | |||
| <t>set the exclusive flag, <xref target="RFC7540"/> section 5.3.1, to 0. | hin the stream of events, the new terms of the subscription have been applied to | |||
| </t> | the notification messages. See arrow (c).</li> | |||
| </list></t> | <li>In addition to any required access permissions (e.g., Network Conf | |||
| <t>For dynamic subscriptions with the same DSCP value to a specific publis | iguration Access Control Model (NACM)), the RPCs "modify-subscription", "resync- | |||
| her, it is recommended that the subscriber sends all URI GET requests on a commo | subscription", and | |||
| n HTTP2 session (if HTTP2 is used). Conversely, a subscriber can not use a commo | "delete-subscription" <bcp14>SHOULD</bcp14> only be allowed by the same RESTCONF | |||
| n HTTP2 session for subscriptions with different DSCP values.</t> | username <xref target="RFC8040" format="default"/> that invoked "establish-subs | |||
| cription". Such a restriction generally serves to preserve users' privacy, but e | ||||
| xceptions might be made for administrators that may need to modify or delete oth | ||||
| er users' subscriptions.</li> | ||||
| <li>The "kill-subscription" RPC can be invoked by any RESTCONF usernam | ||||
| e with the required administrative permissions.</li> | ||||
| </ul> | ||||
| <t>A publisher <bcp14>MUST</bcp14> terminate a subscription in the follo | ||||
| wing cases:</t> | ||||
| <ul spacing="normal"> | ||||
| <li>Receipt of a "delete-subscription" or a "kill-subscription" RPC fo | ||||
| r that subscription</li> | ||||
| <li>Loss of TLS heartbeat</li> | ||||
| </ul> | ||||
| <t>A publisher <bcp14>MAY</bcp14> terminate a subscription at any time a | ||||
| s stated in <xref target="RFC8639" sectionFormat="of" section="1.3" format="defa | ||||
| ult"/>.</t> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Notification Messages"> | <name>QoS Treatment</name> | |||
| <t>Notification messages transported over RESTCONF will be encoded accordi | <t>Qos treatment for event streams is described in <xref target="RFC8639" | |||
| ng to <xref target="RFC8040"/>, section 6.4.</t> | sectionFormat="of" section="2.3" format="default"/>. In addition, if HTTP/2 is u | |||
| sed, the publisher <bcp14>MUST</bcp14>:</t> | ||||
| <ul spacing="normal"> | ||||
| <li>Take the "weighting" leaf node in <xref target="RFC8639" | ||||
| format="default"/> and copy it into the HTTP/2 stream weight, <xref targe | ||||
| t="RFC7540" sectionFormat="of" section="5.3" format="default"/>, and </li> | ||||
| <li>Take any existing subscription "dependency", as specified by the | ||||
| "dependency" leaf node in <xref target="RFC8639" format="default"/>, | ||||
| and use the HTTP/2 stream for the parent subscription as the HTTP/2 | ||||
| stream dependency (as described in <xref target="RFC7540" sectionFormat=" | ||||
| of" | ||||
| section="5.3.1" format="default"/>) of the dependent | ||||
| subscription.</li> | ||||
| <li>Set the exclusive flag (<xref target="RFC7540" sectionFormat="of" se | ||||
| ction="5.3.1" format="default"/>) to 0.</li> | ||||
| </ul> | ||||
| <t>For dynamic subscriptions with the same Differentiated Services Code Po | ||||
| int (DSCP) value to a specific publisher, it is recommended that the subscriber | ||||
| sends all URI GET requests on a common HTTP/2 session (if HTTP/2 is used). Conve | ||||
| rsely, a subscriber cannot use a common HTTP/2 session for subscriptions with di | ||||
| fferent DSCP values.</t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Notification Messages</name> | ||||
| <t>Notification messages transported over RESTCONF will be encoded accordi | ||||
| ng to <xref target="RFC8040" sectionFormat="comma" section="6.4" format="default | ||||
| "/>.</t> | ||||
| </section> | </section> | |||
| <section anchor="YANG-tree" numbered="true" toc="default"> | ||||
| <name>YANG Tree</name> | ||||
| <section title="YANG Tree" anchor="YANG-tree" > | <t> The YANG module defined in <xref target="YANG-module" | |||
| format="default"/> has one leaf that augments three nodes of <xref target= | ||||
| "RFC8639" format="default"/>.</t> | ||||
| <t> The YANG model defined in <xref target="YANG-module"/> has one leaf au | <sourcecode name="" type="yangtree"><![CDATA[ | |||
| gmented into three places of <xref target="I-D.draft-ietf-netconf-subscribed-not | ||||
| ifications"/>.</t> | ||||
| <figure> | ||||
| <artwork><![CDATA[ | ||||
| module: ietf-restconf-subscribed-notifications | module: ietf-restconf-subscribed-notifications | |||
| augment /sn:establish-subscription/sn:output: | augment /sn:establish-subscription/sn:output: | |||
| +--ro uri? inet:uri | +--ro uri? inet:uri | |||
| augment /sn:subscriptions/sn:subscription: | augment /sn:subscriptions/sn:subscription: | |||
| +--ro uri? inet:uri | +--ro uri? inet:uri | |||
| augment /sn:subscription-modified: | augment /sn:subscription-modified: | |||
| +--ro uri? inet:uri | +--ro uri? inet:uri ]]></sourcecode> | |||
| ]]></artwork> | ||||
| </figure> | ||||
| </section> | </section> | |||
| <section anchor="YANG-module" numbered="true" toc="default"> | ||||
| <name>YANG Module</name> | ||||
| <t>This module references <xref target="RFC8639" format="default"/>.</t> | ||||
| <section title="YANG module" anchor="YANG-module" > | <sourcecode name="ietf-restconf-subscribed-notifications@2019-10-15.yang" | |||
| type="yang" markers="true"><![CDATA[ | ||||
| <t>This module references <xref target="I-D.draft-ietf-netconf-subscribed- | ||||
| notifications"/>.</t> | ||||
| <figure> | ||||
| <artwork name="ietf-restconf-subscribed-notifications@2019-01-11.yang"> | ||||
| <![CDATA[ | ||||
| <CODE BEGINS> file | ||||
| "ietf-restconf-subscribed-notifications@2019-01-11.yang" | ||||
| module ietf-restconf-subscribed-notifications { | module ietf-restconf-subscribed-notifications { | |||
| yang-version 1.1; | yang-version 1.1; | |||
| namespace | namespace "urn:ietf:params:xml:ns:yang:" | |||
| "urn:ietf:params:xml:ns:yang:" + | + "ietf-restconf-subscribed-notifications"; | |||
| "ietf-restconf-subscribed-notifications"; | ||||
| prefix rsn; | prefix rsn; | |||
| import ietf-subscribed-notifications { | import ietf-subscribed-notifications { | |||
| prefix sn; | prefix sn; | |||
| } | } | |||
| import ietf-inet-types { | import ietf-inet-types { | |||
| prefix inet; | prefix inet; | |||
| } | } | |||
| organization "IETF NETCONF (Network Configuration) Working Group"; | organization | |||
| "IETF NETCONF (Network Configuration) Working Group"; | ||||
| contact | contact | |||
| "WG Web: <http:/tools.ietf.org/wg/netconf/> | "WG Web: <https://datatracker.ietf.org/wg/netconf/> | |||
| WG List: <mailto:netconf@ietf.org> | WG List: <mailto:netconf@ietf.org> | |||
| Editor: Eric Voit | Editor: Eric Voit | |||
| <mailto:evoit@cisco.com> | <mailto:evoit@cisco.com> | |||
| Editor: Alexander Clemm | Editor: Alexander Clemm | |||
| <mailto:ludwig@clemm.org> | <mailto:ludwig@clemm.org> | |||
| Editor: Reshad Rahman | Editor: Reshad Rahman | |||
| <mailto:rrahman@cisco.com>"; | <mailto:rrahman@cisco.com>"; | |||
| skipping to change at line 347 ¶ | skipping to change at line 478 ¶ | |||
| WG List: <mailto:netconf@ietf.org> | WG List: <mailto:netconf@ietf.org> | |||
| Editor: Eric Voit | Editor: Eric Voit | |||
| <mailto:evoit@cisco.com> | <mailto:evoit@cisco.com> | |||
| Editor: Alexander Clemm | Editor: Alexander Clemm | |||
| <mailto:ludwig@clemm.org> | <mailto:ludwig@clemm.org> | |||
| Editor: Reshad Rahman | Editor: Reshad Rahman | |||
| <mailto:rrahman@cisco.com>"; | <mailto:rrahman@cisco.com>"; | |||
| description | description | |||
| "Defines RESTCONF as a supported transport for subscribed | "Defines RESTCONF as a supported transport for subscribed | |||
| event notifications. | event notifications. | |||
| Copyright (c) 2019 IETF Trust and the persons identified as authors | Copyright (c) 2019 IETF Trust and the persons identified | |||
| of the code. All rights reserved. | as authors of the code. All rights reserved. | |||
| Redistribution and use in source and binary forms, with or without | Redistribution and use in source and binary forms, with or | |||
| modification, is permitted pursuant to, and subject to the license | without modification, is permitted pursuant to, and subject to | |||
| terms contained in, the Simplified BSD License set forth in Section | the license terms contained in, the Simplified BSD License set | |||
| 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents | forth in Section 4.c of the IETF Trust's Legal Provisions | |||
| Relating to IETF Documents | ||||
| (https://trustee.ietf.org/license-info). | (https://trustee.ietf.org/license-info). | |||
| This version of this YANG module is part of RFC XXXX; see the RFC | This version of this YANG module is part of RFC 8650; see the | |||
| itself for full legal notices."; | RFC itself for full legal notices."; | |||
| revision 2019-01-11 { | revision 2019-10-15 { | |||
| description | description | |||
| "Initial version"; | "Initial version"; | |||
| reference | reference | |||
| "RFC XXXX: RESTCONF Transport for Event Notifications"; | "RFC 8650: Dynamic Subscription to YANG Events and Datastores | |||
| over RESTCONF"; | ||||
| } | } | |||
| grouping uri { | grouping uri { | |||
| description | description | |||
| "Provides a reusable description of a URI."; | "Provides a reusable description of a URI."; | |||
| leaf uri { | leaf uri { | |||
| type inet:uri; | type inet:uri; | |||
| config false; | config false; | |||
| description | description | |||
| "Location of a subscription specific URI on the publisher."; | "Location of a subscription-specific URI on the publisher."; | |||
| } | } | |||
| } | } | |||
| augment "/sn:establish-subscription/sn:output" { | augment "/sn:establish-subscription/sn:output" { | |||
| description | description | |||
| "This augmentation allows RESTCONF specific parameters for a | "This augmentation allows RESTCONF-specific parameters for a | |||
| response to a publisher's subscription request."; | response to a publisher's subscription request."; | |||
| uses uri; | uses uri; | |||
| } | } | |||
| augment "/sn:subscriptions/sn:subscription" { | augment "/sn:subscriptions/sn:subscription" { | |||
| description | description | |||
| "This augmentation allows RESTCONF specific parameters to be | "This augmentation allows RESTCONF-specific parameters to be | |||
| exposed for a subscription."; | exposed for a subscription."; | |||
| uses uri; | uses uri; | |||
| } | } | |||
| augment "/sn:subscription-modified" { | augment "/sn:subscription-modified" { | |||
| description | description | |||
| "This augmentation allows RESTCONF specific parameters to be | "This augmentation allows RESTCONF-specific parameters to be | |||
| included as part of the notification that a subscription has been | included as part of the notification that a subscription has | |||
| modified."; | been modified."; | |||
| uses uri; | uses uri; | |||
| } | } | |||
| } | } | |||
| <CODE ENDS> | ]]></sourcecode> | |||
| ]]></artwork> | ||||
| </figure> | ||||
| </section> | </section> | |||
| <section title="IANA Considerations"> | <section numbered="true" toc="default"> | |||
| <t> | <name>IANA Considerations</name> | |||
| This document registers the following namespace URI in the "IETF XML Regis | ||||
| try" <xref target="RFC3688"/>: | ||||
| </t> | ||||
| <t> | <t> | |||
| URI: | This document registers the following namespace URI in the "ns" | |||
| urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications | subregistry of the "IETF XML Registry" <xref target="RFC3688" format="defa | |||
| <vspace/> | ult"/>: | |||
| Registrant Contact: The IESG. | ||||
| <vspace/> | ||||
| XML: N/A; the requested URI is an XML namespace. | ||||
| </t> | </t> | |||
| <dl> | ||||
| <dt>URI:</dt> | ||||
| <dd>urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications</ | ||||
| dd> | ||||
| <dt>Registrant Contact:</dt> | ||||
| <dd>The IESG.</dd> | ||||
| <dt>XML:</dt> | ||||
| <dd>N/A; the requested URI is an XML namespace.</dd> | ||||
| </dl> | ||||
| <t> | <t> | |||
| This document registers the following YANG module in the "YANG Module Name | This document registers the following YANG module in the "YANG Module | |||
| s" registry <xref target="RFC6020"/>: | Names" registry <xref target="RFC6020" format="default"/>: | |||
| </t> | </t> | |||
| <t> | <dl> | |||
| Name: ietf-restconf-subscribed-notifications | <dt>Name:</dt> | |||
| <vspace/> | <dd>ietf-restconf-subscribed-notifications</dd> | |||
| Namespace: | <dt>Namespace:</dt> | |||
| urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications | <dd>urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications</ | |||
| <vspace/> | dd> | |||
| Prefix: rsn | <dt>Prefix:</dt> | |||
| <vspace/> | <dd>rsn</dd> | |||
| Reference: RFC XXXX: RESTCONF Transport for Event Notifications | <dt>Reference:</dt> | |||
| </t> | <dd>RFC 8650</dd> | |||
| </dl> | ||||
| </section> | </section> | |||
| <section anchor="security" numbered="true" toc="default"> | ||||
| <section anchor="security" title="Security Considerations"> | <name>Security Considerations</name> | |||
| <t>The YANG module specified in this document defines a schema for data th | ||||
| <t>The YANG module specified in this document defines a schema for data th | at is designed to be accessed via network management transports such as NETCONF | |||
| at is designed to be accessed via network management transports such as NETCONF | <xref target="RFC6241" format="default"/> or RESTCONF <xref target="RFC8040" for | |||
| <xref target="RFC6241"/> or RESTCONF <xref target="RFC8040"/>. The lowest NETCO | mat="default"/>. The lowest NETCONF layer is the secure transport layer, and th | |||
| NF layer is the secure transport layer, and the mandatory-to-implement secure tr | e mandatory-to-implement secure transport is Secure Shell (SSH) <xref target="RF | |||
| ansport is Secure Shell (SSH) <xref target="RFC6242"/>. The lowest RESTCONF lay | C6242" format="default"/>. The lowest RESTCONF layer is HTTPS, and the mandator | |||
| er is HTTPS, and the mandatory-to-implement secure transport is TLS <xref target | y-to-implement secure transport is TLS <xref target="RFC8446" format="default"/> | |||
| ="RFC8446"/>.</t> | .</t> | |||
| <t>The Network Configuration Access Control Model (NACM) <xref target="RFC | ||||
| <t>The one new data node introduced in this YANG module may be considered | 8341" format="default"/> | |||
| sensitive or vulnerable in some network environments. It is thus important to c | provides the means to restrict access for particular NETCONF or | |||
| ontrol read access (e.g., via get, get-config, or notification) to this data nod | RESTCONF users to a preconfigured subset of all available NETCONF | |||
| es. These are the subtrees and data nodes and their sensitivity/vulnerability:< | or RESTCONF protocol operations and content.</t> | |||
| /t> | <t>The one new data node introduced in this YANG module may be considered | |||
| sensitive or vulnerable in some network environments. It is thus important to c | ||||
| ontrol read access (e.g., via get, get-config, or notification) to this data nod | ||||
| e. These are the subtrees and data nodes and their sensitivity/vulnerability:</ | ||||
| t> | ||||
| <t>Container: "/subscriptions"</t> | <t>Container: "/subscriptions"</t> | |||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>"uri": leaf will show where subscribed resources might be located on | <li>"uri": leaf will show where subscribed resources might be located on | |||
| a publisher. Access control must be set so that only someone with proper access | a publisher. Access control must be set so that only someone with proper acces | |||
| permissions, i.e., the same RESTCONF <xref target="RFC8040"/> user credentials | s permissions, i.e., the same RESTCONF <xref target="RFC8040" format="default"/> | |||
| which invoked the corresponding "establish-subscription", has the ability to acc | user credentials that invoked the corresponding "establish-subscription", has t | |||
| ess this resource.</t> | he ability to access this resource.</li> | |||
| </list></t> | </ul> | |||
| <t>The subscription URI is implementation specific and is encrypted via th | <t>The subscription URI is implementation specific and is encrypted via th | |||
| e use of TLS. Therefore, even if an attacker succeeds in guessing the subscripti | e use of TLS. Therefore, even if an attacker succeeds in guessing the subscripti | |||
| on URI, a RESTCONF username <xref target="RFC8040"/> with the required administr | on URI, a RESTCONF username <xref target="RFC8040" format="default"/> with the r | |||
| ative permissions must be used to be able to access or modify that subscription. | equired administrative permissions must be used to be able to access or modify t | |||
| It is recommended that the subscription URI values not be easily predictable.</ | hat subscription. It is recommended that the subscription URI values not be easi | |||
| t> | ly predictable.</t> | |||
| <t>The access permission considerations for the RPCs modify-subscription, | <t>The access permission considerations for the RPCs "modify-subscription" | |||
| resync-subscription, delete-subscription and kill-subscription are described in | , "resync-subscription", "delete-subscription", and "kill-subscription" are desc | |||
| <xref target="SSE"/>.</t> | ribed in <xref target="SSE" format="default"/>.</t> | |||
| <t>If a buggy or compromised RESTCONF subscriber sends a number of "establ ish-subscription" requests, then these subscriptions accumulate and may | <t>If a buggy or compromised RESTCONF subscriber sends a number of "establ ish-subscription" requests, then these subscriptions accumulate and may | |||
| use up system resources. In such a situation, the publisher MAY also suspen d or terminate a subset of the active | use up system resources. In such a situation, the publisher <bcp14>MAY</bcp 14> also suspend or terminate a subset of the active | |||
| subscriptions from that RESTCONF subscriber in order to reclaim resources an d preserve normal operation for the other subscriptions. | subscriptions from that RESTCONF subscriber in order to reclaim resources an d preserve normal operation for the other subscriptions. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Acknowledgments"> | ||||
| <t>We wish to acknowledge the helpful contributions, comments, and suggest | ||||
| ions that were received from: Ambika Prasad Tripathy, Alberto Gonzalez Prieto, S | ||||
| usan Hares, Tim Jenkins, Balazs Lengyel, Kent Watsen, Michael Scharf, Guangying | ||||
| Zheng, Martin Bjorklund, Qin Wu and Robert Wilton.</t> | ||||
| </section> | ||||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <references title="Normative References"> | <references> | |||
| <?rfc include="reference.RFC.2119"?> | <name>References</name> | |||
| <?rfc include="reference.RFC.3688"?> | <references> | |||
| <?rfc include="reference.RFC.6020"?> | <name>Normative References</name> | |||
| <?rfc include="reference.RFC.6241"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.6242"?> | ence.RFC.2119.xml"/> | |||
| <?rfc include="reference.RFC.6520"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.7540"?> | ence.RFC.3688.xml"/> | |||
| <?rfc include="reference.RFC.8040"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.8174"?> | ence.RFC.6020.xml"/> | |||
| <?rfc include="reference.RFC.8342"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.8446"?> | ence.RFC.6241.xml"/> | |||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| <reference anchor="I-D.draft-ietf-netconf-subscribed-notifications"> | ence.RFC.6242.xml"/> | |||
| <front> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <title>Custom Subscription to Event Streams</title> | ence.RFC.6520.xml"/> | |||
| <author fullname="Eric Voit" initials="E" surname="Voit"> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <organization/> | ence.RFC.7540.xml"/> | |||
| </author> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <author fullname="Alexander Clemm" initials="A" surname="Clemm"> | ence.RFC.8040.xml"/> | |||
| <organization/> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| </author> | ence.RFC.8174.xml"/> | |||
| <author fullname="Alberto Gonzalez Prieto" initials="A" | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| surname="Gonzalez Prieto"> | ence.RFC.8341.xml"/> | |||
| <organization/> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| </author> | ence.RFC.8342.xml"/> | |||
| <author fullname="Ambika Prasad Tripathy" initials="A" | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| surname="Tripathy"> | ence.RFC.8446.xml"/> | |||
| <organization/> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| </author> | ence.RFC.8639.xml"/> | |||
| <author fullname="Einar Nilsen-Nygaard" initials="E" | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| surname="Nilsen-Nygaard"> | ence.RFC.8641.xml"/> | |||
| <organization/> | <reference anchor="W3C-20150203" target="https://www.w3.org/TR/2015/REC-eve | |||
| </author> | ntsource-20150203/"> | |||
| <date month="January" year="2019"/> | <front> | |||
| </front> | <title>Server-Sent Events</title> | |||
| <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-subscribed-n | <author fullname="I Hickson" initials="I" surname="Hickson"> | |||
| otifications-21"/> | <organization/> | |||
| <format target="https://datatracker.ietf.org/doc/draft-ietf-netconf-subs | </author> | |||
| cribed-notifications/" | <date day="03" month="February" year="2015"/> | |||
| type="TXT"/> | </front> | |||
| </reference> | <seriesInfo name="W3C" value="Recommendation"/> | |||
| <annotation>Latest version available at <<eref target="https://www.w3.org/TR/ | ||||
| <reference anchor="I-D.ietf-netconf-yang-push" | eventsource/" />>.</annotation> | |||
| target="https://datatracker.ietf.org/doc/draft-ietf-netconf-yan | </reference> | |||
| g-push/"> | </references> | |||
| <front> | <references> | |||
| <title>Subscribing to YANG datastore push updates</title> | <name>Informative References</name> | |||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| <author fullname="Alexander Clemm" initials="A" surname="Clemm"> | ence.RFC.7231.xml"/> | |||
| <organization>Huawei</organization> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| </author> | ence.RFC.7923.xml"/> | |||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| <author fullname="Eric Voit" initials="E" surname="Voit"> | ence.RFC.7951.xml"/> | |||
| <organization>Cisco</organization> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| </author> | ence.RFC.8347.xml"/> | |||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| <author fullname="Alberto Gonzalez Prieto" initials="A" | ence.RFC.8527.xml"/> | |||
| surname="Gonzalez Prieto"> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <organization>VMWare</organization> | ence.RFC.8640.xml"/> | |||
| </author> | <reference anchor="XPATH" target="http://www.w3.org/TR/1999/REC-xpath-19 | |||
| 991116"> | ||||
| <author fullname="Ambika Prasad Tripathy" initials="A" | <front> | |||
| surname="Prasad Tripathy"> | <title>XML Path Language (XPath) Version 1.0</title> | |||
| <organization>Cisco</organization> | <author fullname="J Clark" initials="J" surname="Clark"/> | |||
| </author> | <author fullname="S DeRose" initials="S" surname="DeRose"/> | |||
| <date day="16" month="November" year="1999"/> | ||||
| <author fullname="Einar Nilsen-Nygaard" initials="E" | </front> | |||
| surname="Nilsen-Nygaard"> | <seriesInfo name="W3C" value="Recommendation"/> | |||
| <organization>Cisco</organization> | <annotation>Latest version available at <<eref target="https://www.w3.org/TR/ | |||
| </author> | xpath/" />>.</annotation> | |||
| </reference> | ||||
| <author fullname="Andy Bierman" initials="A" | </references> | |||
| surname="Bierman"> | ||||
| <organization>YumaWorks</organization> | ||||
| </author> | ||||
| <author fullname="B Lengyel" initials="B" | ||||
| surname="Lengyel"> | ||||
| <organization>Ericsson</organization> | ||||
| </author> | ||||
| <date day="22" month="October" year="2018"/> | ||||
| </front> | ||||
| <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-yang-push-20 | ||||
| "/> | ||||
| <format target="https://datatracker.ietf.org/doc/draft-ietf-netconf-yang | ||||
| -push/" | ||||
| type="TXT"/> | ||||
| </reference> | ||||
| <reference anchor="W3C-20150203" | ||||
| target="https://www.w3.org/TR/2015/REC-eventsource-20150203/"> | ||||
| <front> | ||||
| <title>Server-Sent Events, World Wide Web Consortium CR | ||||
| CR-eventsource-20121211</title> | ||||
| <author fullname="I Hickson"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date month="February" year="2015"/> | ||||
| </front> | ||||
| </reference> | ||||
| </references> | ||||
| <references title="Informative References"> | ||||
| <?rfc include="reference.RFC.7231"?> | ||||
| <?rfc include="reference.RFC.7923"?> | ||||
| <?rfc include="reference.RFC.7951"?> | ||||
| <?rfc include="reference.RFC.8347"?> | ||||
| <reference anchor="I-D.draft-ietf-netconf-nmda-restconf" | ||||
| target="https://datatracker.ietf.org/doc/draft-ietf-netconf-nmd | ||||
| a-restconf/"> | ||||
| <front> | ||||
| <title>RESTCONF Extensions to Support the Network Management Datastore | ||||
| Architecture</title> | ||||
| <author fullname="Martin Bjorklund" initials="M" surname="Bjorklund">< | ||||
| /author> | ||||
| <author fullname="Juergen Schoenwaelder" initials="J" surname="Schoenw | ||||
| aelder"></author> | ||||
| <author fullname="Phil Shafer" initials="P" surname="Shafer"></author> | ||||
| <author fullname="Kent Watsen" initials="K" surname="Watsen"></author> | ||||
| <author fullname="Rob Wilton" initials="R" surname="Wilton"></author> | ||||
| <date month="April" year="2018"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="I-D.draft-ietf-netconf-netconf-event-notifications" | ||||
| target="https://datatracker.ietf.org/doc/draft-ietf-netconf-net | ||||
| conf-event-notifications/"> | ||||
| <front> | ||||
| <title>NETCONF support for event notifications</title> | ||||
| <author fullname="A Clemm" initials="Alexander" surname="Clemm"></auth | ||||
| or> | ||||
| <author fullname="E Voit" initials="Eric" surname="Voit"></author> | ||||
| <author fullname="A Gonzalez Prieto" initials="Alberto" surname="Gonza | ||||
| lez Prieto"></author> | ||||
| <author fullname="Einar Nilsen-Nygaard" initials="E" surname="Nilsen-N | ||||
| ygaard"></author> | ||||
| <author fullname="Ambika Prasad Tripathy" initials="A" surname="Tripat | ||||
| hy"></author> | ||||
| <date month="May" year="2018"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="XPATH" | ||||
| target="http://www.w3.org/TR/1999/REC-xpath-19991116"> | ||||
| <front> | ||||
| <title>XML Path Language (XPath) Version 1.0</title> | ||||
| <author fullname="J Clark" initials="J" surname="Clark"></author> | ||||
| <author fullname="S DeRose" initials="S" surname="DeRose"></author> | ||||
| <date month="November" year="1999"/> | ||||
| </front> | ||||
| </reference> | ||||
| </references> | </references> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Examples"> | <name>Examples</name> | |||
| <t>This section is non-normative. To allow easy comparison, this section | ||||
| <t>This section is non-normative. To allow easy comparison, this section | mirrors the functional examples shown with NETCONF over XML within <xref target= | |||
| mirrors the functional examples shown with NETCONF over XML within <xref target= | "RFC8640" format="default"/>. In addition, HTTP/2 vs HTTP/1.1 headers are not s | |||
| "I-D.draft-ietf-netconf-netconf-event-notifications"/>. In addition, HTTP2 vs H | hown as the contents of the JSON encoded objects are identical within.</t> | |||
| TTP1.1 headers are not shown as the contents of the JSON encoded objects are ide | <t>The subscription URI values used in the examples in this section are pu | |||
| ntical within.</t> | rely illustrative, and are not indicative of the expected usage that is describe | |||
| <t>The subscription URI values used in the examples in this section are pu | d in <xref target="security" format="default"/>.</t> | |||
| rely illustrative, and are not indicative of the expected usage which is describ | <t>The DSCP values are only for example purposes and are all indicated in | |||
| ed in <xref target="security"/>.</t> | decimal since the encoding is JSON <xref target="RFC7951" format="default"/>.</t | |||
| <t>The DSCP values are only for example purposes and are all indicated in | > | |||
| decimal since the encoding is JSON <xref target="RFC7951"/>.</t> | <section numbered="true" toc="default"> | |||
| <section title="Dynamic Subscriptions"> | <name>Dynamic Subscriptions</name> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Establishing Dynamic Subscriptions"> | <name>Establishing Dynamic Subscriptions</name> | |||
| <t>The following figure shows two successful | ||||
| <t>The following figure shows two successful "establish-subscription" | "establish-subscription" RPC requests as per <xref target="RFC8639" | |||
| RPC requests as per <xref target="I-D.draft-ietf-netconf-subscribed-notification | format="default"/>. The first request is given a subscription | |||
| s"/>. The first request is given a subscription identifier of 22, the second, a | identifier of 22, and the second, an identifier of 23.</t> | |||
| n identifier of 23.</t> | <figure anchor="mess-flow-establishment"> | |||
| <name>Multiple Subscriptions over RESTCONF/HTTP</name> | ||||
| <figure anchor = "mess-flow-establishment" | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| title="Multiple subscriptions over RESTCONF/HTTP"> | ||||
| <artwork><![CDATA[ | ||||
| +------------+ +-----------+ | +------------+ +-----------+ | |||
| | Subscriber | | Publisher | | | Subscriber | | Publisher | | |||
| +------------+ +-----------+ | +------------+ +-----------+ | |||
| | | | | | | |||
| |establish-subscription | | |establish-subscription | | |||
| |------------------------------>| (a) | |------------------------------>| (a) | |||
| | HTTP 200 OK, id#22, URI#1 | | | HTTP 200 OK, id#22, URI#1 | | |||
| |<------------------------------| (b) | |<------------------------------| (b) | |||
| |GET (URI#1) | | |GET (URI#1) | | |||
| |------------------------------>| (c) | |------------------------------>| (c) | |||
| skipping to change at line 650 ¶ | skipping to change at line 683 ¶ | |||
| | HTTP 200 OK, id#23, URI#2| | | HTTP 200 OK, id#23, URI#2| | |||
| |<------------------------------| | |<------------------------------| | |||
| |GET (URI#2) | | |GET (URI#2) | | |||
| |------------------------------>| | |------------------------------>| | |||
| | | | | | | |||
| | | | | | | |||
| | notif-mesg (id#22)| | | notif-mesg (id#22)| | |||
| |<------------------------------| | |<------------------------------| | |||
| | HTTP 200 OK,notif-mesg (id#23)| | | HTTP 200 OK,notif-mesg (id#23)| | |||
| |<------------------------------| | |<------------------------------| | |||
| | | | | | ]]></artwork> | |||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| <t>To provide examples of the information being transported, example m | ||||
| <t>To provide examples of the information being transported, example m | essages for interactions in <xref target="mess-flow-establishment" format="defa | |||
| essages for interactions in <xref target="mess-flow-establishment"/> are detail | ult"/> are detailed below:</t> | |||
| ed below:</t> | <figure anchor="establish-subs"> | |||
| <name>"establish-subscription" Request (a)</name> | ||||
| <figure align="center" anchor="establish-subs" title="establish-subscr | <artwork name="ex-establish-subscription.json" type="" | |||
| iption request (a)"> | align="left" alt=""><![CDATA[ | |||
| <artwork name="ex-establish-subscription.json"><![CDATA[ | ||||
| POST /restconf/operations | POST /restconf/operations | |||
| /ietf-subscribed-notifications:establish-subscription | /ietf-subscribed-notifications:establish-subscription | |||
| { | { | |||
| "ietf-subscribed-notifications:input": { | "ietf-subscribed-notifications:input": { | |||
| "stream-xpath-filter": "/example-module:foo/", | "stream-xpath-filter": "/example-module:foo/", | |||
| "stream": "NETCONF", | "stream": "NETCONF", | |||
| "dscp": 10 | "dscp": 10 | |||
| } | } | |||
| } | } ]]></artwork> | |||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| <t>As the publisher was able to fully satisfy the request, the publish | ||||
| <t>As publisher was able to fully satisfy the request, the publisher s | er sends the subscription identifier of the accepted subscription and the URI:</ | |||
| ends the subscription identifier of the accepted subscription, and the URI:</t> | t> | |||
| <figure anchor="positive-establish-subs"> | ||||
| <figure align="center" anchor="positive-establish-subs" title="establi | <name>"establish-subscription" Success (b)</name> | |||
| sh-subscription success (b)"> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| HTTP status code - 200 | HTTP status code - 200 | |||
| { | { | |||
| "id": 22, | "id": 22, | |||
| "uri": "https://example.com/restconf/subscriptions/22" | "uri": "https://example.com/restconf/subscriptions/22" | |||
| } | } ]]></artwork> | |||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| <t>Upon receipt of the successful response, the subscriber does a | ||||
| <t>Upon receipt of the successful response, the subscriber does a GET | GET to the provided URI to start the flow of notification messages. | |||
| the provided URI to start the flow of notification messages. When the publisher | When the publisher receives this, the subscription is moved to the | |||
| receives this, the subscription is moved to the active state (c).</t> | active state (c).</t> | |||
| <figure anchor="positive-establish-post"> | ||||
| <figure align="center" anchor="positive-establish-post" title="establi | <name>"establish-subscription" Subsequent POST</name> | |||
| sh-subscription subsequent POST"> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| <artwork><![CDATA[ | GET /restconf/subscriptions/22 ]]></artwork> | |||
| GET /restconf/subscriptions/22 | ||||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| <t>While not shown in <xref target="mess-flow-establishment" format="d efault"/>, if the publisher had not been able to fully satisfy the request, or t he subscriber has no authorization to establish the subscription, the publisher would have sent an RPC error response. For instance, if the "dscp" value of 10 a sserted by the subscriber in <xref target="establish-subs" format="default"/> pr oved unacceptable, the publisher may have returned:</t> | ||||
| <t>While not shown in <xref target="mess-flow-establishment"/>, if the | <figure anchor="negative-establish-subs"> | |||
| publisher had not been able to fully satisfy the request, or subscriber has no | <name>An Unsuccessful "establish-subscription"</name> | |||
| authorization to establish the subscription, the publisher would have sent an RP | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| C error response. For instance, if the "dscp" value of 10 asserted by the subscr | HTTP status code - 400 | |||
| iber in <xref target="establish-subs"/> proved unacceptable, the publisher may h | ||||
| ave returned:</t> | ||||
| <figure align="center" anchor="negative-establish-subs" title="an unsu | ||||
| ccessful establish subscription"> | ||||
| <artwork><![CDATA[ | ||||
| HTTP status code - 400 | ||||
| { "ietf-restconf:errors" : { | { "ietf-restconf:errors" : { | |||
| "error" : [ | "error" : [ | |||
| { | { | |||
| "error-type": "application", | "error-type": "application", | |||
| "error-tag": "invalid-value", | "error-tag": "invalid-value", | |||
| "error-severity": "error", | "error-severity": "error", | |||
| "error-app-tag": | "error-app-tag": | |||
| "ietf-subscribed-notifications:dscp-unavailable" | "ietf-subscribed-notifications:dscp-unavailable" | |||
| } | ||||
| ] | ||||
| } | ||||
| } | } | |||
| ] | ||||
| ]]></artwork> | } | |||
| } ]]></artwork> | ||||
| </figure> | </figure> | |||
| <t>The subscriber can use this information in future attempts to estab lish a subscription.</t> | <t>The subscriber can use this information in future attempts to estab lish a subscription.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Modifying Dynamic Subscriptions"> | <name>Modifying Dynamic Subscriptions</name> | |||
| <t>An existing subscription may be modified. The following exchange s | ||||
| <t>An existing subscription may be modified. The following exchange s | hows a negotiation of such a modification via several exchanges between a subscr | |||
| hows a negotiation of such a modification via several exchanges between a subscr | iber and a publisher. This negotiation consists of a failed RPC modification re | |||
| iber and a publisher. This negotiation consists of a failed RPC modification re | quest/response followed by a successful one.</t> | |||
| quest/response, followed by a successful one.</t> | <figure anchor="mess-flow-subs-modification"> | |||
| <name>Interaction Model for Successful Subscription Modification</na | ||||
| <figure anchor = "mess-flow-subs-modification" | me> | |||
| title="Interaction model for successful subscription modificatio | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| n"> | ||||
| <artwork><![CDATA[ | ||||
| +------------+ +-----------+ | +------------+ +-----------+ | |||
| | Subscriber | | Publisher | | | Subscriber | | Publisher | | |||
| +------------+ +-----------+ | +------------+ +-----------+ | |||
| | | | | | | |||
| | notification message (id#23)| | | notification message (id#23)| | |||
| |<-----------------------------| | |<-----------------------------| | |||
| | | | | | | |||
| |modify-subscription (id#23) | | |modify-subscription (id#23) | | |||
| |----------------------------->| (d) | |----------------------------->| (d) | |||
| | HTTP 400 error (with hint)| | | HTTP 400 error (with hint)| | |||
| |<-----------------------------| (e) | |<-----------------------------| (e) | |||
| | | | | | | |||
| |modify-subscription (id#23) | | |modify-subscription (id#23) | | |||
| |----------------------------->| | |----------------------------->| | |||
| | HTTP 200 OK | | | HTTP 200 OK | | |||
| |<-----------------------------| | |<-----------------------------| | |||
| | | | | | | |||
| | notif-mesg (id#23)| | | notif-mesg (id#23)| | |||
| |<-----------------------------| | |<-----------------------------| | |||
| | | | | | ]]></artwork> | |||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| <t>If the subscription being modified in <xref target="mess-flow-subs- | ||||
| <t>If the subscription being modified in <xref target="mess-flow-subs- | modification" format="default"/> is a datastore subscription as per <xref target | |||
| modification"/> is a datastore subscription as per <xref target="I-D.ietf-netcon | ="RFC8641" format="default"/>, the modification request made in (d) may look lik | |||
| f-yang-push"/>, the modification request made in (d) may look like that shown in | e that shown in <xref target="simple-modify-subs" format="default"/>. As can be | |||
| <xref target="simple-modify-subs"/>. As can be seen, the modifications being a | seen, the modifications being attempted are the application of a new XML Path L | |||
| ttempted are the application of a new xpath filter as well as the setting of a n | anguage (XPath) filter as well as the setting of a new periodic time interval.</ | |||
| ew periodic time interval.</t> | t> | |||
| <figure anchor="simple-modify-subs"> | ||||
| <figure align="center" anchor="simple-modify-subs" title="Subscription | <name>Subscription Modification Request (c)</name> | |||
| modification request (c)"> | <artwork name="ex-modify-subscription.json" type="" align="left" alt | |||
| <artwork name="ex-modify-subscription.json"><![CDATA[ | =""><![CDATA[ | |||
| POST /restconf/operations | POST /restconf/operations | |||
| /ietf-subscribed-notifications:modify-subscription | /ietf-subscribed-notifications:modify-subscription | |||
| { | { | |||
| "ietf-subscribed-notifications:input": { | "ietf-subscribed-notifications:input": { | |||
| "id": 23, | "id": 23, | |||
| "ietf-yang-push:datastore-xpath-filter": | "ietf-yang-push:datastore-xpath-filter": | |||
| "/example-module:foo/example-module:bar", | "/example-module:foo/example-module:bar", | |||
| "ietf-yang-push:periodic": { | "ietf-yang-push:periodic": { | |||
| "ietf-yang-push:period": 500 | "ietf-yang-push:period": 500 | |||
| } | } | |||
| } | } | |||
| } | } ]]></artwork> | |||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| <t>If the publisher can satisfy both changes, the publisher sends a po | ||||
| sitive result for the RPC. If the publisher cannot satisfy either of the propose | ||||
| d changes, the publisher sends an RPC error response (e). The following is an e | ||||
| xample RPC error response for (e) that includes a hint. This hint is an alternat | ||||
| ive time period value that might have resulted in a successful modification:</t> | ||||
| <figure anchor="negative-modify-subs"> | ||||
| <name>"modify-subscription" Failure with Hint (e)</name> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| HTTP status code - 400 | ||||
| <t>If the publisher can satisfy both changes, the publisher sends a po | { "ietf-restconf:errors" : { | |||
| sitive result for the RPC. If the publisher cannot satisfy either of the propose | "error" : [ | |||
| d changes, the publisher sends an RPC error response (e). The following is an e | "error-type": "application", | |||
| xample RPC error response for (e) which includes a hint. This hint is an alterna | "error-tag": "invalid-value", | |||
| tive time period value which might have resulted in a successful modification:</ | "error-severity": "error", | |||
| t> | "error-app-tag": "ietf-yang-push:period-unsupported", | |||
| "error-info": { | ||||
| <figure align="center" anchor="negative-modify-subs" title="Modify sub | "ietf-yang-push": | |||
| scription failure with Hint (e)"> | "modify-subscription-datastore-error-info": { | |||
| <artwork><![CDATA[ | "period-hint": 3000 | |||
| HTTP status code - 400 | ||||
| { "ietf-restconf:errors" : { | ||||
| "error" : [ | ||||
| "error-type": "application", | ||||
| "error-tag": "invalid-value", | ||||
| "error-severity": "error", | ||||
| "error-app-tag": "ietf-yang-push:period-unsupported", | ||||
| "error-info": { | ||||
| "ietf-yang-push": | ||||
| "modify-subscription-datastore-error-info": { | ||||
| "period-hint": 3000 | ||||
| } | ||||
| } | ||||
| ] | ||||
| } | } | |||
| } | } | |||
| ]]></artwork> | ] | |||
| } | ||||
| } ]]></artwork> | ||||
| </figure> | </figure> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Deleting Dynamic Subscriptions"> | <name>Deleting Dynamic Subscriptions</name> | |||
| <t>The following demonstrates deleting a subscription. This subscript ion may have been to either a stream or a datastore.</t> | <t>The following demonstrates deleting a subscription. This subscript ion may have been to either a stream or a datastore.</t> | |||
| <figure anchor="simple-delete-subs"> | ||||
| <figure align="center" anchor="simple-delete-subs" title="Delete subsc | <name>"delete-subscription" Request</name> | |||
| ription"> | <artwork name="ex-delete-subscription.json" type="" align="left" alt | |||
| <artwork name="ex-delete-subscription.json"><![CDATA[ | =""><![CDATA[ | |||
| POST /restconf/operations | POST /restconf/operations | |||
| /ietf-subscribed-notifications:delete-subscription | /ietf-subscribed-notifications:delete-subscription | |||
| { | { | |||
| "delete-subscription": { | "delete-subscription": { | |||
| "id": "22" | "id": "22" | |||
| } | } | |||
| } | } ]]></artwork> | |||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| <t>If the publisher can satisfy the request, the publisher replies wit h success to the RPC request.</t> | <t>If the publisher can satisfy the request, the publisher replies wit h success to the RPC request.</t> | |||
| <t>If the publisher cannot satisfy the request, the publisher sends | ||||
| an <rpc-error> element indicating the modification didn't work. < | ||||
| xref | ||||
| target="negative-delete-subs" format="default"/> shows a valid | ||||
| response for an existing valid subscription identifier, but that subscr | ||||
| iption identifier was created on a different transport session:</t> | ||||
| <figure anchor="negative-delete-subs"> | ||||
| <name>Unsuccessful "delete-subscription"</name> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| HTTP status code - 404 | ||||
| <t>If the publisher cannot satisfy the request, the publisher sends an | { | |||
| error-rpc element indicating the modification didn't work. <xref target="negati | "ietf-restconf:errors" : { | |||
| ve-delete-subs"/> shows a valid response for existing valid subscription identif | "error" : [ | |||
| ier, but that subscription identifier was created on a different transport sessi | "error-type": "application", | |||
| on:</t> | "error-tag": "invalid-value", | |||
| "error-severity": "error", | ||||
| <figure align="center" anchor="negative-delete-subs" title="Unsuccessful | "error-app-tag": | |||
| delete subscription"> | "ietf-subscribed-notifications:no-such-subscription" | |||
| <artwork><![CDATA[ | ] | |||
| HTTP status code - 404 | } | |||
| } ]]></artwork> | ||||
| { | ||||
| "ietf-restconf:errors" : { | ||||
| "error" : [ | ||||
| "error-type": "application", | ||||
| "error-tag": "invalid-value", | ||||
| "error-severity": "error", | ||||
| "error-app-tag": | ||||
| "ietf-subscribed-notifications:no-such-subscription" | ||||
| ] | ||||
| } | ||||
| } | ||||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Subscription State Notifications"> | <name>Subscription State Notifications</name> | |||
| <t>A publisher will send subscription state notifications according to t | ||||
| <t>A publisher will send subscription state notifications according to | he definitions within <xref target="RFC8639" format="default"/>.</t> | |||
| the definitions within <xref target="I-D.draft-ietf-netconf-subscribed-notificat | <section numbered="true" toc="default"> | |||
| ions"/>).</t> | <name>"subscription-modified"</name> | |||
| <section title="subscription-modified"> | ||||
| <t>A "subscription-modified" encoded in JSON would look like:</t> | <t>A "subscription-modified" encoded in JSON would look like:</t> | |||
| <figure anchor="subscription-modified-ctrl-plane-notif"> | ||||
| <figure align="center" anchor="subscription-modified-ctrl-plane-notif" | <name>"subscription-modified" Subscription State Notification</name> | |||
| title="subscription-modified subscription state notification"> | <sourcecode name="" type="json"><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| { | { | |||
| "ietf-restconf:notification" : { | "ietf-restconf:notification" : { | |||
| "eventTime": "2007-09-01T10:00:00Z", | "eventTime": "2007-09-01T10:00:00Z", | |||
| "ietf-subscribed-notifications:subscription-modified": { | "ietf-subscribed-notifications:subscription-modified": { | |||
| "id": 39, | "id": 39, | |||
| "uri": "https://example.com/restconf/subscriptions/22" | "uri": "https://example.com/restconf/subscriptions/22" | |||
| "stream-xpath-filter": "/example-module:foo", | "stream-xpath-filter": "/example-module:foo", | |||
| "stream": { | "stream": { | |||
| "ietf-netconf-subscribed-notifications" : "NETCONF" | "ietf-netconf-subscribed-notifications" : "NETCONF" | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } ]]></sourcecode> | |||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="subscription-completed, subscription-resumed, and replay | <name>"subscription-completed", "subscription-resumed", and "replay-co | |||
| -complete"> | mpleted"</name> | |||
| <t>A "subscription-completed" notification would look like:</t> | ||||
| <t>A "subscription-completed" would look like:</t> | <figure anchor="subscription-completed"> | |||
| <name>"subscription-completed" Notification in JSON</name> | ||||
| <figure align="center" | <sourcecode name="ex-subscription-completed.json" type="json"><![CDA | |||
| anchor="subscription-completed" | TA[ | |||
| title="subscription-completed notification in JSON"> | ||||
| <artwork name="ex-subscription-completed.json"><![CDATA[ | ||||
| { | { | |||
| "ietf-restconf:notification" : { | "ietf-restconf:notification" : { | |||
| "eventTime": "2007-09-01T10:00:00Z", | "eventTime": "2007-09-01T10:00:00Z", | |||
| "ietf-subscribed-notifications:subscription-completed": { | "ietf-subscribed-notifications:subscription-completed": { | |||
| "id": 39, | "id": 39, | |||
| } | } | |||
| } | } | |||
| } | } ]]></sourcecode> | |||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| <t>The "subscription-resumed" and "replay-complete" are virtually iden tical, with "subscription-completed" simply being replaced by "subscription-resu med" and "replay-complete".</t> | <t>The "subscription-resumed" and "replay-complete" are virtually iden tical, with "subscription-completed" simply being replaced by "subscription-resu med" and "replay-complete".</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="subscription-terminated and subscription-suspended"> | <name>"subscription-terminated" and "subscription-suspended"</name> | |||
| <t>A "subscription-terminated" would look like:</t> | <t>A "subscription-terminated" would look like:</t> | |||
| <figure anchor="subscription-terminated"> | ||||
| <figure align="center" | <name>"subscription-terminated" Subscription State Notification</nam | |||
| anchor="subscription-terminated" | e> | |||
| title="subscription-terminated subscription state notification | <sourcecode name="ex-subscription-terminated.json" type="json"><![CD | |||
| "> | ATA[ | |||
| <artwork name="ex-subscription-terminated.json"><![CDATA[ | ||||
| { | { | |||
| "ietf-restconf:notification" : { | "ietf-restconf:notification" : { | |||
| "eventTime": "2007-09-01T10:00:00Z", | "eventTime": "2007-09-01T10:00:00Z", | |||
| "ietf-subscribed-notifications:subscription-terminated": { | "ietf-subscribed-notifications:subscription-terminated": { | |||
| "id": 39, | "id": 39, | |||
| "error-id": "suspension-timeout" | "error-id": "suspension-timeout" | |||
| } | } | |||
| } | } | |||
| } | } ]]></sourcecode> | |||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| <t>The "subscription-suspended" is virtually identical, with "subscrip tion-terminated" simply being replaced by "subscription-suspended".</t> | <t>The "subscription-suspended" is virtually identical, with "subscrip tion-terminated" simply being replaced by "subscription-suspended".</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Filter Example"> | <name>Filter Example</name> | |||
| <t>This section provides an example that illustrates the method of filte | ||||
| <t>This section provides an example which illustrate the method of filteri | ring event record contents. The example is based on the YANG notification "vrrp | |||
| ng event record contents. The example is based on the YANG notification "vrrp-p | -protocol-error-event" as defined per the ietf-vrrp.yang module within <xref tar | |||
| rotocol-error-event" as defined per the ietf-vrrp.yang module within <xref targe | get="RFC8347" format="default"/>. Event records based on this specification tha | |||
| t="RFC8347"/>. Event records based on this specification which are generated by | t are generated by the publisher might appear as:</t> | |||
| the publisher might appear as:</t> | <figure anchor="VRRP-notification"> | |||
| <name>RFC 8347 (VRRP) - Example Notification</name> | ||||
| <figure align="center" | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| anchor="VRRP-notification" | data: { | |||
| title="RFC 8347 (VRRP) - Example Notification"> | data: "ietf-restconf:notification" : { | |||
| <artwork><![CDATA[ | data: "eventTime" : "2018-09-14T08:22:33.44Z", | |||
| data: { | data: "ietf-vrrp:vrrp-protocol-error-event" : { | |||
| data: "ietf-restconf:notification" : { | data: "protocol-error-reason" : "checksum-error" | |||
| data: "eventTime" : "2018-09-14T08:22:33.44Z", | data: } | |||
| data: "ietf-vrrp:vrrp-protocol-error-event" : { | data: } | |||
| data: "protocol-error-reason" : "checksum-error" | data: } ]]></artwork> | |||
| data: } | </figure> | |||
| data: } | <t>Suppose a subscriber wanted to establish a subscription that only pas | |||
| data: } | ses instances of event records where there is a "checksum-error" as part of a Vi | |||
| ]]></artwork> | rtual Router Redundancy Protocol (VRRP) protocol event. Also assume the publish | |||
| </figure> | er places such event records into the NETCONF stream. To get a continuous serie | |||
| s of matching event records, the subscriber might request the application of an | ||||
| <t>Suppose a subscriber wanted to establish a subscription which only pass | XPath filter against the NETCONF stream. An "establish-subscription" RPC to mee | |||
| es instances of event records where there is a "checksum-error" as part of a VRR | t this objective might be:</t> | |||
| P protocol event. Also assume the publisher places such event records into the | <figure anchor="VRRP-XPATH"> | |||
| NETCONF stream. To get a continuous series of matching event records, the subsc | <name>Establishing a Subscription Error Reason via XPath</name> | |||
| riber might request the application of an XPath filter against the NETCONF strea | <artwork name="ex-establish-subscription-filter-xpath.json" type="" al | |||
| m. An "establish-subscription" RPC to meet this objective might be:</t> | ign="left" alt=""><![CDATA[ | |||
| <figure align="center" | ||||
| anchor="VRRP-XPATH" | ||||
| title="Establishing a subscription error reason via XPath"> | ||||
| <artwork name="ex-establish-subscription-filter-xpath.json"><! | ||||
| [CDATA[ | ||||
| POST /restconf/operations | POST /restconf/operations | |||
| /ietf-subscribed-notifications:establish-subscription | /ietf-subscribed-notifications:establish-subscription | |||
| { | { | |||
| "ietf-subscribed-notifications:input": { | "ietf-subscribed-notifications:input": { | |||
| "stream": "NETCONF", | "stream": "NETCONF", | |||
| "stream-xpath-filter": | "stream-xpath-filter": | |||
| "/ietf-vrrp:vrrp-protocol-error-event[ | "/ietf-vrrp:vrrp-protocol-error-event[ | |||
| protocol-error-reason='checksum-error']/", | protocol-error-reason='checksum-error']/", | |||
| } | } | |||
| } | } ]]></artwork> | |||
| ]]></artwork> | </figure> | |||
| </figure> | <t>For more examples of XPath filters, see <xref target="XPATH" format=" | |||
| default"/>.</t> | ||||
| <t>For more examples of XPath filters, see <xref target="XPATH"/>.</t> | <t>Suppose the "establish-subscription" in <xref target="VRRP-XPATH" for | |||
| mat="default"/> was accepted. And suppose later a subscriber decided they wanted | ||||
| <t>Suppose the "establish-subscription" in <xref target="VRRP-XPATH"/> was | to broaden this subscription cover to all VRRP protocol events (i.e., not just | |||
| accepted. And suppose later a subscriber decided they wanted to broaden this su | those with a "checksum error"). The subscriber might attempt to modify the subs | |||
| bscription cover to all VRRP protocol events (i.e., not just those with a "check | cription in a way that replaces the XPath filter with a subtree filter that send | |||
| sum error"). The subscriber might attempt to modify the subscription in a way w | s all VRRP protocol events to a subscriber. Such a "modify-subscription" RPC mig | |||
| hich replaces the XPath filter with a subtree filter which sends all VRRP protoc | ht look like:</t> | |||
| ol events to a subscriber. Such a "modify-subscription" RPC might look like:</t> | ||||
| <figure align="center" | <figure anchor="VRRP-Subtree"> | |||
| anchor="VRRP-Subtree" | <name>Example "modify-subscription" RPC</name> | |||
| title=""> | <artwork name="ex-modify-subscription-filter-subtree.json" type="" ali | |||
| <artwork name="ex-modify-subscription-filter-subtree.json"><![ | gn="left" alt=""><![CDATA[ | |||
| CDATA[ | ||||
| POST /restconf/operations | POST /restconf/operations | |||
| /ietf-subscribed-notifications:modify-subscription | /ietf-subscribed-notifications:modify-subscription | |||
| { | { | |||
| "ietf-subscribed-notifications:input": { | "ietf-subscribed-notifications:input": { | |||
| "stream": "NETCONF", | "stream": "NETCONF", | |||
| "stream-subtree-filter": { | "stream-subtree-filter": { | |||
| "/ietf-vrrp:vrrp-protocol-error-event" : {} | "/ietf-vrrp:vrrp-protocol-error-event" : {} | |||
| } | } | |||
| } | } | |||
| } | } ]]></artwork> | |||
| ]]></artwork> | </figure> | |||
| </figure> | <t>For more examples of subtree filters, see <xref target="RFC6241" sect | |||
| ionFormat="comma" section="6.4" format="default"/>.</t> | ||||
| <t>For more examples of subtree filters, see <xref target="RFC6241"/>, sec | </section> | |||
| tion 6.4.</t> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section title="Changes between revisions"> | <section numbered="false" toc="default"> | |||
| <t>(To be removed by RFC editor prior to publication)</t> | <name>Acknowledgments</name> | |||
| <t>We wish to acknowledge the helpful contributions, comments, and suggest | ||||
| <t>v14 - v15</t> | ions that were received from Ambika Prasad Tripathy, Alberto Gonzalez Prieto, Su | |||
| <t><list style="symbols"> | san Hares, Tim Jenkins, Balazs Lengyel, Kent Watsen, Michael Scharf, Guangying Z | |||
| <t>Addressed review comments from Kent.</t> | heng, Martin Bjorklund, Qin Wu, and Robert Wilton.</t> | |||
| </list> | ||||
| </t> | ||||
| <t>v13 - v14</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Addressed review comments from IESG.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v12 - v13</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Enhanced "error-tag" values based on SN review.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v11 - v12</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Added text in 3.2 for expected behavior when ietf-restconf-monito | ||||
| ring.yang is also supported.</t> | ||||
| <t>Added section 2 to the reference to draft-ietf-netconf-nmda-restc | ||||
| onf.</t> | ||||
| <t>Replaced kill-subscription-error by delete-subscription-error in | ||||
| section 3.3.</t> | ||||
| <t>Clarified vertical lines (a) and (b) in Figure 1 of section 3.4</ | ||||
| t> | ||||
| <t>Section 3.4, 3rd bullet after Figure 1, replaced "must" with "MUS | ||||
| T".</t> | ||||
| <t>Modified text in section 3.4 regarding access to RPCs modify-subs | ||||
| cription, resync-subscription, delete-subscription and kill-subscription.</t> | ||||
| <t>Section 4, first bullet for HTTP2: replaced dscp and priority wit | ||||
| h weighting and weight.</t> | ||||
| <t>Section 6, added YANG tree diagram and fixed description of the m | ||||
| odule.</t> | ||||
| <t>Section 7, fixed indentation of module description statement.</t> | ||||
| <t>Section 7, in YANG module changed year in copyright statement to | ||||
| 2019.</t> | ||||
| <t>Section 8, added text on how server protects access to the subscr | ||||
| iption URI.</t> | ||||
| <t>Fixed outdated references and removed unused references.</t> | ||||
| <t>Fixed the instances of line too long.</t> | ||||
| <t>Fixed example in Figure 3.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v10 - v11</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Per Kent's request, added name attribute to artwork which need to | ||||
| be extracted</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v09 - v10</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Fixed typo for resync.</t> | ||||
| <t>Added text wrt RPC permissions and RESTCONF username.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v08 - v09</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Addressed comments received during WGLC.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v07 - v08</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Aligned with RESTCONF mechanism.</t> | ||||
| <t>YANG model: removed augment of subscription-started, added restco | ||||
| nf transport.</t> | ||||
| <t>Tweaked Appendix A.1 to match draft-ietf-netconf-netconf-event-no | ||||
| tifications-13.</t> | ||||
| <t>Added Appendix A.3 for filter example.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v06 - v07</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Removed configured subscriptions.</t> | ||||
| <t>Subscription identifier renamed to id.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v05 - v06</t> | ||||
| <t><list style="symbols"> | ||||
| <t>JSON examples updated by Reshad.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v04 - v05</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Error mechanisms updated to match embedded RESTCONF mechanisms</t | ||||
| > | ||||
| <t>Restructured format and sections of document.</t> | ||||
| <t>Added a YANG data model for HTTP specific parameters.</t> | ||||
| <t>Mirrored the examples from the NETCONF transport draft to allow e | ||||
| asy comparison.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v03 - v04</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Draft not fully synched to new version of subscribed-notification | ||||
| s yet.</t> | ||||
| <t>References updated</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v02 - v03</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Event notification reframed to notification message.</t> | ||||
| <t>Tweaks to wording/capitalization/format.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v01 - v02</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Removed sections now redundant with <xref target="I-D.draft-ietf- | ||||
| netconf-subscribed-notifications"/> and <xref target="I-D.ietf-netconf-yang-push | ||||
| "/> such as: mechanisms for subscription maintenance, terminology definitions, | ||||
| stream discovery.</t> | ||||
| <t>3rd party subscriptions are out-of-scope.</t> | ||||
| <t>SSE only used with RESTCONF and HTTP1.1 dynamic subscriptions</t> | ||||
| <t>Timeframes for event tagging are self-defined.</t> | ||||
| <t>Clean-up of wording, references to terminology, section numbers.< | ||||
| /t> | ||||
| </list> | ||||
| </t> | ||||
| <t>v00 - v01</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Removed the ability for more than one subscription to go to a sin | ||||
| gle HTTP2 stream.</t> | ||||
| <t>Updated call flows. Extensively.</t> | ||||
| <t>SSE only used with RESTCONF and HTTP1.1 dynamic subscriptions</t> | ||||
| <t>HTTP is not used to determine that a receiver has gone silent and | ||||
| is not Receiving Event Notifications</t> | ||||
| <t>Many clean-ups of wording and terminology</t> | ||||
| </list> | ||||
| </t> | ||||
| </section> | </section> | |||
| </back> | </back> | |||
| </rfc> | </rfc> | |||
| End of changes. 118 change blocks. | ||||
| 1018 lines changed or deleted | 838 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||