| module yrt-ietf-yang-patch { |
| yang-version 1.1; |
| namespace "urn:ietf:params:xml:ns:yang:yrt-ietf-yang-patch"; |
| prefix "ypatch"; |
| |
| import yrt-ietf-restconf { prefix rc; } |
| |
| organization |
| "IETF NETCONF (Network Configuration) Working Group"; |
| |
| contact |
| "WG Web: <https://datatracker.ietf.org/wg/netconf/> |
| WG List: <mailto:netconf@ietf.org> |
| Author: Andy Bierman |
| <mailto:andy@yumaworks.com> |
| Author: Martin Bjorklund |
| <mailto:mbj@tail-f.com> |
| Author: Kent Watsen |
| <mailto:kwatsen@juniper.net>"; |
| |
| description |
| "This module contains conceptual YANG specifications |
| for the YANG Patch and YANG Patch Status data structures. |
| Note that the YANG definitions within this module do not |
| represent configuration data of any kind. |
| The YANG grouping statements provide a normative syntax |
| for XML and JSON message-encoding purposes. |
| Copyright (c) 2017 IETF Trust and the persons identified as |
| authors of the code. All rights reserved. |
| Redistribution and use in source and binary forms, with or |
| without modification, is permitted pursuant to, and subject |
| to the license terms contained in, the Simplified BSD License |
| set forth in Section 4.c of the IETF Trust's Legal Provisions |
| Relating to IETF Documents |
| (http://trustee.ietf.org/license-info). |
| This version of this YANG module is part of RFC 8072; see |
| the RFC itself for full legal notices."; |
| |
| revision 2017-02-22 { |
| description |
| "Initial revision."; |
| reference |
| "RFC 8072: YANG Patch Media Type."; |
| } |
| |
| typedef target-resource-offset { |
| type string; |
| description |
| "Contains a data resource identifier string representing |
| a sub-resource within the target resource. |
| The document root for this expression is the |
| target resource that is specified in the |
| protocol operation (e.g., the URI for the PATCH request). |
| This string is encoded according to the same rules as those |
| for a data resource identifier in a RESTCONF request URI."; |
| reference |
| "RFC 8040, Section 3.5.3."; |
| } |
| /* |
| rc:yang-data "yang-patch" { |
| uses yang-patch; |
| } |
| |
| rc:yang-data "yang-patch-status" { |
| uses yang-patch-status; |
| } |
| */ |
| grouping yang-patch { |
| |
| description |
| "A grouping that contains a YANG container representing the |
| syntax and semantics of a YANG Patch edit request message."; |
| |
| container yang-patch { |
| description |
| "Represents a conceptual sequence of datastore edits, |
| called a patch. Each patch is given a client-assigned |
| patch identifier. Each edit MUST be applied |
| in ascending order, and all edits MUST be applied. |
| If any errors occur, then the target datastore MUST NOT |
| be changed by the YANG Patch operation. |
| It is possible for a datastore constraint violation to occur |
| due to any node in the datastore, including nodes not |
| included in the 'edit' list. Any validation errors MUST |
| be reported in the reply message."; |
| |
| reference |
| "RFC 7950, Section 8.3."; |
| |
| leaf patch-id { |
| type string; |
| mandatory true; |
| description |
| "An arbitrary string provided by the client to identify |
| the entire patch. Error messages returned by the server |
| that pertain to this patch will be identified by this |
| 'patch-id' value. A client SHOULD attempt to generate |
| unique 'patch-id' values to distinguish between |
| transactions from multiple clients in any audit logs |
| maintained by the server."; |
| } |
| |
| leaf comment { |
| type string; |
| description |
| "An arbitrary string provided by the client to describe |
| the entire patch. This value SHOULD be present in any |
| audit logging records generated by the server for the |
| patch."; |
| } |
| |
| list edit { |
| key edit-id; |
| ordered-by user; |
| |
| description |
| "Represents one edit within the YANG Patch request message. |
| The 'edit' list is applied in the following manner: |
| - The first edit is conceptually applied to a copy |
| of the existing target datastore, e.g., the |
| running configuration datastore. |
| - Each ascending edit is conceptually applied to |
| the result of the previous edit(s). |
| - After all edits have been successfully processed, |
| the result is validated according to YANG constraints. |
| - If successful, the server will attempt to apply |
| the result to the target datastore."; |
| |
| leaf edit-id { |
| type string; |
| description |
| "Arbitrary string index for the edit. |
| Error messages returned by the server that pertain |
| to a specific edit will be identified by this value."; |
| } |
| |
| leaf operation { |
| type enumeration { |
| enum create { |
| description |
| "The target data node is created using the supplied |
| value, only if it does not already exist. The |
| 'target' leaf identifies the data node to be |
| created, not the parent data node."; |
| } |
| enum delete { |
| description |
| "Delete the target node, only if the data resource |
| currently exists; otherwise, return an error."; |
| } |
| |
| enum insert { |
| description |
| "Insert the supplied value into a user-ordered |
| list or leaf-list entry. The target node must |
| represent a new data resource. If the 'where' |
| parameter is set to 'before' or 'after', then |
| the 'point' parameter identifies the insertion |
| point for the target node."; |
| } |
| enum merge { |
| description |
| "The supplied value is merged with the target data |
| node."; |
| } |
| enum move { |
| description |
| "Move the target node. Reorder a user-ordered |
| list or leaf-list. The target node must represent |
| an existing data resource. If the 'where' parameter |
| is set to 'before' or 'after', then the 'point' |
| parameter identifies the insertion point to move |
| the target node."; |
| } |
| enum replace { |
| description |
| "The supplied value is used to replace the target |
| data node."; |
| } |
| enum remove { |
| description |
| "Delete the target node if it currently exists."; |
| } |
| } |
| mandatory true; |
| description |
| "The datastore operation requested for the associated |
| 'edit' entry."; |
| } |
| |
| leaf target { |
| type target-resource-offset; |
| mandatory true; |
| description |
| "Identifies the target data node for the edit |
| operation. If the target has the value '/', then |
| the target data node is the target resource. |
| The target node MUST identify a data resource, |
| not the datastore resource."; |
| } |
| |
| leaf point { |
| when "(../operation = 'insert' or ../operation = 'move')" |
| + "and (../where = 'before' or ../where = 'after')" { |
| description |
| "This leaf only applies for 'insert' or 'move' |
| operations, before or after an existing entry."; |
| } |
| type target-resource-offset; |
| description |
| "The absolute URL path for the data node that is being |
| used as the insertion point or move point for the |
| target of this 'edit' entry."; |
| } |
| |
| leaf where { |
| when "../operation = 'insert' or ../operation = 'move'" { |
| description |
| "This leaf only applies for 'insert' or 'move' |
| operations."; |
| } |
| type enumeration { |
| enum before { |
| description |
| "Insert or move a data node before the data resource |
| identified by the 'point' parameter."; |
| } |
| enum after { |
| description |
| "Insert or move a data node after the data resource |
| identified by the 'point' parameter."; |
| } |
| |
| enum first { |
| description |
| "Insert or move a data node so it becomes ordered |
| as the first entry."; |
| } |
| enum last { |
| description |
| "Insert or move a data node so it becomes ordered |
| as the last entry."; |
| } |
| } |
| default last; |
| description |
| "Identifies where a data resource will be inserted |
| or moved. YANG only allows these operations for |
| list and leaf-list data nodes that are |
| 'ordered-by user'."; |
| } |
| |
| anydata value { |
| when "../operation = 'create' " |
| + "or ../operation = 'merge' " |
| + "or ../operation = 'replace' " |
| + "or ../operation = 'insert'" { |
| description |
| "The anydata 'value' is only used for 'create', |
| 'merge', 'replace', and 'insert' operations."; |
| } |
| description |
| "Value used for this edit operation. The anydata 'value' |
| contains the target resource associated with the |
| 'target' leaf. |
| For example, suppose the target node is a YANG container |
| named foo: |
| container foo { |
| leaf a { type string; } |
| leaf b { type int32; } |
| } |
| The 'value' node contains one instance of foo: |
| <value> |
| <foo xmlns='example-foo-namespace'> |
| <a>some value</a> |
| <b>42</b> |
| </foo> |
| </value> |
| "; |
| } |
| } |
| } |
| |
| } // grouping yang-patch |
| |
| grouping yang-patch-status { |
| |
| description |
| "A grouping that contains a YANG container representing the |
| syntax and semantics of a YANG Patch Status response |
| message."; |
| |
| container yang-patch-status { |
| description |
| "A container representing the response message sent by the |
| server after a YANG Patch edit request message has been |
| processed."; |
| |
| leaf patch-id { |
| type string; |
| mandatory true; |
| description |
| "The 'patch-id' value used in the request."; |
| } |
| |
| choice global-status { |
| description |
| "Report global errors or complete success. |
| If there is no case selected, then errors |
| are reported in the 'edit-status' container."; |
| |
| case global-errors { |
| uses rc:errors; |
| description |
| "This container will be present if global errors that |
| are unrelated to a specific edit occurred."; |
| } |
| leaf ok { |
| type empty; |
| description |
| "This leaf will be present if the request succeeded |
| and there are no errors reported in the 'edit-status' |
| container."; |
| } |
| } |
| |
| container edit-status { |
| description |
| "This container will be present if there are |
| edit-specific status responses to report. |
| If all edits succeeded and the 'global-status' |
| returned is 'ok', then a server MAY omit this |
| container."; |
| |
| list edit { |
| key edit-id; |
| |
| description |
| "Represents a list of status responses, |
| corresponding to edits in the YANG Patch |
| request message. If an 'edit' entry was |
| skipped or not reached by the server, |
| then this list will not contain a corresponding |
| entry for that edit."; |
| |
| leaf edit-id { |
| type string; |
| description |
| "Response status is for the 'edit' list entry |
| with this 'edit-id' value."; |
| } |
| |
| choice edit-status-choice { |
| description |
| "A choice between different types of status |
| responses for each 'edit' entry."; |
| leaf ok { |
| type empty; |
| description |
| "This 'edit' entry was invoked without any |
| errors detected by the server associated |
| with this edit."; |
| } |
| case errors { |
| uses rc:errors; |
| description |
| "The server detected errors associated with the |
| edit identified by the same 'edit-id' value."; |
| } |
| } |
| } |
| } |
| } |
| } // grouping yang-patch-status |
| |
| } |