Statistics
| Branch: | Tag: | Revision:

root / ncclient / operations / lock.py @ 0304f041

History | View | Annotate | Download (2.4 kB)

1 179b00d4 Shikhar Bhushan
# Copyright 2h009 Shikhar Bhushan
2 3043ae4a Shikhar Bhushan
#
3 3043ae4a Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 3043ae4a Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 3043ae4a Shikhar Bhushan
# You may obtain a copy of the License at
6 3043ae4a Shikhar Bhushan
#
7 3043ae4a Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 3043ae4a Shikhar Bhushan
#
9 3043ae4a Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 3043ae4a Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 3043ae4a Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 3043ae4a Shikhar Bhushan
# See the License for the specific language governing permissions and
13 3043ae4a Shikhar Bhushan
# limitations under the License.
14 3043ae4a Shikhar Bhushan
15 3043ae4a Shikhar Bhushan
'Locking-related NETCONF operations'
16 3043ae4a Shikhar Bhushan
17 ce5fb329 Shikhar Bhushan
from copy import deepcopy
18 ce5fb329 Shikhar Bhushan
19 dd225c7a Shikhar Bhushan
from rpc import RPC
20 6a2dfeb4 Shikhar Bhushan
21 dd225c7a Shikhar Bhushan
# TODO:
22 dd225c7a Shikhar Bhushan
# should have some way to parse session-id from a lock-denied error
23 94803aaf Shikhar Bhushan
24 a6c00291 Shikhar Bhushan
class Lock(RPC):
25 a7cb58ce Shikhar Bhushan
26 216bb34c Shikhar Bhushan
    "*<lock>* RPC"
27 216bb34c Shikhar Bhushan
28 1fca349b Shikhar Bhushan
    SPEC = {
29 1fca349b Shikhar Bhushan
        'tag': 'lock',
30 179b00d4 Shikhar Bhushan
        'subtree': {
31 1fca349b Shikhar Bhushan
            'tag': 'target',
32 179b00d4 Shikhar Bhushan
            'subtree': {'tag': None }
33 1fca349b Shikhar Bhushan
        }
34 1fca349b Shikhar Bhushan
    }
35 a7cb58ce Shikhar Bhushan
36 6a2dfeb4 Shikhar Bhushan
    #REPLY_CLS = LockReply
37 6a2dfeb4 Shikhar Bhushan
38 216bb34c Shikhar Bhushan
    def request(self, target):
39 216bb34c Shikhar Bhushan
        """
40 216bb34c Shikhar Bhushan
        :arg target: see :ref:`source_target`
41 216bb34c Shikhar Bhushan
        :type target: string
42 216bb34c Shikhar Bhushan

43 216bb34c Shikhar Bhushan
        :rtype: :ref:`return`
44 216bb34c Shikhar Bhushan
        """
45 ce5fb329 Shikhar Bhushan
        spec = deepcopy(Lock.SPEC)
46 179b00d4 Shikhar Bhushan
        spec['subtree']['subtree']['tag'] = target
47 216bb34c Shikhar Bhushan
        return self._request(spec)
48 6c1f8a66 Shikhar Bhushan
49 6625258b Shikhar Bhushan
50 a6c00291 Shikhar Bhushan
class Unlock(RPC):
51 a7cb58ce Shikhar Bhushan
52 216bb34c Shikhar Bhushan
    "*<unlock>* RPC"
53 216bb34c Shikhar Bhushan
54 1fca349b Shikhar Bhushan
    SPEC = {
55 1fca349b Shikhar Bhushan
        'tag': 'unlock',
56 179b00d4 Shikhar Bhushan
        'subtree': {
57 1fca349b Shikhar Bhushan
            'tag': 'target',
58 179b00d4 Shikhar Bhushan
            'subtree': {'tag': None }
59 1fca349b Shikhar Bhushan
        }
60 1fca349b Shikhar Bhushan
    }
61 a7cb58ce Shikhar Bhushan
62 216bb34c Shikhar Bhushan
    def request(self, target):
63 216bb34c Shikhar Bhushan
        """
64 216bb34c Shikhar Bhushan
        :arg target: see :ref:`source_target`
65 216bb34c Shikhar Bhushan
        :type target: string
66 216bb34c Shikhar Bhushan

67 216bb34c Shikhar Bhushan
        :rtype: :ref:`return`
68 216bb34c Shikhar Bhushan
        """
69 ce5fb329 Shikhar Bhushan
        spec = deepcopy(Unlock.SPEC)
70 179b00d4 Shikhar Bhushan
        spec['subtree']['subtree']['tag'] = target
71 216bb34c Shikhar Bhushan
        return self._request(spec)
72 d6688264 Shikhar Bhushan
73 d6688264 Shikhar Bhushan
74 d6688264 Shikhar Bhushan
class LockContext:
75 a7cb58ce Shikhar Bhushan
76 216bb34c Shikhar Bhushan
    """
77 216bb34c Shikhar Bhushan
    A context manager for the :class:`Lock` / :class:`Unlock` pair of RPC's.
78 0304f041 Shikhar Bhushan
    
79 0304f041 Shikhar Bhushan
    RPC errors are always raised as exceptions.
80 0304f041 Shikhar Bhushan
    
81 216bb34c Shikhar Bhushan
    Initialise with session instance (:class:`Session
82 216bb34c Shikhar Bhushan
    <ncclient.transport.Session>`) and lock target (:ref:`source_target`)
83 216bb34c Shikhar Bhushan
    """
84 216bb34c Shikhar Bhushan
85 179b00d4 Shikhar Bhushan
    def __init__(self, session, target):
86 d6688264 Shikhar Bhushan
        self.session = session
87 d6688264 Shikhar Bhushan
        self.target = target
88 a7cb58ce Shikhar Bhushan
89 d6688264 Shikhar Bhushan
    def __enter__(self):
90 179b00d4 Shikhar Bhushan
        reply = Lock(self.session).request(self.target)
91 0304f041 Shikhar Bhushan
        if not reply.ok: # an error locking should definitely always be raised
92 179b00d4 Shikhar Bhushan
            raise reply.error
93 179b00d4 Shikhar Bhushan
        else:
94 179b00d4 Shikhar Bhushan
            return self
95 a7cb58ce Shikhar Bhushan
96 179b00d4 Shikhar Bhushan
    def __exit__(self, *args):
97 0b7d3b31 Shikhar Bhushan
        reply = Unlock(self.session).request(self.target)
98 179b00d4 Shikhar Bhushan
        if not reply.ok:
99 179b00d4 Shikhar Bhushan
            raise reply.error
100 d6688264 Shikhar Bhushan
        return False