From bee450bd5d30f225298a59d5fc91826894429724 Mon Sep 17 00:00:00 2001 From: Steve Kuznetsov Date: Tue, 11 Aug 2020 08:18:40 -0700 Subject: [PATCH] ci-operator: expose ephemeral cluster versions based on parents When we import a release from a stream that's configured to have a name and be released in some way, we can piggy-back off of that name to create a name for our release that clearly labels us as a derivative while also uniquely identifying the test configuration that is running. All of this is best-effort and will no-op if no release config is present, allowing us to still mark the cluster version as one udner test but not identifying the parent release. Signed-off-by: Steve Kuznetsov --- pkg/steps/release/create_release.go | 20 ++++++++++++++++++-- pkg/steps/release/release_images.go | 8 +++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/pkg/steps/release/create_release.go b/pkg/steps/release/create_release.go index 733bdc0599f..a4f8d8cebfd 100644 --- a/pkg/steps/release/create_release.go +++ b/pkg/steps/release/create_release.go @@ -2,6 +2,7 @@ package release import ( "context" + "encoding/json" "fmt" "github.com/openshift/ci-tools/pkg/results" "github.com/openshift/ci-tools/pkg/steps/utils" @@ -175,6 +176,21 @@ func (s *assembleReleaseStep) run(ctx context.Context) error { return results.ForReason("missing_release").WithError(err).Errorf("could not resolve imagestream %s: %v", streamName, err) } + // we want to expose the release payload as a CI version that looks just like + // the release versions for nightlies and CI release candidates + prefix := "0.0.1-0" + if raw, ok := stable.ObjectMeta.Annotations[releaseConfigAnnotation]; ok { + var releaseConfig struct { + Name string `json:"name"` + } + if err := json.Unmarshal([]byte(raw), &releaseConfig); err != nil { + return results.ForReason("invalid_release").WithError(err).Errorf("could not resolve release configuration on imagestream %s: %v", streamName, err) + } + prefix = releaseConfig.Name + } + now := time.Now().UTC().Truncate(time.Second) + version := fmt.Sprintf("%s.test-%s-%s", prefix, now.Format("2006-01-02-150405"), s.jobSpec.Namespace()) + destination := fmt.Sprintf("%s:%s", releaseImageStreamRepo, s.name) log.Printf("Create release image %s", destination) podConfig := steps.PodStepConfiguration{ @@ -190,9 +206,9 @@ func (s *assembleReleaseStep) run(ctx context.Context) error { set -euo pipefail export HOME=/tmp oc registry login -oc adm release new --max-per-registry=32 -n %q --from-image-stream %q --to-image-base %q --to-image %q +oc adm release new --max-per-registry=32 -n %q --from-image-stream %q --to-image-base %q --to-image %q --name %q oc adm release extract --from=%q --to=/tmp/artifacts/release-payload-%s -`, s.jobSpec.Namespace(), streamName, cvo, destination, destination, s.name), +`, s.jobSpec.Namespace(), streamName, cvo, destination, version, destination, s.name), } // set an explicit default for release-latest resources, but allow customization if necessary diff --git a/pkg/steps/release/release_images.go b/pkg/steps/release/release_images.go index 1b5e24a947e..422c67b1a6e 100644 --- a/pkg/steps/release/release_images.go +++ b/pkg/steps/release/release_images.go @@ -24,6 +24,8 @@ import ( "github.com/openshift/ci-tools/pkg/util" ) +const releaseConfigAnnotation = "release.openshift.io/config" + // stableImagesTagStep is used when no release configuration is necessary type stableImagesTagStep struct { jobSpec *api.JobSpec @@ -120,7 +122,8 @@ func (s *releaseImagesTagStep) run(ctx context.Context) error { is.UID = "" newIS := &imageapi.ImageStream{ ObjectMeta: meta.ObjectMeta{ - Name: api.StableStreamFor(api.LatestStableName), + Name: api.StableStreamFor(api.LatestStableName), + Annotations: map[string]string{}, }, Spec: imageapi.ImageStreamSpec{ LookupPolicy: imageapi.ImageLookupPolicy{ @@ -128,6 +131,9 @@ func (s *releaseImagesTagStep) run(ctx context.Context) error { }, }, } + if raw, ok := is.ObjectMeta.Annotations[releaseConfigAnnotation]; ok { + newIS.ObjectMeta.Annotations[releaseConfigAnnotation] = raw + } for _, tag := range is.Spec.Tags { if valid, _ := utils.FindStatusTag(is, tag.Name); valid != nil { newIS.Spec.Tags = append(newIS.Spec.Tags, imageapi.TagReference{