draft-ietf-netconf-partial-lock-04.txt | draft-ietf-netconf-partial-lock-05.txt | |||
---|---|---|---|---|
NETCONF B. Lengyel | NETCONF B. Lengyel | |||
Internet-Draft Ericsson | Internet-Draft Ericsson | |||
Intended status: Standards Track M. Bjorklund | Intended status: Standards Track M. Bjorklund | |||
Expires: May 2, 2009 Tail-f Systems | Expires: June 11, 2009 Tail-f Systems | |||
October 29, 2008 | December 08, 2008 | |||
Partial Lock RPC for NETCONF | Partial Lock RPC for NETCONF | |||
draft-ietf-netconf-partial-lock-04 | draft-ietf-netconf-partial-lock-05 | |||
Status of this Memo | Status of this Memo | |||
By submitting this Internet-Draft, each author represents that any | By submitting this Internet-Draft, each author represents that any | |||
applicable patent or other IPR claims of which he or she is aware | applicable patent or other IPR claims of which he or she is aware | |||
have been or will be disclosed, and any of which he or she becomes | have been or will be disclosed, and any of which he or she becomes | |||
aware will be disclosed, in accordance with Section 6 of BCP 79. | aware will be disclosed, in accordance with Section 6 of BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF), its areas, and its working groups. Note that | Task Force (IETF), its areas, and its working groups. Note that | |||
skipping to change at page 1, line 35 | skipping to change at page 1, line 35 | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
The list of current Internet-Drafts can be accessed at | The list of current Internet-Drafts can be accessed at | |||
http://www.ietf.org/ietf/1id-abstracts.txt. | http://www.ietf.org/ietf/1id-abstracts.txt. | |||
The list of Internet-Draft Shadow Directories can be accessed at | The list of Internet-Draft Shadow Directories can be accessed at | |||
http://www.ietf.org/shadow.html. | http://www.ietf.org/shadow.html. | |||
This Internet-Draft will expire on May 2, 2009. | This Internet-Draft will expire on June 11, 2009. | |||
Copyright Notice | Copyright Notice | |||
Copyright (C) The IETF Trust (2008). | Copyright (C) The IETF Trust (2008). | |||
Abstract | Abstract | |||
The NETCONF protocol defines the lock and unlock RPCs, used to lock | The NETCONF protocol defines the lock and unlock RPCs, used to lock | |||
entire configuration datastores. In some situations, a way to lock | entire configuration datastores. In some situations, a way to lock | |||
only parts of a configuration datastore is required. This document | only parts of a configuration datastore is required. This document | |||
defines a capability-based extension to the NETCONF protocol for | defines a capability-based extension to the NETCONF protocol for | |||
locking portions of a configuration datastore. | locking portions of a configuration datastore. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Definition of Terms . . . . . . . . . . . . . . . . . . . 3 | 1.1. Definition of Terms . . . . . . . . . . . . . . . . . . . 3 | |||
2. Partial Locking Capability . . . . . . . . . . . . . . . . . . 3 | 2. Partial Locking Capability . . . . . . . . . . . . . . . . . . 3 | |||
2.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2.2. Dependencies . . . . . . . . . . . . . . . . . . . . . . . 4 | 2.1.1. Usage Scenarios . . . . . . . . . . . . . . . . . . . 4 | |||
2.3. Capability Identifier . . . . . . . . . . . . . . . . . . 4 | 2.2. Dependencies . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
2.4. New Operations . . . . . . . . . . . . . . . . . . . . . . 4 | 2.3. Capability Identifier . . . . . . . . . . . . . . . . . . 5 | |||
2.4.1. <partial-lock> . . . . . . . . . . . . . . . . . . . . 4 | 2.4. New Operations . . . . . . . . . . . . . . . . . . . . . . 5 | |||
2.4.2. <partial-unlock> . . . . . . . . . . . . . . . . . . . 8 | 2.4.1. <partial-lock> . . . . . . . . . . . . . . . . . . . . 6 | |||
2.5. Modifications to Existing Operations . . . . . . . . . . . 9 | 2.4.2. <partial-unlock> . . . . . . . . . . . . . . . . . . . 10 | |||
2.6. Interactions with Other Capabilities . . . . . . . . . . . 9 | 2.5. Modifications to Existing Operations . . . . . . . . . . . 11 | |||
2.6.1. Candidate Configuration Capability . . . . . . . . . . 9 | 2.6. Interactions with Other Capabilities . . . . . . . . . . . 12 | |||
2.6.2. Confirmed Commit Capability . . . . . . . . . . . . . 9 | 2.6.1. Candidate Configuration Capability . . . . . . . . . . 12 | |||
2.6.3. Distinct Startup Capability . . . . . . . . . . . . . 10 | 2.6.2. Confirmed Commit Capability . . . . . . . . . . . . . 12 | |||
3. Security Considerations . . . . . . . . . . . . . . . . . . . 10 | 2.6.3. Distinct Startup Capability . . . . . . . . . . . . . 12 | |||
4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 11 | 3. Security Considerations . . . . . . . . . . . . . . . . . . . 12 | |||
5. Appendix A - XML Schema for Partial Locking (normative) . . 12 | 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 13 | |||
5. Appendix A - XML Schema for Partial Locking (normative) . . 14 | ||||
6. Appendix B - YANG Module for Partial Locking | 6. Appendix B - YANG Module for Partial Locking | |||
(non-normative) . . . . . . . . . . . . . . . . . . . . . . . 16 | (non-normative) . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
7. Appendix C - Change Log . . . . . . . . . . . . . . . . . . 19 | 7. Appendix C - Change Log . . . . . . . . . . . . . . . . . . 21 | |||
7.1. 03-04 . . . . . . . . . . . . . . . . . . . . . . . . . . 19 | 7.1. 04-05 . . . . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
7.2. 02-03 . . . . . . . . . . . . . . . . . . . . . . . . . . 19 | 7.2. 03-04 . . . . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
7.3. 01-02 . . . . . . . . . . . . . . . . . . . . . . . . . . 19 | 7.3. 02-03 . . . . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
7.4. 00-01 . . . . . . . . . . . . . . . . . . . . . . . . . . 19 | 7.4. 01-02 . . . . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
7.5. -00 . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 | 7.5. 00-01 . . . . . . . . . . . . . . . . . . . . . . . . . . 22 | |||
8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 21 | 7.6. -00 . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 | |||
9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 22 | 8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
9.1. Normative References . . . . . . . . . . . . . . . . . . . 22 | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
9.2. Informative References . . . . . . . . . . . . . . . . . . 22 | 9.1. Normative References . . . . . . . . . . . . . . . . . . . 24 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 23 | 9.2. Informative References . . . . . . . . . . . . . . . . . . 24 | |||
Intellectual Property and Copyright Statements . . . . . . . . . . 24 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
Intellectual Property and Copyright Statements . . . . . . . . . . 26 | ||||
1. Introduction | 1. Introduction | |||
The NETCONF protocol [NETCONF] describes the lock and unlock RPCs | The [NETCONF] protocol describes the lock and unlock operations that | |||
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 an | configuration datastore is needed. This document defines a | |||
extension to the NETCONF protocol to allow this. | capability based extension to the NETCONF protocol to support partial | |||
locking of NETCONF datastores using a mechanism based on the existing | ||||
The mechanism for partial locking is based on the existing XPath | XPath filtering mechanisms. | |||
filtering mechanisms. | ||||
Partial locking is defined as a capability to NETCONF. | ||||
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: | ||||
o Instance Identifier: an XPath expression identifying a specific | ||||
node in the conceptual XML datastore. It contains an absolute | ||||
path expression in abbreviated syntax, where predicates are used | ||||
only to specify values for nodes defined as keys to distinguish | ||||
multiple instances. | ||||
o Scope of the lock: initially the set of nodes returned by the | ||||
XPath expressions in a successful partial-lock operation. The set | ||||
might be modified if some of the nodes are deleted. | ||||
o Protected area: the set of nodes that are protected from | ||||
modification by the lock. This consist of nodes in the scope of | ||||
the lock and nodes in subtrees under them. | ||||
2. Partial Locking Capability | 2. Partial Locking Capability | |||
2.1. Overview | 2.1. Overview | |||
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 covers configuration data, but not state data. | locking only affects configuration data. | |||
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 SNMP and the 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 one or more datastores | A NETCONF session MAY have multiple parts of one or more datastores | |||
(running, candidate, startup) locked using partial lock operations. | (running, candidate, startup) 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. | successfully acquired lock. | |||
2.1.1. Usage Scenarios | ||||
In the following we describe a few scenarios for partial locking. | ||||
While scenarios using the running datastore are seen as the most | ||||
important, as an example a scenario involving the candidate datastore | ||||
is also presented. Besides the three described here, there are many | ||||
other usage scenarios possible. | ||||
2.1.1.1. Multiple managers handling the writable running datastore | ||||
Multiple managers are handling the same NETCONF agent simultaneously. | ||||
The agent is handled via the writable running datastore. Each | ||||
manager has his or her own task, which might involve the modification | ||||
of overlapping sections of the datastore. | ||||
After collecting and analyzing input and preparing the NETCONF | ||||
operations off-line, the manager locks the areas that are important | ||||
for his task using one single <partial-lock> operation. The manager | ||||
executes a number of <edit-config> operations to modify the | ||||
configuration, then releases the partial-lock. The lock should be | ||||
held for only a short time (seconds rather then minutes). The | ||||
manager should collect all human input before locking anything. As | ||||
each manager locks only a part of the data model, usually multiple | ||||
operators can execute the <edit-config> operations simultaneously. | ||||
2.1.1.2. Multiple managers handling the writable running datastore, | ||||
distinct management areas | ||||
Multiple managers are handling the same NETCONF agent simultaneously. | ||||
The agent is handled via the writable running datastore. The agent's | ||||
data model contains a number of well defined separate areas that can | ||||
be configured without impacting other areas. An example can be a | ||||
server with multiple applications running on it, or a number of a | ||||
network elements with a common NETCONF agent for management. | ||||
Each manager has his or her own task, which does not involve the | ||||
modification of overlapping sections of the datastore. | ||||
The manager locks his area with a <partial-lock> operation, uses a | ||||
number of <edit-config> commands to modify it, later releases the | ||||
lock. As each manager has his functional area assigned to him, and | ||||
he locks only that area, multiple managers can edit the configuration | ||||
simultaneously. Locks can be held for extended periods (minutes, | ||||
hours), as this will not hinder other managers. | ||||
This scenario assumes, that the global lock operation from [NETCONF] | ||||
is not used. | ||||
2.1.1.3. Multiple managers handling the candidate datastore in a semi- | ||||
coordinated work mode | ||||
Multiple managers are handling the same NETCONF agent simultaneously. | ||||
The agent is handled via the candidate datastore. Each manager has | ||||
his or her own task which might involve the modification of | ||||
overlapping sections of the datastore. | ||||
After collecting and analyzing input and preparing the NETCONF | ||||
operations off-line, the manager locks the areas that are important | ||||
for his task using one single <partial-lock> operation in both the | ||||
candidate and the running datastore. He executes a number of <edit- | ||||
config> operations to modify the configuration, then releases the | ||||
partial-lock. The lock should be held for only a short time (seconds | ||||
rather then minutes). | ||||
Operators coordinate with each other. When all of them finish their | ||||
tasks one of them orders commit. If any of the operators are still | ||||
working, and holds a lock, the commit will fail, and will need to be | ||||
repeated after all managers finish. | ||||
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, the device MUST also support using any | capability is also supported (as defined in [NETCONF] chapter 8.9. | |||
XPath 1.0 expression in the select element. | XPath Capability), the device MUST also support using any XPath 1.0 | |||
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> | |||
The <partial-lock> operation allows the client to lock a portion of | The <partial-lock> operation allows the client to lock a portion of | |||
one or more datastores. The portion to lock is specified with XPath | one or more datastores. The portion to lock is specified with XPath | |||
expressions in the select elements and the list of datastores in the | expressions in the "select" elements and the list of datastores in | |||
target element in the <partial-lock> operation. Each XPath | the "target" elements in the <partial-lock> operation. Each XPath | |||
expression MUST return a node set. Locking a node also protects the | expression MUST return a node set. | |||
complete subtree under the node from modification by others. | ||||
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 | ||||
in the hierarchy of nodes beneath it. | ||||
Locking a node protects the node itself and the complete subtree | ||||
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 | ||||
nodes in the subtrees under them make up the protected area. | ||||
In some situations it is desirable that the same set of nodes are | In some situations it is desirable that the same set of nodes are | |||
locked in more than one datastore. As an example: if an interface is | locked in more than one datastore. For example, if an interface is | |||
configured in the candidate datastore, it is dangerous if it is | configured in the candidate datastore, it is dangerous for it to be | |||
configured by someone else in a possibly conflicting manner in the | configured by someone else in a possibly conflicting manner in the | |||
running datastore. For this reason <partial-lock> allows the locking | running datastore. For this reason <partial-lock> allows the locking | |||
of the same sections of the management data in one or multiple | of the same sections of the management data in multiple datastores. | |||
datastores. | ||||
The select 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, | |||
If the configuration data is later altered in a way that would make | i.e. the returned nodeset, and not by the XPath expression. If the | |||
the original select XPath expressions evaluate to a different set of | configuration data is later altered in a way that would make the | |||
nodes, this does not affect the scope of the partial lock. | original XPath expressions evaluate to a different set of nodes, this | |||
does not affect the scope of the partial lock. | ||||
XPath is only used for the creation of the partial lock. | Let's say the agent's data model includes a list of users. If the | |||
Conceptually, the scope of the lock is defined by the returned node | XPath expression in the partial lock operation covers all users at | |||
set and not by the XPath expression. | locking, the scope of the lock will be maintained as the list of | |||
"user" nodes at the time when the lock was granted. If someone later | ||||
creates a new user, this new user will not be included in the locked- | ||||
nodes list created previously, the new user 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 | server. The server either locks all requested parts of the | |||
datastore(s) or none. That is, if during the <partial-lock> | datastore(s) or none. If during the <partial-lock> operation one of | |||
operation one of the requested parts cannot be locked, the server | the requested parts cannot be locked, the server MUST unlock all | |||
MUST unlock all parts that were previously locked during that | parts that have already been locked during that operation. | |||
operation. | ||||
If a node is locked by a session, only that same session is able to | ||||
modify that node or any node in the subtree underneath it. | ||||
If a top level node of a locked subtree is deleted, any other session | If a node in the scope of the lock is deleted, it is removed from the | |||
can recreate it, as it is no longer covered by the lock. If all top | scope of the lock, so any other session or non-NETCONF mechanism can | |||
level nodes are deleted, the lock will still be present. However, | recreate it. If all nodes in the scope of the lock are deleted, the | |||
its scope will become nil (i.e., the lock will not cover any nodes). | lock will still be present. However, its scope will become empty | |||
(since the lock will not cover any nodes). | ||||
A NETCONF server MUST be able to grant multiple simultaneous partial | A NETCONF server MUST be able to grant multiple simultaneous partial | |||
locks to a single NETCONF session. If the scope of the individual | locks to a single NETCONF session. If the protected area of the | |||
locks overlaps, nodes in the common area MUST be locked until all of | individual locks overlaps, nodes in the common area MUST be protected | |||
the locks are released. | until all of the locks are 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 any target datastore. | global lock on any target datastore. | |||
o Any part of the scope to be locked is already locked by another | o Any part of the area to be protected is already locked (or | |||
management session/protocol, including other NETCONF sessions | protected by partial locking) by another management session, | |||
using the <partial-lock> or any other non-NETCONF management | including other NETCONF sessions using <partial-lock> or any other | |||
method. | non-NETCONF management method. | |||
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 rights to all parts of a datastore | does not have sufficient access rights. The exact handling of | |||
section to be locked. The exact handling of access rights is | access rights is outside the scope of this document, but it is | |||
outside the scope of this document, but it is assumed that there | assumed that there is an access control system that MAY deny or | |||
is an access control system that MAY deny or allow the partial | allow the partial lock operation. | |||
lock operation. | ||||
As with most locking systems, it is possible that two management | ||||
sessions trying to lock different parts of the configuration could | ||||
become dead-locked. To avoid this situation, clients SHOULD lock | ||||
everything they need in one operation. If that operation fails, the | ||||
client SHOULD back down, release any previously acquired locks, and | ||||
retry the procedure after waiting some time interval. The length of | ||||
the interval SHOULD be random to avoid repeated dead-locks when both | ||||
(or all) clients back down and then retry 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. There are some other issues that are | that are locked for writing. As a consequence users must observe the | |||
intentionally not addressed: | following: | |||
o Locking does not affect read operations. | o Locking does not affect read operations. | |||
o If part of a datastore is locked, this has no effect on any | o If part of a datastore is locked, this has no effect on any | |||
unlocked parts of the datastore. If this is a problem (e.g., | unlocked parts of the datastore. If this is a problem (e.g., | |||
changes depend on data values in the unlocked part of the | changes depend on data values or nodes outside the protected part | |||
datastore), these values SHOULD be included in the scope of the | of the datastore), these nodes should be included in the protected | |||
lock. | area of the lock. | |||
o Configuration data can be edited both inside and outside the scope | o Configuration data can be edited both inside and outside the | |||
of a lock. It is the responsibility of the NETCONF client | protected area of a lock. It is the responsibility of the NETCONF | |||
application to lock all relevant parts of a datastore that are | client application to lock all relevant parts of a datastore that | |||
crucial for a specific management action. | 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 | |||
a datastore is already locked by <partial-lock>, then a global lock | a datastore is already locked by <partial-lock>, then a global lock | |||
for that datastore MUST fail even if the global lock is requested by | for that datastore MUST fail even if the global lock is requested by | |||
the NETCONF session that owns the partial lock. | the NETCONF session that owns the partial lock. | |||
2.4.1.1. Parameters, Result, Examples | 2.4.1.1. Parameters, Result, Examples | |||
Parameters: | Parameters: | |||
target: Name of one or more configuration datastores of which a part | target: Name of one or more configuration datastores of which a part | |||
shall be locked. If multiple datastores are specified the same | shall be locked. If multiple datastores are specified the same | |||
select parameter(s) are used for all of them. For each datastore | select parameter(s) are evaluated for each of them. | |||
locking of the same set of nodes will be requested. | ||||
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 where | |||
the context node is the root of the server's conceptual data | the context node is the root of the server's conceptual data | |||
model, and the set of namespace declarations are those in scope | model, and the set of namespace declarations are those in scope | |||
on the select element. | on the select element. | |||
Each select expression is evaluated for each targeted datastore. | Each select expression is evaluated for each targeted datastore. | |||
The nodes that matched the select expression and are locked are | The nodes returned from the select expressions are reported in | |||
reported in the rpc-reply message. Note that if some of the | the rpc-reply message. | |||
requested nodes exist only in one of the datastores, the lock is | ||||
granted on different nodes in different datastores. | Note that if some of the requested nodes exist only in some of | |||
the targeted datastores, the lock is granted on different nodes | ||||
in different datastores. | ||||
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 the node sets for one of the specified datastores MUST be non- | of the node sets for one of the specified datastores MUST be non- | |||
empty. | 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 | |||
skipping to change at page 8, line 16 | skipping to change at page 10, line 15 | |||
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) is included. If needed the returned session-id may be used to | (zero) is included. If needed the returned session-id may be used to | |||
<kill-session> the NETCONF session holding the lock. The same error | <kill-session> the NETCONF session holding the lock. The same error | |||
response is returned if the requesting session already holds the | response is returned if the requesting session already holds the | |||
(global) lock for the same datastore. | (global) lock for the same datastore. | |||
If all the select expressions return an empty node set, the <error- | If all the select expressions return an empty node set, the <error- | |||
tag> is 'operation-failed', and the <error-app-tag> is 'no-matches'. | tag> is 'operation-failed', and the <error-app-tag> is 'no-matches'. | |||
If any select expression returns something other than a node set, the | If any select expression returns something other than a node set, the | |||
<error-tag> is 'invalid-value', the <error-app-tag> is 'XPath does | <error-tag> is 'invalid-value', the <error-app-tag> is 'not-a-node- | |||
not return a node set'. | set'. | |||
If the :xpath capability is not supported and the XPath expression is | If the :xpath capability is not supported and the XPath expression is | |||
not an Instance Identifier, the <error-tag> is 'invalid-value', the | not an Instance Identifier, the <error-tag> is 'invalid-value', the | |||
<error-app-tag> is ':xpath capability not supported'. | <error-app-tag> is 'invalid-lock-specification'. | |||
If access control denies the partial lock, the <error-tag> is | If access control denies the partial lock, the <error-tag> is | |||
'access-denied'. | 'access-denied'. | |||
2.4.1.2. Reserving model sections for future work | 2.4.1.2. Reserving nodes for future editing | |||
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 section created, and | should be locked, the top level node of the new section 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. | |||
2.4.1.3. Deadlock Avoidance | ||||
As with most locking systems, it is possible that two management | ||||
sessions trying to lock different parts of the configuration could | ||||
become dead-locked. To avoid this situation, clients should lock | ||||
everything they need in one operation. If locking fails, the client | ||||
should back-off, release any previously acquired locks, and 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 datastores that were | The operation unlocks the parts of the datastores that were | |||
previously locked using <partial-lock> during the same session. | previously locked using <partial-lock> during the same session. | |||
Parameters: | Parameters: | |||
lock-id: Lock identifier to unlock, taken from a reply to a previous | lock-id: Identity of the lock to be unlocked. This lock-id MUST | |||
<partial-lock> operation. | have been received as a response to a lock request by the manager | |||
during the current session, and MUST NOT have been 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> | |||
skipping to change at page 9, line 30 | skipping to change at page 11, line 35 | |||
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 which 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 it attempts to modify the locked area and is executed in a NETCONF | if that attempts to modify nodes in the protected area of the lock | |||
session other than the session that owns the lock. All operations | and is executed in a NETCONF session other than the session that has | |||
that modify the datastore are affected, including: <edit-config>, | been granted the lock. The <error-tag> 'in-use' and the <error-app- | |||
<copy-config>, <delete-config>, <commit> and <discard-changes>. A | tag> 'locked' is returned. All operations that modify the datastore | |||
successful partial lock will also cause the (global) <lock> operation | are affected, including: <edit-config>, <copy-config>, <delete- | |||
to fail. All of these operations are affected only if they are | config>, <commit> and <discard-changes>. If a datastore contains | |||
targeting the same datastore. | nodes locked by partial lock, this will cause the (global) <lock> | |||
operation to fail. The <error-tag> element '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-NETCONF session, a | ||||
<session-id> of 0 (zero) is returned. | ||||
All of these operations are affected only if they are targeting the | ||||
same 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 | |||
Partial locking of the candidate datastore can only be done if the | Partial locking of the candidate datastore can only be done if the | |||
:candidate capability is supported by the device. Partial locking of | :candidate capability is supported by the device. Partial locking of | |||
the candidate datastore does not depend on whether the datastore was | the candidate datastore does not depend on whether the datastore was | |||
modified or not. | modified or not. | |||
skipping to change at page 10, line 17 | skipping to change at page 12, line 30 | |||
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> 'Lock | In this case the <error-tag> 'in-use' and the <error-app-tag> | |||
denied, Outstanding confirmed commit' is returned. | 'outstanding-confirmed-commit' is returned. | |||
2.6.3. Distinct Startup Capability | 2.6.3. Distinct Startup Capability | |||
Partial locking of the startup datastore can only be done if the | Partial locking of the startup datastore can only be done if the | |||
:startup capability is supported by the device. | :startup capability is supported by the device. | |||
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]. It is assumed that the <partial-lock> and <partial- | [NETCONF]. It is assumed that the <partial-lock> and <partial- | |||
skipping to change at page 12, line 31 | skipping to change at page 14, line 31 | |||
contact | contact | |||
"Balazs Lengyel | "Balazs Lengyel | |||
Ericsson Hungary, Inc. | Ericsson Hungary, Inc. | |||
balazs.lengyel@ericsson.com" | balazs.lengyel@ericsson.com" | |||
</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:annotation> | ||||
<xs:documentation> | ||||
A number identifying a specific | ||||
partial-lock granted to a session. | ||||
It is allocated by the system, and SHOULD | ||||
be used in the unlock operation. | ||||
</xs:documentation> | ||||
</xs:annotation> | ||||
<xs:restriction base="xs:unsignedInt"/> | ||||
</xs:simpleType> | ||||
<xs:complexType name="partialLockType"> | <xs:complexType name="partialLockType"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
A NETCONF operation that locks part of one or more datastores. | A NETCONF operation that locks part of one or more datastores. | |||
</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="target"> | <xs:element name="target" maxOccurs="3"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
A list of one or more datastore names for NETCONF. | A list of one or more datastore names for NETCONF. | |||
Each target element MUST contain a different | ||||
datastore name. | ||||
</xs:documentation> | </xs:documentation> | |||
</xs:annotation> | </xs:annotation> | |||
<xs:complexType> | <xs:complexType> | |||
<xs:sequence> | <xs:choice> | |||
<xs:element name="startup" minOccurs="0"> | <xs:element name="startup" minOccurs="0"> | |||
<xs:complexType/> | <xs:complexType/> | |||
</xs:element> | </xs:element> | |||
<xs:element name="candidate" minOccurs="0"> | <xs:element name="candidate" minOccurs="0"> | |||
<xs:complexType/> | <xs:complexType/> | |||
</xs:element> | </xs:element> | |||
<xs:element name="running" minOccurs="0"> | <xs:element name="running" minOccurs="0"> | |||
<xs:complexType/> | <xs:complexType/> | |||
</xs:element> | </xs:element> | |||
</xs:sequence> | </xs:choice> | |||
</xs:complexType> | </xs:complexType> | |||
</xs:element> | </xs:element> | |||
<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 of the lock. | XPath expression that specifies the scope of the lock. | |||
An Instance Identifier expression must be used unless | An Instance Identifier expression must be used unless | |||
the :xpath capability is supported in which case any | the :xpath capability is supported in which case any | |||
XPath 1.0 expression is allowed. | XPath 1.0 expression is allowed. | |||
skipping to change at page 13, line 37 | skipping to change at page 15, line 51 | |||
<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="xs:unsignedInt"> | <xs:element name="lock-id" type="lock-id-type"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
Identifies the lock, SHOULD be used in the subsequent | Identifies the lock to be released. MUST be the value | |||
partial-lock operation. | received in the response to 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="dataPartInPpartialLockReplyType"> | <xs:complexType name="contentPartInPartialLockReplyType"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
In a reply to a successful partial-lock request the content | The content of the reply to a successful | |||
of the <rpc-reply> element 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="xs:unsignedInt"> | <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 the partial-lock operation. | received in the response to the partial-lock operation. | |||
</xs:documentation> | </xs:documentation> | |||
</xs:annotation> | </xs:annotation> | |||
</xs:element> | </xs:element> | |||
<xs:element name="running" minOccurs="0"> | <xs:element name="running" minOccurs="0"> | |||
<xs:annotation> | <xs:annotation> | |||
<xs:documentation> | <xs:documentation> | |||
skipping to change at page 16, line 11 | skipping to change at page 18, line 11 | |||
</xs:complexType> | </xs:complexType> | |||
</xs:schema> | </xs:schema> | |||
6. Appendix B - YANG Module for Partial Locking (non-normative) | 6. 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 | |||
[I-D.ietf-netmod-yang]. | [I-D.ietf-netmod-yang]. | |||
module 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 NETCONF Working Group"; | organization "IETF NETCONF Working Group"; | |||
contact | contact | |||
"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 2008-10-31 { | revision 2008-12-08 { | |||
description "Initial version."; | description "Initial version."; | |||
} | } | |||
grouping configNames { | typedef lock-id-type { | |||
container target { | description "A number identifying a specific | |||
description | partial-lock granted to a session. | |||
"A list of one or more datastore names."; | It is allocated by the system, and SHOULD | |||
leaf running { type empty; } | be used in the partial-unlock operation."; | |||
leaf candidate { type empty; } | type uint32; | |||
leaf startup { type empty; } | ||||
must "running or candidate or startup" { | ||||
error-message "At least one datastore must be specified."; | ||||
} | ||||
} | ||||
} | } | |||
rpc partial-lock { | rpc partial-lock { | |||
description | description | |||
"A NETCONF operation that locks part of one or more datastores."; | "A NETCONF operation that locks part of one or more datastores."; | |||
input { | input { | |||
uses configNames; | list target { | |||
description "A list of one or more datastore names. | ||||
Each list entry must contain a different datastore name."; | ||||
min-elements 1; | ||||
max-elements 3; | ||||
choice datastore { | ||||
leaf running { type empty; } | ||||
leaf candidate { type empty; } | ||||
leaf startup { type empty; } | ||||
} | ||||
} | ||||
leaf-list select { | leaf-list select { | |||
description | description | |||
"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."; | |||
type string; | type string; | |||
min-elements 1; | min-elements 1; | |||
} | } | |||
} | } | |||
output { | output { | |||
leaf lock-id { | leaf lock-id { | |||
description | description | |||
"Identifies the lock, if granted. The lock-id MUST be | "Identifies the lock, if granted. The lock-id SHOULD be | |||
used in the partial-unlock rpc."; | used in the partial-unlock rpc."; | |||
type uint32; | type lock-id-type; | |||
} | } | |||
container running { | container running { | |||
leaf-list locked-node { | leaf-list locked-node { | |||
description "List of locked nodes | description "List of locked nodes | |||
in the running datastore"; | in the running datastore"; | |||
type instance-identifier; | type instance-identifier; | |||
} | } | |||
} | } | |||
container candidate { | container candidate { | |||
leaf-list locked-node { | leaf-list locked-node { | |||
skipping to change at page 17, line 50 | skipping to change at page 20, line 7 | |||
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 { | |||
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 the partial-lock operation."; | received in the response to the partial-lock operation."; | |||
type uint32; | type lock-id-type; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
7. Appendix C - Change Log | 7. Appendix C - Change Log | |||
7.1. 03-04 | 7.1. 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 | ||||
7.2. 03-04 | ||||
Minor clarifications | Minor clarifications | |||
Added list of locked-nodes to the output of partial-lock. | Added list of locked-nodes to the output of partial-lock. | |||
Added <target> wrapper around datastore names. | Added <target> wrapper around datastore names. | |||
Allowed atomic/one operation locking of datastore parts in multiple | Allowed atomic/one operation locking of datastore parts in multiple | |||
datastores. | datastores. | |||
Improved English (hopefully) | Improved English (hopefully) | |||
Removed the <data> element from rpc-reply following the text of | Removed the <data> element from rpc-reply following the text of | |||
rfc4741. | rfc4741. | |||
7.2. 02-03 | 7.3. 02-03 | |||
Minor clarifications | Minor clarifications | |||
Same descriptions in XSD and YANG. | Same descriptions in XSD and YANG. | |||
7.3. 01-02 | 7.4. 01-02 | |||
Made XSD normative | Made XSD normative | |||
Clarified that no specific access control is assumed. | Clarified that no specific access control is assumed. | |||
Clarified that non-existing nodes are NOT covered by the lock, even | 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 | if they where existing and covered by the lock when it was originally | |||
granted. | granted. | |||
Some rewording | Some rewording | |||
skipping to change at page 19, line 40 | skipping to change at page 22, line 4 | |||
Made XSD normative | Made XSD normative | |||
Clarified that no specific access control is assumed. | Clarified that no specific access control is assumed. | |||
Clarified that non-existing nodes are NOT covered by the lock, even | 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 | if they where existing and covered by the lock when it was originally | |||
granted. | granted. | |||
Some rewording | Some rewording | |||
Added app-tags for two of the error cases. | Added app-tags for two of the error cases. | |||
Made YANG an informative reference | Made YANG an informative reference | |||
Enhanced security considerations. | Enhanced security considerations. | |||
7.4. 00-01 | 7.5. 00-01 | |||
Added YANG module. | Added YANG module. | |||
7.5. -00 | 7.6. -00 | |||
Created from draft-lengyel-ngo-partial-lock-01.txt | Created from draft-lengyel-ngo-partial-lock-01.txt | |||
8. Acknowledgements | 8. Acknowledgements | |||
Thanks to Andy Bierman, Sharon Chisholm, Phil Shafer , David | Thanks to Andy Bierman, Sharon Chisholm, Phil Shafer , David | |||
Harrington, Mehmet Ersue, Wes Hardaker and many other members of the | Harrington, Mehmet Ersue, Wes Hardaker and many other members of the | |||
NETCONF WG for providing important input to this document. | NETCONF WG for providing important input to this document. | |||
9. References | 9. References | |||
skipping to change at page 22, line 22 | skipping to change at page 24, line 22 | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | |||
January 2004. | January 2004. | |||
9.2. Informative References | 9.2. Informative References | |||
[I-D.ietf-netmod-yang] | [I-D.ietf-netmod-yang] | |||
Bjorklund, M., "YANG - A data modeling language for | Bjorklund, M., "YANG - A data modeling language for | |||
NETCONF", draft-ietf-netmod-yang-01 (work in progress), | NETCONF", draft-ietf-netmod-yang-02 (work in progress), | |||
August 2008. | November 2008. | |||
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 | |||
End of changes. 60 change blocks. | ||||
158 lines changed or deleted | 291 lines changed or added | |||
This html diff was produced by rfcdiff 1.35. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |