Statistics
| Branch: | Tag: | Revision:

root / ncclient / manager.py @ 0a718026

History | View | Annotate | Download (3.7 kB)

1 94803aaf Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 94803aaf Shikhar Bhushan
#
3 94803aaf Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 94803aaf Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 94803aaf Shikhar Bhushan
# You may obtain a copy of the License at
6 94803aaf Shikhar Bhushan
#
7 94803aaf Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 94803aaf Shikhar Bhushan
#
9 94803aaf Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 94803aaf Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 94803aaf Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 94803aaf Shikhar Bhushan
# See the License for the specific language governing permissions and
13 94803aaf Shikhar Bhushan
# limitations under the License.
14 94803aaf Shikhar Bhushan
15 216bb34c Shikhar Bhushan
"Thin layer of abstraction around NCClient"
16 216bb34c Shikhar Bhushan
17 94803aaf Shikhar Bhushan
import capabilities
18 0b7d3b31 Shikhar Bhushan
import operations
19 94803aaf Shikhar Bhushan
import transport
20 94803aaf Shikhar Bhushan
21 454339d6 Shikhar Bhushan
import logging
22 454339d6 Shikhar Bhushan
logger = logging.getLogger('ncclient.manager')
23 454339d6 Shikhar Bhushan
24 216bb34c Shikhar Bhushan
def connect_ssh(*args, **kwds):
25 216bb34c Shikhar Bhushan
    """Connect to NETCONF server over SSH. See :meth:`SSHSession.connect()
26 dd225c7a Shikhar Bhushan
    <ncclient.transport.SSHSession.connect>` for argument details.
27 dd225c7a Shikhar Bhushan

28 dd225c7a Shikhar Bhushan
    :rtype: :class:`Manager`
29 dd225c7a Shikhar Bhushan
    """
30 2f8bc438 Shikhar Bhushan
    session = transport.SSHSession(capabilities.CAPABILITIES)
31 216bb34c Shikhar Bhushan
    session.load_known_hosts()
32 2f8bc438 Shikhar Bhushan
    session.connect(*args, **kwds)
33 2f8bc438 Shikhar Bhushan
    return Manager(session)
34 2f8bc438 Shikhar Bhushan
35 216bb34c Shikhar Bhushan
#: Same as :meth:`connect_ssh`
36 216bb34c Shikhar Bhushan
connect = connect_ssh
37 2f8bc438 Shikhar Bhushan
38 dd225c7a Shikhar Bhushan
class Manager(object):
39 4f650d54 Shikhar Bhushan
40 dd225c7a Shikhar Bhushan
    """API for NETCONF operations.
41 216bb34c Shikhar Bhushan

42 216bb34c Shikhar Bhushan
    It is also a context manager, so a :class:`Manager` instance can be used
43 216bb34c Shikhar Bhushan
    with the *with* statement. The session is closed when the context ends. """
44 4f650d54 Shikhar Bhushan
45 4f650d54 Shikhar Bhushan
    def __init__(self, session):
46 179b00d4 Shikhar Bhushan
        self._session = session
47 c8381a66 Shikhar Bhushan
        self._async_mode = False
48 c8381a66 Shikhar Bhushan
        self._timeout = None
49 6c70b245 Shikhar Bhushan
        self._raise_mode = 'all'
50 216bb34c Shikhar Bhushan
51 454339d6 Shikhar Bhushan
    def __enter__(self):
52 454339d6 Shikhar Bhushan
        return self
53 454339d6 Shikhar Bhushan
54 c8381a66 Shikhar Bhushan
    def __exit__(self, *argss):
55 454339d6 Shikhar Bhushan
        self.close()
56 454339d6 Shikhar Bhushan
        return False
57 d6688264 Shikhar Bhushan
58 dd225c7a Shikhar Bhushan
    def __getattr__(self, name):
59 dd225c7a Shikhar Bhushan
        try:
60 c8381a66 Shikhar Bhushan
            op = operations.INDEX[name]
61 dd225c7a Shikhar Bhushan
        except KeyError:
62 dd225c7a Shikhar Bhushan
            raise AttributeError
63 c8381a66 Shikhar Bhushan
        else:
64 0a718026 Shikhar Bhushan
            reply = op(self.session,
65 c8381a66 Shikhar Bhushan
                      async=self._async_mode,
66 6c70b245 Shikhar Bhushan
                      timeout=self.timeout,
67 6c70b245 Shikhar Bhushan
                      raise_mode=self._raise_mode).request
