Statistics
| Branch: | Tag: | Revision:

root / ncclient / operations / rpc.py @ 11d9e642

History | View | Annotate | Download (2.9 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 38a9b062 Shikhar Bhushan
18 e91a5349 Shikhar Bhushan
from . import logger
19 e91a5349 Shikhar Bhushan
20 589b23e4 Shikhar Bhushan
class RPC:
21 e91a5349 Shikhar Bhushan
        
22 11d9e642 Shikhar Bhushan
    def __init__(self, session, async=False):
23 38a9b062 Shikhar Bhushan
        self._session = session
24 11d9e642 Shikhar Bhushan
        self._id = uuid1().urn
25 11d9e642 Shikhar Bhushan
        self._reply = RPCReply()
26 11d9e642 Shikhar Bhushan
        self._reply_event = Event()
27 efed7d4c Shikhar Bhushan
    
28 11d9e642 Shikhar Bhushan
    def _build(self, op, encoding='utf-8'):
29 11d9e642 Shikhar Bhushan
        if isinstance(op, basestring):
30 11d9e642 Shikhar Bhushan
            return RPCBuilder.build_from_string(self._id, op, encoding)
31 11d9e642 Shikhar Bhushan
        else:
32 11d9e642 Shikhar Bhushan
            return RPCBuilder.build_from_spec(self._id, op, encoding)
33 efed7d4c Shikhar Bhushan
    
34 e91a5349 Shikhar Bhushan
    def _request(self, op):
35 e91a5349 Shikhar Bhushan
        self._reply = RPCReply()
36 efed7d4c Shikhar Bhushan
        # get the listener instance for this session
37 efed7d4c Shikhar Bhushan
        # <rpc-reply> with message id will reach response_cb
38 6625258b Shikhar Bhushan
        self._listener.register(self._id, self)
39 efed7d4c Shikhar Bhushan
        # only effective the first time, transport.session.Subject internally
40 efed7d4c Shikhar Bhushan
        # uses a set type for listeners
41 efed7d4c Shikhar Bhushan
        self._session.add_listener(self._listener)
42 efed7d4c Shikhar Bhushan
        req = RPCBuilder.build(self._id, op)
43 efed7d4c Shikhar Bhushan
        self._session.send(req)
44 efed7d4c Shikhar Bhushan
        if reply_event is not None: # if we were provided an Event to use
45 efed7d4c Shikhar Bhushan
            self._reply_event = reply_event
46 efed7d4c Shikhar Bhushan
        else: # otherwise, block till response received and return it
47 efed7d4c Shikhar Bhushan
            self._reply_event = Event()
48 ee4bb099 Shikhar Bhushan
            self._reply_event.wait()
49 efed7d4c Shikhar Bhushan
            self._reply.parse()
50 e91a5349 Shikhar Bhushan
        return self._reply
51 ee4bb099 Shikhar Bhushan
    
52 efed7d4c Shikhar Bhushan
    def request(self, *args, **kwds):
53 ee4bb099 Shikhar Bhushan
        raise NotImplementedError
54 ee4bb099 Shikhar Bhushan
    
55 589b23e4 Shikhar Bhushan
    @property
56 35ad9d81 Shikhar Bhushan
    def has_reply(self):
57 efed7d4c Shikhar Bhushan
        try:
58 efed7d4c Shikhar Bhushan
            return self._reply_event.isSet()
59 efed7d4c Shikhar Bhushan
        except TypeError: # reply_event is None
60 efed7d4c Shikhar Bhushan
            return False
61 589b23e4 Shikhar Bhushan
    
62 589b23e4 Shikhar Bhushan
    @property
63 ee4bb099 Shikhar Bhushan
    def reply(self):
64 ee4bb099 Shikhar Bhushan
        return self._reply
65 ee4bb099 Shikhar Bhushan
    
66 ee4bb099 Shikhar Bhushan
    @property
67 38a9b062 Shikhar Bhushan
    def id(self):
68 ee4bb099 Shikhar Bhushan
        return self._id
69 ee4bb099 Shikhar Bhushan
    
70 ee4bb099 Shikhar Bhushan
    @property
71 ee4bb099 Shikhar Bhushan
    def session(self):
72 ee4bb099 Shikhar Bhushan
        return self._session
73 efed7d4c Shikhar Bhushan
    
74 11d9e642 Shikhar Bhushan
    @staticmethod
75 11d9e642 Shikhar Bhushan
    def build_from_spec(msgid, opspec, encoding='utf-8'):
76 11d9e642 Shikhar Bhushan
        "TODO: docstring"
77 11d9e642 Shikhar Bhushan
        spec = {
78 11d9e642 Shikhar Bhushan
            'tag': _('rpc', BASE_NS),
79 11d9e642 Shikhar Bhushan
            'attributes': {'message-id': msgid},
80 11d9e642 Shikhar Bhushan
            'children': opspec
81 11d9e642 Shikhar Bhushan
            }
82 11d9e642 Shikhar Bhushan
        return TreeBuilder(spec).to_string(encoding)
83 11d9e642 Shikhar Bhushan
    
84 11d9e642 Shikhar Bhushan
    @staticmethod
85 11d9e642 Shikhar Bhushan
    def build_from_string(msgid, opstr, encoding='utf-8'):
86 11d9e642 Shikhar Bhushan
        "TODO: docstring"
87 11d9e642 Shikhar Bhushan
        decl = '<?xml version="1.0" encoding="%s"?>' % encoding
88 11d9e642 Shikhar Bhushan
        doc = (u'''<rpc message-id="%s" xmlns="%s">%s</rpc>''' %
89 11d9e642 Shikhar Bhushan
               (msgid, BASE_NS, opstr)).encode(encoding)
90 11d9e642 Shikhar Bhushan
        return (decl + doc)