File: manager_test.go

package info (click to toggle)
gitlab-ci-multi-runner 14.10.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 31,248 kB
  • sloc: sh: 1,694; makefile: 384; asm: 79; ruby: 68
file content (149 lines) | stat: -rw-r--r-- 4,708 bytes parent folder | download
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
}