diff --git a/go.mod b/go.mod index da8af52846..156afc59b2 100644 --- a/go.mod +++ b/go.mod @@ -35,17 +35,17 @@ require ( golang.org/x/sync v0.19.0 golang.org/x/tools v0.42.0 helm.sh/helm/v3 v3.20.0 - k8s.io/api v0.35.0 - k8s.io/apiextensions-apiserver v0.35.0 - k8s.io/apimachinery v0.35.0 - k8s.io/apiserver v0.35.0 + k8s.io/api v0.35.1 + k8s.io/apiextensions-apiserver v0.35.1 + k8s.io/apimachinery v0.35.1 + k8s.io/apiserver v0.35.1 k8s.io/cli-runtime v0.35.0 - k8s.io/client-go v0.35.0 - k8s.io/component-base v0.35.0 + k8s.io/client-go v0.35.1 + k8s.io/component-base v0.35.1 k8s.io/klog/v2 v2.130.1 k8s.io/kubernetes v1.35.0 k8s.io/utils v0.0.0-20260108192941-914a6e750570 - pkg.package-operator.run/boxcutter v0.10.0 + pkg.package-operator.run/boxcutter v0.11.0 sigs.k8s.io/controller-runtime v0.23.1 sigs.k8s.io/controller-tools v0.20.1 sigs.k8s.io/crdify v0.5.0 diff --git a/go.sum b/go.sum index 805a08cfd8..79b5cc0675 100644 --- a/go.sum +++ b/go.sum @@ -796,8 +796,8 @@ k8s.io/utils v0.0.0-20260108192941-914a6e750570 h1:JT4W8lsdrGENg9W+YwwdLJxklIuKW k8s.io/utils v0.0.0-20260108192941-914a6e750570/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= -pkg.package-operator.run/boxcutter v0.10.0 h1:ToohW6jmcSHKqJJgN6cbIQ5UFG/BkYIp0mXxzfH3ZFU= -pkg.package-operator.run/boxcutter v0.10.0/go.mod h1:uBJIZiMgUt1SaZJyRp06L6s2kqL+JLNVOts470+k8Mw= +pkg.package-operator.run/boxcutter v0.11.0 h1:VhIQ7baW7ad2mFDYQ2ybk/NqZo6BX0LfO/vI0usHj9U= +pkg.package-operator.run/boxcutter v0.11.0/go.mod h1:t/51lJTnGkpGKfNDSkycAjAeZTP214VyNIcyJOB5Nhw= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/controller-runtime v0.23.1 h1:TjJSM80Nf43Mg21+RCy3J70aj/W6KyvDtOlpKf+PupE= diff --git a/internal/operator-controller/controllers/clusterextensionrevision_controller.go b/internal/operator-controller/controllers/clusterextensionrevision_controller.go index aa757b7f9a..4b18c40c02 100644 --- a/internal/operator-controller/controllers/clusterextensionrevision_controller.go +++ b/internal/operator-controller/controllers/clusterextensionrevision_controller.go @@ -24,6 +24,7 @@ import ( "pkg.package-operator.run/boxcutter" "pkg.package-operator.run/boxcutter/machinery" machinerytypes "pkg.package-operator.run/boxcutter/machinery/types" + "pkg.package-operator.run/boxcutter/ownerhandling" "pkg.package-operator.run/boxcutter/probing" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -141,7 +142,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, cer return c.delete(ctx, cer) } - revision, opts, err := c.toBoxcutterRevision(ctx, cer) + phases, opts, err := c.buildBoxcutterPhases(ctx, cer) if err != nil { setRetryingConditions(cer, err.Error()) return ctrl.Result{}, fmt.Errorf("converting to boxcutter revision: %v", err) @@ -153,6 +154,14 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, cer return ctrl.Result{}, fmt.Errorf("failed to create revision engine: %v", err) } + revision := boxcutter.NewRevisionWithOwner( + cer.Name, + cer.Spec.Revision, + phases, + cer, + ownerhandling.NewNative(c.Client.Scheme()), + ) + if cer.Spec.LifecycleState == ocv1.ClusterExtensionRevisionLifecycleStateArchived { if err := c.TrackingCache.Free(ctx, cer); err != nil { markAsAvailableUnknown(cer, ocv1.ClusterExtensionRevisionReasonReconciling, err.Error()) @@ -171,7 +180,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, cer return ctrl.Result{}, werr } - rres, err := revisionEngine.Reconcile(ctx, *revision, opts...) + rres, err := revisionEngine.Reconcile(ctx, revision, opts...) if err != nil { if rres != nil { // Log detailed reconcile reports only in debug mode (V(1)) to reduce verbosity. @@ -296,8 +305,8 @@ func (c *ClusterExtensionRevisionReconciler) delete(ctx context.Context, cer *oc return ctrl.Result{}, nil } -func (c *ClusterExtensionRevisionReconciler) archive(ctx context.Context, revisionEngine RevisionEngine, cer *ocv1.ClusterExtensionRevision, revision *boxcutter.Revision) (ctrl.Result, error) { - tdres, err := revisionEngine.Teardown(ctx, *revision) +func (c *ClusterExtensionRevisionReconciler) archive(ctx context.Context, revisionEngine RevisionEngine, cer *ocv1.ClusterExtensionRevision, revision boxcutter.RevisionBuilder) (ctrl.Result, error) { + tdres, err := revisionEngine.Teardown(ctx, revision) if err != nil { err = fmt.Errorf("error archiving revision: %v", err) setRetryingConditions(cer, err.Error()) @@ -356,11 +365,11 @@ func (c *ClusterExtensionRevisionReconciler) SetupWithManager(mgr ctrl.Manager) Complete(c) } -func (c *ClusterExtensionRevisionReconciler) establishWatch(ctx context.Context, cer *ocv1.ClusterExtensionRevision, revision *boxcutter.Revision) error { +func (c *ClusterExtensionRevisionReconciler) establishWatch(ctx context.Context, cer *ocv1.ClusterExtensionRevision, revision boxcutter.RevisionBuilder) error { gvks := sets.New[schema.GroupVersionKind]() - for _, phase := range revision.Phases { - for _, obj := range phase.Objects { - gvks.Insert(obj.GroupVersionKind()) + for _, phase := range revision.GetPhases() { + for _, obj := range phase.GetObjects() { + gvks.Insert(obj.GetObjectKind().GroupVersionKind()) } } @@ -451,7 +460,7 @@ func (c *ClusterExtensionRevisionReconciler) listPreviousRevisions(ctx context.C return previous, nil } -func (c *ClusterExtensionRevisionReconciler) toBoxcutterRevision(ctx context.Context, cer *ocv1.ClusterExtensionRevision) (*boxcutter.Revision, []boxcutter.RevisionReconcileOption, error) { +func (c *ClusterExtensionRevisionReconciler) buildBoxcutterPhases(ctx context.Context, cer *ocv1.ClusterExtensionRevision) ([]boxcutter.Phase, []boxcutter.RevisionReconcileOption, error) { previous, err := c.listPreviousRevisions(ctx, cer) if err != nil { return nil, nil, fmt.Errorf("listing previous revisions: %w", err) @@ -473,13 +482,9 @@ func (c *ClusterExtensionRevisionReconciler) toBoxcutterRevision(ctx context.Con }), } - r := &boxcutter.Revision{ - Name: cer.Name, - Owner: cer, - Revision: cer.Spec.Revision, - } + phases := make([]boxcutter.Phase, 0) for _, specPhase := range cer.Spec.Phases { - phase := boxcutter.Phase{Name: specPhase.Name} + objs := make([]client.Object, 0) for _, specObj := range specPhase.Objects { obj := specObj.Object.DeepCopy() @@ -496,11 +501,11 @@ func (c *ClusterExtensionRevisionReconciler) toBoxcutterRevision(ctx context.Con obj, boxcutter.WithCollisionProtection(cp))) } - phase.Objects = append(phase.Objects, *obj) + objs = append(objs, obj) } - r.Phases = append(r.Phases, phase) + phases = append(phases, boxcutter.NewPhase(specPhase.Name, objs)) } - return r, opts, nil + return phases, opts, nil } // EffectiveCollisionProtection resolves the collision protection value using diff --git a/internal/operator-controller/controllers/clusterextensionrevision_controller_test.go b/internal/operator-controller/controllers/clusterextensionrevision_controller_test.go index 36224232a3..682c101743 100644 --- a/internal/operator-controller/controllers/clusterextensionrevision_controller_test.go +++ b/internal/operator-controller/controllers/clusterextensionrevision_controller_test.go @@ -1405,6 +1405,7 @@ func Test_ClusterExtensionRevisionReconciler_getScopedClient_Errors(t *testing.T rev := &ocv1.ClusterExtensionRevision{ ObjectMeta: metav1.ObjectMeta{ Name: "test-rev-1", + UID: types.UID("test-rev-1"), Labels: map[string]string{}, Annotations: map[string]string{ labels.ServiceAccountNameKey: "test-sa", diff --git a/internal/operator-controller/controllers/revision_engine_factory.go b/internal/operator-controller/controllers/revision_engine_factory.go index aa8a9b9ffc..f87d930b38 100644 --- a/internal/operator-controller/controllers/revision_engine_factory.go +++ b/internal/operator-controller/controllers/revision_engine_factory.go @@ -21,7 +21,6 @@ import ( "pkg.package-operator.run/boxcutter/machinery" machinerytypes "pkg.package-operator.run/boxcutter/machinery/types" "pkg.package-operator.run/boxcutter/managedcache" - "pkg.package-operator.run/boxcutter/ownerhandling" "pkg.package-operator.run/boxcutter/validation" "sigs.k8s.io/controller-runtime/pkg/client" @@ -69,8 +68,7 @@ func (f *defaultRevisionEngineFactory) CreateRevisionEngine(_ context.Context, r machinery.NewPhaseEngine( machinery.NewObjectEngine( f.Scheme, f.TrackingCache, scopedClient, - ownerhandling.NewNative(f.Scheme), - machinery.NewComparator(ownerhandling.NewNative(f.Scheme), f.DiscoveryClient, f.Scheme, f.FieldOwnerPrefix), + machinery.NewComparator(f.DiscoveryClient, f.Scheme, f.FieldOwnerPrefix), f.FieldOwnerPrefix, f.FieldOwnerPrefix, ), validation.NewClusterPhaseValidator(f.RESTMapper, scopedClient),