draft-ietf-netconf-partial-lock-11.txt | rfc5717.txt | |||
---|---|---|---|---|
NETCONF B. Lengyel | Network Working Group B. Lengyel | |||
Internet-Draft Ericsson | Request for Comments: 5717 Ericsson | |||
Intended status: Standards Track M. Bjorklund | Category: Standards Track M. Bjorklund | |||
Expires: April 23, 2010 Tail-f Systems | Tail-f Systems | |||
October 20, 2009 | December 2009 | |||
Partial Lock RPC for NETCONF | ||||
draft-ietf-netconf-partial-lock-11 | ||||
Status of this Memo | ||||
This Internet-Draft is submitted to IETF in full conformance with the | ||||
provisions of BCP 78 and BCP 79. This document may contain material | ||||
from IETF Documents or IETF Contributions published or made publicly | ||||
available before November 10, 2008. The person(s) controlling the | ||||
copyright in some of this material may not have granted the IETF | ||||
Trust the right to allow modifications of such material outside the | ||||
IETF Standards Process. Without obtaining an adequate license from | ||||
the person(s) controlling the copyright in such materials, this | ||||
document may not be modified outside the IETF Standards Process, and | ||||
derivative works of it may not be created outside the IETF Standards | ||||
Process, except to format it for publication as an RFC or to | ||||
translate it into languages other than English. | ||||
Internet-Drafts are working documents of the Internet Engineering | Partial Lock Remote Procedure Call (RPC) for NETCONF | |||
Task Force (IETF), its areas, and its working groups. Note that | ||||
other groups may also distribute working documents as Internet- | ||||
Drafts. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | Abstract | |||
and may be updated, replaced, or obsoleted by other documents at any | ||||
time. It is inappropriate to use Internet-Drafts as reference | ||||
material or to cite them other than as "work in progress." | ||||
The list of current Internet-Drafts can be accessed at | The Network Configuration protocol (NETCONF) defines the lock and | |||
http://www.ietf.org/ietf/1id-abstracts.txt. | unlock Remote Procedure Calls (RPCs), used to lock entire | |||
configuration datastores. In some situations, a way to lock only | ||||
parts of a configuration datastore is required. This document | ||||
defines a capability-based extension to the NETCONF protocol for | ||||
locking portions of a configuration datastore. | ||||
The list of Internet-Draft Shadow Directories can be accessed at | Status of This Memo | |||
http://www.ietf.org/shadow.html. | ||||
This Internet-Draft will expire on April 23, 2010. | This document specifies an Internet standards track protocol for the | |||
Internet community, and requests discussion and suggestions for | ||||
improvements. Please refer to the current edition of the "Internet | ||||
Official Protocol Standards" (STD 1) for the standardization state | ||||
and status of this protocol. Distribution of this memo is unlimited. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2009 IETF Trust and the persons identified as the | Copyright (c) 2009 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents in effect on the date of | Provisions Relating to IETF Documents | |||
publication of this document (http://trustee.ietf.org/license-info). | (http://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | ||||
Abstract | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | ||||
described in the BSD License. | ||||
The NETCONF protocol defines the lock and unlock RPCs, used to lock | This document may contain material from IETF Documents or IETF | |||
entire configuration datastores. In some situations, a way to lock | Contributions published or made publicly available before November | |||
only parts of a configuration datastore is required. This document | 10, 2008. The person(s) controlling the copyright in some of this | |||
defines a capability-based extension to the NETCONF protocol for | material may not have granted the IETF Trust the right to allow | |||
locking portions of a configuration datastore. | modifications of such material outside the IETF Standards Process. | |||
Without obtaining an adequate license from the person(s) controlling | ||||
the copyright in such materials, this document may not be modified | ||||
outside the IETF Standards Process, and derivative works of it may | ||||
not be created outside the IETF Standards Process, except to format | ||||
it for publication as an RFC or to translate it into languages other | ||||
than English. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Definition of Terms . . . . . . . . . . . . . . . . . . . 4 | 1.1. Definition of Terms . . . . . . . . . . . . . . . . . . . 3 | |||
2. Partial Locking Capability . . . . . . . . . . . . . . . . . . 4 | 2. Partial Locking Capability . . . . . . . . . . . . . . . . . . 3 | |||
2.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2.1.1. Usage Scenarios . . . . . . . . . . . . . . . . . . . 5 | 2.1.1. Usage Scenarios . . . . . . . . . . . . . . . . . . . 4 | |||
2.2. Dependencies . . . . . . . . . . . . . . . . . . . . . . . 6 | 2.2. Dependencies . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
2.3. Capability Identifier . . . . . . . . . . . . . . . . . . 6 | 2.3. Capability Identifier . . . . . . . . . . . . . . . . . . 5 | |||
2.4. New Operations . . . . . . . . . . . . . . . . . . . . . . 6 | 2.4. New Operations . . . . . . . . . . . . . . . . . . . . . . 5 | |||
2.4.1. <partial-lock> . . . . . . . . . . . . . . . . . . . . 6 | 2.4.1. <partial-lock> . . . . . . . . . . . . . . . . . . . . 5 | |||
2.4.2. <partial-unlock> . . . . . . . . . . . . . . . . . . . 10 | 2.4.2. <partial-unlock> . . . . . . . . . . . . . . . . . . . 10 | |||
2.5. Modifications to Existing Operations . . . . . . . . . . . 11 | 2.5. Modifications to Existing Operations . . . . . . . . . . . 10 | |||
2.6. Interactions with Other Capabilities . . . . . . . . . . . 12 | 2.6. Interactions with Other Capabilities . . . . . . . . . . . 11 | |||
2.6.1. Candidate Configuration Capability . . . . . . . . . . 12 | 2.6.1. Candidate Configuration Capability . . . . . . . . . . 11 | |||
2.6.2. Confirmed Commit Capability . . . . . . . . . . . . . 12 | 2.6.2. Confirmed Commit Capability . . . . . . . . . . . . . 11 | |||
2.6.3. Distinct Startup Capability . . . . . . . . . . . . . 12 | 2.6.3. Distinct Startup Capability . . . . . . . . . . . . . 11 | |||
3. Security Considerations . . . . . . . . . . . . . . . . . . . 12 | 3. Security Considerations . . . . . . . . . . . . . . . . . . . 12 | |||
4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 13 | 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 12 | |||
5. Appendix A - XML Schema for Partial Locking (normative) . . 15 | 5. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
6. Appendix B - YANG Module for Partial Locking | 6. References . . . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
(non-normative) . . . . . . . . . . . . . . . . . . . . . . . 18 | 6.1. Normative References . . . . . . . . . . . . . . . . . . . 13 | |||
7. Appendix C - Usage Example - Reserving nodes for future | 6.2. Informative References . . . . . . . . . . . . . . . . . . 13 | |||
editing (non-normative) . . . . . . . . . . . . . . . . . . . 20 | Appendix A. XML Schema for Partial Locking (Normative) . . . . . 14 | |||
8. Appendix D - Change Log . . . . . . . . . . . . . . . . . . 24 | Appendix B. YANG Module for Partial Locking (Non-Normative) . . . 17 | |||
8.1. 10-11 . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | Appendix C. Usage Example - Reserving Nodes for Future | |||
8.2. 09-10 . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | Editing (Non-Normative) . . . . . . . . . . . . . . . 19 | |||
8.3. 08-09 . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | ||||
8.4. 07-08 . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | ||||
8.5. 06-07 . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | ||||
8.6. 05-06 . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | ||||
8.7. 04-05 . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | ||||
8.8. 03-04 . . . . . . . . . . . . . . . . . . . . . . . . . . 25 | ||||
8.9. 02-03 . . . . . . . . . . . . . . . . . . . . . . . . . . 25 | ||||
8.10. 01-02 . . . . . . . . . . . . . . . . . . . . . . . . . . 25 | ||||
8.11. 00-01 . . . . . . . . . . . . . . . . . . . . . . . . . . 25 | ||||
8.12. -00 . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 | ||||
9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 27 | ||||
10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 28 | ||||
10.1. Normative References . . . . . . . . . . . . . . . . . . . 28 | ||||
10.2. Informative References . . . . . . . . . . . . . . . . . . 28 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 29 | ||||
1. Introduction | 1. Introduction | |||
The [NETCONF] protocol describes the lock and unlock operations that | The [NETCONF] protocol describes the lock and unlock operations that | |||
operate on entire configuration datastores. Often, multiple | operate on entire configuration datastores. Often, multiple | |||
management sessions need to be able to modify the configuration of a | management sessions need to be able to modify the configuration of a | |||
managed device in parallel. In these cases, locking only parts of a | managed device in parallel. In these cases, locking only parts of a | |||
configuration datastore is needed. This document defines a | configuration datastore is needed. This document defines a | |||
capability based extension to the NETCONF protocol to support partial | capability-based extension to the NETCONF protocol to support partial | |||
locking of the NETCONF running datastore using a mechanism based on | locking of the NETCONF running datastore using a mechanism based on | |||
the existing XPath filtering mechanisms. | the existing XPath filtering mechanisms. | |||
1.1. Definition of Terms | 1.1. Definition of Terms | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14, [RFC2119]. | 14, [RFC2119]. | |||
Additionally the following terms are defined: | Additionally, the following terms are defined: | |||
o Instance Identifier: an XPath expression identifying a specific | o Instance Identifier: an XPath expression identifying a specific | |||
node in the conceptual XML datastore. It contains an absolute | node in the conceptual XML datastore. It contains an absolute | |||
path expression in abbreviated syntax, where predicates are used | path expression in abbreviated syntax, where predicates are used | |||
only to specify values for nodes defined as keys to distinguish | only to specify values for nodes defined as keys to distinguish | |||
multiple instances. | multiple instances. | |||
o Scope of the lock: initially the set of nodes returned by the | o Scope of the lock: initially, the set of nodes returned by the | |||
XPath expressions in a successful partial-lock operation. The set | XPath expressions in a successful partial-lock operation. The set | |||
might be modified if some of the nodes are deleted by the session | might be modified if some of the nodes are deleted by the session | |||
owning the lock. | owning the lock. | |||
o Protected area: the set of nodes that are protected from | o Protected area: the set of nodes that are protected from | |||
modification by the lock. This set consists of nodes in the scope | modification by the lock. This set consists of nodes in the scope | |||
of the lock and nodes in subtrees under them. | of the lock and nodes in subtrees under them. | |||
2. Partial Locking Capability | 2. Partial Locking Capability | |||
skipping to change at page 5, line 5 | skipping to change at page 4, line 7 | |||
The :partial-lock capability indicates that the device supports the | The :partial-lock capability indicates that the device supports the | |||
locking of its configuration with a more limited scope than a | locking of its configuration with a more limited scope than a | |||
complete configuration datastore. The scope to be locked is | complete configuration datastore. The scope to be locked is | |||
specified by using restricted or full XPath expressions. Partial | specified by using restricted or full XPath expressions. Partial | |||
locking only affects configuration data and only the running | locking only affects configuration data and only the running | |||
datastore. The candidate or the start-up datastore are not affected. | datastore. The candidate or the start-up datastore are not affected. | |||
The system MUST ensure that configuration resources covered by the | The system MUST ensure that configuration resources covered by the | |||
lock are not modified by other NETCONF or non-NETCONF management | lock are not modified by other NETCONF or non-NETCONF management | |||
operations such as SNMP and the CLI. | operations such as Simple Network Management Protocol (SNMP) and the | |||
Command Line Interface (CLI). | ||||
The duration of the partial lock begins when the partial lock is | The duration of the partial lock begins when the partial lock is | |||
granted and lasts until (1) either the corresponding <partial-unlock> | granted and lasts until (1) either the corresponding <partial-unlock> | |||
operation succeeds or (2) the NETCONF session terminates. | operation succeeds or (2) the NETCONF session terminates. | |||
A NETCONF session MAY have multiple parts of the running datastore | A NETCONF session MAY have multiple parts of the running datastore | |||
locked using partial lock operations. | locked using partial lock operations. | |||
The <partial-lock> operation returns a lock-id to identify each | The <partial-lock> operation returns a lock-id to identify each | |||
successfully acquired lock. The lock-id is unique at any given time | successfully acquired lock. The lock-id is unique at any given time | |||
for a NETCONF server for all partial-locks granted to any NETCONF or | for a NETCONF server for all partial-locks granted to any NETCONF or | |||
non-NETCONF sessions. | non-NETCONF sessions. | |||
2.1.1. Usage Scenarios | 2.1.1. Usage Scenarios | |||
In the following we describe a few scenarios for partial locking. | In the following, we describe a few scenarios for partial locking. | |||
Besides the two described here, there are many other usage scenarios | Besides the two described here, there are many other usage scenarios | |||
possible. | possible. | |||
2.1.1.1. Multiple managers handling the writable running datastore with | 2.1.1.1. Multiple Managers Handling the Writable Running Datastore with | |||
overlapping sections | Overlapping Sections | |||
Multiple managers are handling the same NETCONF agent simultaneously. | Multiple managers are handling the same NETCONF agent simultaneously. | |||
The agent is handled via the writable running datastore. Each | The agent is handled via the writable running datastore. Each | |||
manager has his or her own task, which might involve the modification | manager has his or her own task, which might involve the modification | |||
of overlapping sections of the datastore. | of overlapping sections of the datastore. | |||
After collecting and analyzing input and preparing the NETCONF | After collecting and analyzing input and preparing the NETCONF | |||
operations off-line, the manager locks the areas that are important | operations off-line, the manager locks the areas that are important | |||
for his task using one single <partial-lock> operation. The manager | for his task using one single <partial-lock> operation. The manager | |||
executes a number of <edit-config> operations to modify the | executes a number of <edit-config> operations to modify the | |||
configuration, then releases the partial-lock. The lock should be | configuration, then releases the partial-lock. The lock should be | |||
held for the shortest possible time (e.g. seconds rather then | held for the shortest possible time (e.g., seconds rather than | |||
minutes). The manager should collect all human input before locking | minutes). The manager should collect all human input before locking | |||
anything. As each manager locks only a part of the data model, | anything. As each manager locks only a part of the data model, | |||
usually multiple operators can execute the <edit-config> operations | usually multiple operators can execute the <edit-config> operations | |||
simultaneously. | simultaneously. | |||
2.1.1.2. Multiple managers handling the writable running datastore, | 2.1.1.2. Multiple Managers Handling the Writable Running Datastore, | |||
distinct management areas | Distinct Management Areas | |||
Multiple managers are handling the same NETCONF agent simultaneously. | Multiple managers are handling the same NETCONF agent simultaneously. | |||
The agent is handled via the writable running datastore. The agent's | The agent is handled via the writable running datastore. The agent's | |||
data model contains a number of well defined separate areas that can | data model contains a number of well-defined separate areas that can | |||
be configured without impacting other areas. An example can be a | be configured without impacting other areas. An example can be a | |||
server with multiple applications running on it, or a number of a | server with multiple applications running on it, or a number of | |||
network elements with a common NETCONF agent for management. | network elements with a common NETCONF agent for management. | |||
Each manager has his or her own task, which does not involve the | Each manager has his or her own task, which does not involve the | |||
modification of overlapping sections of the datastore. | modification of overlapping sections of the datastore. | |||
The manager locks his area with a <partial-lock> operation, uses a | The manager locks his area with a <partial-lock> operation, uses a | |||
number of <edit-config> commands to modify it, later releases the | number of <edit-config> commands to modify it, and later releases the | |||
lock. As each manager has his functional area assigned to him, and | lock. As each manager has his functional area assigned to him, and | |||
he locks only that area, multiple managers can edit the configuration | he locks only that area, multiple managers can edit the configuration | |||
simultaneously. Locks can be held for extended periods (e.g. | simultaneously. Locks can be held for extended periods (e.g., | |||
minutes, hours), as this will not hinder other managers. | minutes, hours), as this will not hinder other managers. | |||
This scenario assumes that the global lock operation from [NETCONF] | This scenario assumes that the global lock operation from [NETCONF] | |||
is not used. | is not used. | |||
2.2. Dependencies | 2.2. Dependencies | |||
The device MUST support restricted XPath expressions in the select | The device MUST support restricted XPath expressions in the select | |||
element, as described in Section 2.4.1. Optionally, if the :xpath | element, as described in Section 2.4.1. Optionally, if the :xpath | |||
capability is also supported (as defined in [NETCONF] chapter 8.9. | capability is also supported (as defined in [NETCONF], Section 8.9. | |||
XPath Capability), the device MUST also support using any XPath 1.0 | "XPath Capability"), the device MUST also support using any XPath 1.0 | |||
expression in the select element. | expression in the select element. | |||
2.3. Capability Identifier | 2.3. Capability Identifier | |||
urn:ietf:params:netconf:capability:partial-lock:1.0 | urn:ietf:params:netconf:capability:partial-lock:1.0 | |||
2.4. New Operations | 2.4. New Operations | |||
2.4.1. <partial-lock> | 2.4.1. <partial-lock> | |||
skipping to change at page 6, line 49 | skipping to change at page 6, line 10 | |||
When a NETCONF session holds a lock on a node, no other session or | When a NETCONF session holds a lock on a node, no other session or | |||
non-NETCONF mechanism of the system can change that node or any node | non-NETCONF mechanism of the system can change that node or any node | |||
in the hierarchy of nodes beneath it. | in the hierarchy of nodes beneath it. | |||
Locking a node protects the node itself and the complete subtree | Locking a node protects the node itself and the complete subtree | |||
under the node from modification by others. The set of locked nodes | under the node from modification by others. The set of locked nodes | |||
is called the scope of the lock, while all the locked nodes and the | is called the scope of the lock, while all the locked nodes and the | |||
nodes in the subtrees under them make up the protected area. | nodes in the subtrees under them make up the protected area. | |||
The XPath expressions are evaluated only once at lock time. | The XPath expressions are evaluated only once: at lock time. | |||
Thereafter, the scope of the lock is maintained as a set of nodes, | Thereafter, the scope of the lock is maintained as a set of nodes, | |||
i.e. the returned nodeset, and not by the XPath expression. If the | i.e., the returned nodeset, and not by the XPath expression. If the | |||
configuration data is later altered in a way that would make the | configuration data is later altered in a way that would make the | |||
original XPath expressions evaluate to a different set of nodes, this | original XPath expressions evaluate to a different set of nodes, this | |||
does not affect the scope of the partial lock. | does not affect the scope of the partial lock. | |||
Let's say the agent's data model includes a list of interface nodes. | Let's say the agent's data model includes a list of interface nodes. | |||
If the XPath expression in the partial lock operation covers all | If the XPath expression in the partial-lock operation covers all | |||
interface nodes at locking, the scope of the lock will be maintained | interface nodes at locking, the scope of the lock will be maintained | |||
as the list of interface nodes at the time when the lock was granted. | as the list of interface nodes at the time when the lock was granted. | |||
If someone later creates a new interface, this new interface will not | If someone later creates a new interface, this new interface will not | |||
be included in the locked-nodes list created previously so the new | be included in the locked-nodes list created previously so the new | |||
interface will not be locked. | interface will not be locked. | |||
A <partial-lock> operation MUST be handled atomically by the NETCONF | A <partial-lock> operation MUST be handled atomically by the NETCONF | |||
server. The server either locks all requested parts of the datastore | server. The server either locks all requested parts of the datastore | |||
or none. If during the <partial-lock> operation one of the requested | or none. If during the <partial-lock> operation one of the requested | |||
parts cannot be locked, the server MUST unlock all parts that have | parts cannot be locked, the server MUST unlock all parts that have | |||
skipping to change at page 7, line 35 | skipping to change at page 6, line 44 | |||
the scope of the lock are deleted, the lock will still be present. | the scope of the lock are deleted, the lock will still be present. | |||
However, its scope will become empty (since the lock will not cover | However, its scope will become empty (since the lock will not cover | |||
any nodes). | any nodes). | |||
A NETCONF server that supports partial locking MUST be able to grant | A NETCONF server that supports partial locking MUST be able to grant | |||
multiple simultaneous partial locks to a single NETCONF session. If | multiple simultaneous partial locks to a single NETCONF session. If | |||
the protected area of the individual locks overlap, nodes in the | the protected area of the individual locks overlap, nodes in the | |||
common area MUST be protected until all of the overlapping locks are | common area MUST be protected until all of the overlapping locks are | |||
released. | released. | |||
A partial lock operation MUST fail if: | A <partial-lock> operation MUST fail if: | |||
o Any NETCONF session (including the current session) owns the | o Any NETCONF session (including the current session) owns the | |||
global lock on the running datastore. | global lock on the running datastore. | |||
o Any part of the area to be protected is already locked (or | o Any part of the area to be protected is already locked (or | |||
protected by partial locking) by another management session, | protected by partial locking) by another management session, | |||
including other NETCONF sessions using <partial-lock> or any other | including other NETCONF sessions using <partial-lock> or any other | |||
non-NETCONF management method. | non-NETCONF management method. | |||
o The requesting user is not successfully authenticated. | o The requesting user is not successfully authenticated. | |||
o The NETCONF server implements access control, and the locking user | o The NETCONF server implements access control and the locking user | |||
does not have sufficient access rights. The exact handling of | does not have sufficient access rights. The exact handling of | |||
access rights is outside the scope of this document, but it is | access rights is outside the scope of this document, but it is | |||
assumed that there is an access control system that MAY deny or | assumed that there is an access control system that MAY deny or | |||
allow the partial lock operation. | allow the <partial-lock> operation. | |||
The <partial-lock> operation is designed for simplicity, so when a | The <partial-lock> operation is designed for simplicity, so when a | |||
partial lock is executed you get what you asked for: a set of nodes | partial lock is executed, you get what you asked for: a set of nodes | |||
that are locked for writing. As a consequence users must observe the | that are locked for writing. | |||
following: | ||||
As a consequence, users must observe the following: | ||||
o Locking does not affect read operations. | o Locking does not affect read operations. | |||
o If part of the running datastore is locked, this has no effect on | o If part of the running datastore is locked, this has no effect on | |||
any unlocked parts of the datastore. If this is a problem (e.g., | any unlocked parts of the datastore. If this is a problem (e.g., | |||
changes depend on data values or nodes outside the protected part | changes depend on data values or nodes outside the protected part | |||
of the datastore), these nodes SHOULD be included in the protected | of the datastore), these nodes SHOULD be included in the protected | |||
area of the lock. | area of the lock. | |||
o Configuration data can be edited both inside and outside the | o Configuration data can be edited both inside and outside the | |||
protected area of a lock. It is the responsibility of the NETCONF | protected area of a lock. It is the responsibility of the NETCONF | |||
client application to lock all relevant parts of the datastore | client application to lock all relevant parts of the datastore | |||
that are crucial for a specific management action. | that are crucial for a specific management action. | |||
Note: The <partial-lock> operation does not modify the global <lock> | Note: The <partial-lock> operation does not modify the global <lock> | |||
operation defined in the base NETCONF Protocol [NETCONF]. If part of | operation defined in the base NETCONF protocol [NETCONF]. If part of | |||
the running datastore is already locked by <partial-lock>, then a | the running datastore is already locked by <partial-lock>, then a | |||
global lock for the running datastore MUST fail even if the global | global lock for the running datastore MUST fail even if the global | |||
lock is requested by the NETCONF session that owns the partial lock. | lock is requested by the NETCONF session that owns the partial lock. | |||
2.4.1.1. Parameters, Result, Examples | 2.4.1.1. Parameters, Results, Examples | |||
Parameters: | Parameters: | |||
select: One or more 'select' elements, each containing an XPath | select: One or more 'select' elements, each containing an XPath | |||
expression. The XPath expression is evaluated in a context where | expression. The XPath expression is evaluated in a context | |||
the context node is the root of the server's conceptual data | where the context node is the root of the server's | |||
model, and the set of namespace declarations are those in scope | conceptual data model, and the set of namespace declarations | |||
on the select element. | are those in scope on the select element. | |||
The nodes returned from the select expressions are reported in | The nodes returned from the select expressions are reported in the | |||
the rpc-reply message. | rpc-reply message. | |||
Each select expression MUST return a node set, and at least one | Each select expression MUST return a node set, and at least one of | |||
of the node sets MUST be non-empty. | the node sets MUST be non-empty. | |||
If the device supports the :xpath capability, any valid XPath 1.0 | If the device supports the :xpath capability, any valid XPath 1.0 | |||
expression can be used. If the device does not support the | expression can be used. If the device does not support the | |||
:xpath capability, the XPath expression MUST be limited to an | :xpath capability, the XPath expression MUST be limited to an | |||
Instance Identifier expression. An Instance Identifier is an | Instance Identifier expression. An Instance Identifier is an | |||
absolute path expression in abbreviated syntax, where predicates | absolute path expression in abbreviated syntax, where predicates | |||
are used only to specify values for nodes defined as keys to | are used only to specify values for nodes defined as keys to | |||
distinguish multiple instances. | distinguish multiple instances. | |||
Example: Lock virtual router 1 and interface eth1 | Example: Lock virtual router 1 and interface eth1 | |||
<nc:rpc | <nc:rpc | |||
skipping to change at page 9, line 34 | skipping to change at page 8, line 42 | |||
message-id="135"> | message-id="135"> | |||
<lock-id>127</lock-id> | <lock-id>127</lock-id> | |||
<locked-node xmlns:rte="http://example.com/ns/route"> | <locked-node xmlns:rte="http://example.com/ns/route"> | |||
/rte:routing/rte:virtualRouter[rte:routerName='router1'] | /rte:routing/rte:virtualRouter[rte:routerName='router1'] | |||
</locked-node> | </locked-node> | |||
<locked-node xmlns:if="http://example.com/ns/interface"> | <locked-node xmlns:if="http://example.com/ns/interface"> | |||
/if:interfaces/if:interface[if:id='eth1'] | /if:interfaces/if:interface[if:id='eth1'] | |||
</locked-node> | </locked-node> | |||
</nc:rpc-reply> | </nc:rpc-reply> | |||
Note: The XML Schema in [NETCONF] has a known bug which requires the | Note: The XML Schema in [NETCONF] has a known bug that requires the | |||
<data> XML element in a <rpc-reply>. This means that the above | <data> XML element in a <rpc-reply>. This means that the above | |||
examples will not validate using the XML Schema found in [NETCONF]. | examples will not validate using the XML Schema found in [NETCONF]. | |||
Positive Response: | Positive Response: | |||
If the device was able to satisfy the request, an <rpc-reply> is sent | If the device was able to satisfy the request, an <rpc-reply> is sent | |||
with a <lock-id> element (lock identifier) in the <rpc-reply> | with a <lock-id> element (lock identifier) in the <rpc-reply> | |||
element. A list of locked nodes is also returned in Instance | element. A list of locked nodes is also returned in Instance | |||
Identifier format. | Identifier format. | |||
skipping to change at page 10, line 27 | skipping to change at page 9, line 34 | |||
sessions to an unauthorized client. | sessions to an unauthorized client. | |||
If a lock is already held by another session on any node within the | If a lock is already held by another session on any node within the | |||
subtrees to be locked, the <error-tag> element is 'lock-denied' and | subtrees to be locked, the <error-tag> element is 'lock-denied' and | |||
the <error-info> element includes the <session-id> of the lock owner. | the <error-info> element includes the <session-id> of the lock owner. | |||
If the lock is held by a non-NETCONF session, a <session-id> of 0 | If the lock is held by a non-NETCONF session, a <session-id> of 0 | |||
(zero) SHOULD be included. The same error response is returned if | (zero) SHOULD be included. The same error response is returned if | |||
the requesting session already holds the (global) lock for the | the requesting session already holds the (global) lock for the | |||
running datastore. | running datastore. | |||
If needed the returned session-id may be used to <kill-session> the | If needed, the returned session-id may be used to <kill-session> the | |||
NETCONF session holding the lock. | NETCONF session holding the lock. | |||
2.4.1.2. Deadlock Avoidance | 2.4.1.2. Deadlock Avoidance | |||
As with most locking systems, it is possible that two management | As with most locking systems, it is possible that two management | |||
sessions trying to lock different parts of the configuration could | sessions trying to lock different parts of the configuration could | |||
become dead-locked. To avoid this situation, clients SHOULD lock | become deadlocked. To avoid this situation, clients SHOULD lock | |||
everything they need in one operation. If locking fails, the client | everything they need in one operation. If locking fails, the client | |||
MUST back-off, release any previously acquired locks, and SHOULD | MUST back-off, release any previously acquired locks, and SHOULD | |||
retry the procedure after waiting some randomized time interval. | retry the procedure after waiting some randomized time interval. | |||
2.4.2. <partial-unlock> | 2.4.2. <partial-unlock> | |||
The operation unlocks the parts of the running datastore that were | The operation unlocks the parts of the running datastore that were | |||
previously locked using <partial-lock> during the same session. The | previously locked using <partial-lock> during the same session. The | |||
operation unlocks the parts that are covered by the lock identified | operation unlocks the parts that are covered by the lock identified | |||
by the lock-id parameter. In case of multiple potentially | by the lock-id parameter. In case of multiple potentially | |||
overlapping locks, only the lock identified by the lock-id is | overlapping locks, only the lock identified by the lock-id is | |||
removed. | removed. | |||
Parameters: | Parameters: | |||
lock-id: Identity of the lock to be unlocked. This lock-id MUST | lock-id: Identity of the lock to be unlocked. This lock-id MUST | |||
have been received as a response to a lock request by the manager | have been received as a response to a lock request by the | |||
during the current session, and MUST NOT have been sent in a | manager during the current session, and MUST NOT have been | |||
previous unlock request. | sent in a previous unlock request. | |||
Example: Unlock a previously created lock | Example: Unlock a previously created lock | |||
<nc:rpc xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | <nc:rpc xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | |||
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | |||
message-id="136"> | message-id="136"> | |||
<partial-unlock> | <partial-unlock> | |||
<lock-id>127</lock-id> | <lock-id>127</lock-id> | |||
</partial-unlock> | </partial-unlock> | |||
</nc:rpc> | </nc:rpc> | |||
Positive Response: | Positive Response: | |||
If the device was able to satisfy the request, an <rpc-reply> is sent | If the device was able to satisfy the request, an <rpc-reply> is sent | |||
that contains an <ok> element. A positive response MUST be sent even | that contains an <ok> element. A positive response MUST be sent even | |||
if all of the locked parts of the datastore have already been | if all of the locked parts of the datastore have already been | |||
deleted. | deleted. | |||
Negative Response: | Negative Response: | |||
If the <lock-id> parameter does not identify a lock which is owned by | If the <lock-id> parameter does not identify a lock that is owned by | |||
the session, an 'invalid-value' error is returned. | the session, an 'invalid-value' error is returned. | |||
2.5. Modifications to Existing Operations | 2.5. Modifications to Existing Operations | |||
A successful partial lock will cause a subsequent operation to fail | A successful partial lock will cause a subsequent operation to fail | |||
if that operation attempts to modify nodes in the protected area of | if that operation attempts to modify nodes in the protected area of | |||
the lock and is executed in a NETCONF session other than the session | the lock and is executed in a NETCONF session other than the session | |||
that has been granted the lock. The <error-tag> 'in-use' and the | that has been granted the lock. The <error-tag> 'in-use' and the | |||
<error-app-tag> 'locked' is returned. All operations that modify the | <error-app-tag> 'locked' is returned. All operations that modify the | |||
running datastore are affected, including: <edit-config>, <copy- | running datastore are affected, including: <edit-config>, <copy- | |||
config>, <delete-config>, <commit> and <discard-changes>. If partial | config>, <delete-config>, <commit>, and <discard-changes>. If | |||
lock prevents <edit-config> modifying some data, but the operation | partial lock prevents <edit-config> from modifying some data, but the | |||
includes the continue-on-error option, modification of other parts of | operation includes the continue-on-error option, modification of | |||
the datastore, which are not protected by partial locking, might | other parts of the datastore, which are not protected by partial | |||
still succeed. | locking, might still succeed. | |||
If the datastore contains nodes locked by partial lock, this will | If the datastore contains nodes locked by partial lock, this will | |||
cause the (global) <lock> operation to fail. The <error-tag> element | cause the (global) <lock> operation to fail. The <error-tag> element | |||
'lock-denied' and an <error-info> element including the <session-id> | 'lock-denied' and an <error-info> element including the <session-id> | |||
of the lock owner will be returned. If the lock is held by a non- | of the lock owner will be returned. If the lock is held by a non- | |||
NETCONF session, a <session-id> of 0 (zero) is returned. | NETCONF session, a <session-id> of 0 (zero) is returned. | |||
All of these operations are affected only if they are targeting the | All of these operations are affected only if they are targeting the | |||
running datastore. | running datastore. | |||
2.6. Interactions with Other Capabilities | 2.6. Interactions with Other Capabilities | |||
2.6.1. Candidate Configuration Capability | 2.6.1. Candidate Configuration Capability | |||
The candidate datastore can not be locked using the <partial-lock> | The candidate datastore cannot be locked using the <partial-lock> | |||
operation. | operation. | |||
2.6.2. Confirmed Commit Capability | 2.6.2. Confirmed Commit Capability | |||
If: | If: | |||
o a partial lock is requested for the running datastore, and | o a partial lock is requested for the running datastore, and | |||
o the NETCONF server implements the :confirmed-commit capability, | o the NETCONF server implements the :confirmed-commit capability, | |||
and | and | |||
o there was a recent confirmed <commit> operation where the | o there was a recent confirmed <commit> operation where the | |||
confirming <commit> operation has not been received | confirming <commit> operation has not been received | |||
then the lock MUST be denied, because if the confirmation does not | then the lock MUST be denied, because if the confirmation does not | |||
arrive, the running datastore MUST be rolled back to its state before | arrive, the running datastore MUST be rolled back to its state before | |||
the commit. The NETCONF server might therefore need to modify the | the commit. The NETCONF server might therefore need to modify the | |||
configuration. | configuration. | |||
In this case the <error-tag> 'in-use' and the <error-app-tag> | ||||
In this case, the <error-tag> 'in-use' and the <error-app-tag> | ||||
'outstanding-confirmed-commit' is returned. | 'outstanding-confirmed-commit' is returned. | |||
2.6.3. Distinct Startup Capability | 2.6.3. Distinct Startup Capability | |||
The startup datastore can not be locked using the <partial-lock> | The startup datastore cannot be locked using the <partial-lock> | |||
operation. | operation. | |||
3. Security Considerations | 3. Security Considerations | |||
The same considerations are relevant as for the base NETCONF Protocol | The same considerations are relevant as for the base NETCONF protocol | |||
[NETCONF]. <partial-lock> and <partial-unlock> RPCs MUST only be | [NETCONF]. <partial-lock> and <partial-unlock> RPCs MUST only be | |||
allowed for an authenticated user. <partial-lock> and <partial- | allowed for an authenticated user. <partial-lock> and <partial- | |||
unlock> RPCs SHOULD only be allowed for an authorized user. However | unlock> RPCs SHOULD only be allowed for an authorized user. However, | |||
as NETCONF access control is not standardized and not a mandatory | as NETCONF access control is not standardized and not a mandatory | |||
part of a NETCONF implementation, it is strongly recommended, but | part of a NETCONF implementation, it is strongly recommended, but | |||
OPTIONAL. (although nearly all implementations include some kind of | OPTIONAL (although nearly all implementations include some kind of | |||
access control) | access control). | |||
A lock (either a partial lock or a global lock) might prevent other | A lock (either a partial lock or a global lock) might prevent other | |||
users from configuring the system. The following mechanisms are in | users from configuring the system. The following mechanisms are in | |||
place to prevent the misuse of this possibility: | place to prevent the misuse of this possibility: | |||
A user, that is not successfully authenticated, MUST NOT be | A user, that is not successfully authenticated, MUST NOT be | |||
granted a partial lock. | granted a partial lock. | |||
Only an authorized user SHOULD be able to request a partial lock. | Only an authorized user SHOULD be able to request a partial lock. | |||
The partial lock is automatically released when a session is | The partial lock is automatically released when a session is | |||
terminated regardless of how the session ends. | terminated regardless of how the session ends. | |||
The <kill-session> operation makes it possible to terminate other | The <kill-session> operation makes it possible to terminate other | |||
users's sessions. | users' sessions. | |||
The NETCONF server MAY log partial lock requests in an audit | The NETCONF server MAY log partial lock requests in an audit | |||
trail. | trail. | |||
A lock that is hung for some reason (e.g., a broken TCP connection | A lock that is hung for some reason (e.g., a broken TCP connection | |||
that the server has not yet recognised) can be released using another | that the server has not yet recognized) can be released using another | |||
NETCONF session by explicitly killing the session owning that lock | NETCONF session by explicitly killing the session owning that lock | |||
using the <kill-session> operation. | using the <kill-session> operation. | |||
Partial locking is not an authorization mechanism; it SHOULD NOT be | Partial locking is not an authorization mechanism; it SHOULD NOT be | |||
used to provide security or access control. Partial locking SHOULD | used to provide security or access control. Partial locking SHOULD | |||
only be used as a mechanism for providing consistency when multiple | only be used as a mechanism for providing consistency when multiple | |||
managers are trying to configure the node. It is vital that users | managers are trying to configure the node. It is vital that users | |||
easily understand the exact scope of a lock. This is why the scope | easily understand the exact scope of a lock. This is why the scope | |||
is determined when granting a lock and is not modified thereafter. | is determined when granting a lock and is not modified thereafter. | |||
4. IANA Considerations | 4. IANA Considerations | |||
This document registers one capability identifier URN from the | This document registers one capability identifier URN from the | |||
"Network Configuration Protocol (NETCONF) Capability URNs" registry, | "Network Configuration Protocol (NETCONF) Capability URNs" registry, | |||
and one URI for the NETCONF XML namespace in the "IETF XML registry" | and one URI for the NETCONF XML namespace in the "IETF XML registry" | |||
[RFC3688]. Note that the capability URN is compliant to [NETCONF] | [RFC3688]. Note that the capability URN is compliant to [NETCONF], | |||
section 10.3. | Section 10.3. | |||
Index Capability Identifier | ||||
------------- --------------------------------------------------- | ||||
:partial-lock urn:ietf:params:netconf:capability:partial-lock:1.0 | ||||
+---------------+---------------------------------------------------+ | ||||
| Index | Capability Identifier | | ||||
+---------------+---------------------------------------------------+ | ||||
| :partial-lock | urn:ietf:params:netconf:capability:partial-lock:1 | | ||||
| | .0 | | ||||
+---------------+---------------------------------------------------+ | ||||
URI: urn:ietf:params:xml:ns:netconf:partial-lock:1.0 | URI: urn:ietf:params:xml:ns:netconf:partial-lock:1.0 | |||
Registrant Contact: The IESG. | Registrant Contact: The IESG. | |||
XML: N/A, the requested URI is an XML namespace. | XML: N/A, the requested URI is an XML namespace. | |||
5. Appendix A - XML Schema for Partial Locking (normative) | 5. Acknowledgements | |||
Thanks to Andy Bierman, Sharon Chisholm, Phil Shafer, David | ||||
Harrington, Mehmet Ersue, Wes Hardaker, Juergen Schoenwaelder, Washam | ||||
Fan, and many other members of the NETCONF WG for providing important | ||||
input to this document. | ||||
6. References | ||||
6.1. Normative References | ||||
[NETCONF] Enns, R., "NETCONF Configuration Protocol", RFC 4741, | ||||
December 2006. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | ||||
Requirement Levels", BCP 14, RFC 2119, March 1997. | ||||
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | ||||
January 2004. | ||||
6.2. Informative References | ||||
[YANG] Bjorklund, M., "YANG - A data modeling language for | ||||
NETCONF", Work in Progress, December 2009. | ||||
Appendix A. XML Schema for Partial Locking (Normative) | ||||
The following XML Schema defines the <partial-lock> and <partial- | The following XML Schema defines the <partial-lock> and <partial- | |||
unlock> operations: | unlock> operations: | |||
-- RFC Ed.: Insert license information for code as appropriate | ||||
<CODE BEGINS> | <CODE BEGINS> | |||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" | <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" | |||
xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | |||
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | |||
targetNamespace="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | targetNamespace="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | |||
elementFormDefault="qualified" attributeFormDefault="unqualified"> | elementFormDefault="qualified" attributeFormDefault="unqualified"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
Schema defining the partial-lock and unlock operations. | Schema defining the partial-lock and unlock operations. | |||
organization "IETF NETCONF Working Group" | organization "IETF NETCONF Working Group" | |||
contact | contact | |||
Netconf Working Group | Netconf Working Group | |||
Mailing list: netconf@ietf.org | Mailing list: netconf@ietf.org | |||
Web: http://www.ietf.org/html.charters/netconf-charter.html | Web: http://www.ietf.org/html.charters/netconf-charter.html | |||
Balazs Lengyel | Balazs Lengyel | |||
balazs.lengyel@ericsson.com" | balazs.lengyel@ericsson.com | |||
revision 2009-10-19 | revision 2009-10-19 | |||
description Initial version, published as RFC yyyy. | description Initial version, published as RFC 5717. | |||
-- RFC Ed.: replace yyyy with actual RFC number and remove this note. | </xs:documentation> | |||
</xs:documentation> | </xs:annotation> | |||
</xs:annotation> | ||||
<xs:import namespace="urn:ietf:params:xml:ns:netconf:base:1.0" | <xs:import namespace="urn:ietf:params:xml:ns:netconf:base:1.0" | |||
schemaLocation="urn:ietf:params:xml:ns:netconf:base:1.0"/> | schemaLocation="urn:ietf:params:xml:ns:netconf:base:1.0"/> | |||
<xs:simpleType name="lock-id-type"> | <xs:simpleType name="lock-id-type"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
A number identifying a specific | A number identifying a specific | |||
partial-lock granted to a session. | partial-lock granted to a session. | |||
It is allocated by the system, and SHOULD | It is allocated by the system, and SHOULD | |||
be used in the unlock operation. | be used in the unlock operation. | |||
</xs:documentation> | </xs:documentation> | |||
</xs:annotation> | </xs:annotation> | |||
<xs:restriction base="xs:unsignedInt"/> | <xs:restriction base="xs:unsignedInt"/> | |||
</xs:simpleType> | </xs:simpleType> | |||
<xs:complexType name="partialLockType"> | <xs:complexType name="partialLockType"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
A NETCONF operation that locks parts of | A NETCONF operation that locks parts of | |||
the running datastore. | the running datastore. | |||
</xs:documentation> | </xs:documentation> | |||
</xs:annotation> | </xs:annotation> | |||
<xs:complexContent> | <xs:complexContent> | |||
<xs:extension base="nc:rpcOperationType"> | <xs:extension base="nc:rpcOperationType"> | |||
<xs:sequence> | <xs:sequence> | |||
<xs:element name="select" type="xs:string" | <xs:element name="select" type="xs:string" | |||
maxOccurs="unbounded"> | maxOccurs="unbounded"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
XPath expression that specifies the scope | XPath expression that specifies the scope | |||
of the lock. An Instance Identifier | of the lock. An Instance Identifier | |||
expression must be used unless the :xpath | expression must be used unless the :xpath | |||
capability is supported in which case any | capability is supported in which case any | |||
XPath 1.0 expression is allowed. | XPath 1.0 expression is allowed. | |||
</xs:documentation> | </xs:documentation> | |||
</xs:annotation> | </xs:annotation> | |||
</xs:element> | </xs:element> | |||
</xs:sequence> | </xs:sequence> | |||
</xs:extension> | </xs:extension> | |||
</xs:complexContent> | </xs:complexContent> | |||
</xs:complexType> | </xs:complexType> | |||
<xs:complexType name="partialUnLockType"> | <xs:complexType name="partialUnLockType"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
A NETCONF operation that releases a previously acquired | A NETCONF operation that releases a previously acquired | |||
partial-lock. | partial-lock. | |||
</xs:documentation> | </xs:documentation> | |||
</xs:annotation> | </xs:annotation> | |||
<xs:complexContent> | <xs:complexContent> | |||
<xs:extension base="nc:rpcOperationType"> | <xs:extension base="nc:rpcOperationType"> | |||
<xs:sequence> | <xs:sequence> | |||
<xs:element name="lock-id" type="lock-id-type"> | <xs:element name="lock-id" type="lock-id-type"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
Identifies the lock to be released. MUST | Identifies the lock to be released. MUST | |||
be the value received in the response to | be the value received in the response to | |||
the partial-lock operation. | the partial-lock operation. | |||
</xs:documentation> | </xs:documentation> | |||
</xs:annotation> | </xs:annotation> | |||
</xs:element> | </xs:element> | |||
</xs:sequence> | </xs:sequence> | |||
</xs:extension> | </xs:extension> | |||
</xs:complexContent> | </xs:complexContent> | |||
</xs:complexType> | </xs:complexType> | |||
<!-- <partial-lock> operation --> | <!-- <partial-lock> operation --> | |||
<xs:element name="partial-lock" type="partialLockType" | <xs:element name="partial-lock" type="partialLockType" | |||
substitutionGroup="nc:rpcOperation"/> | substitutionGroup="nc:rpcOperation"/> | |||
<!-- <partial-unlock> operation --> | <!-- <partial-unlock> operation --> | |||
<xs:element name="partial-unlock" type="partialUnLockType" | <xs:element name="partial-unlock" type="partialUnLockType" | |||
substitutionGroup="nc:rpcOperation"/> | substitutionGroup="nc:rpcOperation"/> | |||
<!-- reply to <partial-lock> --> | <!-- reply to <partial-lock> --> | |||
<xs:complexType name="contentPartInPartialLockReplyType"> | <xs:complexType name="contentPartInPartialLockReplyType"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
The content of the reply to a successful | The content of the reply to a successful | |||
partial-lock request MUST conform to this complex type. | partial-lock request MUST conform to this complex type. | |||
</xs:documentation> | </xs:documentation> | |||
</xs:annotation> | </xs:annotation> | |||
<xs:sequence> | <xs:sequence> | |||
<xs:element name="lock-id" type="lock-id-type"> | <xs:element name="lock-id" type="lock-id-type"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
Identifies the lock to be released. Must be the value | Identifies the lock to be released. Must be the value | |||
received in the response to a partial-lock operation. | received in the response to a partial-lock operation. | |||
</xs:documentation> | </xs:documentation> | |||
</xs:annotation> | </xs:annotation> | |||
</xs:element> | </xs:element> | |||
<xs:element name="locked-node" type="xs:string" | <xs:element name="locked-node" type="xs:string" | |||
maxOccurs="unbounded"> | maxOccurs="unbounded"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
List of locked nodes in the running datastore. | List of locked nodes in the running datastore. | |||
</xs:documentation> | </xs:documentation> | |||
</xs:annotation> | </xs:annotation> | |||
</xs:element> | </xs:element> | |||
</xs:sequence> | </xs:sequence> | |||
</xs:complexType> | </xs:complexType> | |||
</xs:schema> | </xs:schema> | |||
<CODE ENDS> | <CODE ENDS> | |||
6. Appendix B - YANG Module for Partial Locking (non-normative) | Appendix B. YANG Module for Partial Locking (Non-Normative) | |||
The following YANG module defines the <partial-lock> and <partial- | The following YANG module defines the <partial-lock> and <partial- | |||
unlock> operations. The YANG language is defined in | unlock> operations. The YANG language is defined in [YANG]. | |||
[I-D.ietf-netmod-yang]. | ||||
-- RFC Ed.: Insert license information for code as appropriate | ||||
<CODE BEGINS> | <CODE BEGINS> | |||
module ietf-netconf-partial-lock { | module ietf-netconf-partial-lock { | |||
namespace urn:ietf:params:xml:ns:netconf:partial-lock:1.0; | namespace urn:ietf:params:xml:ns:netconf:partial-lock:1.0; | |||
prefix pl; | prefix pl; | |||
organization "IETF Network Configuration (netconf) Working Group"; | organization "IETF Network Configuration (netconf) Working Group"; | |||
contact | contact | |||
skipping to change at page 18, line 36 | skipping to change at page 17, line 34 | |||
Balazs Lengyel | Balazs Lengyel | |||
Ericsson | Ericsson | |||
balazs.lengyel@ericsson.com"; | balazs.lengyel@ericsson.com"; | |||
description | description | |||
"This YANG module defines the <partial-lock> and | "This YANG module defines the <partial-lock> and | |||
<partial-unlock> operations."; | <partial-unlock> operations."; | |||
revision 2009-10-19 { | revision 2009-10-19 { | |||
description | description | |||
"Initial version, published as RFC yyyy."; | "Initial version, published as RFC 5717."; | |||
// RFC Ed.: replace yyyy with actual RFC number & remove this note. | ||||
} | } | |||
typedef lock-id-type { | typedef lock-id-type { | |||
type uint32; | type uint32; | |||
description | description | |||
"A number identifying a specific partial-lock granted to a session. | "A number identifying a specific partial-lock granted to a session. | |||
It is allocated by the system, and SHOULD be used in the | It is allocated by the system, and SHOULD be used in the | |||
partial-unlock operation."; | partial-unlock operation."; | |||
} | } | |||
skipping to change at page 19, line 17 | skipping to change at page 18, line 14 | |||
"XPath expression that specifies the scope of the lock. | "XPath expression that specifies the scope of the lock. | |||
An Instance Identifier expression MUST be used unless the | An Instance Identifier expression MUST be used unless the | |||
:xpath capability is supported, in which case any XPath 1.0 | :xpath capability is supported, in which case any XPath 1.0 | |||
expression is allowed."; | expression is allowed."; | |||
} | } | |||
} | } | |||
output { | output { | |||
leaf lock-id { | leaf lock-id { | |||
type lock-id-type; | type lock-id-type; | |||
description | description | |||
"Identifies the lock, if granted. The lock-id SHOULD be | "Identifies the lock, if granted. The lock-id SHOULD be | |||
used in the partial-unlock rpc."; | used in the partial-unlock rpc."; | |||
} | } | |||
leaf-list locked-node { | leaf-list locked-node { | |||
type instance-identifier; | type instance-identifier; | |||
min-elements 1; | min-elements 1; | |||
description | description | |||
"List of locked nodes in the running datastore"; | "List of locked nodes in the running datastore"; | |||
} | } | |||
} | } | |||
} | } | |||
rpc partial-unlock { | rpc partial-unlock { | |||
description | description | |||
"A NETCONF operation that releases a previously acquired | "A NETCONF operation that releases a previously acquired | |||
partial-lock."; | partial-lock."; | |||
input { | input { | |||
leaf lock-id { | leaf lock-id { | |||
type lock-id-type; | type lock-id-type; | |||
description | description | |||
"Identifies the lock to be released. MUST be the value | "Identifies the lock to be released. MUST be the value | |||
received in the response to a partial-lock operation."; | received in the response to a partial-lock operation."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
<CODE ENDS> | <CODE ENDS> | |||
7. Appendix C - Usage Example - Reserving nodes for future editing | Appendix C. Usage Example - Reserving Nodes for Future Editing | |||
(non-normative) | (Non-Normative) | |||
Partial lock cannot be used to lock non-existent nodes, which would | Partial lock cannot be used to lock non-existent nodes, which would | |||
effectively attempt to reserve them for future use. To guarantee | effectively attempt to reserve them for future use. To guarantee | |||
that a node cannot be created by some other session, the parent node | that a node cannot be created by some other session, the parent node | |||
should be locked, the top level node of the new subtree created, and | should be locked, the top-level node of the new subtree created, and | |||
then locked with another <partial-lock> operation. After this, the | then locked with another <partial-lock> operation. After this, the | |||
lock on the parent node should be removed. | lock on the parent node should be removed. | |||
In this chapter an example illustrating the above is given. | In this section, an example illustrating the above is given. | |||
We want to create <user> Joe under <users>, and start editing it. | We want to create <user> Joe under <users>, and start editing it. | |||
Editing might take a number of minutes. We want to immediately lock | Editing might take a number of minutes. We want to immediately lock | |||
Joe so no one will touch it before we are finished with the editing. | Joe so no one will touch it before we are finished with the editing. | |||
We also want to minimize locking other parts of the running datastore | We also want to minimize locking other parts of the running datastore | |||
as multiple managers might be adding users near simultaneously. | as multiple managers might be adding users near simultaneously. | |||
First we check what users are already defined. | First, we check what users are already defined. | |||
Step 1 - Read existing users | Step 1 - Read existing users | |||
<rpc message-id="101" | <rpc message-id="101" | |||
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> | xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> | |||
<get-config> | <get-config> | |||
<source> | <source> | |||
<running/> | <running/> | |||
</source> | </source> | |||
<filter type="subtree"> | <filter type="subtree"> | |||
skipping to change at page 21, line 21 | skipping to change at page 20, line 21 | |||
<users> | <users> | |||
<user> | <user> | |||
<name>fred</name> | <name>fred</name> | |||
<phone>8327</phone> | <phone>8327</phone> | |||
</user> | </user> | |||
</users> | </users> | |||
</top> | </top> | |||
</data> | </data> | |||
</rpc-reply> | </rpc-reply> | |||
We want to add the new user "Joe" and immediately lock him using | We want to add the new user Joe and immediately lock him using | |||
partial locking. The way to do this, is to first lock all <user> | partial locking. The way to do this, is to first lock all <user> | |||
nodes by locking the <users> node. | nodes by locking the <users> node. | |||
Note that if we would lock all the <user> nodes using the select | Note that if we would lock all the <user> nodes using the select | |||
expression '/usr:top/usr:users/usr:user' ; this would not lock the | expression '/usr:top/usr:users/usr:user'; this would not lock the new | |||
new user "Joe", which we will create after locking. So we rather | user Joe, which we will create after locking. So we rather have to | |||
have to lock the <users> node. | lock the <users> node. | |||
Step 3 - Lock users | Step 3 - Lock users | |||
<nc:rpc | <nc:rpc | |||
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | |||
xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | |||
message-id="102"> | message-id="102"> | |||
<partial-lock> | <partial-lock> | |||
<select xmlns:usr="http://example.com/users"> | <select xmlns:usr="http://example.com/users"> | |||
/usr:top/usr:users | /usr:top/usr:users | |||
skipping to change at page 22, line 17 | skipping to change at page 21, line 17 | |||
<nc:rpc-reply | <nc:rpc-reply | |||
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | |||
xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | |||
message-id="102"> | message-id="102"> | |||
<lock-id>1</lock-id> | <lock-id>1</lock-id> | |||
<locked-node xmlns:usr="http://example.com/users"> | <locked-node xmlns:usr="http://example.com/users"> | |||
/usr:top/usr:users | /usr:top/usr:users | |||
</locked-node> | </locked-node> | |||
</nc:rpc-reply> | </nc:rpc-reply> | |||
Next we create user Joe. Joe is protected by the lock received above, | Next we create user Joe. Joe is protected by the lock received | |||
as it is under the sub-tree rooted at the <users> node. | above, as it is under the subtree rooted at the <users> node. | |||
Step 5 - Create user Joe | Step 5 - Create user Joe | |||
<rpc message-id="103" | <rpc message-id="103" | |||
xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> | xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> | |||
<edit-config> | <edit-config> | |||
<target> | <target> | |||
<running/> | <running/> | |||
</target> | </target> | |||
<config> | <config> | |||
skipping to change at page 23, line 19 | skipping to change at page 22, line 19 | |||
xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | |||
message-id="104"> | message-id="104"> | |||
<partial-lock> | <partial-lock> | |||
<select xmlns:usr="http://example.com/users"> | <select xmlns:usr="http://example.com/users"> | |||
/usr:top/usr:users/user[usr:name="Joe"]" | /usr:top/usr:users/user[usr:name="Joe"]" | |||
</select> | </select> | |||
</partial-lock> | </partial-lock> | |||
</nc:rpc> | </nc:rpc> | |||
The NETCONF server grants the partial lock. The scope of this second | The NETCONF server grants the partial lock. The scope of this second | |||
lock includes only the <user> node with name Joe. The lock protects | lock includes only the <user> node with name Joe. The lock protects | |||
all data below this particular <user> node. | all data below this particular <user> node. | |||
Step 7 - Receive lock | Step 7 - Receive lock | |||
<nc:rpc-reply | <nc:rpc-reply | |||
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | |||
xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | |||
message-id="104"> | message-id="104"> | |||
<lock-id>2</lock-id> | <lock-id>2</lock-id> | |||
<locked-node xmlns:usr="http://example.com/users"> | <locked-node xmlns:usr="http://example.com/users"> | |||
/usr:top/usr:users/user[usr:name="Joe"]" | /usr:top/usr:users/user[usr:name="Joe"]" | |||
</locked-node> | </locked-node> | |||
</nc:rpc-reply> | </nc:rpc-reply> | |||
The scope of the second lock is the <user> node Joe. It protects this | The scope of the second lock is the <user> node Joe. It protects | |||
<user> node and any data below it (e.g. phone number). At this point | this <user> node and any data below it (e.g., phone number). At this | |||
of time these nodes are protected both by the first and second lock. | point of time, these nodes are protected both by the first and second | |||
Next we unlock the other <user>s and the <users> node, to allow other | lock. Next, we unlock the other <user>s and the <users> node, to | |||
managers to work on them. We still keep the second lock, so the | allow other managers to work on them. We still keep the second lock, | |||
<user> node Joe and the sub-tree below is still protected. | so the <user> node Joe and the subtree below is still protected. | |||
Step 8 - Release lock on <users> | Step 8 - Release lock on <users> | |||
<nc:rpc xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | <nc:rpc xmlns="urn:ietf:params:xml:ns:netconf:partial-lock:1.0" | |||
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" | |||
message-id="105"> | message-id="105"> | |||
<partial-unlock> | <partial-unlock> | |||
<lock-id>1</lock-id> | <lock-id>1</lock-id> | |||
</partial-unlock> | </partial-unlock> | |||
</nc:rpc> | </nc:rpc> | |||
8. Appendix D - Change Log | ||||
8.1. 10-11 | ||||
Minor clarifications | ||||
8.2. 09-10 | ||||
Clarifications | ||||
Only the running datastore can be locked | ||||
8.3. 08-09 | ||||
Clarifications | ||||
8.4. 07-08 | ||||
Clarifications | ||||
8.5. 06-07 | ||||
Changed XSD and YANG to allow additional proprietary datastores to be | ||||
locked. | ||||
8.6. 05-06 | ||||
Added usage example | ||||
Clarified error messages | ||||
Clarified interaction with edit-config continue-on-error | ||||
Improved YANG: indentation, canonical order, contact info | ||||
Added usage example in appendix C | ||||
Synchronized YANG and XSD | ||||
8.7. 04-05 | ||||
Language and editorial updates | ||||
all app-tags are with dashes without spaces | ||||
Added usage scenarios | ||||
Changed encoding | ||||
Clarified definitions, separated scope of lock and protected area | ||||
8.8. 03-04 | ||||
Minor clarifications | ||||
Added list of locked-nodes to the output of partial-lock. | ||||
Added <target> wrapper around datastore names. | ||||
Allowed atomic/one operation locking of datastore parts in multiple | ||||
datastores. | ||||
Improved English (hopefully) | ||||
Removed the <data> element from rpc-reply following the text of | ||||
rfc4741. | ||||
8.9. 02-03 | ||||
Minor clarifications | ||||
Same descriptions in XSD and YANG. | ||||
8.10. 01-02 | ||||
Made XSD normative | ||||
Clarified that no specific access control is assumed. | ||||
Clarified that non-existing nodes are NOT covered by the lock, even | ||||
if they where existing and covered by the lock when it was originally | ||||
granted. | ||||
Some rewording | ||||
Added app-tags for two of the error cases. | ||||
Made YANG an informative reference | ||||
Enhanced security considerations. | ||||
8.11. 00-01 | ||||
Added YANG module. | ||||
8.12. -00 | ||||
Created from draft-lengyel-ngo-partial-lock-01.txt | ||||
9. Acknowledgements | ||||
Thanks to Andy Bierman, Sharon Chisholm, Phil Shafer , David | ||||
Harrington, Mehmet Ersue, Wes Hardaker, Juergen Schoenwaelder, Washam | ||||
Fan and many other members of the NETCONF WG for providing important | ||||
input to this document. | ||||
10. References | ||||
10.1. Normative References | ||||
[NETCONF] Enns, R., "NETCONF Configuration Protocol", RFC 4741, | ||||
December 2006. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | ||||
Requirement Levels", BCP 14, RFC 2119, March 1997. | ||||
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | ||||
January 2004. | ||||
10.2. Informative References | ||||
[I-D.ietf-netmod-yang] | ||||
Bjorklund, M., "YANG - A data modeling language for | ||||
NETCONF", draft-ietf-netmod-yang-07 (work in progress), | ||||
July 2009. | ||||
Authors' Addresses | Authors' Addresses | |||
Balazs Lengyel | Balazs Lengyel | |||
Ericsson | Ericsson | |||
Email: balazs.lengyel@ericsson.com | EMail: balazs.lengyel@ericsson.com | |||
Martin Bjorklund | Martin Bjorklund | |||
Tail-f Systems | Tail-f Systems | |||
Email: mbj@tail-f.com | EMail: mbj@tail-f.com | |||
End of changes. 86 change blocks. | ||||
421 lines changed or deleted | 294 lines changed or added | |||
This html diff was produced by rfcdiff 1.37b. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |