Statistics
| Branch: | Tag: | Revision:

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)