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 |