@@ -24,6 +24,7 @@ import (
24
24
"reflect"
25
25
goruntime "runtime"
26
26
"sort"
27
+ "strings"
27
28
"testing"
28
29
"time"
29
30
@@ -44,6 +45,7 @@ import (
44
45
utilfeature "k8s.io/apiserver/pkg/util/feature"
45
46
"k8s.io/client-go/util/flowcontrol"
46
47
featuregatetesting "k8s.io/component-base/featuregate/testing"
48
+ "k8s.io/component-base/metrics/testutil"
47
49
runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
48
50
apitest "k8s.io/cri-api/pkg/apis/testing"
49
51
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
@@ -54,6 +56,7 @@ import (
54
56
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
55
57
containertest "k8s.io/kubernetes/pkg/kubelet/container/testing"
56
58
imagetypes "k8s.io/kubernetes/pkg/kubelet/images"
59
+ "k8s.io/kubernetes/pkg/kubelet/metrics"
57
60
proberesults "k8s.io/kubernetes/pkg/kubelet/prober/results"
58
61
kubelettypes "k8s.io/kubernetes/pkg/kubelet/types"
59
62
"k8s.io/utils/ptr"
@@ -3397,3 +3400,98 @@ func TestDoPodResizeAction(t *testing.T) {
3397
3400
})
3398
3401
}
3399
3402
}
3403
+
3404
+ func TestIncrementImageVolumeMetrics (t * testing.T ) {
3405
+ featuregatetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , features .ImageVolume , true )
3406
+ metrics .Register ()
3407
+
3408
+ testCases := map [string ]struct {
3409
+ err error
3410
+ volumeMounts []v1.VolumeMount
3411
+ imageVolumes kubecontainer.ImageVolumes
3412
+ wants string
3413
+ }{
3414
+ "without error" : {
3415
+ volumeMounts : []v1.VolumeMount {
3416
+ {Name : "mount1" },
3417
+ {Name : "mount2" },
3418
+ },
3419
+ imageVolumes : kubecontainer.ImageVolumes {
3420
+ "mount1" : {Image : "image1" },
3421
+ "mount2" : {Image : "image2" },
3422
+ "mount3" : {Image : "image3" },
3423
+ },
3424
+ wants : `
3425
+ # HELP kubelet_image_volume_mounted_errors_total [ALPHA] Number of failed image volume mounts.
3426
+ # TYPE kubelet_image_volume_mounted_errors_total counter
3427
+ kubelet_image_volume_mounted_errors_total 0
3428
+ # HELP kubelet_image_volume_mounted_succeed_total [ALPHA] Number of successful image volume mounts.
3429
+ # TYPE kubelet_image_volume_mounted_succeed_total counter
3430
+ kubelet_image_volume_mounted_succeed_total 2
3431
+ # HELP kubelet_image_volume_requested_total [ALPHA] Number of requested image volumes.
3432
+ # TYPE kubelet_image_volume_requested_total counter
3433
+ kubelet_image_volume_requested_total 3
3434
+ ` ,
3435
+ },
3436
+ "with error" : {
3437
+ err : errors .New ("" ),
3438
+ volumeMounts : []v1.VolumeMount {
3439
+ {Name : "mount1" },
3440
+ {Name : "mount2" },
3441
+ },
3442
+ imageVolumes : kubecontainer.ImageVolumes {
3443
+ "mount1" : {Image : "image1" },
3444
+ "mount2" : {Image : "image2" },
3445
+ "mount3" : {Image : "image3" },
3446
+ },
3447
+ wants : `
3448
+ # HELP kubelet_image_volume_mounted_errors_total [ALPHA] Number of failed image volume mounts.
3449
+ # TYPE kubelet_image_volume_mounted_errors_total counter
3450
+ kubelet_image_volume_mounted_errors_total 2
3451
+ # HELP kubelet_image_volume_mounted_succeed_total [ALPHA] Number of successful image volume mounts.
3452
+ # TYPE kubelet_image_volume_mounted_succeed_total counter
3453
+ kubelet_image_volume_mounted_succeed_total 0
3454
+ # HELP kubelet_image_volume_requested_total [ALPHA] Number of requested image volumes.
3455
+ # TYPE kubelet_image_volume_requested_total counter
3456
+ kubelet_image_volume_requested_total 3
3457
+ ` ,
3458
+ },
3459
+ "without used volume" : {
3460
+ volumeMounts : []v1.VolumeMount {
3461
+ {Name : "mount1" },
3462
+ },
3463
+ imageVolumes : kubecontainer.ImageVolumes {},
3464
+ wants : `
3465
+ # HELP kubelet_image_volume_mounted_errors_total [ALPHA] Number of failed image volume mounts.
3466
+ # TYPE kubelet_image_volume_mounted_errors_total counter
3467
+ kubelet_image_volume_mounted_errors_total 0
3468
+ # HELP kubelet_image_volume_mounted_succeed_total [ALPHA] Number of successful image volume mounts.
3469
+ # TYPE kubelet_image_volume_mounted_succeed_total counter
3470
+ kubelet_image_volume_mounted_succeed_total 0
3471
+ # HELP kubelet_image_volume_requested_total [ALPHA] Number of requested image volumes.
3472
+ # TYPE kubelet_image_volume_requested_total counter
3473
+ kubelet_image_volume_requested_total 0
3474
+ ` ,
3475
+ },
3476
+ }
3477
+
3478
+ // Run tests.
3479
+ for name , tc := range testCases {
3480
+ t .Run (name , func (t * testing.T ) {
3481
+ metrics .ImageVolumeRequestedTotal .Reset ()
3482
+ metrics .ImageVolumeMountedErrorsTotal .Reset ()
3483
+ metrics .ImageVolumeMountedSucceedTotal .Reset ()
3484
+
3485
+ // Call the function.
3486
+ incrementImageVolumeMetrics (tc .err , & v1.Container {VolumeMounts : tc .volumeMounts }, tc .imageVolumes )
3487
+
3488
+ if err := testutil .GatherAndCompare (metrics .GetGather (), strings .NewReader (tc .wants ),
3489
+ "kubelet_" + metrics .ImageVolumeRequestedTotalKey ,
3490
+ "kubelet_" + metrics .ImageVolumeMountedSucceedTotalKey ,
3491
+ "kubelet_" + metrics .ImageVolumeMountedErrorsTotalKey ,
3492
+ ); err != nil {
3493
+ t .Error (err )
3494
+ }
3495
+ })
3496
+ }
3497
+ }
0 commit comments