Skip to content

Commit ff0f154

Browse files
Add capabiliy to track images pulled by Docker
1 parent d17991d commit ff0f154

16 files changed

+321
-92
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
git_commit = $(shell git log -1 --pretty=format:"%H")
22

33
test_unit:
4-
go test -v -race $(shell go list ./... | grep -v /functional_tests)
5-
go test -v ./pkg/shipyard
4+
go test -race $(shell go list ./... | grep -v /functional_tests)
5+
go test ./pkg/shipyard
66

77
test_functional: install_local
88
cd ./functional_tests && go test -timeout 20m -v -run.test true ./...

pkg/clients/docker_tasks.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,14 @@ import (
3131
// DockerTasks is a concrete implementation of ContainerTasks which uses the Docker SDK
3232
type DockerTasks struct {
3333
c Docker
34+
il ImageLog
3435
force bool
3536
l hclog.Logger
3637
}
3738

3839
// NewDockerTasks creates a DockerTasks with the given Docker client
39-
func NewDockerTasks(c Docker, l hclog.Logger) *DockerTasks {
40-
return &DockerTasks{c: c, l: l}
40+
func NewDockerTasks(c Docker, il ImageLog, l hclog.Logger) *DockerTasks {
41+
return &DockerTasks{c: c, il: il, l: l}
4142
}
4243

4344
// SetForcePull sets a global override for the DockerTasks, when set to true
@@ -256,6 +257,12 @@ func (d *DockerTasks) PullImage(image config.Image, force bool) error {
256257
return xerrors.Errorf("Error pulling image: %w", err)
257258
}
258259

260+
// update the image log
261+
err = d.il.Log(in, ImageTypeDocker)
262+
if err != nil {
263+
d.l.Error("Unable to add image name to cache", "error", err)
264+
}
265+
259266
// write the output to /dev/null
260267
// TODO this stuff needs to be logged correctly
261268
io.Copy(ioutil.Discard, out)

pkg/clients/docker_tasks_command_shell_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ func setupShellMocks() (*DockerTasks, *clients.MockDocker) {
2626
}, nil)
2727
md.On("ContainerExecInspect", mock.Anything, mock.Anything).Return(types.ContainerExecInspect{ExitCode: 0}, nil)
2828

29-
p := NewDockerTasks(md, hclog.NewNullLogger())
29+
mic := &clients.ImageLog{}
30+
mic.On("Log", mock.Anything, mock.Anything).Return(nil)
31+
32+
p := NewDockerTasks(md, mic, hclog.NewNullLogger())
3033

3134
return p, md
3235
}

pkg/clients/docker_tasks_container_create_test.go

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ var containerConfig = &config.Container{
5454
},
5555
}
5656

