c6cb33b8257f0b63b403409342960316f7f012f8
[ncclient] / ncclient / operations / util.py
1 # Copyright 2009 Shikhar Bhushan
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #    http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 'Boilerplate ugliness'
16
17 from ncclient import content
18
19 from errors import OperationError, MissingCapabilityError
20
21 def one_of(*args):
22     'Verifies that only one of the arguments is not None'
23     for i, arg in enumerate(args):
24         if arg is not None:
25             for argh in args[i+1:]:
26                 if argh is not None:
27                     raise OperationError('Too many parameters')
28             else:
29                 return
30     raise OperationError('Insufficient parameters')
31
32 def store_or_url(wha, loc, capcheck=None):
33     node = { 'tag': wha, 'subtree': {} }
34     if '://' in loc: # e.g. http://, file://, ftp://
35         if capcheck is not None:
36             capcheck(':url') # url schema check at some point!
37         node['subtree']['tag'] = 'url'
38         node['subtree']['text'] = loc
39     else:
40         #if loc == 'candidate':
41         #    capcheck(':candidate')
42         #elif loc == 'startup':
43         #    capcheck(':startup')
44         #elif loc == 'running' and wha == 'target':
45         #    capcheck(':writable-running')
46         node['subtree']['tag'] = loc
47     return node
48
49 def build_filter(spec, capcheck=None):
50     type = None
51     if isinstance(spec, tuple):
52         type, criteria = spec
53         rep = {'tag': 'filter', 'attrib': {'type': type}}
54         if type == 'xpath':
55             rep['attrib']['select'] = criteria
56         elif type == 'subtree':
57             rep['subtree'] = criteria
58         else:
59             raise OperationError("Invalid filter type")
60     else:
61         rep = content.validated_element(spec, ['filter', content.qualify('filter')],
62                                         attrs=[('type', content.qualify('type'))])
63     if type == 'xpath' and capcheck is not None:
64         capcheck(':xpath')
65     return rep