Skip to content

Commit

Permalink
Merge pull request #397 from fredgan/multiple_subtree_filters
Browse files Browse the repository at this point in the history
Bugfix #373 the get() operation not accepting multiple subtree filters
  • Loading branch information
einarnn committed Jun 30, 2020
2 parents 790c1e9 + 8fc380c commit dac36ac
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
4 changes: 4 additions & 0 deletions ncclient/operations/util.py
Expand Up @@ -56,6 +56,10 @@ def build_filter(spec, capcheck=None):
rep.append(to_ele(criteria))
else:
raise OperationError("Invalid filter type")
elif isinstance(spec, list):
rep = new_ele("filter", type="subtree")
for cri in spec:
rep.append(to_ele(cri))
else:

rep = validated_element(spec, ("filter", qualify("filter"),
Expand Down
40 changes: 40 additions & 0 deletions test/unit/operations/test_retrieve.py
Expand Up @@ -220,3 +220,43 @@ def test_dispatch_2(self, mock_request):
call = mock_request.call_args_list[0][0][0]
call = ElementTree.tostring(call)
self.assertEqual(call, xml)

@patch('ncclient.operations.retrieve.RPC._request')
def test_get_with_multi_subtree_filters(self, mock_request):
result = '''
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
<cont1 xmlns="urn:mod1">
<le1>test_mod1_001</le1>
<le2>this is a test-one example</le2>
</cont1>
<cont2 xmlns="urn:mod2">
<le1>test_mod2_002</le1>
<le2>this is a test-two example</le2>
<lst>
<le3>a list of mod2</le3>
</lst>
</cont2>
</data>'''
mock_request.return_value = result
session = ncclient.transport.SSHSession(self.device_handler)
obj = Get(session, self.device_handler, raise_mode=RaiseMode.ALL)

multi_subtree_filters = [
'<cont1 xmlns="urn:mod1"> \
<le1/> \
<le2/> \
</cont1>',
'<cont2 xmlns="urn:mod2"/>'
]

ret = obj.request(copy.deepcopy(multi_subtree_filters))
node = new_ele("get")
node.append(util.build_filter(multi_subtree_filters))
xml = ElementTree.tostring(node)
call = mock_request.call_args_list[0][0][0]
call = ElementTree.tostring(call)
self.assertEqual(call, xml)
self.assertEqual(ret, result)

0 comments on commit dac36ac

Please sign in to comment.