68 0a718026 Shikhar Bhushan
            return op if self._async_mode else reply
69 4f650d54 Shikhar Bhushan
70 216bb34c Shikhar Bhushan
    def locked(self, target):
71 216bb34c Shikhar Bhushan
        """Returns a context manager for the *with* statement.
72 216bb34c Shikhar Bhushan

73 216bb34c Shikhar Bhushan
        :arg target: name of the datastore to lock
74 216bb34c Shikhar Bhushan
        :type target: `string`
75 0b7d3b31 Shikhar Bhushan
        :rtype: :class:`~ncclient.operations.LockContext`
76 216bb34c Shikhar Bhushan
        """
77 216bb34c Shikhar Bhushan
        return operations.LockContext(self._session, target)
78 216bb34c Shikhar Bhushan
79 2f8bc438 Shikhar Bhushan
    def close(self):
80 216bb34c Shikhar Bhushan
        """Closes the NETCONF session. First does *<close-session>* RPC."""
81 179b00d4 Shikhar Bhushan
        try: # try doing it clean
82 2f8bc438 Shikhar Bhushan
            self.close_session()
83 a7cb58ce Shikhar Bhushan
        except Exception as e:
84 a7cb58ce Shikhar Bhushan
            logger.debug('error doing <close-session> -- %r' % e)
85 179b00d4 Shikhar Bhushan
        if self._session.connected: # if that didn't work...
86 2f8bc438 Shikhar Bhushan
            self._session.close()
87 4f650d54 Shikhar Bhushan
88 cc9af1c3 Shikhar Bhushan
    @property
89 66cd54c8 Shikhar Bhushan
    def session(self):
90 216bb34c Shikhar Bhushan
        ":class:`~ncclient.transport.Session` instance"
91 d771dffc Shikhar Bhushan
        return self._session
92 4f650d54 Shikhar Bhushan
93 cc9af1c3 Shikhar Bhushan
    @property
94 a7cb58ce Shikhar Bhushan
    def client_capabilities(self):
95 216bb34c Shikhar Bhushan
        ":class:`~ncclient.capabilities.Capabilities` object for client"
96 cc9af1c3 Shikhar Bhushan
        return self._session._client_capabilities
97 4f650d54 Shikhar Bhushan
98 4f650d54 Shikhar Bhushan
    @property
99 4f650d54 Shikhar Bhushan
    def server_capabilities(self):
100 216bb34c Shikhar Bhushan
        ":class:`~ncclient.capabilities.Capabilities` object for server"
101 4f650d54 Shikhar Bhushan
        return self._session._server_capabilities
102 a7cb58ce Shikhar Bhushan
103 a7cb58ce Shikhar Bhushan
    @property
104 a7cb58ce Shikhar Bhushan
    def session_id(self):
105 216bb34c Shikhar Bhushan
        "*<session-id>* as assigned by NETCONF server"
106 a7cb58ce Shikhar Bhushan
        return self._session.id
107 216bb34c Shikhar Bhushan
108 216bb34c Shikhar Bhushan
    @property
109 216bb34c Shikhar Bhushan
    def connected(self):
110 216bb34c Shikhar Bhushan
        "Whether currently connected to NETCONF server"
111 216bb34c Shikhar Bhushan
        return self._session.connected
112 c8381a66 Shikhar Bhushan
113 c8381a66 Shikhar Bhushan
    def set_async_mode(self, bool=True):
114 c8381a66 Shikhar Bhushan
        self._async_mode = bool
115 c8381a66 Shikhar Bhushan
116 6c70b245 Shikhar Bhushan
    def set_raise_mode(self, mode):
117 6c70b245 Shikhar Bhushan
        assert(choice in ('all', 'errors', 'none'))
118 6c70b245 Shikhar Bhushan
        self._raise_mode = mode
119 c8381a66 Shikhar Bhushan
120 c8381a66 Shikhar Bhushan
    async_mode = property(fget=lambda self: self._async_mode, fset=set_async_mode)
121 c8381a66 Shikhar Bhushan
122 c8381a66 Shikhar Bhushan
    raise_mode = property(fget=set_raise_mode, fset=set_raise_mode)