mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-29 21:01:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
| Copyright 2016 The Kubernetes Authors.
 | |
| 
 | |
| Licensed under the Apache License, Version 2.0 (the "License");
 | |
| you may not use this file except in compliance with the License.
 | |
| You may obtain a copy of the License at
 | |
| 
 | |
|     http://www.apache.org/licenses/LICENSE-2.0
 | |
| 
 | |
| Unless required by applicable law or agreed to in writing, software
 | |
| distributed under the License is distributed on an "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| See the License for the specific language governing permissions and
 | |
| limitations under the License.
 | |
| */
 | |
| 
 | |
| package kubelet
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"k8s.io/api/core/v1"
 | |
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | |
| 	"k8s.io/apimachinery/pkg/types"
 | |
| 	"k8s.io/apimachinery/pkg/util/clock"
 | |
| 	"k8s.io/client-go/tools/record"
 | |
| )
 | |
| 
 | |
| // mockPodStatusProvider returns the status on the specified pod
 | |
| type mockPodStatusProvider struct {
 | |
| 	pods []*v1.Pod
 | |
| }
 | |
| 
 | |
| // GetPodStatus returns the status on the associated pod with matching uid (if found)
 | |
| func (m *mockPodStatusProvider) GetPodStatus(uid types.UID) (v1.PodStatus, bool) {
 | |
| 	for _, pod := range m.pods {
 | |
| 		if pod.UID == uid {
 | |
| 			return pod.Status, true
 | |
| 		}
 | |
| 	}
 | |
| 	return v1.PodStatus{}, false
 | |
| }
 | |
| 
 | |
| // TestActiveDeadlineHandler verifies the active deadline handler functions as expected.
 | |
| func TestActiveDeadlineHandler(t *testing.T) {
 | |
| 	pods := newTestPods(4)
 | |
| 	fakeClock := clock.NewFakeClock(time.Now())
 | |
| 	podStatusProvider := &mockPodStatusProvider{pods: pods}
 | |
| 	fakeRecorder := &record.FakeRecorder{}
 | |
| 	handler, err := newActiveDeadlineHandler(podStatusProvider, fakeRecorder, fakeClock)
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("unexpected error: %v", err)
 | |
| 	}
 | |
| 
 | |
| 	now := metav1.Now()
 | |
| 	startTime := metav1.NewTime(now.Time.Add(-1 * time.Minute))
 | |
| 
 | |
| 	// this pod has exceeded its active deadline
 | |
| 	exceededActiveDeadlineSeconds := int64(30)
 | |
| 	pods[0].Status.StartTime = &startTime
 | |
| 	pods[0].Spec.ActiveDeadlineSeconds = &exceededActiveDeadlineSeconds
 | |
| 
 | |
| 	// this pod has not exceeded its active deadline
 | |
| 	notYetActiveDeadlineSeconds := int64(120)
 | |
| 	pods[1].Status.StartTime = &startTime
 | |
| 	pods[1].Spec.ActiveDeadlineSeconds = ¬YetActiveDeadlineSeconds
 | |
| 
 | |
| 	// this pod has no deadline
 | |
| 	pods[2].Status.StartTime = &startTime
 | |
| 	pods[2].Spec.ActiveDeadlineSeconds = nil
 | |
| 
 | |
| 	testCases := []struct {
 | |
| 		pod      *v1.Pod
 | |
| 		expected bool
 | |
| 	}{{pods[0], true}, {pods[1], false}, {pods[2], false}, {pods[3], false}}
 | |
| 
 | |
| 	for i, testCase := range testCases {
 | |
| 		if actual := handler.ShouldSync(testCase.pod); actual != testCase.expected {
 | |
| 			t.Errorf("[%d] ShouldSync expected %#v, got %#v", i, testCase.expected, actual)
 | |
| 		}
 | |
| 		actual := handler.ShouldEvict(testCase.pod)
 | |
| 		if actual.Evict != testCase.expected {
 | |
| 			t.Errorf("[%d] ShouldEvict.Evict expected %#v, got %#v", i, testCase.expected, actual.Evict)
 | |
| 		}
 | |
| 		if testCase.expected {
 | |
| 			if actual.Reason != reason {
 | |
| 				t.Errorf("[%d] ShouldEvict.Reason expected %#v, got %#v", i, message, actual.Reason)
 | |
| 			}
 | |
| 			if actual.Message != message {
 | |
| 				t.Errorf("[%d] ShouldEvict.Message expected %#v, got %#v", i, message, actual.Message)
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |