Message ID | 20200130214431.333510-17-mreitz@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block: Fix check_to_replace_node() | expand |
31.01.2020 0:44, Max Reitz wrote: > Signed-off-by: Max Reitz<mreitz@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
31.01.2020 0:44, Max Reitz wrote: > Signed-off-by: Max Reitz <mreitz@redhat.com> > --- > tests/qemu-iotests/iotests.py | 56 +++++++++++++++++++++++++++++++++++ > 1 file changed, 56 insertions(+) > > diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py > index 01b58dcb50..69861cf05e 100644 > --- a/tests/qemu-iotests/iotests.py > +++ b/tests/qemu-iotests/iotests.py > @@ -713,6 +713,62 @@ class VM(qtest.QEMUQtestMachine): > > return fields.items() <= ret.items() > > + def assert_block_path(self, root, path, expected_node, graph=None): > + """ > + Check whether the node under the given path in the block graph > + is @expected_node. > + > + @root is the node name of the node where the @path is rooted. > + > + @path is a string that consists of child names separated by > + slashes. It must begin with a slash. > + > + Examples for @root + @path: > + - root="qcow2-node", path="/backing/file" > + - root="quorum-node", path="/children.2/file" > + > + Hypothetically, @path could be empty, in which case it would > + point to @root. However, in practice this case is not useful > + and hence not allowed. > + > + @expected_node may be None. (All elements of the path but the > + leaf must still exist.) > + > + @graph may be None or the result of an x-debug-query-block-graph > + call that has already been performed. > + """ > + if graph is None: > + graph = self.qmp('x-debug-query-block-graph')['return'] > + > + iter_path = iter(path.split('/')) > + > + # Must start with a / > + assert next(iter_path) == '' > + > + node = next((node for node in graph['nodes'] if node['name'] == root), > + None) > + > + for child_name in iter_path: > + assert node is not None, 'Cannot follow path %s' % path this error message will be a bit misleading if we failed to find root node. So, may be add additional assert for root node, or at least 'Cannot follow path %s%s'.format(root, path) It doesn't worth to resend only for this, apply it if you want and keep my r-b anyway. > + > + try: > + node_id = next(edge['child'] for edge in graph['edges'] \ > + if edge['parent'] == node['id'] and > + edge['name'] == child_name) > + > + node = next(node for node in graph['nodes'] \ > + if node['id'] == node_id) > + except StopIteration: > + node = None > + > + if node is None: > + assert expected_node is None, \ > + 'No node found under %s (but expected %s)' % \ > + (path, expected_node) > + else: > + assert node['name'] == expected_node, \ > + 'Found node %s under %s (but expected %s)' % \ > + (node['name'], path, expected_node) > > index_re = re.compile(r'([^\[]+)\[([^\]]+)\]') > >
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index 01b58dcb50..69861cf05e 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -713,6 +713,62 @@ class VM(qtest.QEMUQtestMachine): return fields.items() <= ret.items() + def assert_block_path(self, root, path, expected_node, graph=None): + """ + Check whether the node under the given path in the block graph + is @expected_node. + + @root is the node name of the node where the @path is rooted. + + @path is a string that consists of child names separated by + slashes. It must begin with a slash. + + Examples for @root + @path: + - root="qcow2-node", path="/backing/file" + - root="quorum-node", path="/children.2/file" + + Hypothetically, @path could be empty, in which case it would + point to @root. However, in practice this case is not useful + and hence not allowed. + + @expected_node may be None. (All elements of the path but the + leaf must still exist.) + + @graph may be None or the result of an x-debug-query-block-graph + call that has already been performed. + """ + if graph is None: + graph = self.qmp('x-debug-query-block-graph')['return'] + + iter_path = iter(path.split('/')) + + # Must start with a / + assert next(iter_path) == '' + + node = next((node for node in graph['nodes'] if node['name'] == root), + None) + + for child_name in iter_path: + assert node is not None, 'Cannot follow path %s' % path + + try: + node_id = next(edge['child'] for edge in graph['edges'] \ + if edge['parent'] == node['id'] and + edge['name'] == child_name) + + node = next(node for node in graph['nodes'] \ + if node['id'] == node_id) + except StopIteration: + node = None + + if node is None: + assert expected_node is None, \ + 'No node found under %s (but expected %s)' % \ + (path, expected_node) + else: + assert node['name'] == expected_node, \ + 'Found node %s under %s (but expected %s)' % \ + (node['name'], path, expected_node) index_re = re.compile(r'([^\[]+)\[([^\]]+)\]')
Signed-off-by: Max Reitz <mreitz@redhat.com> --- tests/qemu-iotests/iotests.py | 56 +++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+)