Statistics
| Branch: | Tag: | Revision:

root / ncclient / rpc / rpc.py @ a6c00291

History | View | Annotate | Download (3.3 kB)

1 589b23e4 Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 589b23e4 Shikhar Bhushan
#
3 589b23e4 Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 589b23e4 Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 589b23e4 Shikhar Bhushan
# You may obtain a copy of the License at
6 589b23e4 Shikhar Bhushan
#
7 589b23e4 Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 589b23e4 Shikhar Bhushan
#
9 589b23e4 Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 589b23e4 Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 589b23e4 Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 589b23e4 Shikhar Bhushan
# See the License for the specific language governing permissions and
13 589b23e4 Shikhar Bhushan
# limitations under the License.
14 589b23e4 Shikhar Bhushan
15 38a9b062 Shikhar Bhushan
from threading import Event, Lock
16 38a9b062 Shikhar Bhushan
from uuid import uuid1
17 1d540e60 Shikhar Bhushan
from weakref import WeakValueDictionary
18 38a9b062 Shikhar Bhushan
19 2f8bc438 Shikhar Bhushan
from ncclient.content import XMLConverter
20 1d540e60 Shikhar Bhushan
from ncclient.content import qualify as _
21 1d540e60 Shikhar Bhushan
from ncclient.content import unqualify as __
22 3e022b7b Shikhar Bhushan
from ncclient.glue import Listener
23 3e022b7b Shikhar Bhushan
24 94803aaf Shikhar Bhushan
from listener import RPCReplyListener
25 3e022b7b Shikhar Bhushan
from reply import RPCReply
26 3e022b7b Shikhar Bhushan
27 94803aaf Shikhar Bhushan
import logging
28 94803aaf Shikhar Bhushan
logger = logging.getLogger('ncclient.rpc')
29 1fca349b Shikhar Bhushan
30 5858a82c Shikhar Bhushan
class RPC(object):
31 5858a82c Shikhar Bhushan
    
32 d6688264 Shikhar Bhushan
    DEPENDS = []
33 d6688264 Shikhar Bhushan
    REPLY_CLS = RPCReply
34 d6688264 Shikhar Bhushan
    
35 94803aaf Shikhar Bhushan
    def __init__(self, session, async=False, timeout=None):
36 94803aaf Shikhar Bhushan
        if not session.can_pipeline:
37 94803aaf Shikhar Bhushan
            raise UserWarning('Asynchronous mode not supported for this device/session')
38 38a9b062 Shikhar Bhushan
        self._session = session
39 d6688264 Shikhar Bhushan
        try:
40 d6688264 Shikhar Bhushan
            for cap in self.DEPENDS:
41 a6c00291 Shikhar Bhushan
                self._assert(cap)
42 d6688264 Shikhar Bhushan
        except AttributeError:
43 d6688264 Shikhar Bhushan
            pass        
44 1d540e60 Shikhar Bhushan
        self._async = async
45 94803aaf Shikhar Bhushan
        self._timeout = timeout
46 11d9e642 Shikhar Bhushan
        self._id = uuid1().urn
47 5858a82c Shikhar Bhushan
        self._listener = RPCReplyListener(session)
48 5858a82c Shikhar Bhushan
        self._listener.register(self._id, self)
49 3e022b7b Shikhar Bhushan
        self._reply = None
50 11d9e642 Shikhar Bhushan
        self._reply_event = Event()
51 efed7d4c Shikhar Bhushan
    
52 2f8bc438 Shikhar Bhushan
    def _build(self, opspec, encoding='utf-8'):
53 94803aaf Shikhar Bhushan
        "TODO: docstring"
54 94803aaf Shikhar Bhushan
        spec = {
55 94803aaf Shikhar Bhushan
            'tag': _('rpc'),
56 94803aaf Shikhar Bhushan
            'attributes': {'message-id': self._id},
57 94803aaf Shikhar Bhushan
            'children': opspec
58 94803aaf Shikhar Bhushan
            }
