Skip to content

Commit

Permalink
feat: New spec "rhui-set-release" and parser (#3998)
Browse files Browse the repository at this point in the history
* feat: New spec "rhui-set-release" and parser

Signed-off-by: Huanhuan Li <[email protected]>
  • Loading branch information
huali027 authored Feb 1, 2024
1 parent 70cd825 commit 8e2fcba
Show file tree
Hide file tree
Showing 8 changed files with 151 additions and 9 deletions.
3 changes: 3 additions & 0 deletions docs/shared_parsers_catalog/rhui_release.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.. automodule:: insights.parsers.rhui_release
:members:
:show-inheritance:
16 changes: 11 additions & 5 deletions insights/combiners/rhsm_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,19 @@
Combiner provides the Red Hat Subscription Manager release information from
the parsers :class:`insights.parsers.rhsm_releasever.RhsmReleaseVer`
and :class:`insights.parsers.subscription_manager_release.SubscriptionManagerReleaseShow`.
and :class:`insights.parsers.subscription_manager_release.SubscriptionManagerReleaseShow`
and :class:`insights.parsers.rhui_release.RHUISetRelease`.
"""
from insights.core.plugins import combiner
from insights.parsers.rhsm_releasever import RhsmReleaseVer
from insights.parsers.subscription_manager_release import SubscriptionManagerReleaseShow
from insights.parsers.rhui_release import RHUISetRelease


@combiner([RhsmReleaseVer, SubscriptionManagerReleaseShow])
@combiner([RhsmReleaseVer, SubscriptionManagerReleaseShow, RHUISetRelease])
class RhsmRelease(object):
"""
Combiner for parsers RhsmReleaseVer and SubscriptionManagerReleaseShow.
Combiner for parsers RhsmReleaseVer and SubscriptionManagerReleaseShow and RHUISetRelease.
Examples:
>>> type(rhsm_release)
Expand All @@ -26,7 +28,7 @@ class RhsmRelease(object):
>>> rhsm_release.minor
6
"""
def __init__(self, rhsm_release, sm_release):
def __init__(self, rhsm_release, sm_release, rhui_release):
self.set = None
""" str: Release version string returned from the parsers """

Expand All @@ -41,7 +43,11 @@ def __init__(self, rhsm_release, sm_release):
self.major = rhsm_release.major
self.minor = rhsm_release.minor

else:
elif sm_release is not None:
self.set = sm_release.set
self.major = sm_release.major
self.minor = sm_release.minor
else:
self.set = rhui_release.set
self.major = rhui_release.major
self.minor = rhui_release.minor
57 changes: 57 additions & 0 deletions insights/parsers/rhui_release.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
"""
RHUI release commands
=====================
RHUISetRelease - command ``rhui_set_release``
---------------------------------------------
"""
import os

from insights.core import CommandParser
from insights.core.exceptions import SkipComponent
from insights.core.plugins import parser
from insights.specs import Specs


@parser(Specs.rhui_set_release)
class RHUISetRelease(CommandParser):
"""
Class for parsing the output of `rhui_set_release` command.
It will output the rhel minor release when a minor release is set,
or emtpy when it isn't set.
Typical output of the command is::
8.6
Attributes:
set (str): the set release.
major (int): the major version of the set release.
minor (int): the minor version of the set release.
Examples:
>>> type(rhui_rel)
<class 'insights.parsers.rhui_release.RHUISetRelease'>
>>> rhui_rel.set
'8.6'
>>> rhui_rel.major
8
>>> rhui_rel.minor
6
"""

def parse_content(self, content):
self.set = self.major = self.minor = None
if len(content) == 0:
# Release not set
return
if len(content) == 1:
rhel_version = content[0].strip()
line_splits = rhel_version.split('.')
if len(line_splits) == 2 and line_splits[0].isdigit() and line_splits[-1].isdigit():
self.set = rhel_version
self.major = int(line_splits[0])
self.minor = int(line_splits[-1])
return
raise SkipComponent("Unexpected content: {0}".format(os.linesep.join(content)))
1 change: 1 addition & 0 deletions insights/specs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -621,6 +621,7 @@ class Specs(SpecSet):
rhsm_katello_default_ca_cert = RegistryPoint()
rhsm_log = RegistryPoint(filterable=True)
rhsm_releasever = RegistryPoint(no_obfuscate=['hostname', 'ip'])
rhui_set_release = RegistryPoint(no_obfuscate=['hostname', 'ip'])
rhv_log_collector_analyzer = RegistryPoint()
rndc_status = RegistryPoint()
root_crontab = RegistryPoint()
Expand Down
1 change: 1 addition & 0 deletions insights/specs/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,7 @@ class DefaultSpecs(Specs):
resolv_conf = simple_file("/etc/resolv.conf")
rhsm_conf = simple_file("/etc/rhsm/rhsm.conf")
rhsm_releasever = simple_file('/var/lib/rhsm/cache/releasever.json')
rhui_set_release = simple_command("/usr/bin/rhui-set-release")
rndc_status = simple_command("/usr/sbin/rndc status")
ros_config = simple_file("/var/lib/pcp/config/pmlogger/config.ros")
rpm_V_packages = simple_command("/bin/rpm -V coreutils procps procps-ng shadow-utils passwd sudo chrony findutils glibc systemd", keep_rc=True, signum=signal.SIGTERM)
Expand Down
1 change: 1 addition & 0 deletions insights/specs/insights_archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ class InsightsArchiveSpecs(Specs):
readlink_e_shift_cert_server = simple_file("insights_commands/readlink_-e_.etc.origin.node.certificates.kubelet-server-current.pem")
repquota_agnpuv = simple_file("insights_commands/repquota_-agnpuv")
rhsm_katello_default_ca_cert = simple_file("insights_commands/openssl_x509_-in_.etc.rhsm.ca.katello-default-ca.pem_-noout_-issuer")
rhui_set_release = simple_file("insights_commands/rhui-set-release")
rndc_status = simple_file("insights_commands/rndc_status")
rpm_ostree_status = simple_file("insights_commands/rpm-ostree_status_--json")
rpm_V_packages = first_file([
Expand Down
26 changes: 22 additions & 4 deletions insights/tests/combiners/test_rhsm_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from insights.combiners.rhsm_release import RhsmRelease
from insights.parsers.rhsm_releasever import RhsmReleaseVer
from insights.parsers.subscription_manager_release import SubscriptionManagerReleaseShow
from insights.parsers.rhui_release import RHUISetRelease
from insights.tests import context_wrap

RHSM_RELEASE = """
Expand All @@ -14,34 +15,51 @@
Release: 7.2
""".strip()

RHUI_RELEASE = """8.6"""

SM_PARSER = SubscriptionManagerReleaseShow(context_wrap(SUBSCRIPTION_MANAGER_RELEASE))
RHSM_PARSER = RhsmReleaseVer(context_wrap(RHSM_RELEASE))
RHUI_PARSER = RHUISetRelease(context_wrap(RHUI_RELEASE))


def test_with_rhsm():
rhsm_release = RhsmRelease(RHSM_PARSER, None)
rhsm_release = RhsmRelease(RHSM_PARSER, None, None)
assert rhsm_release.set == '7.6'
assert rhsm_release.major == 7
assert rhsm_release.minor == 6


def test_with_sub_mgr():
rhsm_release = RhsmRelease(None, SM_PARSER)
rhsm_release = RhsmRelease(None, SM_PARSER, None)
assert rhsm_release.set == '7.2'
assert rhsm_release.major == 7
assert rhsm_release.minor == 2


def test_with_rhui_release():
rhsm_release = RhsmRelease(None, None, RHUI_PARSER)
assert rhsm_release.set == '8.6'
assert rhsm_release.major == 8
assert rhsm_release.minor == 6


def test_with_both():
rhsm_release = RhsmRelease(RHSM_PARSER, SM_PARSER)
rhsm_release = RhsmRelease(RHSM_PARSER, SM_PARSER, None)
assert rhsm_release.set == '7.6'
assert rhsm_release.major == 7
assert rhsm_release.minor == 6


def test_with_three():
rhsm_release = RhsmRelease(RHSM_PARSER, SM_PARSER, RHUI_PARSER)
assert rhsm_release.set == '7.6'
assert rhsm_release.major == 7
assert rhsm_release.minor == 6


def test_doc_examples():
env = {
'rhsm_release': RhsmRelease(RHSM_PARSER, None),
'rhsm_release': RhsmRelease(RHSM_PARSER, None, None),
}
failed, total = doctest.testmod(rhsm_release_module, globs=env)
assert failed == 0
55 changes: 55 additions & 0 deletions insights/tests/parsers/test_rhui_release.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import doctest
import pytest

from insights.core.exceptions import SkipComponent
from insights.parsers import rhui_release
from insights.parsers.rhui_release import RHUISetRelease
from insights.tests import context_wrap

INPUT_NORMAL_1 = """
8.6
""".strip()

INPUT_NOT_SET = """""".strip()

INPUT_NG_1 = """
XYC
Release not set
""".strip()

INPUT_NG_2 = """
abc def
""".strip()


def test_rhui_release_ok():
ret = RHUISetRelease(context_wrap(INPUT_NORMAL_1))
assert ret.set == '8.6'
assert ret.major == 8
assert ret.minor == 6


def test_rhui_release_not_set():
ret = RHUISetRelease(context_wrap(INPUT_NOT_SET))
assert ret.set is None
assert ret.major is None
assert ret.minor is None


def test_rhui_release_show_ng():
with pytest.raises(SkipComponent) as e_info:
RHUISetRelease(context_wrap(INPUT_NG_1))
assert "Unexpected content" in str(e_info.value)

with pytest.raises(SkipComponent) as e_info:
RHUISetRelease(context_wrap(INPUT_NG_2))
assert "Unexpected content" in str(e_info.value)


def test_doc_examples():
env = {
'rhui_rel':
RHUISetRelease(context_wrap(INPUT_NORMAL_1)),
}
failed, _ = doctest.testmod(rhui_release, globs=env)
assert failed == 0

0 comments on commit 8e2fcba

Please sign in to comment.