From 14f228bf8fe8d05039a97ea98da28ec8f63a2ec7 Mon Sep 17 00:00:00 2001 From: Cesar Wong Date: Tue, 5 Sep 2023 17:51:57 -0400 Subject: [PATCH] Use MCO and CCO image references when looking up mappings 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. --- .../ignitionserver/ignitionserver.go | 84 ++++++++----------- 1 file changed, 34 insertions(+), 50 deletions(-) diff --git a/control-plane-operator/controllers/hostedcontrolplane/ignitionserver/ignitionserver.go b/control-plane-operator/controllers/hostedcontrolplane/ignitionserver/ignitionserver.go index 496080537c0..ec0cd8421f3 100644 --- a/control-plane-operator/controllers/hostedcontrolplane/ignitionserver/ignitionserver.go +++ b/control-plane-operator/controllers/hostedcontrolplane/ignitionserver/ignitionserver.go @@ -5,7 +5,6 @@ import ( "context" "fmt" "net" - "strings" configv1 "github.com/openshift/api/config/v1" routev1 "github.com/openshift/api/route/v1" @@ -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) @@ -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 }