Statistics
| Branch: | Tag: | Revision:

root / ncclient / manager.py @ 9a9af391

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 0304f041 Shikhar Bhushan
        op = operations.INDEX.get(name, None)
60 0304f041 Shikhar Bhushan
        if op is None:
61 dd225c7a Shikhar Bhushan
            raise AttributeError
62 c8381a66 Shikhar Bhushan
        else:
63 0304f041 Shikhar Bhushan
            return op(self.session,
64 c8381a66 Shikhar Bhushan
                      async=self._async_mode,
65 0304f041 Shikhar Bhushan
                      timeout=self._timeout,
66 6c70b245 Shikhar Bhushan
                      raise_mode=self._raise_mode).request
67 0304f041 Shikhar Bhushan
    
68 216bb34c Shikhar Bhushan
    def locked(self, target):
69 216bb34c Shikhar Bhushan
        """Returns a context manager for the *with* statement.
70 216bb34c Shikhar Bhushan

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