Skip to content

Commit

Permalink
MGMT-16242: Suggest OCP images based on availability for architecture
Browse files Browse the repository at this point in the history
This feature will suggest Openshift versions that are available for the release images of an architecture in the case that no release images for the supplied version are found.
This is to aid the user in picking a different version.
  • Loading branch information
paul-maidment committed Jul 11, 2024
1 parent f27a9e4 commit 58c6e3c
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 5 deletions.
16 changes: 11 additions & 5 deletions internal/versions/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
context "context"
"encoding/json"
"fmt"
"strings"
"sync"

"github.com/go-openapi/strfmt"
Expand Down Expand Up @@ -128,19 +129,18 @@ func validateReleaseImageForRHCOS(
) error {
// Multi is not a valid RHCOS CPU architecture, its sub-architectures are
if cpuArchitecture == common.MultiCPUArchitecture {
return errors.Errorf("The requested RHCOS version (%s, arch: %s) does not have a matching OpenShift release image", rhcosVersion, cpuArchitecture)
return errors.Errorf("The requested RHCOS version (%s, arch: %s) does not have a matching OpenShift release image, there are no valid Openshift versions for architecture %s", rhcosVersion, cpuArchitecture, common.MultiCPUArchitecture)
}

rhcosVersionPtr, err := common.GetMajorMinorVersion(rhcosVersion)
if err != nil {
return err
}

if cpuArchitecture == "" {
// Empty implies default CPU architecture
cpuArchitecture = common.DefaultCPUArchitecture
}

availableOCPVersions := []string{}
for _, releaseImage := range releaseImages {
minorVersion, err := common.GetMajorMinorVersion(*releaseImage.OpenshiftVersion)
if err != nil {
Expand All @@ -160,9 +160,15 @@ func validateReleaseImageForRHCOS(
}
}
}
if swag.ContainsStrings(releaseImage.CPUArchitectures, cpuArchitecture) && !swag.ContainsStrings(availableOCPVersions, swag.StringValue(minorVersion)) {
availableOCPVersions = append(availableOCPVersions, swag.StringValue(releaseImage.OpenshiftVersion))
}
}

return errors.Errorf("The requested RHCOS version (%s, arch: %s) does not have a matching OpenShift release image", *rhcosVersionPtr, cpuArchitecture)
ocpVersionAdvice := fmt.Sprintf("There are no OCP versions available in release images for arch %s.", cpuArchitecture)
if len(availableOCPVersions) > 0 {
ocpVersionAdvice = fmt.Sprintf("The following OCP versions are available in release images for arch %s: %s", cpuArchitecture, strings.Join(availableOCPVersions, ","))
}
return errors.Errorf("The requested RHCOS version (%s, arch: %s) does not have a matching OpenShift release image. %s", *rhcosVersionPtr, cpuArchitecture, ocpVersionAdvice)
}

func AddReleaseImagesToDBIfNeeded(
Expand Down
21 changes: 21 additions & 0 deletions internal/versions/common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package versions
import (
context "context"
"fmt"
"strings"
"sync"

"github.com/go-openapi/swag"
Expand Down Expand Up @@ -177,6 +178,26 @@ var _ = Describe("validateReleaseImageForRHCOS", func() {
It("fails validation using invalid version", func() {
Expect(validateReleaseImageForRHCOS(log, "invalid", common.X86CPUArchitecture, releaseImages)).NotTo(Succeed())
})

It("advises on suitable Openshift versions if unable to find release image for architecture", func() {
err := validateReleaseImageForRHCOS(log, "9.9.9-chocobomb", common.X86CPUArchitecture, releaseImages)
Expect(err).ToNot(BeNil())
errorMessage := err.Error()
Expect(errorMessage).To(ContainSubstring(fmt.Sprintf("The requested RHCOS version (%s, arch: %s) does not have a matching OpenShift release image.", "9.9", common.X86CPUArchitecture)))
Expect(errorMessage).To(ContainSubstring(fmt.Sprintf("The following OCP versions are available in release images for arch %s:", common.X86CPUArchitecture)))
splitErrorMessage := strings.Split(errorMessage, ":")
Expect(len(splitErrorMessage)).To(Equal(3))
versionsSplit := strings.Split(strings.Trim(splitErrorMessage[2], " "), ",")
Expect(versionsSplit).To(ContainElement("4.11.1"))
Expect(versionsSplit).To(ContainElement("4.12"))

})

It("advises that no Openshift versions are available in release images if none found for architecture", func() {
err := validateReleaseImageForRHCOS(log, "9.9.9-chocobomb", common.PowerCPUArchitecture, releaseImages)
Expect(err).ToNot(BeNil())
Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("There are no OCP versions available in release images for arch %s.", common.PowerCPUArchitecture)))
})
})

var _ = Describe("GetMustGatherImages", func() {
Expand Down

0 comments on commit 58c6e3c

Please sign in to comment.