CORS-4495: Populate RHCOS10 Marketplace Stream#10556
Conversation
|
@patrickdillon: This pull request references CORS-4495 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "5.0.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughAdds a new RHEL 10 marketplace JSON, updates RHEL 9 marketplace entries, introduces azure.FillMissing to merge missing Azure fields, and refactors the marketplace population script to generate both RHEL 9 and RHEL 10 outputs with fallback and configurable input/output per stream. ChangesMarketplace Dual-Stream Generation
🎯 4 (Complex) | ⏱️ ~45 minutes 🚥 Pre-merge checks | ✅ 11 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (11 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
hack/rhcos/populate-marketplace-imagestream.go (1)
152-167:⚠️ Potential issue | 🟠 Major | ⚡ Quick winGuard release parsing to avoid panic on malformed stream names.
strings.Split(st.Stream, "-")[1]can panic ifst.Streamis empty or missing-. Return a structured error instead.Proposed fix
func getReleaseFromStream(cfg streamConfig) (string, error) { @@ - return strings.Split(st.Stream, "-")[1], nil + parts := strings.SplitN(st.Stream, "-", 2) + if len(parts) < 2 || strings.TrimSpace(parts[1]) == "" { + return "", fmt.Errorf("unexpected stream format %q in %s", st.Stream, cfg.inputFile) + } + return parts[1], nil }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@hack/rhcos/populate-marketplace-imagestream.go` around lines 152 - 167, The getReleaseFromStream function assumes st.Stream contains a hyphen and indexes strings.Split(st.Stream, "-")[1], which can panic for empty or malformed values; update the function to validate st.Stream (and the result of strings.Split) before indexing: if STREAM_RELEASE_OVERRIDE is not set, ensure st.Stream is non-empty, split into parts (or find the first '-') and check there is at least two parts (or a valid index) and return a clear error (e.g., fmt.Errorf("invalid stream format: %q", st.Stream)) instead of panicking; keep the existing STREAM_RELEASE_OVERRIDE behavior and use the same error wrapping pattern used elsewhere in the function.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@hack/rhcos/populate-marketplace-imagestream.go`:
- Around line 90-94: The code currently falls back to RHEL9 on any error from
s.azure; change the error handling in the block calling s.azure(ctx,
supportedArch, cfg) so it only falls back when the error represents the expected
“RHEL10 marketplace unavailable/missing” case (use a specific sentinel error,
errors.Is, or a string match like strings.Contains(err.Error(), "marketplace
missing" / the exact provider message) to detect that case); if that specific
condition is true, perform the existing log.Printf and s[supportedArch] =
fallback[supportedArch] and continue, otherwise return or propagate the original
err instead of falling back (so non-marketplace errors are surfaced).
---
Outside diff comments:
In `@hack/rhcos/populate-marketplace-imagestream.go`:
- Around line 152-167: The getReleaseFromStream function assumes st.Stream
contains a hyphen and indexes strings.Split(st.Stream, "-")[1], which can panic
for empty or malformed values; update the function to validate st.Stream (and
the result of strings.Split) before indexing: if STREAM_RELEASE_OVERRIDE is not
set, ensure st.Stream is non-empty, split into parts (or find the first '-') and
check there is at least two parts (or a valid index) and return a clear error
(e.g., fmt.Errorf("invalid stream format: %q", st.Stream)) instead of panicking;
keep the existing STREAM_RELEASE_OVERRIDE behavior and use the same error
wrapping pattern used elsewhere in the function.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: db61ce43-37ee-437f-928a-c8ddad4f7fa4
📒 Files selected for processing (3)
data/data/coreos/marketplace/coreos-rhel-10.jsondata/data/coreos/marketplace/coreos-rhel-9.jsonhack/rhcos/populate-marketplace-imagestream.go
bef823d to
15331f6
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
hack/rhcos/populate-marketplace-imagestream.go (1)
165-165:⚠️ Potential issue | 🟠 Major | ⚡ Quick winGuard release parsing to avoid panic on malformed stream names.
Line 165 indexes into
strings.Split(...)[1]without validating shape. Ifst.Streamis malformed, this panics and aborts the script.Proposed fix
- return strings.Split(st.Stream, "-")[1], nil + parts := strings.SplitN(st.Stream, "-", 2) + if len(parts) != 2 || parts[1] == "" { + return "", fmt.Errorf("invalid stream format %q, expected <name>-<release>", st.Stream) + } + return parts[1], nil🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@hack/rhcos/populate-marketplace-imagestream.go` at line 165, The code blindly returns strings.Split(st.Stream, "-")[1] which can panic if st.Stream doesn't contain a '-' or has fewer than two parts; update the parsing around strings.Split(st.Stream, "-") to check the resulting slice length (e.g., parts := strings.Split(st.Stream, "-"); if len(parts) < 2 { return "", fmt.Errorf("malformed stream: %q", st.Stream) }) and then return parts[1], nil, ensuring the function (the one using st.Stream) returns an error on malformed input instead of panicking.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@hack/rhcos/populate-marketplace-imagestream.go`:
- Around line 84-86: Update the doc comment for the function
populateWithFallback to reflect the current behavior: remove the claim that a
fallback occurs when population "fails" and state that the function falls back
only when marketplace data is empty; ensure the comment mentions that errors
(e.g., Azure errors) are still returned immediately rather than triggering the
fallback.
---
Outside diff comments:
In `@hack/rhcos/populate-marketplace-imagestream.go`:
- Line 165: The code blindly returns strings.Split(st.Stream, "-")[1] which can
panic if st.Stream doesn't contain a '-' or has fewer than two parts; update the
parsing around strings.Split(st.Stream, "-") to check the resulting slice length
(e.g., parts := strings.Split(st.Stream, "-"); if len(parts) < 2 { return "",
fmt.Errorf("malformed stream: %q", st.Stream) }) and then return parts[1], nil,
ensuring the function (the one using st.Stream) returns an error on malformed
input instead of panicking.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 1e556c67-c83f-4a9e-9bce-f04aeabec6ab
📒 Files selected for processing (3)
data/data/coreos/marketplace/coreos-rhel-10.jsondata/data/coreos/marketplace/coreos-rhel-9.jsonhack/rhcos/populate-marketplace-imagestream.go
🚧 Files skipped from review as they are similar to previous changes (2)
- data/data/coreos/marketplace/coreos-rhel-10.json
- data/data/coreos/marketplace/coreos-rhel-9.json
15331f6 to
ded1192
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
hack/rhcos/populate-marketplace-imagestream.go (1)
154-154:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winAdd bounds check before indexing Split result.
strings.Split(st.Stream, "-")[1]will panic ifst.Streamdoes not contain a"-"character. While the RHCOS stream format is expected to be"rhel-X.Y", a malformed input file would crash the script.🛡️ Proposed fix
- return strings.Split(st.Stream, "-")[1], nil + parts := strings.Split(st.Stream, "-") + if len(parts) < 2 { + return "", fmt.Errorf("invalid stream format %q: expected 'rhel-X.Y'", st.Stream) + } + return parts[1], nil🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@hack/rhcos/populate-marketplace-imagestream.go` at line 154, The current code uses strings.Split(st.Stream, "-")[1] which will panic for malformed st.Stream values; change it to split := strings.Split(st.Stream, "-") (or use strings.Index/strings.Contains) and check len(split) >= 2 before accessing split[1]; if the check fails, return a clear error (or handle the fallback) instead of indexing into the slice. Ensure you update the caller/signature if needed to propagate the error from this function and reference the existing st.Stream and strings.Split usage when making the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@data/data/coreos/marketplace/coreos-rhel-10.json`:
- Around line 16-23: The RHEL10 x86_64 "no-purchase-plan" only defines
"hyperVGen1" (SKU "aro_422") so Gen2 won't be backfilled by FillMissing; either
add a "hyperVGen2" entry mirroring "hyperVGen1" but with the Gen2 SKU expected
by parseAROSKUs (use SKU "aro_422-v2" or the generated "422-v2" pattern) and the
same publisher/offer/version, or add a short doc comment in the surrounding JSON
explaining why "hyperVGen2" is intentionally unavailable for the
"no-purchase-plan" / NoPurchasePlan case so reviewers know this omission is
deliberate.
---
Outside diff comments:
In `@hack/rhcos/populate-marketplace-imagestream.go`:
- Line 154: The current code uses strings.Split(st.Stream, "-")[1] which will
panic for malformed st.Stream values; change it to split :=
strings.Split(st.Stream, "-") (or use strings.Index/strings.Contains) and check
len(split) >= 2 before accessing split[1]; if the check fails, return a clear
error (or handle the fallback) instead of indexing into the slice. Ensure you
update the caller/signature if needed to propagate the error from this function
and reference the existing st.Stream and strings.Split usage when making the
change.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 4a49f1b8-0f90-4ebd-b16b-d80c9aad4fe3
📒 Files selected for processing (4)
data/data/coreos/marketplace/coreos-rhel-10.jsondata/data/coreos/marketplace/coreos-rhel-9.jsonhack/rhcos/populate-marketplace-imagestream.gopkg/rhcos/marketplace/azure/azure.go
ded1192 to
5fc071d
Compare
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
hack/rhcos/populate-marketplace-imagestream.go (1)
139-155:⚠️ Potential issue | 🟠 Major | ⚡ Quick winValidate stream/override release format before returning it.
Line [154] indexes
strings.Split(st.Stream, "-")[1]without checking shape, and Line [140] returnsSTREAM_RELEASE_OVERRIDEunvalidated. A malformed value can panic downstream instead of returning a clean error.Suggested patch
func getReleaseFromStream(cfg streamConfig) (string, error) { if rel, ok := os.LookupEnv("STREAM_RELEASE_OVERRIDE"); ok { + if parts := strings.Split(rel, "."); len(parts) < 2 { + return "", fmt.Errorf("invalid STREAM_RELEASE_OVERRIDE %q, expected <major>.<minor>", rel) + } log.Printf("Found STREAM_RELEASE_OVERRIDE %s", rel) return rel, nil } fileContents, err := os.ReadFile(cfg.inputFile) if err != nil { return "", err } @@ if err := json.Unmarshal(fileContents, st); err != nil { return "", fmt.Errorf("failed to unmarshal RHCOS stream: %w", err) } - - return strings.Split(st.Stream, "-")[1], nil + parts := strings.SplitN(st.Stream, "-", 2) + if len(parts) != 2 || parts[1] == "" { + return "", fmt.Errorf("unexpected stream format %q", st.Stream) + } + rel := parts[1] + if mm := strings.Split(rel, "."); len(mm) < 2 { + return "", fmt.Errorf("invalid release %q extracted from stream %q", rel, st.Stream) + } + return rel, nil }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@hack/rhcos/populate-marketplace-imagestream.go` around lines 139 - 155, In getReleaseFromStream validate the release string shape before returning: when STREAM_RELEASE_OVERRIDE is set, check that it matches the expected dashed format (e.g., contains a '-' and splits into at least two parts) and return a descriptive error if not; after unmarshalling, verify that st.Stream is non-empty and that strings.Split(st.Stream, "-") yields at least two elements before indexing [1], returning an error if the shape is wrong; ensure error messages mention the source (override vs stream) and the invalid value so callers do not panic downstream.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@hack/rhcos/populate-marketplace-imagestream.go`:
- Around line 139-155: In getReleaseFromStream validate the release string shape
before returning: when STREAM_RELEASE_OVERRIDE is set, check that it matches the
expected dashed format (e.g., contains a '-' and splits into at least two parts)
and return a descriptive error if not; after unmarshalling, verify that
st.Stream is non-empty and that strings.Split(st.Stream, "-") yields at least
two elements before indexing [1], returning an error if the shape is wrong;
ensure error messages mention the source (override vs stream) and the invalid
value so callers do not panic downstream.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 498ca4fe-914a-4308-96c3-25919b8f1f69
📒 Files selected for processing (4)
data/data/coreos/marketplace/coreos-rhel-10.jsondata/data/coreos/marketplace/coreos-rhel-9.jsonhack/rhcos/populate-marketplace-imagestream.gopkg/rhcos/marketplace/azure/azure.go
5fc071d to
af1359b
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
pkg/rhcos/marketplace/azure/azure.go (1)
287-307:⚠️ Potential issue | 🟠 Major | ⚡ Quick winBackfill missing
Gen1/Gen2entries inside partially populated families.
getImagescan return a non-nil*rhcos.AzureMarketplaceImageswith only one generation set. This helper only copies the fallback when the whole family is nil, so a partial RHEL10 result like{Gen1:nil, Gen2:...}will skip the RHEL9 fallback forGen1and emit incomplete marketplace data.Suggested fix
func FillMissing(target, fallback *rhcos.AzureMarketplace) { if target == nil || fallback == nil { return } - if target.NoPurchasePlan == nil { - target.NoPurchasePlan = fallback.NoPurchasePlan - } - if target.OCP == nil { - target.OCP = fallback.OCP - } - if target.OPP == nil { - target.OPP = fallback.OPP - } - if target.OKE == nil { - target.OKE = fallback.OKE - } - if target.OCPEMEA == nil { - target.OCPEMEA = fallback.OCPEMEA - } - if target.OPPEMEA == nil { - target.OPPEMEA = fallback.OPPEMEA - } - if target.OKEEMEA == nil { - target.OKEEMEA = fallback.OKEEMEA - } + fillImages := func(dst **rhcos.AzureMarketplaceImages, src *rhcos.AzureMarketplaceImages) { + if src == nil { + return + } + if *dst == nil { + *dst = src + return + } + if (*dst).Gen1 == nil { + (*dst).Gen1 = src.Gen1 + } + if (*dst).Gen2 == nil { + (*dst).Gen2 = src.Gen2 + } + } + + fillImages(&target.NoPurchasePlan, fallback.NoPurchasePlan) + fillImages(&target.OCP, fallback.OCP) + fillImages(&target.OPP, fallback.OPP) + fillImages(&target.OKE, fallback.OKE) + fillImages(&target.OCPEMEA, fallback.OCPEMEA) + fillImages(&target.OPPEMEA, fallback.OPPEMEA) + fillImages(&target.OKEEMEA, fallback.OKEEMEA) }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@pkg/rhcos/marketplace/azure/azure.go` around lines 287 - 307, The current backfill only replaces entire family pointers (target.NoPurchasePlan, OCP, OPP, OKE, OCPEMEA, OPPEMEA, OKEEMEA) when nil, but if a family exists with missing generation fields (Gen1/Gen2) those subfields remain empty; update the logic to also copy missing generation entries: for each family (NoPurchasePlan, OCP, OPP, OKE, OCPEMEA, OPPEMEA, OKEEMEA) if target.<Family> is nil set target.<Family> = fallback.<Family> as before, otherwise if target.<Family> != nil and fallback.<Family> != nil then if target.<Family>.Gen1 == nil set it to fallback.<Family>.Gen1 and likewise for Gen2 so partially populated results from getImages are fully backfilled.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@pkg/rhcos/marketplace/azure/azure.go`:
- Around line 310-341: The helper checkIfNewer(candidate, release string)
currently treats any imgMajor==9 or 10 as non-comparable and returns false,
which allows cross-family selection; update checkIfNewer to accept an expected
marketplace major (e.g., add an extra parameter expectedMajor int or string) and
immediately reject candidates whose imgMajor does not match expectedMajor
(return false) before performing the greater-than comparison; keep the existing
parsing/validation of candidate and release (semver.MajorMinor, strconv.Atoi)
but when imgMajor is 9 or 10 ensure you compare it against the passed
expectedMajor and only allow further comparison when they match, otherwise
return false so RHEL9/10 families remain distinct (refer to function
checkIfNewer and callers like getImage to thread the new parameter).
---
Outside diff comments:
In `@pkg/rhcos/marketplace/azure/azure.go`:
- Around line 287-307: The current backfill only replaces entire family pointers
(target.NoPurchasePlan, OCP, OPP, OKE, OCPEMEA, OPPEMEA, OKEEMEA) when nil, but
if a family exists with missing generation fields (Gen1/Gen2) those subfields
remain empty; update the logic to also copy missing generation entries: for each
family (NoPurchasePlan, OCP, OPP, OKE, OCPEMEA, OPPEMEA, OKEEMEA) if
target.<Family> is nil set target.<Family> = fallback.<Family> as before,
otherwise if target.<Family> != nil and fallback.<Family> != nil then if
target.<Family>.Gen1 == nil set it to fallback.<Family>.Gen1 and likewise for
Gen2 so partially populated results from getImages are fully backfilled.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: adde3022-6bcb-4703-8629-d74a1b15360d
📒 Files selected for processing (2)
hack/rhcos/populate-marketplace-imagestream.gopkg/rhcos/marketplace/azure/azure.go
Updates the script to populate azure marketplace images to include the rhel10 stream. If RHCOS10 images are not present, we can fall back to RHCOS9, as the first-boot image will be updated to RHCOS10.
In 4.22, ARO changed the SKU format so that it includes -v2 or -arm prefixes. This commit updates the populate script to take these changes into account and find these images. Also, a slight tweak to adjust for the version discrepency. Newer ARO versions use RHEL versions, while older versions use OCP versions.
af1359b to
5c761c3
Compare
|
/test azure-ovn-marketplace-images |
|
@patrickdillon: The following test failed, say
Full PR test history. Your PR dashboard. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here. |
tthvo
left a comment
There was a problem hiding this comment.
I just have a few questions, but looks good to me :D
| imgMinor, err := strconv.Atoi(strings.Split(mm, ".")[1]) | ||
| if err != nil { | ||
| logrus.Infof("Error converting minor version to int with version %s", candidate) | ||
| return true | ||
| } |
There was a problem hiding this comment.
From line 322 - 341, we may be able to simplify it to:
rel := release
if !strings.HasPrefix(rel, "v") {
rel = "v" + rel
}
return semver.Compare(mm, semver.MajorMinor(rel)) > 0because mm and release/rel are both in form v<major>.<minor>.0 (e.g. 4.22.0), right?
There was a problem hiding this comment.
hmm, somehow I feel like we talked about this before... Does this make sense at all though?
| @@ -0,0 +1,116 @@ | |||
| { | |||
| "aarch64": { | |||
There was a problem hiding this comment.
I guess because there is no rhel-10 image yet, this file is exactly the same as coreos-rhel-9.json and there will be a follow-up PR to update this 🤔?
There was a problem hiding this comment.
Yes, if there is no rhel-10 image we can use rhel-9 and the os will be automagically updated to rhel10
There was a problem hiding this comment.
BTW this was the direction given by the dual stream team--not a workaround I came up with
There was a problem hiding this comment.
ohh okayy, make sense to me! Thanks!
| // to OCP release versions and should never be filtered out. | ||
| if imgMajor == 9 || imgMajor == 10 { | ||
| return false | ||
| } |
There was a problem hiding this comment.
I guess there won't be ever be overlapping between ocp and RHEL major version, right? Then, this check would be safe :D
There was a problem hiding this comment.
lol, yeah I guess so, I didn't think of that.
tthvo
left a comment
There was a problem hiding this comment.
/lgtm
/approve
Thanks for checking my questions! The one suggestion is a nit anyway XD
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: tthvo The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
|
/verified by multi-pr test #10533 (comment) |
|
@patrickdillon: This PR has been marked as verified by DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
9f29a75
into
openshift:main
Updates the script to populate azure marketplace images to include the rhel10 stream. If RHCOS10 images are not present, we can fall back to RHCOS9, as the first-boot image will be updated to RHCOS10.
Summary by CodeRabbit
New Features
Updates
Bug Fixes
Chores