Skip to content

Commit cede198

Browse files
committed
change to new files
1 parent 37aa957 commit cede198

File tree

4 files changed

+123
-120
lines changed

4 files changed

+123
-120
lines changed

pkg/controllers/work/apply_controller.go

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
"go.uber.org/atomic"
3030
appv1 "k8s.io/api/apps/v1"
3131
v1 "k8s.io/api/core/v1"
32-
policyv1 "k8s.io/api/policy/v1"
3332
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
3433
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3534
apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -42,7 +41,6 @@ import (
4241
utilerrors "k8s.io/apimachinery/pkg/util/errors"
4342
"k8s.io/client-go/dynamic"
4443
"k8s.io/client-go/tools/record"
45-
"k8s.io/component-helpers/apps/poddisruptionbudget"
4644
"k8s.io/klog/v2"
4745
"k8s.io/utils/ptr"
4846
ctrl "sigs.k8s.io/controller-runtime"
@@ -455,9 +453,6 @@ func trackResourceAvailability(gvr schema.GroupVersionResource, curObj *unstruct
455453
case utils.CustomResourceDefinitionGVR:
456454
return trackCRDAvailability(curObj)
457455

458-
case utils.PodDisruptionBudgetGVR:
459-
return trackPDBAvailability(curObj)
460-
461456
default:
462457
if isDataResource(gvr) {
463458
klog.V(2).InfoS("Data resources are available immediately", "gvr", gvr, "resource", klog.KObj(curObj))
@@ -468,20 +463,6 @@ func trackResourceAvailability(gvr schema.GroupVersionResource, curObj *unstruct
468463
}
469464
}
470465

471-
func trackPDBAvailability(curObj *unstructured.Unstructured) (ApplyAction, error) {
472-
var pdb policyv1.PodDisruptionBudget
473-
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(curObj.Object, &pdb); err != nil {
474-
return errorApplyAction, controller.NewUnexpectedBehaviorError(err)
475-
}
476-
// Check if conditions are up-to-date
477-
if poddisruptionbudget.ConditionsAreUpToDate(&pdb) {
478-
klog.V(2).InfoS("PodDisruptionBudget is available", "pdb", klog.KObj(curObj))
479-
return manifestAvailableAction, nil
480-
}
481-
klog.V(2).InfoS("Still need to wait for PodDisruptionBudget to be available", "pdb", klog.KObj(curObj))
482-
return manifestNotAvailableYetAction, nil
483-
}
484-
485466
func trackCRDAvailability(curObj *unstructured.Unstructured) (ApplyAction, error) {
486467
var crd apiextensionsv1.CustomResourceDefinition
487468
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(curObj.Object, &crd); err != nil {

pkg/controllers/work/apply_controller_test.go

Lines changed: 0 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,107 +1420,6 @@ func TestTrackResourceAvailability(t *testing.T) {
14201420
expected: manifestNotAvailableYetAction,
14211421
err: nil,
14221422
},
1423-
"Test PodDisruptionBudget available (sufficient pods)": {
1424-
gvr: utils.PodDisruptionBudgetGVR,
1425-
obj: &unstructured.Unstructured{
1426-
Object: map[string]interface{}{
1427-
"apiVersion": "policy/v1",
1428-
"kind": "PodDisruptionBudget",
1429-
"metadata": map[string]interface{}{
1430-
"name": "test-pdb",
1431-
"namespace": "default",
1432-
"generation": 2,
1433-
},
1434-
"spec": map[string]interface{}{
1435-
"minAvailable": 1,
1436-
},
1437-
"status": map[string]interface{}{
1438-
"currentHealthy": 2,
1439-
"desiredHealthy": 1,
1440-
"observedGeneration": 2,
1441-
"disruptionsAllowed": 1,
1442-
"expectedPods": 1,
1443-
"conditions": []interface{}{
1444-
map[string]interface{}{
1445-
"type": "DisruptionAllowed",
1446-
"status": "True",
1447-
"reason": "SufficientPods",
1448-
"observedGeneration": 2,
1449-
},
1450-
},
1451-
},
1452-
},
1453-
},
1454-
expected: manifestAvailableAction,
1455-
err: nil,
1456-
},
1457-
"Test PodDisruptionBudget unavailable (condition not up-to-date)": {
1458-
gvr: utils.PodDisruptionBudgetGVR,
1459-
obj: &unstructured.Unstructured{
1460-
Object: map[string]interface{}{
1461-
"apiVersion": "policy/v1",
1462-
"kind": "PodDisruptionBudget",
1463-
"metadata": map[string]interface{}{
1464-
"name": "test-pdb",
1465-
"namespace": "default",
1466-
"generation": 2,
1467-
},
1468-
"spec": map[string]interface{}{
1469-
"minAvailable": 1,
1470-
},
1471-
"status": map[string]interface{}{
1472-
"currentHealthy": 2,
1473-
"desiredHealthy": 1,
1474-
"observedGeneration": 1,
1475-
"disruptionsAllowed": 1,
1476-
"expectedPods": 1,
1477-
"conditions": []interface{}{
1478-
map[string]interface{}{
1479-
"type": "DisruptionAllowed",
1480-
"status": "True",
1481-
"reason": "SufficientPods",
1482-
},
1483-
},
1484-
},
1485-
},
1486-
},
1487-
expected: manifestNotAvailableYetAction,
1488-
err: nil,
1489-
},
1490-
"Test PodDisruptionBudget available (insufficient pods)": {
1491-
gvr: utils.PodDisruptionBudgetGVR,
1492-
obj: &unstructured.Unstructured{
1493-
Object: map[string]interface{}{
1494-
"apiVersion": "policy/v1",
1495-
"kind": "PodDisruptionBudget",
1496-
"metadata": map[string]interface{}{
1497-
"name": "test-pdb",
1498-
"namespace": "default",
1499-
"generation": 2,
1500-
},
1501-
"spec": map[string]interface{}{
1502-
"minAvailable": 1,
1503-
},
1504-
"status": map[string]interface{}{
1505-
"currentHealthy": 2,
1506-
"desiredHealthy": 1,
1507-
"observedGeneration": 2,
1508-
"disruptionsAllowed": 0,
1509-
"expectedPods": 1,
1510-
"conditions": []interface{}{
1511-
map[string]interface{}{
1512-
"type": "DisruptionAllowed",
1513-
"status": "False",
1514-
"reason": "InsufficientPods",
1515-
"observedGeneration": 2,
1516-
},
1517-
},
1518-
},
1519-
},
1520-
},
1521-
expected: manifestAvailableAction,
1522-
err: nil,
1523-
},
15241423
}
15251424
for name, tt := range tests {
15261425
t.Run(name, func(t *testing.T) {

pkg/controllers/workapplier/availability_tracker.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ import (
1111

1212
appv1 "k8s.io/api/apps/v1"
1313
corev1 "k8s.io/api/core/v1"
14+
policyv1 "k8s.io/api/policy/v1"
1415
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
1516
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1617
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1718
"k8s.io/apimachinery/pkg/runtime"
1819
"k8s.io/apimachinery/pkg/runtime/schema"
20+
"k8s.io/component-helpers/apps/poddisruptionbudget"
1921
"k8s.io/klog/v2"
2022

2123
"go.goms.io/fleet/pkg/utils"
@@ -79,6 +81,8 @@ func trackInMemberClusterObjAvailabilityByGVR(
7981
return trackServiceAvailability(inMemberClusterObj)
8082
case utils.CustomResourceDefinitionGVR:
8183
return trackCRDAvailability(inMemberClusterObj)
84+
case utils.PodDisruptionBudgetGVR:
85+
return trackPDBAvailability(inMemberClusterObj)
8286
default:
8387
if isDataResource(*gvr) {
8488
klog.V(2).InfoS("The object from the member cluster is a data object, consider it to be immediately available",
@@ -218,6 +222,20 @@ func trackCRDAvailability(inMemberClusterObj *unstructured.Unstructured) (Manife
218222
return ManifestProcessingAvailabilityResultTypeNotYetAvailable, nil
219223
}
220224

225+
func trackPDBAvailability(curObj *unstructured.Unstructured) (ManifestProcessingAvailabilityResultType, error) {
226+
var pdb policyv1.PodDisruptionBudget
227+
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(curObj.Object, &pdb); err != nil {
228+
return ManifestProcessingAvailabilityResultTypeFailed, controller.NewUnexpectedBehaviorError(err)
229+
}
230+
// Check if conditions are up-to-date
231+
if poddisruptionbudget.ConditionsAreUpToDate(&pdb) {
232+
klog.V(2).InfoS("PodDisruptionBudget is available", "pdb", klog.KObj(curObj))
233+
return ManifestProcessingAvailabilityResultTypeAvailable, nil
234+
}
235+
klog.V(2).InfoS("Still need to wait for PodDisruptionBudget to be available", "pdb", klog.KObj(curObj))
236+
return ManifestProcessingAvailabilityResultTypeNotYetAvailable, nil
237+
}
238+
221239
// isDataResource checks if the resource is a data resource; such resources are
222240
// available immediately after creation.
223241
func isDataResource(gvr schema.GroupVersionResource) bool {

pkg/controllers/workapplier/availability_tracker_test.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
671776
func TestTrackInMemberClusterObjAvailabilityByGVR(t *testing.T) {
672777
availableDeploy := deploy.DeepCopy()

0 commit comments

Comments
 (0)