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