Source code for insights.combiners.satellite_version

"""
Satellite Version
=================

The following modules are included:

SatelliteVersion - Version of Satellite Server
----------------------------------------------
Combiner to get Satellite Server version information.

CapsuleVersion - Version of Satellite Capsule (>=6.2)
-----------------------------------------------------
Combiner to get Satellite Capsule version information. ONLY Satellite Capsule
6.2 and newer are supported.


"""

from insights import combiner, SkipComponent
from insights.parsers.satellite_version import Satellite6Version as Sat6Ver
from insights.parsers.installed_rpms import InstalledRpms


# NOTE:
# The following table only tracks 6.0.x and 6.1.x.
# See https://access.redhat.com/articles/1343683
# But, there are some mistakes in the KCS, the versions in below map
# are corrected according to the corresponding ERRATA pages.
#
# Update: Thu Nov 14 10:51:19 CST 2019
#
sat6_ver_map = {
        # Sat     foreman     candlepin   katello
        '6.0.8': ('1.6.0.53', '0.9.23', '1.5.0'),
        '6.1.1': ('1.7.2.33', '0.9.49.3', '2.2.0.14'),
        '6.1.2': ('1.7.2.36', '0.9.49.6', '2.2.0.16'),
        '6.1.3': ('1.7.2.43', '0.9.49.8', '2.2.0.16'),
        '6.1.4': ('1.7.2.46', '0.9.49.9', '2.2.0.16'),
        '6.1.5': ('1.7.2.49', '0.9.49.9', '2.2.0.16'),
        '6.1.6': ('1.7.2.50', '0.9.49.9', '2.2.0.17'),
        '6.1.7': ('1.7.2.53', '0.9.49.11', '2.2.0.17'),
        '6.1.8': ('1.7.2.55', '0.9.49.12', '2.2.0.19'),
        '6.1.9': ('1.7.2.56', '0.9.49.12', '2.2.0.19'),
        '6.1.10': ('1.7.2.61', '0.9.49.16', '2.2.0.19'),
        '6.1.11': ('1.7.2.62', '0.9.49.19', '2.2.0.19'),
        '6.1.12': ('1.7.2.63', '0.9.49.23', '2.2.0.19'),
}


def _parse_sat_version(version):
    ver_sp = version.split(".") if version else []
    major = int(ver_sp[0]) if ver_sp and ver_sp[0].isdigit() else None
    minor = int(ver_sp[1]) if len(ver_sp) > 1 and ver_sp[1].isdigit() else None
    return [major, minor]


