Skip to content

Commit 9efae9a

Browse files
author
Anil Ambati
committed
[FAB-3730] Increase test coverage for container pkg
Added additional tests for functions in the core/container, core/container/dockercontroller and core/container/util packages Change-Id: I074884c4d077911171da275bbe9b59c83c787fe2 Signed-off-by: Anil Ambati <[email protected]>
1 parent 8f4b6a9 commit 9efae9a

File tree

6 files changed

+575
-40
lines changed

6 files changed

+575
-40
lines changed

core/container/controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func (vmc *VMController) newVM(typ string) api.VM {
6666

6767
switch typ {
6868
case DOCKER:
69-
v = &dockercontroller.DockerVM{}
69+
v = dockercontroller.NewDockerVM()
7070
case SYSTEM:
7171
v = &inproccontroller.InprocVM{}
7272
default:

core/container/dockercontroller/dockercontroller.go

+72-22
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,49 @@ var (
4242
hostConfig *docker.HostConfig
4343
)
4444

45+
// getClient returns an instance that implements dockerClient interface
46+
type getClient func() (dockerClient, error)
47+
4548
//DockerVM is a vm. It is identified by an image id
4649
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()
4888
}
4989

5090
func getDockerHostConfig() *docker.HostConfig {
@@ -107,7 +147,9 @@ func getDockerHostConfig() *docker.HostConfig {
107147
return hostConfig
108148
}
109149

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 {
111153
config := docker.Config{Cmd: args, Image: imageID, Env: env, AttachStdout: attachStdout, AttachStderr: attachStdout}
112154
copts := docker.CreateContainerOptions{Name: containerID, Config: &config, HostConfig: getDockerHostConfig()}
113155
dockerLogger.Debugf("Create container: %s", containerID)
@@ -119,7 +161,8 @@ func (vm *DockerVM) createContainer(ctxt context.Context, client *docker.Client,
119161
return nil
120162
}
121163

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 {
123166
id, err := vm.GetVMName(ccid)
124167
if err != nil {
125168
return err
@@ -147,8 +190,10 @@ func (vm *DockerVM) deployImage(client *docker.Client, ccid ccintf.CCID, args []
147190
//for docker inputbuf is tar reader ready for use by docker.Client
148191
//the stream from end client to peer could directly be this tar stream
149192
//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()
152197
switch err {
153198
case nil:
154199
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
161206
}
162207

163208
//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 {
165211
imageID, err := vm.GetVMName(ccid)
166212
if err != nil {
167213
return err
168214
}
169-
client, err := cutil.NewDockerClient()
215+
216+
client, err := vm.getClientFnc()
170217
if err != nil {
171218
dockerLogger.Debugf("start - cannot create client %s", err)
172219
return err
@@ -187,19 +234,19 @@ func (vm *DockerVM) Start(ctxt context.Context, ccid ccintf.CCID, args []string,
187234
if builder != nil {
188235
dockerLogger.Debugf("start-could not find image ...attempt to recreate image %s", err)
189236

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)
193240
}
194241

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
197244
}
198245

199246
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
203250
}
204251
} else {
205252
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,
262309
for {
263310
// Loop forever dumping lines of text into the containerLogger
264311
// 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 {
268315
case io.EOF:
269316
dockerLogger.Infof("Container %s has closed its IO channel", containerID)
270317
default:
271-
dockerLogger.Errorf("Error reading container output: %s", err)
318+
dockerLogger.Errorf("Error reading container output: %s", err2)
272319
}
273320

274321
return
@@ -296,7 +343,8 @@ func (vm *DockerVM) Stop(ctxt context.Context, ccid ccintf.CCID, timeout uint, d
296343
if err != nil {
297344
return err
298345
}
299-
client, err := cutil.NewDockerClient()
346+
347+
client, err := vm.getClientFnc()
300348
if err != nil {
301349
dockerLogger.Debugf("stop - cannot create client %s", err)
302350
return err
@@ -308,7 +356,8 @@ func (vm *DockerVM) Stop(ctxt context.Context, ccid ccintf.CCID, timeout uint, d
308356
return err
309357
}
310358

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 {
312361
err := client.StopContainer(id, timeout)
313362
if err != nil {
314363
dockerLogger.Debugf("Stop container %s(%s)", id, err)
@@ -340,7 +389,8 @@ func (vm *DockerVM) Destroy(ctxt context.Context, ccid ccintf.CCID, force bool,
340389
if err != nil {
341390
return err
342391
}
343-
client, err := cutil.NewDockerClient()
392+
393+
client, err := vm.getClientFnc()
344394
if err != nil {
345395
dockerLogger.Errorf("destroy-cannot create client %s", err)
346396
return err

0 commit comments

Comments
 (0)