Statistics
| Branch: | Tag: | Revision:

root / ncclient / manager.py @ 6e571704

History | View | Annotate | Download (6.8 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 19e7c7f6 Shikhar Bhushan
"""This module is a thin layer of abstraction around the library. It exposes all core functionality."""
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 b2d60e49 Shikhar Bhushan
23 454339d6 Shikhar Bhushan
logger = logging.getLogger('ncclient.manager')
24 454339d6 Shikhar Bhushan
25 e3b66e4b Shikhar Bhushan
CAPABILITIES = [
26 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:base:1.0",
27 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:writable-running:1.0",
28 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:candidate:1.0",
29 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:confirmed-commit:1.0",
30 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:rollback-on-error:1.0",
31 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:startup:1.0",
32 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:url:1.0?scheme=http,ftp,file,https,sftp",
33 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:validate:1.0",
34 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:xpath:1.0",
35 68ac4439 Shikhar Bhushan
    "urn:liberouter:params:netconf:capability:power-control:1.0"
36 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:interleave:1.0"
37 e3b66e4b Shikhar Bhushan
]
38 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."""
39 2f8bc438 Shikhar Bhushan
40 b660fcda Shikhar Bhushan
OPERATIONS = {
41 b660fcda Shikhar Bhushan
    "get": operations.Get,
42 b660fcda Shikhar Bhushan
    "get_config": operations.GetConfig,
43 b660fcda Shikhar Bhushan
    "edit_config": operations.EditConfig,
44 b660fcda Shikhar Bhushan
    "copy_config": operations.CopyConfig,
45 b660fcda Shikhar Bhushan
    "validate": operations.Validate,
46 b660fcda Shikhar Bhushan
    "commit": operations.Commit,
47 b660fcda Shikhar Bhushan
    "discard_changes": operations.DiscardChanges,
48 b660fcda Shikhar Bhushan
    "delete_config": operations.DeleteConfig,
49 b660fcda Shikhar Bhushan
    "lock": operations.Lock,
50 b660fcda Shikhar Bhushan
    "unlock": operations.Unlock,
51 b660fcda Shikhar Bhushan
    "close_session": operations.CloseSession,
52 b660fcda Shikhar Bhushan
    "kill_session": operations.KillSession,
53 b660fcda Shikhar Bhushan
    "poweroff_machine": operations.PoweroffMachine,
54 b660fcda Shikhar Bhushan
    "reboot_machine": operations.RebootMachine
55 b660fcda Shikhar Bhushan
}
56 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."""
57 4f650d54 Shikhar Bhushan
58 68ac4439 Shikhar Bhushan
def connect_ssh(*args, **kwds):
59 19e7c7f6 Shikhar Bhushan
    """Initialize a :class:`Manager` over the SSH transport. For documentation of arguments see :meth:`ncclient.transport.SSHSession.connect`.
60 19e7c7f6 Shikhar Bhushan

61 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`.
62 b2d60e49 Shikhar Bhushan
    """
63 e3b66e4b Shikhar Bhushan
    session = transport.SSHSession(capabilities.Capabilities(CAPABILITIES))
64 68ac4439 Shikhar Bhushan
    session.load_known_hosts()
65 68ac4439 Shikhar Bhushan
    session.connect(*args, **kwds)
66 68ac4439 Shikhar Bhushan
    return Manager(session)
67 68ac4439 Shikhar Bhushan
68 68ac4439 Shikhar Bhushan
connect = connect_ssh
69 4bc8021f Shikhar Bhushan
"Same as :func:`connect_ssh`, since SSH is the default (and currently, the only) transport."
70 216bb34c Shikhar Bhushan
71 b2d60e49 Shikhar Bhushan
class OpExecutor(type):
72 19e7c7f6 Shikhar Bhushan
73 b2d60e49 Shikhar Bhushan
    def __new__(cls, name, bases, attrs):
74 b2d60e49 Shikhar Bhushan
        def make_wrapper(op_cls):
75 b2d60e49 Shikhar Bhushan
            def wrapper(self, *args, **kwds):
76 b2d60e49 Shikhar Bhushan
                return self.execute(op_cls, *args, **kwds)
77 b2d60e49 Shikhar Bhushan
            wrapper.func_doc = op_cls.request.func_doc
78 b2d60e49 Shikhar Bhushan
            return wrapper
79 b2d60e49 Shikhar Bhushan
        for op_name, op_cls in OPERATIONS.iteritems():
80 b2d60e49 Shikhar Bhushan
            attrs[op_name] = make_wrapper(op_cls)
81 b2d60e49 Shikhar Bhushan
        return super(OpExecutor, cls).__new__(cls, name, bases, attrs)
82 b2d60e49 Shikhar Bhushan
83 68ac4439 Shikhar Bhushan
class Manager(object):
84 4f650d54 Shikhar Bhushan
85 19e7c7f6 Shikhar Bhushan
    """For details on the expected behavior of the operations and their parameters refer to :rfc:`4741`.
86 19e7c7f6 Shikhar Bhushan

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

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

92 19e7c7f6 Shikhar Bhushan
    ... or like this::
93 b2d60e49 Shikhar Bhushan

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

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

138 19e7c7f6 Shikhar Bhushan
        ... instead of::
139 19e7c7f6 Shikhar Bhushan

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