Skip to content

Commit

Permalink
fix: Enhance combiner "SatelliteVersion" (#3340)
Browse files Browse the repository at this point in the history
* Sometimes satellite will register to itself, in this case,
  we also need to identify it's a satellite server.

Signed-off-by: Huanhuan Li <[email protected]>
  • Loading branch information
huali027 authored Feb 17, 2022
1 parent d4d7c0a commit cc2e262
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 26 deletions.
18 changes: 14 additions & 4 deletions insights/combiners/satellite_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
from insights.parsers.satellite_version import Satellite6Version as Sat6Ver
from insights.parsers.installed_rpms import InstalledRpms
from insights.parsers.rhsm_conf import RHSMConf
from insights.combiners.hostname import Hostname
from insights.parsers.ssl_certificate import RhsmKatelloDefaultCACert


# NOTE:
Expand Down Expand Up @@ -57,7 +59,7 @@ def _parse_sat_version(version):
return [major, minor]


@combiner(InstalledRpms, optional=[Sat6Ver, RHSMConf])
@combiner(InstalledRpms, optional=[Sat6Ver, RHSMConf, Hostname, RhsmKatelloDefaultCACert])
class SatelliteVersion(object):
"""
Check the parsers
Expand Down Expand Up @@ -125,7 +127,7 @@ class SatelliteVersion(object):
>>> sat_ver.release
'1.el7sat'
"""
def __init__(self, rpms, sat6_ver, rhsm_conf):
def __init__(self, rpms, sat6_ver, rhsm_conf, hostname, ca_cert):
self.full = None
self.version = None
self.release = None
Expand All @@ -143,8 +145,16 @@ def __init__(self, rpms, sat6_ver, rhsm_conf):
# 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.")
if rhsm_conf:
if not rhsm_conf.has_option('server', 'hostname'):
raise SkipComponent("Not a Satellite server host.")
if rhsm_conf.get('server', 'hostname') not in CND_HOSTNAMES:
# check if satellite register to itself
if not hostname or not (
(hostname.hostname in rhsm_conf.get('server', 'hostname')) or
(ca_cert and 'issuer' in ca_cert and hostname.fqdn in ca_cert['issuer'])
):
raise SkipComponent("Not a Satellite server host.")
self.full = sat62_pkg.package
self.version = sat62_pkg.version
self.release = sat62_pkg.release
Expand Down
101 changes: 79 additions & 22 deletions insights/combiners/tests/test_satellite_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
from insights.parsers.satellite_version import Satellite6Version
from insights.combiners import satellite_version
from insights.combiners.satellite_version import SatelliteVersion, CapsuleVersion
from insights.parsers.ssl_certificate import RhsmKatelloDefaultCACert
from insights.parsers.rhsm_conf import RHSMConf
from insights.combiners.hostname import Hostname
from insights.parsers.hostname import Hostname as Hnf
from insights.tests import context_wrap
from insights import SkipComponent
import pytest
Expand Down Expand Up @@ -101,6 +104,31 @@
ssl_verify_depth = 3
"""

RHSM_CONF_CDN_NO_HOSTNAME = """
# Red Hat Subscription Manager Configuration File:
# Unified Entitlement Platform Configuration
[server]
# Server hostname:
"""

HOSTNAME_1 = """
abc.def.fg.com
"""

HOSTNAME_2 = """
testsat.example.com
"""

KATELLO_DEFAULT_CA_ISSUER_OUPTUT_HIT = """
issuer= /C=US/ST=North Carolina/L=Raleigh/O=Katello/OU=SomeOrgUnit/CN=testsat.example.com
""".strip()

KATELLO_DEFAULT_CA_ISSUER_OUPTUT_NON_HIT = """
issuer= /C=US/ST=North Carolina/L=Raleigh/O=Katello/OU=SomeOrgUnit/CN=another.example.com
""".strip()


satellite_version_rb = """
COMMAND> cat /usr/share/foreman/lib/satellite/version.rb
Expand Down Expand Up @@ -141,7 +169,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, None)
result = SatelliteVersion(rpms, None, None, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -152,7 +180,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, None)
result = SatelliteVersion(rpms, None, None, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -161,7 +189,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, None)
result = SatelliteVersion(rpms, sat, None, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -170,7 +198,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, None)
result = SatelliteVersion(rpms, None, None, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -179,7 +207,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, None)
result = SatelliteVersion(rpms, None, None, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -190,7 +218,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, None)
result = SatelliteVersion(rpms, None, None, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -202,7 +230,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, None)
result = SatelliteVersion(rpms, sat, None, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -214,7 +242,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, None)
result = SatelliteVersion(rpms, None, None, None, None)
assert result.major == expected[-2]
assert result.minor == expected[-1]
assert result.full == expected[0]
Expand All @@ -237,7 +265,7 @@ 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, None)
SatelliteVersion(rpms, None, None, None, None)
assert "Not a Satellite machine" in str(sc)

