Skip to content

Commit

Permalink
fix: Enhance combiner "SatelliteVersion" and "CapsuleVersion" (#3336)
Browse files Browse the repository at this point in the history
* Check the hostname in rhsm.conf too to decide if it's a satellite server
  or capsule when it exists. Sometimes the packages satellite and satellite-capsule are
  installed at the same time, but from the hostname in rhsm.conf, we know it's just
  a capsule server.

Signed-off-by: Huanhuan Li <[email protected]>
  • Loading branch information
huali027 authored Feb 17, 2022
1 parent 47c4340 commit d4d7c0a
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 19 deletions.
18 changes: 12 additions & 6 deletions insights/combiners/satellite_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from insights import combiner, SkipComponent
from insights.parsers.satellite_version import Satellite6Version as Sat6Ver
from insights.parsers.installed_rpms import InstalledRpms
from insights.parsers.rhsm_conf import RHSMConf


# NOTE:
Expand Down Expand Up @@ -46,6 +47,8 @@
'6.1.12': ('1.7.2.63', '0.9.49.23', '2.2.0.19'),
}

CND_HOSTNAMES = ['subscription.rhn.redhat.com', 'subscription.rhsm.redhat.com', 'subscription.rhsm.stage.redhat.com']


def _parse_sat_version(version):
ver_sp = version.split(".") if version else []
Expand All @@ -54,7 +57,7 @@ def _parse_sat_version(version):
return [major, minor]


@combiner(InstalledRpms, optional=[Sat6Ver])
@combiner(InstalledRpms, optional=[Sat6Ver, RHSMConf])
class SatelliteVersion(object):
"""
Check the parsers
Expand Down Expand Up @@ -122,7 +125,7 @@ class SatelliteVersion(object):
>>> sat_ver.release
'1.el7sat'
"""
def __init__(self, rpms, sat6_ver):
def __init__(self, rpms, sat6_ver, rhsm_conf):
self.full = None
self.version = None
self.release = None
Expand All @@ -140,6 +143,8 @@ def __init__(self, rpms, sat6_ver):
# For Satellite 6.2 and newer, check the satellite package directly
sat62_pkg = rpms.get_max('satellite')
if sat62_pkg:
if rhsm_conf and rhsm_conf.get('server', 'hostname') not in CND_HOSTNAMES:
raise SkipComponent("Not a Satellite server host.")
self.full = sat62_pkg.package
self.version = sat62_pkg.version
self.release = sat62_pkg.release
Expand Down Expand Up @@ -168,7 +173,7 @@ def __init__(self, rpms, sat6_ver):
raise SkipComponent("Not a Satellite machine or unable to determine Satellite version")


@combiner(InstalledRpms)
@combiner(InstalledRpms, optional=[RHSMConf])
class CapsuleVersion(object):
"""
Check the parser
Expand Down Expand Up @@ -210,7 +215,7 @@ class CapsuleVersion(object):
>>> cap_ver.release
'1.el7sat'
"""
def __init__(self, rpms):
def __init__(self, rpms, rhsm_conf):
self.full = None
self.version = None
self.release = None
Expand All @@ -219,8 +224,9 @@ def __init__(self, rpms):

