"""
HDBVersion - Commands
=====================
Shared parser for parsing output of the ``sudo -iu <SID>adm HDB version``
commands.
"""
from insights.core import CommandParser
from insights.core.exceptions import SkipComponent
from insights.core.plugins import parser
from insights.specs import Specs
[docs]@parser(Specs.sap_hdb_version)
class HDBVersion(CommandParser, dict):
"""
Class for parsing the output of `HDB version` command.
Typical output of the command is::
# sudo -iu sr1adm HDB version
HDB version info:
version: 2.00.030.00.1522210459
branch: hanaws
machine config: linuxx86_64
git hash: bb2ff6b25b8eab5ab382c170a43dc95ae6ce298f
git merge time: 2018-03-28 06:14:19
weekstone: 2018.13.0
cloud edition: 0000.00.00
compile date: 2018-03-28 06:19:13
compile host: ld2221
compile type: rel
Attributes:
version (str): the raw HDB version
major (str): the major version
minor (str): the minor version
revision (str): the SAP HANA SPS revision number
patchlevel (str): the patchlevel number of this revision
sid (str): the SID of this SAP HANA
Examples:
>>> type(hdb_ver)
<class 'insights.parsers.sap_hdb_version.HDBVersion'>
>>> hdb_ver.sid
'sr1'
>>> hdb_ver.version
'2.00.030.00.1522210459'
>>> hdb_ver.major
'2'
>>> hdb_ver.minor
'00'
>>> hdb_ver.revision
'030'
>>> hdb_ver.patchlevel
'00'
>>> hdb_ver['machine config']
'linuxx86_64'
"""
[docs] def parse_content(self, content):
_ignore_bad_lines = [
'HDB: Command not found',
'standard error',
'does not exist',
]
if len(content) <= 1:
raise SkipComponent("Incorrect content.")
data = {}
self.sid = self.version = self.revision = None
self.major = self.minor = self.patchlevel = None
# get the "sid" from the file_name: "sudo_-iu_<sid>adm_HDB_version"
if self.file_name and 'adm' in self.file_name:
self.sid = [i for i in self.file_name.split('_') if i.endswith('adm')][0][:-3]
for line in content:
# Skip unexpected lines
if ':' not in line or any(i in line for i in _ignore_bad_lines):
continue
key, val = [i.strip() for i in line.split(':', 1)]
data[key] = val
if key == 'version':
self.version = val
val_splits = val.split('.')
if len(val_splits) != 5:
raise SkipComponent("Incorrect HDB version: {0}.".format(val))
self.major = val_splits[0]
self.minor = val_splits[1]
self.revision = val_splits[2]
self.patchlevel = val_splits[3]
if not self.version:
raise SkipComponent("Incorrect content.")
self.update(data)
@property
def data(self):
return self