@@ -15,6 +15,7 @@ import (
1515 "time"
1616
1717 "github.com/go-logr/logr"
18+ corev1 "k8s.io/api/core/v1"
1819 "k8s.io/apimachinery/pkg/api/equality"
1920 apierrors "k8s.io/apimachinery/pkg/api/errors"
2021 "k8s.io/apimachinery/pkg/api/meta"
@@ -131,20 +132,14 @@ func (c *ClusterObjectSetReconciler) reconcile(ctx context.Context, cos *ocv1.Cl
131132 remaining , hasDeadline := durationUntilDeadline (c .Clock , cos )
132133 isDeadlineExceeded := hasDeadline && remaining <= 0
133134
134- secretReader := newReferencedSecretReader (c .Client )
135135 // Blocked takes precedence over ProgressDeadlineExceeded: it is more actionable for the user.
136- if err := c .verifyReferencedSecretsImmutable (ctx , cos , secretReader ); err != nil {
137- var mutableSecrets * mutableSecretsError
138- if ! errors .As (err , & mutableSecrets ) {
139- setRetryingConditions (l , cos , err .Error (), isDeadlineExceeded )
140- return ctrl.Result {}, err
141- }
136+ if err := c .verifyReferencedSecretsImmutable (ctx , cos ); err != nil {
142137 l .Error (err , "referenced Secret verification failed, blocking reconciliation" )
143138 markAsNotProgressing (cos , ocv1 .ClusterObjectSetReasonBlocked , err .Error ())
144- return ctrl.Result {RequeueAfter : 10 * time . Second }, nil
139+ return ctrl.Result {}, nil
145140 }
146141
147- phases , currentPhases , opts , err := c .buildBoxcutterPhases (ctx , cos , secretReader )
142+ phases , currentPhases , opts , err := c .buildBoxcutterPhases (ctx , cos )
148143 if err != nil {
149144 setRetryingConditions (l , cos , err .Error (), isDeadlineExceeded )
150145 return ctrl.Result {}, fmt .Errorf ("converting to boxcutter revision: %v" , err )
@@ -230,9 +225,6 @@ func (c *ClusterObjectSetReconciler) reconcile(ctx context.Context, cos *ocv1.Cl
230225 }
231226
232227 revVersion := cos .GetAnnotations ()[labels .BundleVersionKey ]
233- if revVersion == "" {
234- revVersion = fmt .Sprint (cos .Spec .Revision )
235- }
236228 if rres .InTransition () {
237229 markAsProgressing (l , cos , ocv1 .ReasonRollingOut , fmt .Sprintf ("Revision %s is rolling out." , revVersion ), isDeadlineExceeded )
238230 }
@@ -475,7 +467,7 @@ func (c *ClusterObjectSetReconciler) listOtherActiveRevisions(
475467 return result , nil
476468}
477469
478- func (c * ClusterObjectSetReconciler ) buildBoxcutterPhases (ctx context.Context , cos * ocv1.ClusterObjectSet , secretReader * referencedSecretReader ) ([]boxcutter.Phase , []ocv1.ObservedPhase , []boxcutter.RevisionReconcileOption , error ) {
470+ func (c * ClusterObjectSetReconciler ) buildBoxcutterPhases (ctx context.Context , cos * ocv1.ClusterObjectSet ) ([]boxcutter.Phase , []ocv1.ObservedPhase , []boxcutter.RevisionReconcileOption , error ) {
479471 siblings , err := c .listSiblingRevisions (ctx , cos )
480472 if err != nil {
481473 return nil , nil , nil , fmt .Errorf ("listing sibling revisions: %w" , err )
@@ -507,7 +499,7 @@ func (c *ClusterObjectSetReconciler) buildBoxcutterPhases(ctx context.Context, c
507499 case specObj .Object .Object != nil :
508500 obj = specObj .Object .DeepCopy ()
509501 case specObj .Ref .Name != "" :
510- resolved , err := secretReader .resolveObjectRef (ctx , specObj .Ref )
502+ resolved , err := c .resolveObjectRef (ctx , specObj .Ref )
511503 if err != nil {
512504 return nil , nil , nil , fmt .Errorf ("resolving ref in phase %q: %w" , specPhase .Name , err )
513505 }
@@ -549,10 +541,10 @@ func (c *ClusterObjectSetReconciler) buildBoxcutterPhases(ctx context.Context, c
549541
550542// resolveObjectRef fetches the referenced Secret, reads the value at the specified key,
551543// auto-detects gzip compression, and deserializes into an unstructured.Unstructured.
552- func (r * referencedSecretReader ) resolveObjectRef (ctx context.Context , ref ocv1.ObjectSourceRef ) (* unstructured.Unstructured , error ) {
544+ func (c * ClusterObjectSetReconciler ) resolveObjectRef (ctx context.Context , ref ocv1.ObjectSourceRef ) (* unstructured.Unstructured , error ) {
545+ secret := & corev1.Secret {}
553546 key := client.ObjectKey {Name : ref .Name , Namespace : ref .Namespace }
554- secret , err := r .get (ctx , key )
555- if err != nil {
547+ if err := c .Client .Get (ctx , key , secret ); err != nil {
556548 return nil , fmt .Errorf ("getting Secret %s/%s: %w" , ref .Namespace , ref .Name , err )
557549 }
558550
@@ -785,7 +777,7 @@ func verifyObservedPhases(stored, current []ocv1.ObservedPhase) error {
785777// verifyReferencedSecretsImmutable checks that all referenced Secrets
786778// have Immutable set to true. It collects all violations and returns
787779// a single error listing every misconfigured Secret.
788- func (c * ClusterObjectSetReconciler ) verifyReferencedSecretsImmutable (ctx context.Context , cos * ocv1.ClusterObjectSet , secretReader * referencedSecretReader ) error {
780+ func (c * ClusterObjectSetReconciler ) verifyReferencedSecretsImmutable (ctx context.Context , cos * ocv1.ClusterObjectSet ) error {
789781 type secretRef struct {
790782 name string
791783 namespace string
@@ -808,9 +800,9 @@ func (c *ClusterObjectSetReconciler) verifyReferencedSecretsImmutable(ctx contex
808800
809801 var mutableSecrets []string
810802 for _ , ref := range refs {
803+ secret := & corev1.Secret {}
811804 key := client.ObjectKey {Name : ref .name , Namespace : ref .namespace }
812- secret , err := secretReader .get (ctx , key )
813- if err != nil {
805+ if err := c .Client .Get (ctx , key , secret ); err != nil {
814806 if apierrors .IsNotFound (err ) {
815807 // Secret not yet available — skip verification.
816808 // resolveObjectRef will handle the not-found with a retryable error.
@@ -825,7 +817,8 @@ func (c *ClusterObjectSetReconciler) verifyReferencedSecretsImmutable(ctx contex
825817 }
826818
827819 if len (mutableSecrets ) > 0 {
828- return & mutableSecretsError {names : mutableSecrets }
820+ return fmt .Errorf ("the following secrets are not immutable (referenced secrets must have immutable set to true): %s" ,
821+ strings .Join (mutableSecrets , ", " ))
829822 }
830823
831824 return nil
0 commit comments