@@ -14,10 +14,12 @@ import (
1414 appsv1 "k8s.io/api/apps/v1"
1515 batchv1 "k8s.io/api/batch/v1"
1616 corev1 "k8s.io/api/core/v1"
17+ policyv1 "k8s.io/api/policy/v1"
1718 apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1819 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1920 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2021 "k8s.io/apimachinery/pkg/runtime/schema"
22+ "k8s.io/apimachinery/pkg/util/intstr"
2123 "k8s.io/klog/v2"
2224 "k8s.io/utils/ptr"
2325
@@ -136,6 +138,22 @@ var (
136138 },
137139 },
138140 }
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+ }
139157)
140158
141159// TestTrackDeploymentAvailability tests the trackDeploymentAvailability function.
@@ -667,6 +685,93 @@ func TestTrackCRDAvailability(t *testing.T) {
667685 }
668686}
669687
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+
670775// TestTrackInMemberClusterObjAvailabilityByGVR tests the trackInMemberClusterObjAvailabilityByGVR function.
671776func TestTrackInMemberClusterObjAvailabilityByGVR (t * testing.T ) {
672777 availableDeploy := deploy .DeepCopy ()
0 commit comments