k8s.io/perf-tests/clusterloader2@v0.0.0-20240304094227-64bdb12da87e/pkg/measurement/common/system_pod_metrics_test.go (about)

     1  /*
     2  Copyright 2019 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 common
    18  
    19  import (
    20  	"reflect"
    21  	"testing"
    22  
    23  	"gopkg.in/yaml.v2"
    24  	"k8s.io/perf-tests/clusterloader2/pkg/measurement"
    25  )
    26  
    27  func Test_subtractInitialRestartCounts(t *testing.T) {
    28  	tests := []struct {
    29  		name        string
    30  		metrics     *systemPodsMetrics
    31  		initMetrics *systemPodsMetrics
    32  		want        *systemPodsMetrics
    33  	}{
    34  		{
    35  			name:        "same-pods-and-containers",
    36  			metrics:     generatePodMetrics("p1", "c1", 5),
    37  			initMetrics: generatePodMetrics("p1", "c1", 4),
    38  			want:        generatePodMetrics("p1", "c1", 1),
    39  		},
    40  		{
    41  			name:        "different-container-names",
    42  			metrics:     generatePodMetrics("p1", "c1", 5),
    43  			initMetrics: generatePodMetrics("p1", "c2", 4),
    44  			want:        generatePodMetrics("p1", "c1", 5),
    45  		},
    46  		{
    47  			name:        "different-pod-names",
    48  			metrics:     generatePodMetrics("p1", "c1", 5),
    49  			initMetrics: generatePodMetrics("p2", "c1", 4),
    50  			want:        generatePodMetrics("p1", "c1", 5),
    51  		},
    52  	}
    53  	for _, tt := range tests {
    54  		t.Run(tt.name, func(t *testing.T) {
    55  			subtractInitialRestartCounts(tt.metrics, tt.initMetrics)
    56  			if !reflect.DeepEqual(*tt.metrics, *tt.want) {
    57  				t.Errorf("want %v, got %v", *tt.want, *tt.metrics)
    58  			}
    59  		})
    60  	}
    61  }
    62  
    63  func Test_validateRestartCounts(t *testing.T) {
    64  	tests := []struct {
    65  		name    string
    66  		metrics *systemPodsMetrics
    67  		config  *measurement.Config
    68  		wantErr bool
    69  	}{
    70  		{
    71  			name:    "check-disabled",
    72  			metrics: generatePodMetrics("p", "c", 1),
    73  			config:  buildConfig(t, false, nil),
    74  			wantErr: false,
    75  		},
    76  		{
    77  			name:    "check-enabled-violation",
    78  			metrics: generatePodMetrics("p", "c", 1),
    79  			config:  buildConfig(t, true, nil),
    80  			wantErr: true,
    81  		},
    82  		{
    83  			name:    "check-enabled-ok",
    84  			metrics: generatePodMetrics("p", "c", 0),
    85  			config:  buildConfig(t, true, nil),
    86  			wantErr: false,
    87  		},
    88  		{
    89  			name:    "override-equal-to-actual-count",
    90  			metrics: generatePodMetrics("p", "c", 3),
    91  			config:  buildConfig(t, true, map[string]int{"c": 3}),
    92  			wantErr: false,
    93  		},
    94  		{
    95  			name:    "override-default-used",
    96  			metrics: generatePodMetrics("p", "c", 3),
    97  			config:  buildConfig(t, true, map[string]int{"default": 3}),
    98  			wantErr: false,
    99  		},
   100  		{
   101  			name:    "override-default-not-used",
   102  			metrics: generatePodMetrics("p", "c", 3),
   103  			config: buildConfig(t, true, map[string]int{
   104  				"default": 5,
   105  				"c":       0,
   106  			}),
   107  			wantErr: true,
   108  		},
   109  		{
   110  			name:    "override-below-actual-count",
   111  			metrics: generatePodMetrics("p", "c", 3),
   112  			config:  buildConfig(t, true, map[string]int{"c": 2}),
   113  			wantErr: true,
   114  		},
   115  		{
   116  			name:    "override-for-different-container",
   117  			metrics: generatePodMetrics("p", "c1", 3),
   118  			config:  buildConfig(t, true, map[string]int{"c2": 4}),
   119  			wantErr: true,
   120  		},
   121  	}
   122  	for _, tt := range tests {
   123  		t.Run(tt.name, func(t *testing.T) {
   124  			overrides, err := getThresholdOverrides(tt.config)
   125  			if err != nil {
   126  				t.Fatalf("getThresholdOverrides() error = %v", err)
   127  			}
   128  			if err := validateRestartCounts(tt.metrics, tt.config, overrides); (err != nil) != tt.wantErr {
   129  				t.Errorf("verifyViolations() error = %v, wantErr %v", err, tt.wantErr)
   130  			}
   131  		})
   132  	}
   133  }
   134  
   135  func generatePodMetrics(podName string, contName string, restartCount int32) *systemPodsMetrics {
   136  	return &systemPodsMetrics{
   137  		Pods: []podMetrics{
   138  			{
   139  				Name: podName,
   140  				Containers: []containerMetrics{
   141  					{
   142  						Name:         contName,
   143  						RestartCount: restartCount,
   144  					},
   145  				}},
   146  		},
   147  	}
   148  }
   149  
   150  func buildConfig(t *testing.T, checkEnabled bool, thresholdOverrides map[string]int) *measurement.Config {
   151  	serializedOverrides, err := yaml.Marshal(thresholdOverrides)
   152  	if err != nil {
   153  		t.Fatal(err)
   154  	}
   155  	return &measurement.Config{
   156  		Params: map[string]interface{}{
   157  			"enableRestartCountCheck":        checkEnabled,
   158  			"restartCountThresholdOverrides": string(serializedOverrides),
   159  		},
   160  	}
   161  }