Skip to content

Commit 32c326c

Browse files
jhadvigclaude
andcommitted
pkg/payload: Add Images map to manifest template config
Add an Images field to manifestRenderConfig, populated from the release payload's image-references ImageStream. This allows CVO manifests in /manifests/ to reference component images by short name using Go template syntax: {{index .Images "component-name"}}. Also set missingkey=zero on the template engine so that manifests referencing template fields not yet known to an older CVO binary render as zero values instead of causing a fatal error. This is a forward-compatibility safety net for upgrades: when an older CVO loads a newer payload that uses new template fields, the unknown fields render as empty strings and the manifests are subsequently filtered out by feature-set or capability gating. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 810bfc1 commit 32c326c

2 files changed

Lines changed: 26 additions & 3 deletions

File tree

pkg/payload/payload.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ func LoadUpdate(dir, releaseImage, excludeIdentifier string, requiredFeatureSet
153153
return nil, err
154154
}
155155

156-
tasks := loadPayloadTasks(releaseDir, cvoDir, releaseImage, profile)
156+
tasks := loadPayloadTasks(releaseDir, cvoDir, releaseImage, profile, payload.ImageRef)
157157

158158
var onlyKnownCaps *configv1.ClusterVersionCapabilitiesStatus
159159

@@ -317,13 +317,14 @@ type payloadTasks struct {
317317
skipFiles sets.Set[string]
318318
}
319319

320-
func loadPayloadTasks(releaseDir, cvoDir, releaseImage, clusterProfile string) []payloadTasks {
320+
func loadPayloadTasks(releaseDir, cvoDir, releaseImage, clusterProfile string, imageRef *imagev1.ImageStream) []payloadTasks {
321321
cjf := filepath.Join(releaseDir, cincinnatiJSONFile)
322322
irf := filepath.Join(releaseDir, imageReferencesFile)
323323

324324
mrc := manifestRenderConfig{
325325
ReleaseImage: releaseImage,
326326
ClusterProfile: clusterProfile,
327+
Images: imagesFromImageRef(imageRef),
327328
}
328329

329330
return []payloadTasks{{

pkg/payload/render.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020

2121
"github.com/openshift/api/config"
2222
configv1 "github.com/openshift/api/config/v1"
23+
imagev1 "github.com/openshift/api/image/v1"
2324
"github.com/openshift/library-go/pkg/manifest"
2425
)
2526

@@ -38,6 +39,12 @@ func Render(outputDir, releaseImage, clusterVersionManifestPath, featureGateMani
3839
}
3940
)
4041

42+
imageRef, err := loadImageReferences(releaseManifestsDir)
43+
if err != nil {
44+
return fmt.Errorf("error loading image references for manifest rendering: %w", err)
45+
}
46+
renderConfig.Images = imagesFromImageRef(imageRef)
47+
4148
overrides, err := parseClusterVersionManifest(clusterVersionManifestPath)
4249
if err != nil {
4350
return fmt.Errorf("error parsing cluster version manifest: %w", err)
@@ -181,11 +188,26 @@ func renderDir(renderConfig manifestRenderConfig, idir, odir string, overrides [
181188
type manifestRenderConfig struct {
182189
ReleaseImage string
183190
ClusterProfile string
191+
Images map[string]string
192+
}
193+
194+
// imagesFromImageRef builds a map from image short names to their resolved URIs.
195+
func imagesFromImageRef(imageRef *imagev1.ImageStream) map[string]string {
196+
images := make(map[string]string)
197+
if imageRef == nil {
198+
return images
199+
}
200+
for _, tag := range imageRef.Spec.Tags {
201+
if tag.From != nil && tag.From.Kind == "DockerImage" {
202+
images[tag.Name] = tag.From.Name
203+
}
204+
}
205+
return images
184206
}
185207

186208
// renderManifest Executes go text template from `manifestBytes` with `config`.
187209
func renderManifest(config manifestRenderConfig, manifestBytes []byte) ([]byte, error) {
188-
tmpl, err := template.New("manifest").Parse(string(manifestBytes))
210+
tmpl, err := template.New("manifest").Option("missingkey=zero").Parse(string(manifestBytes))
189211
if err != nil {
190212
return nil, errors.Wrapf(err, "failed to parse manifest")
191213
}

0 commit comments

Comments
 (0)