From 8d131dc9f73c237b4859ed9b0d34e1e68ba825c6 Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Fri, 29 Mar 2024 13:00:19 +0100 Subject: [PATCH 01/25] NO-ISSUE: rename docker image for postgres 12 as latest tag disappeared (#6122) Signed-off-by: Riccardo Piccoli Co-authored-by: Riccardo Piccoli --- Makefile | 2 +- config/manager/manager.yaml | 2 +- .../assisted-service-operator.clusterserviceversion.yaml | 2 +- .../assisted-service-operator.clusterserviceversion.yaml | 4 ++-- deploy/podman/pod-persistent-disconnected.yml | 2 +- deploy/podman/pod-persistent.yml | 2 +- deploy/podman/pod.yml | 2 +- deploy/podman/pod_tls.yml | 2 +- deploy/postgres/postgres-deployment-ephemeral.yaml | 2 +- deploy/postgres/postgres-deployment.yaml | 2 +- docs/dev/testing.md | 2 +- internal/common/common_unitest_db.go | 2 +- internal/common/testcontainers_db_context.go | 2 +- internal/controller/controllers/images.go | 2 +- 14 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 5917142b3e14..1b51773911c1 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ DEBUG_SERVICE_PORT := $(or ${DEBUG_SERVICE_PORT},40000) SERVICE := $(or ${SERVICE},${ASSISTED_ORG}/assisted-service:${ASSISTED_TAG}) IMAGE_SERVICE := $(or ${IMAGE_SERVICE},${ASSISTED_ORG}/assisted-image-service:${ASSISTED_TAG}) ASSISTED_UI := $(or ${ASSISTED_UI},${ASSISTED_ORG}/assisted-installer-ui:${ASSISTED_TAG}) -PSQL_IMAGE := $(or ${PSQL_IMAGE},quay.io/centos7/postgresql-12-centos7:latest) +PSQL_IMAGE := $(or ${PSQL_IMAGE},quay.io/sclorg/postgresql-12-c8s:latest) BUNDLE_IMAGE := $(or ${BUNDLE_IMAGE},${ASSISTED_ORG}/assisted-service-operator-bundle:${ASSISTED_TAG}) INDEX_IMAGE := $(or ${INDEX_IMAGE},${ASSISTED_ORG}/assisted-service-index:${ASSISTED_TAG}) diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml index 546dcb409ebb..d6c7e96eab07 100644 --- a/config/manager/manager.yaml +++ b/config/manager/manager.yaml @@ -35,7 +35,7 @@ spec: - name: IMAGE_SERVICE_IMAGE value: quay.io/edge-infrastructure/assisted-image-service:latest - name: DATABASE_IMAGE - value: quay.io/centos7/postgresql-12-centos7:latest + value: quay.io/sclorg/postgresql-12-c8s:latest - name: AGENT_IMAGE value: quay.io/edge-infrastructure/assisted-installer-agent:latest - name: CONTROLLER_IMAGE diff --git a/config/manifests/bases/assisted-service-operator.clusterserviceversion.yaml b/config/manifests/bases/assisted-service-operator.clusterserviceversion.yaml index 5ff09f6b5f80..4a502dd83e2f 100644 --- a/config/manifests/bases/assisted-service-operator.clusterserviceversion.yaml +++ b/config/manifests/bases/assisted-service-operator.clusterserviceversion.yaml @@ -158,7 +158,7 @@ spec: name: controller - image: quay.io/edge-infrastructure/assisted-image-service:latest name: image-service - - image: quay.io/centos7/postgresql-12-centos7:latest + - image: quay.io/sclorg/postgresql-12-c8s:latest name: postgresql - image: quay.io/edge-infrastructure/assisted-installer:latest name: installer diff --git a/deploy/olm-catalog/manifests/assisted-service-operator.clusterserviceversion.yaml b/deploy/olm-catalog/manifests/assisted-service-operator.clusterserviceversion.yaml index 4b66a7f09156..cd3491972e30 100644 --- a/deploy/olm-catalog/manifests/assisted-service-operator.clusterserviceversion.yaml +++ b/deploy/olm-catalog/manifests/assisted-service-operator.clusterserviceversion.yaml @@ -981,7 +981,7 @@ spec: - name: IMAGE_SERVICE_IMAGE value: quay.io/edge-infrastructure/assisted-image-service:latest - name: DATABASE_IMAGE - value: quay.io/centos7/postgresql-12-centos7:latest + value: quay.io/sclorg/postgresql-12-c8s:latest - name: AGENT_IMAGE value: quay.io/edge-infrastructure/assisted-installer-agent:latest - name: CONTROLLER_IMAGE @@ -1119,7 +1119,7 @@ spec: name: controller - image: quay.io/edge-infrastructure/assisted-image-service:latest name: image-service - - image: quay.io/centos7/postgresql-12-centos7:latest + - image: quay.io/sclorg/postgresql-12-c8s:latest name: postgresql - image: quay.io/edge-infrastructure/assisted-installer:latest name: installer diff --git a/deploy/podman/pod-persistent-disconnected.yml b/deploy/podman/pod-persistent-disconnected.yml index dd46150e07d6..f5d69b6b57b3 100644 --- a/deploy/podman/pod-persistent-disconnected.yml +++ b/deploy/podman/pod-persistent-disconnected.yml @@ -8,7 +8,7 @@ spec: containers: - args: - run-postgresql - image: quay.io/centos7/postgresql-12-centos7:latest + image: quay.io/sclorg/postgresql-12-c8s:latest name: db envFrom: - configMapRef: diff --git a/deploy/podman/pod-persistent.yml b/deploy/podman/pod-persistent.yml index a89f28f5373e..d28eeab9f924 100644 --- a/deploy/podman/pod-persistent.yml +++ b/deploy/podman/pod-persistent.yml @@ -8,7 +8,7 @@ spec: containers: - args: - run-postgresql - image: quay.io/centos7/postgresql-12-centos7:latest + image: quay.io/sclorg/postgresql-12-c8s:latest name: db envFrom: - configMapRef: diff --git a/deploy/podman/pod.yml b/deploy/podman/pod.yml index ea6ae03b4329..b965182e75e6 100644 --- a/deploy/podman/pod.yml +++ b/deploy/podman/pod.yml @@ -8,7 +8,7 @@ spec: containers: - args: - run-postgresql - image: quay.io/centos7/postgresql-12-centos7:latest + image: quay.io/sclorg/postgresql-12-c8s:latest name: db envFrom: - configMapRef: diff --git a/deploy/podman/pod_tls.yml b/deploy/podman/pod_tls.yml index be42a335a652..da716412ddf6 100644 --- a/deploy/podman/pod_tls.yml +++ b/deploy/podman/pod_tls.yml @@ -8,7 +8,7 @@ spec: containers: - args: - run-postgresql - image: quay.io/centos7/postgresql-12-centos7:latest + image: quay.io/sclorg/postgresql-12-c8s:latest name: db envFrom: - configMapRef: diff --git a/deploy/postgres/postgres-deployment-ephemeral.yaml b/deploy/postgres/postgres-deployment-ephemeral.yaml index 942c693102dc..f881af55a131 100644 --- a/deploy/postgres/postgres-deployment-ephemeral.yaml +++ b/deploy/postgres/postgres-deployment-ephemeral.yaml @@ -15,7 +15,7 @@ spec: spec: containers: - name: postgres - image: quay.io/centos7/postgresql-12-centos7 + image: quay.io/sclorg/postgresql-12-c8s imagePullPolicy: "IfNotPresent" ports: - containerPort: 5432 diff --git a/deploy/postgres/postgres-deployment.yaml b/deploy/postgres/postgres-deployment.yaml index b9952e6bc514..8d5ee14d6ea1 100644 --- a/deploy/postgres/postgres-deployment.yaml +++ b/deploy/postgres/postgres-deployment.yaml @@ -15,7 +15,7 @@ spec: spec: containers: - name: postgres - image: quay.io/centos7/postgresql-12-centos7 + image: quay.io/sclorg/postgresql-12-c8s imagePullPolicy: "IfNotPresent" ports: - containerPort: 5432 diff --git a/docs/dev/testing.md b/docs/dev/testing.md index 18774ef18c80..c182101d190d 100644 --- a/docs/dev/testing.md +++ b/docs/dev/testing.md @@ -4,7 +4,7 @@ The assisted-installer tests are divided into 3 categories: * **Unit tests** - Focused on a module/function level while other modules are mocked. Unit tests are located in the package, where the code they are testing resides, using the pattern `_test.go`. -Unit tests needs a postgresql db container. The image for db container `quay.io/centos7/postgresql-12-centos7:latest` is built from `https://github.com/sclorg/postgresql-container` +Unit tests needs a postgresql db container. The image for db container `quay.io/sclorg/postgresql-12-c8s:latest` is built from `https://github.com/sclorg/postgresql-container` * **Subsystem tests** - Focused on the component while mocking other component. For example, assisted-service subsystem tests mock the agent responses. diff --git a/internal/common/common_unitest_db.go b/internal/common/common_unitest_db.go index a59ade706d88..74fadcf03c26 100644 --- a/internal/common/common_unitest_db.go +++ b/internal/common/common_unitest_db.go @@ -131,7 +131,7 @@ func (c *K8SDBContext) Create() error { Containers: []corev1.Container{ { Name: "psql", - Image: "quay.io/centos7/postgresql-12-centos7", + Image: "quay.io/sclorg/postgresql-12-c8s", Ports: []corev1.ContainerPort{ { Name: "tcp-5432", diff --git a/internal/common/testcontainers_db_context.go b/internal/common/testcontainers_db_context.go index 00d4a75b3292..25f899a65550 100644 --- a/internal/common/testcontainers_db_context.go +++ b/internal/common/testcontainers_db_context.go @@ -20,7 +20,7 @@ func (c *TestContainersDBContext) Create() error { var err error c.dbContainer, err = testcontainers.GenericContainer(c.ctx, testcontainers.GenericContainerRequest{ ContainerRequest: testcontainers.ContainerRequest{ - Image: "quay.io/centos7/postgresql-12-centos7:latest", + Image: "quay.io/sclorg/postgresql-12-c8s:latest", Env: map[string]string{"POSTGRESQL_ADMIN_PASSWORD": "admin"}, ExposedPorts: []string{fmt.Sprintf("%s/tcp", dbDefaultPort)}, Name: dbDockerName, diff --git a/internal/controller/controllers/images.go b/internal/controller/controllers/images.go index 88f716b16bad..30e219a265e2 100644 --- a/internal/controller/controllers/images.go +++ b/internal/controller/controllers/images.go @@ -33,7 +33,7 @@ func ImageServiceImage() string { } func DatabaseImage() string { - return getEnvVar("DATABASE_IMAGE", "quay.io/centos7/postgresql-12-centos7:latest") + return getEnvVar("DATABASE_IMAGE", "quay.io/sclorg/postgresql-12-c8s:latest") } func AgentImage() string { From 8f96359f2126182e32541261fe4e175c3e1ddf6e Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Fri, 29 Mar 2024 15:40:00 +0100 Subject: [PATCH 02/25] MGMT-17369: Add multi-arch release images to as well when setting only_latest=true in .../openshift-versions (#6138) Co-authored-by: danmanor --- internal/versions/api.go | 33 +++++++++++++++++++--- internal/versions/api_test.go | 52 +++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 4 deletions(-) diff --git a/internal/versions/api.go b/internal/versions/api.go index e470ee4dbd21..56fd02ce5c2b 100644 --- a/internal/versions/api.go +++ b/internal/versions/api.go @@ -2,6 +2,7 @@ package versions import ( context "context" + "fmt" "strings" middleware "github.com/go-openapi/runtime/middleware" @@ -13,6 +14,7 @@ import ( "github.com/openshift/assisted-service/restapi" operations "github.com/openshift/assisted-service/restapi/operations/versions" "github.com/pkg/errors" + "github.com/samber/lo" "github.com/sirupsen/logrus" "github.com/thoas/go-funk" ) @@ -78,7 +80,7 @@ func GetModelVersions(v Versions) models.Versions { // getLatestReleaseImageForMajorMinor returns the latest release image matching a given major.minor version, // or error if none of the release images match. The latest release image is considered the latest none beta release image, // or if all matching release images are beta then just the latest. -func getLatestReleaseImageForMajorMinor(releaseImages models.ReleaseImages, majorMinorVersion string) (*models.ReleaseImage, error) { +func getLatestReleaseImageForMajorMinor(releaseImages models.ReleaseImages, majorMinorVersion string, log logrus.FieldLogger) (*models.ReleaseImage, error) { var latestReleaseImage *models.ReleaseImage for _, releaseImage := range releaseImages { // Typically, releaseImage.OpenshiftVersion follow the major.minor format, though exceptions exist with static release images. @@ -112,10 +114,28 @@ func getLatestReleaseImageForMajorMinor(releaseImages models.ReleaseImages, majo } } + log.Debugf("Found latest release image version '%s' for majorMinorVersion '%s'", *latestReleaseImage.Version, majorMinorVersion) + return latestReleaseImage, nil } -func filterReleaseImagesByOnlyLatest(releaseImages models.ReleaseImages, onlyLatest *bool) (models.ReleaseImages, error) { +// getMultiArchReleaseImage retrieves multi arch release image matching a given x.y.z version. +func getMultiArchReleaseImage(releaseImages models.ReleaseImages, version string, log logrus.FieldLogger) *models.ReleaseImage { + if !strings.HasSuffix(version, "-multi") { + version = fmt.Sprintf("%s-multi", version) + } + + if releaseImage, ok := lo.Find(releaseImages, func(releaseImage *models.ReleaseImage) bool { + return swag.StringValue(releaseImage.Version) == version + }); ok { + log.Debugf("Found multi-arch release image for version '%s'", version) + return releaseImage + } + + return nil +} + +func filterReleaseImagesByOnlyLatest(releaseImages models.ReleaseImages, onlyLatest *bool, log logrus.FieldLogger) (models.ReleaseImages, error) { if !swag.BoolValue(onlyLatest) { return releaseImages, nil } @@ -134,11 +154,16 @@ func filterReleaseImagesByOnlyLatest(releaseImages models.ReleaseImages, onlyLat filteredReleaseImages := models.ReleaseImages{} for majorMinorVersion := range releaseImagesMajorMinorVersionsSet { - latestReleaseImageForMajorMinor, err := getLatestReleaseImageForMajorMinor(releaseImages, majorMinorVersion) + latestReleaseImageForMajorMinor, err := getLatestReleaseImageForMajorMinor(releaseImages, majorMinorVersion, log) if err != nil { return nil, errors.Wrapf(err, "error occurred while trying to get the latest release image for version: %s", majorMinorVersion) } filteredReleaseImages = append(filteredReleaseImages, latestReleaseImageForMajorMinor) + // Add the matching multi-arch release image if exists as well + matchingMultiArchReleaseImage := getMultiArchReleaseImage(releaseImages, *latestReleaseImageForMajorMinor.Version, log) + if matchingMultiArchReleaseImage != nil { + filteredReleaseImages = append(filteredReleaseImages, matchingMultiArchReleaseImage) + } } return filteredReleaseImages, nil @@ -206,7 +231,7 @@ func (h *apiHandler) V2ListSupportedOpenshiftVersions(ctx context.Context, param releaseImages = filterIgnoredVersions(h.log, releaseImages, handler.ignoredOpenshiftVersions) releaseImagesByVersionPattern := filterReleaseImagesByVersion(releaseImages, params.Version) - releaseImagesByOnlyLatest, err := filterReleaseImagesByOnlyLatest(releaseImages, params.OnlyLatest) + releaseImagesByOnlyLatest, err := filterReleaseImagesByOnlyLatest(releaseImages, params.OnlyLatest, h.log) if err != nil { return common.GenerateErrorResponder(err) } diff --git a/internal/versions/api_test.go b/internal/versions/api_test.go index c96035b55989..31b8a38a66ed 100644 --- a/internal/versions/api_test.go +++ b/internal/versions/api_test.go @@ -490,6 +490,14 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { Version: swag.String("4.11.2"), SupportLevel: models.ReleaseImageSupportLevelProduction, }, + { + CPUArchitecture: swag.String(common.MultiCPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + OpenshiftVersion: swag.String("4.11-multi"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.11.2-multi"), + Version: swag.String("4.11.2-multi"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + }, { CPUArchitecture: swag.String(common.X86CPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture}, @@ -522,6 +530,14 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { Version: swag.String("4.13.2"), SupportLevel: models.OpenshiftVersionSupportLevelBeta, }, + { + CPUArchitecture: swag.String(common.MultiCPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + OpenshiftVersion: swag.String("4.13-multi"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.13.2-multi"), + Version: swag.String("4.13.2-multi"), + SupportLevel: models.OpenshiftVersionSupportLevelBeta, + }, } osImages := osImageList{ @@ -531,6 +547,12 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { URL: swag.String("https://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/4.11/4.11.48/rhcos-4.11.48-x86_64-live.x86_64.iso"), Version: swag.String("411.86.202308081056-0"), }, + { + OpenshiftVersion: swag.String("4.11"), + CPUArchitecture: swag.String(common.ARM64CPUArchitecture), + URL: swag.String("https://mirror.openshift.com/pub/openshift-v4/aarch64/dependencies/rhcos/4.11/4.11.48/rhcos-4.11.48-aarch64-live.aarch64.iso"), + Version: swag.String("411.86.202308081056-0"), + }, { OpenshiftVersion: swag.String("4.12"), CPUArchitecture: swag.String(common.X86CPUArchitecture), @@ -543,6 +565,12 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { URL: swag.String("https://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/4.13/4.13.48/rhcos-4.13.48-x86_64-live.x86_64.iso"), Version: swag.String("413.86.202308081056-0"), }, + { + OpenshiftVersion: swag.String("4.13"), + CPUArchitecture: swag.String(common.ARM64CPUArchitecture), + URL: swag.String("https://mirror.openshift.com/pub/openshift-v4/aarch64/dependencies/rhcos/4.13/4.13.48/rhcos-4.13.48-aarch64-live.aarch64.iso"), + Version: swag.String("411.86.202308081056-0"), + }, } var handler restapi.VersionsAPI @@ -570,6 +598,12 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { SupportLevel: swag.String(models.ReleaseImageSupportLevelProduction), Default: false, }, + "4.11.2-multi": { + DisplayName: swag.String("4.11.2-multi"), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + SupportLevel: swag.String(models.ReleaseImageSupportLevelProduction), + Default: false, + }, "4.12.1": { DisplayName: swag.String("4.12.1"), CPUArchitectures: []string{common.X86CPUArchitecture}, @@ -594,6 +628,12 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), Default: false, }, + "4.13.2-multi": { + DisplayName: swag.String("4.13.2-multi"), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), + Default: false, + }, } reply := handler.V2ListSupportedOpenshiftVersions( @@ -612,6 +652,12 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { SupportLevel: swag.String(models.ReleaseImageSupportLevelProduction), Default: false, }, + "4.11.2-multi": { + DisplayName: swag.String("4.11.2-multi"), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + SupportLevel: swag.String(models.ReleaseImageSupportLevelProduction), + Default: false, + }, "4.12.1": { DisplayName: swag.String("4.12.1"), CPUArchitectures: []string{common.X86CPUArchitecture}, @@ -624,6 +670,12 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), Default: false, }, + "4.13.2-multi": { + DisplayName: swag.String("4.13.2-multi"), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), + Default: false, + }, } reply := handler.V2ListSupportedOpenshiftVersions( From 3f9266c1f2544204cfb2b5a39bc0fd57c156028d Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Fri, 29 Mar 2024 19:25:33 +0100 Subject: [PATCH 03/25] MGMT-17361: Changing the addition of configuration release images to run when the instance becomes leader instead of skipping if it not (#6136) Co-authored-by: danmanor --- cmd/main.go | 75 +++++++++++----------- internal/releasesources/release_sources.go | 10 +-- 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 7f84c354c7cc..1293dfdd309a 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -319,7 +319,7 @@ func main() { maxDuration(Options.InstructionConfig.DiskCheckTimeout, Options.InstructionConfig.ImageAvailabilityTimeout)+1*time.Minute) var lead leader.ElectorInterface var k8sClient *kubernetes.Clientset - var autoMigrationLeader leader.ElectorInterface + var startupLeader leader.ElectorInterface mirrorRegistriesBuilder := mirrorregistries.New() releaseHandler := oc.NewRelease(&executer.CommonExecuter{}, @@ -382,7 +382,7 @@ func main() { failOnError(cerr, "Failed to create kubernetes cluster config") k8sClient = kubernetes.NewForConfigOrDie(cfg) - autoMigrationLeader = leader.NewElector(k8sClient, leader.Config{LeaseDuration: 5 * time.Second, + startupLeader = leader.NewElector(k8sClient, leader.Config{LeaseDuration: 5 * time.Second, RetryInterval: 2 * time.Second, Namespace: Options.LeaderConfig.Namespace, RenewDeadline: 4 * time.Second}, "assisted-service-migration-helper", log.WithField("pkg", "migrationLeader")) @@ -398,7 +398,7 @@ func main() { case deployment_type_onprem, deployment_type_ocp: lead = &leader.DummyElector{} - autoMigrationLeader = lead + startupLeader = lead if Options.DeployTarget == deployment_type_ocp { ocpClient, err = k8sclient.NewK8SClient("", log) @@ -409,7 +409,7 @@ func main() { log.Fatalf("not supported deploy target %s", Options.DeployTarget) } - failOnError(autoMigrationWithLeader(autoMigrationLeader, db, log), "Failed auto migration process") + failOnError(autoMigrationWithLeader(startupLeader, db, log), "Failed auto migration process") Options.UploaderConfig.AssistedServiceVersion = versions.GetRevision() Options.UploaderConfig.Versions = Options.Versions @@ -443,8 +443,8 @@ func main() { hostStateMonitor.Start() defer hostStateMonitor.Stop() - addReleaseImagesToDBIfNeeded(db, releaseImagesArray, lead, log, failOnError) - openshiftReleaseSyncer := runOpenshiftReleaseSyncerIfNeeded(releaseSourcesArray, releaseImagesArray, db, log, releaseHandler, lead, failOnError) + failOnError(addReleaseImagesToDBIfNeeded(db, releaseImagesArray, startupLeader, log), "error occured while adding configuration release images to the DB if needed") + openshiftReleaseSyncer := runOpenshiftReleaseSyncerIfNeeded(releaseSourcesArray, releaseImagesArray, db, log, releaseHandler, lead, startupLeader, failOnError) defer stopOpenshiftReleaseSyncerIfNeeded(openshiftReleaseSyncer) newUrl, err := s3wrapper.FixEndpointURL(Options.BMConfig.S3EndpointURL) @@ -952,21 +952,22 @@ func runOpenshiftReleaseSyncerIfNeeded( db *gorm.DB, log logrus.FieldLogger, releaseHandler oc.Release, - lead leader.ElectorInterface, + leader, + startupLeader leader.ElectorInterface, failOnError func(err error, msg string, args ...interface{}), ) *thread.Thread { if !Options.EnableKubeAPI && Options.ReleaseSourcesConfig.ReleaseSources != "" { releaseSourcesHandler, err := releasesources.NewReleaseSourcesHandler( - releaseSources, releaseImages, log, db, Options.ReleaseSourcesConfig, lead, + releaseSources, releaseImages, log, db, Options.ReleaseSourcesConfig, leader, ) if err != nil { failOnError(err, "error occurred while creating release sources handler") } - log.WithField("pkg", "releasesources").Info("Running Openshift Releases Syncer at startup") - err = releaseSourcesHandler.SyncReleaseImages() - if err != nil { - failOnError(err, "error occurred while syncing release images at startup") - } + + failOnError(startupLeader.RunWithLeader(context.Background(), func() error { + log.WithField("pkg", "releasesources").Info("Running Openshift Releases Syncer at startup") + return releaseSourcesHandler.SyncReleaseImages() + }), "error occurred while running Openshift Releases Syncer at startup") openShiftReleaseSyncer := thread.New( log.WithField("pkg", "releasesources"), "Openshift Releases Syncer", Options.ReleaseSourcesConfig.OpenShiftReleaseSyncerInterval, releaseSourcesHandler.SyncReleaseImagesThreadFunc) @@ -988,42 +989,42 @@ func addReleaseImagesToDBIfNeeded( releaseImages models.ReleaseImages, lead leader.ElectorInterface, log logrus.FieldLogger, - failOnError func(err error, msg string, args ...interface{})) { +) error { // If it is kubeAPI mode or release sources was specified (therefore OpenShift Release Syncer will run), // we should not add the release images to the DB. if Options.EnableKubeAPI || Options.ReleaseSourcesConfig.ReleaseSources != "" { - return + return nil } - if !lead.IsLeader() { - log.Debug("Not a leader, skip adding configuration release images to the DB") - return - } + return lead.RunWithLeader(context.Background(), func() error { + tx := db.Begin() - tx := db.Begin() + var count int64 + if err := tx.Model(&models.ReleaseImage{}).Count(&count).Error; err != nil { + return errors.Wrapf(err, "error occurred while trying to count the initial amount of release images in the DB") + } - var count int64 - err := tx.Model(&models.ReleaseImage{}).Count(&count).Error - failOnError(err, "error occurred while trying to count the initial amount of release images in the DB") + log.Debugf("Truncating all release_images table. '%d' records", count) + if err := tx.Exec("TRUNCATE TABLE release_images").Error; err != nil { + tx.Rollback() + return errors.Wrapf(err, "error occurred while trying to delete the release images in the DB") + } - log.Debugf("Truncating all release_images table. '%d' records", count) - if err := tx.Exec("TRUNCATE TABLE release_images").Error; err != nil { - tx.Rollback() - failOnError(err, "error occurred while trying to delete the release images in the DB") - } + if len(releaseImages) > 0 { + log.Debugf("Inserting configuration release images to the DB. '%d' records", len(releaseImages)) + if err := tx.Create(releaseImages).Error; err != nil { + tx.Rollback() + return errors.Wrapf(err, "error occurred while trying to insert the release images to the DB") + } + } - if len(releaseImages) > 0 { - log.Debugf("Inserting configuration release images to the DB. '%d' records", len(releaseImages)) - if err := tx.Create(releaseImages).Error; err != nil { + if err := tx.Commit().Error; err != nil { tx.Rollback() - failOnError(err, "error occurred while trying to insert the release images to the DB") + return errors.Wrapf(err, "error occurred while commiting changes to the DB") } - } - if err := tx.Commit().Error; err != nil { - tx.Rollback() - failOnError(err, "error occurred while commiting changes to the DB") - } + return nil + }) } func parseIgnoredOpenshiftVersions(ignoredOpenshiftVersions *[]string, failOnError func(err error, msg string, args ...interface{})) { diff --git a/internal/releasesources/release_sources.go b/internal/releasesources/release_sources.go index b30038dceb09..2ca7ed5bb930 100644 --- a/internal/releasesources/release_sources.go +++ b/internal/releasesources/release_sources.go @@ -265,11 +265,6 @@ func (h *releaseSourcesHandler) mergeEnrichedReleaseImages(staticReleaseImages, // SyncReleaseImages is an internal function intended to perform synchronization of release images and return any errors encountered. // This design is due to SyncReleaseImagesThreadFunc being restricted to thread package functionality and not directly handling errors. func (h *releaseSourcesHandler) SyncReleaseImages() error { - if !h.lead.IsLeader() { - h.log.Debug("Not a leader, exiting SyncReleaseImagesThreadFunc") - return nil - } - enrichedDynamicReleaseImages, err := h.getDynamicReleaseImages() if err != nil { return err @@ -446,6 +441,11 @@ func (h *releaseSourcesHandler) deleteAllReleases(tx *gorm.DB) error { } func (h *releaseSourcesHandler) SyncReleaseImagesThreadFunc() { + if !h.lead.IsLeader() { + h.log.Debug("Not a leader, exiting SyncReleaseImagesThreadFunc") + return + } + err := h.SyncReleaseImages() if err != nil { h.log.WithError(err).Warn("Failed to sync OpenShift ReleaseImages") From 208dcb5b56c535b30e5c27cd8f9c1e95401174f8 Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Fri, 5 Apr 2024 10:49:01 +0200 Subject: [PATCH 04/25] NO-ISSUE: replace minio quay.io image repository (#6152) Signed-off-by: Riccardo Piccoli Co-authored-by: Riccardo Piccoli --- deploy/s3/deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/s3/deployment.yaml b/deploy/s3/deployment.yaml index b19f1bf96b34..47b9d1a20156 100644 --- a/deploy/s3/deployment.yaml +++ b/deploy/s3/deployment.yaml @@ -16,7 +16,7 @@ spec: app: object-store spec: containers: - - image: quay.io/cloudservices/minio:latest + - image: quay.io/minio/minio:latest name: s3server args: - server From a3cc65bfee205c8fe7d32b0f5fdbb4518629413d Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Tue, 9 Apr 2024 15:03:06 +0200 Subject: [PATCH 05/25] MGMT-17438: bugfix, make sure ODF and LVM requirements do not change if MCE is not selected (#6160) Signed-off-by: Riccardo Piccoli Co-authored-by: Riccardo Piccoli --- internal/operators/api/api.go | 3 +- internal/operators/api/mock_operator_api.go | 8 +- internal/operators/cnv/cnv_operator.go | 2 +- internal/operators/cnv/cnv_operator_test.go | 2 +- internal/operators/lso/ls_operator.go | 2 +- internal/operators/lvm/lvm_operator.go | 23 +- internal/operators/lvm/lvm_operator_test.go | 247 +++++++++----------- internal/operators/manager.go | 14 +- internal/operators/manager_test.go | 97 +++++++- internal/operators/mce/mce_operator.go | 2 +- internal/operators/mce/mce_operator_test.go | 2 +- internal/operators/odf/odf_operator.go | 31 ++- internal/operators/odf/odf_operator_test.go | 4 +- internal/operators/odf/validations.go | 2 +- 14 files changed, 245 insertions(+), 194 deletions(-) diff --git a/internal/operators/api/api.go b/internal/operators/api/api.go index 99dca41e6ddc..f93cc801f01b 100644 --- a/internal/operators/api/api.go +++ b/internal/operators/api/api.go @@ -38,7 +38,7 @@ type Operator interface { // ValidateCluster verifies whether this operator is valid for given cluster ValidateCluster(ctx context.Context, cluster *common.Cluster) (ValidationResult, error) // ValidateHost verifies whether this operator is valid for given host - ValidateHost(ctx context.Context, cluster *common.Cluster, hosts *models.Host) (ValidationResult, error) + ValidateHost(ctx context.Context, cluster *common.Cluster, hosts *models.Host, additionalOperatorRequirements *models.ClusterHostRequirementsDetails) (ValidationResult, error) // GenerateManifests generates manifests for the operator GenerateManifests(*common.Cluster) (map[string][]byte, []byte, error) // GetHostRequirements provides operator's requirements towards the host @@ -61,5 +61,4 @@ type Operator interface { type StorageOperator interface { Operator StorageClassName() string - SetAdditionalDiskRequirements(additionalSizeGB int64) } diff --git a/internal/operators/api/mock_operator_api.go b/internal/operators/api/mock_operator_api.go index fe51a522453e..691a9d9d564b 100644 --- a/internal/operators/api/mock_operator_api.go +++ b/internal/operators/api/mock_operator_api.go @@ -211,16 +211,16 @@ func (mr *MockOperatorMockRecorder) ValidateCluster(arg0, arg1 interface{}) *gom } // ValidateHost mocks base method. -func (m *MockOperator) ValidateHost(arg0 context.Context, arg1 *common.Cluster, arg2 *models.Host) (ValidationResult, error) { +func (m *MockOperator) ValidateHost(arg0 context.Context, arg1 *common.Cluster, arg2 *models.Host, arg3 *models.ClusterHostRequirementsDetails) (ValidationResult, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ValidateHost", arg0, arg1, arg2) + ret := m.ctrl.Call(m, "ValidateHost", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(ValidationResult) ret1, _ := ret[1].(error) return ret0, ret1 } // ValidateHost indicates an expected call of ValidateHost. -func (mr *MockOperatorMockRecorder) ValidateHost(arg0, arg1, arg2 interface{}) *gomock.Call { +func (mr *MockOperatorMockRecorder) ValidateHost(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateHost", reflect.TypeOf((*MockOperator)(nil).ValidateHost), arg0, arg1, arg2) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateHost", reflect.TypeOf((*MockOperator)(nil).ValidateHost), arg0, arg1, arg2, arg3) } diff --git a/internal/operators/cnv/cnv_operator.go b/internal/operators/cnv/cnv_operator.go index 2535af29ee25..7f93738e6d6f 100644 --- a/internal/operators/cnv/cnv_operator.go +++ b/internal/operators/cnv/cnv_operator.go @@ -99,7 +99,7 @@ func (o *operator) validateRequirements(cluster *models.Cluster) (api.Validation } // ValidateHost returns validationResult based on node type requirements such as memory and cpu -func (o *operator) ValidateHost(ctx context.Context, cluster *common.Cluster, host *models.Host) (api.ValidationResult, error) { +func (o *operator) ValidateHost(ctx context.Context, cluster *common.Cluster, host *models.Host, _ *models.ClusterHostRequirementsDetails) (api.ValidationResult, error) { if host.Inventory == "" { o.log.Info("Empty Inventory of host with hostID ", host.ID) return api.ValidationResult{Status: api.Pending, ValidationId: o.GetHostValidationID(), Reasons: []string{"Missing Inventory in some of the hosts"}}, nil diff --git a/internal/operators/cnv/cnv_operator_test.go b/internal/operators/cnv/cnv_operator_test.go index 2e27b98159a1..b8e7dbda020f 100644 --- a/internal/operators/cnv/cnv_operator_test.go +++ b/internal/operators/cnv/cnv_operator_test.go @@ -280,7 +280,7 @@ var _ = Describe("CNV operator", func() { {SizeBytes: 20 * conversions.GiB, DriveType: models.DriveTypeSSD, ID: "disk3"}, })} table.DescribeTable("validateHost when ", func(cluster *common.Cluster, host *models.Host, expectedResult api.ValidationResult) { - res, _ := cnvOperator.ValidateHost(context.TODO(), cluster, host) + res, _ := cnvOperator.ValidateHost(context.TODO(), cluster, host, nil) Expect(res).Should(Equal(expectedResult)) }, table.Entry("No virt capabilities", diff --git a/internal/operators/lso/ls_operator.go b/internal/operators/lso/ls_operator.go index 6b64e5300c8b..8248fac7c5b9 100644 --- a/internal/operators/lso/ls_operator.go +++ b/internal/operators/lso/ls_operator.go @@ -55,7 +55,7 @@ func (l *lsOperator) ValidateCluster(_ context.Context, _ *common.Cluster) (api. } // ValidateHost always return "valid" result -func (l *lsOperator) ValidateHost(_ context.Context, _ *common.Cluster, _ *models.Host) (api.ValidationResult, error) { +func (l *lsOperator) ValidateHost(_ context.Context, _ *common.Cluster, _ *models.Host, _ *models.ClusterHostRequirementsDetails) (api.ValidationResult, error) { return api.ValidationResult{Status: api.Success, ValidationId: l.GetHostValidationID(), Reasons: []string{}}, nil } diff --git a/internal/operators/lvm/lvm_operator.go b/internal/operators/lvm/lvm_operator.go index 0c63f92064d3..3422073e6f09 100644 --- a/internal/operators/lvm/lvm_operator.go +++ b/internal/operators/lvm/lvm_operator.go @@ -17,10 +17,9 @@ import ( // operator is an ODF LVM OLM operator plugin; it implements api.Operator type operator struct { - log logrus.FieldLogger - Config *Config - extracter oc.Extracter - additionalDiskRequirementGB int64 + log logrus.FieldLogger + Config *Config + extracter oc.Extracter } const defaultStorageClassName = "lvms-" + defaultDeviceName @@ -65,10 +64,6 @@ func (o *operator) StorageClassName() string { return defaultStorageClassName } -func (o *operator) SetAdditionalDiskRequirements(additionalSizeGB int64) { - o.additionalDiskRequirementGB = additionalSizeGB -} - // GetDependencies provides a list of dependencies of the Operator func (o *operator) GetDependencies(cluster *common.Cluster) ([]string, error) { return make([]string, 0), nil @@ -101,7 +96,7 @@ func (o *operator) ValidateCluster(_ context.Context, cluster *common.Cluster) ( } // ValidateHost always return "valid" result -func (o *operator) ValidateHost(ctx context.Context, cluster *common.Cluster, host *models.Host) (api.ValidationResult, error) { +func (o *operator) ValidateHost(ctx context.Context, cluster *common.Cluster, host *models.Host, additionalOperatorRequirements *models.ClusterHostRequirementsDetails) (api.ValidationResult, error) { if host.Inventory == "" { message := "Missing Inventory in the host" return api.ValidationResult{Status: api.Pending, ValidationId: o.GetHostValidationID(), Reasons: []string{message}}, nil @@ -113,13 +108,17 @@ func (o *operator) ValidateHost(ctx context.Context, cluster *common.Cluster, ho return api.ValidationResult{Status: api.Failure, ValidationId: o.GetHostValidationID(), Reasons: []string{message}}, err } - diskCount, _ := operatorscommon.NonInstallationDiskCount(inventory.Disks, host.InstallationDiskID, o.additionalDiskRequirementGB) + minDiskSizeGb := int64(0) + if additionalOperatorRequirements != nil { + minDiskSizeGb = additionalOperatorRequirements.DiskSizeGb + } + diskCount, _ := operatorscommon.NonInstallationDiskCount(inventory.Disks, host.InstallationDiskID, minDiskSizeGb) role := common.GetEffectiveRole(host) areSchedulable := common.AreMastersSchedulable(cluster) minSizeMessage := "" - if o.additionalDiskRequirementGB > 0 { - minSizeMessage = fmt.Sprintf(" of %dGB minimum", o.additionalDiskRequirementGB) + if minDiskSizeGb > 0 { + minSizeMessage = fmt.Sprintf(" of %dGB minimum", minDiskSizeGb) } message := fmt.Sprintf("Logical Volume Manager requires at least one non-installation HDD/SSD disk%s on the host", minSizeMessage) diff --git a/internal/operators/lvm/lvm_operator_test.go b/internal/operators/lvm/lvm_operator_test.go index adc4e7a2af23..692364b11d49 100644 --- a/internal/operators/lvm/lvm_operator_test.go +++ b/internal/operators/lvm/lvm_operator_test.go @@ -349,160 +349,136 @@ var _ = Describe("Lvm Operator", func() { } }) hostValidationTests := []struct { - name string - ocpVersion string - hosts []*models.Host - resultMessage []string - apiStatus api.ValidationStatus - hostRole models.HostRole - HighAvailabilityMode string - diskCount int - hostCPU int64 - hostMem float32 - additionalDiskRequirementGB int64 + name string + ocpVersion string + hosts []*models.Host + resultMessage []string + apiStatus api.ValidationStatus + hostRole models.HostRole + HighAvailabilityMode string + diskCount int + hostCPU int64 + hostMem float32 }{ { - name: "SNO with sufficient resources, 4.12", - ocpVersion: "4.12.0", - hosts: []*models.Host{}, - resultMessage: nil, - apiStatus: api.Success, - diskCount: 2, - hostCPU: 9, - HighAvailabilityMode: models.ClusterHighAvailabilityModeNone, - hostRole: models.HostRoleAutoAssign, - hostMem: 16*conversions.GiB + float32(lvmMemMB_pre4_13), - additionalDiskRequirementGB: int64(0), - }, - { - name: "SNO with sufficient resources", - ocpVersion: "4.13.0", - hosts: []*models.Host{}, - resultMessage: nil, - apiStatus: api.Success, - diskCount: 2, - hostCPU: 9, - HighAvailabilityMode: models.ClusterHighAvailabilityModeNone, - hostRole: models.HostRoleAutoAssign, - hostMem: 16*conversions.GiB + float32(lvmMemMB), - additionalDiskRequirementGB: int64(0), + name: "SNO with sufficient resources, 4.12", + ocpVersion: "4.12.0", + hosts: []*models.Host{}, + resultMessage: nil, + apiStatus: api.Success, + diskCount: 2, + hostCPU: 9, + HighAvailabilityMode: models.ClusterHighAvailabilityModeNone, + hostRole: models.HostRoleAutoAssign, + hostMem: 16*conversions.GiB + float32(lvmMemMB_pre4_13), }, { - name: "SNO with insufficient disks", - ocpVersion: "4.13.0", - hosts: []*models.Host{}, - resultMessage: []string{"Logical Volume Manager requires at least one non-installation HDD/SSD disk on the host"}, - apiStatus: api.Failure, - diskCount: 1, - hostCPU: 9, - HighAvailabilityMode: models.ClusterHighAvailabilityModeNone, - hostRole: models.HostRoleAutoAssign, - hostMem: 16*conversions.GiB + float32(lvmMemMB), - additionalDiskRequirementGB: int64(0), + name: "SNO with sufficient resources", + ocpVersion: "4.13.0", + hosts: []*models.Host{}, + resultMessage: nil, + apiStatus: api.Success, + diskCount: 2, + hostCPU: 9, + HighAvailabilityMode: models.ClusterHighAvailabilityModeNone, + hostRole: models.HostRoleAutoAssign, + hostMem: 16*conversions.GiB + float32(lvmMemMB), }, { - name: "Compact version 4.15, HostRoleAutoAssign", - ocpVersion: "4.15.0", - hosts: []*models.Host{masterCompactNode, masterCompactNode}, - resultMessage: nil, - apiStatus: api.Success, - diskCount: 2, - hostCPU: 7, - HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, - hostRole: models.HostRoleAutoAssign, - hostMem: 24*conversions.GiB + float32(lvmMemMB), - additionalDiskRequirementGB: int64(0), + name: "SNO with insufficient disks", + ocpVersion: "4.13.0", + hosts: []*models.Host{}, + resultMessage: []string{"Logical Volume Manager requires at least one non-installation HDD/SSD disk on the host"}, + apiStatus: api.Failure, + diskCount: 1, + hostCPU: 9, + HighAvailabilityMode: models.ClusterHighAvailabilityModeNone, + hostRole: models.HostRoleAutoAssign, + hostMem: 16*conversions.GiB + float32(lvmMemMB), }, { - name: "Compact version 4.15, HostRoleMaster", - ocpVersion: "4.15.0", - hosts: []*models.Host{masterCompactNode, masterCompactNode}, - resultMessage: nil, - apiStatus: api.Success, - diskCount: 2, - hostCPU: 7, - HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, - hostRole: models.HostRoleMaster, - hostMem: 24*conversions.GiB + float32(lvmMemMB), - additionalDiskRequirementGB: int64(0), + name: "Compact version 4.15, HostRoleAutoAssign", + ocpVersion: "4.15.0", + hosts: []*models.Host{masterCompactNode, masterCompactNode}, + resultMessage: nil, + apiStatus: api.Success, + diskCount: 2, + hostCPU: 7, + HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, + hostRole: models.HostRoleAutoAssign, + hostMem: 24*conversions.GiB + float32(lvmMemMB), }, { - name: "Compact version 4.15, Worker", - ocpVersion: "4.15.0", - hosts: []*models.Host{masterCompactNode, masterCompactNode}, - resultMessage: nil, - apiStatus: api.Success, - diskCount: 2, - hostCPU: 7, - HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, - hostRole: models.HostRoleWorker, - hostMem: 24*conversions.GiB + float32(lvmMemMB), - additionalDiskRequirementGB: int64(0), + name: "Compact version 4.15, HostRoleMaster", + ocpVersion: "4.15.0", + hosts: []*models.Host{masterCompactNode, masterCompactNode}, + resultMessage: nil, + apiStatus: api.Success, + diskCount: 2, + hostCPU: 7, + HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, + hostRole: models.HostRoleMaster, + hostMem: 24*conversions.GiB + float32(lvmMemMB), }, { - name: "full version 4.15, Master", - ocpVersion: "4.15.0", - hosts: []*models.Host{masterNode, masterNode, workerNode, workerNode, workerNode}, - resultMessage: nil, - apiStatus: api.Success, - diskCount: 1, - hostCPU: 4, - HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, - hostRole: models.HostRoleMaster, - hostMem: 16 * conversions.GiB, - additionalDiskRequirementGB: int64(0), + name: "Compact version 4.15, Worker", + ocpVersion: "4.15.0", + hosts: []*models.Host{masterCompactNode, masterCompactNode}, + resultMessage: nil, + apiStatus: api.Success, + diskCount: 2, + hostCPU: 7, + HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, + hostRole: models.HostRoleWorker, + hostMem: 24*conversions.GiB + float32(lvmMemMB), }, { - name: "full version 4.15, Worker", - ocpVersion: "4.15.0", - hosts: []*models.Host{masterNode, masterNode, masterNode, workerNode, workerNode}, - resultMessage: nil, - apiStatus: api.Success, - diskCount: 2, - hostCPU: 3, - HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, - hostRole: models.HostRoleWorker, - hostMem: 8*conversions.GiB + float32(lvmMemMB), - additionalDiskRequirementGB: int64(0), + name: "full version 4.15, Master", + ocpVersion: "4.15.0", + hosts: []*models.Host{masterNode, masterNode, workerNode, workerNode, workerNode}, + resultMessage: nil, + apiStatus: api.Success, + diskCount: 1, + hostCPU: 4, + HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, + hostRole: models.HostRoleMaster, + hostMem: 16 * conversions.GiB, }, { - name: "full version 4.15, Worker HostRoleAutoAssign", - ocpVersion: "4.15.0", - hosts: []*models.Host{masterNode, masterNode, masterNode, workerNode, workerNode}, - resultMessage: []string{"For Logical Volume Manager Standard Mode, host role must be assigned to master or worker."}, - apiStatus: api.Failure, - diskCount: 2, - hostCPU: 3, - HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, - hostRole: models.HostRoleAutoAssign, - hostMem: 8*conversions.GiB + float32(lvmMemMB), - additionalDiskRequirementGB: int64(0), + name: "full version 4.15, Worker", + ocpVersion: "4.15.0", + hosts: []*models.Host{masterNode, masterNode, masterNode, workerNode, workerNode}, + resultMessage: nil, + apiStatus: api.Success, + diskCount: 2, + hostCPU: 3, + HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, + hostRole: models.HostRoleWorker, + hostMem: 8*conversions.GiB + float32(lvmMemMB), }, { - name: "full version 4.15, Worker, insufficient Disk", - ocpVersion: "4.15.0", - hosts: []*models.Host{masterNode, masterNode, masterNode, workerNode, workerNode}, - resultMessage: []string{"Logical Volume Manager requires at least one non-installation HDD/SSD disk on the host"}, - apiStatus: api.Failure, - diskCount: 1, - hostCPU: 3, - HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, - hostRole: models.HostRoleWorker, - hostMem: 8*conversions.GiB + float32(lvmMemMB), - additionalDiskRequirementGB: int64(0), + name: "full version 4.15, Worker HostRoleAutoAssign", + ocpVersion: "4.15.0", + hosts: []*models.Host{masterNode, masterNode, masterNode, workerNode, workerNode}, + resultMessage: []string{"For Logical Volume Manager Standard Mode, host role must be assigned to master or worker."}, + apiStatus: api.Failure, + diskCount: 2, + hostCPU: 3, + HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, + hostRole: models.HostRoleAutoAssign, + hostMem: 8*conversions.GiB + float32(lvmMemMB), }, { - name: "full version 4.15, Worker, insufficient Disk size", - ocpVersion: "4.15.0", - hosts: []*models.Host{masterNode, masterNode, masterNode, workerNode, workerNode}, - resultMessage: []string{"Logical Volume Manager requires at least one non-installation HDD/SSD disk of 50GB minimum on the host"}, - apiStatus: api.Failure, - diskCount: 1, - hostCPU: 3, - HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, - hostRole: models.HostRoleWorker, - hostMem: 8*conversions.GiB + float32(lvmMemMB), - additionalDiskRequirementGB: int64(50), + name: "full version 4.15, Worker, insufficient Disk", + ocpVersion: "4.15.0", + hosts: []*models.Host{masterNode, masterNode, masterNode, workerNode, workerNode}, + resultMessage: []string{"Logical Volume Manager requires at least one non-installation HDD/SSD disk on the host"}, + apiStatus: api.Failure, + diskCount: 1, + hostCPU: 3, + HighAvailabilityMode: models.ClusterHighAvailabilityModeFull, + hostRole: models.HostRoleWorker, + hostMem: 8*conversions.GiB + float32(lvmMemMB), }, } @@ -539,8 +515,7 @@ var _ = Describe("Lvm Operator", func() { SchedulableMastersForcedTrue: &schedulableMasters, }} - operator.SetAdditionalDiskRequirements(test.additionalDiskRequirementGB) - res, _ := operator.ValidateHost(ctx, cluster, testHost) + res, _ := operator.ValidateHost(ctx, cluster, testHost, nil) Expect(test.resultMessage).Should(Equal(res.Reasons)) Expect(test.apiStatus).Should(Equal(res.Status)) diff --git a/internal/operators/manager.go b/internal/operators/manager.go index eaba57795613..0c4e392761d6 100644 --- a/internal/operators/manager.go +++ b/internal/operators/manager.go @@ -29,6 +29,8 @@ import ( const controllerManifestFile = "custom_manifests.json" +var storageOperatorsPriority = []string{odf.Operator.Name, lvm.Operator.Name} + // Manifest store the operator manifest used by assisted-installer to create CRs of the OLM. type Manifest struct { // Name of the operator the CR manifest we want create @@ -124,8 +126,7 @@ func (mgr *Manager) GetRequirementsBreakdownForHostInCluster(ctx context.Context } func (mgr *Manager) getStorageOperator(cluster *models.Cluster) (api.StorageOperator, error) { - priorityOrder := []string{odf.Operator.Name, lvm.Operator.Name} - for _, operatorName := range priorityOrder { + for _, operatorName := range storageOperatorsPriority { for _, operator := range cluster.MonitoredOperators { if operator.Name == operatorName { o := mgr.olmOperators[operatorName] @@ -241,13 +242,10 @@ func (mgr *Manager) AnyOLMOperatorEnabled(cluster *common.Cluster) bool { // ValidateHost validates host requirements func (mgr *Manager) ValidateHost(ctx context.Context, cluster *common.Cluster, host *models.Host) ([]api.ValidationResult, error) { results := make([]api.ValidationResult, 0, len(mgr.olmOperators)) + additionalOperatorRequirements := &models.ClusterHostRequirementsDetails{} if hasMCEAndStorage(cluster.Cluster.MonitoredOperators) { - storageOperator, err := mgr.getStorageOperator(&cluster.Cluster) - if err != nil { - mgr.log.Infof("Could not load storage operator while validating host (%v)", err.Error()) - } - storageOperator.SetAdditionalDiskRequirements(mce.GetMinDiskSizeGB(&cluster.Cluster)) + additionalOperatorRequirements.DiskSizeGb = mce.GetMinDiskSizeGB(&cluster.Cluster) } // To track operators that are disabled or not present in the cluster configuration, but have to be present @@ -264,7 +262,7 @@ func (mgr *Manager) ValidateHost(ctx context.Context, cluster *common.Cluster, h operator := mgr.olmOperators[clusterOperator.Name] if operator != nil { - result, err := operator.ValidateHost(ctx, cluster, host) + result, err := operator.ValidateHost(ctx, cluster, host, additionalOperatorRequirements) if err != nil { return nil, err } diff --git a/internal/operators/manager_test.go b/internal/operators/manager_test.go index 846c8665f773..839b6364775d 100644 --- a/internal/operators/manager_test.go +++ b/internal/operators/manager_test.go @@ -106,14 +106,7 @@ var _ = BeforeEach(func() { }, } cluster.ImageInfo = &models.ImageInfo{} - b, err := common.MarshalInventory(&models.Inventory{ - CPU: &models.CPU{Count: 8}, - Memory: &models.Memory{UsableBytes: 64 * conversions.GiB}, - Disks: []*models.Disk{ - {SizeBytes: 20 * conversions.GB, DriveType: models.DriveTypeHDD, ID: common.TestDiskId}, - {SizeBytes: 40 * conversions.GB, DriveType: models.DriveTypeSSD}}}) - Expect(err).To(Not(HaveOccurred())) - clusterHost = &models.Host{Inventory: b, Role: models.HostRoleMaster, InstallationDiskID: common.TestDiskId} + clusterHost = getMockHostWithDisks(int64(20), int64(40)) ctrl = gomock.NewController(GinkgoT()) manifestsAPI = manifestsapi.NewMockManifestsAPI(ctrl) @@ -489,6 +482,83 @@ var _ = Describe("Operators manager", func() { api.ValidationResult{Status: api.Success, ValidationId: string(models.ClusterValidationIDMceRequirementsSatisfied), Reasons: []string{"mce is disabled"}}, )) }) + + It("should be not valid if not enough disk space available for mce and odf", func() { + clusterHost = getMockHostWithDisks(int64(20), int64(20)) + + cluster.MonitoredOperators = []*models.MonitoredOperator{ + &odf.Operator, + &mce.Operator, + } + + results, err := manager.ValidateHost(context.TODO(), cluster, clusterHost) + + Expect(err).NotTo(HaveOccurred()) + Expect(results).To(ContainElements( + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDLsoRequirementsSatisfied), Reasons: []string{"lso is disabled"}}, + api.ValidationResult{Status: api.Failure, ValidationId: string(models.HostValidationIDOdfRequirementsSatisfied), Reasons: []string{"Insufficient resources to deploy ODF in compact mode. ODF requires a minimum of 3 hosts. Each host must have at least 1 additional disk of 75 GB minimum and an installation disk."}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.ClusterValidationIDMceRequirementsSatisfied), Reasons: nil}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDCnvRequirementsSatisfied), Reasons: []string{"cnv is disabled"}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDLvmRequirementsSatisfied), Reasons: []string{"lvm is disabled"}}, + )) + }) + + It("should be valid if enough disk space available for mce and odf", func() { + clusterHost = getMockHostWithDisks(int64(20), int64(80)) + + cluster.MonitoredOperators = []*models.MonitoredOperator{ + &odf.Operator, + &mce.Operator, + } + + results, err := manager.ValidateHost(context.TODO(), cluster, clusterHost) + + Expect(err).NotTo(HaveOccurred()) + Expect(results).To(ContainElements( + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDLsoRequirementsSatisfied), Reasons: []string{"lso is disabled"}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDOdfRequirementsSatisfied), Reasons: []string{}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.ClusterValidationIDMceRequirementsSatisfied), Reasons: nil}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDCnvRequirementsSatisfied), Reasons: []string{"cnv is disabled"}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDLvmRequirementsSatisfied), Reasons: []string{"lvm is disabled"}}, + )) + }) + + It("should be valid if enough disk space available for mce and odf and then only odf", func() { + clusterHost = getMockHostWithDisks(int64(20), int64(80)) + + cluster.MonitoredOperators = []*models.MonitoredOperator{ + &odf.Operator, + &mce.Operator, + } + + results, err := manager.ValidateHost(context.TODO(), cluster, clusterHost) + + Expect(err).NotTo(HaveOccurred()) + Expect(results).To(ContainElements( + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDLsoRequirementsSatisfied), Reasons: []string{"lso is disabled"}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDOdfRequirementsSatisfied), Reasons: []string{}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.ClusterValidationIDMceRequirementsSatisfied), Reasons: nil}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDCnvRequirementsSatisfied), Reasons: []string{"cnv is disabled"}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDLvmRequirementsSatisfied), Reasons: []string{"lvm is disabled"}}, + )) + + clusterHost = getMockHostWithDisks(int64(20), int64(30)) + + cluster.MonitoredOperators = []*models.MonitoredOperator{ + &odf.Operator, + } + + results, err = manager.ValidateHost(context.TODO(), cluster, clusterHost) + + Expect(err).NotTo(HaveOccurred()) + Expect(results).To(ContainElements( + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDLsoRequirementsSatisfied), Reasons: []string{"lso is disabled"}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDOdfRequirementsSatisfied), Reasons: []string{}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.ClusterValidationIDMceRequirementsSatisfied), Reasons: []string{"mce is disabled"}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDCnvRequirementsSatisfied), Reasons: []string{"cnv is disabled"}}, + api.ValidationResult{Status: api.Success, ValidationId: string(models.HostValidationIDLvmRequirementsSatisfied), Reasons: []string{"lvm is disabled"}}, + )) + }) }) Context("ResolveDependencies", func() { @@ -641,3 +711,14 @@ func mockOperatorBase(operatorName string) *api.MockOperator { return operator1 } + +func getMockHostWithDisks(sizeDiskA, sizeDiskB int64) *models.Host { + b, err := common.MarshalInventory(&models.Inventory{ + CPU: &models.CPU{Count: 8}, + Memory: &models.Memory{UsableBytes: 64 * conversions.GiB}, + Disks: []*models.Disk{ + {SizeBytes: sizeDiskA * conversions.GB, DriveType: models.DriveTypeHDD, ID: common.TestDiskId}, + {SizeBytes: sizeDiskB * conversions.GB, DriveType: models.DriveTypeSSD}}}) + Expect(err).To(Not(HaveOccurred())) + return &models.Host{Inventory: b, Role: models.HostRoleMaster, InstallationDiskID: common.TestDiskId} +} diff --git a/internal/operators/mce/mce_operator.go b/internal/operators/mce/mce_operator.go index df3198a7afab..1eb826e9d54c 100644 --- a/internal/operators/mce/mce_operator.go +++ b/internal/operators/mce/mce_operator.go @@ -97,7 +97,7 @@ func (o *operator) ValidateCluster(_ context.Context, cluster *common.Cluster) ( } // ValidateHost returns validationResult based on node type requirements such as memory and cpu -func (o *operator) ValidateHost(ctx context.Context, cluster *common.Cluster, host *models.Host) (result api.ValidationResult, err error) { +func (o *operator) ValidateHost(ctx context.Context, cluster *common.Cluster, host *models.Host, _ *models.ClusterHostRequirementsDetails) (result api.ValidationResult, err error) { if host.Inventory == "" { message := "Missing Inventory in the host" return api.ValidationResult{Status: api.Pending, ValidationId: o.GetHostValidationID(), Reasons: []string{message}}, nil diff --git a/internal/operators/mce/mce_operator_test.go b/internal/operators/mce/mce_operator_test.go index 243b80a5efa6..3419762379fa 100644 --- a/internal/operators/mce/mce_operator_test.go +++ b/internal/operators/mce/mce_operator_test.go @@ -56,7 +56,7 @@ var _ = Describe("MCE Operator", func() { Context("ValidateHost", func() { table.DescribeTable("validate host when ", func(cluster *common.Cluster, host *models.Host, expectedResult api.ValidationResult) { - res, _ := operator.ValidateHost(ctx, cluster, host) + res, _ := operator.ValidateHost(ctx, cluster, host, nil) Expect(res).Should(Equal(expectedResult)) }, table.Entry("host with no inventory", diff --git a/internal/operators/odf/odf_operator.go b/internal/operators/odf/odf_operator.go index a00a21607f63..f554279350f4 100644 --- a/internal/operators/odf/odf_operator.go +++ b/internal/operators/odf/odf_operator.go @@ -35,10 +35,9 @@ func NewOcsOperator(log logrus.FieldLogger) *operator { // operator is an ODF OLM operator plugin; it implements api.Operator type operator struct { - log logrus.FieldLogger - config *Config - extracter oc.Extracter - additionalDiskRequirementGB int64 + log logrus.FieldLogger + config *Config + extracter oc.Extracter } var Operator = models.MonitoredOperator{ @@ -110,29 +109,29 @@ func (o *operator) StorageClassName() string { return defaultStorageClassName } -func (o *operator) SetAdditionalDiskRequirements(additionalSizeGB int64) { - o.additionalDiskRequirementGB = additionalSizeGB -} - -func (o *operator) getMinDiskSizeGB() int64 { - return o.config.ODFMinDiskSizeGB + o.additionalDiskRequirementGB +func (o *operator) getMinDiskSizeGB(additionalDiskRequirementsGb int64) int64 { + return o.config.ODFMinDiskSizeGB + additionalDiskRequirementsGb } // Get valid disk count, and return error if no disk available -func (o *operator) getValidDiskCount(disks []*models.Disk, installationDiskID string, cluster *models.Cluster) (int64, error) { +func (o *operator) getValidDiskCount(disks []*models.Disk, installationDiskID string, cluster *models.Cluster, additionalOperatorRequirements *models.ClusterHostRequirementsDetails) (int64, error) { numOfHosts := len(cluster.Hosts) mode := getODFDeploymentMode(numOfHosts) - eligibleDisks, availableDisks := operatorscommon.NonInstallationDiskCount(disks, installationDiskID, o.getMinDiskSizeGB()) + minDiskSizeGb := int64(0) + if additionalOperatorRequirements != nil { + minDiskSizeGb = additionalOperatorRequirements.DiskSizeGb + } + eligibleDisks, availableDisks := operatorscommon.NonInstallationDiskCount(disks, installationDiskID, o.getMinDiskSizeGB(minDiskSizeGb)) var err error if eligibleDisks == 0 && availableDisks > 0 { - err = fmt.Errorf("Insufficient resources to deploy ODF in %s mode. ODF requires a minimum of 3 hosts. Each host must have at least 1 additional disk of %d GB minimum and an installation disk.", strings.ToLower(string(mode)), o.getMinDiskSizeGB()) + err = fmt.Errorf("Insufficient resources to deploy ODF in %s mode. ODF requires a minimum of 3 hosts. Each host must have at least 1 additional disk of %d GB minimum and an installation disk.", strings.ToLower(string(mode)), o.getMinDiskSizeGB(minDiskSizeGb)) } return eligibleDisks, err } // ValidateHost verifies whether this operator is valid for given host -func (o *operator) ValidateHost(_ context.Context, cluster *common.Cluster, host *models.Host) (api.ValidationResult, error) { +func (o *operator) ValidateHost(_ context.Context, cluster *common.Cluster, host *models.Host, additionalOperatorRequirements *models.ClusterHostRequirementsDetails) (api.ValidationResult, error) { numOfHosts := len(cluster.Hosts) if host.Inventory == "" { return api.ValidationResult{Status: api.Pending, ValidationId: o.GetHostValidationID(), Reasons: []string{"Missing Inventory in the host."}}, nil @@ -146,7 +145,7 @@ func (o *operator) ValidateHost(_ context.Context, cluster *common.Cluster, host mode := getODFDeploymentMode(numOfHosts) // getValidDiskCount counts the total number of valid disks in each host and return a error if we don't have the disk of required size - diskCount, err := o.getValidDiskCount(inventory.Disks, host.InstallationDiskID, &cluster.Cluster) + diskCount, err := o.getValidDiskCount(inventory.Disks, host.InstallationDiskID, &cluster.Cluster, additionalOperatorRequirements) if err != nil { return api.ValidationResult{Status: api.Failure, ValidationId: o.GetHostValidationID(), Reasons: []string{err.Error()}}, nil } @@ -208,7 +207,7 @@ func (o *operator) GetHostRequirements(_ context.Context, cluster *common.Cluste /* getValidDiskCount counts the total number of valid disks in each host and return a error if we don't have the disk of required size, we ignore the error as its treated as 500 in the UI */ - diskCount, _ = o.getValidDiskCount(inventory.Disks, host.InstallationDiskID, &cluster.Cluster) + diskCount, _ = o.getValidDiskCount(inventory.Disks, host.InstallationDiskID, &cluster.Cluster, nil) } role := common.GetEffectiveRole(host) diff --git a/internal/operators/odf/odf_operator_test.go b/internal/operators/odf/odf_operator_test.go index 23076f2c2b7f..306f637236c1 100644 --- a/internal/operators/odf/odf_operator_test.go +++ b/internal/operators/odf/odf_operator_test.go @@ -221,7 +221,7 @@ var _ = Describe("Odf Operator", func() { Context("ValidateHost", func() { table.DescribeTable("compact mode scenario: validateHost when ", func(cluster *common.Cluster, host *models.Host, expectedResult api.ValidationResult) { - res, _ := operator.ValidateHost(ctx, cluster, host) + res, _ := operator.ValidateHost(ctx, cluster, host, nil) Expect(res).Should(Equal(expectedResult)) }, table.Entry("Single master", @@ -297,7 +297,7 @@ var _ = Describe("Odf Operator", func() { ) table.DescribeTable("standard mode scenario: validateHosts when ", func(cluster *common.Cluster, host *models.Host, expectedResult api.ValidationResult) { - res, _ := operator.ValidateHost(ctx, cluster, host) + res, _ := operator.ValidateHost(ctx, cluster, host, nil) Expect(res).Should(Equal(expectedResult)) }, table.Entry("there are 4 hosts, role of one as auto-assign", diff --git a/internal/operators/odf/validations.go b/internal/operators/odf/validations.go index 4c6e3d2f0f63..634a37bc9efe 100644 --- a/internal/operators/odf/validations.go +++ b/internal/operators/odf/validations.go @@ -116,7 +116,7 @@ func (o *operator) computeNodeResourceUtil(cluster *models.Cluster, host *models return status, err } - diskCount, err := o.getValidDiskCount(inventory.Disks, host.InstallationDiskID, cluster) + diskCount, err := o.getValidDiskCount(inventory.Disks, host.InstallationDiskID, cluster, nil) if err != nil { return err.Error(), err } From c8673843d0b36b9284a6a3917f1b790166c7c722 Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Tue, 9 Apr 2024 17:23:22 +0200 Subject: [PATCH 06/25] MGMT-17412: Change fallbck behavior when error occuring in OpenShift Release Syncer - if there are release images already in the DB, continue using the stale data instead of failing / truncating the table (#6166) Co-authored-by: danmanor --- cmd/main.go | 123 ++---------------- internal/releasesources/release_sources.go | 67 +++++++++- .../releasesources/release_sources_test.go | 62 ++++----- internal/versions/common.go | 80 ++++++++++++ 4 files changed, 187 insertions(+), 145 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 1293dfdd309a..ce13f5426ad2 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -76,7 +76,6 @@ import ( "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/sirupsen/logrus" - "github.com/thoas/go-funk" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" @@ -261,7 +260,7 @@ func main() { failOnError(err, "Failed to initialize OSImages") var releaseImagesArray = models.ReleaseImages{} - parseReleaseImages(&releaseImagesArray, failOnError) + versions.ParseReleaseImages(&releaseImagesArray, Options.ReleaseImages, failOnError) var releaseSourcesArray = models.ReleaseSources{} if Options.ReleaseSourcesConfig.ReleaseSources != "" { @@ -270,7 +269,7 @@ func main() { } var ignoredOpenshiftVersions = []string{} - parseIgnoredOpenshiftVersions(&ignoredOpenshiftVersions, failOnError) + versions.ParseIgnoredOpenshiftVersions(&ignoredOpenshiftVersions, Options.IgnoredOpenshiftVersions, failOnError) log.Println(fmt.Sprintf("Started service with OS Images %v, Release Images %v, Release Sources %v, Ignored OpenShift Versions %v", Options.OsImages, Options.ReleaseImages, Options.ReleaseSourcesConfig.ReleaseSources, Options.IgnoredOpenshiftVersions)) @@ -443,9 +442,16 @@ func main() { hostStateMonitor.Start() defer hostStateMonitor.Stop() - failOnError(addReleaseImagesToDBIfNeeded(db, releaseImagesArray, startupLeader, log), "error occured while adding configuration release images to the DB if needed") - openshiftReleaseSyncer := runOpenshiftReleaseSyncerIfNeeded(releaseSourcesArray, releaseImagesArray, db, log, releaseHandler, lead, startupLeader, failOnError) - defer stopOpenshiftReleaseSyncerIfNeeded(openshiftReleaseSyncer) + failOnError( + versions.AddReleaseImagesToDBIfNeeded(db, releaseImagesArray, startupLeader, log, Options.EnableKubeAPI, Options.ReleaseSourcesConfig.ReleaseSources), + "error occured while adding configuration release images to the DB if needed", + ) + openshiftReleaseSyncer, err := releasesources.RunOpenshiftReleaseSyncerIfNeeded( + releaseSourcesArray, releaseImagesArray, db, log, releaseHandler, lead, startupLeader, Options.EnableKubeAPI, Options.ReleaseSourcesConfig, + ) + + failOnError(err, "error occured while running OpenShift Release Syncer if needed") + defer releasesources.StopOpenshiftReleaseSyncerIfNeeded(openshiftReleaseSyncer) newUrl, err := s3wrapper.FixEndpointURL(Options.BMConfig.S3EndpointURL) failOnError(err, "failed to create valid bm config S3 endpoint URL from %s", Options.BMConfig.S3EndpointURL) @@ -945,108 +951,3 @@ func startPPROF(log *logrus.Logger) { } } } - -func runOpenshiftReleaseSyncerIfNeeded( - releaseSources models.ReleaseSources, - releaseImages models.ReleaseImages, - db *gorm.DB, - log logrus.FieldLogger, - releaseHandler oc.Release, - leader, - startupLeader leader.ElectorInterface, - failOnError func(err error, msg string, args ...interface{}), -) *thread.Thread { - if !Options.EnableKubeAPI && Options.ReleaseSourcesConfig.ReleaseSources != "" { - releaseSourcesHandler, err := releasesources.NewReleaseSourcesHandler( - releaseSources, releaseImages, log, db, Options.ReleaseSourcesConfig, leader, - ) - if err != nil { - failOnError(err, "error occurred while creating release sources handler") - } - - failOnError(startupLeader.RunWithLeader(context.Background(), func() error { - log.WithField("pkg", "releasesources").Info("Running Openshift Releases Syncer at startup") - return releaseSourcesHandler.SyncReleaseImages() - }), "error occurred while running Openshift Releases Syncer at startup") - - openShiftReleaseSyncer := thread.New( - log.WithField("pkg", "releasesources"), "Openshift Releases Syncer", Options.ReleaseSourcesConfig.OpenShiftReleaseSyncerInterval, releaseSourcesHandler.SyncReleaseImagesThreadFunc) - openShiftReleaseSyncer.Start() - return openShiftReleaseSyncer - } - - return nil -} - -func stopOpenshiftReleaseSyncerIfNeeded(openShiftReleaseSyncer *thread.Thread) { - if openShiftReleaseSyncer != nil { - openShiftReleaseSyncer.Stop() - } -} - -func addReleaseImagesToDBIfNeeded( - db *gorm.DB, - releaseImages models.ReleaseImages, - lead leader.ElectorInterface, - log logrus.FieldLogger, -) error { - // If it is kubeAPI mode or release sources was specified (therefore OpenShift Release Syncer will run), - // we should not add the release images to the DB. - if Options.EnableKubeAPI || Options.ReleaseSourcesConfig.ReleaseSources != "" { - return nil - } - - return lead.RunWithLeader(context.Background(), func() error { - tx := db.Begin() - - var count int64 - if err := tx.Model(&models.ReleaseImage{}).Count(&count).Error; err != nil { - return errors.Wrapf(err, "error occurred while trying to count the initial amount of release images in the DB") - } - - log.Debugf("Truncating all release_images table. '%d' records", count) - if err := tx.Exec("TRUNCATE TABLE release_images").Error; err != nil { - tx.Rollback() - return errors.Wrapf(err, "error occurred while trying to delete the release images in the DB") - } - - if len(releaseImages) > 0 { - log.Debugf("Inserting configuration release images to the DB. '%d' records", len(releaseImages)) - if err := tx.Create(releaseImages).Error; err != nil { - tx.Rollback() - return errors.Wrapf(err, "error occurred while trying to insert the release images to the DB") - } - } - - if err := tx.Commit().Error; err != nil { - tx.Rollback() - return errors.Wrapf(err, "error occurred while commiting changes to the DB") - } - - return nil - }) -} - -func parseIgnoredOpenshiftVersions(ignoredOpenshiftVersions *[]string, failOnError func(err error, msg string, args ...interface{})) { - if Options.IgnoredOpenshiftVersions != "" { - failOnError(json.Unmarshal([]byte(Options.IgnoredOpenshiftVersions), ignoredOpenshiftVersions), - "Failed to parse IGNORED_OPENSHIFT_VERSIONS json %s", Options.IgnoredOpenshiftVersions) - } -} - -func parseReleaseImages(releaseImages *models.ReleaseImages, failOnError func(err error, msg string, args ...interface{})) { - if Options.ReleaseImages == "" { - // ReleaseImages is optional (not used by the operator) - return - } else { - failOnError(json.Unmarshal([]byte(Options.ReleaseImages), releaseImages), - "Failed to parse RELEASE_IMAGES json %s", Options.ReleaseImages) - } - - // For backward compatibility with release images that lack the CPUArchitectures field. - funk.ForEach(*releaseImages, func(releaseImage *models.ReleaseImage) { - if releaseImage.CPUArchitectures == nil { - releaseImage.CPUArchitectures = []string{*releaseImage.CPUArchitecture} - } - }) -} diff --git a/internal/releasesources/release_sources.go b/internal/releasesources/release_sources.go index 2ca7ed5bb930..b2b45b1ac9bb 100644 --- a/internal/releasesources/release_sources.go +++ b/internal/releasesources/release_sources.go @@ -1,6 +1,8 @@ package releasesources import ( + "context" + errorspackage "errors" "fmt" "net/url" @@ -8,8 +10,10 @@ import ( "github.com/go-openapi/swag" goversion "github.com/hashicorp/go-version" "github.com/openshift/assisted-service/internal/common" + "github.com/openshift/assisted-service/internal/oc" "github.com/openshift/assisted-service/models" "github.com/openshift/assisted-service/pkg/leader" + "github.com/openshift/assisted-service/pkg/thread" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/thoas/go-funk" @@ -35,7 +39,7 @@ type enrichedReleaseImage struct { channel models.ReleaseChannel } -func NewReleaseSourcesHandler( +func newReleaseSourcesHandler( releaseSources models.ReleaseSources, releaseImages models.ReleaseImages, logger logrus.FieldLogger, @@ -199,8 +203,7 @@ func (h *releaseSourcesHandler) getDynamicReleaseImages() ([]*enrichedReleaseIma graph, err := h.releasesClient.getReleases(channel, openshiftVersion, cpuArchitecture) if err != nil { - h.log.WithError(err).Warnf("failed to get releases from api with: %s-%s, %s", channel, openshiftVersion, cpuArchitecture) - continue + return nil, errors.Wrapf(err, "failed to get releases from api with: %s-%s, %s", channel, openshiftVersion, cpuArchitecture) } if shouldSwitch { @@ -503,3 +506,61 @@ func getReleaseImageReference(version, cpuArchitecture string) string { } return fmt.Sprintf(releaseImageReferenceTemplateSaaS, version, cpuArchitecture) } + +func RunOpenshiftReleaseSyncerIfNeeded( + releaseSources models.ReleaseSources, + releaseImages models.ReleaseImages, + db *gorm.DB, + log logrus.FieldLogger, + releaseHandler oc.Release, + leader, + startupLeader leader.ElectorInterface, + enableKubeAPI bool, + releaseSourcesConfig Config, +) (*thread.Thread, error) { + if !enableKubeAPI && releaseSourcesConfig.ReleaseSources != "" { + releaseSourcesHandler, err := newReleaseSourcesHandler( + releaseSources, releaseImages, log, db, releaseSourcesConfig, leader, + ) + if err != nil { + return nil, errors.Wrap(err, "error occurred while creating release sources handler") + } + + err = startupLeader.RunWithLeader(context.Background(), func() error { + log.WithField("pkg", "releasesources").Info("Running Openshift Releases Syncer at startup") + if syncErr := releaseSourcesHandler.SyncReleaseImages(); syncErr != nil { + // if it failed at startup but the table contains data, we want to contine with stale data + var count int64 + if dbErr := db.Model(&models.ReleaseImage{}).Count(&count).Error; err != nil { + return errorspackage.Join(err, dbErr) + } + + // empty table + if count == 0 { + return syncErr + } + + log.WithError(err).Warn("Error occurred while running OpenShift Release Syncer at startup, proceeding with stale data") + } + + return nil + }) + + if err != nil { + return nil, errors.Wrap(err, "error occurred while running Openshift Releases Syncer at startup") + } + + openShiftReleaseSyncer := thread.New( + log.WithField("pkg", "releasesources"), "Openshift Releases Syncer", releaseSourcesConfig.OpenShiftReleaseSyncerInterval, releaseSourcesHandler.SyncReleaseImagesThreadFunc) + openShiftReleaseSyncer.Start() + return openShiftReleaseSyncer, nil + } + + return nil, nil +} + +func StopOpenshiftReleaseSyncerIfNeeded(openShiftReleaseSyncer *thread.Thread) { + if openShiftReleaseSyncer != nil { + openShiftReleaseSyncer.Stop() + } +} diff --git a/internal/releasesources/release_sources_test.go b/internal/releasesources/release_sources_test.go index 8adcfdeb4a32..ba3e8ead7648 100644 --- a/internal/releasesources/release_sources_test.go +++ b/internal/releasesources/release_sources_test.go @@ -183,7 +183,7 @@ var _ = Describe("SyncReleaseImages", func() { // Testing ReleaseSources with standard ReleaseImages It("Should not cause an error with empty release sources", func() { - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( models.ReleaseSources{}, staticReleaseImages, common.GetTestLog(), @@ -217,7 +217,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, staticReleaseImages, common.GetTestLog(), @@ -242,7 +242,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, staticReleaseImages, common.GetTestLog(), @@ -267,7 +267,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, staticReleaseImages, common.GetTestLog(), @@ -292,7 +292,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, staticReleaseImages, common.GetTestLog(), @@ -317,7 +317,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, staticReleaseImages, common.GetTestLog(), @@ -346,7 +346,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, staticReleaseImages, common.GetTestLog(), @@ -378,7 +378,7 @@ var _ = Describe("SyncReleaseImages", func() { }, }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, staticReleaseImages, common.GetTestLog(), @@ -402,7 +402,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, staticReleaseImages, common.GetTestLog(), @@ -421,7 +421,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, staticReleaseImages, common.GetTestLog(), @@ -444,7 +444,7 @@ var _ = Describe("SyncReleaseImages", func() { }, }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, staticReleaseImages, common.GetTestLog(), @@ -468,7 +468,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, staticReleaseImages, common.GetTestLog(), @@ -482,7 +482,7 @@ var _ = Describe("SyncReleaseImages", func() { // Testing ReleaseImages with standard ReleaseSources It("Should not cause an error with empty ReleaseImages", func() { - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( defaultReleaseSources, models.ReleaseImages{}, common.GetTestLog(), @@ -503,7 +503,7 @@ var _ = Describe("SyncReleaseImages", func() { }) It("Should not cause an error with nil ReleaseImages", func() { - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( defaultReleaseSources, nil, common.GetTestLog(), @@ -533,7 +533,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( defaultReleaseSources, releaseImages, common.GetTestLog(), @@ -561,7 +561,7 @@ var _ = Describe("SyncReleaseImages", func() { URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.11.1-x86_64"), }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( defaultReleaseSources, releaseImages, common.GetTestLog(), @@ -579,7 +579,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( defaultReleaseSources, releaseImages, common.GetTestLog(), @@ -597,7 +597,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( defaultReleaseSources, releaseImages, common.GetTestLog(), @@ -615,7 +615,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( defaultReleaseSources, releaseImages, common.GetTestLog(), @@ -636,7 +636,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( defaultReleaseSources, releaseImages, common.GetTestLog(), @@ -666,7 +666,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( defaultReleaseSources, releaseImages, common.GetTestLog(), @@ -692,7 +692,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, releaseImages, common.GetTestLog(), @@ -758,7 +758,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, releaseImages, common.GetTestLog(), @@ -856,7 +856,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, releaseImages, common.GetTestLog(), @@ -954,7 +954,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, releaseImages, common.GetTestLog(), @@ -1064,7 +1064,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( models.ReleaseSources{}, releaseImages, common.GetTestLog(), @@ -1181,7 +1181,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, models.ReleaseImages{}, common.GetTestLog(), @@ -1311,7 +1311,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, models.ReleaseImages{}, common.GetTestLog(), @@ -1463,7 +1463,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, releaseImages, common.GetTestLog(), @@ -1542,7 +1542,7 @@ var _ = Describe("SyncReleaseImages", func() { }, } - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( releaseSources, releaseImages, common.GetTestLog(), @@ -1577,7 +1577,7 @@ var _ = Describe("SyncReleaseImages", func() { }) It("Should be successfull with valid static and dynamic release images extended scenario", func() { - handler, err = NewReleaseSourcesHandler( + handler, err = newReleaseSourcesHandler( defaultReleaseSources, staticReleaseImages, common.GetTestLog(), diff --git a/internal/versions/common.go b/internal/versions/common.go index db8f095e4fca..49ee013c1007 100644 --- a/internal/versions/common.go +++ b/internal/versions/common.go @@ -2,14 +2,17 @@ package versions import ( context "context" + "encoding/json" "fmt" "sync" "github.com/openshift/assisted-service/internal/common" "github.com/openshift/assisted-service/internal/oc" models "github.com/openshift/assisted-service/models" + "github.com/openshift/assisted-service/pkg/leader" "github.com/pkg/errors" "github.com/sirupsen/logrus" + "github.com/thoas/go-funk" "golang.org/x/sync/semaphore" "gorm.io/gorm" "sigs.k8s.io/controller-runtime/pkg/client" @@ -155,3 +158,80 @@ func validateReleaseImageForRHCOS( return errors.Errorf("The requested RHCOS version (%s, arch: %s) does not have a matching OpenShift release image", *rhcosVersionPtr, cpuArchitecture) } + +func AddReleaseImagesToDBIfNeeded( + db *gorm.DB, + releaseImages models.ReleaseImages, + lead leader.ElectorInterface, + log logrus.FieldLogger, + enableKubeAPI bool, + releaseSourcesLiteral string, +) error { + // If it is kubeAPI mode or release sources was specified (therefore OpenShift Release Syncer will run), + // we should not add the release images to the DB. + if enableKubeAPI || releaseSourcesLiteral != "" { + return nil + } + + return lead.RunWithLeader(context.Background(), func() error { + tx := db.Begin() + + var count int64 + if err := tx.Model(&models.ReleaseImage{}).Count(&count).Error; err != nil { + return errors.Wrapf(err, "error occurred while trying to count the initial amount of release images in the DB") + } + + log.Debugf("Truncating all release_images table. '%d' records", count) + if err := tx.Exec("TRUNCATE TABLE release_images").Error; err != nil { + tx.Rollback() + return errors.Wrapf(err, "error occurred while trying to delete the release images in the DB") + } + + if len(releaseImages) > 0 { + log.Debugf("Inserting configuration release images to the DB. '%d' records", len(releaseImages)) + if err := tx.Create(releaseImages).Error; err != nil { + tx.Rollback() + return errors.Wrapf(err, "error occurred while trying to insert the release images to the DB") + } + } + + if err := tx.Commit().Error; err != nil { + tx.Rollback() + return errors.Wrapf(err, "error occurred while commiting changes to the DB") + } + + return nil + }) +} + +func ParseIgnoredOpenshiftVersions( + ignoredOpenshiftVersions *[]string, + ignoredOpenshiftVersionsLiteral string, + failOnError func(err error, msg string, args ...interface{}), +) { + if ignoredOpenshiftVersionsLiteral != "" { + failOnError(json.Unmarshal([]byte(ignoredOpenshiftVersionsLiteral), ignoredOpenshiftVersions), + "Failed to parse IGNORED_OPENSHIFT_VERSIONS json %s", ignoredOpenshiftVersionsLiteral) + } +} + +func ParseReleaseImages( + releaseImages *models.ReleaseImages, + releaseImagesLiteral string, + failOnError func(err error, msg string, args ...interface{}), +) { + if releaseImagesLiteral == "" { + // ReleaseImages is optional (not used by the operator) + return + } else { + failOnError(json.Unmarshal([]byte(releaseImagesLiteral), releaseImages), + "Failed to parse RELEASE_IMAGES json %s", releaseImagesLiteral) + } + + // For backward compatibility with release images that lack the CPUArchitectures field. + funk.ForEach(*releaseImages, func(releaseImage *models.ReleaseImage) { + if releaseImage.CPUArchitectures == nil { + releaseImage.CPUArchitectures = []string{*releaseImage.CPUArchitecture} + } + }) +} From 10edcb990abed79eba47986ff01afc8698c9ca37 Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Thu, 18 Apr 2024 09:24:01 +0200 Subject: [PATCH 07/25] MGMT-17468: Use x86_64 over amd64 and arm64 over aarch64 for CPU architecture of both release and OS images to comply with ABI current behavior (#6204) Co-authored-by: danmanor --- internal/versions/common.go | 48 +++++++++++-- internal/versions/common_test.go | 36 ++++++++++ internal/versions/kube_api_versions.go | 34 +--------- internal/versions/kube_api_versions_test.go | 6 ++ internal/versions/osimages.go | 68 ++++++++++--------- internal/versions/osimages_test.go | 75 +++++++++++++++++++++ internal/versions/rest_api_versions.go | 1 + internal/versions/rest_api_versions_test.go | 21 ++++++ 8 files changed, 220 insertions(+), 69 deletions(-) diff --git a/internal/versions/common.go b/internal/versions/common.go index 49ee013c1007..bfa3e1725a08 100644 --- a/internal/versions/common.go +++ b/internal/versions/common.go @@ -6,6 +6,8 @@ import ( "fmt" "sync" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" "github.com/openshift/assisted-service/internal/common" "github.com/openshift/assisted-service/internal/oc" models "github.com/openshift/assisted-service/models" @@ -41,6 +43,14 @@ func NewHandler( enableKubeAPI bool, releaseSources models.ReleaseSources, ) (Handler, error) { + for _, releaseImage := range releaseImages { + if err := validateReleaseImage(releaseImage); err != nil { + return nil, errors.Wrap(err, "error occurred while validating release images") + } + + normalizeReleaseImageCPUArchitecture(releaseImage) + } + if enableKubeAPI { h := &kubeAPIVersionsHandler{ mustGatherVersions: mustGatherVersions, @@ -52,10 +62,6 @@ func NewHandler( sem: semaphore.NewWeighted(30), } - if err := h.validateVersions(); err != nil { - return nil, err - } - return h, nil } @@ -235,3 +241,37 @@ func ParseReleaseImages( } }) } + +func normalizeReleaseImageCPUArchitecture(releaseImage *models.ReleaseImage) { + // Normalize release.CPUArchitecture and release.CPUArchitectures + // TODO: remove this block when AI starts using aarch64 instead of arm64 + if swag.StringValue(releaseImage.CPUArchitecture) == common.MultiCPUArchitecture || swag.StringValue(releaseImage.CPUArchitecture) == common.AARCH64CPUArchitecture { + *releaseImage.CPUArchitecture = common.NormalizeCPUArchitecture(*releaseImage.CPUArchitecture) + for i := 0; i < len(releaseImage.CPUArchitectures); i++ { + releaseImage.CPUArchitectures[i] = common.NormalizeCPUArchitecture(releaseImage.CPUArchitectures[i]) + } + } +} + +// validateReleaseImage ensures no missing values in Release image. +func validateReleaseImage(releaseImage *models.ReleaseImage) error { + // Release images are not mandatory (dynamically added in kube-api flow), + // validating fields for those specified in list. + missingValueTemplate := "Missing value in ReleaseImage for '%s' field" + if swag.StringValue(releaseImage.CPUArchitecture) == "" { + return errors.Errorf(fmt.Sprintf(missingValueTemplate, "cpu_architecture")) + } + + if swag.StringValue(releaseImage.OpenshiftVersion) == "" { + return errors.Errorf(fmt.Sprintf(missingValueTemplate, "openshift_version")) + } + if swag.StringValue(releaseImage.URL) == "" { + return errors.Errorf(fmt.Sprintf(missingValueTemplate, "url")) + } + if swag.StringValue(releaseImage.Version) == "" { + return errors.Errorf(fmt.Sprintf(missingValueTemplate, "version")) + } + + // To validate CPU architecture enum + return releaseImage.Validate(strfmt.Default) +} diff --git a/internal/versions/common_test.go b/internal/versions/common_test.go index fa6d37299027..35f573f5e5e7 100644 --- a/internal/versions/common_test.go +++ b/internal/versions/common_test.go @@ -95,6 +95,42 @@ var _ = Describe("NewHandler", func() { Expect(err).Should(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("version")) }) + + It("Normalizes CPU architecture", func() { + releaseImages := models.ReleaseImages{ + &models.ReleaseImage{ + OpenshiftVersion: swag.String("4.14"), + Version: swag.String("4.14.1"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + URL: swag.String("release_4.14"), + }, + &models.ReleaseImage{ + OpenshiftVersion: swag.String("4.14"), + Version: swag.String("4.14.1"), + CPUArchitecture: swag.String(common.AARCH64CPUArchitecture), + URL: swag.String("release_4.14"), + }, + } + + _, err := NewHandler(common.GetTestLog(), nil, releaseImages, nil, "", nil, nil, nil, false, nil) + Expect(err).ToNot(HaveOccurred()) + Expect(*releaseImages[0].CPUArchitecture).To(Equal(common.X86CPUArchitecture)) + Expect(*releaseImages[1].CPUArchitecture).To(Equal(common.ARM64CPUArchitecture)) + }) + + It("Validates CPU architecture", func() { + releaseImages := models.ReleaseImages{ + &models.ReleaseImage{ + OpenshiftVersion: swag.String("4.14"), + Version: swag.String("4.14.1"), + CPUArchitecture: swag.String(common.AMD64CPUArchitecture), + URL: swag.String("release_4.14"), + }, + } + + _, err := NewHandler(common.GetTestLog(), nil, releaseImages, nil, "", nil, nil, nil, false, nil) + Expect(err).To(HaveOccurred()) + }) }) var _ = Describe("validateReleaseImageForRHCOS", func() { diff --git a/internal/versions/kube_api_versions.go b/internal/versions/kube_api_versions.go index 4d523329b6fe..b56abf888fbf 100644 --- a/internal/versions/kube_api_versions.go +++ b/internal/versions/kube_api_versions.go @@ -2,7 +2,6 @@ package versions import ( context "context" - "fmt" "regexp" "runtime/debug" "strings" @@ -53,6 +52,7 @@ func (h *kubeAPIVersionsHandler) GetMustGatherImages(openshiftVersion, cpuArchit // It first tries to find the image in the local cache. If the image is not found in the cache and a Kubernetes client is available (KubeAPI mode), // it then fetches all cluster image sets, updates the cache with these image sets, and attempts the cache lookup again. func (h *kubeAPIVersionsHandler) GetReleaseImage(ctx context.Context, openshiftVersion, cpuArchitecture, pullSecret string) (*models.ReleaseImage, error) { + cpuArchitecture = common.NormalizeCPUArchitecture(cpuArchitecture) image, err := h.getReleaseImageFromCache(openshiftVersion, cpuArchitecture) if err == nil || h.kubeClient == nil { return image, err @@ -248,38 +248,6 @@ func (h *kubeAPIVersionsHandler) addReleaseImage(releaseImageUrl, pullSecret str return releaseImage.(*models.ReleaseImage), nil } -// Ensure no missing values in Release images. -func (h *kubeAPIVersionsHandler) validateVersions() error { - // Release images are not mandatory (dynamically added in kube-api flow), - // validating fields for those specified in list. - missingValueTemplate := "Missing value in ReleaseImage for '%s' field" - for _, release := range h.releaseImages { - if swag.StringValue(release.CPUArchitecture) == "" { - return errors.Errorf(fmt.Sprintf(missingValueTemplate, "cpu_architecture")) - } - if swag.StringValue(release.OpenshiftVersion) == "" { - return errors.Errorf(fmt.Sprintf(missingValueTemplate, "openshift_version")) - } - if swag.StringValue(release.URL) == "" { - return errors.Errorf(fmt.Sprintf(missingValueTemplate, "url")) - } - if swag.StringValue(release.Version) == "" { - return errors.Errorf(fmt.Sprintf(missingValueTemplate, "version")) - } - // Normalize release.CPUArchitecture and release.CPUArchitectures - // TODO: remove this block when AI starts using aarch64 instead of arm64 - if swag.StringValue(release.CPUArchitecture) == common.MultiCPUArchitecture || swag.StringValue(release.CPUArchitecture) == common.AARCH64CPUArchitecture { - *release.CPUArchitecture = common.NormalizeCPUArchitecture(*release.CPUArchitecture) - for i := 0; i < len(release.CPUArchitectures); i++ { - release.CPUArchitectures[i] = common.NormalizeCPUArchitecture(release.CPUArchitectures[i]) - } - - } - } - - return nil -} - // GetRevision returns the overall codebase version. It's for detecting // what code a binary was built from. func GetRevision() string { diff --git a/internal/versions/kube_api_versions_test.go b/internal/versions/kube_api_versions_test.go index 3c9082eb68c6..407557747acc 100644 --- a/internal/versions/kube_api_versions_test.go +++ b/internal/versions/kube_api_versions_test.go @@ -267,6 +267,12 @@ var _ = Describe("GetReleaseImage", func() { Expect(*releaseImage.Version).Should(Equal("4.12.999-rc.4")) }) + It("gets successfuly single-arch image with normaliznig CPU architecture", func() { + releaseImage, err := h.GetReleaseImage(ctx, "4.9-candidate_arm64", common.AARCH64CPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.OpenshiftVersion).Should(Equal("4.9")) + }) + It("returns the matching CPU architecture over multi-arch if it is present", func() { h.releaseImages = models.ReleaseImages{ &models.ReleaseImage{ diff --git a/internal/versions/osimages.go b/internal/versions/osimages.go index e251b4e75369..4c5fd0bcd050 100644 --- a/internal/versions/osimages.go +++ b/internal/versions/osimages.go @@ -4,6 +4,7 @@ import ( "fmt" "sort" + "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" "github.com/hashicorp/go-version" "github.com/openshift/assisted-service/internal/common" @@ -24,45 +25,37 @@ type OSImages interface { type osImageList models.OsImages func NewOSImages(images models.OsImages) (OSImages, error) { - i := osImageList(images) - if err := i.validate(); err != nil { - return nil, err + if len(images) == 0 { + return nil, errors.New("No OS images provided") } - return i, nil -} - -func (images osImageList) validate() error { for _, osImage := range images { - if swag.StringValue(osImage.OpenshiftVersion) == "" { - return errors.Errorf("Missing openshift_version in OsImage: %v", osImage) + if err := validateOSImage(osImage); err != nil { + return nil, err } - } - openshiftVersions := images.GetOpenshiftVersions() - if len(openshiftVersions) == 0 { - return errors.Errorf("No OS images are available") + normalizeOSImageCPUArchitecture(osImage) } + return osImageList(images), nil +} + +func validateOSImage(osImage *models.OsImage) error { missingValueTemplate := "Missing value in OSImage for '%s' field (openshift_version: %s)" - for _, key := range openshiftVersions { - architectures := images.GetCPUArchitectures(key) - for _, architecture := range architectures { - osImage, err := images.GetOsImage(key, architecture) - if err != nil { - return errors.Wrap(err, fmt.Sprintf("Failed to get OSImage for openshift version: %s", key)) - } - if swag.StringValue(osImage.URL) == "" { - return errors.Errorf(fmt.Sprintf(missingValueTemplate, "url", key)) - } - if swag.StringValue(osImage.Version) == "" { - return errors.Errorf(fmt.Sprintf(missingValueTemplate, "version", key)) - } - // Normalize osImage.CPUArchitecture - // TODO: remove this block when AI starts using aarch64 instead of arm64 - if architecture == common.AARCH64CPUArchitecture { - *osImage.CPUArchitecture = common.NormalizeCPUArchitecture(*osImage.CPUArchitecture) - } - } + if swag.StringValue(osImage.OpenshiftVersion) == "" { + return errors.Errorf("Missing openshift_version in OsImage: %v", osImage) + } + + if swag.StringValue(osImage.URL) == "" { + return errors.Errorf(fmt.Sprintf(missingValueTemplate, "url", *osImage.OpenshiftVersion)) + } + if swag.StringValue(osImage.Version) == "" { + return errors.Errorf(fmt.Sprintf(missingValueTemplate, "version", *osImage.OpenshiftVersion)) + } + if swag.StringValue(osImage.CPUArchitecture) == "" { + osImage.CPUArchitecture = swag.String(common.DefaultCPUArchitecture) + } + if err := osImage.Validate(strfmt.Default); err != nil { + return errors.Wrapf(err, "osImage version '%s' CPU architecture is not valid", *osImage.OpenshiftVersion) } return nil @@ -70,10 +63,13 @@ func (images osImageList) validate() error { // Returns the OsImage entity func (images osImageList) GetOsImage(openshiftVersion, cpuArchitecture string) (*models.OsImage, error) { + cpuArchitecture = common.NormalizeCPUArchitecture(cpuArchitecture) + if cpuArchitecture == "" { // Empty implies default CPU architecture cpuArchitecture = common.DefaultCPUArchitecture } + // Filter OS images by specified CPU architecture archImages := funk.Filter(images, func(osImage *models.OsImage) bool { if swag.StringValue(osImage.CPUArchitecture) == "" { @@ -205,3 +201,11 @@ func (images osImageList) GetOpenshiftVersions() []string { } return versions } + +func normalizeOSImageCPUArchitecture(osImage *models.OsImage) { + // Normalize osImage.CPUArchitecture + // TODO: remove this block when AI starts using aarch64 instead of arm64 + if *osImage.CPUArchitecture == common.AARCH64CPUArchitecture { + *osImage.CPUArchitecture = common.NormalizeCPUArchitecture(*osImage.CPUArchitecture) + } +} diff --git a/internal/versions/osimages_test.go b/internal/versions/osimages_test.go index 673e42a5a98e..842e8f3499ed 100644 --- a/internal/versions/osimages_test.go +++ b/internal/versions/osimages_test.go @@ -8,6 +8,74 @@ import ( models "github.com/openshift/assisted-service/models" ) +var _ = Describe("NewOSImages", func() { + It("should fail when missing OpenshiftVersion", func() { + osImages := models.OsImages{ + { + Version: swag.String("4.14.213113"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + URL: swag.String("foobar-4.14"), + }, + } + + _, err := NewOSImages(osImages) + Expect(err).Should(HaveOccurred()) + }) + + It("should fail when missing Version", func() { + osImages := models.OsImages{ + { + OpenshiftVersion: swag.String("4.14"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + URL: swag.String("foobar-4.14"), + }, + } + + _, err := NewOSImages(osImages) + Expect(err).Should(HaveOccurred()) + }) + + It("should not fail when missing CPU architecture, should set to default", func() { + osImages := models.OsImages{ + { + OpenshiftVersion: swag.String("4.14"), + Version: swag.String("4.14.213113"), + URL: swag.String("foobar-4.14"), + }, + } + + _, err := NewOSImages(osImages) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*osImages[0].CPUArchitecture).To(Equal(common.X86CPUArchitecture)) + }) + + It("should fail when missing URL", func() { + osImages := models.OsImages{ + { + OpenshiftVersion: swag.String("4.14"), + Version: swag.String("4.14.213113"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + }, + } + + _, err := NewOSImages(osImages) + Expect(err).Should(HaveOccurred()) + }) + + It("should fail when CPU architecture is not valid", func() { + osImages := models.OsImages{ + { + OpenshiftVersion: swag.String("4.14"), + Version: swag.String("4.14.213113"), + CPUArchitecture: swag.String(common.AMD64CPUArchitecture), + }, + } + + _, err := NewOSImages(osImages) + Expect(err).Should(HaveOccurred()) + }) +}) + var _ = Describe("GetOsImage", func() { var ( images OSImages @@ -52,6 +120,13 @@ var _ = Describe("GetOsImage", func() { Expect(image.OpenshiftVersion).To(HaveValue(Equal("4.9"))) }) + It("With normalizing the CPU architecture", func() { + image, err := images.GetOsImage("4.9", common.AARCH64CPUArchitecture) + Expect(err).ShouldNot(HaveOccurred()) + Expect(image.Version).To(HaveValue(Equal("version-49.123-0_arm64"))) + Expect(*image.CPUArchitecture).To(Equal(common.ARM64CPUArchitecture)) + }) + It("parses the image list correctly", func() { for _, version := range images.GetOpenshiftVersions() { architectures := images.GetCPUArchitectures(version) diff --git a/internal/versions/rest_api_versions.go b/internal/versions/rest_api_versions.go index 51a76812934d..d715bb88904e 100644 --- a/internal/versions/rest_api_versions.go +++ b/internal/versions/rest_api_versions.go @@ -31,6 +31,7 @@ type restAPIVersionsHandler struct { // For OpenShift versions specified as major.minor, it fetches the latest matching release image. // The function returns an error Returns an error for other formats of OpenShift version or if no matching image can be found. func (h *restAPIVersionsHandler) GetReleaseImage(_ context.Context, openshiftVersion, cpuArchitecture, _ string) (*models.ReleaseImage, error) { + cpuArchitecture = common.NormalizeCPUArchitecture(cpuArchitecture) // validations if err := validateCPUArchitecture(cpuArchitecture); err != nil { return nil, err diff --git a/internal/versions/rest_api_versions_test.go b/internal/versions/rest_api_versions_test.go index c819945a3383..20c25531c015 100644 --- a/internal/versions/rest_api_versions_test.go +++ b/internal/versions/rest_api_versions_test.go @@ -381,6 +381,27 @@ var _ = Describe("GetReleaseImage", func() { Expect(releaseImage).To(BeNil()) }) + It("gets successfully with normalizing CPU architecture", func() { + releaseImages := models.ReleaseImages{ + { + OpenshiftVersion: swag.String("4.14"), + Version: swag.String("4.14.1"), + CPUArchitecture: swag.String(common.ARM64CPUArchitecture), + CPUArchitectures: []string{common.ARM64CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.1-aarch64"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + Default: false, + }, + } + + err := db.Create(releaseImages).Error + Expect(err).ShouldNot(HaveOccurred()) + + releaseImage, err := handler.GetReleaseImage(ctx, "4.14.1", common.AARCH64CPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).To(Equal("4.14.1")) + }) + It("filters ignored release images successfully with major.minor ignored versions", func() { releaseImages := models.ReleaseImages{ { From 4053a74ef5d11508f8530c29fd31c7f4d15afeed Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Thu, 18 Apr 2024 11:49:47 +0200 Subject: [PATCH 08/25] MGMT-17513: Change the latest release image retrieved in GetReleaseImage using major.minor OpenShift version to latest non-beta release image if exists, or latest beta release image otherwise (#6205) Co-authored-by: danmanor --- internal/versions/rest_api_versions.go | 16 ++++++++++--- internal/versions/rest_api_versions_test.go | 25 ++++++++++++++++++++- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/internal/versions/rest_api_versions.go b/internal/versions/rest_api_versions.go index d715bb88904e..560104fe9762 100644 --- a/internal/versions/rest_api_versions.go +++ b/internal/versions/rest_api_versions.go @@ -164,6 +164,9 @@ func validateCPUArchitecture(cpuArchitecture string) error { return releaseImage.Validate(strfmt.Default) } +// getLatestReleaseImage returns the latest release image among a list of release images not included in ignore list, +// or error if none of the release images match. The latest release image is considered the latest none beta release image, +// or if all matching release images are beta then just the latest. func getLatestReleaseImage(releaseImages models.ReleaseImages, ignoredOpenshiftVersions []string) (*models.ReleaseImage, error) { var latestReleaseImage *models.ReleaseImage @@ -177,13 +180,20 @@ func getLatestReleaseImage(releaseImages models.ReleaseImages, ignoredOpenshiftV continue } - lessThan, err := common.BaseVersionLessThan(*releaseImage.Version, *latestReleaseImage.Version) + isLatest, err := common.BaseVersionLessThan(*releaseImage.Version, *latestReleaseImage.Version) if err != nil { return nil, err } - if lessThan { - latestReleaseImage = releaseImage + // none-beta > beta, later-beta > beta + if latestReleaseImage.SupportLevel == models.OpenshiftVersionSupportLevelBeta { + if isLatest || releaseImage.SupportLevel != models.OpenshiftVersionSupportLevelBeta { + latestReleaseImage = releaseImage + } + } else { // non-beta-later > non-beta + if isLatest && releaseImage.SupportLevel != models.OpenshiftVersionSupportLevelBeta { + latestReleaseImage = releaseImage + } } } diff --git a/internal/versions/rest_api_versions_test.go b/internal/versions/rest_api_versions_test.go index 20c25531c015..c3e2d97debf0 100644 --- a/internal/versions/rest_api_versions_test.go +++ b/internal/versions/rest_api_versions_test.go @@ -85,6 +85,15 @@ var _ = Describe("GetReleaseImage", func() { SupportLevel: models.ReleaseImageSupportLevelProduction, Default: false, }, + { + OpenshiftVersion: swag.String("4.14"), + Version: swag.String("4.14.3"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.3-x86_64"), + SupportLevel: models.OpenshiftVersionSupportLevelBeta, + Default: false, + }, { OpenshiftVersion: swag.String("4.14"), Version: swag.String("4.14.3"), @@ -94,13 +103,23 @@ var _ = Describe("GetReleaseImage", func() { SupportLevel: models.ReleaseImageSupportLevelProduction, Default: false, }, + { OpenshiftVersion: swag.String("4.15"), Version: swag.String("4.15.1"), CPUArchitecture: swag.String(common.X86CPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture}, URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.15.1-x86_64"), - SupportLevel: models.ReleaseImageSupportLevelProduction, + SupportLevel: models.OpenshiftVersionSupportLevelBeta, + Default: false, + }, + { + OpenshiftVersion: swag.String("4.15"), + Version: swag.String("4.15.2"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.15.2-x86_64"), + SupportLevel: models.OpenshiftVersionSupportLevelBeta, Default: false, }, } @@ -111,6 +130,10 @@ var _ = Describe("GetReleaseImage", func() { releaseImage, err := handler.GetReleaseImage(ctx, "4.14", common.X86CPUArchitecture, pullSecret) Expect(err).ShouldNot(HaveOccurred()) Expect(*releaseImage.Version).Should(Equal("4.14.2")) + + releaseImage, err = handler.GetReleaseImage(ctx, "4.15", common.X86CPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.15.2")) }) It("gets the exact matching release image with major.minor.patch / prerelease openshiftVersion", func() { From b72e91af10edd76564876e1986817a3630ca104c Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Thu, 18 Apr 2024 14:03:50 +0200 Subject: [PATCH 09/25] MGMT-17503: Fix the cpu architectures retrieved in ../openshift-versions endpoint (#6206) Co-authored-by: danmanor --- internal/common/version.go | 12 +++++ internal/common/version_test.go | 13 ++++++ internal/versions/api.go | 77 ++++++++++++++++++--------------- internal/versions/api_test.go | 50 ++++++++++++++++++--- 4 files changed, 110 insertions(+), 42 deletions(-) diff --git a/internal/common/version.go b/internal/common/version.go index 3f167787f150..4b3ebc07bd7d 100644 --- a/internal/common/version.go +++ b/internal/common/version.go @@ -69,6 +69,18 @@ func BaseVersionEqual(version1, versionMayEqual string) (bool, error) { return *majorMinorVersion1 == *majorMinorVersionMayEqual, nil } +func MajorMinorPatchEqual(firstVersion, secondVersion string) (*bool, error) { + if GetVersionFormat(firstVersion) != MajorMinorPatchVersion { + return nil, fmt.Errorf("version '%s' is not in the form of major.minor.patch or major.minor.patch-", firstVersion) + } + + if GetVersionFormat(secondVersion) != MajorMinorPatchVersion { + return nil, fmt.Errorf("version '%s' is not in the form of major.minor.patch or major.minor.patch-", secondVersion) + } + + return swag.Bool(strings.Split(firstVersion, "-")[0] == strings.Split(secondVersion, "-")[0]), nil +} + func GetMajorMinorVersion(version string) (*string, error) { version = strings.Split(version, "-")[0] splittedVersion := strings.Split(version, ".") diff --git a/internal/common/version_test.go b/internal/common/version_test.go index 2c55792736a9..81e760e666cd 100644 --- a/internal/common/version_test.go +++ b/internal/common/version_test.go @@ -143,3 +143,16 @@ var _ = DescribeTable("GetVersionFormat", func(input string, expectedVersionForm Entry("empty version", "", NoneVersion), Entry("non-version string", "non-version", NoneVersion), ) + +var _ = DescribeTable("MajorMinorPatchEqual", func(firstVersion string, secondVersion string, ExpectedResult *bool) { + isEqual, _ := MajorMinorPatchEqual(firstVersion, secondVersion) + Expect(isEqual).To(Equal(ExpectedResult)) +}, + Entry("two equal x.y.z versions", "4.11.0", "4.11.0", swag.Bool(true)), + Entry("two not unequal x.y.z versions", "4.11.0", "4.11.1", swag.Bool(false)), + Entry("one x.y.z version and one x.y.z-something version, equal", "4.11.0", "4.11.0-alpha", swag.Bool(true)), + Entry("one x.y.z version and one x.y.z-something version, unequal", "4.11.0", "4.12.0-alpha", swag.Bool(false)), + Entry("majorMinorVersions", "4.11", "4.11", nil), + Entry("majorVersions", "4", "4", nil), + Entry("malformed versions", "foobar", "foobar", nil), +) diff --git a/internal/versions/api.go b/internal/versions/api.go index 56fd02ce5c2b..c5a12d4af467 100644 --- a/internal/versions/api.go +++ b/internal/versions/api.go @@ -14,7 +14,6 @@ import ( "github.com/openshift/assisted-service/restapi" operations "github.com/openshift/assisted-service/restapi/operations/versions" "github.com/pkg/errors" - "github.com/samber/lo" "github.com/sirupsen/logrus" "github.com/thoas/go-funk" ) @@ -77,62 +76,73 @@ func GetModelVersions(v Versions) models.Versions { } } -// getLatestReleaseImageForMajorMinor returns the latest release image matching a given major.minor version, +// getLatestReleaseImagesForMajorMinor returns the latest release images (all the CPU architectures) matching a given major.minor version, // or error if none of the release images match. The latest release image is considered the latest none beta release image, // or if all matching release images are beta then just the latest. -func getLatestReleaseImageForMajorMinor(releaseImages models.ReleaseImages, majorMinorVersion string, log logrus.FieldLogger) (*models.ReleaseImage, error) { - var latestReleaseImage *models.ReleaseImage +func getLatestReleaseImagesForMajorMinor(releaseImages models.ReleaseImages, majorMinorVersion string, log logrus.FieldLogger) (models.ReleaseImages, error) { + var latestReleaseImages models.ReleaseImages for _, releaseImage := range releaseImages { // Typically, releaseImage.OpenshiftVersion follow the major.minor format, though exceptions exist with static release images. - currentMajorMinorVersion, err := common.GetMajorMinorVersion(*releaseImage.OpenshiftVersion) + // We want to consider only release images matching the given major.minor version. + isMajorMinorEqual, err := common.BaseVersionEqual(*releaseImage.Version, majorMinorVersion) if err != nil { return nil, err } - if *currentMajorMinorVersion != majorMinorVersion { + if !isMajorMinorEqual { continue } - if latestReleaseImage == nil { - latestReleaseImage = releaseImage + if latestReleaseImages == nil { + latestReleaseImages = models.ReleaseImages{releaseImage} } - isNewest, err := common.BaseVersionLessThan(*releaseImage.Version, *latestReleaseImage.Version) + // If it is the same version but different CPU architecture, add the atchitecture to the list. + isEqual, err := common.MajorMinorPatchEqual(*releaseImage.Version, *latestReleaseImages[0].Version) + if err != nil { + return nil, err + } + if *isEqual && !funk.Contains(latestReleaseImages, releaseImage) { + latestReleaseImages = append(latestReleaseImages, releaseImage) + continue + } + + isNewest, err := common.BaseVersionLessThan(*releaseImage.Version, *latestReleaseImages[0].Version) if err != nil { return nil, err } // none-beta > beta, later-beta > beta - if latestReleaseImage.SupportLevel == models.OpenshiftVersionSupportLevelBeta { + if latestReleaseImages[0].SupportLevel == models.OpenshiftVersionSupportLevelBeta { if isNewest || releaseImage.SupportLevel != models.OpenshiftVersionSupportLevelBeta { - latestReleaseImage = releaseImage + latestReleaseImages = models.ReleaseImages{releaseImage} } } else { // non-beta-later > non-beta if isNewest && releaseImage.SupportLevel != models.OpenshiftVersionSupportLevelBeta { - latestReleaseImage = releaseImage + latestReleaseImages = models.ReleaseImages{releaseImage} } } - } - - log.Debugf("Found latest release image version '%s' for majorMinorVersion '%s'", *latestReleaseImage.Version, majorMinorVersion) - - return latestReleaseImage, nil -} -// getMultiArchReleaseImage retrieves multi arch release image matching a given x.y.z version. -func getMultiArchReleaseImage(releaseImages models.ReleaseImages, version string, log logrus.FieldLogger) *models.ReleaseImage { - if !strings.HasSuffix(version, "-multi") { - version = fmt.Sprintf("%s-multi", version) } - if releaseImage, ok := lo.Find(releaseImages, func(releaseImage *models.ReleaseImage) bool { - return swag.StringValue(releaseImage.Version) == version - }); ok { - log.Debugf("Found multi-arch release image for version '%s'", version) - return releaseImage + if len(latestReleaseImages) == 0 { + return nil, errors.Errorf("No release image found for version '%s'", majorMinorVersion) } - return nil + cpuArchitecturesLiteral := funk.Reduce(latestReleaseImages, func(agg string, releaseImage *models.ReleaseImage) string { + if agg == "" { + return *releaseImage.CPUArchitecture + } + return fmt.Sprintf("%s, %s", agg, *releaseImage.CPUArchitecture) + }, "").(string) + log.Debugf( + "Found latest release images version '%s' and CPU architectures '%s' for majorMinorVersion '%s'", + *latestReleaseImages[0].Version, + cpuArchitecturesLiteral, + majorMinorVersion, + ) + + return latestReleaseImages, nil } func filterReleaseImagesByOnlyLatest(releaseImages models.ReleaseImages, onlyLatest *bool, log logrus.FieldLogger) (models.ReleaseImages, error) { @@ -154,16 +164,11 @@ func filterReleaseImagesByOnlyLatest(releaseImages models.ReleaseImages, onlyLat filteredReleaseImages := models.ReleaseImages{} for majorMinorVersion := range releaseImagesMajorMinorVersionsSet { - latestReleaseImageForMajorMinor, err := getLatestReleaseImageForMajorMinor(releaseImages, majorMinorVersion, log) + latestReleaseImagesForMajorMinor, err := getLatestReleaseImagesForMajorMinor(releaseImages, majorMinorVersion, log) if err != nil { - return nil, errors.Wrapf(err, "error occurred while trying to get the latest release image for version: %s", majorMinorVersion) - } - filteredReleaseImages = append(filteredReleaseImages, latestReleaseImageForMajorMinor) - // Add the matching multi-arch release image if exists as well - matchingMultiArchReleaseImage := getMultiArchReleaseImage(releaseImages, *latestReleaseImageForMajorMinor.Version, log) - if matchingMultiArchReleaseImage != nil { - filteredReleaseImages = append(filteredReleaseImages, matchingMultiArchReleaseImage) + return nil, errors.Wrapf(err, "error occurred while trying to get the latest release images for version: %s", majorMinorVersion) } + filteredReleaseImages = append(filteredReleaseImages, latestReleaseImagesForMajorMinor...) } return filteredReleaseImages, nil diff --git a/internal/versions/api_test.go b/internal/versions/api_test.go index 31b8a38a66ed..eabb270a5ad4 100644 --- a/internal/versions/api_test.go +++ b/internal/versions/api_test.go @@ -482,6 +482,14 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { Version: swag.String("4.11.1"), SupportLevel: models.ReleaseImageSupportLevelProduction, }, + { + CPUArchitecture: swag.String(common.ARM64CPUArchitecture), + CPUArchitectures: []string{common.ARM64CPUArchitecture}, + OpenshiftVersion: swag.String("4.11"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.11.1-aarch64"), + Version: swag.String("4.11.1"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + }, { CPUArchitecture: swag.String(common.X86CPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture}, @@ -506,6 +514,14 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { Version: swag.String("4.12.1"), SupportLevel: models.ReleaseImageSupportLevelProduction, }, + { + CPUArchitecture: swag.String(common.ARM64CPUArchitecture), + CPUArchitectures: []string{common.ARM64CPUArchitecture}, + OpenshiftVersion: swag.String("4.12"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.12.1-aarch64"), + Version: swag.String("4.12.1"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + }, { CPUArchitecture: swag.String(common.X86CPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture}, @@ -522,6 +538,14 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { Version: swag.String("4.13.1"), SupportLevel: models.OpenshiftVersionSupportLevelBeta, }, + { + CPUArchitecture: swag.String(common.ARM64CPUArchitecture), + CPUArchitectures: []string{common.ARM64CPUArchitecture}, + OpenshiftVersion: swag.String("4.13"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.13.1-aarch64"), + Version: swag.String("4.13.1"), + SupportLevel: models.OpenshiftVersionSupportLevelBeta, + }, { CPUArchitecture: swag.String(common.X86CPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture}, @@ -530,6 +554,14 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { Version: swag.String("4.13.2"), SupportLevel: models.OpenshiftVersionSupportLevelBeta, }, + { + CPUArchitecture: swag.String(common.ARM64CPUArchitecture), + CPUArchitectures: []string{common.ARM64CPUArchitecture}, + OpenshiftVersion: swag.String("4.13"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.13.2-aarch64"), + Version: swag.String("4.13.2"), + SupportLevel: models.OpenshiftVersionSupportLevelBeta, + }, { CPUArchitecture: swag.String(common.MultiCPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, @@ -559,6 +591,12 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { URL: swag.String("https://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/4.12/4.12.48/rhcos-4.12.48-x86_64-live.x86_64.iso"), Version: swag.String("412.86.202308081056-0"), }, + { + OpenshiftVersion: swag.String("4.12"), + CPUArchitecture: swag.String(common.ARM64CPUArchitecture), + URL: swag.String("https://mirror.openshift.com/pub/openshift-v4/aarch64/dependencies/rhcos/4.12/4.12.48/rhcos-4.12.48-aarch64-live.aarch64.iso"), + Version: swag.String("412.86.202308081056-0"), + }, { OpenshiftVersion: swag.String("4.13"), CPUArchitecture: swag.String(common.X86CPUArchitecture), @@ -588,7 +626,7 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { expectedPayload := models.OpenshiftVersions{ "4.11.1": { DisplayName: swag.String("4.11.1"), - CPUArchitectures: []string{common.X86CPUArchitecture}, + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, SupportLevel: swag.String(models.ReleaseImageSupportLevelProduction), Default: false, }, @@ -606,7 +644,7 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { }, "4.12.1": { DisplayName: swag.String("4.12.1"), - CPUArchitectures: []string{common.X86CPUArchitecture}, + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, SupportLevel: swag.String(models.ReleaseImageSupportLevelProduction), Default: false, }, @@ -618,13 +656,13 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { }, "4.13.1": { DisplayName: swag.String("4.13.1"), - CPUArchitectures: []string{common.X86CPUArchitecture}, + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), Default: false, }, "4.13.2": { DisplayName: swag.String("4.13.2"), - CPUArchitectures: []string{common.X86CPUArchitecture}, + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), Default: false, }, @@ -660,13 +698,13 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { }, "4.12.1": { DisplayName: swag.String("4.12.1"), - CPUArchitectures: []string{common.X86CPUArchitecture}, + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, SupportLevel: swag.String(models.ReleaseImageSupportLevelProduction), Default: false, }, "4.13.2": { DisplayName: swag.String("4.13.2"), - CPUArchitectures: []string{common.X86CPUArchitecture}, + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), Default: false, }, From 85333c29b7b6e546f3d11581a0d64e8abc49b159 Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Thu, 18 Apr 2024 16:47:07 +0200 Subject: [PATCH 10/25] MGMT-17412: Change fallbck behavior when error occuring in OpenShift Release Syncer - if there are release images already in the DB, continue using the stale data instead of failing / truncating the table (#6145) (#6210) Co-authored-by: Dan Manor --- internal/versions/rest_api_versions.go | 14 +-- internal/versions/rest_api_versions_test.go | 100 +++++++++++++++++++- subsystem/cluster_v2_test.go | 8 +- subsystem/feature_support_levels_test.go | 20 ++-- 4 files changed, 120 insertions(+), 22 deletions(-) diff --git a/internal/versions/rest_api_versions.go b/internal/versions/rest_api_versions.go index 560104fe9762..10e52814cb09 100644 --- a/internal/versions/rest_api_versions.go +++ b/internal/versions/rest_api_versions.go @@ -8,6 +8,7 @@ import ( "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" + "github.com/lib/pq" "github.com/openshift/assisted-service/internal/common" "github.com/openshift/assisted-service/internal/oc" models "github.com/openshift/assisted-service/models" @@ -49,17 +50,16 @@ func (h *restAPIVersionsHandler) GetReleaseImage(_ context.Context, openshiftVer if cpuArchitecture == common.MultiCPUArchitecture { query = query.Where("cardinality(cpu_architectures) > 1") } else { - query = query.Where(h.db.Session(&gorm.Session{}).Where("? = ANY(cpu_architectures)", cpuArchitecture).Or("cpu_architecture = ?", cpuArchitecture)) + query = query.Where(h.db.Session(&gorm.Session{}). + Where("cpu_architectures @> ? AND ? @> cpu_architectures", pq.StringArray{cpuArchitecture}, pq.StringArray{cpuArchitecture}). + Or("cpu_architecture = ?", cpuArchitecture)) } // Find the exact version if versionFormat == common.MajorMinorPatchVersion { - editedVersion := openshiftVersion - // add multi suffix if missing - if cpuArchitecture == common.MultiCPUArchitecture && !strings.HasSuffix(openshiftVersion, "-multi") { - editedVersion = editedVersion + "-multi" - } - query = query.Where("version = ?", editedVersion) + query = query.Where(h.db.Session(&gorm.Session{}). + Where("version = ?", openshiftVersion). + Or("version = ?", openshiftVersion+"-multi")) var releaseImage models.ReleaseImage err := query.Take(&releaseImage).Error if err != nil { diff --git a/internal/versions/rest_api_versions_test.go b/internal/versions/rest_api_versions_test.go index c3e2d97debf0..ece86e3e4cb1 100644 --- a/internal/versions/rest_api_versions_test.go +++ b/internal/versions/rest_api_versions_test.go @@ -103,7 +103,15 @@ var _ = Describe("GetReleaseImage", func() { SupportLevel: models.ReleaseImageSupportLevelProduction, Default: false, }, - + { + OpenshiftVersion: swag.String("4.14-multi"), + Version: swag.String("4.14.3-multi"), + CPUArchitecture: swag.String(common.MultiCPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.3-multi"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + Default: false, + }, { OpenshiftVersion: swag.String("4.15"), Version: swag.String("4.15.1"), @@ -122,6 +130,24 @@ var _ = Describe("GetReleaseImage", func() { SupportLevel: models.OpenshiftVersionSupportLevelBeta, Default: false, }, + { + OpenshiftVersion: swag.String("4.16-multi"), + Version: swag.String("4.16.1-multi"), + CPUArchitecture: swag.String(common.MultiCPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.1-multi"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + Default: false, + }, + { + OpenshiftVersion: swag.String("4.16"), + Version: swag.String("4.16.1"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.1-x86_64"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + Default: false, + }, } err := db.Create(releaseImages).Error @@ -134,6 +160,10 @@ var _ = Describe("GetReleaseImage", func() { releaseImage, err = handler.GetReleaseImage(ctx, "4.15", common.X86CPUArchitecture, pullSecret) Expect(err).ShouldNot(HaveOccurred()) Expect(*releaseImage.Version).Should(Equal("4.15.2")) + + releaseImage, err = handler.GetReleaseImage(ctx, "4.16", common.X86CPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.16.1")) }) It("gets the exact matching release image with major.minor.patch / prerelease openshiftVersion", func() { @@ -206,6 +236,40 @@ var _ = Describe("GetReleaseImage", func() { Expect(*releaseImage.Version).Should(Equal("4.14.2")) }) + It("gets successfully image using major.minor.patch openshiftVersion in multiarch query with different version format", func() { + releaseImages := models.ReleaseImages{ + { + OpenshiftVersion: swag.String("4.16.0-0.nightly-arm64-2024-04-08-123354"), + Version: swag.String("4.16.0-0.nightly-arm64-2024-04-08-123354"), + CPUArchitecture: swag.String(common.ARM64CPUArchitecture), + CPUArchitectures: []string{common.ARM64CPUArchitecture}, + URL: swag.String("quay.io/foobar/4.16.0-0.nightly-arm64-2024-04-08-123354@foobar"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + Default: false, + }, + { + OpenshiftVersion: swag.String("4.16.0-0.nightly-multi-2024-04-08-123354"), + Version: swag.String("4.16.0-0.nightly-multi-2024-04-08-123354"), + CPUArchitecture: swag.String(common.MultiCPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + URL: swag.String("quay.io/foobar/4.16.0-0.nightly-multi-2024-04-08-123354@foobar"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + Default: false, + }, + } + + err := db.Create(releaseImages).Error + Expect(err).ShouldNot(HaveOccurred()) + + releaseImage, err := handler.GetReleaseImage(ctx, "4.16.0-0.nightly-arm64-2024-04-08-123354", common.ARM64CPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.16.0-0.nightly-arm64-2024-04-08-123354")) + + releaseImage, err = handler.GetReleaseImage(ctx, "4.16.0-0.nightly-multi-2024-04-08-123354", common.MultiCPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.16.0-0.nightly-multi-2024-04-08-123354")) + }) + It("gets release image successfully with major.minor.patch openshiftVersion and old syntax", func() { releaseImages := models.ReleaseImages{ { @@ -374,6 +438,40 @@ var _ = Describe("GetReleaseImage", func() { Expect(*releaseImage.Version).Should(Equal("4.14.2-multi")) }) + It("gets successfully image using major.minor.patch openshiftVersion in multiarch query with different version format", func() { + releaseImages := models.ReleaseImages{ + { + OpenshiftVersion: swag.String("4.16.0-0.nightly-arm64-2024-04-08-123354"), + Version: swag.String("4.16.0-0.nightly-arm64-2024-04-08-123354"), + CPUArchitecture: swag.String(common.ARM64CPUArchitecture), + CPUArchitectures: []string{common.ARM64CPUArchitecture}, + URL: swag.String("quay.io/foobar/4.16.0-0.nightly-arm64-2024-04-08-123354@foobar"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + Default: false, + }, + { + OpenshiftVersion: swag.String("4.16.0-0.nightly-multi-2024-04-08-123354"), + Version: swag.String("4.16.0-0.nightly-multi-2024-04-08-123354"), + CPUArchitecture: swag.String(common.MultiCPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + URL: swag.String("quay.io/foobar/4.16.0-0.nightly-multi-2024-04-08-123354@foobar"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + Default: false, + }, + } + + err := db.Create(releaseImages).Error + Expect(err).ShouldNot(HaveOccurred()) + + releaseImage, err := handler.GetReleaseImage(ctx, "4.16.0-0.nightly-arm64-2024-04-08-123354", common.ARM64CPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.16.0-0.nightly-arm64-2024-04-08-123354")) + + releaseImage, err = handler.GetReleaseImage(ctx, "4.16.0-0.nightly-multi-2024-04-08-123354", common.MultiCPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.16.0-0.nightly-multi-2024-04-08-123354")) + }) + It("returns an error when using major.minor.patch openshiftVersion but no exact match found", func() { releaseImages := models.ReleaseImages{ { diff --git a/subsystem/cluster_v2_test.go b/subsystem/cluster_v2_test.go index 6efa87dcce29..305a0ae71a76 100644 --- a/subsystem/cluster_v2_test.go +++ b/subsystem/cluster_v2_test.go @@ -536,7 +536,7 @@ var _ = Describe("[V2ClusterTests] multiarch", func() { var tmpPullSecret string var clusterID strfmt.UUID - registerClusterForMultiArch := func(cpuArchitecture string) *models.Cluster { + registerClusterForMultiArch := func() *models.Cluster { clusterReq, err := user2BMClient.Installer.V2RegisterCluster(ctx, &installer.V2RegisterClusterParams{ NewClusterParams: &models.ClusterCreateParams{ Name: swag.String("test-cluster"), @@ -544,7 +544,7 @@ var _ = Describe("[V2ClusterTests] multiarch", func() { PullSecret: swag.String(fmt.Sprintf(psTemplate, FakePS2)), BaseDNSDomain: "example.com", UserManagedNetworking: swag.Bool(true), - CPUArchitecture: cpuArchitecture, + CPUArchitecture: common.MultiCPUArchitecture, }, }) Expect(err).NotTo(HaveOccurred()) @@ -572,7 +572,7 @@ var _ = Describe("[V2ClusterTests] multiarch", func() { }) It("Default image type on s390x", func() { - cluster := registerClusterForMultiArch(models.ClusterCPUArchitectureS390x) + cluster := registerClusterForMultiArch() infraEnv := registerInfraEnvSpecificVersionAndArch(cluster.ID, "", common.S390xCPUArchitecture, "") Expect(*infraEnv.Type).To(Equal(models.ImageTypeFullIso)) @@ -591,7 +591,7 @@ var _ = Describe("[V2ClusterTests] multiarch", func() { Expect(err).To(HaveOccurred()) }) It("Default image type on ppc64le", func() { - cluster := registerClusterForMultiArch(models.ClusterCPUArchitecturePpc64le) + cluster := registerClusterForMultiArch() infraEnv := registerInfraEnvSpecificVersionAndArch(cluster.ID, "", common.PowerCPUArchitecture, "") Expect(*infraEnv.Type).To(Equal(models.ImageTypeFullIso)) diff --git a/subsystem/feature_support_levels_test.go b/subsystem/feature_support_levels_test.go index 53099e995690..3f088e5b885a 100644 --- a/subsystem/feature_support_levels_test.go +++ b/subsystem/feature_support_levels_test.go @@ -101,10 +101,10 @@ var _ = Describe("Feature support levels API", func() { }) Context("Update cluster", func() { - It("Update umn true won't fail on 4.13 with s390x without infra-env", func() { - cluster, err := registerNewCluster("4.13", "s390x", models.ClusterHighAvailabilityModeFull, swag.Bool(true)) + It("Update umn true won't fail on 4.13 with multi release without infra-env", func() { + cluster, err := registerNewCluster("4.13", common.MultiCPUArchitecture, models.ClusterHighAvailabilityModeFull, swag.Bool(true)) Expect(err).NotTo(HaveOccurred()) - Expect(cluster.Payload.CPUArchitecture).To(Equal("multi")) + Expect(cluster.Payload.CPUArchitecture).To(Equal(common.MultiCPUArchitecture)) _, err = user2BMClient.Installer.V2UpdateCluster(ctx, &installer.V2UpdateClusterParams{ ClusterUpdateParams: &models.V2ClusterUpdateParams{ @@ -117,9 +117,9 @@ var _ = Describe("Feature support levels API", func() { It("Update umn true fail on 4.13 with s390x with infra-env", func() { expectedError := "cannot use Cluster Managed Networking because it's not compatible with the s390x architecture on version 4.13" - cluster, err := registerNewCluster("4.13", "s390x", models.ClusterHighAvailabilityModeFull, swag.Bool(true)) + cluster, err := registerNewCluster("4.13", common.MultiCPUArchitecture, models.ClusterHighAvailabilityModeFull, swag.Bool(true)) Expect(err).NotTo(HaveOccurred()) - Expect(cluster.Payload.CPUArchitecture).To(Equal("multi")) + Expect(cluster.Payload.CPUArchitecture).To(Equal(common.MultiCPUArchitecture)) infraEnv, err := registerNewInfraEnv(cluster.Payload.ID, "4.13", "s390x") Expect(err).NotTo(HaveOccurred()) @@ -138,9 +138,9 @@ var _ = Describe("Feature support levels API", func() { It("Create infra-env after updating OLM operators on s390x architecture ", func() { expectedError := "cannot use OpenShift Virtualization because it's not compatible with the s390x architecture on version 4.13" - cluster, err := registerNewCluster("4.13", "s390x", models.ClusterHighAvailabilityModeFull, swag.Bool(true)) + cluster, err := registerNewCluster("4.13", common.MultiCPUArchitecture, models.ClusterHighAvailabilityModeFull, swag.Bool(true)) Expect(err).NotTo(HaveOccurred()) - Expect(cluster.Payload.CPUArchitecture).To(Equal("multi")) + Expect(cluster.Payload.CPUArchitecture).To(Equal(common.MultiCPUArchitecture)) _, err = user2BMClient.Installer.V2UpdateCluster(ctx, &installer.V2UpdateClusterParams{ ClusterUpdateParams: &models.V2ClusterUpdateParams{ @@ -212,13 +212,13 @@ var _ = Describe("Feature support levels API", func() { It("Register cluster won't fail on 4.13 with s390x", func() { cluster, err := registerNewCluster("4.13", "s390x", models.ClusterHighAvailabilityModeFull, swag.Bool(true)) Expect(err).NotTo(HaveOccurred()) - Expect(cluster.Payload.CPUArchitecture).To(Equal("multi")) + Expect(cluster.Payload.CPUArchitecture).To(Equal(common.S390xCPUArchitecture)) }) It("Register cluster won't fail on 4.13 with s390x without UMN", func() { cluster, err := registerNewCluster("4.13", "s390x", models.ClusterHighAvailabilityModeFull, nil) Expect(err).NotTo(HaveOccurred()) - Expect(cluster.Payload.CPUArchitecture).To(Equal("multi")) + Expect(cluster.Payload.CPUArchitecture).To(Equal(common.S390xCPUArchitecture)) }) It("SNO with s390x 4.10 fails on architecture- failure", func() { @@ -231,7 +231,7 @@ var _ = Describe("Feature support levels API", func() { It("SNO with s390x fails on SNO isn't compatible with architecture success on 4.13", func() { cluster, err := registerNewCluster("4.13", "s390x", models.ClusterHighAvailabilityModeNone, nil) Expect(err).NotTo(HaveOccurred()) - Expect(cluster.Payload.CPUArchitecture).To(Equal("multi")) + Expect(cluster.Payload.CPUArchitecture).To(Equal(common.S390xCPUArchitecture)) Expect(swag.StringValue(cluster.Payload.HighAvailabilityMode)).To(Equal(models.ClusterHighAvailabilityModeNone)) }) From 3d50ab056ad2cf2644819d84d8847dd9f7281e78 Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Fri, 19 Apr 2024 07:39:59 +0200 Subject: [PATCH 11/25] MGMT-17558: Allow installation on iSCSI volume (#6222) Open installation of OCP on iSCSI boot volume to all platforms. Remove `ip=ibft` from the kernel arguments as it prevent proper network configuration when several NICs are in use. RHCOS team recommend to leave DHCP configuration. Co-authored-by: Adrien Gentil --- internal/hardware/mock_validator.go | 8 +++--- internal/hardware/validator.go | 25 +++++++------------ internal/hardware/validator_test.go | 3 +-- internal/host/host_test.go | 2 +- internal/host/hostcommands/install_cmd.go | 2 +- .../host/hostcommands/install_cmd_test.go | 11 ++------ internal/host/transition_test.go | 2 +- internal/host/validations_test.go | 4 +-- internal/host/validator.go | 2 +- 9 files changed, 22 insertions(+), 37 deletions(-) diff --git a/internal/hardware/mock_validator.go b/internal/hardware/mock_validator.go index 083de79a49c3..286294ee27a6 100644 --- a/internal/hardware/mock_validator.go +++ b/internal/hardware/mock_validator.go @@ -156,17 +156,17 @@ func (mr *MockValidatorMockRecorder) GetPreflightInfraEnvHardwareRequirements(ct } // IsValidStorageDeviceType mocks base method. -func (m *MockValidator) IsValidStorageDeviceType(disk *models.Disk, hostArchitecture, openshiftVersion string, ociPlatformType bool) bool { +func (m *MockValidator) IsValidStorageDeviceType(disk *models.Disk, hostArchitecture, openshiftVersion string) bool { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IsValidStorageDeviceType", disk, hostArchitecture, openshiftVersion, ociPlatformType) + ret := m.ctrl.Call(m, "IsValidStorageDeviceType", disk, hostArchitecture, openshiftVersion) ret0, _ := ret[0].(bool) return ret0 } // IsValidStorageDeviceType indicates an expected call of IsValidStorageDeviceType. -func (mr *MockValidatorMockRecorder) IsValidStorageDeviceType(disk, hostArchitecture, openshiftVersion, ociPlatformType interface{}) *gomock.Call { +func (mr *MockValidatorMockRecorder) IsValidStorageDeviceType(disk, hostArchitecture, openshiftVersion interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsValidStorageDeviceType", reflect.TypeOf((*MockValidator)(nil).IsValidStorageDeviceType), disk, hostArchitecture, openshiftVersion, ociPlatformType) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsValidStorageDeviceType", reflect.TypeOf((*MockValidator)(nil).IsValidStorageDeviceType), disk, hostArchitecture, openshiftVersion) } // ListEligibleDisks mocks base method. diff --git a/internal/hardware/validator.go b/internal/hardware/validator.go index 16315b2815db..41136213ebfc 100644 --- a/internal/hardware/validator.go +++ b/internal/hardware/validator.go @@ -16,7 +16,6 @@ import ( "github.com/openshift/assisted-service/internal/feature" "github.com/openshift/assisted-service/internal/host/hostutil" "github.com/openshift/assisted-service/internal/operators" - "github.com/openshift/assisted-service/internal/provider/external" "github.com/openshift/assisted-service/internal/provider/registry" "github.com/openshift/assisted-service/models" "github.com/openshift/assisted-service/pkg/conversions" @@ -39,7 +38,7 @@ type Validator interface { GetInfraEnvHostRequirements(ctx context.Context, infraEnv *common.InfraEnv) (*models.ClusterHostRequirements, error) DiskIsEligible(ctx context.Context, disk *models.Disk, infraEnv *common.InfraEnv, cluster *common.Cluster, host *models.Host, hostArchitecture string, allDisks []*models.Disk) ([]string, error) ListEligibleDisks(inventory *models.Inventory) []*models.Disk - IsValidStorageDeviceType(disk *models.Disk, hostArchitecture string, openshiftVersion string, ociPlatformType bool) bool + IsValidStorageDeviceType(disk *models.Disk, hostArchitecture string, openshiftVersion string) bool GetInstallationDiskSpeedThresholdMs(ctx context.Context, cluster *common.Cluster, host *models.Host) (int64, error) // GetPreflightHardwareRequirements provides hardware (host) requirements that can be calculated only using cluster information. // Returned information describe requirements coming from OCP and OLM operators. @@ -133,13 +132,9 @@ func (v *validator) DiskIsEligible(ctx context.Context, disk *models.Disk, infra humanize.Bytes(uint64(disk.SizeBytes)), humanize.Bytes(uint64(minSizeBytes)))) } - ociPlatformType, err := external.IsOciHost(host) - if err != nil { - return nil, err - } - if !v.IsValidStorageDeviceType(disk, hostArchitecture, clusterVersion, ociPlatformType) { + if !v.IsValidStorageDeviceType(disk, hostArchitecture, clusterVersion) { notEligibleReasons = append(notEligibleReasons, - fmt.Sprintf(wrongDriveTypeTemplate, disk.DriveType, strings.Join(v.getValidDeviceStorageTypes(hostArchitecture, clusterVersion, ociPlatformType), ", "))) + fmt.Sprintf(wrongDriveTypeTemplate, disk.DriveType, strings.Join(v.getValidDeviceStorageTypes(hostArchitecture, clusterVersion), ", "))) } // We only allow multipath if all paths are FC @@ -158,8 +153,8 @@ func (v *validator) DiskIsEligible(ctx context.Context, disk *models.Disk, infra return notEligibleReasons, nil } -func (v *validator) IsValidStorageDeviceType(disk *models.Disk, hostArchitecture string, openshiftVersion string, ociPlatformType bool) bool { - return funk.ContainsString(v.getValidDeviceStorageTypes(hostArchitecture, openshiftVersion, ociPlatformType), string(disk.DriveType)) +func (v *validator) IsValidStorageDeviceType(disk *models.Disk, hostArchitecture string, openshiftVersion string) bool { + return funk.ContainsString(v.getValidDeviceStorageTypes(hostArchitecture, openshiftVersion), string(disk.DriveType)) } func (v *validator) purgeServiceReasons(reasons []string) []string { @@ -435,14 +430,12 @@ func (v *validator) getOCPRequirementsForVersion(openshiftVersion string) (*mode return v.VersionedRequirements.GetVersionedHostRequirements(openshiftVersion) } -func (v *validator) getValidDeviceStorageTypes(hostArchitecture string, openshiftVersion string, ociPlatformType bool) []string { +func (v *validator) getValidDeviceStorageTypes(hostArchitecture string, openshiftVersion string) []string { validTypes := []string{string(models.DriveTypeHDD), string(models.DriveTypeSSD), string(models.DriveTypeMultipath)} - if ociPlatformType { - isGreater, err := common.BaseVersionGreaterOrEqual("4.15.0", openshiftVersion) - if err == nil && isGreater { - validTypes = append(validTypes, string(models.DriveTypeISCSI)) - } + isGreater, err := common.BaseVersionGreaterOrEqual("4.15.0", openshiftVersion) + if err == nil && isGreater { + validTypes = append(validTypes, string(models.DriveTypeISCSI)) } if hostArchitecture == models.ClusterCPUArchitectureS390x { diff --git a/internal/hardware/validator_test.go b/internal/hardware/validator_test.go index dbf89771c115..42cd5f7d6dd8 100644 --- a/internal/hardware/validator_test.go +++ b/internal/hardware/validator_test.go @@ -160,11 +160,10 @@ var _ = Describe("Disk eligibility", func() { Expect(eligible).To(BeEmpty()) }) - It("Check if iSCSI is eligible only on newer OCI clusters", func() { + It("Check if iSCSI is eligible", func() { testDisk.DriveType = models.DriveTypeISCSI cluster.OpenshiftVersion = "4.15.0" hostInventory, _ := common.UnmarshalInventory(host.Inventory) - hostInventory.SystemVendor.Manufacturer = "OracleCloud.com" hw, _ := json.Marshal(&hostInventory) host.Inventory = string(hw) eligible, err := hwvalidator.DiskIsEligible(ctx, &testDisk, infraEnv, &cluster, &host, models.ClusterCPUArchitectureX8664, []*models.Disk{&testDisk}) diff --git a/internal/host/host_test.go b/internal/host/host_test.go index 066c7dc36874..b08a1c0a1261 100644 --- a/internal/host/host_test.go +++ b/internal/host/host_test.go @@ -4987,7 +4987,7 @@ var _ = Describe("disconnection - soft timeouts", func() { }, }) mockHwValidator.EXPECT().GetHostInstallationPath(gomock.Any()).Return("/dev/sda").AnyTimes() - mockHwValidator.EXPECT().IsValidStorageDeviceType(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(true).AnyTimes() + mockHwValidator.EXPECT().IsValidStorageDeviceType(gomock.Any(), gomock.Any(), gomock.Any()).Return(true).AnyTimes() mockProviderRegistry = registry.NewMockProviderRegistry(ctrl) mockProviderRegistry.EXPECT().IsHostSupported(gomock.Any(), gomock.Any()).Return(true, nil).AnyTimes() mockOperatorManager = operators.NewMockAPI(ctrl) diff --git a/internal/host/hostcommands/install_cmd.go b/internal/host/hostcommands/install_cmd.go index b849303891a6..557cbd1b3382 100644 --- a/internal/host/hostcommands/install_cmd.go +++ b/internal/host/hostcommands/install_cmd.go @@ -312,7 +312,7 @@ func constructHostInstallerArgs(cluster *common.Cluster, host *models.Host, inve installerArgs = append(installerArgs, "--append-karg", "root=/dev/disk/by-label/dm-mpath-root", "--append-karg", "rw", "--append-karg", "rd.multipath=default") } else if disk.DriveType == models.DriveTypeISCSI { // Currently only allowed on the OCI platform - installerArgs = append(installerArgs, "--append-karg", "rd.iscsi.firmware=1", "--append-karg", "ip=ibft") + installerArgs = append(installerArgs, "--append-karg", "rd.iscsi.firmware=1") } } } diff --git a/internal/host/hostcommands/install_cmd_test.go b/internal/host/hostcommands/install_cmd_test.go index c13e42b9e689..e195416f8dea 100644 --- a/internal/host/hostcommands/install_cmd_test.go +++ b/internal/host/hostcommands/install_cmd_test.go @@ -701,15 +701,8 @@ var _ = Describe("construct host install arguments", func() { Expect(err).NotTo(HaveOccurred()) Expect(args).To(BeEmpty()) }) - It("iSCSI installation disk on OCI", func() { + It("iSCSI installation disk", func() { cluster.MachineNetworks = []*models.MachineNetwork{{Cidr: "192.186.10.0/24"}} - cluster.Platform = &models.Platform{ - Type: common.PlatformTypePtr(models.PlatformTypeExternal), - External: &models.PlatformExternal{ - PlatformName: swag.String(common.ExternalPlatformNameOci), - CloudControllerManager: swag.String(models.PlatformExternalCloudControllerManagerExternal), - }, - } host.Inventory = fmt.Sprintf(`{ "disks":[ { @@ -731,7 +724,7 @@ var _ = Describe("construct host install arguments", func() { inventory, _ := common.UnmarshalInventory(host.Inventory) args, err := constructHostInstallerArgs(cluster, host, inventory, infraEnv, log) Expect(err).NotTo(HaveOccurred()) - Expect(args).To(Equal(`["--append-karg","rd.iscsi.firmware=1","--append-karg","ip=ibft"]`)) + Expect(args).To(Equal(`["--append-karg","rd.iscsi.firmware=1"]`)) }) It("ip=:dhcp6 added when machine CIDR is IPv6", func() { cluster.MachineNetworks = []*models.MachineNetwork{{Cidr: "2001:db8::/64"}} diff --git a/internal/host/transition_test.go b/internal/host/transition_test.go index 6aa8e7752946..696157be7d49 100644 --- a/internal/host/transition_test.go +++ b/internal/host/transition_test.go @@ -1578,7 +1578,7 @@ var _ = Describe("Refresh Host", func() { )).AnyTimes() mockDefaultClusterHostRequirements(mockHwValidator) - mockHwValidator.EXPECT().IsValidStorageDeviceType(gomock.Any(), gomock.Any(), "", false).Return(true).AnyTimes() + mockHwValidator.EXPECT().IsValidStorageDeviceType(gomock.Any(), gomock.Any(), "").Return(true).AnyTimes() mockHwValidator.EXPECT().ListEligibleDisks(gomock.Any()).Return([]*models.Disk{}).AnyTimes() mockHwValidator.EXPECT().GetHostInstallationPath(gomock.Any()).Return("/dev/sda").AnyTimes() } diff --git a/internal/host/validations_test.go b/internal/host/validations_test.go index cda6e509cbe0..ba64c423cbf2 100644 --- a/internal/host/validations_test.go +++ b/internal/host/validations_test.go @@ -84,7 +84,7 @@ var _ = Describe("Validations test", func() { mockAndRefreshStatusWithoutEvents := func(h *models.Host) { mockDefaultClusterHostRequirements(mockHwValidator) - mockHwValidator.EXPECT().IsValidStorageDeviceType(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(true).AnyTimes() + mockHwValidator.EXPECT().IsValidStorageDeviceType(gomock.Any(), gomock.Any(), gomock.Any()).Return(true).AnyTimes() mockHwValidator.EXPECT().ListEligibleDisks(gomock.Any()).Return([]*models.Disk{}).AnyTimes() mockHwValidator.EXPECT().GetHostInstallationPath(gomock.Any()).Return("/dev/sda").AnyTimes() mockOperators.EXPECT().ValidateHost(gomock.Any(), gomock.Any(), gomock.Any()).Return([]api.ValidationResult{ @@ -1615,7 +1615,7 @@ var _ = Describe("Validations test", func() { updateClusterPlatform() host = hostutil.GetHostFromDB(*host.ID, host.InfraEnvID, db).Host - mockHwValidator.EXPECT().IsValidStorageDeviceType(CDROM, models.ClusterCPUArchitectureX8664, "", false).Return(false).Times(1) + mockHwValidator.EXPECT().IsValidStorageDeviceType(CDROM, models.ClusterCPUArchitectureX8664, "").Return(false).Times(1) mockAndRefreshStatus(&host) host = hostutil.GetHostFromDB(*host.ID, host.InfraEnvID, db).Host status, _, _ := getValidationResult(host.ValidationsInfo, hostUUIDValidation) diff --git a/internal/host/validator.go b/internal/host/validator.go index 8e82c6cd8eda..e7de81a2190b 100644 --- a/internal/host/validator.go +++ b/internal/host/validator.go @@ -1678,7 +1678,7 @@ func (v *validator) isVSphereDiskUUIDEnabled(c *validationContext) (ValidationSt // if any of them doesn't have that flag, it's likely because the user has forgotten to // enable `disk.EnableUUID` for this virtual machine // See https://access.redhat.com/solutions/4606201 - if v.hwValidator.IsValidStorageDeviceType(disk, c.inventory.CPU.Architecture, "", false) && !disk.HasUUID { + if v.hwValidator.IsValidStorageDeviceType(disk, c.inventory.CPU.Architecture, "") && !disk.HasUUID { return ValidationFailure, "VSphere disk.EnableUUID isn't enabled for this virtual machine, it's necessary for disks to be mounted properly" } } From be095a13e4e5e0082f96eae7c8489c28f2a364c3 Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Fri, 19 Apr 2024 12:45:05 +0200 Subject: [PATCH 12/25] NO-ISSUE: Change only-latest api response to compare versions according to pre-release suffix as well instead of just base version (#6226) Co-authored-by: danmanor --- internal/common/version.go | 12 ------ internal/common/version_test.go | 13 ------- internal/versions/api.go | 13 ++++--- internal/versions/api_test.go | 68 ++++++++++++++++++++++++++++++++- 4 files changed, 74 insertions(+), 32 deletions(-) diff --git a/internal/common/version.go b/internal/common/version.go index 4b3ebc07bd7d..3f167787f150 100644 --- a/internal/common/version.go +++ b/internal/common/version.go @@ -69,18 +69,6 @@ func BaseVersionEqual(version1, versionMayEqual string) (bool, error) { return *majorMinorVersion1 == *majorMinorVersionMayEqual, nil } -func MajorMinorPatchEqual(firstVersion, secondVersion string) (*bool, error) { - if GetVersionFormat(firstVersion) != MajorMinorPatchVersion { - return nil, fmt.Errorf("version '%s' is not in the form of major.minor.patch or major.minor.patch-", firstVersion) - } - - if GetVersionFormat(secondVersion) != MajorMinorPatchVersion { - return nil, fmt.Errorf("version '%s' is not in the form of major.minor.patch or major.minor.patch-", secondVersion) - } - - return swag.Bool(strings.Split(firstVersion, "-")[0] == strings.Split(secondVersion, "-")[0]), nil -} - func GetMajorMinorVersion(version string) (*string, error) { version = strings.Split(version, "-")[0] splittedVersion := strings.Split(version, ".") diff --git a/internal/common/version_test.go b/internal/common/version_test.go index 81e760e666cd..2c55792736a9 100644 --- a/internal/common/version_test.go +++ b/internal/common/version_test.go @@ -143,16 +143,3 @@ var _ = DescribeTable("GetVersionFormat", func(input string, expectedVersionForm Entry("empty version", "", NoneVersion), Entry("non-version string", "non-version", NoneVersion), ) - -var _ = DescribeTable("MajorMinorPatchEqual", func(firstVersion string, secondVersion string, ExpectedResult *bool) { - isEqual, _ := MajorMinorPatchEqual(firstVersion, secondVersion) - Expect(isEqual).To(Equal(ExpectedResult)) -}, - Entry("two equal x.y.z versions", "4.11.0", "4.11.0", swag.Bool(true)), - Entry("two not unequal x.y.z versions", "4.11.0", "4.11.1", swag.Bool(false)), - Entry("one x.y.z version and one x.y.z-something version, equal", "4.11.0", "4.11.0-alpha", swag.Bool(true)), - Entry("one x.y.z version and one x.y.z-something version, unequal", "4.11.0", "4.12.0-alpha", swag.Bool(false)), - Entry("majorMinorVersions", "4.11", "4.11", nil), - Entry("majorVersions", "4", "4", nil), - Entry("malformed versions", "foobar", "foobar", nil), -) diff --git a/internal/versions/api.go b/internal/versions/api.go index c5a12d4af467..165dffde0b01 100644 --- a/internal/versions/api.go +++ b/internal/versions/api.go @@ -98,16 +98,17 @@ func getLatestReleaseImagesForMajorMinor(releaseImages models.ReleaseImages, maj } // If it is the same version but different CPU architecture, add the atchitecture to the list. - isEqual, err := common.MajorMinorPatchEqual(*releaseImage.Version, *latestReleaseImages[0].Version) - if err != nil { - return nil, err - } - if *isEqual && !funk.Contains(latestReleaseImages, releaseImage) { + // We omit the "-multi" suffix if it exists so multi will be considered the same version. + if strings.TrimSuffix(*releaseImage.Version, "-multi") == strings.TrimSuffix(*latestReleaseImages[0].Version, "-multi") && + !funk.Contains(latestReleaseImages, releaseImage) { latestReleaseImages = append(latestReleaseImages, releaseImage) continue } - isNewest, err := common.BaseVersionLessThan(*releaseImage.Version, *latestReleaseImages[0].Version) + isNewest, err := common.VersionGreaterOrEqual( + strings.TrimSuffix(*releaseImage.Version, "-multi"), + strings.TrimSuffix(*latestReleaseImages[0].Version, "-multi"), + ) if err != nil { return nil, err } diff --git a/internal/versions/api_test.go b/internal/versions/api_test.go index eabb270a5ad4..2743c20e5f41 100644 --- a/internal/versions/api_test.go +++ b/internal/versions/api_test.go @@ -570,6 +570,30 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { Version: swag.String("4.13.2-multi"), SupportLevel: models.OpenshiftVersionSupportLevelBeta, }, + { + CPUArchitecture: swag.String(common.X86CPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture}, + OpenshiftVersion: swag.String("4.14"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.0-ec.2-x86_64"), + Version: swag.String("4.14.0-ec.2"), + SupportLevel: models.OpenshiftVersionSupportLevelBeta, + }, + { + CPUArchitecture: swag.String(common.X86CPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture}, + OpenshiftVersion: swag.String("4.14"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.0-ec.3-x86_64"), + Version: swag.String("4.14.0-ec.3"), + SupportLevel: models.OpenshiftVersionSupportLevelBeta, + }, + { + CPUArchitecture: swag.String(common.MultiCPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + OpenshiftVersion: swag.String("4.14-multi"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.0-ec.3-multi"), + Version: swag.String("4.14.0-ec.3-multi"), + SupportLevel: models.OpenshiftVersionSupportLevelBeta, + }, } osImages := osImageList{ @@ -607,7 +631,19 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { OpenshiftVersion: swag.String("4.13"), CPUArchitecture: swag.String(common.ARM64CPUArchitecture), URL: swag.String("https://mirror.openshift.com/pub/openshift-v4/aarch64/dependencies/rhcos/4.13/4.13.48/rhcos-4.13.48-aarch64-live.aarch64.iso"), - Version: swag.String("411.86.202308081056-0"), + Version: swag.String("413.86.202308081056-0"), + }, + { + OpenshiftVersion: swag.String("4.14"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + URL: swag.String("https://mirror.openshift.com/pub/openshift-v4/x86_64/dependencies/rhcos/4.14/4.14.48/rhcos-4.14.48-x86_64-live.x86_64.iso"), + Version: swag.String("414.86.202308081056-0"), + }, + { + OpenshiftVersion: swag.String("4.14"), + CPUArchitecture: swag.String(common.ARM64CPUArchitecture), + URL: swag.String("https://mirror.openshift.com/pub/openshift-v4/aarch64/dependencies/rhcos/4.14/4.14.48/rhcos-4.14.48-aarch64-live.aarch64.iso"), + Version: swag.String("414.86.202308081056-0"), }, } @@ -672,6 +708,24 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), Default: false, }, + "4.14.0-ec.2": { + DisplayName: swag.String("4.14.0-ec.2"), + CPUArchitectures: []string{common.X86CPUArchitecture}, + SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), + Default: false, + }, + "4.14.0-ec.3": { + DisplayName: swag.String("4.14.0-ec.3"), + CPUArchitectures: []string{common.X86CPUArchitecture}, + SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), + Default: false, + }, + "4.14.0-ec.3-multi": { + DisplayName: swag.String("4.14.0-ec.3-multi"), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), + Default: false, + }, } reply := handler.V2ListSupportedOpenshiftVersions( @@ -714,6 +768,18 @@ var _ = Describe("V2ListSupportedOpenshiftVersions", func() { SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), Default: false, }, + "4.14.0-ec.3": { + DisplayName: swag.String("4.14.0-ec.3"), + CPUArchitectures: []string{common.X86CPUArchitecture}, + SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), + Default: false, + }, + "4.14.0-ec.3-multi": { + DisplayName: swag.String("4.14.0-ec.3-multi"), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + SupportLevel: swag.String(models.OpenshiftVersionSupportLevelBeta), + Default: false, + }, } reply := handler.V2ListSupportedOpenshiftVersions( From f022a080f3257474a474f0c541b72335a7bbe179 Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Sun, 21 Apr 2024 15:19:33 +0200 Subject: [PATCH 13/25] MGMT-17620: Change the way release images are handled in RestAPI flow to retrieve multiarch release image in case a multi-arch OpenShift version, single-arch requested and it exist. (#6229) Co-authored-by: danmanor --- internal/versions/rest_api_versions.go | 25 +-- internal/versions/rest_api_versions_test.go | 182 +++++++++++--------- subsystem/cluster_v2_test.go | 4 +- subsystem/feature_support_levels_test.go | 6 +- subsystem/operators_test.go | 2 +- 5 files changed, 115 insertions(+), 104 deletions(-) diff --git a/internal/versions/rest_api_versions.go b/internal/versions/rest_api_versions.go index 10e52814cb09..561a4e68931a 100644 --- a/internal/versions/rest_api_versions.go +++ b/internal/versions/rest_api_versions.go @@ -2,13 +2,11 @@ package versions import ( context "context" - "fmt" "strings" "sync" "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" - "github.com/lib/pq" "github.com/openshift/assisted-service/internal/common" "github.com/openshift/assisted-service/internal/oc" models "github.com/openshift/assisted-service/models" @@ -47,19 +45,14 @@ func (h *restAPIVersionsHandler) GetReleaseImage(_ context.Context, openshiftVer } query := h.db.Session(&gorm.Session{}).Where(&models.ReleaseImage{}) - if cpuArchitecture == common.MultiCPUArchitecture { - query = query.Where("cardinality(cpu_architectures) > 1") - } else { - query = query.Where(h.db.Session(&gorm.Session{}). - Where("cpu_architectures @> ? AND ? @> cpu_architectures", pq.StringArray{cpuArchitecture}, pq.StringArray{cpuArchitecture}). - Or("cpu_architecture = ?", cpuArchitecture)) - } + query = query.Where(h.db.Session(&gorm.Session{}). + Where("? = Any(cpu_architectures)", cpuArchitecture). + Or("cpu_architecture = ?", cpuArchitecture), + ) // Find the exact version if versionFormat == common.MajorMinorPatchVersion { - query = query.Where(h.db.Session(&gorm.Session{}). - Where("version = ?", openshiftVersion). - Or("version = ?", openshiftVersion+"-multi")) + query = query.Where("version = ?", openshiftVersion) var releaseImage models.ReleaseImage err := query.Take(&releaseImage).Error if err != nil { @@ -79,19 +72,13 @@ func (h *restAPIVersionsHandler) GetReleaseImage(_ context.Context, openshiftVer // openshiftVersion must be major.minor, find the latest version matching - // In case openshiftVersion is in the format of major.minor-multi - editedVersion := strings.TrimSuffix(openshiftVersion, "-multi") - + query = query.Where("openshift_version = ?", openshiftVersion) var releaseImages models.ReleaseImages err := query.Find(&releaseImages).Error if err != nil { return nil, err } - releaseImages = funk.Filter(releaseImages, func(releaseImage *models.ReleaseImage) bool { - return strings.HasPrefix(*releaseImage.Version, fmt.Sprintf("%s.", editedVersion)) - }).([]*models.ReleaseImage) - if len(releaseImages) == 0 { return nil, errors.Errorf("no release image found for openshiftVersion: '%s' and CPU architecture '%s'", openshiftVersion, cpuArchitecture) } diff --git a/internal/versions/rest_api_versions_test.go b/internal/versions/rest_api_versions_test.go index ece86e3e4cb1..429e5f95dc95 100644 --- a/internal/versions/rest_api_versions_test.go +++ b/internal/versions/rest_api_versions_test.go @@ -65,7 +65,7 @@ var _ = Describe("GetReleaseImage", func() { Expect(releaseImage).Should(BeNil()) }) - It("gets the latest matching release image with major.minor openshiftVersion", func() { + It("gets the latest matching release image with major.minor openshiftVersion - production support level, multi appears after", func() { releaseImages := models.ReleaseImages{ { OpenshiftVersion: swag.String("4.14"), @@ -85,58 +85,124 @@ var _ = Describe("GetReleaseImage", func() { SupportLevel: models.ReleaseImageSupportLevelProduction, Default: false, }, + { + OpenshiftVersion: swag.String("4.14-multi"), + Version: swag.String("4.14.2-multi"), + CPUArchitecture: swag.String(common.MultiCPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.2-multi"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + Default: false, + }, { OpenshiftVersion: swag.String("4.14"), Version: swag.String("4.14.3"), CPUArchitecture: swag.String(common.X86CPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture}, URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.3-x86_64"), - SupportLevel: models.OpenshiftVersionSupportLevelBeta, + SupportLevel: models.ReleaseImageSupportLevelProduction, Default: false, }, { OpenshiftVersion: swag.String("4.14"), - Version: swag.String("4.14.3"), + Version: swag.String("4.14.4"), CPUArchitecture: swag.String(common.ARM64CPUArchitecture), CPUArchitectures: []string{common.ARM64CPUArchitecture}, - URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.3-aarch64"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.4-aarch64"), SupportLevel: models.ReleaseImageSupportLevelProduction, Default: false, }, + } + + err := db.Create(releaseImages).Error + Expect(err).ShouldNot(HaveOccurred()) + + releaseImage, err := handler.GetReleaseImage(ctx, "4.14", common.X86CPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.14.3")) // latest with matching CPU arch + + releaseImage, err = handler.GetReleaseImage(ctx, "4.14", common.MultiCPUArchitecture, pullSecret) + Expect(err).Should(HaveOccurred()) // The version doesn't match + Expect(releaseImage).To(BeNil()) + + releaseImage, err = handler.GetReleaseImage(ctx, "4.14-multi", common.X86CPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.14.2-multi")) // latest multi release image, single arch requested + + releaseImage, err = handler.GetReleaseImage(ctx, "4.14-multi", common.S390xCPUArchitecture, pullSecret) + Expect(err).Should(HaveOccurred()) // No CPU architecture match + Expect(releaseImage).To(BeNil()) + + releaseImage, err = handler.GetReleaseImage(ctx, "4.14-multi", common.MultiCPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.14.2-multi")) // latest multi release image, multi arch requested + }) + + It("gets the latest matching release image with major.minor openshiftVersion - some production and some beta support level, multi appears before", func() { + releaseImages := models.ReleaseImages{ { - OpenshiftVersion: swag.String("4.14-multi"), - Version: swag.String("4.14.3-multi"), + OpenshiftVersion: swag.String("4.15"), + Version: swag.String("4.15.1"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.15.1-x86_64"), + SupportLevel: models.ReleaseImageSupportLevelProduction, + Default: false, + }, + { + OpenshiftVersion: swag.String("4.15-multi"), + Version: swag.String("4.15.1-multi"), CPUArchitecture: swag.String(common.MultiCPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, - URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.3-multi"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.15.1-multi"), SupportLevel: models.ReleaseImageSupportLevelProduction, Default: false, }, { OpenshiftVersion: swag.String("4.15"), - Version: swag.String("4.15.1"), + Version: swag.String("4.15.2"), CPUArchitecture: swag.String(common.X86CPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture}, - URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.15.1-x86_64"), - SupportLevel: models.OpenshiftVersionSupportLevelBeta, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.15.2-x86_64"), + SupportLevel: models.ReleaseImageSupportLevelProduction, Default: false, }, { OpenshiftVersion: swag.String("4.15"), - Version: swag.String("4.15.2"), + Version: swag.String("4.15.3"), CPUArchitecture: swag.String(common.X86CPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture}, - URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.15.2-x86_64"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.15.3-x86_64"), SupportLevel: models.OpenshiftVersionSupportLevelBeta, Default: false, }, + } + + err := db.Create(releaseImages).Error + Expect(err).ShouldNot(HaveOccurred()) + + releaseImage, err := handler.GetReleaseImage(ctx, "4.15", common.X86CPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.15.2")) // latest non-beta matching CPU architecture + + releaseImage, err = handler.GetReleaseImage(ctx, "4.15-multi", common.X86CPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.15.1-multi")) // latest matching multi when multi appears before + + releaseImage, err = handler.GetReleaseImage(ctx, "4.15-multi", common.MultiCPUArchitecture, pullSecret) + Expect(err).ShouldNot(HaveOccurred()) + Expect(*releaseImage.Version).Should(Equal("4.15.1-multi")) + }) + + It("gets the latest matching release image with major.minor openshiftVersion - all beta support level", func() { + releaseImages := models.ReleaseImages{ { OpenshiftVersion: swag.String("4.16-multi"), Version: swag.String("4.16.1-multi"), CPUArchitecture: swag.String(common.MultiCPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.1-multi"), - SupportLevel: models.ReleaseImageSupportLevelProduction, + SupportLevel: models.OpenshiftVersionSupportLevelBeta, Default: false, }, { @@ -145,7 +211,16 @@ var _ = Describe("GetReleaseImage", func() { CPUArchitecture: swag.String(common.X86CPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture}, URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.1-x86_64"), - SupportLevel: models.ReleaseImageSupportLevelProduction, + SupportLevel: models.OpenshiftVersionSupportLevelBeta, + Default: false, + }, + { + OpenshiftVersion: swag.String("4.16"), + Version: swag.String("4.16.2"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.2-x86_64"), + SupportLevel: models.OpenshiftVersionSupportLevelBeta, Default: false, }, } @@ -153,17 +228,17 @@ var _ = Describe("GetReleaseImage", func() { err := db.Create(releaseImages).Error Expect(err).ShouldNot(HaveOccurred()) - releaseImage, err := handler.GetReleaseImage(ctx, "4.14", common.X86CPUArchitecture, pullSecret) + releaseImage, err := handler.GetReleaseImage(ctx, "4.16", common.X86CPUArchitecture, pullSecret) Expect(err).ShouldNot(HaveOccurred()) - Expect(*releaseImage.Version).Should(Equal("4.14.2")) + Expect(*releaseImage.Version).Should(Equal("4.16.2")) - releaseImage, err = handler.GetReleaseImage(ctx, "4.15", common.X86CPUArchitecture, pullSecret) + releaseImage, err = handler.GetReleaseImage(ctx, "4.16-multi", common.X86CPUArchitecture, pullSecret) Expect(err).ShouldNot(HaveOccurred()) - Expect(*releaseImage.Version).Should(Equal("4.15.2")) + Expect(*releaseImage.Version).Should(Equal("4.16.1-multi")) - releaseImage, err = handler.GetReleaseImage(ctx, "4.16", common.X86CPUArchitecture, pullSecret) + releaseImage, err = handler.GetReleaseImage(ctx, "4.16-multi", common.MultiCPUArchitecture, pullSecret) Expect(err).ShouldNot(HaveOccurred()) - Expect(*releaseImage.Version).Should(Equal("4.16.1")) + Expect(*releaseImage.Version).Should(Equal("4.16.1-multi")) }) It("gets the exact matching release image with major.minor.patch / prerelease openshiftVersion", func() { @@ -348,68 +423,17 @@ var _ = Describe("GetReleaseImage", func() { Expect(*releaseImage.Version).Should(Equal("4.14.1-multi")) }) - It("gets successfully image using major.minor.patch openshiftVersion in multiarch query - without multi suffix", func() { - releaseImages := models.ReleaseImages{ - { - OpenshiftVersion: swag.String("4.14-multi"), - Version: swag.String("4.14.1-multi"), - CPUArchitecture: swag.String(common.MultiCPUArchitecture), - CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, - URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.1-multi"), - SupportLevel: models.ReleaseImageSupportLevelProduction, - Default: false, - }, - { - OpenshiftVersion: swag.String("4.14-multi"), - Version: swag.String("4.14.2-multi"), - CPUArchitecture: swag.String(common.MultiCPUArchitecture), - CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, - URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.2-multi"), - SupportLevel: models.ReleaseImageSupportLevelProduction, - Default: false, - }, - } - - err := db.Create(releaseImages).Error - Expect(err).ShouldNot(HaveOccurred()) - - releaseImage, err := handler.GetReleaseImage(ctx, "4.14.1", common.MultiCPUArchitecture, pullSecret) - Expect(err).ShouldNot(HaveOccurred()) - Expect(*releaseImage.Version).Should(Equal("4.14.1-multi")) - }) - - It("gets successfully image using major.minor openshiftVersion in multiarch query - with multi suffix", func() { + It("gets successfully image using major.minor.patch openshiftVersion in single arch query - with multi suffix", func() { releaseImages := models.ReleaseImages{ { - OpenshiftVersion: swag.String("4.14-multi"), - Version: swag.String("4.14.1-multi"), - CPUArchitecture: swag.String(common.MultiCPUArchitecture), - CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, - URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.1-multi"), - SupportLevel: models.ReleaseImageSupportLevelProduction, - Default: false, - }, - { - OpenshiftVersion: swag.String("4.14-multi"), - Version: swag.String("4.14.2-multi"), - CPUArchitecture: swag.String(common.MultiCPUArchitecture), - CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, - URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.2-multi"), + OpenshiftVersion: swag.String("4.14"), + Version: swag.String("4.14.1"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.14.1-x86_64"), SupportLevel: models.ReleaseImageSupportLevelProduction, Default: false, }, - } - - err := db.Create(releaseImages).Error - Expect(err).ShouldNot(HaveOccurred()) - - releaseImage, err := handler.GetReleaseImage(ctx, "4.14-multi", common.MultiCPUArchitecture, pullSecret) - Expect(err).ShouldNot(HaveOccurred()) - Expect(*releaseImage.Version).Should(Equal("4.14.2-multi")) - }) - - It("gets successfully image using major.minor openshiftVersion in multiarch query - without multi suffix", func() { - releaseImages := models.ReleaseImages{ { OpenshiftVersion: swag.String("4.14-multi"), Version: swag.String("4.14.1-multi"), @@ -433,9 +457,9 @@ var _ = Describe("GetReleaseImage", func() { err := db.Create(releaseImages).Error Expect(err).ShouldNot(HaveOccurred()) - releaseImage, err := handler.GetReleaseImage(ctx, "4.14", common.MultiCPUArchitecture, pullSecret) + releaseImage, err := handler.GetReleaseImage(ctx, "4.14.1-multi", common.X86CPUArchitecture, pullSecret) Expect(err).ShouldNot(HaveOccurred()) - Expect(*releaseImage.Version).Should(Equal("4.14.2-multi")) + Expect(*releaseImage.Version).Should(Equal("4.14.1-multi")) }) It("gets successfully image using major.minor.patch openshiftVersion in multiarch query with different version format", func() { diff --git a/subsystem/cluster_v2_test.go b/subsystem/cluster_v2_test.go index 305a0ae71a76..ea7e77118d7a 100644 --- a/subsystem/cluster_v2_test.go +++ b/subsystem/cluster_v2_test.go @@ -540,11 +540,11 @@ var _ = Describe("[V2ClusterTests] multiarch", func() { clusterReq, err := user2BMClient.Installer.V2RegisterCluster(ctx, &installer.V2RegisterClusterParams{ NewClusterParams: &models.ClusterCreateParams{ Name: swag.String("test-cluster"), - OpenshiftVersion: swag.String("4.12"), + OpenshiftVersion: swag.String("4.12-multi"), PullSecret: swag.String(fmt.Sprintf(psTemplate, FakePS2)), BaseDNSDomain: "example.com", UserManagedNetworking: swag.Bool(true), - CPUArchitecture: common.MultiCPUArchitecture, + CPUArchitecture: common.S390xCPUArchitecture, }, }) Expect(err).NotTo(HaveOccurred()) diff --git a/subsystem/feature_support_levels_test.go b/subsystem/feature_support_levels_test.go index 3f088e5b885a..36baf2da57aa 100644 --- a/subsystem/feature_support_levels_test.go +++ b/subsystem/feature_support_levels_test.go @@ -102,7 +102,7 @@ var _ = Describe("Feature support levels API", func() { Context("Update cluster", func() { It("Update umn true won't fail on 4.13 with multi release without infra-env", func() { - cluster, err := registerNewCluster("4.13", common.MultiCPUArchitecture, models.ClusterHighAvailabilityModeFull, swag.Bool(true)) + cluster, err := registerNewCluster("4.13-multi", common.MultiCPUArchitecture, models.ClusterHighAvailabilityModeFull, swag.Bool(true)) Expect(err).NotTo(HaveOccurred()) Expect(cluster.Payload.CPUArchitecture).To(Equal(common.MultiCPUArchitecture)) @@ -117,7 +117,7 @@ var _ = Describe("Feature support levels API", func() { It("Update umn true fail on 4.13 with s390x with infra-env", func() { expectedError := "cannot use Cluster Managed Networking because it's not compatible with the s390x architecture on version 4.13" - cluster, err := registerNewCluster("4.13", common.MultiCPUArchitecture, models.ClusterHighAvailabilityModeFull, swag.Bool(true)) + cluster, err := registerNewCluster("4.13-multi", common.S390xCPUArchitecture, models.ClusterHighAvailabilityModeFull, swag.Bool(true)) Expect(err).NotTo(HaveOccurred()) Expect(cluster.Payload.CPUArchitecture).To(Equal(common.MultiCPUArchitecture)) @@ -138,7 +138,7 @@ var _ = Describe("Feature support levels API", func() { It("Create infra-env after updating OLM operators on s390x architecture ", func() { expectedError := "cannot use OpenShift Virtualization because it's not compatible with the s390x architecture on version 4.13" - cluster, err := registerNewCluster("4.13", common.MultiCPUArchitecture, models.ClusterHighAvailabilityModeFull, swag.Bool(true)) + cluster, err := registerNewCluster("4.13-multi", common.S390xCPUArchitecture, models.ClusterHighAvailabilityModeFull, swag.Bool(true)) Expect(err).NotTo(HaveOccurred()) Expect(cluster.Payload.CPUArchitecture).To(Equal(common.MultiCPUArchitecture)) diff --git a/subsystem/operators_test.go b/subsystem/operators_test.go index bf65ed49573b..a9888b77a0e4 100644 --- a/subsystem/operators_test.go +++ b/subsystem/operators_test.go @@ -317,7 +317,7 @@ var _ = Describe("Operators endpoint tests", func() { swag.String(models.ClusterCPUArchitectureArm64), nil, ) - Expect(cluster.Payload.CPUArchitecture).To(Equal(models.ClusterCPUArchitectureArm64)) + Expect(cluster.Payload.CPUArchitecture).To(Equal(common.MultiCPUArchitecture)) Expect(len(cluster.Payload.MonitoredOperators)).To(Equal(1)) infraEnvParams := installer.RegisterInfraEnvParams{ From 34e93899b0704f9764240d8c273dd80c59bdface Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Wed, 8 May 2024 10:51:21 +0200 Subject: [PATCH 14/25] MGMT-17764: Update the latest image search functionality in the RestAPI flow to correctly compare pre-release versions (#6286) Co-authored-by: danmanor --- internal/versions/rest_api_versions.go | 5 ++- internal/versions/rest_api_versions_test.go | 42 +++++++++++++++------ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/internal/versions/rest_api_versions.go b/internal/versions/rest_api_versions.go index 561a4e68931a..8ec2a15e930c 100644 --- a/internal/versions/rest_api_versions.go +++ b/internal/versions/rest_api_versions.go @@ -167,7 +167,10 @@ func getLatestReleaseImage(releaseImages models.ReleaseImages, ignoredOpenshiftV continue } - isLatest, err := common.BaseVersionLessThan(*releaseImage.Version, *latestReleaseImage.Version) + isLatest, err := common.VersionGreaterOrEqual( + strings.TrimSuffix(*releaseImage.Version, "-multi"), + strings.TrimSuffix(*latestReleaseImage.Version, "-multi"), + ) if err != nil { return nil, err } diff --git a/internal/versions/rest_api_versions_test.go b/internal/versions/rest_api_versions_test.go index 429e5f95dc95..1a2a7f9b14cc 100644 --- a/internal/versions/rest_api_versions_test.go +++ b/internal/versions/rest_api_versions_test.go @@ -197,29 +197,47 @@ var _ = Describe("GetReleaseImage", func() { It("gets the latest matching release image with major.minor openshiftVersion - all beta support level", func() { releaseImages := models.ReleaseImages{ { - OpenshiftVersion: swag.String("4.16-multi"), - Version: swag.String("4.16.1-multi"), - CPUArchitecture: swag.String(common.MultiCPUArchitecture), - CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, - URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.1-multi"), + OpenshiftVersion: swag.String("4.16"), + Version: swag.String("4.16.0-ec.2"), + CPUArchitecture: swag.String(common.X86CPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.0-ec.2-x86_64"), SupportLevel: models.OpenshiftVersionSupportLevelBeta, Default: false, }, { OpenshiftVersion: swag.String("4.16"), - Version: swag.String("4.16.1"), + Version: swag.String("4.16.0-ec.3"), CPUArchitecture: swag.String(common.X86CPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture}, - URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.1-x86_64"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.0-ec.3-x86_64"), + SupportLevel: models.OpenshiftVersionSupportLevelBeta, + Default: false, + }, + { + OpenshiftVersion: swag.String("4.16-multi"), + Version: swag.String("4.16.0-ec.3-multi"), + CPUArchitecture: swag.String(common.MultiCPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.0-ec.3-multi"), + SupportLevel: models.OpenshiftVersionSupportLevelBeta, + Default: false, + }, + { + OpenshiftVersion: swag.String("4.16-multi"), + Version: swag.String("4.16.0-ec.1-multi"), + CPUArchitecture: swag.String(common.MultiCPUArchitecture), + CPUArchitectures: []string{common.X86CPUArchitecture, common.ARM64CPUArchitecture}, + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.0-ec.1-multi"), SupportLevel: models.OpenshiftVersionSupportLevelBeta, Default: false, }, { OpenshiftVersion: swag.String("4.16"), - Version: swag.String("4.16.2"), + Version: swag.String("4.16.0-ec.1"), CPUArchitecture: swag.String(common.X86CPUArchitecture), CPUArchitectures: []string{common.X86CPUArchitecture}, - URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.2-x86_64"), + URL: swag.String("quay.io/openshift-release-dev/ocp-release:4.16.0-ec.1-x86_64"), SupportLevel: models.OpenshiftVersionSupportLevelBeta, Default: false, }, @@ -230,15 +248,15 @@ var _ = Describe("GetReleaseImage", func() { releaseImage, err := handler.GetReleaseImage(ctx, "4.16", common.X86CPUArchitecture, pullSecret) Expect(err).ShouldNot(HaveOccurred()) - Expect(*releaseImage.Version).Should(Equal("4.16.2")) + Expect(*releaseImage.Version).Should(Equal("4.16.0-ec.3")) releaseImage, err = handler.GetReleaseImage(ctx, "4.16-multi", common.X86CPUArchitecture, pullSecret) Expect(err).ShouldNot(HaveOccurred()) - Expect(*releaseImage.Version).Should(Equal("4.16.1-multi")) + Expect(*releaseImage.Version).Should(Equal("4.16.0-ec.3-multi")) releaseImage, err = handler.GetReleaseImage(ctx, "4.16-multi", common.MultiCPUArchitecture, pullSecret) Expect(err).ShouldNot(HaveOccurred()) - Expect(*releaseImage.Version).Should(Equal("4.16.1-multi")) + Expect(*releaseImage.Version).Should(Equal("4.16.0-ec.3-multi")) }) It("gets the exact matching release image with major.minor.patch / prerelease openshiftVersion", func() { From 86298d37428b0e755c0ec1586c549856dd23b5cb Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Thu, 9 May 2024 13:34:24 +0200 Subject: [PATCH 15/25] MGMT-17775: Ensure that patch manifest filenames are consistent and correct (#6303) This PR addresses a few bugs in docs, regexes and code that cause inconsistency in the handling of patch manifests. Patch manifests should end with the extension `.patch` or should end with a suffixed patch extension such as `.patch_extension` Co-authored-by: Paul Maidment --- .../models/create_manifest_params.go | 4 +- .../models/update_manifest_params.go | 8 ++-- .../models/create_manifest_params.go | 4 +- .../models/update_manifest_params.go | 8 ++-- docs/user-guide/install-customization.md | 3 +- internal/manifests/manifests.go | 2 +- internal/manifests/manifests_test.go | 47 ++++++++++++++++++- models/create_manifest_params.go | 4 +- models/update_manifest_params.go | 8 ++-- restapi/embedded_spec.go | 12 ++--- swagger.yaml | 6 +-- .../models/create_manifest_params.go | 4 +- .../models/update_manifest_params.go | 8 ++-- 13 files changed, 81 insertions(+), 37 deletions(-) diff --git a/api/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go b/api/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go index 6bd6bd2bdc9a..edbaa3ab75c6 100644 --- a/api/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go +++ b/api/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go @@ -26,7 +26,7 @@ type CreateManifestParams struct { // The name of the manifest to customize the installed OCP cluster. // Required: true - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ FileName *string `json:"file_name"` // The folder that contains the files. Manifests can be placed in 'manifests' or 'openshift' directories. @@ -71,7 +71,7 @@ func (m *CreateManifestParams) validateFileName(formats strfmt.Registry) error { return err } - if err := validate.Pattern("file_name", "body", *m.FileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("file_name", "body", *m.FileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } diff --git a/api/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go b/api/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go index 662d9a5aedef..9606db2aa74e 100644 --- a/api/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go +++ b/api/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go @@ -22,7 +22,7 @@ type UpdateManifestParams struct { // The file name for the manifest to modify. // Required: true - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ FileName string `json:"file_name"` // The folder for the manifest to modify. @@ -34,7 +34,7 @@ type UpdateManifestParams struct { UpdatedContent *string `json:"updated_content,omitempty"` // The new file name for the manifest. - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ UpdatedFileName *string `json:"updated_file_name,omitempty"` // The new folder for the manifest. Manifests can be placed in 'manifests' or 'openshift' directories. @@ -74,7 +74,7 @@ func (m *UpdateManifestParams) validateFileName(formats strfmt.Registry) error { return err } - if err := validate.Pattern("file_name", "body", m.FileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("file_name", "body", m.FileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } @@ -129,7 +129,7 @@ func (m *UpdateManifestParams) validateUpdatedFileName(formats strfmt.Registry) return nil } - if err := validate.Pattern("updated_file_name", "body", *m.UpdatedFileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("updated_file_name", "body", *m.UpdatedFileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } diff --git a/client/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go b/client/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go index 6bd6bd2bdc9a..edbaa3ab75c6 100644 --- a/client/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go +++ b/client/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go @@ -26,7 +26,7 @@ type CreateManifestParams struct { // The name of the manifest to customize the installed OCP cluster. // Required: true - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ FileName *string `json:"file_name"` // The folder that contains the files. Manifests can be placed in 'manifests' or 'openshift' directories. @@ -71,7 +71,7 @@ func (m *CreateManifestParams) validateFileName(formats strfmt.Registry) error { return err } - if err := validate.Pattern("file_name", "body", *m.FileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("file_name", "body", *m.FileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } diff --git a/client/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go b/client/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go index 662d9a5aedef..9606db2aa74e 100644 --- a/client/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go +++ b/client/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go @@ -22,7 +22,7 @@ type UpdateManifestParams struct { // The file name for the manifest to modify. // Required: true - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ FileName string `json:"file_name"` // The folder for the manifest to modify. @@ -34,7 +34,7 @@ type UpdateManifestParams struct { UpdatedContent *string `json:"updated_content,omitempty"` // The new file name for the manifest. - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ UpdatedFileName *string `json:"updated_file_name,omitempty"` // The new folder for the manifest. Manifests can be placed in 'manifests' or 'openshift' directories. @@ -74,7 +74,7 @@ func (m *UpdateManifestParams) validateFileName(formats strfmt.Registry) error { return err } - if err := validate.Pattern("file_name", "body", m.FileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("file_name", "body", m.FileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } @@ -129,7 +129,7 @@ func (m *UpdateManifestParams) validateUpdatedFileName(formats strfmt.Registry) return nil } - if err := validate.Pattern("updated_file_name", "body", *m.UpdatedFileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("updated_file_name", "body", *m.UpdatedFileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } diff --git a/docs/user-guide/install-customization.md b/docs/user-guide/install-customization.md index 53d873fff272..15ec63fa17af 100644 --- a/docs/user-guide/install-customization.md +++ b/docs/user-guide/install-customization.md @@ -9,7 +9,8 @@ These will only take effect after the machine config operator is up and running Formats json, yaml, and multi-document yaml are accepted as manifests. Multi-document yaml manifests are split with unique names to avoid any collisions with existing files when they are added to their respective folders (either "manifests" or "openshift"). -Yaml patches are also accepted and should be in the yaml-patch format, patches should contain `.yaml.patch.` or `.yml.patch.` as a part of their filename. +Yaml patches are also accepted and should be in the yaml-patch format, patches should end with `.yml.patch`, `yaml.patch`. +Extensions may have a suffix of an underscore followed by some alphanumeric characters, for example `.yml.patch_ocp_manifests` or `.yaml.patch_ocp_manifests` Here is an example of the format of a Yaml patch file, for more information on the format, please see https://github.com/krishicks/yaml-patch ``` diff --git a/internal/manifests/manifests.go b/internal/manifests/manifests.go index 9b99a1edc80d..671fb01db707 100644 --- a/internal/manifests/manifests.go +++ b/internal/manifests/manifests.go @@ -541,7 +541,7 @@ func (m *Manifests) validateUserSuppliedManifest(ctx context.Context, clusterID if !json.Valid(manifestContent) { return m.prepareAndLogError(ctx, http.StatusBadRequest, errors.Errorf("Manifest content of file %s for cluster ID %s has an illegal JSON format", fileName, string(clusterID))) } - } else if strings.Contains(fileName, ".yaml.patch") || strings.Contains(fileName, ".yml.patch") { + } else if strings.HasPrefix(extension, ".patch") { if _, err := yamlpatch.DecodePatch(manifestContent); err != nil { return m.prepareAndLogError(ctx, http.StatusBadRequest, errors.Errorf("Patch content of file %s for cluster ID %s is invalid: %s", fileName, string(clusterID), err)) } diff --git a/internal/manifests/manifests_test.go b/internal/manifests/manifests_test.go index b5059e38902d..7d1c3c3478e5 100644 --- a/internal/manifests/manifests_test.go +++ b/internal/manifests/manifests_test.go @@ -73,8 +73,8 @@ var _ = Describe("ClusterManifestTests", func() { mockS3Client *s3wrapper.MockAPI dbName string fileNameYaml = "99-openshift-machineconfig-master-kargs.yaml" - fileNameYamlPatch = "99-openshift-machineconfig-master-kargs.yaml.patch.foobar" - fileNameYmlPatch = "99-openshift-machineconfig-master-kargs.yml.patch.foobar" + fileNameYamlPatch = "99-openshift-machineconfig-master-kargs.yaml.patch_foobar" + fileNameYmlPatch = "99-openshift-machineconfig-master-kargs.yml.patch_foobar" fileNameJson = "99-openshift-machineconfig-master-kargs.json" validFolder = "openshift" defaultFolder = "manifests" @@ -506,6 +506,49 @@ spec: Expect(response).Should(BeAssignableToTypeOf(operations.NewV2CreateClusterManifestCreated())) }) + It("manifest creation will succeed for patch files if filename is valid", func() { + clusterID := registerCluster().ID + validFileNames := []string{ + "something.patch", + "something.patch_something_else", + "something.patch.patch_something", + } + for i, fileName := range validFileNames { + mockUpload(1) + expectUsageCalls() + mockS3Client.EXPECT().DoesObjectExist(ctx, filepath.Join(clusterID.String(), constants.ManifestFolder, "openshift", fileName)).Return(false, nil).AnyTimes() + response := manifestsAPI.V2CreateClusterManifest(ctx, operations.V2CreateClusterManifestParams{ + ClusterID: *clusterID, + CreateManifestParams: &models.CreateManifestParams{ + Content: &contentYamlPatch, + FileName: &validFileNames[i], + }, + }) + Expect(response).Should(BeAssignableToTypeOf(operations.NewV2CreateClusterManifestCreated())) + } + }) + + It("manifest creation will fail for patch files if filename is invalid", func() { + clusterID := registerCluster().ID + invalidFileNames := []string{ + "something.patch.something", + "something.patch.something.else", + } + for i, fileName := range invalidFileNames { + response := manifestsAPI.V2CreateClusterManifest(ctx, operations.V2CreateClusterManifestParams{ + ClusterID: *clusterID, + CreateManifestParams: &models.CreateManifestParams{ + Content: &contentYaml, + FileName: &invalidFileNames[i], + }, + }) + Expect(response).Should(BeAssignableToTypeOf(common.NewApiError(http.StatusBadRequest, errors.New("")))) + err := response.(*common.ApiErrorResponse) + Expect(err.StatusCode()).To(Equal(int32(http.StatusBadRequest))) + Expect(err.Error()).To(ContainSubstring("Manifest filename of file manifests/%s for cluster ID %s is invalid. Only json, yaml and yml or patch extensions are supported", fileName, clusterID.String())) + } + }) + It("fails for filename that contains folder in the name", func() { clusterID := registerCluster().ID fileNameWithFolder := "openshift/99-test.yaml" diff --git a/models/create_manifest_params.go b/models/create_manifest_params.go index 6bd6bd2bdc9a..edbaa3ab75c6 100644 --- a/models/create_manifest_params.go +++ b/models/create_manifest_params.go @@ -26,7 +26,7 @@ type CreateManifestParams struct { // The name of the manifest to customize the installed OCP cluster. // Required: true - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ FileName *string `json:"file_name"` // The folder that contains the files. Manifests can be placed in 'manifests' or 'openshift' directories. @@ -71,7 +71,7 @@ func (m *CreateManifestParams) validateFileName(formats strfmt.Registry) error { return err } - if err := validate.Pattern("file_name", "body", *m.FileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("file_name", "body", *m.FileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } diff --git a/models/update_manifest_params.go b/models/update_manifest_params.go index 662d9a5aedef..9606db2aa74e 100644 --- a/models/update_manifest_params.go +++ b/models/update_manifest_params.go @@ -22,7 +22,7 @@ type UpdateManifestParams struct { // The file name for the manifest to modify. // Required: true - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ FileName string `json:"file_name"` // The folder for the manifest to modify. @@ -34,7 +34,7 @@ type UpdateManifestParams struct { UpdatedContent *string `json:"updated_content,omitempty"` // The new file name for the manifest. - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ UpdatedFileName *string `json:"updated_file_name,omitempty"` // The new folder for the manifest. Manifests can be placed in 'manifests' or 'openshift' directories. @@ -74,7 +74,7 @@ func (m *UpdateManifestParams) validateFileName(formats strfmt.Registry) error { return err } - if err := validate.Pattern("file_name", "body", m.FileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("file_name", "body", m.FileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } @@ -129,7 +129,7 @@ func (m *UpdateManifestParams) validateUpdatedFileName(formats strfmt.Registry) return nil } - if err := validate.Pattern("updated_file_name", "body", *m.UpdatedFileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("updated_file_name", "body", *m.UpdatedFileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } diff --git a/restapi/embedded_spec.go b/restapi/embedded_spec.go index 1959f869957e..437ed494ef62 100644 --- a/restapi/embedded_spec.go +++ b/restapi/embedded_spec.go @@ -7179,7 +7179,7 @@ func init() { "file_name": { "description": "The name of the manifest to customize the installed OCP cluster.", "type": "string", - "pattern": "^[^/]*\\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$" + "pattern": "^[^\\/]*\\.(json|ya?ml(\\.patch_?[a-zA-Z0-9_]*)?)$" }, "folder": { "description": "The folder that contains the files. Manifests can be placed in 'manifests' or 'openshift' directories.", @@ -10231,7 +10231,7 @@ func init() { "file_name": { "description": "The file name for the manifest to modify.", "type": "string", - "pattern": "^[^/]*\\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$", + "pattern": "^[^\\/]*\\.(json|ya?ml(\\.patch_?[a-zA-Z0-9_]*)?)$", "x-nullable": false }, "folder": { @@ -10252,7 +10252,7 @@ func init() { "updated_file_name": { "description": "The new file name for the manifest.", "type": "string", - "pattern": "^[^/]*\\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$", + "pattern": "^[^\\/]*\\.(json|ya?ml(\\.patch_?[a-zA-Z0-9_]*)?)$", "x-nullable": true }, "updated_folder": { @@ -17957,7 +17957,7 @@ func init() { "file_name": { "description": "The name of the manifest to customize the installed OCP cluster.", "type": "string", - "pattern": "^[^/]*\\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$" + "pattern": "^[^\\/]*\\.(json|ya?ml(\\.patch_?[a-zA-Z0-9_]*)?)$" }, "folder": { "description": "The folder that contains the files. Manifests can be placed in 'manifests' or 'openshift' directories.", @@ -20948,7 +20948,7 @@ func init() { "file_name": { "description": "The file name for the manifest to modify.", "type": "string", - "pattern": "^[^/]*\\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$", + "pattern": "^[^\\/]*\\.(json|ya?ml(\\.patch_?[a-zA-Z0-9_]*)?)$", "x-nullable": false }, "folder": { @@ -20969,7 +20969,7 @@ func init() { "updated_file_name": { "description": "The new file name for the manifest.", "type": "string", - "pattern": "^[^/]*\\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$", + "pattern": "^[^\\/]*\\.(json|ya?ml(\\.patch_?[a-zA-Z0-9_]*)?)$", "x-nullable": true }, "updated_folder": { diff --git a/swagger.yaml b/swagger.yaml index 4195fbc2a53b..ce7747c49207 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -6901,7 +6901,7 @@ definitions: file_name: description: The name of the manifest to customize the installed OCP cluster. type: string - pattern: '^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$' + pattern: '^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$' content: description: base64 encoded manifest content. type: string @@ -6921,7 +6921,7 @@ definitions: file_name: description: The file name for the manifest to modify. type: string - pattern: '^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$' + pattern: '^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$' x-nullable: false updated_folder: description: The new folder for the manifest. Manifests can be placed in 'manifests' or 'openshift' directories. @@ -6932,7 +6932,7 @@ definitions: updated_file_name: description: The new file name for the manifest. type: string - pattern: '^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$' + pattern: '^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$' x-nullable: true updated_content: description: The new base64 encoded manifest content. diff --git a/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go b/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go index 6bd6bd2bdc9a..edbaa3ab75c6 100644 --- a/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go +++ b/vendor/github.com/openshift/assisted-service/models/create_manifest_params.go @@ -26,7 +26,7 @@ type CreateManifestParams struct { // The name of the manifest to customize the installed OCP cluster. // Required: true - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ FileName *string `json:"file_name"` // The folder that contains the files. Manifests can be placed in 'manifests' or 'openshift' directories. @@ -71,7 +71,7 @@ func (m *CreateManifestParams) validateFileName(formats strfmt.Registry) error { return err } - if err := validate.Pattern("file_name", "body", *m.FileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("file_name", "body", *m.FileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } diff --git a/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go b/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go index 662d9a5aedef..9606db2aa74e 100644 --- a/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go +++ b/vendor/github.com/openshift/assisted-service/models/update_manifest_params.go @@ -22,7 +22,7 @@ type UpdateManifestParams struct { // The file name for the manifest to modify. // Required: true - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ FileName string `json:"file_name"` // The folder for the manifest to modify. @@ -34,7 +34,7 @@ type UpdateManifestParams struct { UpdatedContent *string `json:"updated_content,omitempty"` // The new file name for the manifest. - // Pattern: ^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$ + // Pattern: ^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$ UpdatedFileName *string `json:"updated_file_name,omitempty"` // The new folder for the manifest. Manifests can be placed in 'manifests' or 'openshift' directories. @@ -74,7 +74,7 @@ func (m *UpdateManifestParams) validateFileName(formats strfmt.Registry) error { return err } - if err := validate.Pattern("file_name", "body", m.FileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("file_name", "body", m.FileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } @@ -129,7 +129,7 @@ func (m *UpdateManifestParams) validateUpdatedFileName(formats strfmt.Registry) return nil } - if err := validate.Pattern("updated_file_name", "body", *m.UpdatedFileName, `^[^/]*\.(yaml|yml|json|yaml.patch.*|yml.patch.*)$`); err != nil { + if err := validate.Pattern("updated_file_name", "body", *m.UpdatedFileName, `^[^\/]*\.(json|ya?ml(\.patch_?[a-zA-Z0-9_]*)?)$`); err != nil { return err } From 19b946cc80de09b6f2e42b705d62e38404f8261e Mon Sep 17 00:00:00 2001 From: Adrien Gentil Date: Wed, 5 Jun 2024 16:52:52 +0200 Subject: [PATCH 16/25] MGMT-18059: Mark OCI as supported integration (#6406) Remove OCI from technology preview as it is now a supported integration. --- internal/featuresupport/feature_support_test.go | 4 ++-- internal/featuresupport/features_platforms.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/featuresupport/feature_support_test.go b/internal/featuresupport/feature_support_test.go index 744585af36b7..64a12ee4c9ae 100644 --- a/internal/featuresupport/feature_support_test.go +++ b/internal/featuresupport/feature_support_test.go @@ -257,8 +257,8 @@ var _ = Describe("V2ListFeatureSupportLevels API", func() { Expect(supportLevel).To(Equal(expectedSupportLevel)) }, Entry("OCI unavailable with Openshift 4.13", "4.13", models.SupportLevelUnavailable), - Entry("OCI tech-preview with Openshift 4.14", "4.14", models.SupportLevelTechPreview), - Entry("OCI tech-preview with Openshidt 4.15", "4.15", models.SupportLevelTechPreview), + Entry("OCI tech-preview with Openshift 4.14", "4.14", models.SupportLevelSupported), + Entry("OCI tech-preview with Openshidt 4.15", "4.15", models.SupportLevelSupported), ) }) diff --git a/internal/featuresupport/features_platforms.go b/internal/featuresupport/features_platforms.go index a732d5750d84..f79ae1e58878 100644 --- a/internal/featuresupport/features_platforms.go +++ b/internal/featuresupport/features_platforms.go @@ -274,8 +274,8 @@ func (feature *OciIntegrationFeature) getSupportLevel(filters SupportLevelFilter return models.SupportLevelUnavailable } - if isTechPreview, err := common.BaseVersionGreaterOrEqual("4.14", filters.OpenshiftVersion); isTechPreview || err != nil { - return models.SupportLevelTechPreview + if isSupported, err := common.BaseVersionGreaterOrEqual("4.14", filters.OpenshiftVersion); isSupported || err != nil { + return models.SupportLevelSupported } return models.SupportLevelUnavailable From 0f3ad251f43238067c8eeb64fda9896c69d9c4a6 Mon Sep 17 00:00:00 2001 From: OpenShift Cherrypick Robot Date: Wed, 5 Jun 2024 19:50:44 +0200 Subject: [PATCH 17/25] OCPBUGS-31733: Remove CPMS manifest for vsphere platform (#6404) The control-plane-machine-set (CPMS) cluster operator fails to deploy on 4.16-ec.5 build for ABI deployments on vSphere. That build removed the CPMS feature gate. Because ABI and assisted deployments do not create or include machines in the manifests, and the control plane machine operator expects machines to be present for each control plane node, the CO fails to deploy. The CPMS manifest should be removed for ABI and other UPI-like deployments. For UPI there is documentation indicating the CPMS manifest must be removed: https://docs.openshift.com/container-platform/4.15/installing/installing_vsphere/upi/installing-vsphere.html#installation-user-infra-generate-k8s-manifest-ignition_installing-vsphere Co-authored-by: Richard Su --- internal/provider/vsphere/ignition.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/internal/provider/vsphere/ignition.go b/internal/provider/vsphere/ignition.go index ce70557c40b1..a5875708f1aa 100644 --- a/internal/provider/vsphere/ignition.go +++ b/internal/provider/vsphere/ignition.go @@ -35,6 +35,15 @@ func (p vsphereProvider) PostCreateManifestsHook(_ *common.Cluster, _ *[]string, return fmt.Errorf("error deleting machineset: %w", err) } + // Delete machine-api control plane machine set manifest + p.Log.Info("Deleting machine-api control plane machine set manifest") + files, _ = filepath.Glob(path.Join(workDir, "openshift", "*_openshift-machine-api_master-control-plane-machine-set.yaml")) + err = p.deleteAllFiles(files) + + if err != nil { + return fmt.Errorf("error deleting control plane machine set: %w", err) + } + return nil } From 29716257a04f9fdc90eaff2b725a84836a6639dc Mon Sep 17 00:00:00 2001 From: "red-hat-konflux[bot]" <126015336+red-hat-konflux[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 13:57:51 +0000 Subject: [PATCH 18/25] NO-ISSUE: Red Hat Konflux update assisted-service-saas-hotfix (#6455) * Red Hat Konflux update assisted-service-saas-hotfix * ci: Fix konflux git clone params (#6463) --------- Co-authored-by: red-hat-konflux Co-authored-by: Matthieu Bernardin <40832495+pastequo@users.noreply.github.com> --- ...ted-service-saas-hotfix-pull-request.yaml} | 286 ++++++++++++------ ...=> assisted-service-saas-hotfix-push.yaml} | 284 +++++++++++------ 2 files changed, 385 insertions(+), 185 deletions(-) rename .tekton/{assisted-service-q2vh-pull-request.yaml => assisted-service-saas-hotfix-pull-request.yaml} (53%) rename .tekton/{assisted-service-q2vh-push.yaml => assisted-service-saas-hotfix-push.yaml} (53%) diff --git a/.tekton/assisted-service-q2vh-pull-request.yaml b/.tekton/assisted-service-saas-hotfix-pull-request.yaml similarity index 53% rename from .tekton/assisted-service-q2vh-pull-request.yaml rename to .tekton/assisted-service-saas-hotfix-pull-request.yaml index 2e485003f139..288f20df1b5d 100644 --- a/.tekton/assisted-service-q2vh-pull-request.yaml +++ b/.tekton/assisted-service-saas-hotfix-pull-request.yaml @@ -1,4 +1,4 @@ -apiVersion: tekton.dev/v1beta1 +apiVersion: tekton.dev/v1 kind: PipelineRun metadata: annotations: @@ -7,29 +7,29 @@ metadata: build.appstudio.redhat.com/pull_request_number: '{{pull_request_number}}' build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-event: '[pull_request]' - pipelinesascode.tekton.dev/on-target-branch: '[master]' + pipelinesascode.tekton.dev/on-cel-expression: event == "pull_request" && target_branch + == "cloud_hotfix_releases" creationTimestamp: null labels: - appstudio.openshift.io/application: assisted-service - appstudio.openshift.io/component: assisted-service-q2vh + appstudio.openshift.io/application: assisted-service-saas-hotfix + appstudio.openshift.io/component: assisted-service-saas-hotfix pipelines.appstudio.openshift.io/type: build - name: assisted-service-q2vh-on-pull-request + name: assisted-service-saas-hotfix-on-pull-request namespace: assisted-installer-tenant spec: params: - - name: dockerfile - value: https://raw.githubusercontent.com/devfile-samples/devfile-sample-python-basic/main/docker/Dockerfile - name: git-url - value: '{{repo_url}}' + value: '{{source_url}}' + - name: revision + value: '{{revision}}' + - name: output-image + value: quay.io/redhat-user-workloads/assisted-installer-tenant/assisted-service-saas-hotfix/assisted-service-saas-hotfix:on-pr-{{revision}} - name: image-expires-after value: 5d - - name: output-image - value: quay.io/redhat-user-workloads/assisted-installer-tenant/assisted-service/assisted-service-q2vh:on-pr-{{revision}} + - name: dockerfile + value: Dockerfile.assisted-service - name: path-context value: . - - name: revision - value: '{{revision}}' pipelineSpec: finally: - name: show-sbom @@ -37,8 +37,14 @@ spec: - name: IMAGE_URL value: $(tasks.build-container.results.IMAGE_URL) taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-show-sbom:0.1@sha256:82737c8d365c620295fa526d21a481d4614f657800175ddc0ccd7846c54207f8 - name: show-sbom + params: + - name: name + value: show-sbom + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:69edfd6862a1837e21325146c1c52acda29838d8eead837a74ed40e91d54cb97 + - name: kind + value: task + resolver: bundles - name: show-summary params: - name: pipelinerun-name @@ -50,8 +56,17 @@ spec: - name: build-task-status value: $(tasks.build-container.status) taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-summary:0.2@sha256:535fd85afc42c856364653177edeb05cad9f6b9fa51cc893b7a29b099a6c8555 - name: summary + params: + - name: name + value: summary + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:4b0563bcb5a070b9f7a783bfb831941d4fe5fa42bbb732a63c63f8f7936d4467 + - name: kind + value: task + resolver: bundles + workspaces: + - name: workspace + workspace: workspace params: - description: Source Repository URL name: git-url @@ -64,11 +79,13 @@ spec: name: output-image type: string - default: . - description: The path to your source code + description: Path to the source code of an application's component from where + to build image. name: path-context type: string - default: Dockerfile - description: Path to the Dockerfile + description: Path to the Dockerfile inside the context specified by parameter + path-context name: dockerfile type: string - default: "false" @@ -79,10 +96,6 @@ spec: description: Skip checks against built image name: skip-checks type: string - - default: "true" - description: Skip optional checks, set false if you want to run optional checks - name: skip-optional - type: string - default: "false" description: Execute the build with network isolation name: hermetic @@ -95,14 +108,22 @@ spec: description: Java build name: java type: string - - default: "" - description: Snyk Token Secret Name - name: snyk-secret - type: string - default: "" description: Image tag expiration time, time values could be something like 1h, 2d, 3w for hours, days, and weeks, respectively. name: image-expires-after + - default: "false" + description: Build a source image. + name: build-source-image + type: string + - default: [] + description: Array of --build-arg values ("arg=value" strings) for buildah + name: build-args + type: array + - default: "" + description: Path to a file with build arguments for buildah, see https://www.mankier.com/1/buildah-build#--build-arg-file + name: build-args-file + type: string results: - description: "" name: IMAGE_URL @@ -129,8 +150,14 @@ spec: - name: skip-checks value: $(params.skip-checks) taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-init:0.2@sha256:3d8f01fa59596a998d30dc700fcf7377f09d60008337290eebaeaf604512ce2b - name: init + params: + - name: name + value: init + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:83b7df553a736def52dd47bca2a3614c8fa2c88d112d691a4834289cf8c2abf5 + - name: kind + value: task + resolver: bundles - name: clone-repository params: - name: url @@ -138,12 +165,20 @@ spec: - name: revision value: $(params.revision) - name: depth - value: "100" + value: 100 + - name: fetchTags + value: "true" runAfter: - init taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-git-clone:0.1@sha256:fffe6234a4d60c63b97af86642369e4931a404f6dc8be0d12743f7651a4dc802 - name: git-clone + params: + - name: name + value: git-clone + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:d5883ad208f2080a6e0225377c05941e29b46bddfbfa0f74f618ca365b0687da + - name: kind + value: task + resolver: bundles when: - input: $(tasks.init.results.build) operator: in @@ -161,16 +196,24 @@ spec: runAfter: - clone-repository taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-prefetch-dependencies:0.1@sha256:e29adab9f66415b3be2e89e154c03ec685900fdad90051a555d7d027f94f874e - name: prefetch-dependencies + params: + - name: name + value: prefetch-dependencies + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:c22f2537b73add9b9cef0c1ac92187abb8d265756eaa1e6e568a4f4215720cc3 + - name: kind + value: task + resolver: bundles when: - - input: $(params.hermetic) - operator: in + - input: $(params.prefetch-input) + operator: notin values: - - "true" + - "" workspaces: - name: source workspace: workspace + - name: git-basic-auth + workspace: git-auth - name: build-container params: - name: IMAGE @@ -185,11 +228,24 @@ spec: value: $(params.prefetch-input) - name: IMAGE_EXPIRES_AFTER value: $(params.image-expires-after) + - name: COMMIT_SHA + value: $(tasks.clone-repository.results.commit) + - name: BUILD_ARGS + value: + - $(params.build-args[*]) + - name: BUILD_ARGS_FILE + value: $(params.build-args-file) runAfter: - prefetch-dependencies taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-buildah:0.1@sha256:e1e6c6308b8c7d5aa2faa02129af7fcc9e8dc4bbfe741c1acab5c9edca28fb77 - name: buildah + params: + - name: name + value: buildah + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:0cb9100452e9640adbda75a6e23d2cc9c76d2408cbcf3183543b2a7582e39f02 + - name: kind + value: task + resolver: bundles when: - input: $(tasks.init.results.build) operator: in @@ -198,102 +254,118 @@ spec: workspaces: - name: source workspace: workspace - - name: inspect-image + - name: build-source-image params: - - name: IMAGE_URL - value: $(tasks.build-container.results.IMAGE_URL) - - name: IMAGE_DIGEST - value: $(tasks.build-container.results.IMAGE_DIGEST) + - name: BINARY_IMAGE + value: $(params.output-image) + - name: BASE_IMAGES + value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) runAfter: - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-inspect-image:0.1@sha256:c9e991c0480f331f1eb49ade78c3510d4ae7cba2ec302dc39568d99dcddb62f8 - name: inspect-image + params: + - name: name + value: source-build + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:eacb3f49a4fefc112e5d68f67f9418584e1f942e33b027aaf80612d7eff332d0 + - name: kind + value: task + resolver: bundles when: - - input: $(params.skip-checks) + - input: $(tasks.init.results.build) operator: in values: - - "false" - workspaces: - - name: source - workspace: workspace - - name: label-check - runAfter: - - inspect-image - taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-label-check:0.1@sha256:0c0739fdda24cd1e3587bbab9b07d4493efc21884baac7723f4b446e95bf1fd3 - name: label-check - when: - - input: $(params.skip-checks) + - "true" + - input: $(params.build-source-image) operator: in values: - - "false" + - "true" workspaces: - name: workspace workspace: workspace - - name: optional-label-check + - name: deprecated-base-image-check params: - - name: POLICY_NAMESPACE - value: optional_checks + - name: BASE_IMAGES_DIGESTS + value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) + - name: IMAGE_URL + value: $(tasks.build-container.results.IMAGE_URL) + - name: IMAGE_DIGEST + value: $(tasks.build-container.results.IMAGE_DIGEST) runAfter: - - inspect-image + - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-label-check:0.1@sha256:0c0739fdda24cd1e3587bbab9b07d4493efc21884baac7723f4b446e95bf1fd3 - name: label-check + params: + - name: name + value: deprecated-image-check + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:9d33c7dbb67c8d6580959792cb395790c3bde1ad877d120c9fd62161fc0452a7 + - name: kind + value: task + resolver: bundles when: - - input: $(params.skip-optional) + - input: $(params.skip-checks) operator: in values: - "false" - workspaces: - - name: workspace - workspace: workspace - - name: deprecated-base-image-check + - name: clair-scan params: - - name: BASE_IMAGES_DIGESTS - value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) + - name: image-digest + value: $(tasks.build-container.results.IMAGE_DIGEST) + - name: image-url + value: $(tasks.build-container.results.IMAGE_URL) + runAfter: + - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-deprecated-image-check:0.3@sha256:ba55ff56b8718406278d72fd5e3de88da110dd4391aa7581923b8d219a29f841 - name: deprecated-image-check + params: + - name: name + value: clair-scan + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:eed371ce8d1473e31a0befaa60134dedce47debe9527df0932f7fdea6a0c73b9 + - name: kind + value: task + resolver: bundles when: - input: $(params.skip-checks) operator: in values: - "false" - - name: clair-scan + - name: ecosystem-cert-preflight-checks params: - - name: image-digest - value: $(tasks.build-container.results.IMAGE_DIGEST) - name: image-url value: $(tasks.build-container.results.IMAGE_URL) runAfter: - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-clair-scan:0.1@sha256:5097b69c7b8ed19bbc09b3b119214305ed382a185aece344806875e6c43203b8 - name: clair-scan + params: + - name: name + value: ecosystem-cert-preflight-checks + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.1@sha256:d56dc78e0699771ef6960eef1618b8068bd1b32557a8eed118453b0316772d7d + - name: kind + value: task + resolver: bundles when: - input: $(params.skip-checks) operator: in values: - "false" - name: sast-snyk-check - params: - - name: SNYK_SECRET - value: $(params.snyk-secret) runAfter: - clone-repository taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-sast-snyk-check:0.1@sha256:422177f6fffa55284a30ddc4a26dca1462aee34a479529b9e2b52a5bb39606a4 - name: sast-snyk-check + params: + - name: name + value: sast-snyk-check + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.1@sha256:30b59fff49f73b8b4aa2e622ad095970674b2fd46924f12d26e32ca39443ba8e + - name: kind + value: task + resolver: bundles when: - input: $(params.skip-checks) operator: in values: - "false" - - input: $(params.snyk-secret) - operator: notin - values: - - "" workspaces: - name: workspace workspace: workspace @@ -306,8 +378,14 @@ spec: runAfter: - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-clamav-scan:0.1@sha256:628847d30ce0dc05ce9c62ae1161ba54d27de125b59e867d485ca0e0c68e11e4 - name: clamav-scan + params: + - name: name + value: clamav-scan + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:ee0a3a13bc62b4f5cbd3d6adbe351bb414bf4d3b0d8d8d1829878103cfbe2656 + - name: kind + value: task + resolver: bundles when: - input: $(params.skip-checks) operator: in @@ -322,17 +400,39 @@ spec: runAfter: - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-sbom-json-check:0.1@sha256:e5202b2f610fcf36793e410336bd5b9764999abb29b3cd29007f6c68dd7725af - name: sbom-json-check + params: + - name: name + value: sbom-json-check + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-sbom-json-check:0.1@sha256:5e0f1de336f7ba7c2e15729787d77074911a5fb659419afc9f1cd461ef194625 + - name: kind + value: task + resolver: bundles when: - input: $(params.skip-checks) operator: in values: - "false" + - name: apply-tags + params: + - name: IMAGE + value: $(tasks.build-container.results.IMAGE_URL) + runAfter: + - build-container + taskRef: + params: + - name: name + value: apply-tags + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:175162b0a1c55e911d0d25ddef97e90932b5043f0b523cf83ed4824363840d74 + - name: kind + value: task + resolver: bundles workspaces: - name: workspace - name: git-auth optional: true + taskRunTemplate: {} workspaces: - name: workspace volumeClaimTemplate: diff --git a/.tekton/assisted-service-q2vh-push.yaml b/.tekton/assisted-service-saas-hotfix-push.yaml similarity index 53% rename from .tekton/assisted-service-q2vh-push.yaml rename to .tekton/assisted-service-saas-hotfix-push.yaml index 777b539a2c94..d1333333c510 100644 --- a/.tekton/assisted-service-q2vh-push.yaml +++ b/.tekton/assisted-service-saas-hotfix-push.yaml @@ -1,4 +1,4 @@ -apiVersion: tekton.dev/v1beta1 +apiVersion: tekton.dev/v1 kind: PipelineRun metadata: annotations: @@ -6,27 +6,27 @@ metadata: build.appstudio.redhat.com/commit_sha: '{{revision}}' build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-event: '[push]' - pipelinesascode.tekton.dev/on-target-branch: '[master]' + pipelinesascode.tekton.dev/on-cel-expression: event == "push" && target_branch + == "cloud_hotfix_releases" creationTimestamp: null labels: - appstudio.openshift.io/application: assisted-service - appstudio.openshift.io/component: assisted-service-q2vh + appstudio.openshift.io/application: assisted-service-saas-hotfix + appstudio.openshift.io/component: assisted-service-saas-hotfix pipelines.appstudio.openshift.io/type: build - name: assisted-service-q2vh-on-push + name: assisted-service-saas-hotfix-on-push namespace: assisted-installer-tenant spec: params: - - name: dockerfile - value: https://raw.githubusercontent.com/devfile-samples/devfile-sample-python-basic/main/docker/Dockerfile - name: git-url - value: '{{repo_url}}' + value: '{{source_url}}' + - name: revision + value: '{{revision}}' - name: output-image - value: quay.io/redhat-user-workloads/assisted-installer-tenant/assisted-service/assisted-service-q2vh:{{revision}} + value: quay.io/redhat-user-workloads/assisted-installer-tenant/assisted-service-saas-hotfix/assisted-service-saas-hotfix:{{revision}} + - name: dockerfile + value: Dockerfile.assisted-service - name: path-context value: . - - name: revision - value: '{{revision}}' pipelineSpec: finally: - name: show-sbom @@ -34,8 +34,14 @@ spec: - name: IMAGE_URL value: $(tasks.build-container.results.IMAGE_URL) taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-show-sbom:0.1@sha256:82737c8d365c620295fa526d21a481d4614f657800175ddc0ccd7846c54207f8 - name: show-sbom + params: + - name: name + value: show-sbom + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:69edfd6862a1837e21325146c1c52acda29838d8eead837a74ed40e91d54cb97 + - name: kind + value: task + resolver: bundles - name: show-summary params: - name: pipelinerun-name @@ -47,8 +53,17 @@ spec: - name: build-task-status value: $(tasks.build-container.status) taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-summary:0.2@sha256:535fd85afc42c856364653177edeb05cad9f6b9fa51cc893b7a29b099a6c8555 - name: summary + params: + - name: name + value: summary + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:4b0563bcb5a070b9f7a783bfb831941d4fe5fa42bbb732a63c63f8f7936d4467 + - name: kind + value: task + resolver: bundles + workspaces: + - name: workspace + workspace: workspace params: - description: Source Repository URL name: git-url @@ -61,11 +76,13 @@ spec: name: output-image type: string - default: . - description: The path to your source code + description: Path to the source code of an application's component from where + to build image. name: path-context type: string - default: Dockerfile - description: Path to the Dockerfile + description: Path to the Dockerfile inside the context specified by parameter + path-context name: dockerfile type: string - default: "false" @@ -76,10 +93,6 @@ spec: description: Skip checks against built image name: skip-checks type: string - - default: "true" - description: Skip optional checks, set false if you want to run optional checks - name: skip-optional - type: string - default: "false" description: Execute the build with network isolation name: hermetic @@ -92,14 +105,22 @@ spec: description: Java build name: java type: string - - default: "" - description: Snyk Token Secret Name - name: snyk-secret - type: string - default: "" description: Image tag expiration time, time values could be something like 1h, 2d, 3w for hours, days, and weeks, respectively. name: image-expires-after + - default: "false" + description: Build a source image. + name: build-source-image + type: string + - default: [] + description: Array of --build-arg values ("arg=value" strings) for buildah + name: build-args + type: array + - default: "" + description: Path to a file with build arguments for buildah, see https://www.mankier.com/1/buildah-build#--build-arg-file + name: build-args-file + type: string results: - description: "" name: IMAGE_URL @@ -126,8 +147,14 @@ spec: - name: skip-checks value: $(params.skip-checks) taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-init:0.2@sha256:3d8f01fa59596a998d30dc700fcf7377f09d60008337290eebaeaf604512ce2b - name: init + params: + - name: name + value: init + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:83b7df553a736def52dd47bca2a3614c8fa2c88d112d691a4834289cf8c2abf5 + - name: kind + value: task + resolver: bundles - name: clone-repository params: - name: url @@ -135,12 +162,20 @@ spec: - name: revision value: $(params.revision) - name: depth - value: "100" + value: 100 + - name: fetchTags + value: "true" runAfter: - init taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-git-clone:0.1@sha256:fffe6234a4d60c63b97af86642369e4931a404f6dc8be0d12743f7651a4dc802 - name: git-clone + params: + - name: name + value: git-clone + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:d5883ad208f2080a6e0225377c05941e29b46bddfbfa0f74f618ca365b0687da + - name: kind + value: task + resolver: bundles when: - input: $(tasks.init.results.build) operator: in @@ -158,16 +193,24 @@ spec: runAfter: - clone-repository taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-prefetch-dependencies:0.1@sha256:e29adab9f66415b3be2e89e154c03ec685900fdad90051a555d7d027f94f874e - name: prefetch-dependencies + params: + - name: name + value: prefetch-dependencies + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:c22f2537b73add9b9cef0c1ac92187abb8d265756eaa1e6e568a4f4215720cc3 + - name: kind + value: task + resolver: bundles when: - - input: $(params.hermetic) - operator: in + - input: $(params.prefetch-input) + operator: notin values: - - "true" + - "" workspaces: - name: source workspace: workspace + - name: git-basic-auth + workspace: git-auth - name: build-container params: - name: IMAGE @@ -182,11 +225,24 @@ spec: value: $(params.prefetch-input) - name: IMAGE_EXPIRES_AFTER value: $(params.image-expires-after) + - name: COMMIT_SHA + value: $(tasks.clone-repository.results.commit) + - name: BUILD_ARGS + value: + - $(params.build-args[*]) + - name: BUILD_ARGS_FILE + value: $(params.build-args-file) runAfter: - prefetch-dependencies taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-buildah:0.1@sha256:e1e6c6308b8c7d5aa2faa02129af7fcc9e8dc4bbfe741c1acab5c9edca28fb77 - name: buildah + params: + - name: name + value: buildah + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:0cb9100452e9640adbda75a6e23d2cc9c76d2408cbcf3183543b2a7582e39f02 + - name: kind + value: task + resolver: bundles when: - input: $(tasks.init.results.build) operator: in @@ -195,102 +251,118 @@ spec: workspaces: - name: source workspace: workspace - - name: inspect-image + - name: build-source-image params: - - name: IMAGE_URL - value: $(tasks.build-container.results.IMAGE_URL) - - name: IMAGE_DIGEST - value: $(tasks.build-container.results.IMAGE_DIGEST) + - name: BINARY_IMAGE + value: $(params.output-image) + - name: BASE_IMAGES + value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) runAfter: - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-inspect-image:0.1@sha256:c9e991c0480f331f1eb49ade78c3510d4ae7cba2ec302dc39568d99dcddb62f8 - name: inspect-image + params: + - name: name + value: source-build + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:eacb3f49a4fefc112e5d68f67f9418584e1f942e33b027aaf80612d7eff332d0 + - name: kind + value: task + resolver: bundles when: - - input: $(params.skip-checks) + - input: $(tasks.init.results.build) operator: in values: - - "false" - workspaces: - - name: source - workspace: workspace - - name: label-check - runAfter: - - inspect-image - taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-label-check:0.1@sha256:0c0739fdda24cd1e3587bbab9b07d4493efc21884baac7723f4b446e95bf1fd3 - name: label-check - when: - - input: $(params.skip-checks) + - "true" + - input: $(params.build-source-image) operator: in values: - - "false" + - "true" workspaces: - name: workspace workspace: workspace - - name: optional-label-check + - name: deprecated-base-image-check params: - - name: POLICY_NAMESPACE - value: optional_checks + - name: BASE_IMAGES_DIGESTS + value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) + - name: IMAGE_URL + value: $(tasks.build-container.results.IMAGE_URL) + - name: IMAGE_DIGEST + value: $(tasks.build-container.results.IMAGE_DIGEST) runAfter: - - inspect-image + - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-label-check:0.1@sha256:0c0739fdda24cd1e3587bbab9b07d4493efc21884baac7723f4b446e95bf1fd3 - name: label-check + params: + - name: name + value: deprecated-image-check + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:9d33c7dbb67c8d6580959792cb395790c3bde1ad877d120c9fd62161fc0452a7 + - name: kind + value: task + resolver: bundles when: - - input: $(params.skip-optional) + - input: $(params.skip-checks) operator: in values: - "false" - workspaces: - - name: workspace - workspace: workspace - - name: deprecated-base-image-check + - name: clair-scan params: - - name: BASE_IMAGES_DIGESTS - value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) + - name: image-digest + value: $(tasks.build-container.results.IMAGE_DIGEST) + - name: image-url + value: $(tasks.build-container.results.IMAGE_URL) + runAfter: + - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-deprecated-image-check:0.3@sha256:ba55ff56b8718406278d72fd5e3de88da110dd4391aa7581923b8d219a29f841 - name: deprecated-image-check + params: + - name: name + value: clair-scan + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:eed371ce8d1473e31a0befaa60134dedce47debe9527df0932f7fdea6a0c73b9 + - name: kind + value: task + resolver: bundles when: - input: $(params.skip-checks) operator: in values: - "false" - - name: clair-scan + - name: ecosystem-cert-preflight-checks params: - - name: image-digest - value: $(tasks.build-container.results.IMAGE_DIGEST) - name: image-url value: $(tasks.build-container.results.IMAGE_URL) runAfter: - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-clair-scan:0.1@sha256:5097b69c7b8ed19bbc09b3b119214305ed382a185aece344806875e6c43203b8 - name: clair-scan + params: + - name: name + value: ecosystem-cert-preflight-checks + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.1@sha256:d56dc78e0699771ef6960eef1618b8068bd1b32557a8eed118453b0316772d7d + - name: kind + value: task + resolver: bundles when: - input: $(params.skip-checks) operator: in values: - "false" - name: sast-snyk-check - params: - - name: SNYK_SECRET - value: $(params.snyk-secret) runAfter: - clone-repository taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-sast-snyk-check:0.1@sha256:422177f6fffa55284a30ddc4a26dca1462aee34a479529b9e2b52a5bb39606a4 - name: sast-snyk-check + params: + - name: name + value: sast-snyk-check + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.1@sha256:30b59fff49f73b8b4aa2e622ad095970674b2fd46924f12d26e32ca39443ba8e + - name: kind + value: task + resolver: bundles when: - input: $(params.skip-checks) operator: in values: - "false" - - input: $(params.snyk-secret) - operator: notin - values: - - "" workspaces: - name: workspace workspace: workspace @@ -303,8 +375,14 @@ spec: runAfter: - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-clamav-scan:0.1@sha256:628847d30ce0dc05ce9c62ae1161ba54d27de125b59e867d485ca0e0c68e11e4 - name: clamav-scan + params: + - name: name + value: clamav-scan + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:ee0a3a13bc62b4f5cbd3d6adbe351bb414bf4d3b0d8d8d1829878103cfbe2656 + - name: kind + value: task + resolver: bundles when: - input: $(params.skip-checks) operator: in @@ -319,17 +397,39 @@ spec: runAfter: - build-container taskRef: - bundle: quay.io/redhat-appstudio-tekton-catalog/task-sbom-json-check:0.1@sha256:e5202b2f610fcf36793e410336bd5b9764999abb29b3cd29007f6c68dd7725af - name: sbom-json-check + params: + - name: name + value: sbom-json-check + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-sbom-json-check:0.1@sha256:5e0f1de336f7ba7c2e15729787d77074911a5fb659419afc9f1cd461ef194625 + - name: kind + value: task + resolver: bundles when: - input: $(params.skip-checks) operator: in values: - "false" + - name: apply-tags + params: + - name: IMAGE + value: $(tasks.build-container.results.IMAGE_URL) + runAfter: + - build-container + taskRef: + params: + - name: name + value: apply-tags + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:175162b0a1c55e911d0d25ddef97e90932b5043f0b523cf83ed4824363840d74 + - name: kind + value: task + resolver: bundles workspaces: - name: workspace - name: git-auth optional: true + taskRunTemplate: {} workspaces: - name: workspace volumeClaimTemplate: From ab0325187953ea1ff1130bec3572d5dca849e99b Mon Sep 17 00:00:00 2001 From: Matthieu Bernardin <40832495+pastequo@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:16:36 +0200 Subject: [PATCH 19/25] NO-ISSUE: Increase Konflux git clone depth (#6496) --- .tekton/assisted-service-saas-hotfix-pull-request.yaml | 2 +- .tekton/assisted-service-saas-hotfix-push.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.tekton/assisted-service-saas-hotfix-pull-request.yaml b/.tekton/assisted-service-saas-hotfix-pull-request.yaml index 288f20df1b5d..3e28ed2eba57 100644 --- a/.tekton/assisted-service-saas-hotfix-pull-request.yaml +++ b/.tekton/assisted-service-saas-hotfix-pull-request.yaml @@ -165,7 +165,7 @@ spec: - name: revision value: $(params.revision) - name: depth - value: 100 + value: 1000 - name: fetchTags value: "true" runAfter: diff --git a/.tekton/assisted-service-saas-hotfix-push.yaml b/.tekton/assisted-service-saas-hotfix-push.yaml index d1333333c510..b4e9a1f6c254 100644 --- a/.tekton/assisted-service-saas-hotfix-push.yaml +++ b/.tekton/assisted-service-saas-hotfix-push.yaml @@ -162,7 +162,7 @@ spec: - name: revision value: $(params.revision) - name: depth - value: 100 + value: 1000 - name: fetchTags value: "true" runAfter: From 3ba88a4f749964271ac3f6e02bbcaf23b8de6401 Mon Sep 17 00:00:00 2001 From: "red-hat-konflux[bot]" <126015336+red-hat-konflux[bot]@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:44:38 +0000 Subject: [PATCH 20/25] Update Konflux references (#6517) Signed-off-by: red-hat-konflux <123456+red-hat-konflux[bot]@users.noreply.github.com> Co-authored-by: red-hat-konflux[bot] <126015336+red-hat-konflux[bot]@users.noreply.github.com> --- ...sted-service-saas-hotfix-pull-request.yaml | 24 +++++++++---------- .../assisted-service-saas-hotfix-push.yaml | 24 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.tekton/assisted-service-saas-hotfix-pull-request.yaml b/.tekton/assisted-service-saas-hotfix-pull-request.yaml index 3e28ed2eba57..596fdd14f396 100644 --- a/.tekton/assisted-service-saas-hotfix-pull-request.yaml +++ b/.tekton/assisted-service-saas-hotfix-pull-request.yaml @@ -41,7 +41,7 @@ spec: - name: name value: show-sbom - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:69edfd6862a1837e21325146c1c52acda29838d8eead837a74ed40e91d54cb97 + value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:bb6de6584cc47524ac69d2fb0bc310e546696b707e4052a465966e2446e33a15 - name: kind value: task resolver: bundles @@ -60,7 +60,7 @@ spec: - name: name value: summary - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:4b0563bcb5a070b9f7a783bfb831941d4fe5fa42bbb732a63c63f8f7936d4467 + value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:fc1b0a4efc83c91cd4a24020daabb874b3f33a87c34cd157cda0b7e6d4b7779a - name: kind value: task resolver: bundles @@ -175,7 +175,7 @@ spec: - name: name value: git-clone - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:d5883ad208f2080a6e0225377c05941e29b46bddfbfa0f74f618ca365b0687da + value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:07b21ee2a46298d28edf561451f8550c3ae8024c546316765988d02c602827a4 - name: kind value: task resolver: bundles @@ -200,7 +200,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:c22f2537b73add9b9cef0c1ac92187abb8d265756eaa1e6e568a4f4215720cc3 + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:80e4ec86cda6bbb2b4b6787ca3b306a5a80a51d8fd4a498a8464f0005151d7be - name: kind value: task resolver: bundles @@ -242,7 +242,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:0cb9100452e9640adbda75a6e23d2cc9c76d2408cbcf3183543b2a7582e39f02 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:357206f5a7ca31e7c604df60722ba9122de10b86b136c3c871dea447b58a4085 - name: kind value: task resolver: bundles @@ -267,7 +267,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:eacb3f49a4fefc112e5d68f67f9418584e1f942e33b027aaf80612d7eff332d0 + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:6e1815b51294e897474c2b09bea84cbb11ddbaf8028d7e10cf95a0181c565cc9 - name: kind value: task resolver: bundles @@ -298,7 +298,7 @@ spec: - name: name value: deprecated-image-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:9d33c7dbb67c8d6580959792cb395790c3bde1ad877d120c9fd62161fc0452a7 + value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:0d61c9a7d3f7df8ae4989fa09cd387b2e88234876b2eca527a9b5b7e8ce78ad0 - name: kind value: task resolver: bundles @@ -320,7 +320,7 @@ spec: - name: name value: clair-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:eed371ce8d1473e31a0befaa60134dedce47debe9527df0932f7fdea6a0c73b9 + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:48a051b5d9cb93f722a9fa2eca0e1d28eb3a28118cfff74a6448b2ee956d95f9 - name: kind value: task resolver: bundles @@ -340,7 +340,7 @@ spec: - name: name value: ecosystem-cert-preflight-checks - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.1@sha256:d56dc78e0699771ef6960eef1618b8068bd1b32557a8eed118453b0316772d7d + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.1@sha256:8838d3e1628dbe61f4851b3640d2e3a9a3079d3ff3da955f4a3e4c2c95a013df - name: kind value: task resolver: bundles @@ -357,7 +357,7 @@ spec: - name: name value: sast-snyk-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.1@sha256:30b59fff49f73b8b4aa2e622ad095970674b2fd46924f12d26e32ca39443ba8e + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.1@sha256:962fbf053705d38ed5c81ea6379eebee32b22fad4a7971183614610e33e8e0f9 - name: kind value: task resolver: bundles @@ -382,7 +382,7 @@ spec: - name: name value: clamav-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:ee0a3a13bc62b4f5cbd3d6adbe351bb414bf4d3b0d8d8d1829878103cfbe2656 + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:b7f9f87a275d47e8076ee759145865575364c2eb44a834cd111cb373a10da0c2 - name: kind value: task resolver: bundles @@ -404,7 +404,7 @@ spec: - name: name value: sbom-json-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sbom-json-check:0.1@sha256:5e0f1de336f7ba7c2e15729787d77074911a5fb659419afc9f1cd461ef194625 + value: quay.io/konflux-ci/tekton-catalog/task-sbom-json-check:0.1@sha256:acc9cb8a714f33c0e48d6ca219b6bd0191f09cdd767af4ef3a35d0a5cac53b5d - name: kind value: task resolver: bundles diff --git a/.tekton/assisted-service-saas-hotfix-push.yaml b/.tekton/assisted-service-saas-hotfix-push.yaml index b4e9a1f6c254..fd4fe72c4167 100644 --- a/.tekton/assisted-service-saas-hotfix-push.yaml +++ b/.tekton/assisted-service-saas-hotfix-push.yaml @@ -38,7 +38,7 @@ spec: - name: name value: show-sbom - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:69edfd6862a1837e21325146c1c52acda29838d8eead837a74ed40e91d54cb97 + value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:bb6de6584cc47524ac69d2fb0bc310e546696b707e4052a465966e2446e33a15 - name: kind value: task resolver: bundles @@ -57,7 +57,7 @@ spec: - name: name value: summary - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:4b0563bcb5a070b9f7a783bfb831941d4fe5fa42bbb732a63c63f8f7936d4467 + value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:fc1b0a4efc83c91cd4a24020daabb874b3f33a87c34cd157cda0b7e6d4b7779a - name: kind value: task resolver: bundles @@ -172,7 +172,7 @@ spec: - name: name value: git-clone - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:d5883ad208f2080a6e0225377c05941e29b46bddfbfa0f74f618ca365b0687da + value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:07b21ee2a46298d28edf561451f8550c3ae8024c546316765988d02c602827a4 - name: kind value: task resolver: bundles @@ -197,7 +197,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:c22f2537b73add9b9cef0c1ac92187abb8d265756eaa1e6e568a4f4215720cc3 + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:80e4ec86cda6bbb2b4b6787ca3b306a5a80a51d8fd4a498a8464f0005151d7be - name: kind value: task resolver: bundles @@ -239,7 +239,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:0cb9100452e9640adbda75a6e23d2cc9c76d2408cbcf3183543b2a7582e39f02 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:357206f5a7ca31e7c604df60722ba9122de10b86b136c3c871dea447b58a4085 - name: kind value: task resolver: bundles @@ -264,7 +264,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:eacb3f49a4fefc112e5d68f67f9418584e1f942e33b027aaf80612d7eff332d0 + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:6e1815b51294e897474c2b09bea84cbb11ddbaf8028d7e10cf95a0181c565cc9 - name: kind value: task resolver: bundles @@ -295,7 +295,7 @@ spec: - name: name value: deprecated-image-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:9d33c7dbb67c8d6580959792cb395790c3bde1ad877d120c9fd62161fc0452a7 + value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:0d61c9a7d3f7df8ae4989fa09cd387b2e88234876b2eca527a9b5b7e8ce78ad0 - name: kind value: task resolver: bundles @@ -317,7 +317,7 @@ spec: - name: name value: clair-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:eed371ce8d1473e31a0befaa60134dedce47debe9527df0932f7fdea6a0c73b9 + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:48a051b5d9cb93f722a9fa2eca0e1d28eb3a28118cfff74a6448b2ee956d95f9 - name: kind value: task resolver: bundles @@ -337,7 +337,7 @@ spec: - name: name value: ecosystem-cert-preflight-checks - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.1@sha256:d56dc78e0699771ef6960eef1618b8068bd1b32557a8eed118453b0316772d7d + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.1@sha256:8838d3e1628dbe61f4851b3640d2e3a9a3079d3ff3da955f4a3e4c2c95a013df - name: kind value: task resolver: bundles @@ -354,7 +354,7 @@ spec: - name: name value: sast-snyk-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.1@sha256:30b59fff49f73b8b4aa2e622ad095970674b2fd46924f12d26e32ca39443ba8e + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.1@sha256:962fbf053705d38ed5c81ea6379eebee32b22fad4a7971183614610e33e8e0f9 - name: kind value: task resolver: bundles @@ -379,7 +379,7 @@ spec: - name: name value: clamav-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:ee0a3a13bc62b4f5cbd3d6adbe351bb414bf4d3b0d8d8d1829878103cfbe2656 + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:b7f9f87a275d47e8076ee759145865575364c2eb44a834cd111cb373a10da0c2 - name: kind value: task resolver: bundles @@ -401,7 +401,7 @@ spec: - name: name value: sbom-json-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sbom-json-check:0.1@sha256:5e0f1de336f7ba7c2e15729787d77074911a5fb659419afc9f1cd461ef194625 + value: quay.io/konflux-ci/tekton-catalog/task-sbom-json-check:0.1@sha256:acc9cb8a714f33c0e48d6ca219b6bd0191f09cdd767af4ef3a35d0a5cac53b5d - name: kind value: task resolver: bundles From 64cb2ecf800f1bbd570938f2b708cbe429816d65 Mon Sep 17 00:00:00 2001 From: Matthieu Bernardin <40832495+pastequo@users.noreply.github.com> Date: Fri, 12 Jul 2024 20:56:38 +0200 Subject: [PATCH 21/25] NO-ISSUE: Add renovate config to limit number of PR (#6538) --- renovate.json | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 000000000000..ac1fe1d8866f --- /dev/null +++ b/renovate.json @@ -0,0 +1,11 @@ +{ + "schedule": ["on Saturday"], + "groupName": "Konflux build pipeline", + "includePaths": [".tekton/*"], + "commitMessagePrefix": "[cloud_hotfix_releases] NO-ISSUE: ", + "prBodyNotes": [ + "/lgtm", + "/approve" + ] +} + From c8f8b96a5f63f6859f2ab84b6069128229400d7c Mon Sep 17 00:00:00 2001 From: "red-hat-konflux[bot]" <126015336+red-hat-konflux[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 10:09:57 +0000 Subject: [PATCH 22/25] NO-ISSUE: Update Konflux references (#6567) Signed-off-by: red-hat-konflux <123456+red-hat-konflux[bot]@users.noreply.github.com> Co-authored-by: red-hat-konflux[bot] <126015336+red-hat-konflux[bot]@users.noreply.github.com> --- ...sted-service-saas-hotfix-pull-request.yaml | 24 +++++++++---------- .../assisted-service-saas-hotfix-push.yaml | 24 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.tekton/assisted-service-saas-hotfix-pull-request.yaml b/.tekton/assisted-service-saas-hotfix-pull-request.yaml index 596fdd14f396..2d0dfedd36ef 100644 --- a/.tekton/assisted-service-saas-hotfix-pull-request.yaml +++ b/.tekton/assisted-service-saas-hotfix-pull-request.yaml @@ -41,7 +41,7 @@ spec: - name: name value: show-sbom - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:bb6de6584cc47524ac69d2fb0bc310e546696b707e4052a465966e2446e33a15 + value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:7f8b5499a21de9aca718d0cf2e170949af6b30cacf882d64983471a2c673b1da - name: kind value: task resolver: bundles @@ -60,7 +60,7 @@ spec: - name: name value: summary - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:fc1b0a4efc83c91cd4a24020daabb874b3f33a87c34cd157cda0b7e6d4b7779a + value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:d97c04ab42f277b1103eb6f3a053b247849f4f5b3237ea302a8ecada3b24e15b - name: kind value: task resolver: bundles @@ -154,7 +154,7 @@ spec: - name: name value: init - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:83b7df553a736def52dd47bca2a3614c8fa2c88d112d691a4834289cf8c2abf5 + value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:99c98d3e5195e9920482f2187590d6f9150c4b8a2001b1ce5dcd5077abda9481 - name: kind value: task resolver: bundles @@ -175,7 +175,7 @@ spec: - name: name value: git-clone - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:07b21ee2a46298d28edf561451f8550c3ae8024c546316765988d02c602827a4 + value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:de0ca8872c791944c479231e21d68379b54877aaf42e5f766ef4a8728970f8b3 - name: kind value: task resolver: bundles @@ -200,7 +200,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:80e4ec86cda6bbb2b4b6787ca3b306a5a80a51d8fd4a498a8464f0005151d7be + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:9f1dd115789528ed0d9f8469828d180724efb0dca244d17c9ac99663edf5bcda - name: kind value: task resolver: bundles @@ -242,7 +242,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:357206f5a7ca31e7c604df60722ba9122de10b86b136c3c871dea447b58a4085 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:4769650d076ab36694847090c83c49996e257520e3d0b9e7e0bc91a9bcc7f4d3 - name: kind value: task resolver: bundles @@ -267,7 +267,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:6e1815b51294e897474c2b09bea84cbb11ddbaf8028d7e10cf95a0181c565cc9 + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:5e34db0e73dcb92495b918119818cd02e57d22dfa112fad45464e57547766478 - name: kind value: task resolver: bundles @@ -298,7 +298,7 @@ spec: - name: name value: deprecated-image-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:0d61c9a7d3f7df8ae4989fa09cd387b2e88234876b2eca527a9b5b7e8ce78ad0 + value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:ea275aeb7d204ef203a67e6a45a4902479afc1d906d2120f0d8c77d9541ea850 - name: kind value: task resolver: bundles @@ -320,7 +320,7 @@ spec: - name: name value: clair-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:48a051b5d9cb93f722a9fa2eca0e1d28eb3a28118cfff74a6448b2ee956d95f9 + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:a13278c3ee419db573a3919d8f86091497d2e7b52b5a800c2767c265df51c58a - name: kind value: task resolver: bundles @@ -357,7 +357,7 @@ spec: - name: name value: sast-snyk-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.1@sha256:962fbf053705d38ed5c81ea6379eebee32b22fad4a7971183614610e33e8e0f9 + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.1@sha256:d68390c8d771a50dcc99841ae224d18f36b677d9da6ad9bf8972878bde5f0f8f - name: kind value: task resolver: bundles @@ -382,7 +382,7 @@ spec: - name: name value: clamav-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:b7f9f87a275d47e8076ee759145865575364c2eb44a834cd111cb373a10da0c2 + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:a5742024c2755d3636110aea0b86d298660bb8b7708894674baec16bb90b7106 - name: kind value: task resolver: bundles @@ -424,7 +424,7 @@ spec: - name: name value: apply-tags - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:175162b0a1c55e911d0d25ddef97e90932b5043f0b523cf83ed4824363840d74 + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:516875845f2988848ebde5f3e9c717d6077af7bf9b3cb2b34a3c3f86b2609a14 - name: kind value: task resolver: bundles diff --git a/.tekton/assisted-service-saas-hotfix-push.yaml b/.tekton/assisted-service-saas-hotfix-push.yaml index fd4fe72c4167..965266fa6477 100644 --- a/.tekton/assisted-service-saas-hotfix-push.yaml +++ b/.tekton/assisted-service-saas-hotfix-push.yaml @@ -38,7 +38,7 @@ spec: - name: name value: show-sbom - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:bb6de6584cc47524ac69d2fb0bc310e546696b707e4052a465966e2446e33a15 + value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:7f8b5499a21de9aca718d0cf2e170949af6b30cacf882d64983471a2c673b1da - name: kind value: task resolver: bundles @@ -57,7 +57,7 @@ spec: - name: name value: summary - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:fc1b0a4efc83c91cd4a24020daabb874b3f33a87c34cd157cda0b7e6d4b7779a + value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:d97c04ab42f277b1103eb6f3a053b247849f4f5b3237ea302a8ecada3b24e15b - name: kind value: task resolver: bundles @@ -151,7 +151,7 @@ spec: - name: name value: init - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:83b7df553a736def52dd47bca2a3614c8fa2c88d112d691a4834289cf8c2abf5 + value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:99c98d3e5195e9920482f2187590d6f9150c4b8a2001b1ce5dcd5077abda9481 - name: kind value: task resolver: bundles @@ -172,7 +172,7 @@ spec: - name: name value: git-clone - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:07b21ee2a46298d28edf561451f8550c3ae8024c546316765988d02c602827a4 + value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:de0ca8872c791944c479231e21d68379b54877aaf42e5f766ef4a8728970f8b3 - name: kind value: task resolver: bundles @@ -197,7 +197,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:80e4ec86cda6bbb2b4b6787ca3b306a5a80a51d8fd4a498a8464f0005151d7be + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:9f1dd115789528ed0d9f8469828d180724efb0dca244d17c9ac99663edf5bcda - name: kind value: task resolver: bundles @@ -239,7 +239,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:357206f5a7ca31e7c604df60722ba9122de10b86b136c3c871dea447b58a4085 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:4769650d076ab36694847090c83c49996e257520e3d0b9e7e0bc91a9bcc7f4d3 - name: kind value: task resolver: bundles @@ -264,7 +264,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:6e1815b51294e897474c2b09bea84cbb11ddbaf8028d7e10cf95a0181c565cc9 + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:5e34db0e73dcb92495b918119818cd02e57d22dfa112fad45464e57547766478 - name: kind value: task resolver: bundles @@ -295,7 +295,7 @@ spec: - name: name value: deprecated-image-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:0d61c9a7d3f7df8ae4989fa09cd387b2e88234876b2eca527a9b5b7e8ce78ad0 + value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:ea275aeb7d204ef203a67e6a45a4902479afc1d906d2120f0d8c77d9541ea850 - name: kind value: task resolver: bundles @@ -317,7 +317,7 @@ spec: - name: name value: clair-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:48a051b5d9cb93f722a9fa2eca0e1d28eb3a28118cfff74a6448b2ee956d95f9 + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:a13278c3ee419db573a3919d8f86091497d2e7b52b5a800c2767c265df51c58a - name: kind value: task resolver: bundles @@ -354,7 +354,7 @@ spec: - name: name value: sast-snyk-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.1@sha256:962fbf053705d38ed5c81ea6379eebee32b22fad4a7971183614610e33e8e0f9 + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.1@sha256:d68390c8d771a50dcc99841ae224d18f36b677d9da6ad9bf8972878bde5f0f8f - name: kind value: task resolver: bundles @@ -379,7 +379,7 @@ spec: - name: name value: clamav-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:b7f9f87a275d47e8076ee759145865575364c2eb44a834cd111cb373a10da0c2 + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:a5742024c2755d3636110aea0b86d298660bb8b7708894674baec16bb90b7106 - name: kind value: task resolver: bundles @@ -421,7 +421,7 @@ spec: - name: name value: apply-tags - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:175162b0a1c55e911d0d25ddef97e90932b5043f0b523cf83ed4824363840d74 + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:516875845f2988848ebde5f3e9c717d6077af7bf9b3cb2b34a3c3f86b2609a14 - name: kind value: task resolver: bundles From 48f8215216647ebad01dd68583c0fa5a9c7d9fd7 Mon Sep 17 00:00:00 2001 From: "red-hat-konflux[bot]" <126015336+red-hat-konflux[bot]@users.noreply.github.com> Date: Sat, 20 Jul 2024 00:06:32 +0000 Subject: [PATCH 23/25] NO-ISSUE: Update Konflux references Signed-off-by: red-hat-konflux <123456+red-hat-konflux[bot]@users.noreply.github.com> --- .tekton/assisted-service-saas-hotfix-pull-request.yaml | 4 ++-- .tekton/assisted-service-saas-hotfix-push.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.tekton/assisted-service-saas-hotfix-pull-request.yaml b/.tekton/assisted-service-saas-hotfix-pull-request.yaml index 2d0dfedd36ef..4075e5b65329 100644 --- a/.tekton/assisted-service-saas-hotfix-pull-request.yaml +++ b/.tekton/assisted-service-saas-hotfix-pull-request.yaml @@ -242,7 +242,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:4769650d076ab36694847090c83c49996e257520e3d0b9e7e0bc91a9bcc7f4d3 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:4efd2f84c60375fea9df4bc48065bf4e8436d36111986d3b4b675f918935863c - name: kind value: task resolver: bundles @@ -267,7 +267,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:5e34db0e73dcb92495b918119818cd02e57d22dfa112fad45464e57547766478 + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:9eee3cf280d33106ea5a0a25f48ca54478d4120594c0e1b5a7849d3566cef670 - name: kind value: task resolver: bundles diff --git a/.tekton/assisted-service-saas-hotfix-push.yaml b/.tekton/assisted-service-saas-hotfix-push.yaml index 965266fa6477..512f9df561cb 100644 --- a/.tekton/assisted-service-saas-hotfix-push.yaml +++ b/.tekton/assisted-service-saas-hotfix-push.yaml @@ -239,7 +239,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:4769650d076ab36694847090c83c49996e257520e3d0b9e7e0bc91a9bcc7f4d3 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:4efd2f84c60375fea9df4bc48065bf4e8436d36111986d3b4b675f918935863c - name: kind value: task resolver: bundles @@ -264,7 +264,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:5e34db0e73dcb92495b918119818cd02e57d22dfa112fad45464e57547766478 + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:9eee3cf280d33106ea5a0a25f48ca54478d4120594c0e1b5a7849d3566cef670 - name: kind value: task resolver: bundles From d7202f0eb790332a32aff9cb4f8da89649131188 Mon Sep 17 00:00:00 2001 From: Matthieu Bernardin <40832495+pastequo@users.noreply.github.com> Date: Thu, 25 Jul 2024 12:04:55 +0200 Subject: [PATCH 24/25] NO-ISSUE: Konflux migration (#6622) --- .tekton/assisted-service-saas-hotfix-pull-request.yaml | 4 ---- .tekton/assisted-service-saas-hotfix-push.yaml | 4 ---- 2 files changed, 8 deletions(-) diff --git a/.tekton/assisted-service-saas-hotfix-pull-request.yaml b/.tekton/assisted-service-saas-hotfix-pull-request.yaml index 4075e5b65329..d1096047ccf0 100644 --- a/.tekton/assisted-service-saas-hotfix-pull-request.yaml +++ b/.tekton/assisted-service-saas-hotfix-pull-request.yaml @@ -258,8 +258,6 @@ spec: params: - name: BINARY_IMAGE value: $(params.output-image) - - name: BASE_IMAGES - value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) runAfter: - build-container taskRef: @@ -285,8 +283,6 @@ spec: workspace: workspace - name: deprecated-base-image-check params: - - name: BASE_IMAGES_DIGESTS - value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) - name: IMAGE_URL value: $(tasks.build-container.results.IMAGE_URL) - name: IMAGE_DIGEST diff --git a/.tekton/assisted-service-saas-hotfix-push.yaml b/.tekton/assisted-service-saas-hotfix-push.yaml index 512f9df561cb..0080f6f2038c 100644 --- a/.tekton/assisted-service-saas-hotfix-push.yaml +++ b/.tekton/assisted-service-saas-hotfix-push.yaml @@ -255,8 +255,6 @@ spec: params: - name: BINARY_IMAGE value: $(params.output-image) - - name: BASE_IMAGES - value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) runAfter: - build-container taskRef: @@ -282,8 +280,6 @@ spec: workspace: workspace - name: deprecated-base-image-check params: - - name: BASE_IMAGES_DIGESTS - value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) - name: IMAGE_URL value: $(tasks.build-container.results.IMAGE_URL) - name: IMAGE_DIGEST From b5190b4483fdefebb601c19a475e0dfaa83b8b5b Mon Sep 17 00:00:00 2001 From: Matthieu Bernardin <40832495+pastequo@users.noreply.github.com> Date: Thu, 25 Jul 2024 12:24:10 +0200 Subject: [PATCH 25/25] NO-ISSUE: Deprecated image check migration (#6623) --- .tekton/assisted-service-saas-hotfix-pull-request.yaml | 2 ++ .tekton/assisted-service-saas-hotfix-push.yaml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.tekton/assisted-service-saas-hotfix-pull-request.yaml b/.tekton/assisted-service-saas-hotfix-pull-request.yaml index d1096047ccf0..1c7ba0bbe099 100644 --- a/.tekton/assisted-service-saas-hotfix-pull-request.yaml +++ b/.tekton/assisted-service-saas-hotfix-pull-request.yaml @@ -283,6 +283,8 @@ spec: workspace: workspace - name: deprecated-base-image-check params: + - name: BASE_IMAGES_DIGESTS + value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) - name: IMAGE_URL value: $(tasks.build-container.results.IMAGE_URL) - name: IMAGE_DIGEST diff --git a/.tekton/assisted-service-saas-hotfix-push.yaml b/.tekton/assisted-service-saas-hotfix-push.yaml index 0080f6f2038c..25660549fa01 100644 --- a/.tekton/assisted-service-saas-hotfix-push.yaml +++ b/.tekton/assisted-service-saas-hotfix-push.yaml @@ -280,6 +280,8 @@ spec: workspace: workspace - name: deprecated-base-image-check params: + - name: BASE_IMAGES_DIGESTS + value: $(tasks.build-container.results.BASE_IMAGES_DIGESTS) - name: IMAGE_URL value: $(tasks.build-container.results.IMAGE_URL) - name: IMAGE_DIGEST