Statistics
| Branch: | Tag: | Revision:

root / ncclient / operations / reply.py @ 41e2ed46

History | View | Annotate | Download (3.7 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 41e2ed46 Shikhar Bhushan
        root = ET.fromstring(self._raw) # <rpc-reply> element
35 3e022b7b Shikhar Bhushan
        
36 3e022b7b Shikhar Bhushan
        # per rfc 4741 an <ok/> tag is sent when there are no errors or warnings
37 3e022b7b Shikhar Bhushan
        oktags = _('ok')
38 3e022b7b Shikhar Bhushan
        for oktag in oktags:
39 3e022b7b Shikhar Bhushan
            if root.find(oktag) is not None:
40 41e2ed46 Shikhar Bhushan
                logger.debug('found %s' % oktag)
41 41e2ed46 Shikhar Bhushan
                self._parsed = True
42 3e022b7b Shikhar Bhushan
                return
43 3e022b7b Shikhar Bhushan
        
44 3e022b7b Shikhar Bhushan
        # create RPCError objects from <rpc-error> elements
45 3e022b7b Shikhar Bhushan
        errtags = _('rpc-error')
46 3e022b7b Shikhar Bhushan
        for errtag in errtags:
47 3e022b7b Shikhar Bhushan
            for err in root.getiterator(errtag): # a particular <rpc-error>
48 3e022b7b Shikhar Bhushan
                d = {}
49 3e022b7b Shikhar Bhushan
                for err_detail in err.getchildren(): # <error-type> etc..
50 3e022b7b Shikhar Bhushan
                    d[__(err_detail)] = err_detail.text
51 3e022b7b Shikhar Bhushan
                self._errors.append(RPCError(d))
52 3e022b7b Shikhar Bhushan
            if self._errors:
53 3e022b7b Shikhar Bhushan
                break
54 41e2ed46 Shikhar Bhushan
        self._parsed = True
55 5858a82c Shikhar Bhushan
    
56 5858a82c Shikhar Bhushan
    @property
57 5858a82c Shikhar Bhushan
    def raw(self):
58 5858a82c Shikhar Bhushan
        return self._raw
59 5858a82c Shikhar Bhushan
    
60 5858a82c Shikhar Bhushan
    @property
61 5858a82c Shikhar Bhushan
    def ok(self):
62 41e2ed46 Shikhar Bhushan
        if not self._parsed: self.parse()
63 41e2ed46 Shikhar Bhushan
        return not bool(self._errors) # empty list = false
64 5858a82c Shikhar Bhushan
    
65 5858a82c Shikhar Bhushan
    @property
66 5858a82c Shikhar Bhushan
    def errors(self):
67 3e022b7b Shikhar Bhushan
        'List of RPCError objects. Will be empty if no <rpc-error> elements in reply.'
68 41e2ed46 Shikhar Bhushan
        if not self._parsed: self.parse()
69 3e022b7b Shikhar Bhushan
        return self._errors
70 5858a82c Shikhar Bhushan
71 5858a82c Shikhar Bhushan
72 5858a82c Shikhar Bhushan
class RPCError(Exception): # raise it if you like
73 5858a82c Shikhar Bhushan
    
74 3e022b7b Shikhar Bhushan
    def __init__(self, err_dict):
75 5858a82c Shikhar Bhushan
        self._dict = err_dict
76 3e022b7b Shikhar Bhushan
        if self.message is not None:
77 3e022b7b Shikhar Bhushan
            Exception.__init__(self, self.message)
78 3e022b7b Shikhar Bhushan
        else:
79 3e022b7b Shikhar Bhushan
            Exception.__init__(self)
80 5858a82c Shikhar Bhushan
    
81 5858a82c Shikhar Bhushan
    @property
82 5858a82c Shikhar Bhushan
    def raw(self):
83 3e022b7b Shikhar Bhushan
        return self._element.tostring()
84 5858a82c Shikhar Bhushan
    
85 5858a82c Shikhar Bhushan
    @property
86 5858a82c Shikhar Bhushan
    def type(self):
87 3e022b7b Shikhar Bhushan
        return self.get('error-type', None)
88 5858a82c Shikhar Bhushan
    
89 5858a82c Shikhar Bhushan
    @property
90 5858a82c Shikhar Bhushan
    def severity(self):
91 3e022b7b Shikhar Bhushan
        return self.get('error-severity', None)
92 5858a82c Shikhar Bhushan
    
93 5858a82c Shikhar Bhushan
    @property
94 5858a82c Shikhar Bhushan
    def tag(self):
95 3e022b7b Shikhar Bhushan
        return self.get('error-tag', None)
96 5858a82c Shikhar Bhushan
    
97 5858a82c Shikhar Bhushan
    @property
98 5858a82c Shikhar Bhushan
    def path(self):
99 3e022b7b Shikhar Bhushan
        return self.get('error-path', None)
100 5858a82c Shikhar Bhushan
    
101 5858a82c Shikhar Bhushan
    @property
102 5858a82c Shikhar Bhushan
    def message(self):
103 3e022b7b Shikhar Bhushan
        return self.get('error-message', None)
104 5858a82c Shikhar Bhushan
    
105 5858a82c Shikhar Bhushan
    @property
106 5858a82c Shikhar Bhushan
    def info(self):
107 3e022b7b Shikhar Bhushan
        return self.get('error-info', None)
108 5858a82c Shikhar Bhushan
109 3e022b7b Shikhar Bhushan
    ## dictionary interface
110 5858a82c Shikhar Bhushan
    
111 3e022b7b Shikhar Bhushan
    __getitem__ = lambda self, key: self._dict.__getitem__(key)
112 5858a82c Shikhar Bhushan
    
113 3e022b7b Shikhar Bhushan
    __iter__ = lambda self: self._dict.__iter__()
114 5858a82c Shikhar Bhushan
    
115 3e022b7b Shikhar Bhushan
    __contains__ = lambda self, key: self._dict.__contains__(key)
116 5858a82c Shikhar Bhushan
    
117 3e022b7b Shikhar Bhushan
    keys = lambda self: self._dict.keys()
118 3e022b7b Shikhar Bhushan
    
119 3e022b7b Shikhar Bhushan
    get = lambda self, key, default: self._dict.get(key, default)
120 3e022b7b Shikhar Bhushan
        
121 3e022b7b Shikhar Bhushan
    iteritems = lambda self: self._dict.iteritems()
122 3e022b7b Shikhar Bhushan
    
123 3e022b7b Shikhar Bhushan
    iterkeys = lambda self: self._dict.iterkeys()
124 3e022b7b Shikhar Bhushan
    
125 3e022b7b Shikhar Bhushan
    itervalues = lambda self: self._dict.itervalues()
126 3e022b7b Shikhar Bhushan
    
127 3e022b7b Shikhar Bhushan
    values = lambda self: self._dict.values()
128 3e022b7b Shikhar Bhushan
    
129 3e022b7b Shikhar Bhushan
    items = lambda self: self._dict.items()
130 5858a82c Shikhar Bhushan
    
131 3e022b7b Shikhar Bhushan
    __repr__ = lambda self: repr(self._dict)