Source code for insights.parsers.engine_config

"""engine_config - command ``engine-config --all``
==================================================

This module provides access to ovirt-engine configuration parameters
by parsing output of command ``engine-config --all``.
"""
from collections import namedtuple
from operator import itemgetter

from .. import parser, get_active_lines, CommandParser
from insights.specs import Specs


[docs] @parser(Specs.engine_config_all) class EngineConfigAll(CommandParser): """Parsing output of command ``engine-config --all`` The parser tries its best to get `value` & `version` for specified `keyword`. At the moment it works well for output which has `keyword`, `value` & `version` in a single line. It ignores keywords where is fails. It skip(rather fails) the `keyword` having multi-line output. Typical output of ``engine-config --all`` command is:: MaxRerunVmOnVdsCount: 3 version: general MaxStorageVdsTimeoutCheckSec: 30 version: general ClusterRequiredRngSourcesDefault: version: 3.6 ClusterRequiredRngSourcesDefault: version: 4.0 ClusterRequiredRngSourcesDefault: version: 4.1 HotUnplugCpuSupported: {"x86":"false","ppc":"false"} version: 3.6 HotUnplugCpuSupported: {"x86":"false","ppc":"false"} version: 4.0 HotUnplugCpuSupported: {"x86":"true","ppc":"true"} version: 4.1 Examples: >>> from insights.parsers.engine_config import EngineConfigAll >>> from insights.tests import context_wrap >>> output = EngineConfigAll(context_wrap(OUTPUT))} >>> 'MaxRerunVmOnVdsCount' in output True >>> output['MaxRerunVmOnVdsCount'] ['3'] >>> output.get('MaxRerunVmOnVdsCount') ['3'] >>> output['HotUnplugCpuSupported'] ['{"x86":"false","ppc":"false"}', '{"x86":"false","ppc":"false"}', '{"x86":"true","ppc":"true"}'] >>> output['ClusterRequiredRngSourcesDefault'] [] >>> output.head('HotUnplugCpuSupported') '{"x86":"false","ppc":"false"}' >>> output.last('HotUnplugCpuSupported') '{"x86":"true","ppc":"true"}' >>> output.get_version('HotUnplugCpuSupported') ['3.6', '4.0', '4.1'] >>> 'IDoNotExit' in output False >>> output['IDoNotExit'] [] >>> output.get('IDoNotExit') [] >>> output.get_version('IDoNotExit') [] >>> output.head('IDoNotExist) >>> output.last('IDoNotExist) Attributes: fields (list): List of `KeyValue` namedtupules for each line in the configuration file. keywords (set): Set of keywords present in the configuration file, each keyword has been converted to lowercase. """ keyvalue = namedtuple('KeyValue', ['keyword', 'value', 'version', 'kw_lower']) """namedtuple: Represent name value pair as a namedtuple with case."""
[docs] def parse_content(self, content): """Parse each active line for keyword, values & version. Args: content (list): Output of command ``engine-config --all``. """ self.fields = [] for line in get_active_lines(content): try: key, val, ver = itemgetter(0, 1, -1)(line.split(' ')) self.fields.append(self.keyvalue(key.strip(':'), val, ver, key.strip(':').lower())) # noqa except: # TODO: Log an exception. pass self.keywords = set([kw.kw_lower for kw in self.fields])
def __contains__(self, keyword): return keyword.lower() in self.keywords def __iter__(self): return iter(self.fields) def __getitem__(self, keyword): return self.get(keyword)
[docs] def get(self, keyword): """A get value for keyword specified. A "dictionary like" method. Example: >>> output.get('MaxStorageVdsTimeoutCheckSec') ['30'] Args: keyword (str): A key. For ex. `HotUnplugCpuSupported`. Returns: list: Values associated with a keyword. Returns an empty list if, all the values are empty or `keyword` does not exist. """ kw = keyword.lower() if kw in self.keywords: return [kv.value for kv in self.fields if kv.kw_lower == kw if kv.value] return []
[docs] def head(self, keyword): """Get first element from values(list). Example: >>> output['HotUnplugCpuSupported'] ['{"x86":"false","ppc":"false"}', '{"x86":"false","ppc":"false"}', '{"x86":"true","ppc":"true"}'] >>> output.head('HotUnplugCpuSupported') '{"x86":"false","ppc":"false"}' Args: keyword (str): A key. For ex. `HotUnplugCpuSupported`. Returns: str: First element from values(list) associated with a keyword else None """ values = self.__getitem__(keyword) if values: return values[0]
[docs] def last(self, keyword): """Get last element from values(list). Example: >>> output['HotUnplugCpuSupported'] ['{"x86":"false","ppc":"false"}', '{"x86":"false","ppc":"false"}', '{"x86":"true","ppc":"true"}'] >>> output.last('HotUnplugCpuSupported') '{"x86":"true","ppc":"true"}' Args: keyword (str): A key. For ex. `HotUnplugCpuSupported`. Returns: str: Last element from values(list) associated with a keyword else None. """ values = self.__getitem__(keyword) if values: return values[-1]
[docs] def get_version(self, keyword): """Get versions associated with a key. Typical output is ``engine-config --all`` command:: MaxStorageVdsTimeoutCheckSec: 30 version: general HotUnplugCpuSupported: {"x86":"false","ppc":"false"} version: 3.6 HotUnplugCpuSupported: {"x86":"false","ppc":"false"} version: 4.0 HotUnplugCpuSupported: {"x86":"true","ppc":"true"} version: 4.1 Examples: >>> output.get_version('MaxStorageVdsTimeoutCheckSec') ['general'] >>> output.get_version('HotUnplugCpuSupported') ['3.6', '4.0', '4.1'] Args: keyword (str): A key. For ex. `HotUnplugCpuSupported`. Returns: list: Versions associated with a keyword. Returns an empty list if, all the versions are empty or `keyword` does not exist. """ kw = keyword.lower() if kw in self.keywords: return [kv.version for kv in self.fields if kv.kw_lower == kw if kv.version] return []