42
42
hostConfig * docker.HostConfig
43
43
)
44
44
45
+ // getClient returns an instance that implements dockerClient interface
46
+ type getClient func () (dockerClient , error )
47
+
45
48
//DockerVM is a vm. It is identified by an image id
46
49
type DockerVM struct {
47
- id string
50
+ id string
51
+ getClientFnc getClient
52
+ }
53
+
54
+ // dockerClient represents a docker client
55
+ type dockerClient interface {
56
+ // CreateContainer creates a docker container, returns an error in case of failure
57
+ CreateContainer (opts docker.CreateContainerOptions ) (* docker.Container , error )
58
+ // StartContainer starts a docker container, returns an error in case of failure
59
+ StartContainer (id string , cfg * docker.HostConfig ) error
60
+ // AttachToContainer attaches to a docker container, returns an error in case of
61
+ // failure
62
+ AttachToContainer (opts docker.AttachToContainerOptions ) error
63
+ // BuildImage builds an image from a tarball's url or a Dockerfile in the input
64
+ // stream, returns an error in case of failure
65
+ BuildImage (opts docker.BuildImageOptions ) error
66
+ // RemoveImageExtended removes a docker image by its name or ID, returns an
67
+ // error in case of failure
68
+ RemoveImageExtended (id string , opts docker.RemoveImageOptions ) error
69
+ // StopContainer stops a docker container, killing it after the given timeout
70
+ // (in seconds). Returns an error in case of failure
71
+ StopContainer (id string , timeout uint ) error
72
+ // KillContainer sends a signal to a docker container, returns an error in
73
+ // case of failure
74
+ KillContainer (opts docker.KillContainerOptions ) error
75
+ // RemoveContainer removes a docker container, returns an error in case of failure
76
+ RemoveContainer (opts docker.RemoveContainerOptions ) error
77
+ }
78
+
79
+ // NewDockerVM returns a new DockerVM instance
80
+ func NewDockerVM () * DockerVM {
81
+ vm := DockerVM {}
82
+ vm .getClientFnc = getDockerClient
83
+ return & vm
84
+ }
85
+
86
+ func getDockerClient () (dockerClient , error ) {
87
+ return cutil .NewDockerClient ()
48
88
}
49
89
50
90
func getDockerHostConfig () * docker.HostConfig {
@@ -107,7 +147,9 @@ func getDockerHostConfig() *docker.HostConfig {
107
147
return hostConfig
108
148
}
109
149
110
- func (vm * DockerVM ) createContainer (ctxt context.Context , client * docker.Client , imageID string , containerID string , args []string , env []string , attachStdout bool ) error {
150
+ func (vm * DockerVM ) createContainer (ctxt context.Context , client dockerClient ,
151
+ imageID string , containerID string , args []string ,
152
+ env []string , attachStdout bool ) error {
111
153
config := docker.Config {Cmd : args , Image : imageID , Env : env , AttachStdout : attachStdout , AttachStderr : attachStdout }
112
154
copts := docker.CreateContainerOptions {Name : containerID , Config : & config , HostConfig : getDockerHostConfig ()}
113
155
dockerLogger .Debugf ("Create container: %s" , containerID )
@@ -119,7 +161,8 @@ func (vm *DockerVM) createContainer(ctxt context.Context, client *docker.Client,
119
161
return nil
120
162
}
121
163
122
- func (vm * DockerVM ) deployImage (client * docker.Client , ccid ccintf.CCID , args []string , env []string , reader io.Reader ) error {
164
+ func (vm * DockerVM ) deployImage (client dockerClient , ccid ccintf.CCID ,
165
+ args []string , env []string , reader io.Reader ) error {
123
166
id , err := vm .GetVMName (ccid )
124
167
if err != nil {
125
168
return err
@@ -147,8 +190,10 @@ func (vm *DockerVM) deployImage(client *docker.Client, ccid ccintf.CCID, args []
147
190
//for docker inputbuf is tar reader ready for use by docker.Client
148
191
//the stream from end client to peer could directly be this tar stream
149
192
//talk to docker daemon using docker Client and build the image
150
- func (vm * DockerVM ) Deploy (ctxt context.Context , ccid ccintf.CCID , args []string , env []string , reader io.Reader ) error {
151
- client , err := cutil .NewDockerClient ()
193
+ func (vm * DockerVM ) Deploy (ctxt context.Context , ccid ccintf.CCID ,
194
+ args []string , env []string , reader io.Reader ) error {
195
+
196
+ client , err := vm .getClientFnc ()
152
197
switch err {
153
198
case nil :
154
199
if err = vm .deployImage (client , ccid , args , env , reader ); err != nil {
@@ -161,12 +206,14 @@ func (vm *DockerVM) Deploy(ctxt context.Context, ccid ccintf.CCID, args []string
161
206
}
162
207
163
208
//Start starts a container using a previously created docker image
164
- func (vm * DockerVM ) Start (ctxt context.Context , ccid ccintf.CCID , args []string , env []string , builder container.BuildSpecFactory ) error {
209
+ func (vm * DockerVM ) Start (ctxt context.Context , ccid ccintf.CCID ,
210
+ args []string , env []string , builder container.BuildSpecFactory ) error {
165
211
imageID , err := vm .GetVMName (ccid )
166
212
if err != nil {
167
213
return err
168
214
}
169
- client , err := cutil .NewDockerClient ()
215
+
216
+ client , err := vm .getClientFnc ()
170
217
if err != nil {
171
218
dockerLogger .Debugf ("start - cannot create client %s" , err )
172
219
return err
@@ -187,19 +234,19 @@ func (vm *DockerVM) Start(ctxt context.Context, ccid ccintf.CCID, args []string,
187
234
if builder != nil {
188
235
dockerLogger .Debugf ("start-could not find image ...attempt to recreate image %s" , err )
189
236
190
- reader , err := builder ()
191
- if err != nil {
192
- dockerLogger .Errorf ("Error creating image builder: %s" , err )
237
+ reader , err1 := builder ()
238
+ if err1 != nil {
239
+ dockerLogger .Errorf ("Error creating image builder: %s" , err1 )
193
240
}
194
241
195
- if err = vm .deployImage (client , ccid , args , env , reader ); err != nil {
196
- return err
242
+ if err1 = vm .deployImage (client , ccid , args , env , reader ); err1 != nil {
243
+ return err1
197
244
}
198
245
199
246
dockerLogger .Debug ("start-recreated image successfully" )
200
- if err = vm .createContainer (ctxt , client , imageID , containerID , args , env , attachStdout ); err != nil {
201
- dockerLogger .Errorf ("start-could not recreate container post recreate image: %s" , err )
202
- return err
247
+ if err1 = vm .createContainer (ctxt , client , imageID , containerID , args , env , attachStdout ); err1 != nil {
248
+ dockerLogger .Errorf ("start-could not recreate container post recreate image: %s" , err1 )
249
+ return err1
203
250
}
204
251
} else {
205
252
dockerLogger .Errorf ("start-could not find image: %s" , err )
@@ -262,13 +309,13 @@ func (vm *DockerVM) Start(ctxt context.Context, ccid ccintf.CCID, args []string,
262
309
for {
263
310
// Loop forever dumping lines of text into the containerLogger
264
311
// until the pipe is closed
265
- line , err := is .ReadString ('\n' )
266
- if err != nil {
267
- switch err {
312
+ line , err2 := is .ReadString ('\n' )
313
+ if err2 != nil {
314
+ switch err2 {
268
315
case io .EOF :
269
316
dockerLogger .Infof ("Container %s has closed its IO channel" , containerID )
270
317
default :
271
- dockerLogger .Errorf ("Error reading container output: %s" , err )
318
+ dockerLogger .Errorf ("Error reading container output: %s" , err2 )
272
319
}
273
320
274
321
return
@@ -296,7 +343,8 @@ func (vm *DockerVM) Stop(ctxt context.Context, ccid ccintf.CCID, timeout uint, d
296
343
if err != nil {
297
344
return err
298
345
}
299
- client , err := cutil .NewDockerClient ()
346
+
347
+ client , err := vm .getClientFnc ()
300
348
if err != nil {
301
349
dockerLogger .Debugf ("stop - cannot create client %s" , err )
302
350
return err
@@ -308,7 +356,8 @@ func (vm *DockerVM) Stop(ctxt context.Context, ccid ccintf.CCID, timeout uint, d
308
356
return err
309
357
}
310
358
311
- func (vm * DockerVM ) stopInternal (ctxt context.Context , client * docker.Client , id string , timeout uint , dontkill bool , dontremove bool ) error {
359
+ func (vm * DockerVM ) stopInternal (ctxt context.Context , client dockerClient ,
360
+ id string , timeout uint , dontkill bool , dontremove bool ) error {
312
361
err := client .StopContainer (id , timeout )
313
362
if err != nil {
314
363
dockerLogger .Debugf ("Stop container %s(%s)" , id , err )
@@ -340,7 +389,8 @@ func (vm *DockerVM) Destroy(ctxt context.Context, ccid ccintf.CCID, force bool,
340
389
if err != nil {
341
390
return err
342
391
}
343
- client , err := cutil .NewDockerClient ()
392
+
393
+ client , err := vm .getClientFnc ()
344
394
if err != nil {
345
395
dockerLogger .Errorf ("destroy-cannot create client %s" , err )
346
396
return err
0 commit comments