Statistics
| Branch: | Tag: | Revision:

root / ncclient / manager.py @ 0784a22e

History | View | Annotate | Download (6.8 kB)

1 94803aaf Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 ad82bf43 Leonidas Poulopoulos
# Copyright 2011 Leonidas Poulopoulos
3 94803aaf Shikhar Bhushan
#
4 94803aaf Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
5 94803aaf Shikhar Bhushan
# you may not use this file except in compliance with the License.
6 94803aaf Shikhar Bhushan
# You may obtain a copy of the License at
7 94803aaf Shikhar Bhushan
#
8 94803aaf Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
9 94803aaf Shikhar Bhushan
#
10 94803aaf Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
11 94803aaf Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
12 94803aaf Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 94803aaf Shikhar Bhushan
# See the License for the specific language governing permissions and
14 94803aaf Shikhar Bhushan
# limitations under the License.
15 94803aaf Shikhar Bhushan
16 19e7c7f6 Shikhar Bhushan
"""This module is a thin layer of abstraction around the library. It exposes all core functionality."""
17 216bb34c Shikhar Bhushan
18 94803aaf Shikhar Bhushan
import capabilities
19 0b7d3b31 Shikhar Bhushan
import operations
20 94803aaf Shikhar Bhushan
import transport
21 94803aaf Shikhar Bhushan
22 454339d6 Shikhar Bhushan
import logging
23 b2d60e49 Shikhar Bhushan
24 454339d6 Shikhar Bhushan
logger = logging.getLogger('ncclient.manager')
25 454339d6 Shikhar Bhushan
26 e3b66e4b Shikhar Bhushan
CAPABILITIES = [
27 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:base:1.0",
28 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:writable-running:1.0",
29 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:candidate:1.0",
30 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:confirmed-commit:1.0",
31 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:rollback-on-error:1.0",
32 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:startup:1.0",
33 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:url:1.0?scheme=http,ftp,file,https,sftp",
34 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:validate:1.0",
35 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:xpath:1.0",
36 68ac4439 Shikhar Bhushan
    "urn:liberouter:params:netconf:capability:power-control:1.0"
37 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:interleave:1.0"
38 e3b66e4b Shikhar Bhushan
]
39 19e7c7f6 Shikhar Bhushan
"""A list of URI's representing the client's capabilities. This is used during the initial capability exchange. Modify this if you need to announce some capability not already included."""
40 2f8bc438 Shikhar Bhushan
41 b660fcda Shikhar Bhushan
OPERATIONS = {
42 b660fcda Shikhar Bhushan
    "get": operations.Get,
43 b660fcda Shikhar Bhushan
    "get_config": operations.GetConfig,
44 53e1a046 Leonidas Poulopoulos
    "dispatch": operations.Dispatch,
45 b660fcda Shikhar Bhushan
    "edit_config": operations.EditConfig,
46 b660fcda Shikhar Bhushan
    "copy_config": operations.CopyConfig,
47 b660fcda Shikhar Bhushan
    "validate": operations.Validate,
48 b660fcda Shikhar Bhushan
    "commit": operations.Commit,
49 b660fcda Shikhar Bhushan
    "discard_changes": operations.DiscardChanges,
50 b660fcda Shikhar Bhushan
    "delete_config": operations.DeleteConfig,
51 b660fcda Shikhar Bhushan
    "lock": operations.Lock,
52 b660fcda Shikhar Bhushan
    "unlock": operations.Unlock,
53 b660fcda Shikhar Bhushan
    "close_session": operations.CloseSession,
54 b660fcda Shikhar Bhushan
    "kill_session": operations.KillSession,
55 b660fcda Shikhar Bhushan
    "poweroff_machine": operations.PoweroffMachine,
56 b660fcda Shikhar Bhushan
    "reboot_machine": operations.RebootMachine
57 b660fcda Shikhar Bhushan
}
58 19e7c7f6 Shikhar Bhushan
"""Dictionary of method names and corresponding :class:`~ncclient.operations.RPC` subclasses. It is used to lookup operations, e.g. `get_config` is mapped to :class:`~ncclient.operations.GetConfig`. It is thus possible to add additional operations to the :class:`Manager` API."""
59 4f650d54 Shikhar Bhushan
60 68ac4439 Shikhar Bhushan
def connect_ssh(*args, **kwds):
61 19e7c7f6 Shikhar Bhushan
    """Initialize a :class:`Manager` over the SSH transport. For documentation of arguments see :meth:`ncclient.transport.SSHSession.connect`.
62 19e7c7f6 Shikhar Bhushan

63 19e7c7f6 Shikhar Bhushan
    The underlying :class:`ncclient.transport.SSHSession` is created with :data:`CAPABILITIES`. It is first instructed to :meth:`~ncclient.transport.SSHSession.load_known_hosts` and then  all the provided arguments are passed directly to its implementation of :meth:`~ncclient.transport.SSHSession.connect`.
64 b2d60e49 Shikhar Bhushan
    """
