Block device listing

Module for processing output of the lsblk command. Different information is provided by the lsblk command depending upon the options. Parsers included here are:

LSBlock - Command lsblk

The LSBlock class parses output of the lsblk command with no options.

LSBlockPairs - Command lsblk -P -o [columns...]

The LSBlockPairs class parses output of the lsblk -P -o [columns...] command.

These classes based on BlockDevices which implements all of the functionality except the parsing of command specific information. Information is stored in the attribute self.rows which is a list of BlockDevice objects.

Each BlockDevice object provides the functionality for one row of data from the command output. Data in a BlockDevice object is accessible by multiple methods. For example the NAME field can be accessed in the following four ways:

lsblk_info.rows[0].data['NAME']
lsblk_info.rows[0].NAME
lsblk_info.rows[0].name
lsblk_info.rows[0].get('NAME')

Sample output of the lsblk command looks like:

NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda           252:0    0    9G  0 disk
|-vda1        252:1    0  500M  0 part /boot
`-vda2        252:2    0  8.5G  0 part
  |-rhel-root 253:0    0  7.6G  0 lvm  /
  |-rhel-swap 253:1    0  924M  0 lvm  [SWAP]
sda             8:0    0  500G  0 disk
`-sda1          8:1    0  500G  0 part /data

Note the hierarchy demonstrated in the name column. For instance vda1 and vda2 are children of vda. Likewise, rhel-root and rhel-swap are children of vda2. This relationship is demonstrated in the PARENT_NAMES key, which is only present if the row is a child row. For example PARENT_NAMES value for rhel-root will be ['vda', 'vda2'] meaning that vda2 is the immediate parent and vda is parent of vda2.

Also note that column names that are not valid Python property names been changed. For example MAJ:MIN has been changed to MAJ_MIN.

Examples

>>> lsblk_info = shared[LSBlock]
>>> lsblk_info
<insights.parsers.lsblk.LSBlock object at 0x7f1f6a422d50>
>>> lsblk_info.rows
[disk:vda,
 part:vda1(/boot),
 part:vda2,
 lvm:rhel-root(/),
 lvm:rhel-swap([SWAP]),
 disk:sda,
 part:sda1(/data)]
>>> lsblk_info.rows[0]
disk:vda
>>> lsblk_info.rows[0].data
{'READ_ONLY': False, 'NAME': 'vda', 'REMOVABLE': False, 'MAJ_MIN': '252:0',
 'TYPE': 'disk', 'SIZE': '9G'}
>>> lsblk_info.rows[0].data['NAME']
'vda'
>>> lsblk_info.rows[0].NAME
'vda'
>>> lsblk_info.rows[0].name
'vda'
>>> lsblk_info.rows[0].data['MAJ_MIN']
'252:0'
>>> lsblk_info.rows[0].MAJ_MIN
'252:0'
>>> lsblk_info.rows[0].maj_min
'252:0'
>>> lsblk_info.rows[0].removable
False
>>> lsblk_info.rows[0].read_only
False
>>> lsblk_info.rows[2].data
{'READ_ONLY': False, 'PARENT_NAMES': ['vda'], 'NAME': 'vda2',
 'REMOVABLE': False, 'MAJ_MIN': '252:2', 'TYPE': 'part', 'SIZE': '8.5G'}
>>> lsblk_info.rows[2].parent_names
['vda']
>>> lsblk_info.rows[3].parent_names
['vda', 'vda2']
>>> lsblk_info.device_data['vda'] # Access devices by name
'disk:vda'
>>> lsblk_info.search(NAME='vda2')
[{'READ_ONLY': False, 'PARENT_NAMES': ['vda'], 'NAME': 'vda2',
 'REMOVABLE': False, 'MAJ_MIN': '252:2', 'TYPE': 'part', 'SIZE': '8.5G'}]
class insights.parsers.lsblk.BlockDevice(data)[source]

Bases: object

Class to contain one line of lsblk command information.

Contains all of the fields for a single line of lsblk output. Computed values are the column names except where the column name is an invalid variable name in Python such as MAJ:MIN. The get method is provided to access any value, including those that are not valid names in Python. All other valid names may be accessed as obj.column_name.

get(k, default=None)[source]

Get any value by keyword (column) name.

class insights.parsers.lsblk.BlockDevices(context, extra_bad_lines=None)[source]

Bases: CommandParser

Class to contain all information from lsblk command.

Output of the lsblk command is contained in this base class. Data may be accessed via the iterator and each item represents a row of output from the command in dict format.

rows

List of BlockDevice objects for each row of the input. Input column name matches key name except any ‘-’ is replaced with ‘_’ and the following names are changed:

Column Name     Key Name
MAJ:MIN         MAJ_MIN
RM              REMOVABLE
RO              READD_ONLY
Type:

