Repository: openshift/assisted-service
Pull request #7534: MGMT-20369: retrieve stream-coreos image instead of rhel-coreos when installing OKD
Author: login: rccrdpccl
Labels: name: approved
description: Indicates a PR has been approved by an approver from all required OWNERS files.
name: size/M
description: Denotes a PR that changes 30-99 lines, ignoring generated files.
name: lgtm
description: Indicates that a PR is ready to be merged.
name: jira/valid-reference
description: Indicates that this PR references a valid Jira ticket of any type.
Created: 2025-04-11T10:20:24Z | Merged: 2025-04-28T21:10:29Z

OKD doesn't use rhel-coreos, it uses stream-coreos instead

<!--
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.

You can refer to [Kubernetes community documentation] on writing good commit messages, which provides good tips and ideas.

Some PRs address specific issues. Please, refer to the [CONTRIBUTING] documentation for more
information on how to link a PR to an existing issue.

It's recommended to take a few extra minutes to provide more information about
how this code was tested. Here are some questions that may be worth answering:

- Should this PR be tested by the reviewer?
- Is this PR relying on CI for an e2e test run?
- Should this PR be tested in a specific environment?
- Any logs, screenshots, etc that can help with the review process?

-->

## List all the issues related to this PR

- [ ] New Feature <!-- new functionality -->
- [ ] Enhancement <!-- refactor, code changes, improvement, that won't add new features -->
- [ ] Bug fix
- [ ] Tests
- [ ] Documentation
- [ ] CI/CD <!-- Notice that changes for Dockerfiles/Jenkinsfiles aren't tested in CI due to a known bug. -->

## What environments does this code impact?

- [ ] Automation (CI, tools, etc)
- [ ] Cloud
- [ ] Operator Managed Deployments
- [x] None

## How was this code tested?

<!-- Please, select one or more if needed: -->

- [ ] assisted-test-infra environment
- [ ] dev-scripts environment
- [ ] Reviewer's test appreciated
- [ ] Waiting for CI to do a full test run
- [ ] Manual (Elaborate on how it was tested)
- [x] No tests needed

## Checklist

- [ ] Title and description added to both, commit and PR.
- [ ] Relevant issues have been associated (see [CONTRIBUTING] guide)
- [ ] This change does not require a documentation update (docstring, `docs`, README, etc)
- [ ] Does this change include unit-tests (note that code changes require unit-tests)

## Reviewers Checklist

- Are the title and description (in both PR and commit) meaningful and clear?
- Is there a bug required (and linked) for this change?
- Should this PR be backported?

[Kubernetes community documentation]: https://github.com/kubernetes/community/blob/master/contributors/guide/pull-requests.md#commit-message-guidelines
[CONTRIBUTING]: https://github.com/openshift/assisted-service/blob/master/CONTRIBUTING.md