rpms = InstalledRpms(context_wrap(no_sat))
Expand All @@ -247,39 +275,68 @@ def test_no_sat_installed():

rpms = InstalledRpms(context_wrap(installed_rpms_611x_confilct))
with pytest.raises(SkipComponent) as sc:
SatelliteVersion(rpms, None, None)
SatelliteVersion(rpms, None, None, 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)
rhsm_cdn = RHSMConf(context_wrap(RHSM_CONF_CDN))
rhsm_not_cdn = RHSMConf(context_wrap(RHSM_CONF_NON_CDN))
rhsm_without_hostname = RHSMConf(context_wrap(RHSM_CONF_CDN_NO_HOSTNAME))

# satellite register to cdn
result = SatelliteVersion(rpms, None, rhsm_cdn, None, None)
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))
# not a satellite to cdn
with pytest.raises(SkipComponent):
SatelliteVersion(rpms, None, rhsm)
SatelliteVersion(rpms, None, rhsm_not_cdn, None, None)

rpms = InstalledRpms(context_wrap(BOTH_SATELLITE_AND_SATELLITE_CAPSULE))
rhsm = RHSMConf(context_wrap(RHSM_CONF_NON_CDN))
result = CapsuleVersion(rpms, rhsm)
# can not identify since hostname missed
with pytest.raises(SkipComponent):
SatelliteVersion(rpms, None, rhsm_without_hostname, None, None)

# a capsule to cdn
result = CapsuleVersion(rpms, rhsm_not_cdn)
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))
# not a capsule to cdn
with pytest.raises(SkipComponent):
CapsuleVersion(rpms, rhsm_cdn)

# satellite register to itself by cdn
parser_hostname_hit = Hnf(context_wrap(HOSTNAME_1))
parser_hostname_not_hit = Hnf(context_wrap(HOSTNAME_2))
hostname_hit = Hostname(parser_hostname_hit, None, None, None)
hostname_not_hit = Hostname(parser_hostname_not_hit, None, None, None)
result = SatelliteVersion(rpms, None, rhsm_not_cdn, hostname_hit, None)
assert result is not None
assert result.version == '6.8.0.11'

# not a satellite
with pytest.raises(SkipComponent):
SatelliteVersion(rpms, None, rhsm_not_cdn, hostname_not_hit, None)

# a satellite which register to itself
ca_cert_hit = RhsmKatelloDefaultCACert(context_wrap(KATELLO_DEFAULT_CA_ISSUER_OUPTUT_HIT))
ca_cert_not_hit = RhsmKatelloDefaultCACert(context_wrap(KATELLO_DEFAULT_CA_ISSUER_OUPTUT_NON_HIT))
SatelliteVersion(rpms, None, rhsm_not_cdn, hostname_not_hit, ca_cert_hit)
assert result is not None
assert result.version == '6.8.0.11'

# not a satellite
with pytest.raises(SkipComponent):
CapsuleVersion(rpms, rhsm)
SatelliteVersion(rpms, None, rhsm_not_cdn, hostname_not_hit, ca_cert_not_hit)


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, None),
'sat_ver': SatelliteVersion(sat_rpms, None, None, None, None),
'cap_ver': CapsuleVersion(cap_rpms, None),
}
failed, total = doctest.testmod(satellite_version, globs=env)
Expand Down

0 comments on commit cc2e262

Please sign in to comment.