list of BlockDevice

device_data

A dictionary of BlockDevice objects keyed on the ‘NAME’ column (e.g. sda or rhel-swap)

Type:

dict of BlockDevice

search(**kwargs)[source]

Returns a list of the block devices (in order) matching the given criteria. Keys are searched for directly - see the insights.parsers.keyword_search() utility function for more details. If no search parameters are given, no rows are returned. Keys need to be in all upper case, as they appear in the source data.

Examples

>>> blockdevs.search(NAME='sda1')
[{'NAME': '/dev/sda1', 'TYPE': 'disk', 'SIZE', '80G', ...}]
>>> blockdevs.search(TYPE='lvm')
[{'NAME': 'volgrp01-root', 'TYPE': 'lvm', 'SIZE', '15G', ...}...]
Parameters:

**kwargs (dict) -- Dictionary of key-value pairs to search for.

Returns:

The list of mount points matching the given criteria.

Return type:

(list)

class insights.parsers.lsblk.LSBlock(context, extra_bad_lines=None)[source]

Bases: BlockDevices

Parse output of the lsblk command.

The specific lsblk commands are /bin/lsblk and /usr/bin/lsblk. Typical content of the lsblk command output looks like:

NAME                            MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda                               8:0    0   80G  0 disk
|-sda1                            8:1    0  256M  0 part  /boot
`-sda2                            8:2    0 79.8G  0 part
  |-volgrp01-root (dm-0)        253:0    0   15G  0 lvm   /
  `-volgrp01-swap (dm-1)        253:1    0    8G  0 lvm   [SWAP]

Note

See the discussion of the key PARENT_NAMES above.

parse_content(content)[source]

This method must be implemented by classes based on this class.

class insights.parsers.lsblk.LSBlockPairs(context, extra_bad_lines=None)[source]

Bases: BlockDevices

Parse output of the lsblk -P -o command.

lsblk command with -P -o options provides explicit selection of output columns in keyword=value pairs.

The specific lsblk commands are /bin/lsblk -P -o column_names and /usr/bin/lsblk -P -o column_names. Typical content of the lsblk command output looks like:

ALIGNMENT="0" DISC-ALN="0" DISC-GRAN="0B" DISC-MAX="0B" DISC-ZERO="0"             FSTYPE="" GROUP="cdrom" KNAME="sr0" LABEL="" LOG-SEC="512" MAJ:MIN="11:0"             MIN-IO="512" MODE="brw-rw----" MODEL="DVD+-RW DVD8801 " MOUNTPOINT=""             NAME="sr0" OPT-IO="0" OWNER="root" PHY-SEC="512" RA="128" RM="1" RO="0"             ROTA="1" RQ-SIZE="128" SCHED="cfq" SIZE="1024M" STATE="running" TYPE="rom" UUID=""
ALIGNMENT="0" DISC-ALN="0" DISC-GRAN="0B" DISC-MAX="0B" DISC-ZERO="0"             FSTYPE="" GROUP="disk" KNAME="sda" LABEL="" LOG-SEC="512" MAJ:MIN="8:0"             MIN-IO="512" MODE="brw-rw----" MODEL="WDC WD1600JS-75N" MOUNTPOINT=""             NAME="sda" OPT-IO="0" OWNER="root" PHY-SEC="512" RA="128" RM="0" RO="0"             ROTA="1" RQ-SIZE="128" SCHED="cfq" SIZE="149G" STATE="running" TYPE="disk" UUID=""
ALIGNMENT="0" DISC-ALN="0" DISC-GRAN="0B" DISC-MAX="0B" DISC-ZERO="0"             FSTYPE="ext4" GROUP="disk" KNAME="sda1" LABEL="" LOG-SEC="512" MAJ:MIN="8:1"             MIN-IO="512" MODE="brw-rw----" MODEL="" MOUNTPOINT="/boot" NAME="sda1"             OPT-IO="0" OWNER="root" PHY-SEC="512" RA="128" RM="0" RO="0" ROTA="1"             RQ-SIZE="128" SCHED="cfq" SIZE="500M" STATE="" TYPE="part"             UUID="c7c4c016-8b00-4ded-bffb-5cc4719b7d45"
rows

List of BlockDevice objects for each row of the input. Input column name matches key name except that any ‘-’, ‘:’, or ‘.’ is replaced with ‘_’ and the following names are changed:

Column Name     Key Name
RM              removable
RO              read_only
Type:

list of BlockDevice

failed_device_paths

Set of device names that failed to get device path

Type:

set

Note

PARENT_NAMES is not available as a key because it is not listed in the LsBlockPairs output and cannot always be correctly inferred from the other data present.

parse_content(content)[source]

This method must be implemented by classes based on this class.