@@ -15,6 +15,7 @@ import (
1515 "helm.sh/helm/v3/pkg/storage/driver"
1616 appsv1 "k8s.io/api/apps/v1"
1717 corev1 "k8s.io/api/core/v1"
18+ apierrors "k8s.io/apimachinery/pkg/api/errors"
1819 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1920 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2021 "k8s.io/apimachinery/pkg/runtime"
@@ -567,6 +568,218 @@ func TestBoxcutter_Apply(t *testing.T) {
567568 assert .Empty (t , revList .Items )
568569 },
569570 },
571+ {
572+ name : "sixth revision" ,
573+ mockBuilder : & mockBundleRevisionBuilder {
574+ makeRevisionFunc : func (bundleFS fs.FS , ext * ocv1.ClusterExtension , objectLabels , revisionAnnotations map [string ]string ) (* ocv1.ClusterExtensionRevision , error ) {
575+ return & ocv1.ClusterExtensionRevision {
576+ ObjectMeta : metav1.ObjectMeta {
577+ Annotations : revisionAnnotations ,
578+ Labels : map [string ]string {
579+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
580+ },
581+ },
582+ Spec : ocv1.ClusterExtensionRevisionSpec {},
583+ }, nil
584+ },
585+ },
586+ existingObjs : []client.Object {
587+ & ocv1.ClusterExtensionRevision {
588+ ObjectMeta : metav1.ObjectMeta {
589+ Name : "rev-1" ,
590+ Labels : map [string ]string {
591+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
592+ },
593+ },
594+ Spec : ocv1.ClusterExtensionRevisionSpec {
595+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateArchived ,
596+ },
597+ },
598+ & ocv1.ClusterExtensionRevision {
599+ ObjectMeta : metav1.ObjectMeta {
600+ Name : "rev-2" ,
601+ Labels : map [string ]string {
602+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
603+ },
604+ },
605+ Spec : ocv1.ClusterExtensionRevisionSpec {
606+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateArchived ,
607+ },
608+ },
609+ & ocv1.ClusterExtensionRevision {
610+ ObjectMeta : metav1.ObjectMeta {
611+ Name : "rev-3" ,
612+ Labels : map [string ]string {
613+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
614+ },
615+ },
616+ Spec : ocv1.ClusterExtensionRevisionSpec {
617+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateArchived ,
618+ },
619+ },
620+ & ocv1.ClusterExtensionRevision {
621+ ObjectMeta : metav1.ObjectMeta {
622+ Name : "rev-4" ,
623+ Labels : map [string ]string {
624+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
625+ },
626+ },
627+ Spec : ocv1.ClusterExtensionRevisionSpec {
628+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateArchived ,
629+ },
630+ },
631+ & ocv1.ClusterExtensionRevision {
632+ ObjectMeta : metav1.ObjectMeta {
633+ Name : "rev-5" ,
634+ Labels : map [string ]string {
635+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
636+ },
637+ },
638+ Spec : ocv1.ClusterExtensionRevisionSpec {
639+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateArchived ,
640+ },
641+ },
642+ & ocv1.ClusterExtensionRevision {
643+ ObjectMeta : metav1.ObjectMeta {
644+ Name : "rev-6" ,
645+ Labels : map [string ]string {
646+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
647+ },
648+ },
649+ Spec : ocv1.ClusterExtensionRevisionSpec {
650+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateArchived ,
651+ },
652+ },
653+ },
654+ validate : func (t * testing.T , c client.Client ) {
655+ rev1 := & ocv1.ClusterExtensionRevision {}
656+ err := c .Get (t .Context (), client.ObjectKey {Name : "rev-1" }, rev1 )
657+ require .Error (t , err )
658+ assert .True (t , apierrors .IsNotFound (err ))
659+
660+ latest := & ocv1.ClusterExtensionRevision {}
661+ err = c .Get (t .Context (), client.ObjectKey {Name : "test-ext-1" }, latest )
662+ require .NoError (t , err )
663+ assert .Len (t , latest .Spec .Previous , applier .ClusterExtensionRevisionPreviousLimit )
664+ },
665+ },
666+ {
667+ name : "len([]revisions) > limit but contains active revisions with index beyond limit" ,
668+ mockBuilder : & mockBundleRevisionBuilder {
669+ makeRevisionFunc : func (bundleFS fs.FS , ext * ocv1.ClusterExtension , objectLabels , revisionAnnotations map [string ]string ) (* ocv1.ClusterExtensionRevision , error ) {
670+ return & ocv1.ClusterExtensionRevision {
671+ ObjectMeta : metav1.ObjectMeta {
672+ Annotations : revisionAnnotations ,
673+ Labels : map [string ]string {
674+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
675+ },
676+ },
677+ Spec : ocv1.ClusterExtensionRevisionSpec {},
678+ }, nil
679+ },
680+ },
681+ existingObjs : []client.Object {
682+ & ocv1.ClusterExtensionRevision {
683+ ObjectMeta : metav1.ObjectMeta {
684+ Name : "rev-1" ,
685+ Labels : map [string ]string {
686+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
687+ },
688+ },
689+ Spec : ocv1.ClusterExtensionRevisionSpec {
690+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateArchived ,
691+ },
692+ },
693+ & ocv1.ClusterExtensionRevision {
694+ ObjectMeta : metav1.ObjectMeta {
695+ Name : "rev-2" ,
696+ Labels : map [string ]string {
697+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
698+ },
699+ },
700+ Spec : ocv1.ClusterExtensionRevisionSpec {
701+ // index beyond the retention limit but active; should be preserved
702+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateActive ,
703+ },
704+ },
705+ & ocv1.ClusterExtensionRevision {
706+ ObjectMeta : metav1.ObjectMeta {
707+ Name : "rev-3" ,
708+ Labels : map [string ]string {
709+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
710+ },
711+ },
712+ Spec : ocv1.ClusterExtensionRevisionSpec {
713+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateActive ,
714+ },
715+ },
716+ & ocv1.ClusterExtensionRevision {
717+ ObjectMeta : metav1.ObjectMeta {
718+ Name : "rev-4" ,
719+ Labels : map [string ]string {
720+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
721+ },
722+ },
723+ Spec : ocv1.ClusterExtensionRevisionSpec {
724+ // archived but should be preserved since it is within the limit
725+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateArchived ,
726+ },
727+ },
728+ & ocv1.ClusterExtensionRevision {
729+ ObjectMeta : metav1.ObjectMeta {
730+ Name : "rev-5" ,
731+ Labels : map [string ]string {
732+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
733+ },
734+ },
735+ Spec : ocv1.ClusterExtensionRevisionSpec {
736+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateActive ,
737+ },
738+ },
739+ & ocv1.ClusterExtensionRevision {
740+ ObjectMeta : metav1.ObjectMeta {
741+ Name : "rev-6" ,
742+ Labels : map [string ]string {
743+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
744+ },
745+ },
746+ Spec : ocv1.ClusterExtensionRevisionSpec {
747+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateActive ,
748+ },
749+ },
750+ & ocv1.ClusterExtensionRevision {
751+ ObjectMeta : metav1.ObjectMeta {
752+ Name : "rev-7" ,
753+ Labels : map [string ]string {
754+ controllers .ClusterExtensionRevisionOwnerLabel : ext .Name ,
755+ },
756+ },
757+ Spec : ocv1.ClusterExtensionRevisionSpec {
758+ LifecycleState : ocv1 .ClusterExtensionRevisionLifecycleStateActive ,
759+ },
760+ },
761+ },
762+ validate : func (t * testing.T , c client.Client ) {
763+ rev1 := & ocv1.ClusterExtensionRevision {}
764+ err := c .Get (t .Context (), client.ObjectKey {Name : "rev-1" }, rev1 )
765+ require .Error (t , err )
766+ assert .True (t , apierrors .IsNotFound (err ))
767+
768+ rev2 := & ocv1.ClusterExtensionRevision {}
769+ err = c .Get (t .Context (), client.ObjectKey {Name : "rev-2" }, rev2 )
770+ require .NoError (t , err )
771+
772+ rev4 := & ocv1.ClusterExtensionRevision {}
773+ err = c .Get (t .Context (), client.ObjectKey {Name : "rev-4" }, rev4 )
774+ require .NoError (t , err )
775+
776+ latest := & ocv1.ClusterExtensionRevision {}
777+ err = c .Get (t .Context (), client.ObjectKey {Name : "test-ext-1" }, latest )
778+ require .NoError (t , err )
779+ assert .Len (t , latest .Spec .Previous , 6 )
780+ assert .Contains (t , latest .Spec .Previous , ocv1.ClusterExtensionRevisionPrevious {Name : "rev-4" })
781+ },
782+ },
570783 }
571784
572785 for _ , tc := range testCases {
0 commit comments