59 2f8bc438 Shikhar Bhushan
        return XMLConverter(spec).to_string(encoding)
60 efed7d4c Shikhar Bhushan
    
61 d6688264 Shikhar Bhushan
    def _request(self, op):
62 5858a82c Shikhar Bhushan
        req = self._build(op)
63 efed7d4c Shikhar Bhushan
        self._session.send(req)
64 1d540e60 Shikhar Bhushan
        if self._async:
65 41e2ed46 Shikhar Bhushan
            return self._reply_event
66 41e2ed46 Shikhar Bhushan
        else:
67 d6688264 Shikhar Bhushan
            self._reply_event.wait(self._timeout)
68 94803aaf Shikhar Bhushan
            if self._reply_event.isSet():
69 94803aaf Shikhar Bhushan
                self._reply.parse()
70 94803aaf Shikhar Bhushan
                return self._reply
71 94803aaf Shikhar Bhushan
            else:
72 94803aaf Shikhar Bhushan
                raise ReplyTimeoutError
73 ee4bb099 Shikhar Bhushan
    
74 41e2ed46 Shikhar Bhushan
    def _delivery_hook(self):
75 41e2ed46 Shikhar Bhushan
        'For subclasses'
76 41e2ed46 Shikhar Bhushan
        pass
77 41e2ed46 Shikhar Bhushan
    
78 d6688264 Shikhar Bhushan
    def _assert(self, capability):
79 d6688264 Shikhar Bhushan
        if capability not in self._session.server_capabilities:
80 d6688264 Shikhar Bhushan
            raise MissingCapabilityError('Server does not support [%s]' % cap)
81 d6688264 Shikhar Bhushan
    
82 41e2ed46 Shikhar Bhushan
    def deliver(self, raw):
83 d6688264 Shikhar Bhushan
        self._reply = self.REPLY_CLS(raw)
84 41e2ed46 Shikhar Bhushan
        self._delivery_hook()
85 6a10f112 Shikhar Bhushan
        self._reply_event.set()
86 41e2ed46 Shikhar Bhushan
    
87 589b23e4 Shikhar Bhushan
    @property
88 35ad9d81 Shikhar Bhushan
    def has_reply(self):
89 3e022b7b Shikhar Bhushan
        return self._reply_event.isSet()
90 589b23e4 Shikhar Bhushan
    
91 589b23e4 Shikhar Bhushan
    @property
92 ee4bb099 Shikhar Bhushan
    def reply(self):
93 ee4bb099 Shikhar Bhushan
        return self._reply
94 ee4bb099 Shikhar Bhushan
    
95 ee4bb099 Shikhar Bhushan
    @property
96 38a9b062 Shikhar Bhushan
    def id(self):
97 ee4bb099 Shikhar Bhushan
        return self._id
98 ee4bb099 Shikhar Bhushan
    
99 ee4bb099 Shikhar Bhushan
    @property
100 ee4bb099 Shikhar Bhushan
    def session(self):
101 ee4bb099 Shikhar Bhushan
        return self._session
102 efed7d4c Shikhar Bhushan
    
103 3e022b7b Shikhar Bhushan
    @property
104 3e022b7b Shikhar Bhushan
    def reply_event(self):
105 3e022b7b Shikhar Bhushan
        return self._reply_event
106 3e022b7b Shikhar Bhushan
    
107 94803aaf Shikhar Bhushan
    def set_async(self, bool): self._async = bool
108 94803aaf Shikhar Bhushan
    async = property(fget=lambda self: self._async, fset=set_async)
109 3e022b7b Shikhar Bhushan
    
110 94803aaf Shikhar Bhushan
    def set_timeout(self, timeout): self._timeout = timeout
111 94803aaf Shikhar Bhushan
    timeout = property(fget=lambda self: self._timeout, fset=set_timeout)