From 318a84140e5e527128cd7994c31c81df12a81c64 Mon Sep 17 00:00:00 2001 From: Brad Williams Date: Wed, 8 Jul 2026 14:06:26 -0400 Subject: [PATCH] Migrate syncPending to ReleasePayloads rh-pre-commit.version: 2.4.0 rh-pre-commit.check-secrets: ENABLED --- cmd/release-controller/sync.go | 137 +++++++++++++++------------------ 1 file changed, 63 insertions(+), 74 deletions(-) diff --git a/cmd/release-controller/sync.go b/cmd/release-controller/sync.go index 4e90076d4..b9b0cbd08 100644 --- a/cmd/release-controller/sync.go +++ b/cmd/release-controller/sync.go @@ -368,48 +368,27 @@ func (c *Controller) syncPending(release *releasecontroller.Release, pendingTags if err != nil || job == nil { return err } - success, complete := jobIsComplete(job) - switch { - case !complete: - return c.ensureRewriteJobImageRetrieved(release, job, mirror) - case !success: - // TODO: extract termination message from the job - if err := c.transitionReleasePhaseFailure(release, []string{releasecontroller.ReleasePhasePending}, releasecontroller.ReleasePhaseFailed, reasonAndMessage("CreateReleaseFailed", "Could not create the release image"), tag.Name); err != nil { + payload, err := c.releasePayloadLister.ReleasePayloads(release.Target.Namespace).Get(tag.Name) + if err != nil { + if !errors.IsNotFound(err) { return err } - default: + return c.ensureRewriteJobImageRetrieved(release, job, mirror) + } + phase := releasecontroller.GetReleasePhase(payload) + switch phase { + case releasecontroller.ReleasePhaseReady: if err := c.markReleaseReady(release, nil, tag.Name); err != nil { return err } - if tags := releasecontroller.SortedRawReleaseTags(release, releasecontroller.ReleasePhaseReady); len(tags) > 0 { - go func() { - fromPullSpec := releasecontroller.ReleasePullSpec(release, tags[0]) - if len(fromPullSpec) == 0 { - klog.Errorf("Unable to determine pullspec for fromImage: %s", tags[0].Name) - return - } - fromImage, err := releasecontroller.GetImageInfo(c.releaseInfo, c.architecture, fromPullSpec) - if err != nil { - klog.Errorf("Unable to get from image info for release %s: %v", tags[0].Name, err) - return - } - - toPullSpec := releasecontroller.ReleasePullSpec(release, tag) - if len(toPullSpec) == 0 { - klog.Errorf("Unable to determine pullspec for toImage: %s", tag.Name) - return - } - toImage, err := releasecontroller.GetImageInfo(c.releaseInfo, c.architecture, toPullSpec) - if err != nil { - klog.Errorf("Unable to get to image info for release %s: %v", tag.Name, err) - return - } - - if _, err := c.releaseInfo.ChangeLog(fromImage.GenerateDigestPullSpec(), toImage.GenerateDigestPullSpec(), false); err != nil { - klog.V(4).Infof("Unable to pre-cache changelog for new ready release %s: %v", tag.Name, err) - } - }() + c.precacheChangelog(release, tag) + case releasecontroller.ReleasePhaseFailed: + log, _, _ := ensureJobTerminationMessageRetrieved(c.podClient, job, "status.phase=Failed", "build", false) + if err := c.transitionReleasePhaseFailure(release, []string{releasecontroller.ReleasePhasePending}, releasecontroller.ReleasePhaseFailed, withLog(reasonAndMessage("CreateReleaseFailed", "Could not create the release image"), log), tag.Name); err != nil { + return err } + default: + return c.ensureRewriteJobImageRetrieved(release, job, mirror) } } return nil @@ -444,50 +423,28 @@ func (c *Controller) syncPending(release *releasecontroller.Release, pendingTags if err != nil || job == nil { return err } - success, complete := jobIsComplete(job) - klog.V(4).Infof("Release creation for %s success: %v, complete: %v", tag.Name, success, complete) - switch { - case !complete: - return nil - case !success: - // try to get the last termination message - log, _, _ := ensureJobTerminationMessageRetrieved(c.podClient, job, "status.phase=Failed", "build", false) - if err := c.transitionReleasePhaseFailure(release, []string{releasecontroller.ReleasePhasePending}, releasecontroller.ReleasePhaseFailed, withLog(reasonAndMessage("CreateReleaseFailed", "Could not create the release image"), log), tag.Name); err != nil { + payload, err := c.releasePayloadLister.ReleasePayloads(release.Target.Namespace).Get(tag.Name) + if err != nil { + if !errors.IsNotFound(err) { return err } - default: + return nil + } + phase := releasecontroller.GetReleasePhase(payload) + klog.V(4).Infof("Release creation for %s phase: %s", tag.Name, phase) + switch phase { + case releasecontroller.ReleasePhaseReady: if err := c.markReleaseReady(release, nil, tag.Name); err != nil { return err } - if tags := releasecontroller.SortedRawReleaseTags(release, releasecontroller.ReleasePhaseReady); len(tags) > 0 { - go func() { - fromPullSpec := releasecontroller.ReleasePullSpec(release, tags[0]) - if len(fromPullSpec) == 0 { - klog.Errorf("Unable to determine pullspec for fromImage: %s", tags[0].Name) - return - } - fromImage, err := releasecontroller.GetImageInfo(c.releaseInfo, c.architecture, fromPullSpec) - if err != nil { - klog.Errorf("Unable to get from image info for release %s: %v", tags[0].Name, err) - return - } - - toPullSpec := releasecontroller.ReleasePullSpec(release, tag) - if len(toPullSpec) == 0 { - klog.Errorf("Unable to determine pullspec for toImage: %s", tag.Name) - return - } - toImage, err := releasecontroller.GetImageInfo(c.releaseInfo, c.architecture, toPullSpec) - if err != nil { - klog.Errorf("Unable to get to image info for release %s: %v", tag.Name, err) - return - } - - if _, err := c.releaseInfo.ChangeLog(fromImage.GenerateDigestPullSpec(), toImage.GenerateDigestPullSpec(), false); err != nil { - klog.V(4).Infof("Unable to pre-cache changelog for new ready release %s: %v", tag.Name, err) - } - }() + c.precacheChangelog(release, tag) + case releasecontroller.ReleasePhaseFailed: + log, _, _ := ensureJobTerminationMessageRetrieved(c.podClient, job, "status.phase=Failed", "build", false) + if err := c.transitionReleasePhaseFailure(release, []string{releasecontroller.ReleasePhasePending}, releasecontroller.ReleasePhaseFailed, withLog(reasonAndMessage("CreateReleaseFailed", "Could not create the release image"), log), tag.Name); err != nil { + return err } + default: + return nil } } @@ -589,6 +546,38 @@ func (c *Controller) syncAccepted(release *releasecontroller.Release) error { return nil } +func (c *Controller) precacheChangelog(release *releasecontroller.Release, tag *imagev1.TagReference) { + if tags := releasecontroller.SortedRawReleaseTags(release, releasecontroller.ReleasePhaseReady); len(tags) > 0 { + go func() { + fromPullSpec := releasecontroller.ReleasePullSpec(release, tags[0]) + if len(fromPullSpec) == 0 { + klog.Errorf("Unable to determine pullspec for fromImage: %s", tags[0].Name) + return + } + fromImage, err := releasecontroller.GetImageInfo(c.releaseInfo, c.architecture, fromPullSpec) + if err != nil { + klog.Errorf("Unable to get from image info for release %s: %v", tags[0].Name, err) + return + } + + toPullSpec := releasecontroller.ReleasePullSpec(release, tag) + if len(toPullSpec) == 0 { + klog.Errorf("Unable to determine pullspec for toImage: %s", tag.Name) + return + } + toImage, err := releasecontroller.GetImageInfo(c.releaseInfo, c.architecture, toPullSpec) + if err != nil { + klog.Errorf("Unable to get to image info for release %s: %v", tag.Name, err) + return + } + + if _, err := c.releaseInfo.ChangeLog(fromImage.GenerateDigestPullSpec(), toImage.GenerateDigestPullSpec(), false); err != nil { + klog.V(4).Infof("Unable to pre-cache changelog for new ready release %s: %v", tag.Name, err) + } + }() + } +} + func (c *Controller) loadReleaseForSync(namespace, name string) (*releasecontroller.Release, error) { // locate the release definition off the image stream, or clean up any remaining // artifacts if the release no longer points to those