65 e3b66e4b Shikhar Bhushan
    session = transport.SSHSession(capabilities.Capabilities(CAPABILITIES))
66 68ac4439 Shikhar Bhushan
    session.load_known_hosts()
67 68ac4439 Shikhar Bhushan
    session.connect(*args, **kwds)
68 68ac4439 Shikhar Bhushan
    return Manager(session)
69 68ac4439 Shikhar Bhushan
70 68ac4439 Shikhar Bhushan
connect = connect_ssh
71 4bc8021f Shikhar Bhushan
"Same as :func:`connect_ssh`, since SSH is the default (and currently, the only) transport."
72 216bb34c Shikhar Bhushan
73 b2d60e49 Shikhar Bhushan
class OpExecutor(type):
74 19e7c7f6 Shikhar Bhushan
75 b2d60e49 Shikhar Bhushan
    def __new__(cls, name, bases, attrs):
76 b2d60e49 Shikhar Bhushan
        def make_wrapper(op_cls):
77 b2d60e49 Shikhar Bhushan
            def wrapper(self, *args, **kwds):
78 b2d60e49 Shikhar Bhushan
                return self.execute(op_cls, *args, **kwds)
79 b2d60e49 Shikhar Bhushan
            wrapper.func_doc = op_cls.request.func_doc
80 b2d60e49 Shikhar Bhushan
            return wrapper
81 b2d60e49 Shikhar Bhushan
        for op_name, op_cls in OPERATIONS.iteritems():
82 b2d60e49 Shikhar Bhushan
            attrs[op_name] = make_wrapper(op_cls)
83 b2d60e49 Shikhar Bhushan
        return super(OpExecutor, cls).__new__(cls, name, bases, attrs)
84 b2d60e49 Shikhar Bhushan
85 68ac4439 Shikhar Bhushan
class Manager(object):
86 4f650d54 Shikhar Bhushan
87 19e7c7f6 Shikhar Bhushan
    """For details on the expected behavior of the operations and their parameters refer to :rfc:`4741`.
88 19e7c7f6 Shikhar Bhushan

89 19e7c7f6 Shikhar Bhushan
    Manager instances are also context managers so you can use it like this::
90 19e7c7f6 Shikhar Bhushan

91 19e7c7f6 Shikhar Bhushan
        with manager.connect("host") as m:
92 19e7c7f6 Shikhar Bhushan
            # do your stuff
93 b2d60e49 Shikhar Bhushan

94 19e7c7f6 Shikhar Bhushan
    ... or like this::
95 b2d60e49 Shikhar Bhushan

96 19e7c7f6 Shikhar Bhushan
        m = manager.connect("host")
97 19e7c7f6 Shikhar Bhushan
        try:
98 19e7c7f6 Shikhar Bhushan
            # do your stuff
99 19e7c7f6 Shikhar Bhushan
        finally:
100 19e7c7f6 Shikhar Bhushan
            m.close_session()
101 19e7c7f6 Shikhar Bhushan
    """
102 19e7c7f6 Shikhar Bhushan
103 19e7c7f6 Shikhar Bhushan
    __metaclass__ = OpExecutor
104 19e7c7f6 Shikhar Bhushan
105 19e7c7f6 Shikhar Bhushan
    def __init__(self, session, timeout=30):
106 179b00d4 Shikhar Bhushan
        self._session = session
107 c8381a66 Shikhar Bhushan
        self._async_mode = False
108 19e7c7f6 Shikhar Bhushan
        self._timeout = timeout
109 19e7c7f6 Shikhar Bhushan
        self._raise_mode = operations.RaiseMode.ALL
110 216bb34c Shikhar Bhushan
111 454339d6 Shikhar Bhushan
    def __enter__(self):
112 454339d6 Shikhar Bhushan
        return self
113 454339d6 Shikhar Bhushan
114 b2d60e49 Shikhar Bhushan
    def __exit__(self, *args):
115 68ac4439 Shikhar Bhushan
        self.close_session()
116 454339d6 Shikhar Bhushan
        return False
117 d6688264 Shikhar Bhushan
118 98f9e162 Shikhar Bhushan
    def __set_timeout(self, timeout):
119 98f9e162 Shikhar Bhushan
        self._timeout = timeout
120 98f9e162 Shikhar Bhushan
121 19e7c7f6 Shikhar Bhushan
    def __set_async_mode(self, mode):
122 19e7c7f6 Shikhar Bhushan
        self._async_mode = mode
