Skip to content

Commit 4869afa

Browse files
committed
Support for referencePolicy Source while importing release payload & Update reference-mode=source for creating new payloads
1 parent 8d9f864 commit 4869afa

File tree

10 files changed

+172
-28
lines changed

10 files changed

+172
-28
lines changed

pkg/api/ephemeralcluster/v1/ci.openshift.io_ephemeralclusters.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ spec:
9696
description: Namespace is the namespace in which the
9797
integration stream lives.
9898
type: string
99+
reference_policy:
100+
description: ReferencePolicy is the policy to use when
101+
resolving references (Local or Source)
102+
type: string
99103
required:
100104
- name
101105
- namespace

pkg/api/types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
prowv1 "sigs.k8s.io/prow/pkg/apis/prowjobs/v1"
99
prowconfig "sigs.k8s.io/prow/pkg/config"
1010
"sigs.k8s.io/prow/pkg/repoowners"
11+
12+
imagev1 "github.com/openshift/api/image/v1"
1113
)
1214

1315
const (
@@ -335,6 +337,8 @@ type Integration struct {
335337
// IncludeBuiltImages determines if the release we assemble will include
336338
// images built during the test itself.
337339
IncludeBuiltImages bool `json:"include_built_images,omitempty"`
340+
// ReferencePolicy is the policy to use when resolving references (Local or Source)
341+
ReferencePolicy *imagev1.TagReferencePolicyType `json:"reference_policy,omitempty"`
338342
}
339343

340344
// ReleaseDescriptor holds common data for different types of release payloads
@@ -511,6 +515,9 @@ type ReleaseTagConfiguration struct {
511515
// IncludeBuiltImages determines if the release we assemble will include
512516
// images built during the test itself.
513517
IncludeBuiltImages bool `json:"include_built_images,omitempty"`
518+
519+
// ReferencePolicy is the policy to use when resolving references (Local or Source)
520+
ReferencePolicy *imagev1.TagReferencePolicyType `json:"reference_policy,omitempty"`
514521
}
515522

516523
func (config ReleaseTagConfiguration) InputsName() string {

pkg/api/zz_generated.deepcopy.go

Lines changed: 22 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/defaults/defaults.go

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ func fromConfig(
187187
// factor release steps into something more reusable
188188
hasReleaseStep = true
189189
var value string
190+
var err error
190191
var overrideCLIReleaseExtractImage *coreapi.ObjectReference
191192
var overrideCLIResolveErr error
192193
switch {
@@ -214,12 +215,22 @@ func fromConfig(
214215
switch {
215216
case resolveConfig.Integration != nil:
216217
logrus.Infof("Building release %s from a snapshot of %s/%s", resolveConfig.Name, resolveConfig.Integration.Namespace, resolveConfig.Integration.Name)
217-
// this is the one case where we're not importing a payload, we need to get the images and build one
218-
snapshot := releasesteps.ReleaseSnapshotStep(resolveConfig.Name, *resolveConfig.Integration, podClient, jobSpec, integratedStreams[fmt.Sprintf("%s/%s", resolveConfig.Integration.Namespace, resolveConfig.Integration.Name)])
218+
219+
var snapshot api.Step
220+
var key string
221+
222+
if resolveConfig.Integration.ReferencePolicy != nil {
223+
key = fmt.Sprintf("%s/%s/%s", resolveConfig.Integration.Namespace, resolveConfig.Integration.Name, *resolveConfig.Integration.ReferencePolicy)
224+
} else {
225+
key = fmt.Sprintf("%s/%s", resolveConfig.Integration.Namespace, resolveConfig.Integration.Name)
226+
}
227+
228+
snapshot = releasesteps.ReleaseSnapshotStep(resolveConfig.Name, *resolveConfig.Integration, podClient, jobSpec, integratedStreams[key])
219229
assemble := releasesteps.AssembleReleaseStep(resolveConfig.Name, nodeName, &api.ReleaseTagConfiguration{
220230
Namespace: resolveConfig.Integration.Namespace,
221231
Name: resolveConfig.Integration.Name,
222232
IncludeBuiltImages: resolveConfig.Integration.IncludeBuiltImages,
233+
ReferencePolicy: resolveConfig.Integration.ReferencePolicy,
223234
}, config.Resources, podClient, jobSpec)
224235
for _, s := range []api.Step{snapshot, assemble} {
225236
buildSteps = append(buildSteps, s)
@@ -231,7 +242,13 @@ func fromConfig(
231242
source = releasesteps.NewReleaseSourceFromConfig(resolveConfig, httpClient)
232243
}
233244
}
234-
step := releasesteps.ImportReleaseStep(resolveConfig.Name, nodeName, resolveConfig.TargetName(), source, false, config.Resources, podClient, jobSpec, pullSecret, overrideCLIReleaseExtractImage)
245+
var referencePolicy imagev1.TagReferencePolicyType
246+
if resolveConfig.Integration != nil && resolveConfig.Integration.ReferencePolicy != nil {
247+
referencePolicy = *resolveConfig.Integration.ReferencePolicy
248+
} else {
249+
referencePolicy = imagev1.LocalTagReferencePolicy // Provide a default value or handle appropriately
250+
}
251+
step := releasesteps.ImportReleaseStep(resolveConfig.Name, nodeName, resolveConfig.TargetName(), referencePolicy, source, false, config.Resources, podClient, jobSpec, pullSecret, overrideCLIReleaseExtractImage)
235252
buildSteps = append(buildSteps, step)
236253
addProvidesForStep(step, params)
237254
continue
@@ -283,6 +300,12 @@ func fromConfig(
283300
for _, name := range []string{api.InitialReleaseName, api.LatestReleaseName} {
284301
var releaseStep api.Step
285302
envVar := utils.ReleaseImageEnv(name)
303+
var referencePolicy imagev1.TagReferencePolicyType
304+
if rawStep.ReleaseImagesTagStepConfiguration.ReferencePolicy != nil {
305+
referencePolicy = *rawStep.ReleaseImagesTagStepConfiguration.ReferencePolicy
306+
} else {
307+
referencePolicy = imagev1.LocalTagReferencePolicy // Provide a default value or handle appropriately
308+
}
286309
if params.HasInput(envVar) {
287310
pullSpec, err := params.Get(envVar)
288311
if err != nil {
@@ -291,10 +314,11 @@ func fromConfig(
291314
logrus.Infof("Using explicitly provided pull-spec for release %s (%s)", name, pullSpec)
292315
target := rawStep.ReleaseImagesTagStepConfiguration.TargetName(name)
293316
source := releasesteps.NewReleaseSourceFromPullSpec(pullSpec)
294-
releaseStep = releasesteps.ImportReleaseStep(name, nodeName, target, source, true, config.Resources, podClient, jobSpec, pullSecret, nil)
317+
releaseStep = releasesteps.ImportReleaseStep(name, nodeName, target, referencePolicy, source, true, config.Resources, podClient, jobSpec, pullSecret, nil)
295318
} else {
296319
// for backwards compatibility, users get inclusion for free with tag_spec
297320
cfg := *rawStep.ReleaseImagesTagStepConfiguration
321+
cfg.ReferencePolicy = &referencePolicy
298322
cfg.IncludeBuiltImages = name == api.LatestReleaseName
299323
releaseStep = releasesteps.AssembleReleaseStep(name, nodeName, &cfg, config.Resources, podClient, jobSpec)
300324
}
@@ -449,8 +473,9 @@ func stepForTest(
449473
step = steps.ClusterClaimStep(c.As, c.ClusterClaim, hiveClient, client, jobSpec, step, censor)
450474
name := c.ClusterClaim.ClaimRelease(c.As).ReleaseName
451475
target := api.ReleaseConfiguration{Name: name}.TargetName()
476+
referencePolicy := imagev1.LocalTagReferencePolicy
452477
source := releasesteps.NewReleaseSourceFromClusterClaim(c.As, c.ClusterClaim, hiveClient)
453-
ret = append(ret, releasesteps.ImportReleaseStep(name, nodeName, target, source, false, config.Resources, podClient, jobSpec, pullSecret, nil))
478+
ret = append(ret, releasesteps.ImportReleaseStep(name, nodeName, target, referencePolicy, source, false, config.Resources, podClient, jobSpec, pullSecret, nil))
454479
}
455480
addProvidesForStep(step, params)
456481
ret = append(ret, step)

pkg/steps/clusterinstall/template.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ objects:
440440
mkdir /tmp/.docker && cp /etc/openshift-installer/pull-secret /tmp/.docker/config.json
441441
oc registry login --to /tmp/.docker/config.json
442442
MIRROR_BASE=$( oc get is release -o 'jsonpath={.status.publicDockerImageRepository}' )
443-
oc adm release new --from-release ${RELEASE_IMAGE_LATEST} --to-image ${MIRROR_BASE}-scratch:release --mirror ${MIRROR_BASE}-scratch || echo 'ignore: the release could not be reproduced from its inputs'
443+
oc adm release new --reference-mode='' --from-release ${RELEASE_IMAGE_LATEST} --to-image ${MIRROR_BASE}-scratch:release --mirror ${MIRROR_BASE}-scratch || echo 'ignore: the release could not be reproduced from its inputs'
444444
oc adm release mirror --from ${MIRROR_BASE}-scratch:release --to ${MIRROR_BASE} --to-release-image ${MIRROR_BASE}:mirrored
445445
RELEASE_PAYLOAD_IMAGE_SHA=$(oc get istag ${MIRROR_BASE##*/}:mirrored -o=jsonpath="{.image.metadata.name}")
446446
oc delete imagestream "$(basename "${MIRROR_BASE}-scratch")"

pkg/steps/release/create_release.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package release
33
import (
44
"context"
55
"fmt"
6+
"strings"
67
"time"
78

89
"github.com/sirupsen/logrus"
@@ -172,6 +173,12 @@ func (s *assembleReleaseStep) run(ctx context.Context) error {
172173
now := time.Now().UTC().Truncate(time.Second)
173174
version := fmt.Sprintf("%s-%s-test-%s-%s", prefix, now.Format("2006-01-02-150405"), s.jobSpec.Namespace(), s.name)
174175

176+
referencePolicy := ""
177+
if s.config.ReferencePolicy != nil && *s.config.ReferencePolicy == imagev1.SourceTagReferencePolicy {
178+
// we need to set the reference policy to Source
179+
referencePolicy = strings.ToLower(string(*s.config.ReferencePolicy))
180+
}
181+
175182
destination := fmt.Sprintf("%s:%s", releaseImageStreamRepo, s.name)
176183
logrus.Infof("Creating release image %s.", destination)
177184
podConfig := steps.PodStepConfiguration{
@@ -192,7 +199,7 @@ mkdir -p "${XDG_RUNTIME_DIR}"
192199
oc registry login
193200
exit_code="0"
194201
for ((i=1; i<=5; i++)); do
195-
if oc adm release new --max-per-registry=32 -n %q --from-image-stream %q --to-image-base %q --to-image %q --name %q; then
202+
if oc adm release new --reference-mode=%q --max-per-registry=32 -n %q --from-image-stream %q --to-image-base %q --to-image %q --name %q; then
196203
echo "Payload creation success."
197204
exit_code="0"
198205
break
@@ -226,7 +233,7 @@ done
226233
if [[ "$exit_code" != "0" ]]; then
227234
exit $exit_code
228235
fi
229-
`, s.jobSpec.Namespace(), streamName, cvo, destination, version, s.name, destination, s.name),
236+
`, referencePolicy, s.jobSpec.Namespace(), streamName, cvo, destination, version, s.name, destination, s.name),
230237
}
231238

232239
// set an explicit default for release-latest resources, but allow customization if necessary

pkg/steps/release/import_release.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,11 @@ import (
4949
// branches of those releases.
5050
type importReleaseStep struct {
5151
// name is the name of the release we're importing, like 'latest'
52-
name string
53-
nodeName string
54-
target string
55-
source ReleaseSource
52+
name string
53+
nodeName string
54+
target string
55+
referencePolicy imagev1.TagReferencePolicyType
56+
source ReleaseSource
5657
// append determines if we wait for other processes to create images first
5758
append bool
5859
resources api.ResourceConfiguration
@@ -229,11 +230,15 @@ oc create configmap release-%s --from-file=%s.yaml=${ARTIFACT_DIR}/%s
229230
}
230231
}
231232

233+
referencePolicy := imagev1.LocalTagReferencePolicy
234+
if s.referencePolicy == imagev1.SourceTagReferencePolicy {
235+
referencePolicy = s.referencePolicy
236+
}
232237
existing := sets.New[string]()
233238
tags := make([]imagev1.TagReference, 0, len(releaseIS.Spec.Tags)+len(stable.Spec.Tags))
234239
for _, tag := range releaseIS.Spec.Tags {
235240
existing.Insert(tag.Name)
236-
tag.ReferencePolicy.Type = imagev1.LocalTagReferencePolicy
241+
tag.ReferencePolicy.Type = referencePolicy
237242
tag.ImportPolicy.ImportMode = imagev1.ImportModePreserveOriginal
238243
tags = append(tags, tag)
239244
}
@@ -242,7 +247,7 @@ oc create configmap release-%s --from-file=%s.yaml=${ARTIFACT_DIR}/%s
242247
continue
243248
}
244249
existing.Insert(tag.Name)
245-
tag.ReferencePolicy.Type = imagev1.LocalTagReferencePolicy
250+
tag.ReferencePolicy.Type = referencePolicy
246251
tag.ImportPolicy.ImportMode = imagev1.ImportModePreserveOriginal
247252
tags = append(tags, tag)
248253
}
@@ -315,6 +320,7 @@ func (s *importReleaseStep) Objects() []ctrlruntimeclient.Object {
315320
// ImportReleaseStep imports an existing update payload image
316321
func ImportReleaseStep(
317322
name, nodeName, target string,
323+
referencePolicy imagev1.TagReferencePolicyType,
318324
source ReleaseSource,
319325
append bool,
320326
resources api.ResourceConfiguration,
@@ -326,6 +332,7 @@ func ImportReleaseStep(
326332
name: name,
327333
nodeName: nodeName,
328334
target: target,
335+
referencePolicy: referencePolicy,
329336
source: source,
330337
append: append,
331338
resources: resources,
@@ -345,18 +352,23 @@ func (s *importReleaseStep) getCLIImage(ctx context.Context, target, streamName
345352
// create the imagestream to be able to set it there.
346353
if err := s.client.Create(ctx, &imagev1.ImageStream{
347354
ObjectMeta: metav1.ObjectMeta{Name: overrideCLIStreamName, Namespace: s.jobSpec.Namespace()},
348-
Spec: imagev1.ImageStreamSpec{LookupPolicy: imagev1.ImageLookupPolicy{Local: true}},
355+
Spec: imagev1.ImageStreamSpec{LookupPolicy: imagev1.ImageLookupPolicy{Local: true}, Tags: []imagev1.TagReference{{ReferencePolicy: imagev1.TagReferencePolicy{Type: s.referencePolicy}}}},
349356
}); err != nil && !kerrors.IsAlreadyExists(err) {
350357
return nil, fmt.Errorf("failed to create %s imagestream: %w", overrideCLIStreamName, err)
351358
}
359+
360+
referencePolicy := imagev1.LocalTagReferencePolicy
361+
if s.referencePolicy == imagev1.SourceTagReferencePolicy {
362+
referencePolicy = s.referencePolicy
363+
}
352364
streamTag := &imagev1.ImageStreamTag{
353365
ObjectMeta: meta.ObjectMeta{
354366
Namespace: s.jobSpec.Namespace(),
355367
Name: overrideCLIStreamName + ":latest",
356368
},
357369
Tag: &imagev1.TagReference{
358370
ReferencePolicy: imagev1.TagReferencePolicy{
359-
Type: imagev1.LocalTagReferencePolicy,
371+
Type: referencePolicy,
360372
},
361373
From: s.overrideCLIReleaseExtractImage,
362374
},
@@ -416,14 +428,18 @@ func (s *importReleaseStep) getCLIImage(ctx context.Context, target, streamName
416428
return nil, err
417429
}
418430
// tag the cli image into stable so we use the correct pull secrets from the namespace
431+
referencePolicy := imagev1.LocalTagReferencePolicy
432+
if s.referencePolicy == imagev1.SourceTagReferencePolicy {
433+
referencePolicy = s.referencePolicy
434+
}
419435
streamTag := &imagev1.ImageStreamTag{
420436
ObjectMeta: meta.ObjectMeta{
421437
Namespace: s.jobSpec.Namespace(),
422438
Name: fmt.Sprintf("%s:cli", streamName),
423439
},
424440
Tag: &imagev1.TagReference{
425441
ReferencePolicy: imagev1.TagReferencePolicy{
426-
Type: imagev1.LocalTagReferencePolicy,
442+
Type: referencePolicy,
427443
},
428444
From: &coreapi.ObjectReference{
429445
Kind: "DockerImage",

0 commit comments

Comments
 (0)