Skip to content

Commit

Permalink
Use MCO and CCO image references when looking up mappings
Browse files Browse the repository at this point in the history
Currently, we unconditionally use an image mapping from the management
cluster if a mapping exists for ocp-release-dev or ocp/release.
When the individual images do not use those registries, the wrong
mapping is used.
This commit uses the individual images from the payload to look for any
image mappings that may exist on the management cluster.
  • Loading branch information
csrwng committed Sep 5, 2023
1 parent 068f642 commit 14f228b
Showing 1 changed file with 34 additions and 50 deletions.
Expand Up @@ -5,7 +5,6 @@ import (
"context"
"fmt"
"net"
"strings"

configv1 "github.com/openshift/api/config/v1"
routev1 "github.com/openshift/api/route/v1"
Expand Down Expand Up @@ -186,53 +185,40 @@ func ReconcileIgnitionServer(ctx context.Context,
if configOperatorImage == "" {
return fmt.Errorf("cluster-config-operator image not found in payload images")
}
machineConfigOperatorImage := componentImages["machine-config-operator"]
if machineConfigOperatorImage == "" {
return fmt.Errorf("machine-config-operator image not found in payload images")
}
servingCertSecretName := ignitionserver.IgnitionServingCertSecret("").Name
if hcp.Spec.Platform.Type != hyperv1.IBMCloudPlatform {
servingCertSecretName = manifests.IgnitionServerCertSecret("").Name
}

var (
icsFound bool
sourceRef reference.DockerImageReference
mirrorImage string
)

if openShiftRegistryOverrides != "=" && len(openShiftRegistryOverrides) > 0 {
var err error
// Ignition server cannot handle ImageContentSourcePolicies or ImageDigestMachineSet, so we need to
// fill the registryOverrides in the case of disconnected environments
mirrorImage = lookupDisconnectedRegistry(ctx, openShiftRegistryOverrides)
if len(mirrorImage) > 0 {
sourceRef, err = reference.Parse(mirrorImage)
if err != nil {
return fmt.Errorf("failed to parse private registry hosted control plane image reference %q: %w", mirrorImage, err)
}
icsFound = true
}
// Determine if we need to override the machine config operator and cluster config operator
// images based on image mappings present in management cluster.
ocpRegistryMapping := util.ConvertImageRegistryOverrideStringToMap(openShiftRegistryOverrides)
overrideConfigOperatorImage, err := lookupMappedImage(ocpRegistryMapping, configOperatorImage)
if err != nil {
return err
}
overrideMachineConfigOperatorImage, err := lookupMappedImage(ocpRegistryMapping, machineConfigOperatorImage)
if err != nil {
return err
}

if icsFound {
privateRegistry := sourceRef.Registry

if !strings.HasPrefix(componentImages["machine-config-operator"], privateRegistry) {
ocpReleaseMcoImage := componentImages["machine-config-operator"]
mcoSha, err := reference.Parse(ocpReleaseMcoImage)
if err != nil {
return fmt.Errorf("failed to parse machine-config-operator image reference %q: %w", ocpReleaseMcoImage, err)
}
registryOverrides[ocpReleaseMcoImage] = fmt.Sprintf("%s@%s", mirrorImage, mcoSha.ID)
imageOverrides := map[string]string{}
for k, v := range registryOverrides {
if k != "" {
imageOverrides[k] = v
}
}

if !strings.HasPrefix(componentImages["cluster-config-operator"], privateRegistry) {
ocpReleaseCCOImage := componentImages["cluster-config-operator"]
ccoSha, err := reference.Parse(ocpReleaseCCOImage)
if err != nil {
return fmt.Errorf("failed to parse cluster-config-operator image reference %s: %w", ocpReleaseCCOImage, err)
}
registryOverrides[ocpReleaseCCOImage] = fmt.Sprintf("%s@%s", mirrorImage, ccoSha.ID)
}
if overrideConfigOperatorImage != configOperatorImage {
imageOverrides[configOperatorImage] = overrideConfigOperatorImage
}

delete(registryOverrides, "")
if overrideMachineConfigOperatorImage != machineConfigOperatorImage {
imageOverrides[machineConfigOperatorImage] = overrideMachineConfigOperatorImage
}

ignitionServerDeployment := ignitionserver.Deployment(controlPlaneNamespace)
Expand Down Expand Up @@ -896,18 +882,16 @@ cp /tmp/manifests/99_feature-gate.yaml %[1]s/99_feature-gate.yaml
return fmt.Sprintf(script, workDir, featureGateYAML)
}

func lookupDisconnectedRegistry(ctx context.Context, strOcpOverrides string) string {
ocpOverrides := strings.Split(strOcpOverrides, ",")
for _, entry := range ocpOverrides {
sourceImage := strings.Split(entry, "=")[0]
mirrorImage := strings.Split(entry, "=")[1]

if strings.Contains(sourceImage, "openshift-release-dev") || strings.Contains(sourceImage, "ocp/release") {
// Production releases: 'openshift-release-dev'
// Nightly releases: 'ocp/release'
return mirrorImage
func lookupMappedImage(ocpOverrides map[string][]string, image string) (string, error) {
ref, err := reference.Parse(image)
if err != nil {
return "", fmt.Errorf("failed to parse image (%s): %w", image, err)
}
for registry, replacements := range ocpOverrides {
if ref.Registry == registry {
ref.Registry = replacements[0]
return ref.String(), nil
}
}

return ""
return image, nil
}

0 comments on commit 14f228b

Please sign in to comment.