Add metric for terminated pods with tracking finalizer

Change-Id: I26f3169588c30ed82250cb7baff8e277f8d13bb7
This commit is contained in:
Aldo Culquicondor
2022-10-19 09:49:38 -04:00
parent 7423cc931f
commit 12d308f5c4
5 changed files with 197 additions and 19 deletions

View File

@@ -17,10 +17,16 @@ limitations under the License.
package job
import (
"fmt"
"sync"
"testing"
"github.com/google/go-cmp/cmp"
batch "k8s.io/api/batch/v1"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/component-base/metrics/testutil"
"k8s.io/kubernetes/pkg/controller/job/metrics"
)
func TestUIDTrackingExpectations(t *testing.T) {
@@ -116,3 +122,108 @@ func TestUIDTrackingExpectations(t *testing.T) {
}
}
}
func TestRecordFinishedPodWithTrackingFinalizer(t *testing.T) {
metrics.Register()
cases := map[string]struct {
oldPod *v1.Pod
newPod *v1.Pod
wantAdd int
wantDelete int
}{
"new non-finished Pod with finalizer": {
newPod: &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Finalizers: []string{batch.JobTrackingFinalizer},
},
Status: v1.PodStatus{
Phase: v1.PodPending,
},
},
},
"pod with finalizer fails": {
oldPod: &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Finalizers: []string{batch.JobTrackingFinalizer},
},
Status: v1.PodStatus{
Phase: v1.PodRunning,
},
},
newPod: &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Finalizers: []string{batch.JobTrackingFinalizer},
},
Status: v1.PodStatus{
Phase: v1.PodFailed,
},
},
wantAdd: 1,
},
"pod with finalizer succeeds": {
oldPod: &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Finalizers: []string{batch.JobTrackingFinalizer},
},
Status: v1.PodStatus{
Phase: v1.PodRunning,
},
},
newPod: &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Finalizers: []string{batch.JobTrackingFinalizer},
},
Status: v1.PodStatus{
Phase: v1.PodSucceeded,
},
},
wantAdd: 1,
},
"succeeded pod loses finalizer": {
oldPod: &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Finalizers: []string{batch.JobTrackingFinalizer},
},
Status: v1.PodStatus{
Phase: v1.PodSucceeded,
},
},
newPod: &v1.Pod{
Status: v1.PodStatus{
Phase: v1.PodSucceeded,
},
},
wantDelete: 1,
},
"pod without finalizer removed": {
oldPod: &v1.Pod{
Status: v1.PodStatus{
Phase: v1.PodSucceeded,
},
},
},
}
for name, tc := range cases {
t.Run(name, func(t *testing.T) {
metrics.TerminatedPodsTrackingFinalizerTotal.Reset()
recordFinishedPodWithTrackingFinalizer(tc.oldPod, tc.newPod)
if err := validateTerminatedPodsTrackingFinalizerTotal(metrics.Add, tc.wantAdd); err != nil {
t.Errorf("Failed validating terminated_pods_tracking_finalizer_total(add): %v", err)
}
if err := validateTerminatedPodsTrackingFinalizerTotal(metrics.Delete, tc.wantDelete); err != nil {
t.Errorf("Failed validating terminated_pods_tracking_finalizer_total(delete): %v", err)
}
})
}
}
func validateTerminatedPodsTrackingFinalizerTotal(event string, want int) error {
got, err := testutil.GetCounterMetricValue(metrics.TerminatedPodsTrackingFinalizerTotal.WithLabelValues(event))
if err != nil {
return err
}
if int(got) != want {
return fmt.Errorf("got value %d, want %d", int(got), want)
}
return nil
}