1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
//go:build !integration
// +build !integration
package pull
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
api "k8s.io/api/core/v1"
)
const buildImage = "alpine:latest"
func TestNewPullManager(t *testing.T) {
m := NewPullManager([]api.PullPolicy{}, nil)
assert.NotNil(t, m)
}
func TestGetPullPolicyFor(t *testing.T) {
m := newPullManagerForTest(t, nil)
pullPolicy, err := m.GetPullPolicyFor(buildImage)
assert.NoError(t, err)
assert.Equal(t, api.PullAlways, pullPolicy)
}
func TestMarkPullFailureFor(t *testing.T) {
t.Run("fails on fallback with no pull policies", func(t *testing.T) {
l := new(mockPullLogger)
defer l.AssertExpectations(t)
m := NewPullManager([]api.PullPolicy{}, l)
require.NotNil(t, m)
pullPolicy, err := m.GetPullPolicyFor(buildImage)
assert.NoError(t, err)
assert.Equal(t, api.PullPolicy(""), pullPolicy)
l.On("Warningln", `Failed to pull image with policy "": server down`).
Once()
repeat := m.UpdatePolicyForImage(1, &ImagePullError{Image: buildImage, Message: "server down"})
assert.False(t, repeat, "UpdatePolicyForImage should return false")
_, err = m.GetPullPolicyFor(buildImage)
assert.Error(t, err)
})
t.Run("succeeds on fallback with two pull policies", func(t *testing.T) {
l := new(mockPullLogger)
defer l.AssertExpectations(t)
m := newPullManagerForTest(t, l)
pullPolicy, err := m.GetPullPolicyFor(buildImage)
assert.NoError(t, err)
assert.Equal(t, api.PullAlways, pullPolicy)
l.On("Warningln", `Failed to pull image with policy "Always": server down`).
Once()
l.On(
"Infoln",
fmt.Sprintf(`Attempt #2: Trying "IfNotPresent" pull policy for %q image`, buildImage),
).Once()
repeat := m.UpdatePolicyForImage(1, &ImagePullError{Image: buildImage, Message: "server down"})
assert.True(t, repeat, "UpdatePolicyForImage should return true")
pullPolicy, err = m.GetPullPolicyFor(buildImage)
assert.NoError(t, err)
assert.Equal(t, api.PullIfNotPresent, pullPolicy)
})
t.Run("succeeds on fallback with multiple images", func(t *testing.T) {
l := new(mockPullLogger)
m := newPullManagerForTest(t, l)
pullPolicy, err := m.GetPullPolicyFor(buildImage)
assert.NoError(t, err)
assert.Equal(t, api.PullAlways, pullPolicy)
l.On("Warningln", `Failed to pull image with policy "Always": server down`).
Once()
l.On(
"Infoln",
fmt.Sprintf(`Attempt #2: Trying "IfNotPresent" pull policy for %q image`, buildImage),
).Once()
repeat := m.UpdatePolicyForImage(1, &ImagePullError{Image: buildImage, Message: "server down"})
assert.True(t, repeat, "UpdatePolicyForImage should return true")
pullPolicy, err = m.GetPullPolicyFor("helper")
assert.NoError(t, err)
assert.Equal(t, api.PullAlways, pullPolicy)
pullPolicy, err = m.GetPullPolicyFor(buildImage)
assert.NoError(t, err)
assert.Equal(t, api.PullIfNotPresent, pullPolicy)
l.On("Warningln", `Failed to pull image with policy "Always": server down`).
Once()
l.On(
"Infoln",
fmt.Sprintf(`Attempt #2: Trying "IfNotPresent" pull policy for %q image`, "helper"),
).Once()
repeat = m.UpdatePolicyForImage(1, &ImagePullError{Image: "helper", Message: "server down"})
assert.True(t, repeat, "UpdatePolicyForImage should return true")
pullPolicy, err = m.GetPullPolicyFor("helper")
assert.NoError(t, err)
assert.Equal(t, api.PullIfNotPresent, pullPolicy)
})
t.Run("fails after second fallback", func(t *testing.T) {
l := new(mockPullLogger)
m := newPullManagerForTest(t, l)
pullPolicy, err := m.GetPullPolicyFor(buildImage)
assert.NoError(t, err)
assert.Equal(t, api.PullAlways, pullPolicy)
l.On("Warningln", `Failed to pull image with policy "Always": server down`).
Once()
l.On(
"Infoln",
fmt.Sprintf(`Attempt #2: Trying "IfNotPresent" pull policy for %q image`, buildImage),
).Once()
repeat := m.UpdatePolicyForImage(1, &ImagePullError{Image: buildImage, Message: "server down"})
assert.True(t, repeat, "UpdatePolicyForImage should return true")
pullPolicy, err = m.GetPullPolicyFor(buildImage)
assert.NoError(t, err)
assert.Equal(t, api.PullIfNotPresent, pullPolicy)
l.On("Warningln", `Failed to pull image with policy "IfNotPresent": server down`).
Once()
repeat = m.UpdatePolicyForImage(2, &ImagePullError{Image: buildImage, Message: "server down"})
assert.False(t, repeat, "UpdatePolicyForImage should return false")
_, err = m.GetPullPolicyFor(buildImage)
assert.Error(t, err)
})
}
func newPullManagerForTest(t *testing.T, l *mockPullLogger) Manager {
m := NewPullManager([]api.PullPolicy{api.PullAlways, api.PullIfNotPresent}, l)
require.NotNil(t, m)
return m
}
|