...

Source file src/k8s.io/kubectl/pkg/metricsutil/metrics_resource_adder_test.go

Documentation: k8s.io/kubectl/pkg/metricsutil

     1  /*
     2  Copyright 2021 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package metricsutil
    18  
    19  import (
    20  	"testing"
    21  
    22  	corev1 "k8s.io/api/core/v1"
    23  	"k8s.io/apimachinery/pkg/api/resource"
    24  	"k8s.io/metrics/pkg/apis/metrics"
    25  )
    26  
    27  func getResourceQuantity(t *testing.T, quantityStr string) resource.Quantity {
    28  	t.Helper()
    29  	var err error
    30  	quantity, err := resource.ParseQuantity("0")
    31  	if err != nil {
    32  		t.Errorf("failed when parsing 0 into resource.Quantity")
    33  	}
    34  	if quantityStr != "" {
    35  		quantity, err = resource.ParseQuantity(quantityStr)
    36  		if err != nil {
    37  			t.Errorf("%s is not a valid resource value", quantityStr)
    38  		}
    39  	}
    40  	return quantity
    41  }
    42  
    43  func addContainerMetricsToPodMetrics(t *testing.T, podMetrics *metrics.PodMetrics, cpuUsage, memUsage string) {
    44  	t.Helper()
    45  	containerMetrics := metrics.ContainerMetrics{
    46  		Usage: corev1.ResourceList{},
    47  	}
    48  
    49  	containerMetrics.Usage["cpu"] = getResourceQuantity(t, cpuUsage)
    50  	containerMetrics.Usage["memory"] = getResourceQuantity(t, memUsage)
    51  
    52  	podMetrics.Containers = append(podMetrics.Containers, containerMetrics)
    53  }
    54  
    55  func initResourceAdder() *ResourceAdder {
    56  	resources := []corev1.ResourceName{
    57  		corev1.ResourceCPU,
    58  		corev1.ResourceMemory,
    59  	}
    60  	return NewResourceAdder(resources)
    61  }
    62  
    63  func TestAddPodMetrics(t *testing.T) {
    64  	resourceAdder := initResourceAdder()
    65  
    66  	tests := []struct {
    67  		name             string
    68  		cpuUsage         string
    69  		memUsage         string
    70  		expectedCpuUsage resource.Quantity
    71  		expectedMemUsage resource.Quantity
    72  	}{
    73  		{
    74  			name:             "initial value",
    75  			cpuUsage:         "0",
    76  			memUsage:         "0",
    77  			expectedCpuUsage: getResourceQuantity(t, "0"),
    78  			expectedMemUsage: getResourceQuantity(t, "0"),
    79  		},
    80  		{
    81  			name:             "add first container metric",
    82  			cpuUsage:         "1m",
    83  			memUsage:         "10Mi",
    84  			expectedCpuUsage: getResourceQuantity(t, "1m"),
    85  			expectedMemUsage: getResourceQuantity(t, "10Mi"),
    86  		},
    87  		{
    88  			name:             "add second container metric",
    89  			cpuUsage:         "5m",
    90  			memUsage:         "25Mi",
    91  			expectedCpuUsage: getResourceQuantity(t, "6m"),
    92  			expectedMemUsage: getResourceQuantity(t, "35Mi"),
    93  		},
    94  		{
    95  			name:             "add third container zero metric",
    96  			cpuUsage:         "0m",
    97  			memUsage:         "0Mi",
    98  			expectedCpuUsage: getResourceQuantity(t, "6m"),
    99  			expectedMemUsage: getResourceQuantity(t, "35Mi"),
   100  		},
   101  	}
   102  	for _, test := range tests {
   103  		t.Run(test.name, func(t *testing.T) {
   104  			podMetrics := metrics.PodMetrics{}
   105  			addContainerMetricsToPodMetrics(t, &podMetrics, test.cpuUsage, test.memUsage)
   106  
   107  			resourceAdder.AddPodMetrics(&podMetrics)
   108  			cpuUsage := resourceAdder.total["cpu"]
   109  			memUsage := resourceAdder.total["memory"]
   110  
   111  			if !test.expectedCpuUsage.Equal(cpuUsage) {
   112  				t.Errorf("expecting cpu usage %s but getting %s", test.expectedCpuUsage.String(), cpuUsage.String())
   113  			}
   114  			if !test.expectedMemUsage.Equal(memUsage) {
   115  				t.Errorf("expecting memeory usage %s but getting %s", test.expectedMemUsage.String(), memUsage.String())
   116  			}
   117  		})
   118  	}
   119  }
   120  

View as plain text