@@ -14,10 +14,12 @@ import (
14
14
appsv1 "k8s.io/api/apps/v1"
15
15
batchv1 "k8s.io/api/batch/v1"
16
16
corev1 "k8s.io/api/core/v1"
17
+ policyv1 "k8s.io/api/policy/v1"
17
18
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
18
19
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
19
20
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
20
21
"k8s.io/apimachinery/pkg/runtime/schema"
22
+ "k8s.io/apimachinery/pkg/util/intstr"
21
23
"k8s.io/klog/v2"
22
24
"k8s.io/utils/ptr"
23
25
@@ -136,6 +138,22 @@ var (
136
138
},
137
139
},
138
140
}
141
+ minAvailable = intstr .FromInt32 (1 )
142
+
143
+ pdbTemplate = & policyv1.PodDisruptionBudget {
144
+ TypeMeta : metav1.TypeMeta {
145
+ APIVersion : "policy/v1" ,
146
+ Kind : "PodDisruptionBudget" ,
147
+ },
148
+ ObjectMeta : metav1.ObjectMeta {
149
+ Name : "test-pdb" ,
150
+ Namespace : nsName ,
151
+ Generation : 2 ,
152
+ },
153
+ Spec : policyv1.PodDisruptionBudgetSpec {
154
+ MinAvailable : & minAvailable ,
155
+ },
156
+ }
139
157
)
140
158
141
159
// TestTrackDeploymentAvailability tests the trackDeploymentAvailability function.
@@ -667,6 +685,93 @@ func TestTrackCRDAvailability(t *testing.T) {
667
685
}
668
686
}
669
687
688
+ // TestTrackPDBAvailability tests the trackPDBAvailability function.
689
+ func TestTrackPDBAvailability (t * testing.T ) {
690
+ availablePDB := pdbTemplate .DeepCopy ()
691
+ availablePDB .Status = policyv1.PodDisruptionBudgetStatus {
692
+ DisruptionsAllowed : 1 ,
693
+ CurrentHealthy : 2 ,
694
+ ObservedGeneration : 2 ,
695
+ DesiredHealthy : 2 ,
696
+ ExpectedPods : 1 ,
697
+ Conditions : []metav1.Condition {
698
+ {
699
+ Type : policyv1 .DisruptionAllowedCondition ,
700
+ Status : metav1 .ConditionTrue ,
701
+ Reason : policyv1 .SufficientPodsReason ,
702
+ ObservedGeneration : 2 ,
703
+ },
704
+ },
705
+ }
706
+ unavailablePDBInsufficientPods := pdbTemplate .DeepCopy ()
707
+ unavailablePDBInsufficientPods .Status = policyv1.PodDisruptionBudgetStatus {
708
+ DisruptionsAllowed : 0 ,
709
+ CurrentHealthy : 1 ,
710
+ ObservedGeneration : 2 ,
711
+ DesiredHealthy : 2 ,
712
+ ExpectedPods : 1 ,
713
+ Conditions : []metav1.Condition {
714
+ {
715
+ Type : policyv1 .DisruptionAllowedCondition ,
716
+ Status : metav1 .ConditionTrue ,
717
+ Reason : policyv1 .SufficientPodsReason ,
718
+ ObservedGeneration : 2 ,
719
+ },
720
+ },
721
+ }
722
+
723
+ unavailablePDBStaleCondition := pdbTemplate .DeepCopy ()
724
+ unavailablePDBStaleCondition .Status = policyv1.PodDisruptionBudgetStatus {
725
+ DisruptionsAllowed : 1 ,
726
+ CurrentHealthy : 2 ,
727
+ ObservedGeneration : 1 ,
728
+ DesiredHealthy : 2 ,
729
+ ExpectedPods : 1 ,
730
+ Conditions : []metav1.Condition {
731
+ {
732
+ Type : policyv1 .DisruptionAllowedCondition ,
733
+ Status : metav1 .ConditionTrue ,
734
+ Reason : policyv1 .SufficientPodsReason ,
735
+ ObservedGeneration : 1 ,
736
+ },
737
+ },
738
+ }
739
+
740
+ testCases := []struct {
741
+ name string
742
+ pdb * policyv1.PodDisruptionBudget
743
+ wantManifestProcessingAvailabilityResultType ManifestProcessingAvailabilityResultType
744
+ }{
745
+ {
746
+ name : "available PDB" ,
747
+ pdb : availablePDB ,
748
+ wantManifestProcessingAvailabilityResultType : ManifestProcessingAvailabilityResultTypeAvailable ,
749
+ },
750
+ {
751
+ name : "unavailable PDB (insufficient pods)" ,
752
+ pdb : unavailablePDBInsufficientPods ,
753
+ wantManifestProcessingAvailabilityResultType : ManifestProcessingAvailabilityResultTypeNotYetAvailable ,
754
+ },
755
+ {
756
+ name : "unavailable PDB (stale condition)" ,
757
+ pdb : unavailablePDBStaleCondition ,
758
+ wantManifestProcessingAvailabilityResultType : ManifestProcessingAvailabilityResultTypeNotYetAvailable ,
759
+ },
760
+ }
761
+
762
+ for _ , tc := range testCases {
763
+ t .Run (tc .name , func (t * testing.T ) {
764
+ gotResTyp , err := trackPDBAvailability (toUnstructured (t , tc .pdb ))
765
+ if err != nil {
766
+ t .Fatalf ("trackPDBAvailability() = %v, want no error" , err )
767
+ }
768
+ if gotResTyp != tc .wantManifestProcessingAvailabilityResultType {
769
+ t .Errorf ("manifestProcessingAvailabilityResultType = %v, want %v" , gotResTyp , tc .wantManifestProcessingAvailabilityResultType )
770
+ }
771
+ })
772
+ }
773
+ }
774
+
670
775
// TestTrackInMemberClusterObjAvailabilityByGVR tests the trackInMemberClusterObjAvailabilityByGVR function.
671
776
func TestTrackInMemberClusterObjAvailabilityByGVR (t * testing.T ) {
672
777
availableDeploy := deploy .DeepCopy ()
0 commit comments