python: use qom-list-get
Use qom-list-get to speed up the qom-tree command. Signed-off-by: Steve Sistare <steven.sistare@oracle.com> Acked-by: Markus Armbruster <armbru@redhat.com> Message-ID: <1752248703-217318-3-git-send-email-steven.sistare@oracle.com> Tested-by: Markus Armbruster <armbru@redhat.com> [Lint picked off to mollify make check-minreqs] Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
8eb6d39e22
commit
4ece9b61c9
2 changed files with 80 additions and 20 deletions
|
|
@ -31,8 +31,7 @@ QOM commands:
|
|||
##
|
||||
|
||||
import argparse
|
||||
|
||||
from qemu.qmp import ExecuteError
|
||||
from typing import List
|
||||
|
||||
from .qom_common import QOMCommand
|
||||
|
||||
|
|
@ -224,28 +223,34 @@ class QOMTree(QOMCommand):
|
|||
super().__init__(args)
|
||||
self.path = args.path
|
||||
|
||||
def _list_node(self, path: str) -> None:
|
||||
print(path)
|
||||
items = self.qom_list(path)
|
||||
for item in items:
|
||||
if item.child:
|
||||
continue
|
||||
try:
|
||||
rsp = self.qmp.cmd('qom-get', path=path,
|
||||
property=item.name)
|
||||
print(f" {item.name}: {rsp} ({item.type})")
|
||||
except ExecuteError as err:
|
||||
print(f" {item.name}: <EXCEPTION: {err!s}> ({item.type})")
|
||||
print('')
|
||||
for item in items:
|
||||
if not item.child:
|
||||
continue
|
||||
def _list_nodes(self, paths: List[str]) -> None:
|
||||
all_paths_props = self.qom_list_get(paths)
|
||||
i = 0
|
||||
|
||||
for props in all_paths_props:
|
||||
path = paths[i]
|
||||
i = i + 1
|
||||
print(path)
|
||||
if path == '/':
|
||||
path = ''
|
||||
self._list_node(f"{path}/{item.name}")
|
||||
newpaths = []
|
||||
|
||||
for item in props.properties:
|
||||
if item.child:
|
||||
newpaths += [f"{path}/{item.name}"]
|
||||
else:
|
||||
value = item.value
|
||||
if value is None:
|
||||
value = "<EXCEPTION: property could not be read>"
|
||||
print(f" {item.name}: {value} ({item.type})")
|
||||
|
||||
print('')
|
||||
|
||||
if newpaths:
|
||||
self._list_nodes(newpaths)
|
||||
|
||||
def run(self) -> int:
|
||||
self._list_node(self.path)
|
||||
self._list_nodes([self.path])
|
||||
return 0
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,52 @@ class ObjectPropertyInfo:
|
|||
return self.type.startswith('link<')
|
||||
|
||||
|
||||
class ObjectPropertyValue:
|
||||
"""
|
||||
Represents a property return from e.g. qom-tree-get
|
||||
"""
|
||||
def __init__(self, name: str, type_: str, value: object):
|
||||
self.name = name
|
||||
self.type = type_
|
||||
self.value = value
|
||||
|
||||
@classmethod
|
||||
def make(cls, value: Dict[str, Any]) -> 'ObjectPropertyValue':
|
||||
"""
|
||||
Build an ObjectPropertyValue from a Dict with an unknown shape.
|
||||
"""
|
||||
assert value.keys() >= {'name', 'type'}
|
||||
assert value.keys() <= {'name', 'type', 'value'}
|
||||
return cls(value['name'], value['type'], value.get('value'))
|
||||
|
||||
@property
|
||||
def child(self) -> bool:
|
||||
"""Is this property a child property?"""
|
||||
return self.type.startswith('child<')
|
||||
|
||||
|
||||
class ObjectPropertiesValues:
|
||||
"""
|
||||
Represents the return type from e.g. qom-list-get
|
||||
"""
|
||||
# pylint: disable=too-few-public-methods
|
||||
|
||||
def __init__(self, properties: List[ObjectPropertyValue]) -> None:
|
||||
self.properties = properties
|
||||
|
||||
@classmethod
|
||||
def make(cls, value: Dict[str, Any]) -> 'ObjectPropertiesValues':
|
||||
"""
|
||||
Build an ObjectPropertiesValues from a Dict with an unknown shape.
|
||||
"""
|
||||
assert value.keys() == {'properties'}
|
||||
props = [ObjectPropertyValue(item['name'],
|
||||
item['type'],
|
||||
item.get('value'))
|
||||
for item in value['properties']]
|
||||
return cls(props)
|
||||
|
||||
|
||||
CommandT = TypeVar('CommandT', bound='QOMCommand')
|
||||
|
||||
|
||||
|
|
@ -145,6 +191,15 @@ class QOMCommand:
|
|||
assert isinstance(rsp, list)
|
||||
return [ObjectPropertyInfo.make(x) for x in rsp]
|
||||
|
||||
def qom_list_get(self, paths: List[str]) -> List[ObjectPropertiesValues]:
|
||||
"""
|
||||
:return: a strongly typed list from the 'qom-list-get' command.
|
||||
"""
|
||||
rsp = self.qmp.cmd('qom-list-get', paths=paths)
|
||||
# qom-list-get returns List[ObjectPropertiesValues]
|
||||
assert isinstance(rsp, list)
|
||||
return [ObjectPropertiesValues.make(x) for x in rsp]
|
||||
|
||||
@classmethod
|
||||
def command_runner(
|
||||
cls: Type[CommandT],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue