From 14ab04d0c0c58dabf6f5e293436e0a33d1db4aac Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Wed, 29 Mar 2023 22:50:22 -0700 Subject: [PATCH] pkg/steps/release/import_release: Set release.openshift.io/config name annotation bee450bd5d (ci-operator: expose ephemeral cluster versions based on parents, 2020-08-11, #1098) taught assembleReleaseStep to consume the release.openshift.io/config annotation on an ImageStream to find a version prefix that actually reflects the 4.y release branch (instead of using 0.0.1-0 as the prefix). Those annotations are set on the app.ci ImageStreams, for example: $ oc whoami -c default/api-ci-l2s4-p1-openshiftapps-com:6443/wking $ oc -n ocp get -o json imagestream 4.13 | jq -r '.metadata.annotations["release.openshift.io/config"] | fromjson | .name' 4.13.0-0.ci But they are not set in ImageStreams contained within release images: $ oc adm release info -o json registry.ci.openshift.org/ocp/release:4.13.0-0.ci-2023-03-29-224346 | jq '.references | {kind, metadata}' { "kind": "ImageStream", "metadata": { "name": "4.13.0-0.ci-2023-03-29-224346", "creationTimestamp": "2023-03-29T22:52:54Z", "annotations": { "release.openshift.io/from-image-stream": "ocp/4.13-2023-03-29-224346" } } } With this commit, I'm taking the name out of the imported release ImageStream and trying to parse it as a Semantic Version. If it parses, I'm constructing a release.openshift.io/config annotation to set just the 'name' property to the MAJOR.MINOR.PATCH from that parsed name. This should allow cluster-bot runs like: launch 4.13.0-0.ci,openshift/cluster-version-operator#918,openshift/hypershift#2318 hypershift-hosted to build releases named 4.13.0-0-... instead of their current 0.0.1-0-...: $ curl -s https://gcsweb-ci.apps.ci.l2s4.p1.openshiftapps.com/gcs/origin-ci-test/logs/release-openshift-origin-installer-launch-hypershift-hosted/1641294936391290880/artifacts/release/artifacts/release-payload-latest/image-references | jq -r .metadata.name 0.0.1-0.test-2023-03-30-043404-ci-ln-h9dwcbk-latest which is failing to run with [1]: Release image is not valid: { "lastTransitionTime": "2023-03-30T04:36:29Z", "message": "releases before 4.8 are not supported", "observedGeneration": 3, "reason": "InvalidImage", "status": "False", "type": "ValidReleaseImage" } [1]: https://prow.ci.openshift.org/view/gs/origin-ci-test/logs/release-openshift-origin-installer-launch-hypershift-hosted/1641294936391290880#1:build-log.txt%3A203-210 --- pkg/steps/release/import_release.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pkg/steps/release/import_release.go b/pkg/steps/release/import_release.go index 21816ce5f2e..22ce2b96f10 100644 --- a/pkg/steps/release/import_release.go +++ b/pkg/steps/release/import_release.go @@ -9,6 +9,7 @@ import ( "strings" "time" + "github.com/blang/semver" "github.com/sirupsen/logrus" coreapi "k8s.io/api/core/v1" @@ -235,6 +236,14 @@ oc create configmap release-%s --from-file=%s.yaml=${ARTIFACT_DIR}/%s return fmt.Errorf("unexpected image stream contents: %w", err) } + var prefix string + version, err := semver.Parse(releaseIS.ObjectMeta.Name) + if err != nil { + logrus.WithError(err).Errorf("Failed to parse release %s ImageStream name %s as a semantic version.", pullSpec, releaseIS.ObjectMeta.Name) + } else { + prefix = fmt.Sprintf("%d.%d.%d-0", version.Major, version.Minor, version.Patch) + } + // update the stable image stream to have all of the tags from the payload if err := retry.RetryOnConflict(retry.DefaultRetry, func() error { stable := &imagev1.ImageStream{} @@ -242,6 +251,15 @@ oc create configmap release-%s --from-file=%s.yaml=${ARTIFACT_DIR}/%s return fmt.Errorf("could not resolve imagestream %s: %w", streamName, err) } + if prefix != "" { + if stable.ObjectMeta.Annotations == nil { + stable.ObjectMeta.Annotations = make(map[string]string, 1) + } + if _, ok := stable.ObjectMeta.Annotations[releaseConfigAnnotation]; !ok { + stable.ObjectMeta.Annotations[releaseConfigAnnotation] = fmt.Sprintf(`{"name": "%s"}`, prefix) + } + } + existing := sets.NewString() tags := make([]imagev1.TagReference, 0, len(releaseIS.Spec.Tags)+len(stable.Spec.Tags)) for _, tag := range releaseIS.Spec.Tags {