123 19e7c7f6 Shikhar Bhushan
124 19e7c7f6 Shikhar Bhushan
    def __set_raise_mode(self, mode):
125 23d69857 Shikhar Bhushan
        assert(mode in (operations.RaiseMode.NONE, operations.RaiseMode.ERRORS, operations.RaiseMode.ALL))
126 19e7c7f6 Shikhar Bhushan
        self._raise_mode = mode
127 19e7c7f6 Shikhar Bhushan
128 b2d60e49 Shikhar Bhushan
    def execute(self, cls, *args, **kwds):
129 b2d60e49 Shikhar Bhushan
        return cls(self._session,
130 b2d60e49 Shikhar Bhushan
                   async=self._async_mode,
131 b2d60e49 Shikhar Bhushan
                   timeout=self._timeout,
132 b2d60e49 Shikhar Bhushan
                   raise_mode=self._raise_mode).request(*args, **kwds)
133 b2d60e49 Shikhar Bhushan
134 216bb34c Shikhar Bhushan
    def locked(self, target):
135 19e7c7f6 Shikhar Bhushan
        """Returns a context manager for a lock on a datastore, where *target* is the name of the configuration datastore to lock, e.g.::
136 19e7c7f6 Shikhar Bhushan

137 19e7c7f6 Shikhar Bhushan
            with m.locked("running"):
138 19e7c7f6 Shikhar Bhushan
                # do your stuff
139 19e7c7f6 Shikhar Bhushan

140 19e7c7f6 Shikhar Bhushan
        ... instead of::
141 19e7c7f6 Shikhar Bhushan

142 19e7c7f6 Shikhar Bhushan
            m.lock("running")
143 19e7c7f6 Shikhar Bhushan
            try:
144 19e7c7f6 Shikhar Bhushan
                # do your stuff
145 19e7c7f6 Shikhar Bhushan
            finally:
146 19e7c7f6 Shikhar Bhushan
                m.unlock("running")
147 19e7c7f6 Shikhar Bhushan
        """
148 216bb34c Shikhar Bhushan
        return operations.LockContext(self._session, target)
149 b2d60e49 Shikhar Bhushan
150 cc9af1c3 Shikhar Bhushan
    @property
151 a7cb58ce Shikhar Bhushan
    def client_capabilities(self):
152 19e7c7f6 Shikhar Bhushan
        ":class:`~ncclient.capabilities.Capabilities` object representing the client's capabilities."
153 cc9af1c3 Shikhar Bhushan
        return self._session._client_capabilities
154 4f650d54 Shikhar Bhushan
155 4f650d54 Shikhar Bhushan
    @property
156 4f650d54 Shikhar Bhushan
    def server_capabilities(self):
157 19e7c7f6 Shikhar Bhushan
        ":class:`~ncclient.capabilities.Capabilities` object representing the server's capabilities."
158 4f650d54 Shikhar Bhushan
        return self._session._server_capabilities
159 a7cb58ce Shikhar Bhushan
160 a7cb58ce Shikhar Bhushan
    @property
161 a7cb58ce Shikhar Bhushan
    def session_id(self):
162 19e7c7f6 Shikhar Bhushan
        "`session-id` assigned by the NETCONF server."
163 a7cb58ce Shikhar Bhushan
        return self._session.id
164 216bb34c Shikhar Bhushan
165 216bb34c Shikhar Bhushan
    @property
166 216bb34c Shikhar Bhushan
    def connected(self):
167 19e7c7f6 Shikhar Bhushan
        "Whether currently connected to the NETCONF server."
168 216bb34c Shikhar Bhushan
        return self._session.connected
169 c8381a66 Shikhar Bhushan
170 19e7c7f6 Shikhar Bhushan
    async_mode = property(fget=lambda self: self._async_mode, fset=__set_async_mode)
171 19e7c7f6 Shikhar Bhushan
    "Specify whether operations are executed asynchronously (`True`) or synchronously (`False`) (the default)."
172 c8381a66 Shikhar Bhushan
173 98f9e162 Shikhar Bhushan
    timeout = property(fget=lambda self: self._timeout, fset=__set_timeout)
174 98f9e162 Shikhar Bhushan
    "Specify the timeout for synchronous RPC requests."
175 c8381a66 Shikhar Bhushan
176 19e7c7f6 Shikhar Bhushan
    raise_mode = property(fget=lambda self: self._raise_mode, fset=__set_raise_mode)
177 19e7c7f6 Shikhar Bhushan
    "Specify which errors are raised as :exc:`~ncclient.operations.RPCError` exceptions. Valid values are the constants defined in :class:`~ncclient.operations.RaiseMode`. The default value is :attr:`~ncclient.operations.RaiseMode.ALL`."