Statistics
| Branch: | Tag: | Revision:

root / ncclient / manager.py @ 6ab782f7

History | View | Annotate | Download (4 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 94803aaf Shikhar Bhushan
import capabilities
16 94803aaf Shikhar Bhushan
import operations
17 94803aaf Shikhar Bhushan
import transport
18 94803aaf Shikhar Bhushan
19 94803aaf Shikhar Bhushan
OPERATIONS = {
20 94803aaf Shikhar Bhushan
    'get': operations.Get,
21 94803aaf Shikhar Bhushan
    'get-config': operations.GetConfig,
22 94803aaf Shikhar Bhushan
    'edit-config': operations.EditConfig,
23 94803aaf Shikhar Bhushan
    'copy-config': operations.CopyConfig,
24 94803aaf Shikhar Bhushan
    'validate': operations.Validate,
25 94803aaf Shikhar Bhushan
    'commit': operations.Commit,
26 94803aaf Shikhar Bhushan
    'discard-changes': operations.DiscardChanges,
27 94803aaf Shikhar Bhushan
    'delete-config': operations.DeleteConfig,
28 94803aaf Shikhar Bhushan
    'lock': operations.Lock,
29 94803aaf Shikhar Bhushan
    'unlock': operations.Unlock,
30 94803aaf Shikhar Bhushan
    'close_session': operations.CloseSession,
31 94803aaf Shikhar Bhushan
    'kill-session': operations.KillSession,
32 94803aaf Shikhar Bhushan
}
33 94803aaf Shikhar Bhushan
34 2f8bc438 Shikhar Bhushan
def connect_ssh(*args, **kwds):
35 2f8bc438 Shikhar Bhushan
    session = transport.SSHSession(capabilities.CAPABILITIES)
36 2f8bc438 Shikhar Bhushan
    session.load_system_host_keys()
37 2f8bc438 Shikhar Bhushan
    session.connect(*args, **kwds)
38 2f8bc438 Shikhar Bhushan
    return Manager(session)
39 2f8bc438 Shikhar Bhushan
40 179b00d4 Shikhar Bhushan
connect = connect_ssh # default session type
41 2f8bc438 Shikhar Bhushan
42 2f8bc438 Shikhar Bhushan
class Manager:
43 94803aaf Shikhar Bhushan
    
44 cc9af1c3 Shikhar Bhushan
    "Thin layer of abstraction for the ncclient API."
45 94803aaf Shikhar Bhushan
    
46 179b00d4 Shikhar Bhushan
    RAISE_ALL = 0
47 179b00d4 Shikhar Bhushan
    RAISE_ERROR = 1
48 179b00d4 Shikhar Bhushan
    RAISE_NONE = 2
49 d6688264 Shikhar Bhushan
    
50 179b00d4 Shikhar Bhushan
    def __init__(self, session, rpc_error=Manager.RAISE_ERROR):
51 179b00d4 Shikhar Bhushan
        self._session = session
52 179b00d4 Shikhar Bhushan
        self._raise = rpc_error
53 d6688264 Shikhar Bhushan
54 cc9af1c3 Shikhar Bhushan
    def rpc(self, op, *args, **kwds):
55 2f8bc438 Shikhar Bhushan
        op = OPERATIONS[op](self._session)
56 2f8bc438 Shikhar Bhushan
        reply = op.request(*args, **kwds)
57 2f8bc438 Shikhar Bhushan
        if not reply.ok:
58 179b00d4 Shikhar Bhushan
            if self._raise == Manager.RAISE_ALL:
59 179b00d4 Shikhar Bhushan
                raise reply.error
60 179b00d4 Shikhar Bhushan
            elif self._raise == Manager.RAISE_ERROR:
61 179b00d4 Shikhar Bhushan
                for error in reply.errors:
62 179b00d4 Shikhar Bhushan
                    if error.severity == 'error':
63 179b00d4 Shikhar Bhushan
                        raise error
64 2f8bc438 Shikhar Bhushan
        return reply
65 179b00d4 Shikhar Bhushan
    
66 179b00d4 Shikhar Bhushan
    def __enter__(self):
67 179b00d4 Shikhar Bhushan
        pass
68 179b00d4 Shikhar Bhushan
    
69 179b00d4 Shikhar Bhushan
    def __exit__(self, *args):
70 179b00d4 Shikhar Bhushan
        self.close()
71 179b00d4 Shikhar Bhushan
        return False
72 179b00d4 Shikhar Bhushan
    
73 179b00d4 Shikhar Bhushan
    def _get(self, type, *args, **kwds):
74 179b00d4 Shikhar Bhushan
        reply = self.do(type)
75 179b00d4 Shikhar Bhushan
        return reply.data
76 179b00d4 Shikhar Bhushan
    
77 179b00d4 Shikhar Bhushan
    def locked(self, target):
78 cc9af1c3 Shikhar Bhushan
        "Returns a context manager for use withthe 'with' statement.
79 cc9af1c3 Shikhar Bhushan
        `target` is the datastore to lock, e.g. 'candidate'"
80 a6c00291 Shikhar Bhushan
        return operations.LockContext(self._session, target)
81 cc9af1c3 Shikhar Bhushan
     
82 2f8bc438 Shikhar Bhushan
    get = lambda self, *args, **kwds: self._get('get')
83 2f8bc438 Shikhar Bhushan
    
84 2f8bc438 Shikhar Bhushan
    get_config = lambda self, *args, **kwds: self._get('get-config')
85 2f8bc438 Shikhar Bhushan
    
86 a6c00291 Shikhar Bhushan
    edit_config = lambda self, *args, **kwds: self.do('edit-config', *args, **kwds)
87 2f8bc438 Shikhar Bhushan
    
88 a6c00291 Shikhar Bhushan
    copy_config = lambda self, *args, **kwds: self.do('copy-config', *args, **kwds)
89 2f8bc438 Shikhar Bhushan
    
90 a6c00291 Shikhar Bhushan
    validate = lambda self, *args, **kwds: self.do('validate', *args, **kwds)
91 2f8bc438 Shikhar Bhushan
    
92 a6c00291 Shikhar Bhushan
    commit = lambda self, *args, **kwds: self.do('commit', *args, **kwds)
93 2f8bc438 Shikhar Bhushan
    
94 a6c00291 Shikhar Bhushan
    discard_changes = lambda self, *args, **kwds: self.do('discard-changes', *args, **kwds)
95 2f8bc438 Shikhar Bhushan
    
96 a6c00291 Shikhar Bhushan
    delete_config = lambda self, *args, **kwds: self.do('delete-config', *args, **kwds)
97 2f8bc438 Shikhar Bhushan
    
98 a6c00291 Shikhar Bhushan
    lock = lambda self, *args, **kwds: self.do('lock', *args, **kwds)
99 2f8bc438 Shikhar Bhushan
    
100 a6c00291 Shikhar Bhushan
    unlock = lambda self, *args, **kwds: self.do('unlock', *args, **kwds)
101 2f8bc438 Shikhar Bhushan
    
102 a6c00291 Shikhar Bhushan
    close_session = lambda self, *args, **kwds: self.do('close-session', *args, **kwds)
103 2f8bc438 Shikhar Bhushan
    
104 a6c00291 Shikhar Bhushan
    kill_session = lambda self, *args, **kwds: self.do('kill-session', *args, **kwds)
105 2f8bc438 Shikhar Bhushan
    
106 2f8bc438 Shikhar Bhushan
    def close(self):
107 179b00d4 Shikhar Bhushan
        try: # try doing it clean
108 2f8bc438 Shikhar Bhushan
            self.close_session()
109 2f8bc438 Shikhar Bhushan
        except:
110 179b00d4 Shikhar Bhushan
            pass
111 179b00d4 Shikhar Bhushan
        if self._session.connected: # if that didn't work...
112 2f8bc438 Shikhar Bhushan
            self._session.close()
113 cc9af1c3 Shikhar Bhushan
114 cc9af1c3 Shikhar Bhushan
    @property
115 cc9af1c3 Shikhar Bhushan
    def session(self, session):
116 cc9af1c3 Shikhar Bhushan
        return self._session
117 cc9af1c3 Shikhar Bhushan
    
118 cc9af1c3 Shikhar Bhushan
    def get_capabilities(self, whose):
119 cc9af1c3 Shikhar Bhushan
        if whose in ('manager', 'client'):
120 cc9af1c3 Shikhar Bhushan
            return self._session._client_capabilities
121 cc9af1c3 Shikhar Bhushan
        elif whose in ('agent', 'server')
122 cc9af1c3 Shikhar Bhushan
            return self._session._server_capabilities
123 cc9af1c3 Shikhar Bhushan
124 cc9af1c3 Shikhar Bhushan
   
125 cc9af1c3 Shikhar Bhushan
    @property
126 cc9af1c3 Shikhar Bhushan
    def capabilities(self):
127 cc9af1c3 Shikhar Bhushan
        return self._session._client_capabilities