57-
func createContainerConfig() (*config.Container, *config.Network, *config.Network, *clients.MockDocker) {
57+
func createContainerConfig() (*config.Container, *config.Network, *config.Network, *clients.MockDocker, *clients.ImageLog) {
5858
cc := *containerConfig
5959
cc2 := *containerConfig
6060
cn := *containerNetwork
@@ -68,10 +68,12 @@ func createContainerConfig() (*config.Container, *config.Network, *config.Networ
6868
c.AddResource(&cn)
6969
c.AddResource(&wn)
7070

71-
return &cc, &cn, &wn, setupContainerMocks()
71+
mc, mic := setupContainerMocks()
72+
73+
return &cc, &cn, &wn, mc, mic
7274
}
7375

74-
func setupContainerMocks() *clients.MockDocker {
76+
func setupContainerMocks() (*clients.MockDocker, *clients.ImageLog) {
7577
md := &clients.MockDocker{}
7678
md.On("ImageList", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil)
7779
md.On("ImagePull", mock.Anything, mock.Anything, mock.Anything).Return(
@@ -85,11 +87,14 @@ func setupContainerMocks() *clients.MockDocker {
8587
md.On("NetworkConnect", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil)
8688
md.On("NetworkDisconnect", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil)
8789

88-
return md
90+
mic := &clients.ImageLog{}
91+
mic.On("Log", mock.Anything, mock.Anything).Return(nil)
92+
93+
return md, mic
8994
}
9095

91-
func setupContainer(t *testing.T, cc *config.Container, md *clients.MockDocker) error {
92-
p := NewDockerTasks(md, hclog.NewNullLogger())
96+
func setupContainer(t *testing.T, cc *config.Container, md *clients.MockDocker, mic *clients.ImageLog) error {
97+
p := NewDockerTasks(md, mic, hclog.NewNullLogger())
9398

9499
// create the container
95100
_, err := p.CreateContainer(cc)
@@ -98,9 +103,9 @@ func setupContainer(t *testing.T, cc *config.Container, md *clients.MockDocker)
98103
}
99104

100105
func TestContainerCreatesCorrectly(t *testing.T) {
101-
cc, _, _, md := createContainerConfig()
106+
cc, _, _, md, mic := createContainerConfig()
102107

103-
err := setupContainer(t, cc, md)
108+
err := setupContainer(t, cc, md, mic)
104109
assert.NoError(t, err)
105110

106111
// check that the docker api methods were called
@@ -123,9 +128,9 @@ func TestContainerCreatesCorrectly(t *testing.T) {
123128
}
124129

125130
func TestContainerRemovesBridgeBeforeAttachingToUserNetwork(t *testing.T) {
126-
cc, _, _, md := createContainerConfig()
131+
cc, _, _, md, mic := createContainerConfig()
127132

128-
err := setupContainer(t, cc, md)
133+
err := setupContainer(t, cc, md, mic)
129134
assert.NoError(t, err)
130135

131136
params := getCalls(&md.Mock, "NetworkDisconnect")[0].Arguments
@@ -134,18 +139,18 @@ func TestContainerRemovesBridgeBeforeAttachingToUserNetwork(t *testing.T) {
134139
}
135140

136141
func TestContainerReturnsErrorIfErrorRemovingBridge(t *testing.T) {
137-
cc, _, _, md := createContainerConfig()
142+
cc, _, _, md, mic := createContainerConfig()
138143
removeOn(&md.Mock, "NetworkDisconnect")
139144
md.On("NetworkDisconnect", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("boom"))
140145

141-
err := setupContainer(t, cc, md)
146+
err := setupContainer(t, cc, md, mic)
142147
assert.Error(t, err)
143148
}
144149

145150
func TestContainerAttachesToUserNetwork(t *testing.T) {
146-
cc, cn, _, md := createContainerConfig()
151+
cc, cn, _, md, mic := createContainerConfig()
147152

148-
err := setupContainer(t, cc, md)
153+
err := setupContainer(t, cc, md, mic)
149154
assert.NoError(t, err)
150155

151156
params := getCalls(&md.Mock, "NetworkConnect")[0].Arguments
@@ -157,11 +162,11 @@ func TestContainerAttachesToUserNetwork(t *testing.T) {
157162
}
158163

159164
func TestContainerAttachesToContainerNetwork(t *testing.T) {
160-
cc, _, _, md := createContainerConfig()
165+
cc, _, _, md, mic := createContainerConfig()
161166
cc.Networks = []config.NetworkAttachment{config.NetworkAttachment{Name: "container.testcontainer2"}}
162167
md.On("ContainerList", mock.Anything, mock.Anything).Return([]types.Container{types.Container{ID: "abc"}})
163168

164-
err := setupContainer(t, cc, md)
169+
err := setupContainer(t, cc, md, mic)
165170
assert.NoError(t, err)
166171

167172
md.AssertNotCalled(t, "NetworkConnect")
@@ -173,50 +178,50 @@ func TestContainerAttachesToContainerNetwork(t *testing.T) {
173178
}
174179

175180
func TestContainerAttachesToContainerNetworkReturnsErrorWhenListError(t *testing.T) {
176-
cc, _, _, md := createContainerConfig()
181+
cc, _, _, md, mic := createContainerConfig()
177182
cc.Networks = []config.NetworkAttachment{config.NetworkAttachment{Name: "container.testcontainer2"}}
178183
md.On("ContainerList", mock.Anything, mock.Anything).Return(nil, fmt.Errorf("boom"))
179184

180-
err := setupContainer(t, cc, md)
185+
err := setupContainer(t, cc, md, mic)
181186
assert.Error(t, err)
182187
}
183188

184189
func TestContainerAttachesToContainerNetworkReturnsErrorWhenContainerNotFound(t *testing.T) {
185-
cc, _, _, md := createContainerConfig()
190+
cc, _, _, md, mic := createContainerConfig()
186191
cc.Networks = []config.NetworkAttachment{config.NetworkAttachment{Name: "container.testcontainer2"}}
187192
md.On("ContainerList", mock.Anything, mock.Anything).Return(nil, nil)
188193

189-
err := setupContainer(t, cc, md)
194+
err := setupContainer(t, cc, md, mic)
190195
assert.Error(t, err)
191196
}
192197

193198
func TestContainerRollsbackWhenUnableToConnectToNetwork(t *testing.T) {
194-
cc, _, _, md := createContainerConfig()
199+
cc, _, _, md, mic := createContainerConfig()
195200
removeOn(&md.Mock, "NetworkConnect")
196201
md.On("NetworkConnect", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("boom"))
197202

198-
err := setupContainer(t, cc, md)
203+
err := setupContainer(t, cc, md, mic)
199204
assert.Error(t, err)
200205

201206
md.AssertCalled(t, "ContainerRemove", mock.Anything, mock.Anything, mock.Anything)
202207
}
203208

204209
func TestContainerDoesNOTAttachesToUserNetworkWhenNil(t *testing.T) {
205-
cc, nc, _, md := createContainerConfig()
210+
cc, nc, _, md, mic := createContainerConfig()
206211
cc.Networks = []config.NetworkAttachment{}
207212

208-
err := setupContainer(t, cc, md)
213+
err := setupContainer(t, cc, md, mic)
209214
assert.NoError(t, err)
210215

211216
md.AssertNumberOfCalls(t, "NetworkConnect", 0)
212217
md.AssertNotCalled(t, "NetworkConnect", nc.Name, mock.Anything, mock.Anything, mock.Anything)
213218
}
214219

215220
func TestContainerAssignsIPToUserNetwork(t *testing.T) {
216-
cc, _, _, md := createContainerConfig()
221+
cc, _, _, md, mic := createContainerConfig()
217222
cc.Networks[0].IPAddress = "192.168.1.123"
218223

219-
err := setupContainer(t, cc, md)
224+
err := setupContainer(t, cc, md, mic)
220225
assert.NoError(t, err)
221226

222227
params := getCalls(&md.Mock, "NetworkConnect")[0].Arguments
@@ -226,21 +231,21 @@ func TestContainerAssignsIPToUserNetwork(t *testing.T) {
226231
}
227232

228233
func TestContainerRollsbackWhenUnableToConnectToWANNetwork(t *testing.T) {
229-
cc, _, _, md := createContainerConfig()
234+
cc, _, _, md, mic := createContainerConfig()
230235
removeOn(&md.Mock, "NetworkConnect")
231236
md.On("NetworkConnect", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil).Once()
232237
md.On("NetworkConnect", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("boom")).Once()
233238

234-
err := setupContainer(t, cc, md)
239+
err := setupContainer(t, cc, md, mic)
235240
assert.Error(t, err)
236241

237242
md.AssertCalled(t, "ContainerRemove", mock.Anything, mock.Anything, mock.Anything)
238243
}
239244

240245
func TestContainerAttachesVolumeMounts(t *testing.T) {
241-
cc, _, _, md := createContainerConfig()
246+
cc, _, _, md, mic := createContainerConfig()
242247

243-
err := setupContainer(t, cc, md)
248+
err := setupContainer(t, cc, md, mic)
244249
assert.NoError(t, err)
245250

246251
params := getCalls(&md.Mock, "ContainerCreate")[0].Arguments
@@ -256,10 +261,10 @@ func TestContainerCreatesDirectoryForVolume(t *testing.T) {
256261
tmpFolder := fmt.Sprintf("%s/%d", utils.ShipyardTemp(), time.Now().UnixNano())
257262
defer os.RemoveAll(tmpFolder)
258263

259-
cc, _, _, md := createContainerConfig()
264+
cc, _, _, md, mic := createContainerConfig()
260265
cc.Volumes[0].Source = tmpFolder
261266

262-
err := setupContainer(t, cc, md)
267+
err := setupContainer(t, cc, md, mic)
263268
assert.NoError(t, err)
264269

265270
assert.DirExists(t, tmpFolder)
@@ -269,20 +274,20 @@ func TestContainerDoesNotCreatesDirectoryForVolumeWhenNotBind(t *testing.T) {
269274
tmpFolder := fmt.Sprintf("%s/%d", utils.ShipyardTemp(), time.Now().UnixNano())
270275
defer os.RemoveAll(tmpFolder)
271276

272-
cc, _, _, md := createContainerConfig()
277+
cc, _, _, md, mic := createContainerConfig()
273278
cc.Volumes[0].Source = tmpFolder
274279
cc.Volumes[0].Type = "volume"
275280

276-
err := setupContainer(t, cc, md)
281+
err := setupContainer(t, cc, md, mic)
277282
assert.NoError(t, err)
278283

279284
assert.NoDirExists(t, tmpFolder)
280285
}
281286

282287
func TestContainerPublishesPorts(t *testing.T) {
283-
cc, _, _, md := createContainerConfig()
288+
cc, _, _, md, mic := createContainerConfig()
284289

285-
err := setupContainer(t, cc, md)
290+
err := setupContainer(t, cc, md, mic)
286291
assert.NoError(t, err)
287292

288293
params := getCalls(&md.Mock, "ContainerCreate")[0].Arguments

pkg/clients/docker_tasks_container_logs_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ func TestContainerLogsCalled(t *testing.T) {
1818
ioutil.NopCloser(bytes.NewBufferString("test")),
1919
fmt.Errorf("boom"),
2020
)
21-
dt := NewDockerTasks(md, hclog.NewNullLogger())
21+
mic := &mocks.ImageLog{}
22+
23+
dt := NewDockerTasks(md, mic, hclog.NewNullLogger())
2224

2325
rc, err := dt.ContainerLogs("123", true, true)
2426
assert.NotNil(t, rc)

pkg/clients/docker_tasks_container_remove_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ import (
77
"github.com/docker/docker/api/types"
88
"github.com/hashicorp/go-hclog"
99
"github.com/shipyard-run/shipyard/pkg/clients/mocks"
10+
clients "github.com/shipyard-run/shipyard/pkg/clients/mocks"
1011
"github.com/stretchr/testify/mock"
1112
)
1213

1314
func TestContainerRemoveCallsRemoveGently(t *testing.T) {
1415
md := &mocks.MockDocker{}
15-
dt := NewDockerTasks(md, hclog.NewNullLogger())
16+
mic := &clients.ImageLog{}
17+
dt := NewDockerTasks(md, mic, hclog.NewNullLogger())
1618

1719
md.On("ContainerRemove", mock.Anything, "test", types.ContainerRemoveOptions{Force: false, RemoveVolumes: true}).Return(nil)
1820

@@ -23,7 +25,8 @@ func TestContainerRemoveCallsRemoveGently(t *testing.T) {
2325

2426
func TestContainerRemoveFailsCallsRemoveForcefully(t *testing.T) {
2527
md := &mocks.MockDocker{}
26-
dt := NewDockerTasks(md, hclog.NewNullLogger())
28+
mic := &clients.ImageLog{}
29+
dt := NewDockerTasks(md, mic, hclog.NewNullLogger())
2730

2831
md.On("ContainerRemove", mock.Anything, "test", types.ContainerRemoveOptions{Force: false, RemoveVolumes: true}).Return(fmt.Errorf("boom"))
2932
md.On("ContainerRemove", mock.Anything, "test", types.ContainerRemoveOptions{Force: true, RemoveVolumes: true}).Return(nil)

pkg/clients/docker_tasks_copy_from_container_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/docker/docker/api/types"
1111
"github.com/hashicorp/go-hclog"
1212
"github.com/shipyard-run/shipyard/pkg/clients/mocks"
13+
clients "github.com/shipyard-run/shipyard/pkg/clients/mocks"
1314
"github.com/stretchr/testify/assert"
1415
"github.com/stretchr/testify/mock"
1516
)
@@ -21,12 +22,13 @@ func TestCopyFromContainerCopiesFile(t *testing.T) {
2122
src := "/output/file.hcl"
2223

2324
md := &mocks.MockDocker{}
25+
mic := &clients.ImageLog{}
2426
md.On("CopyFromContainer", mock.Anything, id, src).Return(
2527
ioutil.NopCloser(bytes.NewBufferString(fileContent)),
2628
types.ContainerPathStat{},
2729
nil,
2830
)
29-
dt := NewDockerTasks(md, hclog.NewNullLogger())
31+
dt := NewDockerTasks(md, mic, hclog.NewNullLogger())
3032

3133
tmpDir, _ := ioutil.TempDir("", "")
3234
defer os.RemoveAll(tmpDir)
@@ -45,12 +47,13 @@ func TestCopyFromContainerReturnsErrorOnDockerError(t *testing.T) {
4547
src := "/output/file.hcl"
4648

4749
md := &mocks.MockDocker{}
50+
mic := &clients.ImageLog{}
4851
md.On("CopyFromContainer", mock.Anything, id, src).Return(
4952
nil,
5053
types.ContainerPathStat{},
5154
fmt.Errorf("boom"),
5255
)
53-
dt := NewDockerTasks(md, hclog.NewNullLogger())
56+
dt := NewDockerTasks(md, mic, hclog.NewNullLogger())
5457

5558
err := dt.CopyFromContainer(id, src, "/new.hcl")
5659
assert.Error(t, err)

0 commit comments

Comments
 (0)