Statistics
| Branch: | Tag: | Revision:

root / ncclient / manager.py @ 564bee4f

History | View | Annotate | Download (5.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 216bb34c Shikhar Bhushan
    <ncclient.transport.SSHSession.connect>` for function signature."""
27 2f8bc438 Shikhar Bhushan
    session = transport.SSHSession(capabilities.CAPABILITIES)
28 216bb34c Shikhar Bhushan
    session.load_known_hosts()
29 2f8bc438 Shikhar Bhushan
    session.connect(*args, **kwds)
30 2f8bc438 Shikhar Bhushan
    return Manager(session)
31 2f8bc438 Shikhar Bhushan
32 216bb34c Shikhar Bhushan
#: Same as :meth:`connect_ssh`
33 216bb34c Shikhar Bhushan
connect = connect_ssh
34 2f8bc438 Shikhar Bhushan
35 216bb34c Shikhar Bhushan
#: Raise all :class:`~ncclient.operations.rpc.RPCError`
36 a7cb58ce Shikhar Bhushan
RAISE_ALL = 0
37 216bb34c Shikhar Bhushan
#: Only raise when *error-severity* is "error" i.e. no warnings
38 a7cb58ce Shikhar Bhushan
RAISE_ERR = 1
39 216bb34c Shikhar Bhushan
#: Don't raise any
40 a7cb58ce Shikhar Bhushan
RAISE_NONE = 2
41 4de03d63 Shikhar Bhushan
42 2f8bc438 Shikhar Bhushan
class Manager:
43 4f650d54 Shikhar Bhushan
44 216bb34c Shikhar Bhushan
    """API for NETCONF operations. Currently only supports making synchronous
45 216bb34c Shikhar Bhushan
    RPC requests.
46 216bb34c Shikhar Bhushan

47 216bb34c Shikhar Bhushan
    It is also a context manager, so a :class:`Manager` instance can be used
48 216bb34c Shikhar Bhushan
    with the *with* statement. The session is closed when the context ends. """
49 4f650d54 Shikhar Bhushan
50 4f650d54 Shikhar Bhushan
    def __init__(self, session):
51 179b00d4 Shikhar Bhushan
        self._session = session
52 216bb34c Shikhar Bhushan
        self._raise = RAISE_ALL
53 4f650d54 Shikhar Bhushan
54 a7cb58ce Shikhar Bhushan
    def set_rpc_error_action(self, action):
55 216bb34c Shikhar Bhushan
        """Specify the action to take when an *<rpc-error>* element is encountered.
56 216bb34c Shikhar Bhushan

57 216bb34c Shikhar Bhushan
        :arg action: one of :attr:`RAISE_ALL`, :attr:`RAISE_ERR`, :attr:`RAISE_NONE`
58 216bb34c Shikhar Bhushan
        """
59 216bb34c Shikhar Bhushan
        self._raise = action
60 216bb34c Shikhar Bhushan
61 454339d6 Shikhar Bhushan
    def __enter__(self):
62 454339d6 Shikhar Bhushan
        return self
63 454339d6 Shikhar Bhushan
64 454339d6 Shikhar Bhushan
    def __exit__(self, *args):
65 454339d6 Shikhar Bhushan
        self.close()
66 454339d6 Shikhar Bhushan
        return False
67 d6688264 Shikhar Bhushan
68 d771dffc Shikhar Bhushan
    def do(self, op, *args, **kwds):
69 0b7d3b31 Shikhar Bhushan
        op = operations.OPERATIONS[op](self._session)
70 2f8bc438 Shikhar Bhushan
        reply = op.request(*args, **kwds)
71 2f8bc438 Shikhar Bhushan
        if not reply.ok:
72 4de03d63 Shikhar Bhushan
            if self._raise == RAISE_ALL:
73 179b00d4 Shikhar Bhushan
                raise reply.error
74 bbd4ce54 Shikhar Bhushan
            elif self._raise == RAISE_ERR:
75 179b00d4 Shikhar Bhushan
                for error in reply.errors:
76 179b00d4 Shikhar Bhushan
                    if error.severity == 'error':
77 179b00d4 Shikhar Bhushan
                        raise error
78 2f8bc438 Shikhar Bhushan
        return reply
79 4f650d54 Shikhar Bhushan
80 216bb34c Shikhar Bhushan
    #: :see: :meth:`Get.request() <ncclient.operations.Get.request>`
81 216bb34c Shikhar Bhushan
    get = lambda self, *args, **kwds: self.do('get', *args, **kwds)
82 4f650d54 Shikhar Bhushan
83 216bb34c Shikhar Bhushan
    #: :see: :meth:`GetConfig.request() <ncclient.operations.GetConfig.request>`
84 216bb34c Shikhar Bhushan
    get_config = lambda self, *args, **kwds: self.do('get-config', *args, **kwds)
85 4f650d54 Shikhar Bhushan
86 216bb34c Shikhar Bhushan
    #: :see: :meth:`EditConfig.request() <ncclient.operations.EditConfig.request>`
87 216bb34c Shikhar Bhushan
    edit_config = lambda self, *args, **kwds: self.do('edit-config', *args, **kwds)
88 a7cb58ce Shikhar Bhushan
89 216bb34c Shikhar Bhushan
    #: :see: :meth:`CopyConfig.request() <ncclient.operations.CopyConfig.request>`
90 216bb34c Shikhar Bhushan
    copy_config = lambda self, *args, **kwds: self.do('copy-config', *args, **kwds)
91 4f650d54 Shikhar Bhushan
92 216bb34c Shikhar Bhushan
    #: :see: :meth:`GetConfig.request() <ncclient.operations.Validate.request>`
93 216bb34c Shikhar Bhushan
    validate = lambda self, *args, **kwds: self.do('validate', *args, **kwds)
94 a7cb58ce Shikhar Bhushan
95 216bb34c Shikhar Bhushan
    #: :see: :meth:`Commit.request() <ncclient.operations.Commit.request>`
96 216bb34c Shikhar Bhushan
    commit = lambda self, *args, **kwds: self.do('commit', *args, **kwds)
97 a7cb58ce Shikhar Bhushan
98 216bb34c Shikhar Bhushan
    #: :see: :meth:`DiscardChanges.request() <ncclient.operations.DiscardChanges.request>`
99 216bb34c Shikhar Bhushan
    discard_changes = lambda self, *args, **kwds: self.do('discard-changes', *args, **kwds)
100 a7cb58ce Shikhar Bhushan
101 216bb34c Shikhar Bhushan
    #: :see: :meth:`DeleteConfig.request() <ncclient.operations.DeleteConfig.request>`
102 216bb34c Shikhar Bhushan
    delete_config = lambda self, *args, **kwds: self.do('delete-config', *args, **kwds)
103 4f650d54 Shikhar Bhushan
104 216bb34c Shikhar Bhushan
    #: :see: :meth:`Lock.request() <ncclient.operations.Lock.request>`
105 a6c00291 Shikhar Bhushan
    lock = lambda self, *args, **kwds: self.do('lock', *args, **kwds)
106 4f650d54 Shikhar Bhushan
107 216bb34c Shikhar Bhushan
    #: :see: :meth:`DiscardChanges.request() <ncclient.operations.Unlock.request>`
108 a6c00291 Shikhar Bhushan
    unlock = lambda self, *args, **kwds: self.do('unlock', *args, **kwds)
109 4f650d54 Shikhar Bhushan
110 216bb34c Shikhar Bhushan
    #: :see: :meth:`CloseSession.request() <ncclient.operations.CloseSession.request>`
111 a6c00291 Shikhar Bhushan
    close_session = lambda self, *args, **kwds: self.do('close-session', *args, **kwds)
112 4f650d54 Shikhar Bhushan
113 216bb34c Shikhar Bhushan
    #: :see: :meth:`KillSession.request() <ncclient.operations.KillSession.request>`
114 a6c00291 Shikhar Bhushan
    kill_session = lambda self, *args, **kwds: self.do('kill-session', *args, **kwds)
115 4f650d54 Shikhar Bhushan
116 216bb34c Shikhar Bhushan
    def locked(self, target):
117 216bb34c Shikhar Bhushan
        """Returns a context manager for the *with* statement.
118 216bb34c Shikhar Bhushan

119 216bb34c Shikhar Bhushan
        :arg target: name of the datastore to lock
120 216bb34c Shikhar Bhushan
        :type target: `string`
121 0b7d3b31 Shikhar Bhushan
        :rtype: :class:`~ncclient.operations.LockContext`
122 216bb34c Shikhar Bhushan
        """
123 216bb34c Shikhar Bhushan
        return operations.LockContext(self._session, target)
124 216bb34c Shikhar Bhushan
125 2f8bc438 Shikhar Bhushan
    def close(self):
126 216bb34c Shikhar Bhushan
        """Closes the NETCONF session. First does *<close-session>* RPC."""
127 179b00d4 Shikhar Bhushan
        try: # try doing it clean
128 2f8bc438 Shikhar Bhushan
            self.close_session()
129 a7cb58ce Shikhar Bhushan
        except Exception as e:
130 a7cb58ce Shikhar Bhushan
            logger.debug('error doing <close-session> -- %r' % e)
131 179b00d4 Shikhar Bhushan
        if self._session.connected: # if that didn't work...
132 2f8bc438 Shikhar Bhushan
            self._session.close()
133 4f650d54 Shikhar Bhushan
134 cc9af1c3 Shikhar Bhushan
    @property
135 66cd54c8 Shikhar Bhushan
    def session(self):
136 216bb34c Shikhar Bhushan
        ":class:`~ncclient.transport.Session` instance"
137 d771dffc Shikhar Bhushan
        return self._session
138 4f650d54 Shikhar Bhushan
139 cc9af1c3 Shikhar Bhushan
    @property
140 a7cb58ce Shikhar Bhushan
    def client_capabilities(self):
141 216bb34c Shikhar Bhushan
        ":class:`~ncclient.capabilities.Capabilities` object for client"
142 cc9af1c3 Shikhar Bhushan
        return self._session._client_capabilities
143 4f650d54 Shikhar Bhushan
144 4f650d54 Shikhar Bhushan
    @property
145 4f650d54 Shikhar Bhushan
    def server_capabilities(self):
146 216bb34c Shikhar Bhushan
        ":class:`~ncclient.capabilities.Capabilities` object for server"
147 4f650d54 Shikhar Bhushan
        return self._session._server_capabilities
148 a7cb58ce Shikhar Bhushan
149 a7cb58ce Shikhar Bhushan
    @property
150 a7cb58ce Shikhar Bhushan
    def session_id(self):
151 216bb34c Shikhar Bhushan
        "*<session-id>* as assigned by NETCONF server"
152 a7cb58ce Shikhar Bhushan
        return self._session.id
153 216bb34c Shikhar Bhushan
154 216bb34c Shikhar Bhushan
    @property
155 216bb34c Shikhar Bhushan
    def connected(self):
156 216bb34c Shikhar Bhushan
        "Whether currently connected to NETCONF server"
157 216bb34c Shikhar Bhushan
        return self._session.connected