Source code for insights.parsers.saphostctrl

"""
SAPHostCtrlInstances - Commands ``saphostctrl``
===============================================
"""
from insights.core import CommandParser
from insights.core.exceptions import ParseException, SkipComponent
from insights.core.filters import add_filter
from insights.core.plugins import parser
from insights.specs import Specs


SAP_INST_FILTERS = [
        '******',
        'SID',
        'SystemNumber',
        'InstanceName',
        'InstanceType',
        'Hostname',
        'SapVersionInfo',
        'FullQualifiedHostname'
]
add_filter(Specs.saphostctl_getcimobject_sapinstance, SAP_INST_FILTERS)


[docs] @parser(Specs.saphostctl_getcimobject_sapinstance) class SAPHostCtrlInstances(CommandParser, list): """ This class provides processing for the output of the ``saphostctrl -function GetCIMObject -enuminstances SAPInstance`` command on SAP systems. Sample output of the command:: ********************************************************* SID , String , D89 SystemNumber , String , 88 InstanceName , String , HDB88 InstanceType , String , HANA Test Hostname , String , hdb88 FullQualifiedHostname , String , hdb88.example.com IPAddress , String , 10.0.0.88 SapVersionInfo , String , 749, patch 211, changelist 1754007 ********************************************************* SID , String , D90 SystemNumber , String , 90 InstanceName , String , HDB90 InstanceType , String , HANA Test Hostname , String , hdb90 FullQualifiedHostname , String , hdb90.example.com IPAddress , String , 10.0.0.90 SapVersionInfo , String , 749, patch 211, changelist 1754007 Examples: >>> type(sap_inst) <class 'insights.parsers.saphostctrl.SAPHostCtrlInstances'> >>> sap_inst[1]['SID'] 'D90' >>> sap_inst[0]['SapVersionInfo'] '749, patch 211, changelist 1754007' >>> sap_inst[1]['InstanceType'] 'HANA Test' >>> sap_inst.types ['HDB'] >>> sorted(sap_inst.sids) ['D89', 'D90'] Raises: SkipComponent: When input is empty. ParseException: When input cannot be parsed. """
[docs] def parse_content(self, content): self._instances = [] self._sids = set() self._types = set() inst = {} for line in content: line = line.strip() if not line: continue if line.startswith('******'): inst = {} self.append(inst) continue fields = [i.strip() for i in line.split(',', 2)] if len(fields) < 3: raise ParseException("Incorrect line: '{0}'".format(line)) inst[fields[0]] = fields[2] if fields[0] == 'InstanceName': short_type = fields[2].strip('0123456789') # Back forward compatible: a short InstanceType was from the InstanceName if 'InstanceType' not in inst: inst.update(InstanceType=short_type) self._instances.append(fields[2]) self._types.add(short_type) self._sids.add(fields[2]) if fields[0] == 'SID' else None if len(self) < 1: raise SkipComponent("Nothing need to parse")
@property def instances(self): """ (list): The list of instances found in the cluster output. """ return self._instances @property def sids(self): """ (list): The list of SID found in the cluster output. """ return sorted(self._sids) @property def types(self): """ (list): The list of short instance types. The short instance type is set as the characters of the `InstanceName` before the `SystemNumber`. """ return sorted(self._types) @property def data(self): """ (list): List of dicts where keys are the lead name of each line and values are the string value. """ return self