[docs] @combiner(InstalledRpms, optional=[Sat6Ver]) class SatelliteVersion(object): """ Check the parsers :class:`insights.parsers.satellite_version.Satellite6Version` and :class:`insights.parsers.installed_rpms.InstalledRpms` for satellite version information. Below is the logic to determine the satellite version:: 1. For Satellite 6.1: a. Check the version information in below files at first - https://access.redhat.com/solutions/1392633 File: /usr/share/foreman/lib/satellite/version.rb b. Check the version of package foreman, candlepin and katello, E.g. - https://access.redhat.com/articles/1343683 Sat 6.0.8 Sat 6.1.10 Sat 6.1.11 foreman 1.6.0.53 1.7.2.61 1.7.2.62 candlepin 0.9.23 0.9.49.16 0.9.49.19 katello 1.5.0 2.2.0 2.2.0 2. For Satellite 6.2 and newer: Check the version of satellite package directly: - https://access.redhat.com/solutions/1392633 Sat 6.0.x Sat 6.1.x Sat 6.2.x satellite - - 6.2.x 3. For Satellite 5.x - https://access.redhat.com/solutions/1224043 NOTE: Because of satellite-branding is not deployed in Satellite 5.0~5.2, and satellite-schema can also be used for checking the version, here checked satellite-schema instead of satellite-branding. Check the version of package satellite-schema directly: Sat 5.0~5.2 Sat 5.3 ~ rhn-satellite-schema ok - satellite-schema - ok Attributes: full(str): the full version format like `version-release`. version(str): the satellite version do not includes `release`. release(str): the `release` string in the version. major(int): the major version. minor(int): the minor version. Raises: SkipComponent: When it's not a Satellite machine or the Satellite version cannot be determined according to current information. Examples: >>> sat_ver.full == 'satellite-6.2.0.11-1.el7sat' True >>> sat_ver.major 6 >>> sat_ver.minor 2 >>> sat_ver.version '6.2.0.11' >>> sat_ver.release '1.el7sat' """ def __init__(self, rpms, sat6_ver): self.full = None self.version = None self.release = None self.major = None self.minor = None # For Satellite 6.1, if satellite_version/version.rb is available: if sat6_ver: # no 'release' in this case, but more accurate self.full = sat6_ver.full self.version = sat6_ver.version self.major = sat6_ver.major self.minor = sat6_ver.minor else: # For Satellite 6.2 and newer, check the satellite package directly sat62_pkg = rpms.get_max('satellite') if sat62_pkg: self.full = sat62_pkg.package self.version = sat62_pkg.version self.release = sat62_pkg.release self.major, self.minor = _parse_sat_version(self.version) else: # For Satellite 6.0/6.1, check the version of: # - foreman, candlepin and katello fman = rpms.get_max('foreman') cndp = rpms.get_max('candlepin') ktlo = rpms.get_max('katello') if fman and cndp and ktlo: for sat_ver, map_ver in sat6_ver_map.items(): if all(pkg.version.startswith(mv) for pkg, mv in zip([fman, cndp, ktlo], map_ver)): # no 'release' in this situation self.major, self.minor = _parse_sat_version(sat_ver) self.full = self.version = sat_ver else: # For Satellite 5.x sat5_pkg = rpms.get_max('satellite-schema') or rpms.get_max('rhn-satellite-schema') if sat5_pkg: self.full = sat5_pkg.package self.version = sat5_pkg.version self.release = sat5_pkg.release self.major, self.minor = _parse_sat_version(self.version) if not self.full: raise SkipComponent("Not a Satellite machine or unable to determine Satellite version")
[docs] @combiner(InstalledRpms, optional=[SatelliteVersion]) class CapsuleVersion(object): """ Check the parser :class:`insights.parsers.installed_rpms.InstalledRpms` for satellite capsule version information. .. note:: ONLY Satellite Capsule 6.2 and newer are supported. Below is the logic to determine the satellite version:: Check the version of satellite/satellite-capsule directly: - https://access.redhat.com/solutions/1392633 Sat 6.0.x Sat 6.1.x Sat 6.2.x satellite-capsule - - 6.2.x Attributes: full(str): the full version format like `version-release`. version(str): the satellite version do not includes `release`. release(str): the `release` string in the version. major(int): the major version. minor(int): the minor version. Raises: SkipComponent: When it's not a Satellite Capsule machine or the Satellite Capsule version cannot be determined according to current information. Examples: >>> cap_ver.full == 'satellite-capsule-6.2.0.11-1.el7sat' True >>> cap_ver.major 6 >>> cap_ver.minor 2 >>> cap_ver.version '6.2.0.11' >>> cap_ver.release '1.el7sat' """ def __init__(self, rpms, sat_server): self.full = None self.version = None self.release = None self.major = None self.minor = None if sat_server: raise SkipComponent('Not a Satellite Capsule machine') # For Capsule, ONLY 6.2 and newer are supported sat62_pkg = rpms.get_max('satellite-capsule') if sat62_pkg: self.full = sat62_pkg.package self.version = sat62_pkg.version self.release = sat62_pkg.release self.major, self.minor = _parse_sat_version(self.version) else: raise SkipComponent("Not a Satellite Capsule machine or unable to determine the version")