Source code for insights.combiners.sap

"""
Sap
===
This combiner combines the following parsers for SAP instances:
:class:`insights.parsers.saphostctrl.SAPHostCtrlInstances` and
:class:`insights.parsers.hostname.Hostname`
"""
from collections import namedtuple

from insights import SkipComponent
from insights.combiners.hostname import Hostname
from insights.core.plugins import combiner
from insights.parsers.saphostctrl import SAPHostCtrlInstances

SAPInstances = namedtuple(
    "SAPInstances",
    field_names=["name", "hostname", "sid", "type", "full_type", "number", "fqdn", "version"])
"""namedtuple: Type for storing the SAP instance."""

DAA_TYPES = {
    'Solution Manager Diagnostic Agent': ['SMDA'],
    'Diagnostic Agent': ['DAA', 'SMD'],
}
NETW_TYPES = ('D', 'ASCS', 'DVEBMGS', 'J', 'SCS', 'ERS', 'W', 'G', 'JC')
"""
tuple: Tuple of the prefix string of the functional SAP instances::

    D      :    NetWeaver (ABAP Dialog Instance)
    ASCS   :    NetWeaver (ABAP Central Services)
    DVEBMGS:    NetWeaver (Primary Application server)
    J      :    NetWeaver (Java App Server Instance)
    SCS    :    NetWeaver (Java Central Services)
    ERS    :    NetWeaver (Enqueue Replication Server)
    W      :    NetWeaver (WebDispatcher)
    G      :    NetWeaver (Gateway)
    JC     :    NetWeaver (Java App Server Instance)
"""


[docs] @combiner(Hostname, SAPHostCtrlInstances) class Sap(dict): """ It combines the following parsers for SAP instances: :class:`insights.parsers.saphostctrl.SAPHostCtrlInstances` and :class:`insights.parsers.hostname.Hostname` Attributes: Examples: >>> type(saps) <class 'insights.combiners.sap.Sap'> >>> 'DVEBMGS12' in saps True >>> saps['DVEBMGS12'].number '12' >>> saps.sid('ASCS10') 'R4D' >>> saps.hostname('ASCS10') 'host_1' >>> len(saps.instances) 3 >>> saps.is_hana False >>> saps.is_netweaver True >>> saps.is_ascs True """ def __init__(self, hostname, insts): hn = hostname.hostname fqdn = hostname.fqdn self._local_instances = [] self._instances = [] self._daa_instances = [] self._types = insts.types self._all_instances = insts.instances for inst in insts: k = inst['InstanceName'] if (hn == inst['Hostname'].split('.')[0] or fqdn == inst['FullQualifiedHostname'] or fqdn == inst['Hostname']): self._local_instances.append(k) self[k] = SAPInstances(k, inst['Hostname'], inst['SID'], inst['InstanceName'].strip('1234567890'), inst['InstanceType'], inst['SystemNumber'], inst['FullQualifiedHostname'], inst['SapVersionInfo']) if len(self) == 0: raise SkipComponent('No SAP instance.') for i in self.values(): if ( i.full_type in DAA_TYPES or i.type in [st for sts in DAA_TYPES.values() for st in sts] ): self._daa_instances.append(i.name) else: self._instances.append(i.name)
[docs] def version(self, instance): """str: Returns the version of the ``instance``.""" return self[instance].version if instance in self else None
[docs] def sid(self, instance): """str: Returns the sid of the ``instance``.""" return self[instance].sid if instance in self else None
[docs] def type(self, instance): """str: Returns the short type code of the ``instance``.""" return self[instance].type if instance in self else None
[docs] def full_type(self, instance): """str: Returns the full type code of the ``instance``.""" return self[instance].full_type if instance in self else None
[docs] def hostname(self, instance): """str: Returns the hostname of the ``instance``.""" return self[instance].hostname if instance in self else None
[docs] def number(self, instance): """str: Returns the systeme number of the ``instance``.""" return self[instance].number if instance in self else None
@property def is_netweaver(self): """bool: Is any SAP NetWeaver instance detected?""" return any(_t in self._types for _t in NETW_TYPES) @property def is_hana(self): """bool: Is any SAP HANA instance detected?""" return 'HDB' in self._types @property def is_ascs(self): """bool: Is any ABAP Central Services instance detected?""" return 'ASCS' in self._types @property def all_instances(self): """ list: List of all the SAP instances listed by the command. """ return self._all_instances @property def instances(self): """ list: List of the SAP instances that are NOT Diagnostic Agent instance, e.g. HANA, NetWeaver, ASCS, or other instances """ return self._instances @property def daa_instances(self): """ list: List of the SAP Diagnostic Agent instances, e.g. Diagnostics Agents: SMDA97/SMDA98 """ return self._daa_instances @property def function_instances(self): """ .. warning:: This property is deprecated and will be removed from 3.6.0. It's recommended to use the `daa_instances` attribute of :class:`insights.combiners.sap.Sap` instead. list: List of functional SAP instances. """ return self.daa_instances @property def business_instances(self): """ .. warning:: This property is deprecated and will be removed from 3.6.0. It's recommended to use the `instances` attribute of :class:`insights.combiners.sap.Sap` instead. list: List of business SAP instances. """ return self.instances @property def local_instances(self): """ .. warning:: This property is deprecated and will be removed from 3.6.0. List: List of all SAP instances running on this host. """ return self._local_instances @property def data(self): """ .. warning:: This property is deprecated and will be removed from 3.6.0. dict: Dict with the instance name as the key and instance details as the value. """ return self