mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-04 09:49:50 +00:00
kubelet/util/manager: small cleanup and start replacing deprecated functions wait.Poll/wait.PollImmediate
Signed-off-by: TommyStarK <thomasmilox@gmail.com>
This commit is contained in:
parent
4bb434501d
commit
2ed556ae00
@ -437,6 +437,31 @@ func TestCacheInvalidation(t *testing.T) {
|
|||||||
fakeClient.ClearActions()
|
fakeClient.ClearActions()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestResourceContentExpired(t *testing.T) {
|
||||||
|
fakeClient := &fake.Clientset{}
|
||||||
|
fakeClock := testingclock.NewFakeClock(time.Now())
|
||||||
|
store := newSecretStore(fakeClient, fakeClock, noObjectTTL, time.Minute)
|
||||||
|
manager := newCacheBasedSecretManager(store)
|
||||||
|
|
||||||
|
// Create a pod with some secrets.
|
||||||
|
s1 := secretsToAttach{
|
||||||
|
imagePullSecretNames: []string{"s1"},
|
||||||
|
containerEnvSecrets: []envSecrets{
|
||||||
|
{envVarNames: []string{"s1"}, envFromNames: []string{"s10"}},
|
||||||
|
{envVarNames: []string{"s2"}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// emulate a requested resource content that has expired from the server
|
||||||
|
manager.RegisterPod(podWithSecrets("dummy-ns", "dummy-name", s1))
|
||||||
|
fakeClient.PrependReactor("get", "secrets", func(action core.Action) (bool, runtime.Object, error) {
|
||||||
|
return true, &v1.Secret{}, apierrors.NewResourceExpired("expired")
|
||||||
|
})
|
||||||
|
// should fail to fetch the latest object
|
||||||
|
_, err := manager.GetObject("dummy-ns", "s1")
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestRegisterIdempotence(t *testing.T) {
|
func TestRegisterIdempotence(t *testing.T) {
|
||||||
fakeClient := &fake.Clientset{}
|
fakeClient := &fake.Clientset{}
|
||||||
fakeClock := testingclock.NewFakeClock(time.Now())
|
fakeClock := testingclock.NewFakeClock(time.Now())
|
||||||
|
@ -38,6 +38,7 @@ import (
|
|||||||
|
|
||||||
corev1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
corev1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
|
|
||||||
|
"k8s.io/kubernetes/test/utils/ktesting"
|
||||||
"k8s.io/utils/clock"
|
"k8s.io/utils/clock"
|
||||||
testingclock "k8s.io/utils/clock/testing"
|
testingclock "k8s.io/utils/clock/testing"
|
||||||
|
|
||||||
@ -105,7 +106,7 @@ func TestSecretCache(t *testing.T) {
|
|||||||
ObjectMeta: metav1.ObjectMeta{Name: "name", Namespace: "ns", ResourceVersion: "125"},
|
ObjectMeta: metav1.ObjectMeta{Name: "name", Namespace: "ns", ResourceVersion: "125"},
|
||||||
}
|
}
|
||||||
fakeWatch.Add(secret)
|
fakeWatch.Add(secret)
|
||||||
getFn := func() (bool, error) {
|
getFn := func(_ context.Context) (bool, error) {
|
||||||
object, err := store.Get("ns", "name")
|
object, err := store.Get("ns", "name")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if apierrors.IsNotFound(err) {
|
if apierrors.IsNotFound(err) {
|
||||||
@ -119,13 +120,15 @@ func TestSecretCache(t *testing.T) {
|
|||||||
}
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
if err := wait.PollImmediate(10*time.Millisecond, time.Second, getFn); err != nil {
|
|
||||||
|
tCtx := ktesting.Init(t)
|
||||||
|
if err := wait.PollUntilContextCancel(tCtx, 10*time.Millisecond, true, getFn); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Eventually we should observer secret deletion.
|
// Eventually we should observer secret deletion.
|
||||||
fakeWatch.Delete(secret)
|
fakeWatch.Delete(secret)
|
||||||
getFn = func() (bool, error) {
|
getFn = func(_ context.Context) (bool, error) {
|
||||||
_, err := store.Get("ns", "name")
|
_, err := store.Get("ns", "name")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if apierrors.IsNotFound(err) {
|
if apierrors.IsNotFound(err) {
|
||||||
@ -135,7 +138,9 @@ func TestSecretCache(t *testing.T) {
|
|||||||
}
|
}
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
if err := wait.PollImmediate(10*time.Millisecond, time.Second, getFn); err != nil {
|
deadlineCtx, deadlineCancel := context.WithTimeout(tCtx, time.Second)
|
||||||
|
defer deadlineCancel()
|
||||||
|
if err := wait.PollUntilContextCancel(deadlineCtx, 10*time.Millisecond, true, getFn); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +171,7 @@ func TestSecretCacheMultipleRegistrations(t *testing.T) {
|
|||||||
|
|
||||||
store.AddReference("ns", "name", "pod")
|
store.AddReference("ns", "name", "pod")
|
||||||
// This should trigger List and Watch actions eventually.
|
// This should trigger List and Watch actions eventually.
|
||||||
actionsFn := func() (bool, error) {
|
actionsFn := func(_ context.Context) (bool, error) {
|
||||||
actions := fakeClient.Actions()
|
actions := fakeClient.Actions()
|
||||||
if len(actions) > 2 {
|
if len(actions) > 2 {
|
||||||
return false, fmt.Errorf("too many actions: %v", actions)
|
return false, fmt.Errorf("too many actions: %v", actions)
|
||||||
@ -179,7 +184,8 @@ func TestSecretCacheMultipleRegistrations(t *testing.T) {
|
|||||||
}
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
if err := wait.PollImmediate(10*time.Millisecond, time.Second, actionsFn); err != nil {
|
tCtx := ktesting.Init(t)
|
||||||
|
if err := wait.PollUntilContextCancel(tCtx, 10*time.Millisecond, true, actionsFn); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,7 +277,7 @@ func TestImmutableSecretStopsTheReflector(t *testing.T) {
|
|||||||
store := newSecretCache(fakeClient, fakeClock, time.Minute)
|
store := newSecretCache(fakeClient, fakeClock, time.Minute)
|
||||||
|
|
||||||
key := objectKey{namespace: "ns", name: "name"}
|
key := objectKey{namespace: "ns", name: "name"}
|
||||||
itemExists := func() (bool, error) {
|
itemExists := func(_ context.Context) (bool, error) {
|
||||||
store.lock.Lock()
|
store.lock.Lock()
|
||||||
defer store.lock.Unlock()
|
defer store.lock.Unlock()
|
||||||
_, ok := store.items[key]
|
_, ok := store.items[key]
|
||||||
@ -289,7 +295,8 @@ func TestImmutableSecretStopsTheReflector(t *testing.T) {
|
|||||||
|
|
||||||
// AddReference should start reflector.
|
// AddReference should start reflector.
|
||||||
store.AddReference("ns", "name", "pod")
|
store.AddReference("ns", "name", "pod")
|
||||||
if err := wait.Poll(10*time.Millisecond, time.Second, itemExists); err != nil {
|
tCtx := ktesting.Init(t)
|
||||||
|
if err := wait.PollUntilContextCancel(tCtx, 10*time.Millisecond, false, itemExists); err != nil {
|
||||||
t.Errorf("item wasn't added to cache")
|
t.Errorf("item wasn't added to cache")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,7 +316,7 @@ func TestImmutableSecretStopsTheReflector(t *testing.T) {
|
|||||||
fakeWatch.Add(tc.eventual)
|
fakeWatch.Add(tc.eventual)
|
||||||
|
|
||||||
// Eventually Get should return that secret.
|
// Eventually Get should return that secret.
|
||||||
getFn := func() (bool, error) {
|
getFn := func(_ context.Context) (bool, error) {
|
||||||
object, err := store.Get("ns", "name")
|
object, err := store.Get("ns", "name")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if apierrors.IsNotFound(err) {
|
if apierrors.IsNotFound(err) {
|
||||||
@ -320,7 +327,9 @@ func TestImmutableSecretStopsTheReflector(t *testing.T) {
|
|||||||
secret := object.(*v1.Secret)
|
secret := object.(*v1.Secret)
|
||||||
return apiequality.Semantic.DeepEqual(tc.eventual, secret), nil
|
return apiequality.Semantic.DeepEqual(tc.eventual, secret), nil
|
||||||
}
|
}
|
||||||
if err := wait.PollImmediate(10*time.Millisecond, time.Second, getFn); err != nil {
|
deadlineCtx, deadlineCancel := context.WithTimeout(tCtx, time.Second)
|
||||||
|
defer deadlineCancel()
|
||||||
|
if err := wait.PollUntilContextCancel(deadlineCtx, 10*time.Millisecond, true, getFn); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,7 +367,7 @@ func TestMaxIdleTimeStopsTheReflector(t *testing.T) {
|
|||||||
store := newSecretCache(fakeClient, fakeClock, time.Minute)
|
store := newSecretCache(fakeClient, fakeClock, time.Minute)
|
||||||
|
|
||||||
key := objectKey{namespace: "ns", name: "name"}
|
key := objectKey{namespace: "ns", name: "name"}
|
||||||
itemExists := func() (bool, error) {
|
itemExists := func(_ context.Context) (bool, error) {
|
||||||
store.lock.Lock()
|
store.lock.Lock()
|
||||||
defer store.lock.Unlock()
|
defer store.lock.Unlock()
|
||||||
_, ok := store.items[key]
|
_, ok := store.items[key]
|
||||||
@ -377,7 +386,8 @@ func TestMaxIdleTimeStopsTheReflector(t *testing.T) {
|
|||||||
|
|
||||||
// AddReference should start reflector.
|
// AddReference should start reflector.
|
||||||
store.AddReference("ns", "name", "pod")
|
store.AddReference("ns", "name", "pod")
|
||||||
if err := wait.Poll(10*time.Millisecond, 10*time.Second, itemExists); err != nil {
|
tCtx := ktesting.Init(t)
|
||||||
|
if err := wait.PollUntilContextCancel(tCtx, 10*time.Millisecond, false, itemExists); err != nil {
|
||||||
t.Errorf("item wasn't added to cache")
|
t.Errorf("item wasn't added to cache")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -440,7 +450,7 @@ func TestReflectorNotStoppedOnSlowInitialization(t *testing.T) {
|
|||||||
store := newSecretCache(fakeClient, fakeClock, time.Minute)
|
store := newSecretCache(fakeClient, fakeClock, time.Minute)
|
||||||
|
|
||||||
key := objectKey{namespace: "ns", name: "name"}
|
key := objectKey{namespace: "ns", name: "name"}
|
||||||
itemExists := func() (bool, error) {
|
itemExists := func(_ context.Context) (bool, error) {
|
||||||
store.lock.Lock()
|
store.lock.Lock()
|
||||||
defer store.lock.Unlock()
|
defer store.lock.Unlock()
|
||||||
_, ok := store.items[key]
|
_, ok := store.items[key]
|
||||||
@ -457,7 +467,7 @@ func TestReflectorNotStoppedOnSlowInitialization(t *testing.T) {
|
|||||||
return !item.stopped
|
return !item.stopped
|
||||||
}
|
}
|
||||||
|
|
||||||
reflectorInitialized := func() (bool, error) {
|
reflectorInitialized := func(_ context.Context) (bool, error) {
|
||||||
store.lock.Lock()
|
store.lock.Lock()
|
||||||
defer store.lock.Unlock()
|
defer store.lock.Unlock()
|
||||||
item := store.items[key]
|
item := store.items[key]
|
||||||
@ -469,7 +479,8 @@ func TestReflectorNotStoppedOnSlowInitialization(t *testing.T) {
|
|||||||
|
|
||||||
// AddReference should start reflector.
|
// AddReference should start reflector.
|
||||||
store.AddReference("ns", "name", "pod")
|
store.AddReference("ns", "name", "pod")
|
||||||
if err := wait.Poll(10*time.Millisecond, 10*time.Second, itemExists); err != nil {
|
tCtx := ktesting.Init(t)
|
||||||
|
if err := wait.PollUntilContextCancel(tCtx, 10*time.Millisecond, false, itemExists); err != nil {
|
||||||
t.Errorf("item wasn't added to cache")
|
t.Errorf("item wasn't added to cache")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -479,7 +490,7 @@ func TestReflectorNotStoppedOnSlowInitialization(t *testing.T) {
|
|||||||
// Reflector didn't yet initialize, so it shouldn't be stopped.
|
// Reflector didn't yet initialize, so it shouldn't be stopped.
|
||||||
// However, Get should still be failing.
|
// However, Get should still be failing.
|
||||||
assert.True(t, reflectorRunning())
|
assert.True(t, reflectorRunning())
|
||||||
initialized, _ := reflectorInitialized()
|
initialized, _ := reflectorInitialized(tCtx)
|
||||||
assert.False(t, initialized)
|
assert.False(t, initialized)
|
||||||
_, err := store.Get("ns", "name")
|
_, err := store.Get("ns", "name")
|
||||||
if err == nil || !strings.Contains(err.Error(), "failed to sync") {
|
if err == nil || !strings.Contains(err.Error(), "failed to sync") {
|
||||||
@ -488,7 +499,9 @@ func TestReflectorNotStoppedOnSlowInitialization(t *testing.T) {
|
|||||||
|
|
||||||
// Initialization should successfully finish.
|
// Initialization should successfully finish.
|
||||||
fakeClock.Step(30 * time.Second)
|
fakeClock.Step(30 * time.Second)
|
||||||
if err := wait.Poll(10*time.Millisecond, time.Second, reflectorInitialized); err != nil {
|
deadlineCtx, deadlineCancel := context.WithTimeout(tCtx, time.Second)
|
||||||
|
defer deadlineCancel()
|
||||||
|
if err := wait.PollUntilContextCancel(deadlineCtx, 10*time.Millisecond, false, reflectorInitialized); err != nil {
|
||||||
t.Errorf("reflector didn't iniailize correctly")
|
t.Errorf("reflector didn't iniailize correctly")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user