python-cephclient: populate items list for all nodes except osd

cephclient wrapper is converting a flat list of dictionaries returned
by Ceph Mimic's osd_crush_tree() to nested dictionaries (actual tree)
as expected sysinv. While doing this it looks at the "children"
attribute and if there's none then it skips populating current
node "items".

For storage nodes that don't have any attached OSDs the corresponding
tree entry will not have an "items" attribute. When sysinv tries to
get OSD's by storage it tries to access it and crashes.

Fix by creating empty "items" attribute unless node type is "osd".

Closes-Bug: 1834539
Change-Id: Icc5988407c9773d10d2cd1078e08ae213075f793
Signed-off-by: Daniel Badea <daniel.badea@windriver.com>
This commit is contained in:
Daniel Badea 2019-07-12 17:14:00 +00:00
parent 3903e7ca44
commit 03636c6fcb

View File

@ -101,7 +101,7 @@ class CephWrapper(CephClient):
def _osd_crush_tree_populate_tree(self, node, node_map): def _osd_crush_tree_populate_tree(self, node, node_map):
children = node.get('children') children = node.get('children')
node = self._osd_crush_tree_convert_node(node) node = self._osd_crush_tree_convert_node(node)
if children: if node['type'] != 'osd':
node['items'] = [] node['items'] = []
for _id in children: for _id in children:
node['items'].append( node['items'].append(