# For Capsule, ONLY 6.2 and newer are supported
sat62_pkg = rpms.get_max('satellite-capsule')
# foreman package should not be there on Capsule Server
if sat62_pkg and 'foreman' not in rpms:
if sat62_pkg:
if rhsm_conf and rhsm_conf.get('server', 'hostname') in CND_HOSTNAMES:
raise SkipComponent("Not a Satellite Capsule host.")
self.full = sat62_pkg.package
self.version = sat62_pkg.version
self.release = sat62_pkg.release
Expand Down
108 changes: 95 additions & 13 deletions insights/combiners/tests/test_satellite_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from insights.parsers.satellite_version import Satellite6Version
from insights.combiners import satellite_version
from insights.combiners.satellite_version import SatelliteVersion, CapsuleVersion
from insights.parsers.rhsm_conf import RHSMConf
from insights.tests import context_wrap
from insights import SkipComponent
import pytest
Expand Down Expand Up @@ -48,6 +49,58 @@
satellite-capsule-6.2.0.11-1.el7sat.noarch Wed May 18 14:16:25 2016
"""

BOTH_SATELLITE_AND_SATELLITE_CAPSULE = """
scl-utils-20120927-27.el7_6.x86_64 Wed May 18 14:18:16 2016
SDL-1.2.14-6.el7.x86_64 Wed May 18 14:16:25 2016
satellite-capsule-6.8.0.11-1.el7sat.noarch Wed May 18 14:16:25 2016
satellite-6.8.0.11-1.el7sat.noarch Wed May 18 14:16:25 2016
foreman.el7.x86_64 Wed May 18 14:16:25 2016
"""

RHSM_CONF_CDN = """
# Red Hat Subscription Manager Configuration File:
# Unified Entitlement Platform Configuration
[server]
# Server hostname:
hostname = subscription.rhsm.redhat.com
# Server prefix:
prefix = /subscription
# Server port:
port = 443
# Set to 1 to disable certificate validation:
insecure = 0
# Set the depth of certs which should be checked
# when validating a certificate
ssl_verify_depth = 3
"""

RHSM_CONF_NON_CDN = """
# Red Hat Subscription Manager Configuration File:
# Unified Entitlement Platform Configuration
[server]
# Server hostname:
hostname = abc.def.fg.com
# Server prefix:
prefix = /subscription
# Server port:
port = 443
# Set to 1 to disable certificate validation:
insecure = 0
# Set the depth of certs which should be checked
# when validating a certificate
ssl_verify_depth = 3
"""

satellite_version_rb = """
COMMAND> cat /usr/share/foreman/lib/satellite/version.rb
Expand Down Expand Up @@ -88,7 +141,7 @@ def test_get_sat5_version():
rpms = InstalledRpms(context_wrap(installed_rpms_5))
expected = ('satellite-schema-5.6.0.10-1.el6sat',
'5.6.0.10', '1.el6sat', 5, 6)
result = SatelliteVersion(rpms, None)
result = SatelliteVersion(rpms, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -99,7 +152,7 @@ def test_get_sat5_version():
def test_get_sat61_version():
rpms = InstalledRpms(context_wrap(installed_rpms_61))
expected = ('6.1.7', '6.1.7', None, 6, 1)
result = SatelliteVersion(rpms, None)
result = SatelliteVersion(rpms, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -108,7 +161,7 @@ def test_get_sat61_version():

sat = Satellite6Version(context_wrap(satellite_version_rb))
expected = ('6.1.3', '6.1.3', None, 6, 1)
result = SatelliteVersion(rpms, sat)
result = SatelliteVersion(rpms, sat, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -117,7 +170,7 @@ def test_get_sat61_version():

rpms = InstalledRpms(context_wrap(installed_rpms_6110))
expected = ('6.1.10', '6.1.10', None, 6, 1)
result = SatelliteVersion(rpms, None)
result = SatelliteVersion(rpms, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -126,7 +179,7 @@ def test_get_sat61_version():

rpms = InstalledRpms(context_wrap(installed_rpms_6111))
expected = ('6.1.11', '6.1.11', None, 6, 1)
result = SatelliteVersion(rpms, None)
result = SatelliteVersion(rpms, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -137,7 +190,7 @@ def test_get_sat61_version():
def test_get_sat60():
rpms = InstalledRpms(context_wrap(installed_rpms_60))
expected = ('6.0.8', '6.0.8', None, 6, 0)
result = SatelliteVersion(rpms, None)
result = SatelliteVersion(rpms, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -149,7 +202,7 @@ def test_get_sat61_version_both():
rpms = InstalledRpms(context_wrap(installed_rpms_61))
sat = Satellite6Version(context_wrap(satellite_version_rb))
expected = ('6.1.3', '6.1.3', None, 6, 1)
result = SatelliteVersion(rpms, sat)
result = SatelliteVersion(rpms, sat, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -161,7 +214,7 @@ def test_get_sat62_version():
rpms = InstalledRpms(context_wrap(installed_rpms_62))
expected = ('satellite-6.2.0.11-1.el7sat',
'6.2.0.11', '1.el7sat', 6, 2)
result = SatelliteVersion(rpms, None)
result = SatelliteVersion(rpms, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -173,7 +226,7 @@ def test_get_sat62_capsule_version():
rpms = InstalledRpms(context_wrap(installed_rpms_62_cap))
expected = ('satellite-capsule-6.2.0.11-1.el7sat',
'6.2.0.11', '1.el7sat', 6, 2)
result = CapsuleVersion(rpms)
result = CapsuleVersion(rpms, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -184,21 +237,50 @@ def test_get_sat62_capsule_version():
def test_no_sat_installed():
rpms = InstalledRpms(context_wrap(no_sat))
with pytest.raises(SkipComponent) as sc:
SatelliteVersion(rpms, None)
SatelliteVersion(rpms, None, None)
assert "Not a Satellite machine" in str(sc)

rpms = InstalledRpms(context_wrap(no_sat))
with pytest.raises(SkipComponent) as sc:
CapsuleVersion(rpms, None)
assert "Not a Satellite Capsule machine" in str(sc)

rpms = InstalledRpms(context_wrap(installed_rpms_611x_confilct))
with pytest.raises(SkipComponent) as sc:
SatelliteVersion(rpms, None)
SatelliteVersion(rpms, None, None)
assert "unable to determine Satellite version" in str(sc)


def test_both_pkgs():
rpms = InstalledRpms(context_wrap(BOTH_SATELLITE_AND_SATELLITE_CAPSULE))
rhsm = RHSMConf(context_wrap(RHSM_CONF_CDN))
result = SatelliteVersion(rpms, None, rhsm)
assert result is not None
assert result.version == '6.8.0.11'

rpms = InstalledRpms(context_wrap(BOTH_SATELLITE_AND_SATELLITE_CAPSULE))
rhsm = RHSMConf(context_wrap(RHSM_CONF_NON_CDN))
with pytest.raises(SkipComponent):
SatelliteVersion(rpms, None, rhsm)

rpms = InstalledRpms(context_wrap(BOTH_SATELLITE_AND_SATELLITE_CAPSULE))
rhsm = RHSMConf(context_wrap(RHSM_CONF_NON_CDN))
result = CapsuleVersion(rpms, rhsm)
assert result is not None
assert result.version == '6.8.0.11'

rpms = InstalledRpms(context_wrap(BOTH_SATELLITE_AND_SATELLITE_CAPSULE))
rhsm = RHSMConf(context_wrap(RHSM_CONF_CDN))
with pytest.raises(SkipComponent):
CapsuleVersion(rpms, rhsm)


def test_doc_examples():
sat_rpms = InstalledRpms(context_wrap(installed_rpms_62))
cap_rpms = InstalledRpms(context_wrap(installed_rpms_62_cap))
env = {
'sat_ver': SatelliteVersion(sat_rpms, None),
'cap_ver': CapsuleVersion(cap_rpms),
'sat_ver': SatelliteVersion(sat_rpms, None, None),
'cap_ver': CapsuleVersion(cap_rpms, None),
}
failed, total = doctest.testmod(satellite_version, globs=env)
assert failed == 0

0 comments on commit d4d7c0a

Please sign in to comment.