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."; | |
} | |
rc:yang-data "yang-patch"; | |
rc:yang-data "yang-patch-status"; | |
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."; | |
} | |
uses yang-patch; | |
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" { | |
value 0; | |
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" { | |
value 1; | |
description | |
"Delete the target node, only if the data resource | |
currently exists; otherwise, return an error."; | |
} | |
enum "insert" { | |
value 2; | |
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" { | |
value 3; | |
description | |
"The supplied value is merged with the target data | |
node."; | |
} | |
enum "move" { | |
value 4; | |
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" { | |
value 5; | |
description | |
"The supplied value is used to replace the target | |
data node."; | |
} | |
enum "remove" { | |
value 6; | |
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" { | |
value 0; | |
description | |
"Insert or move a data node before the data resource | |
identified by the 'point' parameter."; | |
} | |
enum "after" { | |
value 1; | |
description | |
"Insert or move a data node after the data resource | |
identified by the 'point' parameter."; | |
} | |
enum "first" { | |
value 2; | |
description | |
"Insert or move a data node so it becomes ordered | |
as the first entry."; | |
} | |
enum "last" { | |
value 3; | |
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> | |
"; | |
} | |
} // list edit | |
} // container yang-patch | |
} // 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 { | |
description | |
"This container will be present if global errors that | |
are unrelated to a specific edit occurred."; | |
uses rc:errors; | |
} // case global-errors | |
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."; | |
} | |
} // choice global-status | |
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 { | |
description | |
"The server detected errors associated with the | |
edit identified by the same 'edit-id' value."; | |
uses rc:errors; | |
} // case errors | |
} // choice edit-status-choice | |
} // list edit | |
} // container edit-status | |
} // container yang-patch-status | |
} // grouping yang-patch-status | |
} // module ietf-yang-patch |