diff --git a/insights/combiners/satellite_version.py b/insights/combiners/satellite_version.py index f3e123ad32..e9a1eae1b5 100644 --- a/insights/combiners/satellite_version.py +++ b/insights/combiners/satellite_version.py @@ -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: @@ -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 @@ -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 @@ -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 diff --git a/insights/combiners/tests/test_satellite_version.py b/insights/combiners/tests/test_satellite_version.py index 084df040a1..74c30cfca7 100644 --- a/insights/combiners/tests/test_satellite_version.py +++ b/insights/combiners/tests/test_satellite_version.py @@ -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 @@ -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 @@ -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] @@ -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] @@ -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] @@ -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] @@ -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] @@ -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] @@ -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] @@ -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] @@ -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)) @@ -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)