Diff:
diff --git a/internal/oc/release.go b/internal/oc/release.go
index 5327225524a7..51ac6c89283d 100644
--- a/internal/oc/release.go
+++ b/internal/oc/release.go
@@ -2,6 +2,7 @@ package oc
 
 import (
 	"encoding/json"
+	"errors"
 	"fmt"
 	"os"
 	"path/filepath"
@@ -21,7 +22,6 @@ import (
 	"github.com/openshift/assisted-service/pkg/executer"
 	"github.com/openshift/assisted-service/pkg/mirrorregistries"
 	"github.com/patrickmn/go-cache"
-	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 	"github.com/thedevsaddam/retry"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -33,7 +33,8 @@ const (
 	ironicAgentImageName           = "ironic-agent"
 	mustGatherImageName            = "must-gather"
 	okdRPMSImageName               = "okd-rpms"
-	coreosImageName                = "rhel-coreos"
+	rhcosImageName                 = "rhel-coreos"
+	scosImageName                  = "stream-coreos"
 	DefaultTries                   = 5
 	DefaltRetryDelay               = time.Second * 5
 	staticInstallerRequiredVersion = "4.16.0-0.alpha"
@@ -126,7 +127,24 @@ func (r *release) GetMustGatherImage(log logrus.FieldLogger, releaseImage string
 
 // GetCoreOSImage gets rhel-coreos image URL from the release image or releaseImageMirror, if provided.
 func (r *release) GetCoreOSImage(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error) {
-	return r.getImageByName(log, coreosImageName, releaseImage, releaseImageMirror, pullSecret)
+	var image string
+	var rhcosErr, scosErr error
+	image, rhcosErr = r.getImageByName(log, rhcosImageName, releaseImage, releaseImageMirror, pullSecret)
+	if rhcosErr == nil {
+		return image, nil
+	}
+
+	// if rhcos image is not found, we can try scos image
+	image, scosErr = r.getImageByName(log, scosImageName, releaseImage, releaseImageMirror, pullSecret)
+	if scosErr == nil {
+		log.WithError(rhcosErr).Info("failed to get rhel-coreos image, using stream-coreos image")
+		return image, nil
+	}
+
+	// if neither image is found, return the combined error
+	err := errors.Join(rhcosErr, scosErr)
+	log.WithError(err).Error("failed to get rhel-coreos image and stream-coreos image")
+	return "", fmt.Errorf("failed to get rhel-coreos image and stream-coreos image: %w", err)
 }
 
 func (r *release) getImageByName(log logrus.FieldLogger, imageName, releaseImage, releaseImageMirror, pullSecret string) (string, error) {
@@ -217,7 +235,7 @@ func (r *release) GetImageArchitecture(log logrus.FieldLogger, image, pullSecret
 		//                  feature in oc cli.
 		skopeoImageRaw, err2 := execute(log, r.executer, pullSecret, cmdMultiarch, skopeoAuthArgument)
 		if err2 != nil {
-			return nil, errors.Errorf("failed to inspect image, oc: %v, skopeo: %v", err, err2)
+			return nil, fmt.Errorf("failed to inspect image, oc: %v, skopeo: %v", err, err2)
 		}
 
 		var multiarchContent []string
@@ -233,11 +251,11 @@ func (r *release) GetImageArchitecture(log logrus.FieldLogger, image, pullSecret
 			multiarchContent = append(multiarchContent, res)
 		}, "manifests")
 		if err2 != nil {
-			return nil, errors.Errorf("failed to get image info using oc: %v", err)
+			return nil, fmt.Errorf("failed to get image info using oc: %v", err)
 		}
 
 		if len(multiarchContent) == 0 {
-			return nil, errors.Errorf("image manifest does not contain architecture: %v", skopeoImageRaw)
+			return nil, fmt.Errorf("image manifest does not contain architecture: %v", skopeoImageRaw)
 		}
 
 		return multiarchContent, nil
@@ -262,7 +280,7 @@ func (r *release) getImageValue(imageName, releaseImage string) (*imageValue, er
 	actualIntf, _ := r.imagesMap.GetOrInsert(getImageKey(imageName, releaseImage), &imageValue{})
 	value, ok := actualIntf.(*imageValue)
 	if !ok {
-		return nil, errors.Errorf("unexpected error - could not cast value for image %s release %s", imageName, releaseImage)
+		return nil, fmt.Errorf("unexpected error - could not cast value for image %s release %s", imageName, releaseImage)
 	}
 	return value, nil
 }
diff --git a/internal/oc/release_test.go b/internal/oc/release_test.go
index f48d966f8b3e..a033282a464c 100644
--- a/internal/oc/release_test.go
+++ b/internal/oc/release_test.go
@@ -429,6 +429,69 @@ var _ = Describe("oc", func() {
 			Expect(err).Should(HaveOccurred())
 		})
 	})
+	Context("GetCoreOSImage", func() {
+		It("should return rhel-coreos for OCP image", func() {
+			expectedForImage := "rhel-coreos"
+			image := "quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:3c8f6006b25b4c9aef0cfb12de5e44134317f5347bff85eba35af22ad23d964f"
+			mockExecuter.EXPECT().Execute(
+				"oc",
+				"adm",
+				"release",
+				"info",
+				"--image-for="+expectedForImage,
+				"--insecure=true",
+				releaseImageMirror,
+				"--registry-config="+tempFilePath,
+			).
+				Return(image, "", 0).
+				Times(1)
+			coreosImage, err := oc.GetCoreOSImage(log, releaseImage, releaseImageMirror, pullSecret)
+			Expect(err).ShouldNot(HaveOccurred())
+			Expect(coreosImage).Should(Equal(image))
+		})
+		It("should return stream-coreos for OKD image", func() {
+			streamCoreOSImage := "quay.io/okd/scos-content@sha256:6e78761cdab37d31967c91346458a7981da8a37716c815e5063bea569a3cc43d"
+			mockExecuter.EXPECT().Execute(
+				"oc",
+				"adm",
+				"release",
+				"info",
+				"--image-for=rhel-coreos",
+				"--insecure=true",
+				releaseImageMirror,
+				"--registry-config="+tempFilePath,
+			).
+				Return("", "Error retrieving rhel-coreos image", 1).
+				Times(1)
+			mockExecuter.EXPECT().Execute(
+				"oc",
+				"adm",
+				"release",
+				"info",
+				"--image-for=stream-coreos",
+				"--insecure=true",
+				releaseImageMirror,
+				"--registry-config="+tempFilePath,
+			).
+				Times(0)
+			mockExecuter.EXPECT().Execute(
+				"oc",
+				"adm",
+				"release",
+				"info",
+				"--image-for=stream-coreos",
+				"--insecure=true",
+				releaseImageMirror,
+				"--registry-config="+tempFilePath,
+			).
+				Return(streamCoreOSImage, "", 0).
+				Times(1)
+			okdReleaseImage := "quay.io/okd/scos-release:4.19.0-okd-scos.ec.6"
+			coreosImage, err := oc.GetCoreOSImage(log, okdReleaseImage, releaseImageMirror, pullSecret)
+			Expect(err).ShouldNot(HaveOccurred())
+			Expect(coreosImage).Should(Equal(streamCoreOSImage))
+		})
+	})
 })
 
 var _ = Describe("getImageFromRelease", func() {


Reviews:
user: login: carbonin
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-21T20:37:05Z
user: login: rccrdpccl
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T15:10:25Z
user: login: carbonin
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-23T19:42:43Z
user: login: rccrdpccl
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T08:26:10Z
user: login: Prashanth684
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T16:05:27Z
user: login: Prashanth684
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T17:58:03Z
user: login: rccrdpccl
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-28T08:15:00Z
user: login: Prashanth684
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-28T14:02:20Z
user: login: Prashanth684
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-28T14:03:19Z
user: login: carbonin
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-28T19:01:45Z

Review comments:
diff_hunk: @@ -126,7 +127,16 @@ func (r *release) GetMustGatherImage(log logrus.FieldLogger, releaseImage string
 
 // GetCoreOSImage gets rhel-coreos image URL from the release image or releaseImageMirror, if provided.
 func (r *release) GetCoreOSImage(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error) {
-	return r.getImageByName(log, coreosImageName, releaseImage, releaseImageMirror, pullSecret)
+	imageName := coreosImageName
+	if isOKD(releaseImage) {
+		imageName = streamCoreOSImageName
+	}
+	return r.getImageByName(log, imageName, releaseImage, releaseImageMirror, pullSecret)
+}
+
+// Returns true if the image matches OKD release image pattern
+func isOKD(image string) bool {
path: internal/oc/release.go
user: login: carbonin
body: Is this consistent with how we're checking for OKD in other places? I remember seeing a check somewhere but I don't know how it's implemented.
created_at: 2025-04-21T20:37:05Z
author_association: MEMBER
diff_hunk: @@ -126,7 +127,16 @@ func (r *release) GetMustGatherImage(log logrus.FieldLogger, releaseImage string
 
 // GetCoreOSImage gets rhel-coreos image URL from the release image or releaseImageMirror, if provided.
 func (r *release) GetCoreOSImage(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error) {
-	return r.getImageByName(log, coreosImageName, releaseImage, releaseImageMirror, pullSecret)
+	imageName := coreosImageName
+	if isOKD(releaseImage) {
+		imageName = streamCoreOSImageName
+	}
+	return r.getImageByName(log, imageName, releaseImage, releaseImageMirror, pullSecret)
+}
+
+// Returns true if the image matches OKD release image pattern
+func isOKD(image string) bool {
path: internal/oc/release.go
user: login: rccrdpccl
body: I cannot find any other parts where we check for OKD, apart from the [OKD-RPMS](https://github.com/openshift/assisted-service/pull/7534/files#diff-3b8a020ef087b81b6b45d56bef6dd8d32fcf9d50dfe3d91fd369755b253cfff8R119) image (which I think it's not really equivalent to this). Alternatively we could just try both and pick the first that works and not make it dependant on the release image (name). WDYT?
created_at: 2025-04-23T15:10:25Z
author_association: CONTRIBUTOR
diff_hunk: @@ -126,7 +127,16 @@ func (r *release) GetMustGatherImage(log logrus.FieldLogger, releaseImage string
 
 // GetCoreOSImage gets rhel-coreos image URL from the release image or releaseImageMirror, if provided.
 func (r *release) GetCoreOSImage(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error) {
-	return r.getImageByName(log, coreosImageName, releaseImage, releaseImageMirror, pullSecret)
+	imageName := coreosImageName
+	if isOKD(releaseImage) {
+		imageName = streamCoreOSImageName
+	}
+	return r.getImageByName(log, imageName, releaseImage, releaseImageMirror, pullSecret)
+}
+
+// Returns true if the image matches OKD release image pattern
+func isOKD(image string) bool {
path: internal/oc/release.go
user: login: carbonin
body: I actually think that is how we use that function. The problem is that we end up running it all the time which isn't great but ... I suppose it depends on how confident we are in the release image naming.
created_at: 2025-04-23T19:42:43Z
author_association: MEMBER
diff_hunk: @@ -126,7 +127,16 @@ func (r *release) GetMustGatherImage(log logrus.FieldLogger, releaseImage string
 
 // GetCoreOSImage gets rhel-coreos image URL from the release image or releaseImageMirror, if provided.
 func (r *release) GetCoreOSImage(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error) {
-	return r.getImageByName(log, coreosImageName, releaseImage, releaseImageMirror, pullSecret)
+	imageName := coreosImageName
+	if isOKD(releaseImage) {
+		imageName = streamCoreOSImageName
+	}
+	return r.getImageByName(log, imageName, releaseImage, releaseImageMirror, pullSecret)
+}
+
+// Returns true if the image matches OKD release image pattern
+func isOKD(image string) bool {
path: internal/oc/release.go
user: login: rccrdpccl
body: @Prashanth684 would you have any recommendation on how to detect reliably OKD release image?
created_at: 2025-04-24T08:26:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -126,7 +127,16 @@ func (r *release) GetMustGatherImage(log logrus.FieldLogger, releaseImage string
 
 // GetCoreOSImage gets rhel-coreos image URL from the release image or releaseImageMirror, if provided.
 func (r *release) GetCoreOSImage(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error) {
-	return r.getImageByName(log, coreosImageName, releaseImage, releaseImageMirror, pullSecret)
+	imageName := coreosImageName
+	if isOKD(releaseImage) {
+		imageName = streamCoreOSImageName
+	}
+	return r.getImageByName(log, imageName, releaseImage, releaseImageMirror, pullSecret)
+}
+
+// Returns true if the image matches OKD release image pattern
+func isOKD(image string) bool {
path: internal/oc/release.go
user: login: Prashanth684
body: unfortunately, there is no easy way to detect if  release image is OKD outside of doing what oc does which is read the release image, parse the metadata and maybe check the componentversion to see if there is centos stream coreos string present there. The only way today is like you suggest to check for both and see which one works.
created_at: 2025-04-24T16:05:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -126,7 +127,16 @@ func (r *release) GetMustGatherImage(log logrus.FieldLogger, releaseImage string
 
 // GetCoreOSImage gets rhel-coreos image URL from the release image or releaseImageMirror, if provided.
 func (r *release) GetCoreOSImage(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error) {
-	return r.getImageByName(log, coreosImageName, releaseImage, releaseImageMirror, pullSecret)
+	imageName := coreosImageName
+	if isOKD(releaseImage) {
+		imageName = streamCoreOSImageName
+	}
+	return r.getImageByName(log, imageName, releaseImage, releaseImageMirror, pullSecret)
+}
+
+// Returns true if the image matches OKD release image pattern
+func isOKD(image string) bool {
+	return strings.Contains(image, "okd")
path: internal/oc/release.go
user: login: Prashanth684
body: this is checking the pullspec string right? so if a pullspec with digest is provided, this won't work?
created_at: 2025-04-24T17:58:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -126,7 +127,16 @@ func (r *release) GetMustGatherImage(log logrus.FieldLogger, releaseImage string
 
 // GetCoreOSImage gets rhel-coreos image URL from the release image or releaseImageMirror, if provided.
 func (r *release) GetCoreOSImage(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error) {
-	return r.getImageByName(log, coreosImageName, releaseImage, releaseImageMirror, pullSecret)
+	imageName := coreosImageName
+	if isOKD(releaseImage) {
+		imageName = streamCoreOSImageName
+	}
+	return r.getImageByName(log, imageName, releaseImage, releaseImageMirror, pullSecret)
+}
+
+// Returns true if the image matches OKD release image pattern
+func isOKD(image string) bool {
+	return strings.Contains(image, "okd")
path: internal/oc/release.go
user: login: rccrdpccl
body: Yes, what you say is correct - this should be changed.
Currently we check for the image tagged `okd-rpms` within the release image (`oc adm release info --image-for=okd-rpms --insecure=false <release image>`) - however this seems that it's not working any longer from release 4.16 onward. This would mean OKD assisted installs for OCP > 4.15 are not working properly. Could you please confirm that this method is no longer valid? 
created_at: 2025-04-28T08:15:00Z
author_association: CONTRIBUTOR
diff_hunk: @@ -126,7 +127,16 @@ func (r *release) GetMustGatherImage(log logrus.FieldLogger, releaseImage string
 
 // GetCoreOSImage gets rhel-coreos image URL from the release image or releaseImageMirror, if provided.
 func (r *release) GetCoreOSImage(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error) {
-	return r.getImageByName(log, coreosImageName, releaseImage, releaseImageMirror, pullSecret)
+	imageName := coreosImageName
+	if isOKD(releaseImage) {
+		imageName = streamCoreOSImageName
+	}
+	return r.getImageByName(log, imageName, releaseImage, releaseImageMirror, pullSecret)
+}
+
+// Returns true if the image matches OKD release image pattern
+func isOKD(image string) bool {
+	return strings.Contains(image, "okd")
path: internal/oc/release.go
user: login: Prashanth684
body: right...we don't build the okd-rpms image anymore. The openshift binaries are pulled from ART's mirror (for now).
created_at: 2025-04-28T14:02:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -126,7 +127,16 @@ func (r *release) GetMustGatherImage(log logrus.FieldLogger, releaseImage string
 
 // GetCoreOSImage gets rhel-coreos image URL from the release image or releaseImageMirror, if provided.
 func (r *release) GetCoreOSImage(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error) {
-	return r.getImageByName(log, coreosImageName, releaseImage, releaseImageMirror, pullSecret)
+	imageName := coreosImageName
+	if isOKD(releaseImage) {
+		imageName = streamCoreOSImageName
+	}
+	return r.getImageByName(log, imageName, releaseImage, releaseImageMirror, pullSecret)
+}
+
+// Returns true if the image matches OKD release image pattern
+func isOKD(image string) bool {
+	return strings.Contains(image, "okd")
path: internal/oc/release.go
user: login: Prashanth684
body: you could check for `stream-coreos` instead as that is specific to OKD.
created_at: 2025-04-28T14:03:19Z
author_association: CONTRIBUTOR

PR comments:
user: login: openshift-ci-robot
created_at: 2025-04-11T10:20:28Z
body: @rccrdpccl: This pull request references [MGMT-20369](https://issues.redhat.com//browse/MGMT-20369) 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 bug to target the "4.19.0" version, but no target version was set.

<details>

In response to [this](https://github.com/openshift/assisted-service/pull/7534):

>OKD doesn't use rhel-coreos, it uses stream-coreos instead
>
><!--
>Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.
>
>You can refer to [Kubernetes community documentation] on writing good commit messages, which provides good tips and ideas.
>
>Some PRs address specific issues. Please, refer to the [CONTRIBUTING] documentation for more
>information on how to link a PR to an existing issue.
>
>It's recommended to take a few extra minutes to provide more information about
>how this code was tested. Here are some questions that may be worth answering:
>
>- Should this PR be tested by the reviewer?
>- Is this PR relying on CI for an e2e test run?
>- Should this PR be tested in a specific environment?
>- Any logs, screenshots, etc that can help with the review process?
>
>-->
>
>## List all the issues related to this PR
>
>- [ ] New Feature <!-- new functionality -->
>- [ ] Enhancement <!-- refactor, code changes, improvement, that won't add new features -->
>- [ ] Bug fix
>- [ ] Tests
>- [ ] Documentation
>- [ ] CI/CD <!-- Notice that changes for Dockerfiles/Jenkinsfiles aren't tested in CI due to a known bug. -->
>
>## What environments does this code impact?
>
>- [ ] Automation (CI, tools, etc)
>- [ ] Cloud
>- [ ] Operator Managed Deployments
>- [x] None
>
>## How was this code tested?
>
><!-- Please, select one or more if needed: -->
>
>- [ ] assisted-test-infra environment
>- [ ] dev-scripts environment
>- [ ] Reviewer's test appreciated
>- [ ] Waiting for CI to do a full test run
>- [ ] Manual (Elaborate on how it was tested)
>- [x] No tests needed
>
>## Checklist
>
>- [ ] Title and description added to both, commit and PR.
>- [ ] Relevant issues have been associated (see [CONTRIBUTING] guide)
>- [ ] This change does not require a documentation update (docstring, `docs`, README, etc)
>- [ ] Does this change include unit-tests (note that code changes require unit-tests)
>
>## Reviewers Checklist
>
>- Are the title and description (in both PR and commit) meaningful and clear?
>- Is there a bug required (and linked) for this change?
>- Should this PR be backported?
>
>[Kubernetes community documentation]: https://github.com/kubernetes/community/blob/master/contributors/guide/pull-requests.md#commit-message-guidelines
>[CONTRIBUTING]: https://github.com/openshift/assisted-service/blob/master/CONTRIBUTING.md
>


Instructions for interacting with me using PR comments are available [here](https://prow.ci.openshift.org/command-help?repo=openshift%2Fassisted-service).  If you have questions or suggestions related to my behavior, please file an issue against the [openshift-eng/jira-lifecycle-plugin](https://github.com/openshift-eng/jira-lifecycle-plugin/issues/new) repository.
</details>
author_association: NONE
user: login: rccrdpccl
created_at: 2025-04-11T10:21:15Z
body: /cc @jianzzha
author_association: CONTRIBUTOR
user: login: openshift-ci[bot]
created_at: 2025-04-11T10:21:20Z
body: @rccrdpccl: GitHub didn't allow me to request PR reviews from the following users: jianzzha.

Note that only [openshift members](https://github.com/orgs/openshift/people) and repo collaborators can review this PR, and authors cannot review their own PRs.

<details>

In response to [this](https://github.com/openshift/assisted-service/pull/7534#issuecomment-2796493942):

>/cc @jianzzha


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>
author_association: NONE
user: login: rccrdpccl
created_at: 2025-04-11T11:10:07Z
body: /retest
author_association: CONTRIBUTOR
user: login: codecov[bot]
created_at: 2025-04-11T12:09:46Z
body: ## [Codecov](https://app.codecov.io/gh/openshift/assisted-service/pull/7534?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openshift) Report
Attention: Patch coverage is `75.00000%` with `4 lines` in your changes missing coverage. Please review.
> Project coverage is 67.30%. Comparing base [(`abd0143`)](https://app.codecov.io/gh/openshift/assisted-service/commit/abd01432ec2c993ab835ce258a8bacf12ca64ac9?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openshift) to head [(`9a1128d`)](https://app.codecov.io/gh/openshift/assisted-service/commit/9a1128de4c8b64d50ea2223dbc7c1ca5a38103ff?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openshift).
> Report is 25 commits behind head on master.

| [Files with missing lines](https://app.codecov.io/gh/openshift/assisted-service/pull/7534?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openshift) | Patch % | Lines |
|---|---|---|
| [internal/oc/release.go](https://app.codecov.io/gh/openshift/assisted-service/pull/7534?src=pr&el=tree&filepath=internal%2Foc%2Frelease.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openshift#diff-aW50ZXJuYWwvb2MvcmVsZWFzZS5nbw==) | 75.00% | [4 Missing :warning: ](https://app.codecov.io/gh/openshift/assisted-service/pull/7534?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openshift) |

<details><summary>Additional details and impacted files</summary>


[![Impacted file tree graph](https://app.codecov.io/gh/openshift/assisted-service/pull/7534/graphs/tree.svg?width=650&height=150&src=pr&token=YOR4NSSOXQ&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openshift)](https://app.codecov.io/gh/openshift/assisted-service/pull/7534?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openshift)

```diff
@@            Coverage Diff             @@
##           master    #7534      +/-   ##
==========================================
- Coverage   67.30%   67.30%   -0.01%     
==========================================
  Files         334      335       +1     
  Lines       42299    42486     +187     
==========================================
+ Hits        28470    28595     +125     
- Misses      11257    11306      +49     
- Partials     2572     2585      +13     
```

| [Files with missing lines](https://app.codecov.io/gh/openshift/assisted-service/pull/7534?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openshift) | Coverage Δ | |
|---|---|---|
| [internal/oc/release.go](https://app.codecov.io/gh/openshift/assisted-service/pull/7534?src=pr&el=tree&filepath=internal%2Foc%2Frelease.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openshift#diff-aW50ZXJuYWwvb2MvcmVsZWFzZS5nbw==) | `75.45% <75.00%> (+2.06%)` | :arrow_up: |

... and [17 files with indirect coverage changes](https://app.codecov.io/gh/openshift/assisted-service/pull/7534/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=openshift)

</details>
<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
author_association: NONE
user: login: rccrdpccl
created_at: 2025-04-14T07:48:07Z
body: /hold
author_association: CONTRIBUTOR
user: login: rccrdpccl
created_at: 2025-04-16T15:26:28Z
body: /unhold
/retest
author_association: CONTRIBUTOR
user: login: rccrdpccl
created_at: 2025-04-18T07:04:42Z
body: /retest
author_association: CONTRIBUTOR
user: login: openshift-ci[bot]
created_at: 2025-04-28T19:02:07Z
body: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/openshift/assisted-service/pull/7534#pullrequestreview-2800409955" title="Approved">carbonin</a>*, *<a href="https://github.com/openshift/assisted-service/pull/7534#" title="Author self-approved">rccrdpccl</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=openshift%2Fassisted-service).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/openshift/assisted-service/blob/master/OWNERS)~~ [carbonin,rccrdpccl]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
author_association: NONE
user: login: carbonin
created_at: 2025-04-28T19:03:34Z
body: Looks like the OKD-specific job has been failing for quite a while now so it's unlikely that it's a problem with this PR
author_association: MEMBER
user: login: openshift-ci-robot
created_at: 2025-04-28T19:23:43Z
body: /retest-required

Remaining retests: 0 against base HEAD 8f3da5d617b1ec49f166037e0bcfae6dceb38954 and 2 for PR HEAD 9a1128de4c8b64d50ea2223dbc7c1ca5a38103ff in total

author_association: NONE
user: login: openshift-ci[bot]
created_at: 2025-04-28T21:06:58Z
body: @rccrdpccl: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
ci/prow/okd-scos-e2e-aws-ovn | 9a1128de4c8b64d50ea2223dbc7c1ca5a38103ff | [link](https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/openshift_assisted-service/7534/pull-ci-openshift-assisted-service-master-okd-scos-e2e-aws-ovn/1916853829190553600) | false | `/test okd-scos-e2e-aws-ovn`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=openshift&repo=assisted-service&pr=7534). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:rccrdpccl).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
author_association: NONE
user: login: openshift-bot
created_at: 2025-04-29T03:26:21Z
body: **[ART PR BUILD NOTIFIER]**

Distgit: ose-agent-installer-api-server
This PR has been included in build [ose-agent-installer-api-server-container-v4.20.0-202504290242.p0.g20e7243.assembly.stream.el9](https://brewweb.engineering.redhat.com/brew/buildinfo?buildID=3625595).
All builds following this will include this PR.
author_association: CONTRIBUTOR