root / ncclient / operations / reply.py @ 541247ba
History | View | Annotate | Download (3.8 kB)
1 | 5858a82c | Shikhar Bhushan | # Copyright 2009 Shikhar Bhushan
|
---|---|---|---|
2 | 5858a82c | Shikhar Bhushan | #
|
3 | 5858a82c | Shikhar Bhushan | # Licensed under the Apache License, Version 2.0 (the "License");
|
4 | 5858a82c | Shikhar Bhushan | # you may not use this file except in compliance with the License.
|
5 | 5858a82c | Shikhar Bhushan | # You may obtain a copy of the License at
|
6 | 5858a82c | Shikhar Bhushan | #
|
7 | 5858a82c | Shikhar Bhushan | # http://www.apache.org/licenses/LICENSE-2.0
|
8 | 5858a82c | Shikhar Bhushan | #
|
9 | 5858a82c | Shikhar Bhushan | # Unless required by applicable law or agreed to in writing, software
|
10 | 5858a82c | Shikhar Bhushan | # distributed under the License is distributed on an "AS IS" BASIS,
|
11 | 5858a82c | Shikhar Bhushan | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12 | 5858a82c | Shikhar Bhushan | # See the License for the specific language governing permissions and
|
13 | 5858a82c | Shikhar Bhushan | # limitations under the License.
|
14 | 5858a82c | Shikhar Bhushan | |
15 | 3e022b7b | Shikhar Bhushan | from xml.etree import cElementTree as ET |
16 | 5858a82c | Shikhar Bhushan | |
17 | 3e022b7b | Shikhar Bhushan | from ncclient.content import multiqualify as _ |
18 | 3e022b7b | Shikhar Bhushan | from ncclient.content import unqualify as __ |
19 | 5858a82c | Shikhar Bhushan | |
20 | 41e2ed46 | Shikhar Bhushan | import logging |
21 | 41e2ed46 | Shikhar Bhushan | logger = logging.getLogger('ncclient.operations.reply')
|
22 | 41e2ed46 | Shikhar Bhushan | |
23 | 5858a82c | Shikhar Bhushan | class RPCReply: |
24 | 5858a82c | Shikhar Bhushan | |
25 | 3e022b7b | Shikhar Bhushan | def __init__(self, raw): |
26 | 41e2ed46 | Shikhar Bhushan | self._raw = raw
|
27 | 3e022b7b | Shikhar Bhushan | self._parsed = False |
28 | 3e022b7b | Shikhar Bhushan | self._errors = []
|
29 | 5858a82c | Shikhar Bhushan | |
30 | 3e022b7b | Shikhar Bhushan | def __repr__(self): |
31 | 5858a82c | Shikhar Bhushan | return self._raw |
32 | 5858a82c | Shikhar Bhushan | |
33 | 5858a82c | Shikhar Bhushan | def parse(self): |
34 | 541247ba | Shikhar Bhushan | if self._parsed: return |
35 | 41e2ed46 | Shikhar Bhushan | root = ET.fromstring(self._raw) # <rpc-reply> element |
36 | 3e022b7b | Shikhar Bhushan | |
37 | 3e022b7b | Shikhar Bhushan | # per rfc 4741 an <ok/> tag is sent when there are no errors or warnings
|
38 | 3e022b7b | Shikhar Bhushan | oktags = _('ok')
|
39 | 3e022b7b | Shikhar Bhushan | for oktag in oktags: |
40 | 3e022b7b | Shikhar Bhushan | if root.find(oktag) is not None: |
41 | 541247ba | Shikhar Bhushan | logger.debug('parsed [%s]' % oktag)
|
42 | 41e2ed46 | Shikhar Bhushan | self._parsed = True |
43 | 3e022b7b | Shikhar Bhushan | return
|
44 | 3e022b7b | Shikhar Bhushan | |
45 | 3e022b7b | Shikhar Bhushan | # create RPCError objects from <rpc-error> elements
|
46 | 3e022b7b | Shikhar Bhushan | errtags = _('rpc-error')
|
47 | 3e022b7b | Shikhar Bhushan | for errtag in errtags: |
48 | 3e022b7b | Shikhar Bhushan | for err in root.getiterator(errtag): # a particular <rpc-error> |
49 | 541247ba | Shikhar Bhushan | logger.debug('parsed [%s]' % errtag)
|
50 | 3e022b7b | Shikhar Bhushan | d = {} |
51 | 3e022b7b | Shikhar Bhushan | for err_detail in err.getchildren(): # <error-type> etc.. |
52 | 541247ba | Shikhar Bhushan | d[__(err_detail.tag)] = err_detail.text |
53 | 3e022b7b | Shikhar Bhushan | self._errors.append(RPCError(d))
|
54 | 3e022b7b | Shikhar Bhushan | if self._errors: |
55 | 3e022b7b | Shikhar Bhushan | break
|
56 | 41e2ed46 | Shikhar Bhushan | self._parsed = True |
57 | 5858a82c | Shikhar Bhushan | |
58 | 5858a82c | Shikhar Bhushan | @property
|
59 | 5858a82c | Shikhar Bhushan | def raw(self): |
60 | 5858a82c | Shikhar Bhushan | return self._raw |
61 | 5858a82c | Shikhar Bhushan | |
62 | 5858a82c | Shikhar Bhushan | @property
|
63 | 5858a82c | Shikhar Bhushan | def ok(self): |
64 | 41e2ed46 | Shikhar Bhushan | if not self._parsed: self.parse() |
65 | 41e2ed46 | Shikhar Bhushan | return not bool(self._errors) # empty list = false |
66 | 5858a82c | Shikhar Bhushan | |
67 | 5858a82c | Shikhar Bhushan | @property
|
68 | 5858a82c | Shikhar Bhushan | def errors(self): |
69 | 3e022b7b | Shikhar Bhushan | 'List of RPCError objects. Will be empty if no <rpc-error> elements in reply.'
|
70 | 41e2ed46 | Shikhar Bhushan | if not self._parsed: self.parse() |
71 | 3e022b7b | Shikhar Bhushan | return self._errors |
72 | 5858a82c | Shikhar Bhushan | |
73 | 5858a82c | Shikhar Bhushan | |
74 | 5858a82c | Shikhar Bhushan | class RPCError(Exception): # raise it if you like |
75 | 5858a82c | Shikhar Bhushan | |
76 | 3e022b7b | Shikhar Bhushan | def __init__(self, err_dict): |
77 | 5858a82c | Shikhar Bhushan | self._dict = err_dict
|
78 | 3e022b7b | Shikhar Bhushan | if self.message is not None: |
79 | 3e022b7b | Shikhar Bhushan | Exception.__init__(self, self.message) |
80 | 3e022b7b | Shikhar Bhushan | else:
|
81 | 3e022b7b | Shikhar Bhushan | Exception.__init__(self) |
82 | 5858a82c | Shikhar Bhushan | |
83 | 5858a82c | Shikhar Bhushan | @property
|
84 | 5858a82c | Shikhar Bhushan | def raw(self): |
85 | 3e022b7b | Shikhar Bhushan | return self._element.tostring() |
86 | 5858a82c | Shikhar Bhushan | |
87 | 5858a82c | Shikhar Bhushan | @property
|
88 | 5858a82c | Shikhar Bhushan | def type(self): |
89 | 3e022b7b | Shikhar Bhushan | return self.get('error-type', None) |
90 | 5858a82c | Shikhar Bhushan | |
91 | 5858a82c | Shikhar Bhushan | @property
|
92 | 5858a82c | Shikhar Bhushan | def severity(self): |
93 | 3e022b7b | Shikhar Bhushan | return self.get('error-severity', None) |
94 | 5858a82c | Shikhar Bhushan | |
95 | 5858a82c | Shikhar Bhushan | @property
|
96 | 5858a82c | Shikhar Bhushan | def tag(self): |
97 | 3e022b7b | Shikhar Bhushan | return self.get('error-tag', None) |
98 | 5858a82c | Shikhar Bhushan | |
99 | 5858a82c | Shikhar Bhushan | @property
|
100 | 5858a82c | Shikhar Bhushan | def path(self): |
101 | 3e022b7b | Shikhar Bhushan | return self.get('error-path', None) |
102 | 5858a82c | Shikhar Bhushan | |
103 | 5858a82c | Shikhar Bhushan | @property
|
104 | 5858a82c | Shikhar Bhushan | def message(self): |
105 | 3e022b7b | Shikhar Bhushan | return self.get('error-message', None) |
106 | 5858a82c | Shikhar Bhushan | |
107 | 5858a82c | Shikhar Bhushan | @property
|
108 | 5858a82c | Shikhar Bhushan | def info(self): |
109 | 3e022b7b | Shikhar Bhushan | return self.get('error-info', None) |
110 | 5858a82c | Shikhar Bhushan | |
111 | 3e022b7b | Shikhar Bhushan | ## dictionary interface
|
112 | 5858a82c | Shikhar Bhushan | |
113 | 3e022b7b | Shikhar Bhushan | __getitem__ = lambda self, key: self._dict.__getitem__(key) |
114 | 5858a82c | Shikhar Bhushan | |
115 | 3e022b7b | Shikhar Bhushan | __iter__ = lambda self: self._dict.__iter__() |
116 | 5858a82c | Shikhar Bhushan | |
117 | 3e022b7b | Shikhar Bhushan | __contains__ = lambda self, key: self._dict.__contains__(key) |
118 | 5858a82c | Shikhar Bhushan | |
119 | 3e022b7b | Shikhar Bhushan | keys = lambda self: self._dict.keys() |
120 | 3e022b7b | Shikhar Bhushan | |
121 | 3e022b7b | Shikhar Bhushan | get = lambda self, key, default: self._dict.get(key, default) |
122 | 3e022b7b | Shikhar Bhushan | |
123 | 3e022b7b | Shikhar Bhushan | iteritems = lambda self: self._dict.iteritems() |
124 | 3e022b7b | Shikhar Bhushan | |
125 | 3e022b7b | Shikhar Bhushan | iterkeys = lambda self: self._dict.iterkeys() |
126 | 3e022b7b | Shikhar Bhushan | |
127 | 3e022b7b | Shikhar Bhushan | itervalues = lambda self: self._dict.itervalues() |
128 | 3e022b7b | Shikhar Bhushan | |
129 | 3e022b7b | Shikhar Bhushan | values = lambda self: self._dict.values() |
130 | 3e022b7b | Shikhar Bhushan | |
131 | 3e022b7b | Shikhar Bhushan | items = lambda self: self._dict.items() |
132 | 5858a82c | Shikhar Bhushan | |
133 | 541247ba | Shikhar Bhushan | __repr__ = lambda self: repr(self._dict) |