Statistics
| Branch: | Tag: | Revision:

root / ncclient / manager.py @ b660fcda

History | View | Annotate | Download (4.3 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 b660fcda Shikhar Bhushan
OPERATIONS = {
39 b660fcda Shikhar Bhushan
    "get": operations.Get,
40 b660fcda Shikhar Bhushan
    "get_config": operations.GetConfig,
41 b660fcda Shikhar Bhushan
    "edit_config": operations.EditConfig,
42 b660fcda Shikhar Bhushan
    "copy_config": operations.CopyConfig,
43 b660fcda Shikhar Bhushan
    "validate": operations.Validate,
44 b660fcda Shikhar Bhushan
    "commit": operations.Commit,
45 b660fcda Shikhar Bhushan
    "discard_changes": operations.DiscardChanges,
46 b660fcda Shikhar Bhushan
    "delete_config": operations.DeleteConfig,
47 b660fcda Shikhar Bhushan
    "lock": operations.Lock,
48 b660fcda Shikhar Bhushan
    "unlock": operations.Unlock,
49 b660fcda Shikhar Bhushan
    "close_session": operations.CloseSession,
50 b660fcda Shikhar Bhushan
    "kill_session": operations.KillSession,
51 b660fcda Shikhar Bhushan
    "poweroff_machine": operations.PoweroffMachine,
52 b660fcda Shikhar Bhushan
    "reboot_machine": operations.RebootMachine
53 b660fcda Shikhar Bhushan
}
54 b660fcda Shikhar Bhushan
55 dd225c7a Shikhar Bhushan
class Manager(object):
56 4f650d54 Shikhar Bhushan
57 dd225c7a Shikhar Bhushan
    """API for NETCONF operations.
58 216bb34c Shikhar Bhushan

59 216bb34c Shikhar Bhushan
    It is also a context manager, so a :class:`Manager` instance can be used
60 216bb34c Shikhar Bhushan
    with the *with* statement. The session is closed when the context ends. """
61 4f650d54 Shikhar Bhushan
62 4f650d54 Shikhar Bhushan
    def __init__(self, session):
63 179b00d4 Shikhar Bhushan
        self._session = session
64 c8381a66 Shikhar Bhushan
        self._async_mode = False
65 c8381a66 Shikhar Bhushan
        self._timeout = None
66 6c70b245 Shikhar Bhushan
        self._raise_mode = 'all'
67 216bb34c Shikhar Bhushan
68 454339d6 Shikhar Bhushan
    def __enter__(self):
69 454339d6 Shikhar Bhushan
        return self
70 454339d6 Shikhar Bhushan
71 c8381a66 Shikhar Bhushan
    def __exit__(self, *argss):
72 454339d6 Shikhar Bhushan
        self.close()
73 454339d6 Shikhar Bhushan
        return False
74 d6688264 Shikhar Bhushan
75 dd225c7a Shikhar Bhushan
    def __getattr__(self, name):
76 b660fcda Shikhar Bhushan
        op = OPERATIONS.get(name, None)
77 0304f041 Shikhar Bhushan
        if op is None:
78 dd225c7a Shikhar Bhushan
            raise AttributeError
79 c8381a66 Shikhar Bhushan
        else:
80 0304f041 Shikhar Bhushan
            return op(self.session,
81 c8381a66 Shikhar Bhushan
                      async=self._async_mode,
82 0304f041 Shikhar Bhushan
                      timeout=self._timeout,
83 6c70b245 Shikhar Bhushan
                      raise_mode=self._raise_mode).request
84 0304f041 Shikhar Bhushan
    
85 216bb34c Shikhar Bhushan
    def locked(self, target):
86 216bb34c Shikhar Bhushan
        """Returns a context manager for the *with* statement.
87 216bb34c Shikhar Bhushan

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