diff --git a/kstatus/status/core.go b/kstatus/status/core.go index e955a50a3..dd1711988 100644 --- a/kstatus/status/core.go +++ b/kstatus/status/core.go @@ -395,26 +395,21 @@ func podConditions(u *unstructured.Unstructured) (*Result, error) { return newInProgressStatus("PodNotReady", message), nil } -// pdbConditions return standardized Conditions for Deployment +// pdbConditions computes the status for PodDisruptionBudgets. A PDB +// is currently considered Current if the disruption controller has +// observed the latest version of the PDB resource and has computed +// the AllowedDisruptions. PDBs do have ObservedGeneration in the +// Status object, so if this function gets called we know that +// the controller has observed the latest changes. +// The disruption controller does not set any conditions if +// computing the AllowedDisruptions fails (and there are many ways +// it can fail), but there is PR against OSS Kubernetes to address +// this: https://github.com/kubernetes/kubernetes/pull/86929 func pdbConditions(u *unstructured.Unstructured) (*Result, error) { - obj := u.UnstructuredContent() - - // replicas - currentHealthy := GetIntField(obj, ".status.currentHealthy", 0) - desiredHealthy := GetIntField(obj, ".status.desiredHealthy", 0) - if desiredHealthy == 0 { - message := "Missing or zero .status.desiredHealthy" - return newInProgressStatus("ZeroDesiredHealthy", message), nil - } - if desiredHealthy > currentHealthy { - message := fmt.Sprintf("Budget not met. healthy replicas: %d/%d", currentHealthy, desiredHealthy) - return newInProgressStatus("BudgetNotMet", message), nil - } - // All ok return &Result{ Status: CurrentStatus, - Message: fmt.Sprintf("Budget is met. Replicas: %d/%d", currentHealthy, desiredHealthy), + Message: "AllowedDisruptions has been computed.", Conditions: []Condition{}, }, nil } diff --git a/kstatus/status/status.go b/kstatus/status/status.go index 80b7a00d1..51fec7f0c 100644 --- a/kstatus/status/status.go +++ b/kstatus/status/status.go @@ -28,7 +28,7 @@ const ( ) var ( - Statuses = []Status{InProgressStatus, FailedStatus, CurrentStatus, TerminatingStatus, UnknownStatus} + Statuses = []Status{InProgressStatus, FailedStatus, CurrentStatus, TerminatingStatus, UnknownStatus} ConditionTypes = []ConditionType{ConditionFailed, ConditionInProgress} ) diff --git a/kstatus/status/status_compute_test.go b/kstatus/status/status_compute_test.go index 5f61f74ff..df53f6f7f 100644 --- a/kstatus/status/status_compute_test.go +++ b/kstatus/status/status_compute_test.go @@ -822,66 +822,44 @@ func TestReplicasetStatus(t *testing.T) { } } -var pdbNoStatus = ` -apiVersion: policy/v1 +var pdbNotObserved = ` +apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata: - generation: 1 + generation: 2 name: test + namespace: qual +status: + observedGeneration: 1 ` -var pdbOK1 = ` -apiVersion: policy/v1 +var pdbObserved = ` +apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata: generation: 1 name: test namespace: qual status: - currentHealthy: 2 - desiredHealthy: 2 -` - -var pdbMoreHealthy = ` -apiVersion: policy/v1 -kind: PodDisruptionBudget -metadata: - generation: 1 - name: test - namespace: qual -status: - currentHealthy: 4 - desiredHealthy: 2 -` - -var pdbLessHealthy = ` -apiVersion: policy/v1 -kind: PodDisruptionBudget -metadata: - generation: 1 - name: test - namespace: qual -status: - currentHealthy: 2 - desiredHealthy: 4 + observedGeneration: 1 ` func TestPDBStatus(t *testing.T) { testCases := map[string]testSpec{ - "pdbNoStatus": { - spec: pdbNoStatus, + "pdbNotObserved": { + spec: pdbNotObserved, expectedStatus: InProgressStatus, expectedConditions: []Condition{{ Type: ConditionInProgress, Status: corev1.ConditionTrue, - Reason: "ZeroDesiredHealthy", + Reason: "LatestGenerationNotObserved", }}, absentConditionTypes: []ConditionType{ ConditionFailed, }, }, - "pdbOK1": { - spec: pdbOK1, + "pdbObserved": { + spec: pdbObserved, expectedStatus: CurrentStatus, expectedConditions: []Condition{}, absentConditionTypes: []ConditionType{ @@ -889,27 +867,6 @@ func TestPDBStatus(t *testing.T) { ConditionInProgress, }, }, - "pdbMoreHealthy": { - spec: pdbMoreHealthy, - expectedStatus: CurrentStatus, - expectedConditions: []Condition{}, - absentConditionTypes: []ConditionType{ - ConditionFailed, - ConditionInProgress, - }, - }, - "pdbLessHealthy": { - spec: pdbLessHealthy, - expectedStatus: InProgressStatus, - expectedConditions: []Condition{{ - Type: ConditionInProgress, - Status: corev1.ConditionTrue, - Reason: "BudgetNotMet", - }}, - absentConditionTypes: []ConditionType{ - ConditionFailed, - }, - }, } for tn, tc := range testCases {